diff -r c1f20ce4abcf -r 3e88ff8f41d5 kernel/eka/nkernsmp/arm/nccpu.cpp --- a/kernel/eka/nkernsmp/arm/nccpu.cpp Tue Aug 31 16:34:26 2010 +0300 +++ b/kernel/eka/nkernsmp/arm/nccpu.cpp Wed Sep 01 12:34:56 2010 +0100 @@ -20,6 +20,9 @@ #include #include +extern "C" { +extern SVariantInterfaceBlock* VIB; +} struct SAPBootPage : public SFullArmRegSet { @@ -30,15 +33,8 @@ volatile T_UintPtr iBootFlags4; volatile TUint64 iBPTimestamp; volatile TUint64 iAPTimestamp; - - TUint32 i_SAPBootPage_Spare[624]; - - UPerCpuUncached iPerCpu[KMaxCpus]; }; -__ASSERT_COMPILE(sizeof(SAPBootPage)==4096); - - extern "C" void _ApEntry(); extern "C" void KickCpu(volatile T_UintPtr* aPtr, T_UintPtr aRegsPhys); extern void DumpFullRegSet(SFullArmRegSet& a); @@ -91,7 +87,7 @@ KickCpu(&bootPage.iAPBootPtr[a.iCpu], bp_phys); - TUint32 n = TUint32(TheScheduler.iVIB->iMaxCpuClock >> 3); + TUint32 n = TUint32(VIB->iMaxCpuClock >> 3); n = -n; TUint32 b = 0; do { @@ -104,30 +100,41 @@ __KTRACE_OPT(KBOOT,DEBUGPRINT("SCU: iCtrl=%08x iConfig=%08x iCpuStat=%08x", SCU.iCtrl, SCU.iConfig, SCU.iCpuStatus)); if (n==0) return KErrTimedOut; - -#if defined(__NKERN_TIMESTAMP_USE_LOCAL_TIMER__) -#error Use of local timer for NKern::Timestamp() no longer supported -#endif - + NKern::DisableAllInterrupts(); + arm_dsb(); + while (bootPage.iBootFlags2==0) + {} + arm_dsb(); + bootPage.iBootFlags2 = 2; + arm_dsb(); + bootPage.iBPTimestamp = NKern::Timestamp(); + arm_dsb(); + while (bootPage.iBootFlags2==2) + {} + arm_dsb(); + NKern::EnableAllInterrupts(); return KErrNone; } -void InitTimestamp(TSubScheduler* aSS, SNThreadCreateInfo& aInfo) +void InitAPTimestamp(SNThreadCreateInfo& aInfo) { - NThread* t = (NThread*)aSS->iCurrentThread; - t->iActiveState = 1; - if (aSS->iCpuNum == 0) - { - aSS->iLastTimestamp.i64 = 0; - t->iLastActivationTime.i64 = 0; - return; - } - TUint64 ts = 0; -#if defined(__NKERN_TIMESTAMP_USE_LOCAL_TIMER__) -#error Use of local timer for NKern::Timestamp() no longer supported -#endif - ts = NKern::Timestamp(); - aSS->iLastTimestamp.i64 = ts; - t->iLastActivationTime.i64 = ts; + volatile SArmAPBootInfo& a = *(volatile SArmAPBootInfo*)aInfo.iParameterBlock; + volatile SAPBootPage& bootPage = *(volatile SAPBootPage*)a.iAPBootLin; + NKern::DisableAllInterrupts(); + bootPage.iBootFlags2 = 1; + arm_dsb(); + while (bootPage.iBootFlags2==1) + {} + arm_dsb(); + bootPage.iAPTimestamp = NKern::Timestamp(); + arm_dsb(); + TUint64 bpt = bootPage.iBPTimestamp; + TUint64 apt = bootPage.iAPTimestamp; + TUint64 delta = bpt - apt; + SubScheduler().iLastTimestamp64 += delta; + __KTRACE_OPT(KBOOT,DEBUGPRINT("APT=0x%lx BPT=0x%lx Delta=0x%lx", apt, bpt, delta)); + arm_dsb(); + bootPage.iBootFlags2 = 3; + NKern::EnableAllInterrupts(); }