Lines Matching refs:pUVM

104 static int                  vmR3CreateU(PUVM pUVM, uint32_t cCpus, PFNCFGMCONSTRUCTOR pfnCFGMConstructor, void *pvUserCFGM);
105 static int vmR3ReadBaseConfig(PVM pVM, PUVM pUVM, uint32_t cCpus);
106 static int vmR3InitRing3(PVM pVM, PUVM pUVM);
115 static void vmR3DestroyUVM(PUVM pUVM, uint32_t cMilliesEMTWait);
118 static void vmR3DoAtState(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld);
120 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld);
122 static int vmR3SetErrorU(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...);
232 PUVM pUVM = NULL; /* shuts up gcc */
233 int rc = vmR3CreateUVM(cCpus, pVmm2UserMethods, &pUVM);
237 rc = VMR3AtErrorRegister(pUVM, pfnVMAtError, pvUserVM);
243 rc = SUPR3Init(&pUVM->vm.s.pSession);
255 rc = VMR3ReqCallU(pUVM, VMCPUID_ANY, &pReq, RT_INDEFINITE_WAIT, VMREQFLAGS_VBOX_STATUS,
256 (PFNRT)vmR3CreateU, 4, pUVM, cCpus, pfnCFGMConstructor, pvUserCFGM);
267 *ppVM = pUVM->pVM;
270 VMR3RetainUVM(pUVM);
271 *ppUVM = pUVM;
273 LogFlow(("VMR3Create: returns VINF_SUCCESS (pVM=%p, pUVM=%p\n", pUVM->pVM, pUVM));
359 if (VMR3GetErrorCount(pUVM) == 0)
366 vmR3SetErrorU(pUVM, rc, RT_SRC_POS, pszError, rc);
443 vmR3SetErrorU(pUVM, rc, RT_SRC_POS, pszError, rc);
448 vmR3DestroyUVM(pUVM, 2000);
473 PUVM pUVM = (PUVM)RTMemPageAllocZ(RT_OFFSETOF(UVM, aCpus[cCpus]));
474 AssertReturn(pUVM, VERR_NO_MEMORY);
475 pUVM->u32Magic = UVM_MAGIC;
476 pUVM->cCpus = cCpus;
477 pUVM->pVmm2UserMethods = pVmm2UserMethods;
479 AssertCompile(sizeof(pUVM->vm.s) <= sizeof(pUVM->vm.padding));
481 pUVM->vm.s.cUvmRefs = 1;
482 pUVM->vm.s.ppAtStateNext = &pUVM->vm.s.pAtState;
483 pUVM->vm.s.ppAtErrorNext = &pUVM->vm.s.pAtError;
484 pUVM->vm.s.ppAtRuntimeErrorNext = &pUVM->vm.s.pAtRuntimeError;
486 pUVM->vm.s.enmHaltMethod = VMHALTMETHOD_BOOTSTRAP;
487 RTUuidClear(&pUVM->vm.s.Uuid);
492 pUVM->aCpus[i].pUVM = pUVM;
493 pUVM->aCpus[i].idCpu = i;
497 int rc = RTTlsAllocEx(&pUVM->vm.s.idxTLS, NULL);
503 pUVM->aCpus[i].vm.s.EventSemWait = NIL_RTSEMEVENT;
506 rc = RTSemEventCreate(&pUVM->aCpus[i].vm.s.EventSemWait);
512 rc = RTCritSectInit(&pUVM->vm.s.AtStateCritSect);
515 rc = RTCritSectInit(&pUVM->vm.s.AtErrorCritSect);
521 rc = PDMR3InitUVM(pUVM);
524 rc = STAMR3InitUVM(pUVM);
527 rc = MMR3InitUVM(pUVM);
535 rc = RTThreadCreateF(&pUVM->aCpus[i].vm.s.ThreadEMT, vmR3EmulationThread, &pUVM->aCpus[i],
541 pUVM->aCpus[i].vm.s.NativeThreadEMT = RTThreadGetNative(pUVM->aCpus[i].vm.s.ThreadEMT);
546 *ppUVM = pUVM;
555 MMR3TermUVM(pUVM);
557 STAMR3TermUVM(pUVM);
559 PDMR3TermUVM(pUVM);
561 RTCritSectDelete(&pUVM->vm.s.AtErrorCritSect);
563 RTCritSectDelete(&pUVM->vm.s.AtStateCritSect);
568 RTSemEventDestroy(pUVM->aCpus[i].vm.s.EventSemWait);
569 pUVM->aCpus[i].vm.s.EventSemWait = NIL_RTSEMEVENT;
571 RTTlsFree(pUVM->vm.s.idxTLS);
573 RTMemPageFree(pUVM, RT_OFFSETOF(UVM, aCpus[pUVM->cCpus]));
583 static int vmR3CreateU(PUVM pUVM, uint32_t cCpus, PFNCFGMCONSTRUCTOR pfnCFGMConstructor, void *pvUserCFGM)
588 int rc = PDMR3LdrLoadVMMR0U(pUVM);
595 return vmR3SetErrorU(pUVM, rc, RT_SRC_POS, N_("Failed to load VMMR0.r0"));
604 CreateVMReq.pSession = pUVM->vm.s.pSession;
611 PVM pVM = pUVM->pVM = CreateVMReq.pVMR3;
614 AssertRelease(pVM->pSession == pUVM->vm.s.pSession);
622 Log(("VMR3Create: Created pUVM=%p pVM=%p pVMR0=%p hSelf=%#x cCpus=%RU32\n",
623 pUVM, pVM, pVM->pVMR0, pVM->hSelf, pVM->cCpus));
628 pVM->pUVM = pUVM;
632 pVM->aCpus[i].pUVCpu = &pUVM->aCpus[i];
634 pVM->aCpus[i].hNativeThread = pUVM->aCpus[i].vm.s.NativeThreadEMT;
637 pUVM->aCpus[i].pVCpu = &pVM->aCpus[i];
638 pUVM->aCpus[i].pVM = pVM;
648 rc = vmR3ReadBaseConfig(pVM, pUVM, cCpus);
655 rc = vmR3InitRing3(pVM, pUVM);
679 rc = DBGCTcpCreate(pUVM, &pvUser);
683 pUVM->vm.s.pvDBGC = pvUser;
696 rc = vmR3SetHaltMethodU(pUVM, VMHALTMETHOD_DEFAULT);
705 RTLogSetCustomPrefixCallback(NULL, vmR3LogPrefixCallback, pUVM);
711 DBGCTcpTerminate(pUVM, pUVM->vm.s.pvDBGC);
712 pUVM->vm.s.pvDBGC = NULL;
738 pUVM->pVM = NULL;
739 for (VMCPUID i = 0; i < pUVM->cCpus; i++)
741 pUVM->aCpus[i].pVM = NULL;
742 pUVM->aCpus[i].pVCpu = NULL;
744 Assert(pUVM->vm.s.enmHaltMethod == VMHALTMETHOD_BOOTSTRAP);
746 if (pUVM->cCpus > 1)
751 for (VMCPUID i = 1; i < pUVM->cCpus; i++)
752 VMR3NotifyCpuFFU(&pUVM->aCpus[i], 0);
753 RTThreadSleep(RT_MIN(100 + 25 *(pUVM->cCpus - 1), 500)); /* very sophisticated */
760 vmR3SetErrorU(pUVM, rc, RT_SRC_POS, N_("VM creation failed (GVMM)"));
772 * @param pUVM The user mode VM structure.
775 static int vmR3ReadBaseConfig(PVM pVM, PUVM pUVM, uint32_t cCpus)
838 rc = CFGMR3QueryStringAllocDef(pRoot, "Name", &pUVM->vm.s.pszName, "<unknown>");
841 rc = CFGMR3QueryBytes(pRoot, "UUID", &pUVM->vm.s.Uuid, sizeof(pUVM->vm.s.Uuid));
873 static int vmR3InitRing3(PVM pVM, PUVM pUVM)
907 rc = STAMR3RegisterF(pVM, &pUVM->aCpus[idCpu].vm.s.StatHaltYield, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NS_PER_CALL, "Profiling halted state yielding.", "/PROF/CPU%d/VM/Halt/Yield", idCpu);
909 rc = STAMR3RegisterF(pVM, &pUVM->aCpus[idCpu].vm.s.StatHaltBlock, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NS_PER_CALL, "Profiling halted state blocking.", "/PROF/CPU%d/VM/Halt/Block", idCpu);
911 rc = STAMR3RegisterF(pVM, &pUVM->aCpus[idCpu].vm.s.StatHaltBlockOverslept, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NS_PER_CALL, "Time wasted by blocking too long.", "/PROF/CPU%d/VM/Halt/BlockOverslept", idCpu);
913 rc = STAMR3RegisterF(pVM, &pUVM->aCpus[idCpu].vm.s.StatHaltBlockInsomnia, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NS_PER_CALL, "Time slept when returning to early.","/PROF/CPU%d/VM/Halt/BlockInsomnia", idCpu);
915 rc = STAMR3RegisterF(pVM, &pUVM->aCpus[idCpu].vm.s.StatHaltBlockOnTime, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NS_PER_CALL, "Time slept on time.", "/PROF/CPU%d/VM/Halt/BlockOnTime", idCpu);
917 rc = STAMR3RegisterF(pVM, &pUVM->aCpus[idCpu].vm.s.StatHaltTimers, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NS_PER_CALL, "Profiling halted state timer tasks.", "/PROF/CPU%d/VM/Halt/Timers", idCpu);
921 STAM_REG(pVM, &pUVM->vm.s.StatReqAllocNew, STAMTYPE_COUNTER, "/VM/Req/AllocNew", STAMUNIT_OCCURENCES, "Number of VMR3ReqAlloc returning a new packet.");
922 STAM_REG(pVM, &pUVM->vm.s.StatReqAllocRaces, STAMTYPE_COUNTER, "/VM/Req/AllocRaces", STAMUNIT_OCCURENCES, "Number of VMR3ReqAlloc causing races.");
923 STAM_REG(pVM, &pUVM->vm.s.StatReqAllocRecycled, STAMTYPE_COUNTER, "/VM/Req/AllocRecycled", STAMUNIT_OCCURENCES, "Number of VMR3ReqAlloc returning a recycled packet.");
924 STAM_REG(pVM, &pUVM->vm.s.StatReqFree, STAMTYPE_COUNTER, "/VM/Req/Free", STAMUNIT_OCCURENCES, "Number of VMR3ReqFree calls.");
925 STAM_REG(pVM, &pUVM->vm.s.StatReqFreeOverflow, STAMTYPE_COUNTER, "/VM/Req/FreeOverflow", STAMUNIT_OCCURENCES, "Number of times the request was actually freed.");
926 STAM_REG(pVM, &pUVM->vm.s.StatReqProcessed, STAMTYPE_COUNTER, "/VM/Req/Processed", STAMUNIT_OCCURENCES, "Number of processed requests (any queue).");
927 STAM_REG(pVM, &pUVM->vm.s.StatReqMoreThan1, STAMTYPE_COUNTER, "/VM/Req/MoreThan1", STAMUNIT_OCCURENCES, "Number of times there are more than one request on the queue when processing it.");
928 STAM_REG(pVM, &pUVM->vm.s.StatReqPushBackRaces, STAMTYPE_COUNTER, "/VM/Req/PushBackRaces", STAMUNIT_OCCURENCES, "Number of push back races.");
1203 PUVM pUVM = (PUVM)pvUser;
1204 PUVMCPU pUVCpu = (PUVMCPU)RTTlsGet(pUVM->vm.s.idxTLS);
1243 PDMR3LdrRelocateU(pVM->pUVM, offDelta);
1319 * @param pUVM The VM to power on.
1325 VMMR3DECL(int) VMR3PowerOn(PUVM pUVM)
1327 LogFlow(("VMR3PowerOn: pUVM=%p\n", pUVM));
1328 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
1329 PVM pVM = pUVM->pVM;
1382 pVM->pUVM->vm.s.enmSuspendReason = enmReason;
1416 * @param pUVM The VM to suspend.
1423 VMMR3DECL(int) VMR3Suspend(PUVM pUVM, VMSUSPENDREASON enmReason)
1425 LogFlow(("VMR3Suspend: pUVM=%p\n", pUVM));
1426 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
1433 int rc = VMMR3EmtRendezvous(pUVM->pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_DESCENDING | VMMEMTRENDEZVOUS_FLAGS_STOP_ON_ERROR,
1445 * @param pUVM The user mode VM handle.
1447 VMMR3DECL(VMSUSPENDREASON) VMR3GetSuspendReason(PUVM pUVM)
1449 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VMSUSPENDREASON_INVALID);
1450 return pUVM->vm.s.enmSuspendReason;
1478 pVM->pUVM->vm.s.enmResumeReason = enmReason;
1521 VMMR3DECL(int) VMR3Resume(PUVM pUVM, VMRESUMEREASON enmReason)
1523 LogFlow(("VMR3Resume: pUVM=%p\n", pUVM));
1524 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
1525 PVM pVM = pUVM->pVM;
1545 * @param pUVM The user mode VM handle.
1547 VMMR3DECL(VMRESUMEREASON) VMR3GetResumeReason(PUVM pUVM)
1549 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VMRESUMEREASON_INVALID);
1550 return pUVM->vm.s.enmResumeReason;
1576 PUVM pUVM = pVM->pUVM;
1579 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
1584 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RUNNING_LS);
1598 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_OFF_LS);
1603 vmR3SetStateLocked(pVM, pUVM, VMSTATE_FATAL_ERROR, VMSTATE_FATAL_ERROR_LS);
1608 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_GURU_MEDITATION_LS);
1620 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
1916 * @param pUVM The VM which state should be saved.
1931 VMMR3DECL(int) VMR3Save(PUVM pUVM, const char *pszFilename, bool fContinueAfterwards, PFNVMPROGRESS pfnProgress, void *pvUser, bool *pfSuspended)
1933 LogFlow(("VMR3Save: pUVM=%p pszFilename=%p:{%s} fContinueAfterwards=%RTbool pfnProgress=%p pvUser=%p pfSuspended=%p\n",
1934 pUVM, pszFilename, pszFilename, fContinueAfterwards, pfnProgress, pvUser, pfSuspended));
1941 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
1942 PVM pVM = pUVM->pVM;
1978 VMMR3_INT_DECL(int) VMR3SaveFT(PUVM pUVM, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser, bool *pfSuspended, bool fSkipStateChanges)
1980 LogFlow(("VMR3SaveFT: pUVM=%p pStreamOps=%p pvSteamOpsUser=%p pfSuspended=%p\n",
1981 pUVM, pStreamOps, pvStreamOpsUser, pfSuspended));
1988 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
1989 PVM pVM = pUVM->pVM;
2010 * @param pUVM The VM which state should be saved.
2023 VMMR3DECL(int) VMR3Teleport(PUVM pUVM, uint32_t cMsMaxDowntime, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser,
2026 LogFlow(("VMR3Teleport: pUVM=%p cMsMaxDowntime=%u pStreamOps=%p pvStreamOps=%p pfnProgress=%p pvProgressUser=%p\n",
2027 pUVM, cMsMaxDowntime, pStreamOps, pvStreamOpsUser, pfnProgress, pvProgressUser));
2034 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2035 PVM pVM = pUVM->pVM;
2059 * @param pUVM Pointer to the VM.
2070 static DECLCALLBACK(int) vmR3Load(PUVM pUVM, const char *pszFilename, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser,
2076 LogFlow(("vmR3Load: pUVM=%p pszFilename=%p:{%s} pStreamOps=%p pvStreamOpsUser=%p pfnProgress=%p pvProgressUser=%p fTeleporting=%RTbool\n",
2077 pUVM, pszFilename, pszFilename, pStreamOps, pvStreamOpsUser, pfnProgress, pvProgressUser, fTeleporting));
2082 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2083 PVM pVM = pUVM->pVM;
2105 uint32_t cErrorsPriorToSave = VMR3GetErrorCount(pUVM);
2119 if (cErrorsPriorToSave == VMR3GetErrorCount(pUVM))
2148 VMMR3DECL(int) VMR3LoadFromFile(PUVM pUVM, const char *pszFilename, PFNVMPROGRESS pfnProgress, void *pvUser)
2150 LogFlow(("VMR3LoadFromFile: pUVM=%p pszFilename=%p:{%s} pfnProgress=%p pvUser=%p\n",
2151 pUVM, pszFilename, pszFilename, pfnProgress, pvUser));
2156 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2163 int rc = VMR3ReqCallWaitU(pUVM, 0 /*idDstCpu*/, (PFNRT)vmR3Load, 8,
2164 pUVM, pszFilename, (uintptr_t)NULL /*pStreamOps*/, (uintptr_t)NULL /*pvStreamOpsUser*/, pfnProgress, pvUser,
2176 * @param pUVM Pointer to the VM.
2186 VMMR3DECL(int) VMR3LoadFromStream(PUVM pUVM, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser,
2189 LogFlow(("VMR3LoadFromStream: pUVM=%p pStreamOps=%p pvStreamOpsUser=%p pfnProgress=%p pvProgressUser=%p\n",
2190 pUVM, pStreamOps, pvStreamOpsUser, pfnProgress, pvProgressUser));
2195 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2202 int rc = VMR3ReqCallWaitU(pUVM, 0 /*idDstCpu*/, (PFNRT)vmR3Load, 8,
2203 pUVM, (uintptr_t)NULL /*pszFilename*/, pStreamOps, pvStreamOpsUser, pfnProgress, pvProgressUser,
2215 * @param pUVM The VM handle.
2225 VMMR3_INT_DECL(int) VMR3LoadFromStreamFT(PUVM pUVM, PCSSMSTRMOPS pStreamOps, void *pvStreamOpsUser)
2227 LogFlow(("VMR3LoadFromStreamFT: pUVM=%p pStreamOps=%p pvStreamOpsUser=%p\n", pUVM, pStreamOps, pvStreamOpsUser));
2232 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2239 int rc = VMR3ReqCallWaitU(pUVM, 0 /*idDstCpu*/, (PFNRT)vmR3Load, 8,
2240 pUVM, (uintptr_t)NULL /*pszFilename*/, pStreamOps, pvStreamOpsUser, NULL, NULL,
2281 SSMR3Cancel(pVM->pUVM);
2309 DBGFR3Info(pVM->pUVM, "cpumguest", "verbose", DBGFR3InfoLogRelHlp());
2311 DBGFR3Info(pVM->pUVM, "mode", NULL, DBGFR3InfoLogRelHlp());
2313 DBGFR3Info(pVM->pUVM, "activetimers", NULL, DBGFR3InfoLogRelHlp());
2315 DBGFR3Info(pVM->pUVM, "gdt", NULL, DBGFR3InfoLogRelHlp());
2367 PUVM pUVM = pVM->pUVM;
2368 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
2371 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF_LS, VMSTATE_POWERING_OFF_LS);
2373 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_POWERING_OFF);
2374 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
2386 * @param pUVM The handle of the VM to be powered off.
2392 VMMR3DECL(int) VMR3PowerOff(PUVM pUVM)
2394 LogFlow(("VMR3PowerOff: pUVM=%p\n", pUVM));
2395 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2396 PVM pVM = pUVM->pVM;
2425 VMMR3DECL(int) VMR3Destroy(PUVM pUVM)
2427 LogFlow(("VMR3Destroy: pUVM=%p\n", pUVM));
2432 if (!pUVM)
2434 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2435 PVM pVM = pUVM->pVM;
2453 vmR3DestroyUVM(pUVM, 30000);
2476 PUVM pUVM = pVM->pUVM;
2479 LogFlow(("vmR3Destroy: pVM=%p pUVM=%p pVCpu=%p idCpu=%u\n", pVM, pUVM, pVCpu, pVCpu->idCpu));
2493 STAMR3Dump(pUVM, "*");
2496 STAMR3DumpToReleaseLog(pUVM, "*");
2506 rc = DBGCTcpTerminate(pUVM, pUVM->vm.s.pvDBGC);
2507 pUVM->vm.s.pvDBGC = NULL;
2553 ASMAtomicUoWriteBool(&pUVM->vm.s.fTerminateEMT, true);
2571 static void vmR3DestroyUVM(PUVM pUVM, uint32_t cMilliesEMTWait)
2578 ASMAtomicUoWriteBool(&pUVM->vm.s.fTerminateEMT, true);
2579 if (pUVM->pVM)
2580 VM_FF_SET(pUVM->pVM, VM_FF_CHECK_VM_STATE); /* Can't hurt... */
2581 for (VMCPUID i = 0; i < pUVM->cCpus; i++)
2583 VMR3NotifyGlobalFFU(pUVM, VMNOTIFYFF_FLAGS_DONE_REM);
2584 RTSemEventSignal(pUVM->aCpus[i].vm.s.EventSemWait);
2590 ASMAtomicUoWriteBool(&pUVM->vm.s.fTerminateEMT, true);
2591 for (VMCPUID i = 0; i < pUVM->cCpus; i++)
2593 RTTHREAD hThread = pUVM->aCpus[i].vm.s.ThreadEMT;
2607 pUVM->aCpus[0].vm.s.ThreadEMT = NIL_RTTHREAD;
2612 for (VMCPUID i = 0; i < pUVM->cCpus; i++)
2614 RTSemEventDestroy(pUVM->aCpus[i].vm.s.EventSemWait);
2615 pUVM->aCpus[i].vm.s.EventSemWait = NIL_RTSEMEVENT;
2622 for (unsigned i = 0; i < RT_ELEMENTS(pUVM->vm.s.apReqFree); i++)
2624 PVMREQ pReq = pUVM->vm.s.apReqFree[i];
2625 pUVM->vm.s.apReqFree[i] = NULL;
2632 Assert(cReqs == pUVM->vm.s.cReqFree); NOREF(cReqs);
2639 PVMREQ pReqHead = ASMAtomicXchgPtrT(&pUVM->vm.s.pPriorityReqs, NULL, PVMREQ);
2642 pReqHead = ASMAtomicXchgPtrT(&pUVM->vm.s.pNormalReqs, NULL, PVMREQ);
2663 for (VMCPUID idCpu = 0; idCpu < pUVM->cCpus; idCpu++)
2665 PUVMCPU pUVCpu = &pUVM->aCpus[idCpu];
2694 PDMR3TermUVM(pUVM);
2699 if (pUVM->vm.s.pSession)
2703 pUVM->vm.s.pSession = NIL_RTR0PTR;
2709 VMR3ReleaseUVM(pUVM);
2818 DBGFR3Info(pVM->pUVM, "cpum", "verbose", NULL);
2832 PUVM pUVM = pVM->pUVM;
2833 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
2837 if (pUVM->vm.s.enmPrevVMState == VMSTATE_SUSPENDED)
2838 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_RESETTING);
2840 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING, VMSTATE_RESETTING);
2843 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RESETTING_LS);
2844 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
2869 * @param pUVM The VM to reset.
2871 VMMR3DECL(int) VMR3Reset(PUVM pUVM)
2874 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
2875 PVM pVM = pUVM->pVM;
2880 if ( pUVM->pVmm2UserMethods
2881 && pUVM->pVmm2UserMethods->pfnNotifyResetTurnedIntoPowerOff)
2882 pUVM->pVmm2UserMethods->pfnNotifyResetTurnedIntoPowerOff(pUVM->pVmm2UserMethods, pUVM);
2883 return VMR3PowerOff(pUVM);
2908 return pVM->pUVM;
2917 * NULL if @a pUVM is invalid (asserted) or if no shared VM structure
2919 * @param pUVM The user mode VM handle.
2922 VMMR3DECL(PVM) VMR3GetVM(PUVM pUVM)
2924 UVM_ASSERT_VALID_EXT_RETURN(pUVM, NULL);
2925 return pUVM->pVM;
2933 * UINT32_MAX if @a pUVM is invalid.
2935 * @param pUVM The user mode VM handle.
2938 VMMR3DECL(uint32_t) VMR3RetainUVM(PUVM pUVM)
2940 UVM_ASSERT_VALID_EXT_RETURN(pUVM, UINT32_MAX);
2941 uint32_t cRefs = ASMAtomicIncU32(&pUVM->vm.s.cUvmRefs);
2950 * @param pUVM The user mode VM handle.
2952 static void vmR3DoReleaseUVM(PUVM pUVM)
2957 Assert(!pUVM->pVM);
2959 MMR3TermUVM(pUVM);
2960 STAMR3TermUVM(pUVM);
2962 ASMAtomicUoWriteU32(&pUVM->u32Magic, UINT32_MAX);
2963 RTTlsFree(pUVM->vm.s.idxTLS);
2964 RTMemPageFree(pUVM, RT_OFFSETOF(UVM, aCpus[pUVM->cCpus]));
2972 * UINT32_MAX if @a pUVM is invalid.
2974 * @param pUVM The user mode VM handle.
2977 VMMR3DECL(uint32_t) VMR3ReleaseUVM(PUVM pUVM)
2979 if (!pUVM)
2981 UVM_ASSERT_VALID_EXT_RETURN(pUVM, UINT32_MAX);
2982 uint32_t cRefs = ASMAtomicDecU32(&pUVM->vm.s.cUvmRefs);
2984 vmR3DoReleaseUVM(pUVM);
2996 * @param pUVM The user mode VM handle.
2998 VMMR3DECL(const char *) VMR3GetName(PUVM pUVM)
3000 UVM_ASSERT_VALID_EXT_RETURN(pUVM, NULL);
3001 return pUVM->vm.s.pszName;
3009 * @param pUVM The user mode VM handle.
3012 VMMR3DECL(PRTUUID) VMR3GetUuid(PUVM pUVM, PRTUUID pUuid)
3014 UVM_ASSERT_VALID_EXT_RETURN(pUVM, NULL);
3017 *pUuid = pUVM->vm.s.Uuid;
3041 * @param pUVM The user-mode VM handle.
3044 VMMR3DECL(VMSTATE) VMR3GetStateU(PUVM pUVM)
3046 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VMSTATE_TERMINATED);
3047 if (RT_UNLIKELY(!pUVM->pVM))
3049 return pUVM->pVM->enmVMState;
3305 * @param pUVM The UVM handle.
3309 static void vmR3DoAtState(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld)
3313 for (PVMATSTATE pCur = pUVM->vm.s.pAtState; pCur; pCur = pCur->pNext)
3315 pCur->pfnAtState(pUVM, enmStateNew, enmStateOld, pCur->pvUser);
3334 * @param pUVM The UVM handle.
3338 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld)
3344 pUVM->vm.s.enmPrevVMState = enmStateOld;
3348 vmR3DoAtState(pVM, pUVM, enmStateNew, enmStateOld);
3361 PUVM pUVM = pVM->pUVM;
3362 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
3366 vmR3SetStateLocked(pVM, pUVM, enmStateNew, pVM->enmVMState);
3368 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
3408 PUVM pUVM = pVM->pUVM;
3409 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
3419 vmR3SetStateLocked(pVM, pUVM, enmStateNew, enmStateOld);
3461 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
3478 PUVM pUVM = pVM->pUVM;
3479 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
3483 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_RUNNING);
3486 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION_LS, VMSTATE_RUNNING_LS);
3487 SSMR3Cancel(pUVM);
3490 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
3529 * @param pUVM The VM handle.
3534 VMMR3DECL(int) VMR3AtStateRegister(PUVM pUVM, PFNVMATSTATE pfnAtState, void *pvUser)
3542 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
3547 PVMATSTATE pNew = (PVMATSTATE)MMR3HeapAllocU(pUVM, MM_TAG_VM, sizeof(*pNew));
3556 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
3557 pNew->pNext = *pUVM->vm.s.ppAtStateNext;
3558 *pUVM->vm.s.ppAtStateNext = pNew;
3559 pUVM->vm.s.ppAtStateNext = &pNew->pNext;
3560 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
3570 * @param pUVM The VM handle.
3575 VMMR3DECL(int) VMR3AtStateDeregister(PUVM pUVM, PFNVMATSTATE pfnAtState, void *pvUser)
3583 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
3585 RTCritSectEnter(&pUVM->vm.s.AtStateCritSect);
3591 PVMATSTATE pCur = pUVM->vm.s.pAtState;
3602 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
3613 pUVM->vm.s.ppAtStateNext = &pPrev->pNext;
3617 pUVM->vm.s.pAtState = pCur->pNext;
3619 pUVM->vm.s.ppAtStateNext = &pUVM->vm.s.pAtState;
3622 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
3639 * @param pUVM The VM handle.
3644 VMMR3DECL(int) VMR3AtErrorRegister(PUVM pUVM, PFNVMATERROR pfnAtError, void *pvUser)
3652 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
3657 PVMATERROR pNew = (PVMATERROR)MMR3HeapAllocU(pUVM, MM_TAG_VM, sizeof(*pNew));
3666 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
3667 pNew->pNext = *pUVM->vm.s.ppAtErrorNext;
3668 *pUVM->vm.s.ppAtErrorNext = pNew;
3669 pUVM->vm.s.ppAtErrorNext = &pNew->pNext;
3670 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
3680 * @param pUVM The VM handle.
3685 VMMR3DECL(int) VMR3AtErrorDeregister(PUVM pUVM, PFNVMATERROR pfnAtError, void *pvUser)
3693 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
3695 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
3701 PVMATERROR pCur = pUVM->vm.s.pAtError;
3712 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
3723 pUVM->vm.s.ppAtErrorNext = &pPrev->pNext;
3727 pUVM->vm.s.pAtError = pCur->pNext;
3729 pUVM->vm.s.ppAtErrorNext = &pUVM->vm.s.pAtError;
3732 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
3752 pCur->pfnAtError(pVM->pUVM, pCur->pvUser, rc, RT_SRC_POS_ARGS, pszFormat, va);
3797 PUVM pUVM = pVM->pUVM;
3798 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
3799 ASMAtomicIncU32(&pUVM->vm.s.cRuntimeErrors);
3800 for (PVMATERROR pCur = pUVM->vm.s.pAtError; pCur; pCur = pCur->pNext)
3802 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
3812 * @param pUVM The VM handle.
3814 VMMR3_INT_DECL(uint32_t) VMR3GetErrorCount(PUVM pUVM)
3816 AssertPtrReturn(pUVM, 0);
3817 AssertReturn(pUVM->u32Magic == UVM_MAGIC, 0);
3818 return pUVM->vm.s.cErrors;
3826 * @param pUVM Pointer to the user mode VM structure.
3833 static int vmR3SetErrorU(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
3837 vmR3SetErrorUV(pUVM, rc, pszFile, iLine, pszFunction, pszFormat, &va);
3846 * @param pUVM Pointer to the user mode VM structure.
3853 DECLCALLBACK(void) vmR3SetErrorUV(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list *pArgs)
3878 if (pUVM->pVM)
3879 vmSetErrorCopy(pUVM->pVM, rc, RT_SRC_POS_ARGS, pszFormat, *pArgs);
3885 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
3886 ASMAtomicIncU32(&pUVM->vm.s.cErrors);
3887 for (PVMATERROR pCur = pUVM->vm.s.pAtError; pCur; pCur = pCur->pNext)
3891 pCur->pfnAtError(pUVM, pCur->pvUser, rc, RT_SRC_POS_ARGS, pszFormat, va2);
3895 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
3904 * return VM_SET_ERROR_U(pUVM, VERR_OF_YOUR_CHOICE, "descriptive message");
3906 * @param pUVM The user mode VM handle.
3913 VMMR3DECL(int) VMR3SetError(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
3917 int rcRet = VMR3SetErrorV(pUVM, rc, pszFile, iLine, pszFunction, pszFormat, va);
3928 * return VM_SET_ERROR_U(pUVM, VERR_OF_YOUR_CHOICE, "descriptive message");
3930 * @param pUVM The user mode VM handle.
3937 VMMR3DECL(int) VMR3SetErrorV(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
3939 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
3940 VM_ASSERT_VALID_EXT_RETURN(pUVM->pVM, VERR_INVALID_VM_HANDLE);
3941 return VMSetErrorV(pUVM->pVM, rc, pszFile, iLine, pszFunction, pszFormat, va);
3955 VMMR3DECL(int) VMR3AtRuntimeErrorRegister(PUVM pUVM, PFNVMATRUNTIMEERROR pfnAtRuntimeError, void *pvUser)
3963 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
3968 PVMATRUNTIMEERROR pNew = (PVMATRUNTIMEERROR)MMR3HeapAllocU(pUVM, MM_TAG_VM, sizeof(*pNew));
3977 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
3978 pNew->pNext = *pUVM->vm.s.ppAtRuntimeErrorNext;
3979 *pUVM->vm.s.ppAtRuntimeErrorNext = pNew;
3980 pUVM->vm.s.ppAtRuntimeErrorNext = &pNew->pNext;
3981 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
3991 * @param pUVM The user mode VM handle.
3996 VMMR3DECL(int) VMR3AtRuntimeErrorDeregister(PUVM pUVM, PFNVMATRUNTIMEERROR pfnAtRuntimeError, void *pvUser)
4004 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
4006 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
4012 PVMATRUNTIMEERROR pCur = pUVM->vm.s.pAtRuntimeError;
4023 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
4034 pUVM->vm.s.ppAtRuntimeErrorNext = &pPrev->pNext;
4038 pUVM->vm.s.pAtRuntimeError = pCur->pNext;
4040 pUVM->vm.s.ppAtRuntimeErrorNext = &pUVM->vm.s.pAtRuntimeError;
4043 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
4083 SSMR3Cancel(pVM->pUVM);
4109 PUVM pUVM = pVM->pUVM;
4119 rc = VMR3Suspend(pUVM, VMSUSPENDREASON_RUNTIME_ERROR);
4126 RTCritSectEnter(&pUVM->vm.s.AtErrorCritSect);
4127 ASMAtomicIncU32(&pUVM->vm.s.cRuntimeErrors);
4128 for (PVMATRUNTIMEERROR pCur = pUVM->vm.s.pAtRuntimeError; pCur; pCur = pCur->pNext)
4132 pCur->pfnAtRuntimeError(pUVM, pCur->pvUser, fFlags, pszErrorId, pszFormat, va);
4135 RTCritSectLeave(&pUVM->vm.s.AtErrorCritSect);
4262 * @param pUVM The user mode VM handle.
4264 VMMR3_INT_DECL(uint32_t) VMR3GetRuntimeErrorCount(PUVM pUVM)
4266 return pUVM->vm.s.cRuntimeErrors;
4279 PUVMCPU pUVCpu = (PUVMCPU)RTTlsGet(pVM->pUVM->vm.s.idxTLS);
4310 PUVMCPU pUVCpu = (PUVMCPU)RTTlsGet(pVM->pUVM->vm.s.idxTLS);
4326 VMMR3DECL(RTNATIVETHREAD) VMR3GetVMCPUNativeThreadU(PUVM pUVM)
4328 PUVMCPU pUVCpu = (PUVMCPU)RTTlsGet(pUVM->vm.s.idxTLS);
4341 * @param pUVM The user mode VM handle.
4344 VMMR3DECL(RTTHREAD) VMR3GetVMCPUThread(PUVM pUVM)
4346 PUVMCPU pUVCpu = (PUVMCPU)RTTlsGet(pUVM->vm.s.idxTLS);
4359 * @param pUVM The user mode VM handle.
4365 VMMR3DECL(int) VMR3GetCpuCoreAndPackageIdFromCpuId(PUVM pUVM, VMCPUID idCpu, uint32_t *pidCpuCore, uint32_t *pidCpuPackage)
4370 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
4371 PVM pVM = pUVM->pVM;
4427 * @param pUVM The user mode VM handle.
4430 VMMR3DECL(int) VMR3HotUnplugCpu(PUVM pUVM, VMCPUID idCpu)
4432 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
4433 PVM pVM = pUVM->pVM;
4441 return VMR3ReqCallNoWaitU(pUVM, idCpu, (PFNRT)vmR3HotUnplugCpu, 2, pVM, idCpu);
4449 * @param pUVM The user mode VM handle.
4452 VMMR3DECL(int) VMR3HotPlugCpu(PUVM pUVM, VMCPUID idCpu)
4454 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
4455 PVM pVM = pUVM->pVM;
4472 VMMR3DECL(int) VMR3SetCpuExecutionCap(PUVM pUVM, uint32_t uCpuExecutionCap)
4474 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
4475 PVM pVM = pUVM->pVM;
4490 * @param pUVM The user mode VM handle.
4494 VMMR3DECL(int) VMR3SetPowerOffInsteadOfReset(PUVM pUVM, bool fPowerOffInsteadOfReset)
4496 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
4497 PVM pVM = pUVM->pVM;