Lines Matching defs:pVM

136 static int                  vmmR3InitStacks(PVM pVM);
137 static int vmmR3InitLoggers(PVM pVM);
138 static void vmmR3InitRegisterStats(PVM pVM);
139 static DECLCALLBACK(int) vmmR3Save(PVM pVM, PSSMHANDLE pSSM);
140 static DECLCALLBACK(int) vmmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass);
141 static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, PTMTIMER pTimer, void *pvUser);
142 static int vmmR3ServiceCallRing3Request(PVM pVM, PVMCPU pVCpu);
143 static DECLCALLBACK(void) vmmR3InfoFF(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
150 * @param pVM Pointer to the VM.
152 VMMR3_INT_DECL(int) VMMR3Init(PVM pVM)
159 AssertMsg(pVM->vmm.s.offVM == 0, ("Already initialized!\n"));
160 AssertCompile(sizeof(pVM->vmm.s) <= sizeof(pVM->vmm.padding));
161 AssertCompile(sizeof(pVM->aCpus[0].vmm.s) <= sizeof(pVM->aCpus[0].vmm.padding));
166 pVM->vmm.s.offVM = RT_OFFSETOF(VM, vmm);
167 pVM->vmm.s.pahEvtRendezvousEnterOrdered = NULL;
168 pVM->vmm.s.hEvtRendezvousEnterOneByOne = NIL_RTSEMEVENT;
169 pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce = NIL_RTSEMEVENTMULTI;
170 pVM->vmm.s.hEvtMulRendezvousDone = NIL_RTSEMEVENTMULTI;
171 pVM->vmm.s.hEvtRendezvousDoneCaller = NIL_RTSEMEVENT;
177 int rc = CFGMR3QueryU32Def(CFGMR3GetRoot(pVM), "YieldEMTInterval", &pVM->vmm.s.cYieldEveryMillies,
189 PCFGMNODE pCfgVMM = CFGMR3GetChild(CFGMR3GetRoot(pVM), "VMM");
190 rc = CFGMR3QueryBoolDef(pCfgVMM, "UsePeriodicPreemptionTimers", &pVM->vmm.s.fUsePeriodicPreemptionTimers, true);
196 pVM->vmm.s.pahEvtRendezvousEnterOrdered = (PRTSEMEVENT)MMR3HeapAlloc(pVM, MM_TAG_VMM, sizeof(RTSEMEVENT) * pVM->cCpus);
197 if (!pVM->vmm.s.pahEvtRendezvousEnterOrdered)
199 for (VMCPUID i = 0; i < pVM->cCpus; i++)
200 pVM->vmm.s.pahEvtRendezvousEnterOrdered[i] = NIL_RTSEMEVENT;
201 for (VMCPUID i = 0; i < pVM->cCpus; i++)
203 rc = RTSemEventCreate(&pVM->vmm.s.pahEvtRendezvousEnterOrdered[i]);
206 rc = RTSemEventCreate(&pVM->vmm.s.hEvtRendezvousEnterOneByOne);
208 rc = RTSemEventMultiCreate(&pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce);
210 rc = RTSemEventMultiCreate(&pVM->vmm.s.hEvtMulRendezvousDone);
212 rc = RTSemEventCreate(&pVM->vmm.s.hEvtRendezvousDoneCaller);
218 rc = SSMR3RegisterInternal(pVM, "vmm", 1, VMM_SAVED_STATE_VERSION, VMM_STACK_SIZE + sizeof(RTGCPTR),
228 rc = SUPR3SetVMForFastIOCtl(pVM->pVMR0);
235 rc = vmmR3SwitcherInit(pVM);
238 rc = vmmR3InitStacks(pVM);
241 rc = vmmR3InitLoggers(pVM);
249 rc = MMR3HyperReserve(pVM, PAGE_SIZE, "Host APIC", &pVM->vmm.s.GCPtrApicBase);
258 DBGFR3InfoRegisterInternal(pVM, "fflags", "Displays the current Forced actions Flags.", vmmR3InfoFF);
259 vmmR3InitRegisterStats(pVM);
271 //int rc2 = vmmR3TermCoreCode(pVM);
285 * @param pVM Pointer to the VM.
290 static int vmmR3InitStacks(PVM pVM)
299 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
301 PVMCPU pVCpu = &pVM->aCpus[idCpu];
304 rc = MMR3HyperAllocOnceNoRelEx(pVM, PAGE_SIZE + VMM_STACK_SIZE + PAGE_SIZE,
306 rc = MMR3HyperAllocOnceNoRelEx(pVM, VMM_STACK_SIZE,
316 if (!HMIsEnabled(pVM))
320 pVCpu->vmm.s.CallRing3JmpBufR0.pvSavedStack = MMHyperR3ToR0(pVM, pVCpu->vmm.s.pbEMTStackR3);
321 pVCpu->vmm.s.pbEMTStackRC = MMHyperR3ToRC(pVM, pVCpu->vmm.s.pbEMTStackR3);
337 * @param pVM Pointer to the VM.
339 static int vmmR3InitLoggers(PVM pVM)
351 if (!HMIsEnabled(pVM))
353 pVM->vmm.s.cbRCLogger = RT_OFFSETOF(RTLOGGERRC, afGroups[pLogger->cGroups]);
354 rc = MMR3HyperAllocOnceNoRel(pVM, pVM->vmm.s.cbRCLogger, 0, MM_TAG_VMM, (void **)&pVM->vmm.s.pRCLoggerR3);
357 pVM->vmm.s.pRCLoggerRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pRCLoggerR3);
362 for (VMCPUID i = 0; i < pVM->cCpus; i++)
364 PVMCPU pVCpu = &pVM->aCpus[i];
365 rc = MMR3HyperAllocOnceNoRelEx(pVM, cbLogger, PAGE_SIZE, MM_TAG_VMM, MMHYPER_AONR_FLAGS_KERNEL_MAPPING,
369 pVCpu->vmm.s.pR0LoggerR3->pVM = pVM->pVMR0;
372 pVCpu->vmm.s.pR0LoggerR0 = MMHyperR3ToR0(pVM, pVCpu->vmm.s.pR0LoggerR3);
382 if (!HMIsEnabled(pVM))
387 pVM->vmm.s.cbRCRelLogger = RT_OFFSETOF(RTLOGGERRC, afGroups[pRelLogger->cGroups]);
388 rc = MMR3HyperAllocOnceNoRel(pVM, pVM->vmm.s.cbRCRelLogger, 0, MM_TAG_VMM, (void **)&pVM->vmm.s.pRCRelLoggerR3);
391 pVM->vmm.s.pRCRelLoggerRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pRCRelLoggerR3);
402 * @param pVM The shared VM structure.
404 static void vmmR3InitRegisterStats(PVM pVM)
409 STAM_REG(pVM, &pVM->vmm.s.StatRunRC, STAMTYPE_COUNTER, "/VMM/RunRC", STAMUNIT_OCCURENCES, "Number of context switches.");
410 STAM_REG(pVM, &pVM->vmm.s.StatRZRetNormal, STAMTYPE_COUNTER, "/VMM/RZRet/Normal", STAMUNIT_OCCURENCES, "Number of VINF_SUCCESS returns.");
411 STAM_REG(pVM, &pVM->vmm.s.StatRZRetInterrupt, STAMTYPE_COUNTER, "/VMM/RZRet/Interrupt", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_INTERRUPT returns.");
412 STAM_REG(pVM, &pVM->vmm.s.StatRZRetInterruptHyper, STAMTYPE_COUNTER, "/VMM/RZRet/InterruptHyper", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_INTERRUPT_HYPER returns.");
413 STAM_REG(pVM, &pVM->vmm.s.StatRZRetGuestTrap, STAMTYPE_COUNTER, "/VMM/RZRet/GuestTrap", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_GUEST_TRAP returns.");
414 STAM_REG(pVM, &pVM->vmm.s.StatRZRetRingSwitch, STAMTYPE_COUNTER, "/VMM/RZRet/RingSwitch", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_RING_SWITCH returns.");
415 STAM_REG(pVM, &pVM->vmm.s.StatRZRetRingSwitchInt, STAMTYPE_COUNTER, "/VMM/RZRet/RingSwitchInt", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_RING_SWITCH_INT returns.");
416 STAM_REG(pVM, &pVM->vmm.s.StatRZRetStaleSelector, STAMTYPE_COUNTER, "/VMM/RZRet/StaleSelector", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_STALE_SELECTOR returns.");
417 STAM_REG(pVM, &pVM->vmm.s.StatRZRetIRETTrap, STAMTYPE_COUNTER, "/VMM/RZRet/IRETTrap", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_IRET_TRAP returns.");
418 STAM_REG(pVM, &pVM->vmm.s.StatRZRetEmulate, STAMTYPE_COUNTER, "/VMM/RZRet/Emulate", STAMUNIT_OCCURENCES, "Number of VINF_EM_EXECUTE_INSTRUCTION returns.");
419 STAM_REG(pVM, &pVM->vmm.s.StatRZRetIOBlockEmulate, STAMTYPE_COUNTER, "/VMM/RZRet/EmulateIOBlock", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_EMULATE_IO_BLOCK returns.");
420 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchEmulate, STAMTYPE_COUNTER, "/VMM/RZRet/PatchEmulate", STAMUNIT_OCCURENCES, "Number of VINF_PATCH_EMULATE_INSTR returns.");
421 STAM_REG(pVM, &pVM->vmm.s.StatRZRetIORead, STAMTYPE_COUNTER, "/VMM/RZRet/IORead", STAMUNIT_OCCURENCES, "Number of VINF_IOM_R3_IOPORT_READ returns.");
422 STAM_REG(pVM, &pVM->vmm.s.StatRZRetIOWrite, STAMTYPE_COUNTER, "/VMM/RZRet/IOWrite", STAMUNIT_OCCURENCES, "Number of VINF_IOM_R3_IOPORT_WRITE returns.");
423 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMMIORead, STAMTYPE_COUNTER, "/VMM/RZRet/MMIORead", STAMUNIT_OCCURENCES, "Number of VINF_IOM_R3_MMIO_READ returns.");
424 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMMIOWrite, STAMTYPE_COUNTER, "/VMM/RZRet/MMIOWrite", STAMUNIT_OCCURENCES, "Number of VINF_IOM_R3_MMIO_WRITE returns.");
425 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMMIOReadWrite, STAMTYPE_COUNTER, "/VMM/RZRet/MMIOReadWrite", STAMUNIT_OCCURENCES, "Number of VINF_IOM_R3_MMIO_READ_WRITE returns.");
426 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMMIOPatchRead, STAMTYPE_COUNTER, "/VMM/RZRet/MMIOPatchRead", STAMUNIT_OCCURENCES, "Number of VINF_IOM_HC_MMIO_PATCH_READ returns.");
427 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMMIOPatchWrite, STAMTYPE_COUNTER, "/VMM/RZRet/MMIOPatchWrite", STAMUNIT_OCCURENCES, "Number of VINF_IOM_HC_MMIO_PATCH_WRITE returns.");
428 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMSRRead, STAMTYPE_COUNTER, "/VMM/RZRet/MSRRead", STAMUNIT_OCCURENCES, "Number of VINF_CPUM_R3_MSR_READ returns.");
429 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMSRWrite, STAMTYPE_COUNTER, "/VMM/RZRet/MSRWrite", STAMUNIT_OCCURENCES, "Number of VINF_CPUM_R3_MSR_WRITE returns.");
430 STAM_REG(pVM, &pVM->vmm.s.StatRZRetLDTFault, STAMTYPE_COUNTER, "/VMM/RZRet/LDTFault", STAMUNIT_OCCURENCES, "Number of VINF_EM_EXECUTE_INSTRUCTION_GDT_FAULT returns.");
431 STAM_REG(pVM, &pVM->vmm.s.StatRZRetGDTFault, STAMTYPE_COUNTER, "/VMM/RZRet/GDTFault", STAMUNIT_OCCURENCES, "Number of VINF_EM_EXECUTE_INSTRUCTION_LDT_FAULT returns.");
432 STAM_REG(pVM, &pVM->vmm.s.StatRZRetIDTFault, STAMTYPE_COUNTER, "/VMM/RZRet/IDTFault", STAMUNIT_OCCURENCES, "Number of VINF_EM_EXECUTE_INSTRUCTION_IDT_FAULT returns.");
433 STAM_REG(pVM, &pVM->vmm.s.StatRZRetTSSFault, STAMTYPE_COUNTER, "/VMM/RZRet/TSSFault", STAMUNIT_OCCURENCES, "Number of VINF_EM_EXECUTE_INSTRUCTION_TSS_FAULT returns.");
434 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPDFault, STAMTYPE_COUNTER, "/VMM/RZRet/PDFault", STAMUNIT_OCCURENCES, "Number of VINF_EM_EXECUTE_INSTRUCTION_PD_FAULT returns.");
435 STAM_REG(pVM, &pVM->vmm.s.StatRZRetCSAMTask, STAMTYPE_COUNTER, "/VMM/RZRet/CSAMTask", STAMUNIT_OCCURENCES, "Number of VINF_CSAM_PENDING_ACTION returns.");
436 STAM_REG(pVM, &pVM->vmm.s.StatRZRetSyncCR3, STAMTYPE_COUNTER, "/VMM/RZRet/SyncCR", STAMUNIT_OCCURENCES, "Number of VINF_PGM_SYNC_CR3 returns.");
437 STAM_REG(pVM, &pVM->vmm.s.StatRZRetMisc, STAMTYPE_COUNTER, "/VMM/RZRet/Misc", STAMUNIT_OCCURENCES, "Number of misc returns.");
438 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchInt3, STAMTYPE_COUNTER, "/VMM/RZRet/PatchInt3", STAMUNIT_OCCURENCES, "Number of VINF_PATM_PATCH_INT3 returns.");
439 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchPF, STAMTYPE_COUNTER, "/VMM/RZRet/PatchPF", STAMUNIT_OCCURENCES, "Number of VINF_PATM_PATCH_TRAP_PF returns.");
440 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchGP, STAMTYPE_COUNTER, "/VMM/RZRet/PatchGP", STAMUNIT_OCCURENCES, "Number of VINF_PATM_PATCH_TRAP_GP returns.");
441 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchIretIRQ, STAMTYPE_COUNTER, "/VMM/RZRet/PatchIret", STAMUNIT_OCCURENCES, "Number of VINF_PATM_PENDING_IRQ_AFTER_IRET returns.");
442 STAM_REG(pVM, &pVM->vmm.s.StatRZRetRescheduleREM, STAMTYPE_COUNTER, "/VMM/RZRet/ScheduleREM", STAMUNIT_OCCURENCES, "Number of VINF_EM_RESCHEDULE_REM returns.");
443 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
444 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3Unknown, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/Unknown", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
445 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3TMVirt, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/TMVirt", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
446 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3HandyPages, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/Handy", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
447 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3PDMQueues, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/PDMQueue", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
448 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3Rendezvous, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/Rendezvous", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
449 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3Timer, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/Timer", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
450 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3DMA, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/DMA", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
451 STAM_REG(pVM, &pVM->vmm.s.StatRZRetToR3CritSect, STAMTYPE_COUNTER, "/VMM/RZRet/ToR3/CritSect", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TO_R3 returns.");
452 STAM_REG(pVM, &pVM->vmm.s.StatRZRetTimerPending, STAMTYPE_COUNTER, "/VMM/RZRet/TimerPending", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_TIMER_PENDING returns.");
453 STAM_REG(pVM, &pVM->vmm.s.StatRZRetInterruptPending, STAMTYPE_COUNTER, "/VMM/RZRet/InterruptPending", STAMUNIT_OCCURENCES, "Number of VINF_EM_RAW_INTERRUPT_PENDING returns.");
454 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPATMDuplicateFn, STAMTYPE_COUNTER, "/VMM/RZRet/PATMDuplicateFn", STAMUNIT_OCCURENCES, "Number of VINF_PATM_DUPLICATE_FUNCTION returns.");
455 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPGMChangeMode, STAMTYPE_COUNTER, "/VMM/RZRet/PGMChangeMode", STAMUNIT_OCCURENCES, "Number of VINF_PGM_CHANGE_MODE returns.");
456 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPGMFlushPending, STAMTYPE_COUNTER, "/VMM/RZRet/PGMFlushPending", STAMUNIT_OCCURENCES, "Number of VINF_PGM_POOL_FLUSH_PENDING returns.");
457 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPendingRequest, STAMTYPE_COUNTER, "/VMM/RZRet/PendingRequest", STAMUNIT_OCCURENCES, "Number of VINF_EM_PENDING_REQUEST returns.");
458 STAM_REG(pVM, &pVM->vmm.s.StatRZRetPatchTPR, STAMTYPE_COUNTER, "/VMM/RZRet/PatchTPR", STAMUNIT_OCCURENCES, "Number of VINF_EM_HM_PATCH_TPR_INSTR returns.");
459 STAM_REG(pVM, &pVM->vmm.s.StatRZRetCallRing3, STAMTYPE_COUNTER, "/VMM/RZCallR3/Misc", STAMUNIT_OCCURENCES, "Number of Other ring-3 calls.");
460 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPDMLock, STAMTYPE_COUNTER, "/VMM/RZCallR3/PDMLock", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PDM_LOCK calls.");
461 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPDMCritSectEnter, STAMTYPE_COUNTER, "/VMM/RZCallR3/PDMCritSectEnter", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PDM_CRITSECT_ENTER calls.");
462 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMLock, STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMLock", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_LOCK calls.");
463 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMPoolGrow, STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMPoolGrow", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_POOL_GROW calls.");
464 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMMapChunk, STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMMapChunk", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_MAP_CHUNK calls.");
465 STAM_REG(pVM, &pVM->vmm.s.StatRZCallPGMAllocHandy, STAMTYPE_COUNTER, "/VMM/RZCallR3/PGMAllocHandy", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_PGM_ALLOCATE_HANDY_PAGES calls.");
466 STAM_REG(pVM, &pVM->vmm.s.StatRZCallRemReplay, STAMTYPE_COUNTER, "/VMM/RZCallR3/REMReplay", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_REM_REPLAY_HANDLER_NOTIFICATIONS calls.");
467 STAM_REG(pVM, &pVM->vmm.s.StatRZCallLogFlush, STAMTYPE_COUNTER, "/VMM/RZCallR3/VMMLogFlush", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_VMM_LOGGER_FLUSH calls.");
468 STAM_REG(pVM, &pVM->vmm.s.StatRZCallVMSetError, STAMTYPE_COUNTER, "/VMM/RZCallR3/VMSetError", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_VM_SET_ERROR calls.");
469 STAM_REG(pVM, &pVM->vmm.s.StatRZCallVMSetRuntimeError, STAMTYPE_COUNTER, "/VMM/RZCallR3/VMRuntimeError", STAMUNIT_OCCURENCES, "Number of VMMCALLRING3_VM_SET_RUNTIME_ERROR calls.");
472 for (VMCPUID i = 0; i < pVM->cCpus; i++)
474 STAMR3RegisterF(pVM, &pVM->aCpus[i].vmm.s.CallRing3JmpBufR0.cbUsedMax, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Max amount of stack used.", "/VMM/Stack/CPU%u/Max", i);
475 STAMR3RegisterF(pVM, &pVM->aCpus[i].vmm.s.CallRing3JmpBufR0.cbUsedAvg, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Average stack usage.", "/VMM/Stack/CPU%u/Avg", i);
476 STAMR3RegisterF(pVM, &pVM->aCpus[i].vmm.s.CallRing3JmpBufR0.cUsedTotal, STAMTYPE_U64, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "Number of stack usages.", "/VMM/Stack/CPU%u/Uses", i);
486 * @param pVM Pointer to the VM.
488 VMMR3_INT_DECL(int) VMMR3InitR0(PVM pVM)
491 PVMCPU pVCpu = VMMGetCpu(pVM);
501 rc = VMMR3UpdateLoggers(pVM);
516 rc = SUPR3CallVMMR0Ex(pVM->pVMR0, 0 /*idCpu*/, VMMR0_DO_VMMR0_INIT,
529 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
543 if (pVM->aCpus[0].vmm.s.hR0ThreadCtx != NIL_RTTHREADCTX)
557 * @param pVM Pointer to the VM.
559 VMMR3_INT_DECL(int) VMMR3InitRC(PVM pVM)
561 PVMCPU pVCpu = VMMGetCpu(pVM);
565 if (HMIsEnabled(pVM))
568 AssertReturn(pVM->cCpus == 1, VERR_RAW_MODE_INVALID_SMP);
577 int rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "VMMGCEntry", &RCPtrEP);
587 CPUMPushHyper(pVCpu, pVM->pVMRC); /* Param 0: pVM */
590 CPUMSetHyperEIP(pVCpu, pVM->vmm.s.pfnCallTrampolineRC);
599 rc = SUPR3CallVMMR0(pVM->pVMR0, 0 /* VCPU 0 */, VMMR0_DO_CALL_HYPERVISOR, NULL);
602 PRTLOGGERRC pLogger = pVM->vmm.s.pRCLoggerR3;
608 PRTLOGGERRC pRelLogger = pVM->vmm.s.pRCRelLoggerR3;
614 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
621 VMMR3FatalDump(pVM, pVCpu, rc);
636 * @param pVM Pointer to the VM.
639 VMMR3_INT_DECL(int) VMMR3InitCompleted(PVM pVM, VMINITCOMPLETED enmWhat)
650 rc = CPUMR3InitCompleted(pVM);
656 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
658 rc = PGMMapSetPage(pVM, pVM->aCpus[idCpu].vmm.s.pbEMTStackRC, VMM_STACK_SIZE,
666 rc = TMR3TimerCreateInternal(pVM, TMCLOCK_REAL, vmmR3YieldEMT, NULL, "EMT Yielder", &pVM->vmm.s.pYieldTimer);
669 rc = TMTimerSetMillies(pVM->vmm.s.pYieldTimer, pVM->vmm.s.cYieldEveryMillies);
676 rc = PGMMap(pVM, pVM->vmm.s.GCPtrApicBase, 0xfee00000, PAGE_SIZE,
686 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
688 uint8_t *pbEMTStackR3 = pVM->aCpus[idCpu].vmm.s.pbEMTStackR3;
691 MMR3HyperSetGuard(pVM, pbEMTStackR3 - PAGE_SIZE, PAGE_SIZE, true /*fSet*/);
694 MMR3HyperSetGuard(pVM, pbEMTStackR3 + VMM_STACK_SIZE, PAGE_SIZE, true /*fSet*/);
696 pVM->vmm.s.fStackGuardsStationed = true;
707 if ( pVM->vmm.s.fUsePeriodicPreemptionTimers
708 && HMR3IsVmxPreemptionTimerUsed(pVM))
709 pVM->vmm.s.fUsePeriodicPreemptionTimers = false;
710 LogRel(("VMM: fUsePeriodicPreemptionTimers=%RTbool\n", pVM->vmm.s.fUsePeriodicPreemptionTimers));
716 rc = GIMR3InitCompleted(pVM);
722 CPUMR3LogCpuIds(pVM);
738 * @param pVM Pointer to the VM.
740 VMMR3_INT_DECL(int) VMMR3Term(PVM pVM)
742 PVMCPU pVCpu = VMMGetCpu(pVM);
755 rc = SUPR3CallVMMR0Ex(pVM->pVMR0, 0 /*idCpu*/, VMMR0_DO_VMMR0_TERM, 0, NULL);
767 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
779 for (VMCPUID i = 0; i < pVM->cCpus; i++)
781 RTSemEventDestroy(pVM->vmm.s.pahEvtRendezvousEnterOrdered[i]);
782 pVM->vmm.s.pahEvtRendezvousEnterOrdered[i] = NIL_RTSEMEVENT;
784 RTSemEventDestroy(pVM->vmm.s.hEvtRendezvousEnterOneByOne);
785 pVM->vmm.s.hEvtRendezvousEnterOneByOne = NIL_RTSEMEVENT;
786 RTSemEventMultiDestroy(pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce);
787 pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce = NIL_RTSEMEVENTMULTI;
788 RTSemEventMultiDestroy(pVM->vmm.s.hEvtMulRendezvousDone);
789 pVM->vmm.s.hEvtMulRendezvousDone = NIL_RTSEMEVENTMULTI;
790 RTSemEventDestroy(pVM->vmm.s.hEvtRendezvousDoneCaller);
791 pVM->vmm.s.hEvtRendezvousDoneCaller = NIL_RTSEMEVENT;
797 if (pVM->vmm.s.fStackGuardsStationed)
799 for (VMCPUID i = 0; i < pVM->cCpus; i++)
801 uint8_t *pbEMTStackR3 = pVM->aCpus[i].vmm.s.pbEMTStackR3;
802 MMR3HyperSetGuard(pVM, pbEMTStackR3 - PAGE_SIZE, PAGE_SIZE, false /*fSet*/);
803 MMR3HyperSetGuard(pVM, pbEMTStackR3 + VMM_STACK_SIZE, PAGE_SIZE, false /*fSet*/);
805 pVM->vmm.s.fStackGuardsStationed = false;
821 * @param pVM Pointer to the VM.
824 VMMR3_INT_DECL(void) VMMR3Relocate(PVM pVM, RTGCINTPTR offDelta)
832 pVM->vmm.s.pvCoreCodeRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pvCoreCodeR3);
838 for (VMCPUID i = 0; i < pVM->cCpus; i++)
840 PVMCPU pVCpu = &pVM->aCpus[i];
844 pVCpu->vmm.s.pbEMTStackRC = MMHyperR3ToRC(pVM, pVCpu->vmm.s.pbEMTStackR3);
851 vmmR3SwitcherRelocate(pVM, offDelta);
856 if (!HMIsEnabled(pVM))
858 int rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "CPUMGCResumeGuest", &pVM->vmm.s.pfnCPUMRCResumeGuest);
861 rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "CPUMGCResumeGuestV86", &pVM->vmm.s.pfnCPUMRCResumeGuestV86);
868 VMMR3UpdateLoggers(pVM);
876 * @param pVM Pointer to the VM.
878 VMMR3_INT_DECL(int) VMMR3UpdateLoggers(PVM pVM)
886 if ( pVM->vmm.s.pRCLoggerR3
888 || pVM->vmm.s.pRCRelLoggerR3
892 Assert(!HMIsEnabled(pVM));
893 rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "vmmGCLoggerFlush", &RCPtrLoggerFlush);
897 if (pVM->vmm.s.pRCLoggerR3)
899 Assert(!HMIsEnabled(pVM));
901 rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "vmmGCLoggerWrapper", &RCPtrLoggerWrapper);
904 pVM->vmm.s.pRCLoggerRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pRCLoggerR3);
905 rc = RTLogCloneRC(NULL /* default */, pVM->vmm.s.pRCLoggerR3, pVM->vmm.s.cbRCLogger,
911 if (pVM->vmm.s.pRCRelLoggerR3)
913 Assert(!HMIsEnabled(pVM));
915 rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "vmmGCRelLoggerWrapper", &RCPtrLoggerWrapper);
918 pVM->vmm.s.pRCRelLoggerRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pRCRelLoggerR3);
919 rc = RTLogCloneRC(RTLogRelDefaultInstance(), pVM->vmm.s.pRCRelLoggerR3, pVM->vmm.s.cbRCRelLogger,
931 for (VMCPUID i = 0; i < pVM->cCpus; i++)
933 PVMCPU pVCpu = &pVM->aCpus[i];
940 rc = PDMR3LdrGetSymbolR0(pVM, VMMR0_MAIN_MODULE_NAME, "vmmR0LoggerWrapper", &pfnLoggerWrapper);
944 rc = PDMR3LdrGetSymbolR0(pVM, VMMR0_MAIN_MODULE_NAME, "vmmR0LoggerFlush", &pfnLoggerFlush);
954 rc = PDMR3LdrGetSymbolR0(pVM, VMMR0_MAIN_MODULE_NAME, "vmmR0LoggerPrefix", &pfnLoggerPrefix);
981 * @param pVM Pointer to the VM.
983 VMMR3DECL(const char *) VMMR3GetRZAssertMsg1(PVM pVM)
985 if (HMIsEnabled(pVM))
986 return pVM->vmm.s.szRing0AssertMsg1;
989 int rc = PDMR3LdrGetSymbolRC(pVM, NULL, "g_szRTAssertMsg1", &RCPtr);
991 return (const char *)MMHyperRCToR3(pVM, RCPtr);
1009 VM_ASSERT_VALID_EXT_RETURN(pUVM->pVM, NULL);
1010 return &pUVM->pVM->aCpus[idCpu];
1018 * @param pVM Pointer to the VM.
1020 VMMR3DECL(const char *) VMMR3GetRZAssertMsg2(PVM pVM)
1022 if (HMIsEnabled(pVM))
1023 return pVM->vmm.s.szRing0AssertMsg2;
1026 int rc = PDMR3LdrGetSymbolRC(pVM, NULL, "g_szRTAssertMsg2", &RCPtr);
1028 return (const char *)MMHyperRCToR3(pVM, RCPtr);
1038 * @param pVM Pointer to the VM.
1041 static DECLCALLBACK(int) vmmR3Save(PVM pVM, PSSMHANDLE pSSM)
1049 for (VMCPUID i = 1; i < pVM->cCpus; i++)
1050 SSMR3PutBool(pSSM, VMCPUSTATE_IS_STARTED(VMCPU_GET_STATE(&pVM->aCpus[i])));
1060 * @param pVM Pointer to the VM.
1065 static DECLCALLBACK(int) vmmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
1104 VMCPU_SET_STATE(&pVM->aCpus[0], VMCPUSTATE_STARTED);
1105 for (VMCPUID i = 1; i < pVM->cCpus; i++)
1111 VMCPU_SET_STATE(&pVM->aCpus[i], fStarted ? VMCPUSTATE_STARTED : VMCPUSTATE_STOPPED);
1135 * @param pVM Pointer to the VM.
1141 VMMR3_INT_DECL(int) VMMR3GetImportRC(PVM pVM, const char *pszSymbol, PRTRCPTR pRCPtrValue)
1145 if (pVM->vmm.s.pRCLoggerR3)
1146 pVM->vmm.s.pRCLoggerRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pRCLoggerR3);
1147 *pRCPtrValue = pVM->vmm.s.pRCLoggerRC;
1152 if (pVM->vmm.s.pRCRelLoggerR3)
1153 pVM->vmm.s.pRCRelLoggerRC = MMHyperR3ToRC(pVM, pVM->vmm.s.pRCRelLoggerR3);
1154 *pRCPtrValue = pVM->vmm.s.pRCRelLoggerRC;
1169 * @param pVM Pointer to the VM.
1171 VMMR3_INT_DECL(void) VMMR3YieldSuspend(PVM pVM)
1173 VMCPU_ASSERT_EMT(&pVM->aCpus[0]);
1174 if (!pVM->vmm.s.cYieldResumeMillies)
1176 uint64_t u64Now = TMTimerGet(pVM->vmm.s.pYieldTimer);
1177 uint64_t u64Expire = TMTimerGetExpire(pVM->vmm.s.pYieldTimer);
1179 pVM->vmm.s.cYieldResumeMillies = pVM->vmm.s.cYieldEveryMillies;
1181 pVM->vmm.s.cYieldResumeMillies = TMTimerToMilli(pVM->vmm.s.pYieldTimer, u64Expire - u64Now);
1182 TMTimerStop(pVM->vmm.s.pYieldTimer);
1184 pVM->vmm.s.u64LastYield = RTTimeNanoTS();
1191 * @param pVM Pointer to the VM.
1193 VMMR3_INT_DECL(void) VMMR3YieldStop(PVM pVM)
1195 if (!pVM->vmm.s.cYieldResumeMillies)
1196 TMTimerStop(pVM->vmm.s.pYieldTimer);
1197 pVM->vmm.s.cYieldResumeMillies = pVM->vmm.s.cYieldEveryMillies;
1198 pVM->vmm.s.u64LastYield = RTTimeNanoTS();
1205 * @param pVM Pointer to the VM.
1207 VMMR3_INT_DECL(void) VMMR3YieldResume(PVM pVM)
1209 if (pVM->vmm.s.cYieldResumeMillies)
1211 TMTimerSetMillies(pVM->vmm.s.pYieldTimer, pVM->vmm.s.cYieldResumeMillies);
1212 pVM->vmm.s.cYieldResumeMillies = 0;
1220 * @param pVM The VM.
1224 static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, PTMTIMER pTimer, void *pvUser)
1239 const uint64_t u64Lag = TMVirtualSyncGetLag(pVM);
1242 && RTTimeNanoTS() - pVM->vmm.s.u64LastYield < 500000000 /* 500 ms */)
1246 pVM->vmm.s.u64LastYield = u64Elapsed;
1255 TMTimerSetMillies(pTimer, pVM->vmm.s.cYieldEveryMillies);
1263 * @param pVM Pointer to the VM.
1266 VMMR3_INT_DECL(int) VMMR3RawRunGC(PVM pVM, PVMCPU pVCpu)
1270 AssertReturn(pVM->cCpus == 1, VERR_RAW_MODE_INVALID_SMP);
1278 ? pVM->vmm.s.pfnCPUMRCResumeGuestV86
1279 : pVM->vmm.s.pfnCPUMRCResumeGuest, /* eip */
1282 VM_RC_ADDR(pVM, &pVCpu->cpum) /* edx */);
1292 PGMMapCheck(pVM);
1294 SELMR3CheckShadowTR(pVM);
1303 rc = SUPR3CallVMMR0Fast(pVM->pVMR0, VMMR0_DO_RAW_RUN, 0);
1313 PRTLOGGERRC pLogger = pVM->vmm.s.pRCLoggerR3;
1319 PRTLOGGERRC pRelLogger = pVM->vmm.s.pRCRelLoggerR3;
1328 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
1340 * @param pVM Pointer to the VM.
1343 VMMR3_INT_DECL(int) VMMR3HmRunGC(PVM pVM, PVMCPU pVCpu)
1355 rc = SUPR3CallVMMR0Fast(pVM->pVMR0, VMMR0_DO_HM_RUN, pVCpu->idCpu);
1379 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
1389 * @param pVM Pointer to the VM.
1393 DECLCALLBACK(int) vmmR3SendSipi(PVM pVM, VMCPUID idCpu, uint32_t uVector)
1395 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);
1424 DECLCALLBACK(int) vmmR3SendInitIpi(PVM pVM, VMCPUID idCpu)
1426 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);
1431 PGMR3ResetCpu(pVM, pVCpu);
1432 CPUMR3ResetCpu(pVM, pVCpu);
1441 * @param pVM Pointer to the VM.
1445 VMMR3_INT_DECL(void) VMMR3SendSipi(PVM pVM, VMCPUID idCpu, uint32_t uVector)
1447 AssertReturnVoid(idCpu < pVM->cCpus);
1449 int rc = VMR3ReqCallNoWait(pVM, idCpu, (PFNRT)vmmR3SendSipi, 3, pVM, idCpu, uVector);
1456 * @param pVM Pointer to the VM.
1459 VMMR3_INT_DECL(void) VMMR3SendInitIpi(PVM pVM, VMCPUID idCpu)
1461 AssertReturnVoid(idCpu < pVM->cCpus);
1463 int rc = VMR3ReqCallNoWait(pVM, idCpu, (PFNRT)vmmR3SendInitIpi, 2, pVM, idCpu);
1471 * @param pVM Pointer to the VM.
1475 VMMR3DECL(int) VMMR3RegisterPatchMemory(PVM pVM, RTGCPTR pPatchMem, unsigned cbPatchMem)
1477 VM_ASSERT_EMT(pVM);
1478 if (HMIsEnabled(pVM))
1479 return HMR3EnablePatching(pVM, pPatchMem, cbPatchMem);
1488 * @param pVM Pointer to the VM.
1492 VMMR3DECL(int) VMMR3DeregisterPatchMemory(PVM pVM, RTGCPTR pPatchMem, unsigned cbPatchMem)
1494 if (HMIsEnabled(pVM))
1495 return HMR3DisablePatching(pVM, pPatchMem, cbPatchMem);
1507 * @param pVM Pointer to the VM.
1509 DECL_FORCE_INLINE(int) vmmR3EmtRendezvousNonCallerReturn(PVM pVM)
1511 int rcRet = ASMAtomicReadS32(&pVM->vmm.s.i32RendezvousStatus);
1512 uint32_t cReturned = ASMAtomicIncU32(&pVM->vmm.s.cRendezvousEmtsReturned);
1513 if (cReturned == pVM->cCpus - 1U)
1515 int rc = RTSemEventSignal(pVM->vmm.s.hEvtRendezvousDoneCaller);
1534 * @param pVM Pointer to the VM.
1542 static int vmmR3EmtRendezvousCommon(PVM pVM, PVMCPU pVCpu, bool fIsCaller,
1550 uint32_t cEntered = ASMAtomicIncU32(&pVM->vmm.s.cRendezvousEmtsEntered);
1551 if (cEntered != pVM->cCpus)
1556 rc = RTSemEventWait(pVM->vmm.s.hEvtRendezvousEnterOneByOne, RT_INDEFINITE_WAIT);
1562 rc = RTSemEventMultiWait(pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce, RT_INDEFINITE_WAIT);
1569 rc = RTSemEventWait(pVM->vmm.s.pahEvtRendezvousEnterOrdered[pVCpu->idCpu], RT_INDEFINITE_WAIT);
1586 rc = RTSemEventMultiWait(pVM->vmm.s.hEvtMulRendezvousDone, RT_INDEFINITE_WAIT);
1589 return vmmR3EmtRendezvousNonCallerReturn(pVM);
1600 VM_FF_CLEAR(pVM, VM_FF_EMT_RENDEZVOUS);
1605 rc = RTSemEventMultiSignal(pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce);
1615 : pVM->cCpus - 1U;
1618 rc = RTSemEventSignal(pVM->vmm.s.pahEvtRendezvousEnterOrdered[iFirst]);
1620 rc = RTSemEventWait(pVM->vmm.s.pahEvtRendezvousEnterOrdered[pVCpu->idCpu], RT_INDEFINITE_WAIT);
1632 || RT_SUCCESS(ASMAtomicUoReadS32(&pVM->vmm.s.i32RendezvousStatus)) )
1634 VBOXSTRICTRC rcStrict = pfnRendezvous(pVM, pVCpu, pvUser);
1643 i32RendezvousStatus = ASMAtomicUoReadS32(&pVM->vmm.s.i32RendezvousStatus);
1649 } while (!ASMAtomicCmpXchgS32(&pVM->vmm.s.i32RendezvousStatus, VBOXSTRICTRC_VAL(rcStrict), i32RendezvousStatus));
1657 uint32_t cDone = ASMAtomicIncU32(&pVM->vmm.s.cRendezvousEmtsDone);
1658 if ( cDone != pVM->cCpus
1664 rc = RTSemEventSignal(pVM->vmm.s.hEvtRendezvousEnterOneByOne);
1670 rc = RTSemEventSignal(pVM->vmm.s.pahEvtRendezvousEnterOrdered[pVCpu->idCpu + 1U]);
1675 Assert(pVM->cCpus - cDone == pVCpu->idCpu);
1676 rc = RTSemEventSignal(pVM->vmm.s.pahEvtRendezvousEnterOrdered[pVM->cCpus - cDone - 1U]);
1683 rc = RTSemEventMultiWait(pVM->vmm.s.hEvtMulRendezvousDone, RT_INDEFINITE_WAIT);
1690 rc = RTSemEventMultiSignal(pVM->vmm.s.hEvtMulRendezvousDone);
1695 return vmmR3EmtRendezvousNonCallerReturn(pVM);
1706 * @param pVM Pointer to the VM.
1711 VMMR3_INT_DECL(int) VMMR3EmtRendezvousFF(PVM pVM, PVMCPU pVCpu)
1715 int rc = vmmR3EmtRendezvousCommon(pVM, pVCpu, false /* fIsCaller */, pVM->vmm.s.fRendezvousFlags,
1716 pVM->vmm.s.pfnRendezvous, pVM->vmm.s.pvRendezvousUser);
1731 * @param pVM Pointer to the VM.
1739 VMMR3DECL(int) VMMR3EmtRendezvous(PVM pVM, uint32_t fFlags, PFNVMMEMTRENDEZVOUS pfnRendezvous, void *pvUser)
1744 AssertReturn(pVM, VERR_INVALID_VM_HANDLE);
1754 PVMCPU pVCpu = VMMGetCpu(pVM);
1759 rcStrict = VMR3ReqCallWait(pVM, VMCPUID_ANY,
1760 (PFNRT)VMMR3EmtRendezvous, 4, pVM, fFlags, pfnRendezvous, pvUser);
1761 else if (pVM->cCpus == 1)
1768 rcStrict = pfnRendezvous(pVM, pVCpu, pvUser);
1779 if (RT_UNLIKELY(!ASMAtomicCmpXchgU32(&pVM->vmm.s.u32RendezvousLock, 0x77778888, 0)))
1783 while (!ASMAtomicCmpXchgU32(&pVM->vmm.s.u32RendezvousLock, 0x77778888, 0))
1785 if (VM_FF_IS_PENDING(pVM, VM_FF_EMT_RENDEZVOUS))
1787 rc = VMMR3EmtRendezvousFF(pVM, pVCpu);
1797 Assert(!VM_FF_IS_PENDING(pVM, VM_FF_EMT_RENDEZVOUS));
1804 for (VMCPUID i = 0; i < pVM->cCpus; i++)
1806 rc = RTSemEventWait(pVM->vmm.s.pahEvtRendezvousEnterOrdered[i], 0);
1809 rc = RTSemEventWait(pVM->vmm.s.hEvtRendezvousEnterOneByOne, 0); AssertLogRelMsg(rc == VERR_TIMEOUT || rc == VINF_SUCCESS, ("%Rrc\n", rc));
1810 rc = RTSemEventMultiReset(pVM->vmm.s.hEvtMulRendezvousEnterAllAtOnce); AssertLogRelRC(rc);
1811 rc = RTSemEventMultiReset(pVM->vmm.s.hEvtMulRendezvousDone); AssertLogRelRC(rc);
1812 rc = RTSemEventWait(pVM->vmm.s.hEvtRendezvousDoneCaller, 0); AssertLogRelMsg(rc == VERR_TIMEOUT || rc == VINF_SUCCESS, ("%Rrc\n", rc));
1813 ASMAtomicWriteU32(&pVM->vmm.s.cRendezvousEmtsEntered, 0);
1814 ASMAtomicWriteU32(&pVM->vmm.s.cRendezvousEmtsDone, 0);
1815 ASMAtomicWriteU32(&pVM->vmm.s.cRendezvousEmtsReturned, 0);
1816 ASMAtomicWriteS32(&pVM->vmm.s.i32RendezvousStatus, VINF_SUCCESS);
1817 ASMAtomicWritePtr((void * volatile *)&pVM->vmm.s.pfnRendezvous, (void *)(uintptr_t)pfnRendezvous);
1818 ASMAtomicWritePtr(&pVM->vmm.s.pvRendezvousUser, pvUser);
1819 ASMAtomicWriteU32(&pVM->vmm.s.fRendezvousFlags, fFlags);
1824 VM_FF_SET(pVM, VM_FF_EMT_RENDEZVOUS);
1825 VMR3NotifyGlobalFFU(pVM->pUVM, VMNOTIFYFF_FLAGS_POKE);
1830 vmmR3EmtRendezvousCommon(pVM, pVCpu, true /* fIsCaller */, fFlags, pfnRendezvous, pvUser);
1837 rc = RTSemEventWait(pVM->vmm.s.hEvtRendezvousDoneCaller, RT_INDEFINITE_WAIT);
1843 int rcMy = pVM->vmm.s.i32RendezvousStatus;
1844 ASMAtomicWriteNullPtr((void * volatile *)&pVM->vmm.s.pfnRendezvous);
1846 ASMAtomicWriteU32(&pVM->vmm.s.u32RendezvousLock, 0);
1891 * @param pVM Pointer to the VM.
1897 VMMR3_INT_DECL(int) VMMR3ReadR0Stack(PVM pVM, VMCPUID idCpu, RTHCUINTPTR R0Addr, void *pvBuf, size_t cbRead)
1899 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);
1903 RTHCUINTPTR off = R0Addr - MMHyperCCToR0(pVM, pVCpu->vmm.s.pbEMTStackR3);
1920 * @param pVM Pointer to the VM.
1925 VMMR3DECL(int) VMMR3CallRC(PVM pVM, RTRCPTR RCPtrEntry, unsigned cArgs, ...)
1929 int rc = VMMR3CallRCV(pVM, RCPtrEntry, cArgs, args);
1938 * @param pVM Pointer to the VM.
1943 VMMR3DECL(int) VMMR3CallRCV(PVM pVM, RTRCPTR RCPtrEntry, unsigned cArgs, va_list args)
1946 AssertReturn(pVM->cCpus == 1, VERR_RAW_MODE_INVALID_SMP);
1947 PVMCPU pVCpu = &pVM->aCpus[0];
1955 pVM->vmm.s.pfnCallTrampolineRC, /* eip */
1984 rc = SUPR3CallVMMR0Fast(pVM->pVMR0, VMMR0_DO_RAW_RUN, 0);
1994 PRTLOGGERRC pLogger = pVM->vmm.s.pRCLoggerR3;
2000 PRTLOGGERRC pRelLogger = pVM->vmm.s.pRCRelLoggerR3;
2005 VMMR3FatalDump(pVM, pVCpu, rc);
2011 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
2023 * @param pVM Pointer to the VM.
2029 VMMR3DECL(int) VMMR3CallR0(PVM pVM, uint32_t uOperation, uint64_t u64Arg, PSUPVMMR0REQHDR pReqHdr)
2031 PVMCPU pVCpu = VMMGetCpu(pVM);
2043 rc = SUPR3CallVMMR0Ex(pVM->pVMR0, pVCpu->idCpu, uOperation, u64Arg, pReqHdr);
2055 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
2074 * @param pVM Pointer to the VM.
2077 VMMR3DECL(int) VMMR3ResumeHyper(PVM pVM, PVMCPU pVCpu)
2080 AssertReturn(pVM->cCpus == 1, VERR_RAW_MODE_INVALID_SMP);
2094 rc = SUPR3CallVMMR0Fast(pVM->pVMR0, VMMR0_DO_RAW_RUN, 0);
2104 PRTLOGGERRC pLogger = pVM->vmm.s.pRCLoggerR3;
2110 PRTLOGGERRC pRelLogger = pVM->vmm.s.pRCRelLoggerR3;
2115 VMMR3FatalDump(pVM, pVCpu, rc);
2121 rc = vmmR3ServiceCallRing3Request(pVM, pVCpu);
2133 * @param pVM Pointer to the VM.
2137 static int vmmR3ServiceCallRing3Request(PVM pVM, PVMCPU pVCpu)
2183 pVCpu->vmm.s.rcCallRing3 = PDMR3LockCall(pVM);
2192 pVCpu->vmm.s.rcCallRing3 = PGMR3PoolGrow(pVM);
2201 pVCpu->vmm.s.rcCallRing3 = PGMR3PhysChunkMap(pVM, pVCpu->vmm.s.u64CallRing3Arg);
2210 pVCpu->vmm.s.rcCallRing3 = PGMR3PhysAllocateHandyPages(pVM);
2219 pVCpu->vmm.s.rcCallRing3 = PGMR3PhysAllocateLargeHandyPage(pVM, pVCpu->vmm.s.u64CallRing3Arg);
2228 pVCpu->vmm.s.rcCallRing3 = PGMR3LockCall(pVM);
2237 pVCpu->vmm.s.rcCallRing3 = MMR3LockCall(pVM);
2247 REMR3ReplayHandlerNotifications(pVM);
2266 VMR3SetErrorWorker(pVM);
2274 pVCpu->vmm.s.rcCallRing3 = VMR3SetRuntimeErrorWorker(pVM);
2292 LogRel(("%s", pVM->vmm.s.szRing0AssertMsg1));
2293 LogRel(("%s", pVM->vmm.s.szRing0AssertMsg2));
2304 pVCpu->vmm.s.rcCallRing3 = FTMR3SetCheckpoint(pVM, (FTMCHECKPOINTTYPE)pVCpu->vmm.s.u64CallRing3Arg);
2320 * @param pVM Pointer to the VM.
2324 static DECLCALLBACK(void) vmmR3InfoFF(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs)
2358 const uint32_t fGlobalForcedActions = pVM->fGlobalForcedActions;
2399 for (VMCPUID i = 0; i < pVM->cCpus; i++)
2401 const uint32_t fLocalForcedActions = pVM->aCpus[i].fLocalForcedActions;
2438 pHlp->pfnPrintf(pHlp, " intr inhibit RIP: %RGp\n", EMGetInhibitInterruptsPC(&pVM->aCpus[i]));