Lines Matching defs:pVM

61             PPDMCRITSECT pCritSect = (PPDMCRITSECT)MMHyperR3ToCC((pTimer)->CTX_SUFF(pVM), (pTimer)->pCritSect); \
64 || (enmState = (pTimer)->CTX_SUFF(pVM)->enmVMState) == VMSTATE_CREATING \
89 # define TMTIMER_ASSERT_SYNC_CRITSECT_ORDER(pVM, pTimer) \
94 PPDMCRITSECT pCritSect = (PPDMCRITSECT)MMHyperR3ToCC(pVM, (pTimer)->pCritSect); \
97 || PDMCritSectIsOwner(&pVM->tm.s.VirtualSyncLock) \
98 || (enmState = (pVM)->enmVMState) == VMSTATE_CREATING \
106 # define TMTIMER_ASSERT_SYNC_CRITSECT_ORDER(pVM, pTimer) do { } while (0)
122 PVM pVM = pVCpu->CTX_SUFF(pVM);
127 if (pVM->tm.s.fTSCTiedToExecution)
128 tmCpuTickResume(pVM, pVCpu);
144 PVM pVM = pVCpu->CTX_SUFF(pVM);
146 if (pVM->tm.s.fTSCTiedToExecution)
192 PVM pVM = pVCpu->CTX_SUFF(pVM);
198 if ( pVM->tm.s.fTSCTiedToExecution
199 && !pVM->tm.s.fTSCNotTiedToHalt)
200 tmCpuTickResume(pVM, pVCpu);
216 PVM pVM = pVCpu->CTX_SUFF(pVM);
218 if ( pVM->tm.s.fTSCTiedToExecution
219 && !pVM->tm.s.fTSCNotTiedToHalt)
250 * @param pVM Pointer to the VM.
252 DECLINLINE(void) tmScheduleNotify(PVM pVM)
254 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
261 REMR3NotifyTimerPending(pVM, pVCpuDst);
265 STAM_COUNTER_INC(&pVM->tm.s.StatScheduleSetFF);
275 PVM pVM = pTimer->CTX_SUFF(pVM);
276 if ( VM_IS_EMT(pVM)
277 && RT_SUCCESS(TM_TRY_LOCK_TIMERS(pVM)))
279 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatScheduleOne), a);
281 tmTimerQueueSchedule(pVM, &pVM->tm.s.CTX_SUFF(paTimerQueues)[pTimer->enmClock]);
283 tmTimerQueuesSanityChecks(pVM, "tmSchedule");
285 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatScheduleOne), a);
286 TM_UNLOCK_TIMERS(pVM);
292 tmScheduleNotify(pVM);
355 tmTimerLinkSchedule(&pTimer->CTX_SUFF(pVM)->tm.s.CTX_SUFF(paTimerQueues)[pTimer->enmClock], pTimer);
393 DBGFTRACE_U64_TAG2(pTimer->CTX_SUFF(pVM), u64Expire, "tmTimerQueueLinkActive head", R3STRING(pTimer->pszDesc));
402 DBGFTRACE_U64_TAG2(pTimer->CTX_SUFF(pVM), u64Expire, "tmTimerQueueLinkActive tail", R3STRING(pTimer->pszDesc));
411 DBGFTRACE_U64_TAG2(pTimer->CTX_SUFF(pVM), u64Expire, "tmTimerQueueLinkActive empty", R3STRING(pTimer->pszDesc));
488 STAM_COUNTER_INC(&pTimer->CTX_SUFF(pVM)->tm.s.CTX_SUFF_Z(StatPostponed));
511 * @param pVM The VM to run the timers for.
516 void tmTimerQueueSchedule(PVM pVM, PTMTIMERQUEUE pQueue)
518 TM_ASSERT_TIMER_LOCK_OWNERSHIP(pVM);
519 NOREF(pVM);
554 * @param pVM Pointer to the VM.
558 void tmTimerQueuesSanityChecks(PVM pVM, const char *pszWhere)
560 TM_ASSERT_TIMER_LOCK_OWNERSHIP(pVM);
568 PTMTIMERQUEUE pQueue = &pVM->tm.s.CTX_SUFF(paTimerQueues)[i];
572 if (PDMCritSectTryEnter(&pVM->tm.s.VirtualSyncLock) != VINF_SUCCESS)
606 for (PTMTIMERR3 pCur = pVM->tm.s.pCreated; pCur; pPrev = pCur, pCur = pCur->pBigNext)
620 PTMTIMERR3 pCurAct = TMTIMER_GET_HEAD(&pVM->tm.s.CTX_SUFF(paTimerQueues)[pCur->enmClock]);
636 for (PTMTIMERR3 pCurAct = TMTIMER_GET_HEAD(&pVM->tm.s.CTX_SUFF(paTimerQueues)[pCur->enmClock]);
662 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
673 * @param pVM Pointer to the VM.
680 DECLINLINE(uint64_t) tmTimerPollReturnMiss(PVM pVM, uint64_t u64Now, uint64_t u64Delta, uint64_t *pu64Delta)
684 if (!pVM->tm.s.fVirtualWarpDrive)
687 return u64Delta + u64Now + pVM->tm.s.u64VirtualOffset;
693 uint64_t const u64Start = pVM->tm.s.u64VirtualWarpDriveStart;
694 uint32_t const u32Pct = pVM->tm.s.u32VirtualWarpDrivePercentage;
696 uint64_t u64GipTime = u64Delta + u64Now + pVM->tm.s.u64VirtualOffset;
720 * @param pVM Pointer to the VM.
724 DECL_FORCE_INLINE(uint64_t) tmTimerPollReturnOtherCpu(PVM pVM, uint64_t u64Now, uint64_t *pu64Delta)
728 return u64Now + pVM->tm.s.u64VirtualOffset + s_u64OtherRet;
736 * @param pVM Pointer to the VM.
745 DECL_FORCE_INLINE(uint64_t) tmTimerPollReturnHit(PVM pVM, PVMCPU pVCpu, PVMCPU pVCpuDst, uint64_t u64Now,
750 return tmTimerPollReturnOtherCpu(pVM, u64Now, pu64Delta);
763 * @param pVM Pointer to the VM.
771 DECL_FORCE_INLINE(uint64_t) tmTimerPollInternal(PVM pVM, PVMCPU pVCpu, uint64_t *pu64Delta)
773 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
774 const uint64_t u64Now = TMVirtualGetNoCheck(pVM);
775 STAM_COUNTER_INC(&pVM->tm.s.StatPoll);
781 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollAlreadySet);
786 if (ASMAtomicReadBool(&pVM->tm.s.fRunningQueues))
788 STAM_COUNTER_INC(&pVM->tm.s.StatPollRunning);
789 return tmTimerPollReturnOtherCpu(pVM, u64Now, pu64Delta);
795 const uint64_t u64Expire1 = ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL].u64Expire);
804 REMR3NotifyTimerPending(pVM, pVCpuDst);
808 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollVirtual);
821 uint64_t u64Expire2 = ASMAtomicUoReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire);
822 if (ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking))
824 if (!ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
826 u64VirtualSyncNow = ASMAtomicReadU64(&pVM->tm.s.offVirtualSync);
827 if (RT_LIKELY( ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking)
828 && !ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncCatchUp)
829 && u64VirtualSyncNow == ASMAtomicReadU64(&pVM->tm.s.offVirtualSync)
830 && u64Expire2 == ASMAtomicUoReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire)))
836 STAM_COUNTER_INC(&pVM->tm.s.StatPollSimple);
837 STAM_COUNTER_INC(&pVM->tm.s.StatPollMiss);
840 return tmTimerPollReturnMiss(pVM, u64Now, RT_MIN(i64Delta1, i64Delta2), pu64Delta);
841 return tmTimerPollReturnOtherCpu(pVM, u64Now, pu64Delta);
844 if ( !pVM->tm.s.fRunningQueues
850 REMR3NotifyTimerPending(pVM, pVCpuDst);
854 STAM_COUNTER_INC(&pVM->tm.s.StatPollSimple);
856 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollVirtualSync);
862 STAM_COUNTER_INC(&pVM->tm.s.StatPollSimple);
864 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollVirtualSync);
876 fCatchUp = ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp);
877 off = ASMAtomicReadU64(&pVM->tm.s.offVirtualSync);
878 u64Expire2 = ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire);
882 uint64_t const u64Prev = ASMAtomicReadU64(&pVM->tm.s.u64VirtualSyncCatchUpPrev);
883 uint64_t const offGivenUp = ASMAtomicReadU64(&pVM->tm.s.offVirtualSyncGivenUp);
884 u32Pct = ASMAtomicReadU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage);
885 if ( ( u64Prev == ASMAtomicReadU64(&pVM->tm.s.u64VirtualSyncCatchUpPrev)
886 && offGivenUp == ASMAtomicReadU64(&pVM->tm.s.offVirtualSyncGivenUp)
887 && u32Pct == ASMAtomicReadU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage)
888 && off == ASMAtomicReadU64(&pVM->tm.s.offVirtualSync)
889 && u64Expire2 == ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire)
890 && ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp)
891 && ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncTicking))
908 if ( ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking)
909 && ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
913 else if ( off == ASMAtomicReadU64(&pVM->tm.s.offVirtualSync)
914 && u64Expire2 == ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire)
915 && !ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp)
916 && ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncTicking))
921 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollAlreadySet);
922 if (ASMAtomicUoReadBool(&pVM->tm.s.fRunningQueues))
924 STAM_COUNTER_INC(&pVM->tm.s.StatPollRunning);
925 return tmTimerPollReturnOtherCpu(pVM, u64Now, pu64Delta);
927 if (!ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking))
930 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollVirtualSync);
936 STAM_COUNTER_INC(&pVM->tm.s.StatPollELoop);
943 if ( !pVM->tm.s.fRunningQueues
949 REMR3NotifyTimerPending(pVM, pVCpuDst);
952 STAM_COUNTER_INC(&pVM->tm.s.StatPollVirtualSync);
954 return tmTimerPollReturnHit(pVM, pVCpu, pVCpuDst, u64Now, pu64Delta, &pVM->tm.s.StatPollVirtualSync);
960 STAM_COUNTER_INC(&pVM->tm.s.StatPollMiss);
965 return tmTimerPollReturnMiss(pVM, u64Now, RT_MIN(i64Delta1, i64Delta2), pu64Delta);
967 return tmTimerPollReturnOtherCpu(pVM, u64Now, pu64Delta);
978 * @param pVM Pointer to the VM.
982 VMMDECL(bool) TMTimerPollBool(PVM pVM, PVMCPU pVCpu)
986 tmTimerPollInternal(pVM, pVCpu, &off);
996 * @param pVM Pointer to the VM.
1000 VMM_INT_DECL(void) TMTimerPollVoid(PVM pVM, PVMCPU pVCpu)
1003 tmTimerPollInternal(pVM, pVCpu, &off);
1014 * @param pVM Pointer to the VM.
1019 VMM_INT_DECL(uint64_t) TMTimerPollGIP(PVM pVM, PVMCPU pVCpu, uint64_t *pu64Delta)
1021 return tmTimerPollInternal(pVM, pVCpu, pu64Delta);
1034 return (PTMTIMERR3)MMHyperCCToR3(pTimer->CTX_SUFF(pVM), pTimer);
1046 return (PTMTIMERR0)MMHyperCCToR0(pTimer->CTX_SUFF(pVM), pTimer);
1058 return (PTMTIMERRC)MMHyperCCToRC(pTimer->CTX_SUFF(pVM), pTimer);
1079 return PDMCritSectEnter(&pTimer->CTX_SUFF(pVM)->tm.s.VirtualSyncLock, rcBusy);
1092 PDMCritSectLeave(&pTimer->CTX_SUFF(pVM)->tm.s.VirtualSyncLock);
1106 return PDMCritSectIsOwner(&pTimer->CTX_SUFF(pVM)->tm.s.VirtualSyncLock);
1115 * @param pVM Pointer to the VM.
1119 static int tmTimerSetOptimizedStart(PVM pVM, PTMTIMER pTimer, uint64_t u64Expire)
1132 uint64_t u64Last = ASMAtomicReadU64(&pVM->tm.s.u64VirtualSync);
1143 tmTimerQueueLinkActive(&pVM->tm.s.CTX_SUFF(paTimerQueues)[enmClock], pTimer, u64Expire);
1145 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetOpt);
1146 TM_UNLOCK_TIMERS(pVM);
1158 * @param pVM Pointer to the VM.
1162 static int tmTimerVirtualSyncSet(PVM pVM, PTMTIMER pTimer, uint64_t u64Expire)
1164 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetVs), a);
1165 VM_ASSERT_EMT(pVM);
1166 TMTIMER_ASSERT_SYNC_CRITSECT_ORDER(pVM, pTimer);
1167 int rc = PDMCritSectEnter(&pVM->tm.s.VirtualSyncLock, VINF_SUCCESS);
1170 PTMTIMERQUEUE pQueue = &pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC];
1177 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetVsStExpDeliver);
1179 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetVsStStopped);
1181 AssertMsg(u64Expire >= pVM->tm.s.u64VirtualSync,
1182 ("%'RU64 < %'RU64 %s\n", u64Expire, pVM->tm.s.u64VirtualSync, R3STRING(pTimer->pszDesc)));
1190 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetVsStActive);
1216 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetVs), a);
1217 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
1231 PVM pVM = pTimer->CTX_SUFF(pVM);
1235 return tmTimerVirtualSyncSet(pVM, pTimer, u64Expire);
1237 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1240 DBGFTRACE_U64_TAG2(pVM, u64Expire, "TMTimerSet", R3STRING(pTimer->pszDesc));
1246 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSet);
1250 case TMTIMERSTATE_STOPPED: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStStopped); break;
1251 case TMTIMERSTATE_EXPIRED_DELIVER: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStExpDeliver); break;
1252 case TMTIMERSTATE_ACTIVE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStActive); break;
1253 case TMTIMERSTATE_PENDING_STOP: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStPendStop); break;
1254 case TMTIMERSTATE_PENDING_STOP_SCHEDULE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStPendStopSched); break;
1255 case TMTIMERSTATE_PENDING_SCHEDULE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStPendSched); break;
1256 case TMTIMERSTATE_PENDING_RESCHEDULE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStPendResched); break;
1257 default: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetStOther); break;
1272 if (RT_SUCCESS_NP(TM_TRY_LOCK_TIMERS(pVM)))
1276 tmTimerSetOptimizedStart(pVM, pTimer, u64Expire);
1277 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1280 TM_UNLOCK_TIMERS(pVM);
1308 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1320 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1332 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1344 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1375 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSet), a);
1384 * @param pVM Pointer to the VM.
1388 DECL_FORCE_INLINE(uint64_t) tmTimerSetRelativeNowWorker(PVM pVM, TMCLOCK enmClock, uint64_t *pu64Now)
1394 u64Now = TMVirtualSyncGet(pVM);
1397 u64Now = TMVirtualGet(pVM);
1400 u64Now = TMRealGet(pVM);
1417 * @param pVM Pointer to the VM.
1423 static int tmTimerSetRelativeOptimizedStart(PVM pVM, PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now)
1433 uint64_t const u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1440 DBGFTRACE_U64_TAG2(pVM, u64Expire, "tmTimerSetRelativeOptimizedStart", R3STRING(pTimer->pszDesc));
1441 tmTimerQueueLinkActive(&pVM->tm.s.CTX_SUFF(paTimerQueues)[enmClock], pTimer, u64Expire);
1443 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeOpt);
1444 TM_UNLOCK_TIMERS(pVM);
1456 * @param pVM Pointer to the VM.
1461 static int tmTimerVirtualSyncSetRelative(PVM pVM, PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now)
1463 STAM_PROFILE_START(pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelativeVs), a);
1464 VM_ASSERT_EMT(pVM);
1465 TMTIMER_ASSERT_SYNC_CRITSECT_ORDER(pVM, pTimer);
1466 int rc = PDMCritSectEnter(&pVM->tm.s.VirtualSyncLock, VINF_SUCCESS);
1470 uint64_t u64Expire = TMVirtualSyncGetNoCheck(pVM);
1476 PTMTIMERQUEUE pQueue = &pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC];
1483 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeVsStExpDeliver);
1485 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeVsStStopped);
1493 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeVsStActive);
1519 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelativeVs), a);
1520 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
1536 PVM pVM = pTimer->CTX_SUFF(pVM);
1540 return tmTimerVirtualSyncSetRelative(pVM, pTimer, cTicksToNext, pu64Now);
1542 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);
1545 DBGFTRACE_U64_TAG2(pVM, cTicksToNext, "TMTimerSetRelative", R3STRING(pTimer->pszDesc));
1551 STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelative);
1555 case TMTIMERSTATE_STOPPED: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStStopped); break;
1556 case TMTIMERSTATE_EXPIRED_DELIVER: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStExpDeliver); break;
1557 case TMTIMERSTATE_ACTIVE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStActive); break;
1558 case TMTIMERSTATE_PENDING_STOP: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStPendStop); break;
1559 case TMTIMERSTATE_PENDING_STOP_SCHEDULE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStPendStopSched); break;
1560 case TMTIMERSTATE_PENDING_SCHEDULE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStPendSched); break;
1561 case TMTIMERSTATE_PENDING_RESCHEDULE: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStPendResched); break;
1562 default: STAM_COUNTER_INC(&pVM->tm.s.StatTimerSetRelativeStOther); break;
1579 bool fOwnTMLock = RT_SUCCESS_NP(TM_TRY_LOCK_TIMERS(pVM));
1589 tmTimerSetRelativeOptimizedStart(pVM, pTimer, cTicksToNext, pu64Now);
1590 STAM_PROFILE_STOP(&pTimer->CTX_SUFF(pVM)->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);
1626 pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1641 pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1656 pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1671 pTimer->u64Expire = cTicksToNext + tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1716 tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1723 tmTimerSetRelativeNowWorker(pVM, enmClock, pu64Now);
1731 fOwnTMLock = RT_SUCCESS_NP(TM_TRY_LOCK_TIMERS(pVM));
1739 TM_UNLOCK_TIMERS(pVM);
1741 STAM_PROFILE_STOP(&pTimer->CTX_SUFF(pVM)->tm.s.CTX_SUFF_Z(StatTimerSetRelative), a);
1768 PVM pVM = pTimer->CTX_SUFF(pVM);
1769 uint32_t const uMaxHzHint = pVM->tm.s.uMaxHzHint;
1772 ASMAtomicWriteBool(&pVM->tm.s.fHzHintNeedsUpdating, true);
1785 * @param pVM Pointer to the VM.
1788 static int tmTimerVirtualSyncStop(PVM pVM, PTMTIMER pTimer)
1790 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerStopVs), a);
1791 VM_ASSERT_EMT(pVM);
1792 TMTIMER_ASSERT_SYNC_CRITSECT_ORDER(pVM, pTimer);
1793 int rc = PDMCritSectEnter(&pVM->tm.s.VirtualSyncLock, VINF_SUCCESS);
1799 if (pTimer->uHzHint >= pVM->tm.s.uMaxHzHint)
1800 ASMAtomicWriteBool(&pVM->tm.s.fHzHintNeedsUpdating, true);
1805 PTMTIMERQUEUE pQueue = &pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC];
1843 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStopVs), a);
1844 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
1858 PVM pVM = pTimer->CTX_SUFF(pVM);
1862 return tmTimerVirtualSyncStop(pVM, pTimer);
1864 STAM_PROFILE_START(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
1872 if (pTimer->uHzHint >= pVM->tm.s.uMaxHzHint)
1873 ASMAtomicWriteBool(&pVM->tm.s.fHzHintNeedsUpdating, true);
1896 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
1903 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
1911 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
1920 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
1950 STAM_PROFILE_STOP(&pVM->tm.s.CTX_SUFF_Z(StatTimerStop), a);
1964 PVM pVM = pTimer->CTX_SUFF(pVM);
1970 u64 = TMVirtualGet(pVM);
1973 u64 = TMVirtualSyncGet(pVM);
1976 u64 = TMRealGet(pVM);
2458 * @param pVM Pointer to the VM.
2460 static uint32_t tmGetFrequencyHint(PVM pVM)
2468 uint32_t uMaxHzHint = ASMAtomicUoReadU32(&pVM->tm.s.uMaxHzHint);
2469 if (RT_UNLIKELY(ASMAtomicReadBool(&pVM->tm.s.fHzHintNeedsUpdating)))
2471 if (RT_SUCCESS(TM_TRY_LOCK_TIMERS(pVM)))
2473 ASMAtomicWriteBool(&pVM->tm.s.fHzHintNeedsUpdating, false);
2481 PTMTIMERQUEUE pQueue = &pVM->tm.s.CTX_SUFF(paTimerQueues)[i];
2510 ASMAtomicWriteU32(&pVM->tm.s.uMaxHzHint, uMaxHzHint);
2512 TM_UNLOCK_TIMERS(pVM);
2528 * @param pVM Pointer to the VM.
2531 VMM_INT_DECL(uint32_t) TMCalcHostTimerFrequency(PVM pVM, PVMCPU pVCpu)
2533 uint32_t uHz = tmGetFrequencyHint(pVM);
2537 if (ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
2539 uint32_t u32Pct = ASMAtomicReadU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage);
2540 if (ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
2543 u32Pct = u32Pct * pVM->tm.s.cPctHostHzFudgeFactorCatchUp100 / 100;
2545 u32Pct = u32Pct * pVM->tm.s.cPctHostHzFudgeFactorCatchUp200 / 100;
2547 u32Pct = u32Pct * pVM->tm.s.cPctHostHzFudgeFactorCatchUp400 / 100;
2554 if (ASMAtomicUoReadBool(&pVM->tm.s.fVirtualWarpDrive))
2556 uint32_t u32Pct = ASMAtomicReadU32(&pVM->tm.s.u32VirtualWarpDrivePercentage);
2557 if (ASMAtomicReadBool(&pVM->tm.s.fVirtualWarpDrive))
2565 if (pVCpu->idCpu == pVM->tm.s.idTimerCpu)
2566 uHz *= pVM->tm.s.cPctHostHzFudgeFactorTimerCpu;
2568 uHz *= pVM->tm.s.cPctHostHzFudgeFactorOtherCpu;
2572 if (uHz > pVM->tm.s.cHostHzMax)
2573 uHz = pVM->tm.s.cHostHzMax;
2583 * @param pVM Pointer to the VM.
2585 VMM_INT_DECL(bool) TMVirtualIsTicking(PVM pVM)
2587 return RT_BOOL(pVM->tm.s.cVirtualTicking);