Lines Matching defs:pUVCpu

49 int vmR3EmulationThreadWithId(RTTHREAD ThreadSelf, PUVMCPU pUVCpu, VMCPUID idCpu);
61 PUVMCPU pUVCpu = (PUVMCPU)pvArgs;
62 return vmR3EmulationThreadWithId(ThreadSelf, pUVCpu, pUVCpu->idCpu);
71 * @param pUVCpu Pointer to the user mode per-VCpu structure.
74 int vmR3EmulationThreadWithId(RTTHREAD ThreadSelf, PUVMCPU pUVCpu, VMCPUID idCpu)
76 PUVM pUVM = pUVCpu->pUVM;
82 rc = RTTlsSet(pUVM->vm.s.idxTLS, pUVCpu);
87 pUVM->pVmm2UserMethods->pfnNotifyEmtInit(pUVM->pVmm2UserMethods, pUVM, pUVCpu);
118 && pUVCpu->idCpu == 0)
126 else if (pUVCpu->vm.s.pNormalReqs || pUVCpu->vm.s.pPriorityReqs)
131 rc = VMR3ReqProcessU(pUVM, pUVCpu->idCpu, false /*fPriorityOnly*/);
132 Log(("vmR3EmulationThread: Req (cpu=%u) rc=%Rrc, VM state %s -> %s\n", pUVCpu->idCpu, rc, VMR3GetStateName(enmBefore), pUVM->pVM ? VMR3GetStateName(pUVM->pVM->enmVMState) : "CREATING"));
139 rc = VMR3WaitU(pUVCpu);
176 else if (pUVCpu->vm.s.pNormalReqs || pUVCpu->vm.s.pPriorityReqs)
181 rc = VMR3ReqProcessU(pUVM, pUVCpu->idCpu, false /*fPriorityOnly*/);
182 Log(("vmR3EmulationThread: Req (cpu=%u) rc=%Rrc, VM state %s -> %s\n", pUVCpu->idCpu, rc, VMR3GetStateName(enmBefore), VMR3GetStateName(pVM->enmVMState)));
206 rc = VMR3WaitU(pUVCpu);
265 pUVM->pVmm2UserMethods->pfnNotifyEmtTerm(pUVM->pVmm2UserMethods, pUVM, pUVCpu);
267 pUVCpu->vm.s.NativeThreadEMT = NIL_RTNATIVETHREAD;
298 * @param pUVCpu The user mode per CPU structure of the calling
303 static int vmR3FatalWaitError(PUVMCPU pUVCpu, const char *pszFmt, int rcFmt)
308 ASMAtomicUoWriteBool(&pUVCpu->pUVM->vm.s.fTerminateEMT, true);
309 if (pUVCpu->pVM)
310 VM_FF_SET(pUVCpu->pVM, VM_FF_CHECK_VM_STATE);
318 static DECLCALLBACK(int) vmR3HaltOldDoHalt(PUVMCPU pUVCpu, const uint32_t fMask, uint64_t /* u64Now*/)
323 PVM pVM = pUVCpu->pVM;
324 PVMCPU pVCpu = pUVCpu->pVCpu;
327 ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
339 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltTimers, cNsElapsedTimers);
368 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltYield, cNsElapsedSchedYield);
374 rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, 1);
376 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlock, cNsElapsedSchedHalt);
382 rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, RT_MIN((u64NanoTS - 1000000) / 1000000, 15));
384 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlock, cNsElapsedSchedHalt);
393 rc = vmR3FatalWaitError(pUVCpu, "RTSemEventWait->%Rrc\n", rc);
398 ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
477 static DECLCALLBACK(int) vmR3HaltMethod1Halt(PUVMCPU pUVCpu, const uint32_t fMask, uint64_t u64Now)
479 PUVM pUVM = pUVCpu->pUVM;
480 PVMCPU pVCpu = pUVCpu->pVCpu;
481 PVM pVM = pUVCpu->pVM;
494 if (pUVCpu->vm.s.Halt.Method12.u64StartSpinTS)
500 fBlockOnce = u64Now - pUVCpu->vm.s.Halt.Method12.u64LastBlockTS
507 //RTLogRelPrintf("Stopped spinning (%u ms)\n", (u64Now - pUVCpu->vm.s.Halt.Method12.u64StartSpinTS) / 1000000);
508 pUVCpu->vm.s.Halt.Method12.u64StartSpinTS = 0;
515 pUVCpu->vm.s.Halt.Method12.u64StartSpinTS = u64Now;
518 else if (pUVCpu->vm.s.Halt.Method12.u64StartSpinTS)
520 //RTLogRelPrintf("Stopped spinning (%u ms)\n", (u64Now - pUVCpu->vm.s.Halt.Method12.u64StartSpinTS) / 1000000);
521 pUVCpu->vm.s.Halt.Method12.u64StartSpinTS = 0;
528 ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
538 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltTimers, cNsElapsedTimers);
563 const uint64_t Start = pUVCpu->vm.s.Halt.Method12.u64LastBlockTS = RTTimeNanoTS();
567 if (cMilliSecs <= pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLongAvg)
570 cMilliSecs -= pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLongAvg;
574 rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, cMilliSecs);
576 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlock, cNsElapsedSchedHalt);
582 rc = vmR3FatalWaitError(pUVCpu, "RTSemEventWait->%Rrc\n", rc);
591 pUVCpu->vm.s.Halt.Method12.cNSBlocked += Elapsed;
593 pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLong += Elapsed - u64NanoTS;
594 pUVCpu->vm.s.Halt.Method12.cBlocks++;
595 if (!(pUVCpu->vm.s.Halt.Method12.cBlocks & 0xf))
597 pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLongAvg = pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLong / pUVCpu->vm.s.Halt.Method12.cBlocks;
598 if (!(pUVCpu->vm.s.Halt.Method12.cBlocks & 0x3f))
600 pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLong = pUVCpu->vm.s.Halt.Method12.cNSBlockedTooLongAvg * 0x40;
601 pUVCpu->vm.s.Halt.Method12.cBlocks = 0x40;
616 ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
663 static DECLCALLBACK(int) vmR3HaltGlobal1Halt(PUVMCPU pUVCpu, const uint32_t fMask, uint64_t u64Now)
665 PUVM pUVM = pUVCpu->pUVM;
666 PVMCPU pVCpu = pUVCpu->pVCpu;
667 PVM pVM = pUVCpu->pVM;
677 ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
687 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltTimers, cNsElapsedTimers);
717 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlock, cNsElapsedSchedHalt);
723 rc = vmR3FatalWaitError(pUVCpu, "vmR3HaltGlobal1Halt: VMMR0_DO_GVMM_SCHED_HALT->%Rrc\n", rc);
730 STAM_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlockOverslept, cNsOverslept);
732 STAM_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlockInsomnia, cNsElapsedSchedHalt);
734 STAM_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlockOnTime, cNsElapsedSchedHalt);
746 STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltYield, cNsElapsedSchedYield);
751 ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
760 * @param pUVCpu Pointer to the user mode VMCPU structure.
762 static DECLCALLBACK(int) vmR3HaltGlobal1Wait(PUVMCPU pUVCpu)
764 ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
766 PVM pVM = pUVCpu->pUVM->pVM;
768 Assert(pVCpu->idCpu == pUVCpu->idCpu);
789 rc = vmR3FatalWaitError(pUVCpu, "vmR3HaltGlobal1Wait: VMMR0_DO_GVMM_SCHED_HALT->%Rrc\n", rc);
794 ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
802 * @param pUVCpu Pointer to the user mode VMCPU structure.
805 static DECLCALLBACK(void) vmR3HaltGlobal1NotifyCpuFF(PUVMCPU pUVCpu, uint32_t fFlags)
807 if (pUVCpu->vm.s.fWait)
809 int rc = SUPR3CallVMMR0Ex(pUVCpu->pVM->pVMR0, pUVCpu->idCpu, VMMR0_DO_GVMM_SCHED_WAKE_UP, 0, NULL);
814 && pUVCpu->pVCpu)
816 VMCPUSTATE enmState = VMCPU_GET_STATE(pUVCpu->pVCpu);
821 int rc = SUPR3CallVMMR0Ex(pUVCpu->pVM->pVMR0, pUVCpu->idCpu, VMMR0_DO_GVMM_SCHED_POKE, 0, NULL);
829 REMR3NotifyFF(pUVCpu->pVM);
842 static DECLCALLBACK(int) vmR3BootstrapWait(PUVMCPU pUVCpu)
844 PUVM pUVM = pUVCpu->pUVM;
846 ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
856 if (pUVCpu->vm.s.pNormalReqs || pUVCpu->vm.s.pPriorityReqs) /* local requests pending? */
859 if ( pUVCpu->pVM
860 && ( VM_FF_IS_PENDING(pUVCpu->pVM, VM_FF_EXTERNAL_SUSPENDED_MASK)
861 || VMCPU_FF_IS_PENDING(VMMGetCpu(pUVCpu->pVM), VMCPU_FF_EXTERNAL_SUSPENDED_MASK)
872 rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, 1000);
877 rc = vmR3FatalWaitError(pUVCpu, "RTSemEventWait->%Rrc\n", rc);
882 ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
890 * @param pUVCpu Pointer to the user mode VMCPU structure.
893 static DECLCALLBACK(void) vmR3BootstrapNotifyCpuFF(PUVMCPU pUVCpu, uint32_t fFlags)
895 if (pUVCpu->vm.s.fWait)
897 int rc = RTSemEventSignal(pUVCpu->vm.s.EventSemWait);
910 static DECLCALLBACK(int) vmR3DefaultWait(PUVMCPU pUVCpu)
912 ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
914 PVM pVM = pUVCpu->pVM;
915 PVMCPU pVCpu = pUVCpu->pVCpu;
930 rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, 1000);
935 rc = vmR3FatalWaitError(pUVCpu, "RTSemEventWait->%Rrc", rc);
940 ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
948 * @param pUVCpu Pointer to the user mode VMCPU structure.
951 static DECLCALLBACK(void) vmR3DefaultNotifyCpuFF(PUVMCPU pUVCpu, uint32_t fFlags)
953 if (pUVCpu->vm.s.fWait)
955 int rc = RTSemEventSignal(pUVCpu->vm.s.EventSemWait);
960 && pUVCpu->pVCpu
961 && pUVCpu->pVCpu->enmState == VMCPUSTATE_STARTED_EXEC_REM)
962 REMR3NotifyFF(pUVCpu->pVM);
980 DECLR3CALLBACKMEMBER(int, pfnHalt,(PUVMCPU pUVCpu, const uint32_t fMask, uint64_t u64Now));
982 DECLR3CALLBACKMEMBER(int, pfnWait,(PUVMCPU pUVCpu));
984 DECLR3CALLBACKMEMBER(void, pfnNotifyCpuFF,(PUVMCPU pUVCpu, uint32_t fFlags));
1025 * @param pUVCpu Pointer to the user mode per CPU VM structure.
1029 VMMR3_INT_DECL(void) VMR3NotifyCpuFFU(PUVMCPU pUVCpu, uint32_t fFlags)
1031 PUVM pUVM = pUVCpu->pUVM;
1034 g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnNotifyCpuFF(pUVCpu, fFlags);
1079 PUVMCPU pUVCpu = pVCpu->pUVCpu;
1081 int64_t off = u64Now - pUVCpu->vm.s.u64HaltsStartTS;
1084 if (off > _4G || !pUVCpu->vm.s.cHalts)
1086 pUVCpu->vm.s.HaltInterval = 1000000000 /* 1 sec */;
1087 pUVCpu->vm.s.HaltFrequency = 1;
1091 pUVCpu->vm.s.HaltInterval = (uint32_t)off / pUVCpu->vm.s.cHalts;
1092 pUVCpu->vm.s.HaltFrequency = ASMMultU64ByU32DivByU32(pUVCpu->vm.s.cHalts, 1000000000, (uint32_t)off);
1094 pUVCpu->vm.s.u64HaltsStartTS = u64Now;
1095 pUVCpu->vm.s.cHalts = 0;
1097 pUVCpu->vm.s.cHalts++;
1104 PUVM pUVM = pUVCpu->pUVM;
1105 int rc = g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnHalt(pUVCpu, fMask, u64Now);
1127 * @param pUVCpu Pointer to the user mode VMCPU structure.
1131 VMMR3_INT_DECL(int) VMR3WaitU(PUVMCPU pUVCpu)
1138 PVM pVM = pUVCpu->pVM;
1139 PVMCPU pVCpu = pUVCpu->pVCpu;
1155 PUVM pUVM = pUVCpu->pUVM;
1156 int rc = g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnWait(pUVCpu);
1168 * @param pUVCpu Pointer to the user mode VMCPU structure.
1171 VMMR3_INT_DECL(int) VMR3AsyncPdmNotificationWaitU(PUVMCPU pUVCpu)
1174 return VMR3WaitU(pUVCpu);
1352 VMR3NotifyCpuFFU(pVCpu->pUVCpu, VMNOTIFYFF_FLAGS_DONE_REM);