Lines Matching defs:pVM

51     PVM pVM = RT_FROM_MEMBER(pData, VM, CTX_SUFF(tm.s.VirtualGetRawData));
54 LogRel(("TM: u64DeltaPrev=%RI64 u64PrevNanoTS=0x%016RX64 u64NanoTS=0x%016RX64 pVM=%p\n",
55 u64DeltaPrev, u64PrevNanoTS, u64NanoTS, pVM));
57 Log(("TM: u64DeltaPrev=%RI64 u64PrevNanoTS=0x%016RX64 u64NanoTS=0x%016RX64 pVM=%p (debugging?)\n",
58 u64DeltaPrev, u64PrevNanoTS, u64NanoTS, pVM));
72 PVM pVM = RT_FROM_MEMBER(pData, VM, CTX_SUFF(tm.s.VirtualGetRawData));
78 AssertFatalMsg(RT_VALID_PTR(pGip), ("pVM=%p pGip=%p\n", pVM, pGip));
79 AssertFatalMsg(pGip->u32Magic == SUPGLOBALINFOPAGE_MAGIC, ("pVM=%p pGip=%p u32Magic=%#x\n", pVM, pGip, pGip->u32Magic));
81 ("pVM=%p pGip=%p u32Mode=%#x\n", pVM, pGip, pGip->u32Mode));
127 AssertFatalMsgFailed(("pVM=%p pGip=%p u32Mode=%#x\n", pVM, pGip, pGip->u32Mode));
133 ASMAtomicWritePtr((void * volatile *)&CTX_SUFF(pVM->tm.s.pfnVirtualGetRaw), (void *)(uintptr_t)pfnWorker);
143 PVM pVM = RT_FROM_MEMBER(pData, VM, CTX_SUFF(tm.s.VirtualGetRawData));
144 AssertFatalMsgFailed(("pVM=%p idApic=%#x iCpuSet=%#x iGipCpu=%#x\n", pVM, idApic, iCpuSet, iGipCpu));
154 DECLINLINE(uint64_t) tmVirtualGetRawNanoTS(PVM pVM)
157 uint64_t u64 = CTXALLSUFF(pVM->tm.s.pfnVirtualGetRaw)(&CTXALLSUFF(pVM->tm.s.VirtualGetRawData));
159 uint32_t cPrevSteps = pVM->tm.s.CTX_SUFF(VirtualGetRawData).c1nsSteps;
160 uint64_t u64 = pVM->tm.s.CTX_SUFF(pfnVirtualGetRaw)(&pVM->tm.s.CTX_SUFF(VirtualGetRawData));
161 if (cPrevSteps != pVM->tm.s.CTX_SUFF(VirtualGetRawData).c1nsSteps)
162 VMCPU_FF_SET(VMMGetCpu(pVM), VMCPU_FF_TO_R3);
164 /*DBGFTRACE_POS_U64(pVM, u64);*/
173 * @param pVM Pointer to the VM.
175 static uint64_t tmVirtualGetRawNonNormal(PVM pVM)
181 uint64_t u64 = tmVirtualGetRawNanoTS(pVM);
182 u64 -= pVM->tm.s.u64VirtualWarpDriveStart;
183 u64 *= pVM->tm.s.u32VirtualWarpDrivePercentage;
185 u64 += pVM->tm.s.u64VirtualWarpDriveStart;
192 u64 -= pVM->tm.s.u64VirtualOffset;
201 * @param pVM Pointer to the VM.
203 DECLINLINE(uint64_t) tmVirtualGetRaw(PVM pVM)
205 if (RT_LIKELY(!pVM->tm.s.fVirtualWarpDrive))
206 return tmVirtualGetRawNanoTS(pVM) - pVM->tm.s.u64VirtualOffset;
207 return tmVirtualGetRawNonNormal(pVM);
214 DECLINLINE(uint64_t) tmVirtualGet(PVM pVM, bool fCheckTimers)
217 if (RT_LIKELY(pVM->tm.s.cVirtualTicking))
219 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualGet);
220 u64 = tmVirtualGetRaw(pVM);
227 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
229 && !pVM->tm.s.fRunningQueues
230 && ( pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL].u64Expire <= u64
231 || ( pVM->tm.s.fVirtualSyncTicking
232 && pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire <= u64 - pVM->tm.s.offVirtualSync
235 && !pVM->tm.s.fRunningQueues
238 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualGetSetFF);
243 REMR3NotifyTimerPending(pVM, pVCpuDst);
251 u64 = pVM->tm.s.u64Virtual;
260 * @param pVM Pointer to the VM.
267 VMM_INT_DECL(uint64_t) TMVirtualGet(PVM pVM)
269 return tmVirtualGet(pVM, true /*fCheckTimers*/);
280 * @param pVM Pointer to the VM.
284 VMM_INT_DECL(uint64_t) TMVirtualGetNoCheck(PVM pVM)
286 return tmVirtualGet(pVM, false /*fCheckTimers*/);
294 * @param pVM Pointer to the VM.
297 DECLINLINE(uint64_t) tmVirtualVirtToNsDeadline(PVM pVM, uint64_t cVirtTicksToDeadline)
299 if (RT_UNLIKELY(pVM->tm.s.fVirtualWarpDrive))
300 return ASMMultU64ByU32DivByU32(cVirtTicksToDeadline, 100, pVM->tm.s.u32VirtualWarpDrivePercentage);
309 * @param pVM Pointer to the VM.
316 DECLINLINE(uint64_t) tmVirtualSyncGetHandleCatchUpLocked(PVM pVM, uint64_t u64, uint64_t off, uint64_t *pcNsToDeadline)
318 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetLocked);
326 const uint64_t u64Prev = pVM->tm.s.u64VirtualSyncCatchUpPrev;
330 uint64_t u64Sub = ASMMultU64ByU32DivByU32(u64Delta, pVM->tm.s.u32VirtualSyncCatchUpPercentage, 100);
331 if (off > u64Sub + pVM->tm.s.offVirtualSyncGivenUp)
334 Log4(("TM: %'RU64/-%'8RU64: sub %RU32 [vsghcul]\n", u64 - off, off - pVM->tm.s.offVirtualSyncGivenUp, u64Sub));
339 STAM_PROFILE_ADV_STOP(&pVM->tm.s.StatVirtualSyncCatchup, c);
340 off = pVM->tm.s.offVirtualSyncGivenUp;
360 uint64_t u64Last = ASMAtomicUoReadU64(&pVM->tm.s.u64VirtualSync);
364 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetAdjLast);
367 uint64_t u64Expire = ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire);
370 ASMAtomicWriteU64(&pVM->tm.s.u64VirtualSync, u64);
372 ASMAtomicWriteU64(&pVM->tm.s.offVirtualSync, off);
374 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncCatchUp, false);
376 ASMAtomicWriteU64(&pVM->tm.s.u64VirtualSyncCatchUpPrev, u64);
380 if (pVM->tm.s.fVirtualSyncCatchUp)
382 pVM->tm.s.u32VirtualSyncCatchUpPercentage + 100);
383 *pcNsToDeadline = tmVirtualVirtToNsDeadline(pVM, cNsToDeadline);
385 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
390 ASMAtomicWriteU64(&pVM->tm.s.u64VirtualSync, u64);
391 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncTicking, false);
393 VM_FF_SET(pVM, VM_FF_TM_VIRTUAL_SYNC);
394 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
397 Log4(("TM: %'RU64/-%'8RU64: exp tmr=>ff [vsghcul]\n", u64, pVM->tm.s.offVirtualSync - pVM->tm.s.offVirtualSyncGivenUp));
398 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
404 REMR3NotifyTimerPending(pVM, pVCpuDst);
408 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetSetFF);
409 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetExpired);
411 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetLocked);
414 DBGFTRACE_U64_TAG(pVM, u64, "tmVirtualSyncGetHandleCatchUpLocked");
423 * @param pVM Pointer to the VM.
429 DECLINLINE(uint64_t) tmVirtualSyncGetLocked(PVM pVM, uint64_t u64, uint64_t *pcNsToDeadline)
434 if (!pVM->tm.s.fVirtualSyncTicking)
436 u64 = ASMAtomicUoReadU64(&pVM->tm.s.u64VirtualSync);
437 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
440 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetLocked);
442 DBGFTRACE_U64_TAG(pVM, u64, "tmVirtualSyncGetLocked-stopped");
449 uint64_t off = ASMAtomicUoReadU64(&pVM->tm.s.offVirtualSync);
450 if (ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
451 return tmVirtualSyncGetHandleCatchUpLocked(pVM, u64, off, pcNsToDeadline);
460 uint64_t u64Last = ASMAtomicUoReadU64(&pVM->tm.s.u64VirtualSync);
464 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetAdjLast);
467 uint64_t u64Expire = ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire);
470 ASMAtomicWriteU64(&pVM->tm.s.u64VirtualSync, u64);
471 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
473 *pcNsToDeadline = tmVirtualVirtToNsDeadline(pVM, u64Expire - u64);
478 ASMAtomicWriteU64(&pVM->tm.s.u64VirtualSync, u64);
479 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncTicking, false);
481 VM_FF_SET(pVM, VM_FF_TM_VIRTUAL_SYNC);
482 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
485 Log4(("TM: %'RU64/-%'8RU64: exp tmr=>ff [vsgl]\n", u64, pVM->tm.s.offVirtualSync - pVM->tm.s.offVirtualSyncGivenUp));
486 PDMCritSectLeave(&pVM->tm.s.VirtualSyncLock);
490 REMR3NotifyTimerPending(pVM, pVCpuDst);
496 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetSetFF);
497 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetExpired);
499 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetLocked);
501 DBGFTRACE_U64_TAG(pVM, u64, "tmVirtualSyncGetLocked");
510 * @param pVM Pointer to the VM.
517 DECLINLINE(uint64_t) tmVirtualSyncGetEx(PVM pVM, bool fCheckTimers, uint64_t *pcNsToDeadline)
519 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGet);
522 if (!pVM->tm.s.fVirtualSyncTicking)
526 u64 = pVM->tm.s.u64VirtualSync;
527 DBGFTRACE_U64_TAG(pVM, u64, "tmVirtualSyncGetEx-stopped1");
534 Assert(pVM->tm.s.cVirtualTicking);
535 u64 = tmVirtualGetRaw(pVM);
538 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
540 && pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL].u64Expire <= u64)
546 REMR3NotifyTimerPending(pVM, pVCpuDst);
550 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetSetFF);
561 if (PDMCritSectTryEnter(&pVM->tm.s.VirtualSyncLock) == VINF_SUCCESS)
562 return tmVirtualSyncGetLocked(pVM, u64, pcNsToDeadline);
569 if (ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking))
571 if (!ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
573 off = ASMAtomicReadU64(&pVM->tm.s.offVirtualSync);
574 if (RT_LIKELY( ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking)
575 && !ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncCatchUp)
576 && off == ASMAtomicReadU64(&pVM->tm.s.offVirtualSync)))
579 uint64_t const u64Expire = ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire);
583 *pcNsToDeadline = tmVirtualVirtToNsDeadline(pVM, u64Expire - off);
584 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetLockless);
586 DBGFTRACE_U64_TAG(pVM, off, "tmVirtualSyncGetEx-lockless");
594 off = ASMAtomicReadU64(&pVM->tm.s.u64VirtualSync);
595 if (RT_LIKELY(!ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncTicking)))
599 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetLockless);
601 DBGFTRACE_U64_TAG(pVM, off, "tmVirtualSyncGetEx-stopped2");
629 int rcLock = PDMCritSectTryEnter(&pVM->tm.s.VirtualSyncLock);
631 return tmVirtualSyncGetLocked(pVM, u64, pcNsToDeadline);
634 if (!ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncTicking))
636 off = ASMAtomicReadU64(&pVM->tm.s.u64VirtualSync);
637 if ( ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncTicking)
643 DBGFTRACE_U64_TAG(pVM, off, "tmVirtualSyncGetEx-stopped3");
647 off = ASMAtomicReadU64(&pVM->tm.s.offVirtualSync);
648 if (ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
651 uint64_t const u64Prev = ASMAtomicReadU64(&pVM->tm.s.u64VirtualSyncCatchUpPrev);
652 uint64_t const offGivenUp = ASMAtomicReadU64(&pVM->tm.s.offVirtualSyncGivenUp);
653 uint32_t const u32Pct = ASMAtomicReadU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage);
654 if ( ( u64Prev == ASMAtomicReadU64(&pVM->tm.s.u64VirtualSyncCatchUpPrev)
655 && offGivenUp == ASMAtomicReadU64(&pVM->tm.s.offVirtualSyncGivenUp)
656 && u32Pct == ASMAtomicReadU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage)
657 && ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
667 Log4(("TM: %'RU64/-%'8RU64: sub %RU32 [NoLock]\n", u64 - off, pVM->tm.s.offVirtualSync - offGivenUp, u64Sub));
672 STAM_PROFILE_ADV_STOP(&pVM->tm.s.StatVirtualSyncCatchup, c);
682 if ( ASMAtomicUoReadBool(&pVM->tm.s.fVirtualSyncTicking)
683 && ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
689 else if ( off == ASMAtomicReadU64(&pVM->tm.s.offVirtualSync)
690 && !ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
696 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetELoop);
705 uint64_t u64Expire = ASMAtomicReadU64(&pVM->tm.s.CTX_SUFF(paTimerQueues)[TMCLOCK_VIRTUAL_SYNC].u64Expire);
708 PVMCPU pVCpuDst = &pVM->aCpus[pVM->tm.s.idTimerCpu];
712 VM_FF_SET(pVM, VM_FF_TM_VIRTUAL_SYNC); /* Hmm? */
716 REMR3NotifyTimerPending(pVM, pVCpuDst);
720 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetSetFF);
721 Log4(("TM: %'RU64/-%'8RU64: exp tmr=>ff [NoLock]\n", u64, pVM->tm.s.offVirtualSync - pVM->tm.s.offVirtualSyncGivenUp));
724 Log4(("TM: %'RU64/-%'8RU64: exp tmr [NoLock]\n", u64, pVM->tm.s.offVirtualSync - pVM->tm.s.offVirtualSyncGivenUp));
727 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncGetExpired);
732 if (ASMAtomicReadBool(&pVM->tm.s.fVirtualSyncCatchUp))
734 ASMAtomicReadU32(&pVM->tm.s.u32VirtualSyncCatchUpPercentage) + 100);
735 *pcNsToDeadline = tmVirtualVirtToNsDeadline(pVM, cNsToDeadline);
739 DBGFTRACE_U64_TAG(pVM, u64, "tmVirtualSyncGetEx-nolock");
748 * @param pVM Pointer to the VM.
752 VMM_INT_DECL(uint64_t) TMVirtualSyncGet(PVM pVM)
754 return tmVirtualSyncGetEx(pVM, true /*fCheckTimers*/, NULL /*pcNsToDeadline*/);
763 * @param pVM Pointer to the VM.
767 VMM_INT_DECL(uint64_t) TMVirtualSyncGetNoCheck(PVM pVM)
769 return tmVirtualSyncGetEx(pVM, false /*fCheckTimers*/, NULL /*pcNsToDeadline*/);
777 * @param pVM Pointer to the VM.
782 VMM_INT_DECL(uint64_t) TMVirtualSyncGetEx(PVM pVM, bool fCheckTimers)
784 return tmVirtualSyncGetEx(pVM, fCheckTimers, NULL /*pcNsToDeadline*/);
793 * @param pVM Pointer to the VM.
799 VMM_INT_DECL(uint64_t) TMVirtualSyncGetWithDeadlineNoCheck(PVM pVM, uint64_t *pcNsToDeadline)
802 uint64_t u64Now = tmVirtualSyncGetEx(pVM, false /*fCheckTimers*/, &cNsToDeadlineTmp);
812 * @param pVM Pointer to the VM.
816 VMMDECL(uint64_t) TMVirtualSyncGetNsToDeadline(PVM pVM)
819 tmVirtualSyncGetEx(pVM, false /*fCheckTimers*/, &cNsToDeadline);
828 * @param pVM Pointer to the VM.
830 VMM_INT_DECL(uint64_t) TMVirtualSyncGetLag(PVM pVM)
832 return pVM->tm.s.offVirtualSync - pVM->tm.s.offVirtualSyncGivenUp;
840 * @param pVM Pointer to the VM.
842 VMM_INT_DECL(uint32_t) TMVirtualSyncGetCatchUpPct(PVM pVM)
844 if (pVM->tm.s.fVirtualSyncCatchUp)
845 return pVM->tm.s.u32VirtualSyncCatchUpPercentage;
854 * @param pVM Pointer to the VM.
856 VMM_INT_DECL(uint64_t) TMVirtualGetFreq(PVM pVM)
858 NOREF(pVM);
867 * @param pVM Pointer to the VM.
869 int tmVirtualPauseLocked(PVM pVM)
871 uint32_t c = ASMAtomicDecU32(&pVM->tm.s.cVirtualTicking);
872 AssertMsgReturn(c < pVM->cCpus, ("%u vs %u\n", c, pVM->cCpus), VERR_TM_VIRTUAL_TICKING_IPE);
875 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualPause);
876 pVM->tm.s.u64Virtual = tmVirtualGetRaw(pVM);
877 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncTicking, false);
887 * @param pVM Pointer to the VM.
889 int tmVirtualResumeLocked(PVM pVM)
891 uint32_t c = ASMAtomicIncU32(&pVM->tm.s.cVirtualTicking);
892 AssertMsgReturn(c <= pVM->cCpus, ("%u vs %u\n", c, pVM->cCpus), VERR_TM_VIRTUAL_TICKING_IPE);
895 STAM_COUNTER_INC(&pVM->tm.s.StatVirtualResume);
896 pVM->tm.s.u64VirtualRawPrev = 0;
897 pVM->tm.s.u64VirtualWarpDriveStart = tmVirtualGetRawNanoTS(pVM);
898 pVM->tm.s.u64VirtualOffset = pVM->tm.s.u64VirtualWarpDriveStart - pVM->tm.s.u64Virtual;
899 ASMAtomicWriteBool(&pVM->tm.s.fVirtualSyncTicking, true);
909 * @param pVM Pointer to the VM.
914 VMM_INT_DECL(uint64_t) TMVirtualToNano(PVM pVM, uint64_t u64VirtualTicks)
916 NOREF(pVM);
926 * @param pVM Pointer to the VM.
931 VMM_INT_DECL(uint64_t) TMVirtualToMicro(PVM pVM, uint64_t u64VirtualTicks)
933 NOREF(pVM);
943 * @param pVM Pointer to the VM.
948 VMM_INT_DECL(uint64_t) TMVirtualToMilli(PVM pVM, uint64_t u64VirtualTicks)
950 NOREF(pVM);
960 * @param pVM Pointer to the VM.
964 VMM_INT_DECL(uint64_t) TMVirtualFromNano(PVM pVM, uint64_t u64NanoTS)
966 NOREF(pVM);
976 * @param pVM Pointer to the VM.
980 VMM_INT_DECL(uint64_t) TMVirtualFromMicro(PVM pVM, uint64_t u64MicroTS)
982 NOREF(pVM);
992 * @param pVM Pointer to the VM.
996 VMM_INT_DECL(uint64_t) TMVirtualFromMilli(PVM pVM, uint64_t u64MilliTS)
998 NOREF(pVM);