kernel/eka/nkernsmp/x86/ncsched.cpp
changeset 201 43365a9b78a3
parent 90 947f0dc9f7a8
equal deleted inserted replaced
200:73ea206103e6 201:43365a9b78a3
    97 
    97 
    98 void TSubScheduler::SaveTimesliceTimer(NThreadBase* aT)
    98 void TSubScheduler::SaveTimesliceTimer(NThreadBase* aT)
    99 	{
    99 	{
   100 	if (aT->iTime>0 && !aT->i_NThread_Initial)
   100 	if (aT->iTime>0 && !aT->i_NThread_Initial)
   101 		{
   101 		{
   102 		TUint32 remain32 = read_apic_reg(CURRCNT);
   102 		TUint32 x = read_apic_reg(CURRCNT);
   103 		TUint64 x(remain32);
   103 		iSSX.iTimerFreqRI.iI.Mult(x);
   104 		x *= TUint32(iSSX.iTimerPeriodM);
       
   105 		x += 1u<<(iSSX.iTimerPeriodS-1);
       
   106 		x >>= iSSX.iTimerPeriodS;
       
   107 		aT->iTime = (TInt)x;
   104 		aT->iTime = (TInt)x;
   108 		}
   105 		}
   109 	write_apic_reg(INITCNT, 0);
   106 	write_apic_reg(INITCNT, 0);
   110 	}
   107 	}
   111 
   108 
   126 		aOld = iInitialThread;
   123 		aOld = iInitialThread;
   127 	if (!aNew)
   124 	if (!aNew)
   128 		aNew = iInitialThread;
   125 		aNew = iInitialThread;
   129 	if (aNew->iTime>0)
   126 	if (aNew->iTime>0)
   130 		{
   127 		{
   131 		TUint32 remain32 = (TUint32)aNew->iTime;
   128 		TUint32 x = (TUint32)aNew->iTime;
   132 		TUint64 x(remain32);
   129 		iSSX.iTimerFreqRI.iR.Mult(x);
   133 		x *= TUint32(iSSX.iTimerFreqM);
   130 		write_apic_reg(INITCNT, x);
   134 		x += TUint64(0x80000000u)<<iSSX.iTimerFreqS;
       
   135 		x >>= (32+iSSX.iTimerFreqS);
       
   136 		write_apic_reg(LVTTMR, TIMESLICE_VECTOR);
       
   137 		write_apic_reg(INITCNT, (TUint32)x);
       
   138 		}
   131 		}
   139 	if (aNew!=aOld)
   132 	if (aNew!=aOld)
   140 		{
   133 		{
   141 		TUint64 now = NKern::Timestamp();
   134 		TUint64 now = NKern::Timestamp();
   142 		TUint64 delta = now - iLastTimestamp.i64;
   135 		TUint64 delta = now - iLastTimestamp.i64;