161 #endif |
161 #endif |
162 |
162 |
163 #if !defined(__UTT_MACHINE_CODED__) |
163 #if !defined(__UTT_MACHINE_CODED__) |
164 void TSubScheduler::UpdateThreadTimes(NThreadBase* aOld, NThreadBase* aNew) |
164 void TSubScheduler::UpdateThreadTimes(NThreadBase* aOld, NThreadBase* aNew) |
165 { |
165 { |
|
166 /* If necessary update local timer frequency (DVFS) */ |
|
167 SRatioInv* pNCF = iSSX.iNewCpuFreqRI; |
|
168 if (pNCF) |
|
169 { |
|
170 iSSX.iCpuFreqRI = *pNCF; |
|
171 __e32_atomic_store_rel_ptr(&iSSX.iNewCpuFreqRI, 0); |
|
172 } |
|
173 SRatioInv* pNTF = iSSX.iNewTimerFreqRI; |
|
174 if (pNTF) |
|
175 { |
|
176 iSSX.iTimerFreqRI = *pNTF; |
|
177 __e32_atomic_store_rel_ptr(&iSSX.iNewTimerFreqRI, 0); |
|
178 } |
166 if (!aOld) |
179 if (!aOld) |
167 aOld = iInitialThread; |
180 aOld = iInitialThread; |
168 if (!aNew) |
181 if (!aNew) |
169 aNew = iInitialThread; |
182 aNew = iInitialThread; |
170 if (aNew!=aOld || aNew->iTime<=0) |
183 if (aNew!=aOld || aNew->iTime<=0 || pNTF) |
171 { |
184 { |
172 TUint32 tmrval = 0x7fffffffu; |
185 TUint32 tmrval = 0x7fffffffu; |
173 if (aNew->iTime > 0) |
186 if (aNew->iTime > 0) |
174 { |
187 { |
175 TUint64 x = TUint64(aNew->iTime) * TUint64(iSSX.iTimerFreqM); |
188 tmrval = aNew->iTime; // this will have been computed based on the old timer frequency |
176 tmrval = I64HIGH(x); |
189 iSSX.iTimerFreqRI.iR.Mult(tmrval); |
177 if (iSSX.iTimerFreqS) |
|
178 { |
|
179 tmrval += ((1u<<iSSX.iTimerFreqS)-1); |
|
180 tmrval >>= iSSX.iTimerFreqS; |
|
181 } |
|
182 else if (I64LOW(x) & 0x80000000u) |
|
183 ++tmrval; |
|
184 } |
190 } |
185 iSSX.iLastTimerSet = tmrval; |
191 // iSSX.iLastTimerSet = tmrval; |
186 iSSX.iLocalTimerAddr->iTimerCount = tmrval; |
192 iSSX.iLocalTimerAddr->iTimerCount = tmrval; |
187 } |
193 } |
188 if (aNew!=aOld) |
194 if (aNew!=aOld) |
189 { |
195 { |
190 TUint64 now = NKern::Timestamp(); |
196 TUint64 now = NKern::Timestamp(); |