kernel/eka/nkernsmp/x86/nccpu.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
equal deleted inserted replaced
256:c1f20ce4abcf 257:3e88ff8f41d5
   189 	__e32_io_completion_barrier();
   189 	__e32_io_completion_barrier();
   190 	a.iBootFlag2 = 2;
   190 	a.iBootFlag2 = 2;
   191 	__e32_io_completion_barrier();
   191 	__e32_io_completion_barrier();
   192 	a.iBPTimestamp = X86::Timestamp();
   192 	a.iBPTimestamp = X86::Timestamp();
   193 	__e32_io_completion_barrier();
   193 	__e32_io_completion_barrier();
   194 	a.iBootFlag2 = 3;
   194 	while (a.iBootFlag2==2)
   195 	__e32_io_completion_barrier();
       
   196 	while (a.iBootFlag2==3)
       
   197 		{}
   195 		{}
   198 	__e32_io_completion_barrier();
   196 	__e32_io_completion_barrier();
   199 	NKern::EnableAllInterrupts();
   197 	NKern::EnableAllInterrupts();
   200 
   198 
   201 	return KErrNone;
   199 	return KErrNone;
   202 	}
   200 	}
   203 
   201 
   204 void InitTimestamp(TSubScheduler* aSS, SNThreadCreateInfo& aInfo)
   202 void InitAPTimestamp(SNThreadCreateInfo&)
   205 	{
   203 	{
   206 	NThread* t = (NThread*)aSS->iCurrentThread;
       
   207 	t->iActiveState = 1;
       
   208 	if (aSS->iCpuNum == 0)
       
   209 		{
       
   210 		aSS->iLastTimestamp.i64 = 0;
       
   211 		t->iLastActivationTime.i64 = 0;
       
   212 		return;
       
   213 		}
       
   214 	volatile SApInitInfo& a = *(volatile SApInitInfo*)KApBootPage;
   204 	volatile SApInitInfo& a = *(volatile SApInitInfo*)KApBootPage;
   215 	NKern::DisableAllInterrupts();
   205 	NKern::DisableAllInterrupts();
   216 	a.iBootFlag2 = 1;
   206 	a.iBootFlag2 = 1;
   217 	__e32_io_completion_barrier();
   207 	__e32_io_completion_barrier();
   218 	while (a.iBootFlag2==1)
   208 	while (a.iBootFlag2==1)
   219 		{}
   209 		{}
   220 	__e32_io_completion_barrier();
   210 	__e32_io_completion_barrier();
   221 	a.iAPTimestamp = X86::Timestamp();
   211 	a.iAPTimestamp = X86::Timestamp();
   222 	__e32_io_completion_barrier();
   212 	__e32_io_completion_barrier();
   223 	while (a.iBootFlag2!=3)
       
   224 		{}
       
   225 	__e32_io_completion_barrier();
       
   226 	TUint64 bpt = a.iBPTimestamp;
   213 	TUint64 bpt = a.iBPTimestamp;
   227 	TUint64 apt = a.iAPTimestamp;
   214 	TUint64 apt = a.iAPTimestamp;
   228 	TUint64 delta = bpt - apt;
   215 	TUint64 delta = bpt - apt;
   229 	aSS->iSSX.iTimestampOffset.i64 = delta;
   216 	TSubScheduler& ss = SubScheduler();
   230 	TUint64 now = NKern::Timestamp();
   217 	ss.iLastTimestamp64 += delta;
       
   218 	*(TUint64*)&ss.i_TimestampOffset = delta;
   231 	__KTRACE_OPT(KBOOT,DEBUGPRINT("APT=0x%lx BPT=0x%lx Delta=0x%lx", apt, bpt, delta));
   219 	__KTRACE_OPT(KBOOT,DEBUGPRINT("APT=0x%lx BPT=0x%lx Delta=0x%lx", apt, bpt, delta));
   232 	__e32_io_completion_barrier();
   220 	__e32_io_completion_barrier();
   233 	a.iBootFlag2 = 4;
   221 	a.iBootFlag2 = 3;
   234 	NKern::EnableAllInterrupts();
   222 	NKern::EnableAllInterrupts();
   235 	t->iLastActivationTime.i64 = now;
       
   236 	aSS->iLastTimestamp.i64 = now;
       
   237 	}
   223 	}
   238 
   224 
   239 
   225 
   240 
   226