Lines Matching refs:pDevExt

128 static void                 supdrvTscResetSamples(PSUPDRVDEVEXT pDevExt, bool fClearDeltas);
130 static int supdrvTscDeltaThreadInit(PSUPDRVDEVEXT pDevExt);
131 static void supdrvTscDeltaTerm(PSUPDRVDEVEXT pDevExt);
132 static void supdrvTscDeltaThreadStartMeasurement(PSUPDRVDEVEXT pDevExt, bool fForceAll);
134 static int supdrvMeasureInitialTscDeltas(PSUPDRVDEVEXT pDevExt);
135 static int supdrvMeasureTscDeltaOne(PSUPDRVDEVEXT pDevExt, uint32_t idxWorker);
372 * @param pDevExt Sets u32SystemTimerGranularityGrant if increased.
374 static void supdrvGipRequestHigherTimerFrequencyFromSystem(PSUPDRVDEVEXT pDevExt)
376 if (pDevExt->u32SystemTimerGranularityGrant == 0)
386 pDevExt->u32SystemTimerGranularityGrant = u32SystemResolution;
395 * @param pDevExt Clears u32SystemTimerGranularityGrant.
397 static void supdrvGipReleaseHigherTimerFrequencyFromSystem(PSUPDRVDEVEXT pDevExt)
399 if (pDevExt->u32SystemTimerGranularityGrant)
401 int rc2 = RTTimerReleaseSystemGranularity(pDevExt->u32SystemTimerGranularityGrant);
403 pDevExt->u32SystemTimerGranularityGrant = 0;
423 PSUPDRVDEVEXT pDevExt = pSession->pDevExt;
436 RTSemMutexRequest(pDevExt->mtxGip, RT_INDEFINITE_WAIT);
438 RTSemFastMutexRequest(pDevExt->mtxGip);
440 if (pDevExt->pGip)
449 rc = RTR0MemObjMapUser(&pSession->GipMapObjR3, pDevExt->GipMemObj, (RTR3PTR)-1, 0,
459 HCPhys = pDevExt->HCPhysGip;
467 pDevExt->cGipUsers++;
468 if (pDevExt->cGipUsers == 1)
470 PSUPGLOBALINFOPAGE pGipR0 = pDevExt->pGip;
480 supdrvGipRequestHigherTimerFrequencyFromSystem(pDevExt);
550 rc = RTTimerStart(pDevExt->pGipTimer, 0 /* fire ASAP */); AssertRC(rc);
561 pDevExt->cGipUsers = 0;
581 RTSemMutexRelease(pDevExt->mtxGip);
583 RTSemFastMutexRelease(pDevExt->mtxGip);
613 PSUPDRVDEVEXT pDevExt = pSession->pDevExt;
625 RTSemMutexRequest(pDevExt->mtxGip, RT_INDEFINITE_WAIT);
627 RTSemFastMutexRequest(pDevExt->mtxGip);
647 if ( pDevExt->cGipUsers > 0
648 && !--pDevExt->cGipUsers)
652 rc = RTTimerStop(pDevExt->pGipTimer); AssertRC(rc); rc = VINF_SUCCESS;
654 supdrvGipReleaseHigherTimerFrequencyFromSystem(pDevExt);
659 RTSemMutexRelease(pDevExt->mtxGip);
661 RTSemFastMutexRelease(pDevExt->mtxGip);
746 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
747 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
762 if (pDevExt->fInvTscRefinePowerEvent)
781 cNsElapsed = nsNow - pDevExt->nsStartInvarTscRefine;
782 cTscTicksElapsed = uTsc - pDevExt->uTscStartInvarTscRefine;
796 if ( idCpu != pDevExt->idCpuInvarTscRefine
799 uint32_t iStartCpuSet = RTMpCpuIdToSetIndex(pDevExt->idCpuInvarTscRefine);
811 /* cTscTicksElapsed = (uTsc - iStopTscDelta) - (pDevExt->uTscStartInvarTscRefine - iStartTscDelta); */
837 if ( pDevExt->cGipUsers == 0
864 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
865 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
876 ASMAtomicWriteBool(&pDevExt->fInvTscRefinePowerEvent, true);
882 supdrvTscDeltaThreadStartMeasurement(pDevExt, true /* fForceAll */);
884 RTCpuSetCopy(&pDevExt->TscDeltaCpuSet, &pGip->OnlineCpuSet);
885 supdrvMeasureInitialTscDeltas(pDevExt);
890 ASMAtomicWriteBool(&pDevExt->fInvTscRefinePowerEvent, true);
901 * @param pDevExt Pointer to the device instance data.
904 static void supdrvGipInitStartTimerForRefiningInvariantTscFreq(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip)
913 pDevExt->fInvTscRefinePowerEvent = false;
914 rc = RTPowerNotificationRegister(supdrvGipPowerNotificationCallback, pDevExt);
927 pDevExt->uTscStartInvarTscRefine = ASMReadTSC();
928 pDevExt->nsStartInvarTscRefine = RTTimeSystemNanoTS();
929 pDevExt->idCpuInvarTscRefine = RTMpCpuId();
952 rc = RTTimerCreateEx(&pDevExt->pInvarTscRefineTimer, RT_NS_1SEC,
953 RTTIMER_FLAGS_CPU(RTMpCpuIdToSetIndex(pDevExt->idCpuInvarTscRefine)),
954 supdrvInitRefineInvariantTscFreqTimer, pDevExt);
957 rc = RTTimerStart(pDevExt->pInvarTscRefineTimer, 2*RT_NS_100MS);
960 RTTimerDestroy(pDevExt->pInvarTscRefineTimer);
965 rc = RTTimerCreateEx(&pDevExt->pInvarTscRefineTimer, RT_NS_1SEC, RTTIMER_FLAGS_CPU_ANY,
966 supdrvInitRefineInvariantTscFreqTimer, pDevExt);
969 rc = RTTimerStart(pDevExt->pInvarTscRefineTimer, 2*RT_NS_100MS);
972 RTTimerDestroy(pDevExt->pInvarTscRefineTimer);
976 pDevExt->pInvarTscRefineTimer = NULL;
1007 * @param pDevExt Pointer to the device instance.
1015 static int supdrvGipInitMeasureTscFreq(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, bool fRough)
1242 * @param pDevExt The device extension.
1245 static void supdrvGipMpEventOnlineOrInitOnCpu(PSUPDRVDEVEXT pDevExt, RTCPUID idCpu)
1251 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
1262 RTSpinlockAcquire(pDevExt->hGipSpinlock);
1297 RTCpuSetAddByIndex(&pDevExt->TscDeltaCpuSet, RTMpCpuIdToSetIndex(idCpu));
1300 ASMAtomicIncU32(&pDevExt->cMpOnOffEvents);
1305 RTSpinlockRelease(pDevExt->hGipSpinlock);
1318 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser1;
1320 supdrvGipMpEventOnlineOrInitOnCpu(pDevExt, idCpu);
1329 * @param pDevExt The device extension.
1332 static void supdrvGipMpEventOffline(PSUPDRVDEVEXT pDevExt, RTCPUID idCpu)
1334 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
1339 RTSpinlockAcquire(pDevExt->hGipSpinlock);
1352 ASMAtomicIncU32(&pDevExt->cMpOnOffEvents);
1359 RTCpuSetDelByIndex(&pDevExt->TscDeltaObtainedCpuSet, iCpuSet);
1365 RTSpinlockRelease(pDevExt->hGipSpinlock);
1381 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
1382 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
1394 supdrvGipMpEventOnlineOrInitOnCpu(pDevExt, idCpu);
1400 RTMpOnSpecific(idCpu, supdrvGipMpEventOnlineCallback, pDevExt, NULL /* pvUser2 */);
1409 supdrvTscDeltaThreadStartMeasurement(pDevExt, false /* fForceAll */);
1412 supdrvMeasureTscDeltaOne(pDevExt, iCpu);
1419 supdrvGipMpEventOffline(pDevExt, idCpu);
1429 RTCPUID idGipMaster = ASMAtomicReadU32(&pDevExt->idGipMaster);
1453 ASMAtomicCmpXchgSize(&pDevExt->idGipMaster, idNewGipMaster, idGipMaster, fIgnored);
1575 * @param pDevExt Pointer to the device instance data.
1577 static SUPGIPMODE supdrvGipInitDetermineTscMode(PSUPDRVDEVEXT pDevExt)
1607 if (supdrvOSGetForcedAsyncTscMode(pDevExt))
1706 * @param pDevExt Pointer to the device instance data.
1714 static void supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys,
1732 pGip->u32Mode = supdrvGipInitDetermineTscMode(pDevExt);
1761 pDevExt->pGip = pGip;
1762 pDevExt->HCPhysGip = HCPhys;
1763 pDevExt->cGipUsers = 0;
1771 * @param pDevExt Instance data. GIP stuff may be updated.
1773 int VBOXCALL supdrvGipCreate(PSUPDRVDEVEXT pDevExt)
1789 Assert(pDevExt->u32SystemTimerGranularityGrant == 0);
1790 Assert(pDevExt->GipMemObj == NIL_RTR0MEMOBJ);
1791 Assert(!pDevExt->pGipTimer);
1793 Assert(pDevExt->mtxGip != NIL_RTSEMMUTEX);
1794 Assert(pDevExt->mtxTscDelta != NIL_RTSEMMUTEX);
1796 Assert(pDevExt->mtxGip != NIL_RTSEMFASTMUTEX);
1797 Assert(pDevExt->mtxTscDelta != NIL_RTSEMFASTMUTEX);
1814 rc = RTR0MemObjAllocCont(&pDevExt->GipMemObj, RT_UOFFSETOF(SUPGLOBALINFOPAGE, aCPUs[cCpus]), false /*fExecutable*/);
1820 pGip = (PSUPGLOBALINFOPAGE)RTR0MemObjAddress(pDevExt->GipMemObj); AssertPtr(pGip);
1821 HCPhysGip = RTR0MemObjGetPagePhysAddr(pDevExt->GipMemObj, 0); Assert(HCPhysGip != NIL_RTHCPHYS);
1826 supdrvGipRequestHigherTimerFrequencyFromSystem(pDevExt);
1836 supdrvGipInit(pDevExt, pGip, HCPhysGip, RTTimeSystemNanoTS(), RT_NS_1SEC / u32Interval /*=Hz*/, u32Interval, cCpus);
1843 && !supdrvOSGetForcedAsyncTscMode(pDevExt)))
1866 rc = supdrvGipInitMeasureTscFreq(pDevExt, pGip, true /*fRough*/); /* cannot fail */
1867 supdrvGipInitStartTimerForRefiningInvariantTscFreq(pDevExt, pGip);
1870 rc = supdrvGipInitMeasureTscFreq(pDevExt, pGip, false /*fRough*/);
1878 RTCpuSetEmpty(&pDevExt->TscDeltaCpuSet);
1879 RTCpuSetEmpty(&pDevExt->TscDeltaObtainedCpuSet);
1882 rc = supdrvTscDeltaThreadInit(pDevExt);
1886 rc = RTMpNotificationRegister(supdrvGipMpEvent, pDevExt);
1893 rc = RTMpOnAll(supdrvGipInitOnCpu, pDevExt, pGip);
1897 supdrvTscDeltaThreadStartMeasurement(pDevExt, true /* fForceAll */);
1908 rc = supdrvMeasureInitialTscDeltas(pDevExt);
1930 rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, RTTIMER_FLAGS_CPU_ALL,
1931 supdrvGipAsyncTimer, pDevExt);
1939 rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, 0 /* fFlags */,
1940 supdrvGipSyncAndInvariantTimer, pDevExt);
1947 supdrvGipReleaseHigherTimerFrequencyFromSystem(pDevExt);
1954 Assert(!pDevExt->pGipTimer);
1970 supdrvGipDestroy(pDevExt);
1998 * @param pDevExt Instance data. GIP stuff may be updated.
2000 void VBOXCALL supdrvGipDestroy(PSUPDRVDEVEXT pDevExt)
2004 OSDBGPRINT(("supdrvGipDestroy: pDevExt=%p pGip=%p pGipTimer=%p GipMemObj=%p\n", pDevExt,
2005 pDevExt->GipMemObj != NIL_RTR0MEMOBJ ? RTR0MemObjAddress(pDevExt->GipMemObj) : NULL,
2006 pDevExt->pGipTimer, pDevExt->GipMemObj));
2012 RTMpNotificationDeregister(supdrvGipMpEvent, pDevExt);
2018 supdrvTscDeltaTerm(pDevExt);
2024 if (pDevExt->pInvarTscRefineTimer)
2026 RTTimerDestroy(pDevExt->pInvarTscRefineTimer);
2027 pDevExt->pInvarTscRefineTimer = NULL;
2033 if (pDevExt->pGip)
2035 supdrvGipTerm(pDevExt->pGip);
2036 pDevExt->pGip = NULL;
2043 if (pDevExt->pGipTimer)
2045 rc = RTTimerDestroy(pDevExt->pGipTimer); AssertRC(rc);
2046 pDevExt->pGipTimer = NULL;
2049 if (pDevExt->GipMemObj != NIL_RTR0MEMOBJ)
2051 rc = RTR0MemObjFree(pDevExt->GipMemObj, true /* free mappings */); AssertRC(rc);
2052 pDevExt->GipMemObj = NIL_RTR0MEMOBJ;
2059 supdrvGipReleaseHigherTimerFrequencyFromSystem(pDevExt);
2080 * @param pDevExt The device extension.
2088 static void supdrvGipDoUpdateCpu(PSUPDRVDEVEXT pDevExt, PSUPGIPCPU pGipCpu, uint64_t u64NanoTS, uint64_t u64TSC, uint64_t iTick)
2097 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
2241 * @param pDevExt The device extension.
2249 static void supdrvGipUpdate(PSUPDRVDEVEXT pDevExt, uint64_t u64NanoTS, uint64_t u64TSC, RTCPUID idCpu, uint64_t iTick)
2255 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
2310 supdrvGipDoUpdateCpu(pDevExt, pGipCpu, u64NanoTS, u64TSC, iTick);
2322 * @param pDevExt The device extension.
2331 static void supdrvGipUpdatePerCpu(PSUPDRVDEVEXT pDevExt, uint64_t u64NanoTS, uint64_t u64TSC,
2335 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
2346 supdrvGipMpEventOnlineOrInitOnCpu(pDevExt, idCpu);
2369 supdrvGipDoUpdateCpu(pDevExt, pGipCpu, u64NanoTS, u64TSC, iTick);
2389 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
2390 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
2423 supdrvGipUpdate(pDevExt, u64NanoTS, u64TSC, NIL_RTCPUID, iTick);
2437 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
2444 if (pDevExt->idGipMaster == idCpu)
2445 supdrvGipUpdate(pDevExt, NanoTS, u64TSC, idCpu, iTick);
2447 supdrvGipUpdatePerCpu(pDevExt, NanoTS, u64TSC, idCpu, ASMGetApicId(), iTick);
2565 PSUPDRVDEVEXT pDevExt;
3017 pGipCpuMaster->u64TSCSample, pGipCpuMaster->idCpu, pGipCpuWorker->idCpu, pArgs->pDevExt->idGipMaster));
3505 PSUPDRVDEVEXT pDevExt = pArgs->pDevExt;
3598 RTCpuSetDelByIndex(&pDevExt->TscDeltaCpuSet, pGipCpuWorker->iCpuSet);
3599 RTCpuSetAddByIndex(&pDevExt->TscDeltaObtainedCpuSet, pGipCpuWorker->iCpuSet);
3654 RTCpuSetDelByIndex(&pDevExt->TscDeltaCpuSet, pGipCpuWorker->iCpuSet);
3655 RTCpuSetAddByIndex(&pDevExt->TscDeltaObtainedCpuSet, pGipCpuWorker->iCpuSet);
3714 * @param pDevExt Pointer to the device instance data.
3720 static int supdrvMeasureTscDeltaOne(PSUPDRVDEVEXT pDevExt, uint32_t idxWorker)
3724 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
3725 RTCPUID idMaster = pDevExt->idGipMaster;
3750 rc = RTSemMutexRequest(pDevExt->mtxTscDelta, RT_INDEFINITE_WAIT);
3752 rc = RTSemFastMutexRequest(pDevExt->mtxTscDelta);
3808 pArgs->pDevExt = pDevExt;
3871 rc2 = RTSemMutexRelease(pDevExt->mtxTscDelta); AssertRC(rc2);
3873 rc2 = RTSemFastMutexRelease(pDevExt->mtxTscDelta); AssertRC(rc2);
3883 * @param pDevExt Pointer to the device instance data.
3888 static void supdrvTscResetSamples(PSUPDRVDEVEXT pDevExt, bool fResetTscDeltas)
3891 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
3898 RTCpuSetDelByIndex(&pDevExt->TscDeltaObtainedCpuSet, pGipCpu->iCpuSet);
3909 * @param pDevExt Pointer to the device instance data.
3913 static int supdrvTscPickMaster(PSUPDRVDEVEXT pDevExt, uint32_t *pidxMaster)
3925 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
3936 ASMAtomicWriteSize(&pDevExt->idGipMaster, pGipCpu->idCpu);
3954 * @param pDevExt Pointer to the device instance data.
3960 static int supdrvMeasureInitialTscDeltas(PSUPDRVDEVEXT pDevExt)
3965 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
3967 uint32_t cMpOnOffEvents = ASMAtomicReadU32(&pDevExt->cMpOnOffEvents);
3970 supdrvTscResetSamples(pDevExt, true /* fClearDeltas */);
3971 int rc = supdrvTscPickMaster(pDevExt, &idxMaster);
3979 Assert(pDevExt->idGipMaster == pGipCpuMaster->idCpu);
4002 && RTCpuSetIsMemberByIndex(&pDevExt->TscDeltaCpuSet, pGipCpuWorker->iCpuSet))
4004 rc = supdrvMeasureTscDeltaOne(pDevExt, iCpu);
4008 pGipCpuWorker->idCpu, idxMaster, pDevExt->idGipMaster, pGipCpuMaster->idCpu);
4012 if (ASMAtomicReadU32(&pDevExt->cMpOnOffEvents) != cMpOnOffEvents)
4032 * @param pDevExt Pointer to the device instance data.
4037 static int supdrvTscDeltaThreadButchered(PSUPDRVDEVEXT pDevExt, bool fSpinlockHeld, const char *pszFailed, int rcFailed)
4040 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4042 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Butchered;
4043 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4058 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
4067 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4068 enmState = pDevExt->enmTscDeltaThreadState;
4073 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Listening;
4074 rc = RTSemEventSignal(pDevExt->hTscDeltaEvent);
4076 return supdrvTscDeltaThreadButchered(pDevExt, true /* fSpinlockHeld */, "RTSemEventSignal", rc);
4082 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4087 if (pDevExt->cMsTscDeltaTimeout == 1) /* 10 ms */
4088 pDevExt->cMsTscDeltaTimeout = 10;
4089 else if (pDevExt->cMsTscDeltaTimeout == 10) /* +100 ms */
4090 pDevExt->cMsTscDeltaTimeout = 100;
4091 else if (pDevExt->cMsTscDeltaTimeout == 100) /* +1000 ms */
4092 pDevExt->cMsTscDeltaTimeout = 500;
4095 rc = RTThreadUserWait(pDevExt->hTscDeltaThread, pDevExt->cMsTscDeltaTimeout);
4098 return supdrvTscDeltaThreadButchered(pDevExt, false /* fSpinlockHeld */, "RTThreadUserWait", rc);
4099 RTThreadUserReset(pDevExt->hTscDeltaThread);
4105 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Measuring;
4106 rc = RTSemEventSignal(pDevExt->hTscDeltaEvent); /* (Safe on windows as long as spinlock isn't IRQ safe.) */
4108 return supdrvTscDeltaThreadButchered(pDevExt, true /* fSpinlockHeld */, "RTSemEventSignal", rc);
4109 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4110 pDevExt->cMsTscDeltaTimeout = 1;
4118 if (pDevExt->fTscThreadRecomputeAllDeltas)
4122 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
4126 RTCpuSetCopy(&pDevExt->TscDeltaCpuSet, &pGip->OnlineCpuSet);
4127 rc = supdrvMeasureInitialTscDeltas(pDevExt);
4137 pDevExt->fTscThreadRecomputeAllDeltas = false;
4141 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
4149 if (RTCpuSetIsMemberByIndex(&pDevExt->TscDeltaCpuSet, pGipCpuWorker->iCpuSet))
4153 int rc2 = supdrvMeasureTscDeltaOne(pDevExt, iCpu);
4163 RTCpuSetDelByIndex(&pDevExt->TscDeltaCpuSet, pGipCpuWorker->iCpuSet);
4164 RTCpuSetAddByIndex(&pDevExt->TscDeltaObtainedCpuSet, pGipCpuWorker->iCpuSet);
4169 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4170 if (pDevExt->enmTscDeltaThreadState == kTscDeltaThreadState_Measuring)
4171 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Listening;
4172 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4174 ASMAtomicWriteS32(&pDevExt->rcTscDelta, rc);
4179 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Destroyed;
4180 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4185 return supdrvTscDeltaThreadButchered(pDevExt, true /* fSpinlockHeld */, "Invalid state", VERR_INVALID_STATE);
4203 static int supdrvTscDeltaThreadWait(PSUPDRVDEVEXT pDevExt, SUPDRVTSCDELTATHREADSTATE enmCurState,
4210 RTSemEventWait(pDevExt->hTscDeltaEvent, RT_MS_1SEC);
4211 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4212 if (pDevExt->enmTscDeltaThreadState == enmNewState)
4214 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4217 else if (pDevExt->enmTscDeltaThreadState == enmCurState)
4222 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4223 rc = RTSemEventWait(pDevExt->hTscDeltaEvent, 50 * RT_MS_1SEC);
4231 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4232 enmState = pDevExt->enmTscDeltaThreadState;
4233 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4254 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4266 * @param pDevExt Pointer to the device instance data.
4269 static void supdrvTscDeltaThreadStartMeasurement(PSUPDRVDEVEXT pDevExt, bool fForceAll)
4271 if (pDevExt->hTscDeltaThread != NIL_RTTHREAD)
4273 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4274 if ( pDevExt->enmTscDeltaThreadState == kTscDeltaThreadState_Listening
4275 || pDevExt->enmTscDeltaThreadState == kTscDeltaThreadState_Measuring)
4277 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_WaitAndMeasure;
4279 pDevExt->fTscThreadRecomputeAllDeltas = true;
4281 else if ( pDevExt->enmTscDeltaThreadState == kTscDeltaThreadState_WaitAndMeasure
4283 pDevExt->fTscThreadRecomputeAllDeltas = true;
4284 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4285 RTThreadUserSignal(pDevExt->hTscDeltaThread);
4296 * @param pDevExt Pointer to the device instance data.
4298 static void supdrvTscDeltaThreadTerminate(PSUPDRVDEVEXT pDevExt)
4301 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4302 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Terminating;
4303 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4304 RTThreadUserSignal(pDevExt->hTscDeltaThread);
4305 rc = RTThreadWait(pDevExt->hTscDeltaThread, 50 * RT_MS_1SEC, NULL /* prc */);
4312 RTThreadUserSignal(pDevExt->hTscDeltaThread);
4313 rc = RTThreadWait(pDevExt->hTscDeltaThread, 2 * RT_MS_1SEC, NULL /* prc */);
4329 * @param pDevExt Pointer to the device instance data.
4334 static int supdrvTscDeltaThreadInit(PSUPDRVDEVEXT pDevExt)
4337 Assert(pDevExt->pGip->enmUseTscDelta > SUPGIPUSETSCDELTA_ZERO_CLAIMED);
4338 rc = RTSpinlockCreate(&pDevExt->hTscDeltaSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, "VBoxTscSpnLck");
4341 rc = RTSemEventCreate(&pDevExt->hTscDeltaEvent);
4344 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_Creating;
4345 pDevExt->cMsTscDeltaTimeout = 1;
4346 rc = RTThreadCreate(&pDevExt->hTscDeltaThread, supdrvTscDeltaThread, pDevExt, 0 /* cbStack */,
4350 rc = supdrvTscDeltaThreadWait(pDevExt, kTscDeltaThreadState_Creating, kTscDeltaThreadState_Listening);
4353 ASMAtomicWriteS32(&pDevExt->rcTscDelta, VERR_NOT_AVAILABLE);
4358 supdrvTscDeltaThreadTerminate(pDevExt);
4362 RTSemEventDestroy(pDevExt->hTscDeltaEvent);
4363 pDevExt->hTscDeltaEvent = NIL_RTSEMEVENT;
4367 RTSpinlockDestroy(pDevExt->hTscDeltaSpinlock);
4368 pDevExt->hTscDeltaSpinlock = NIL_RTSPINLOCK;
4380 * @param pDevExt Pointer to the device instance data.
4382 static void supdrvTscDeltaTerm(PSUPDRVDEVEXT pDevExt)
4384 if ( pDevExt->hTscDeltaSpinlock != NIL_RTSPINLOCK
4385 && pDevExt->hTscDeltaEvent != NIL_RTSEMEVENT)
4387 supdrvTscDeltaThreadTerminate(pDevExt);
4390 if (pDevExt->hTscDeltaSpinlock != NIL_RTSPINLOCK)
4392 RTSpinlockDestroy(pDevExt->hTscDeltaSpinlock);
4393 pDevExt->hTscDeltaSpinlock = NIL_RTSPINLOCK;
4396 if (pDevExt->hTscDeltaEvent != NIL_RTSEMEVENT)
4398 RTSemEventDestroy(pDevExt->hTscDeltaEvent);
4399 pDevExt->hTscDeltaEvent = NIL_RTSEMEVENT;
4402 ASMAtomicWriteS32(&pDevExt->rcTscDelta, VERR_NOT_AVAILABLE);
4427 PSUPDRVDEVEXT pDevExt;
4443 pDevExt = pSession->pDevExt;
4444 AssertReturn(SUP_IS_DEVEXT_VALID(pDevExt), VERR_INVALID_PARAMETER);
4446 pGip = pDevExt->pGip;
4489 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4490 RTCpuSetAddByIndex(&pDevExt->TscDeltaCpuSet, iCpuSet);
4491 if ( pDevExt->enmTscDeltaThreadState == kTscDeltaThreadState_Listening
4492 || pDevExt->enmTscDeltaThreadState == kTscDeltaThreadState_Measuring)
4494 pDevExt->enmTscDeltaThreadState = kTscDeltaThreadState_WaitAndMeasure;
4497 else if (pDevExt->enmTscDeltaThreadState != kTscDeltaThreadState_WaitAndMeasure)
4499 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4500 RTThreadUserSignal(pDevExt->hTscDeltaThread);
4513 RTSpinlockAcquire(pDevExt->hTscDeltaSpinlock);
4514 enmState = pDevExt->enmTscDeltaThreadState;
4515 RTSpinlockRelease(pDevExt->hTscDeltaSpinlock);
4553 rc = supdrvMeasureTscDeltaOne(pDevExt, iGipCpu);
4580 * @param pDevExt Pointer to the device instance data.
4584 int VBOXCALL supdrvIOCtl_TscDeltaMeasure(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPTSCDELTAMEASURE pReq)
4594 AssertPtr(pDevExt); AssertPtr(pSession); AssertPtr(pReq); /* paranoia^2 */
4626 * @param pDevExt Pointer to the device instance data.
4630 int VBOXCALL supdrvIOCtl_TscRead(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPTSCREAD pReq)
4639 AssertPtr(pDevExt); AssertPtr(pReq); AssertPtr(pSession); /* paranoia^2 */
4642 pGip = pDevExt->pGip;
4689 rc = supdrvMeasureTscDeltaOne(pDevExt, iGipCpu);