kernel/eka/nkernsmp/arm/ncsched.cpp
changeset 201 43365a9b78a3
parent 90 947f0dc9f7a8
equal deleted inserted replaced
200:73ea206103e6 201:43365a9b78a3
   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();