Changeset 61643 in vbox
- Timestamp:
- Jun 10, 2016 1:07:04 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
include/VBox/vmm/vmapi.h (modified) (1 diff)
-
src/VBox/VMM/VMMR3/EM.cpp (modified) (5 diffs)
-
src/VBox/VMM/VMMR3/VM.cpp (modified) (12 diffs)
-
src/VBox/VMM/VMMR3/VMEmt.cpp (modified) (1 diff)
-
src/VBox/VMM/include/VMInternal.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/vmapi.h
r60404 r61643 437 437 VMMR3DECL(int) VMR3AtStateRegister(PUVM pUVM, PFNVMATSTATE pfnAtState, void *pvUser); 438 438 VMMR3DECL(int) VMR3AtStateDeregister(PUVM pUVM, PFNVMATSTATE pfnAtState, void *pvUser); 439 VMMR3_INT_DECL(bool) VMR3SetGuruMeditation(PVM pVM); 439 440 VMMR3_INT_DECL(bool) VMR3TeleportedAndNotFullyResumedYet(PVM pVM); 440 441 VMMR3DECL(int) VMR3AtErrorRegister(PUVM pUVM, PFNVMATERROR pfnAtError, void *pvUser); -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r61633 r61643 1695 1695 case VMSTATE_FATAL_ERROR: 1696 1696 case VMSTATE_FATAL_ERROR_LS: 1697 case VMSTATE_GURU_MEDITATION: 1698 case VMSTATE_GURU_MEDITATION_LS: 1697 1699 Log2(("emR3ForcedActions: %s -> VINF_EM_SUSPEND\n", VMGetStateName(enmState) )); 1698 1700 STAM_REL_PROFILE_STOP(&pVCpu->em.s.StatForcedActions, a); … … 2036 2038 case VMSTATE_FATAL_ERROR: 2037 2039 case VMSTATE_FATAL_ERROR_LS: 2040 case VMSTATE_GURU_MEDITATION: 2041 case VMSTATE_GURU_MEDITATION_LS: 2038 2042 Log2(("emR3ForcedActions: %s -> VINF_EM_SUSPEND\n", VMGetStateName(enmState) )); 2039 2043 STAM_REL_PROFILE_STOP(&pVCpu->em.s.StatForcedActions, a); … … 2655 2659 /* switch to guru meditation mode */ 2656 2660 pVCpu->em.s.enmState = EMSTATE_GURU_MEDITATION; 2661 VMR3SetGuruMeditation(pVM); /* This notifies the other EMTs. */ 2657 2662 VMMR3FatalDump(pVM, pVCpu, rc); 2658 2663 } … … 2672 2677 { 2673 2678 TMR3NotifySuspend(pVM, pVCpu); 2679 VMR3SetGuruMeditation(pVM); /* This notifies the other EMTs. */ 2674 2680 VMMR3FatalDump(pVM, pVCpu, rc); 2675 2681 emR3Debug(pVM, pVCpu, rc); … … 2701 2707 Log(("EMR3ExecuteVM: returns %Rrc because of longjmp / fatal error; (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(pVCpu->em.s.enmPrevState))); 2702 2708 TMR3NotifySuspend(pVM, pVCpu); 2709 VMR3SetGuruMeditation(pVM); /* This notifies the other EMTs. */ 2703 2710 VMMR3FatalDump(pVM, pVCpu, rc); 2704 2711 emR3Debug(pVM, pVCpu, rc); -
trunk/src/VBox/VMM/VMMR3/VM.cpp
r61570 r61643 123 123 static void vmR3DoAtState(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld); 124 124 static int vmR3TrySetState(PVM pVM, const char *pszWho, unsigned cTransitions, ...); 125 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld );125 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld, bool fSetRatherThanClearFF); 126 126 static void vmR3SetState(PVM pVM, VMSTATE enmStateNew, VMSTATE enmStateOld); 127 127 static int vmR3SetErrorU(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(6, 7); … … 1595 1595 { 1596 1596 case VMSTATE_RUNNING_LS: 1597 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RUNNING_LS );1597 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RUNNING_LS, false /*fSetRatherThanClearFF*/); 1598 1598 rc = VINF_SUCCESS; 1599 1599 break; … … 1609 1609 1610 1610 case VMSTATE_OFF_LS: 1611 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_OFF_LS );1611 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_OFF_LS, false /*fSetRatherThanClearFF*/); 1612 1612 rc = VERR_SSM_LIVE_POWERED_OFF; 1613 1613 break; 1614 1614 1615 1615 case VMSTATE_FATAL_ERROR_LS: 1616 vmR3SetStateLocked(pVM, pUVM, VMSTATE_FATAL_ERROR, VMSTATE_FATAL_ERROR_LS );1616 vmR3SetStateLocked(pVM, pUVM, VMSTATE_FATAL_ERROR, VMSTATE_FATAL_ERROR_LS, false /*fSetRatherThanClearFF*/); 1617 1617 rc = VERR_SSM_LIVE_FATAL_ERROR; 1618 1618 break; 1619 1619 1620 1620 case VMSTATE_GURU_MEDITATION_LS: 1621 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_GURU_MEDITATION_LS );1621 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_GURU_MEDITATION_LS, false /*fSetRatherThanClearFF*/); 1622 1622 rc = VERR_SSM_LIVE_GURU_MEDITATION; 1623 1623 break; … … 2339 2339 enmVMState = pVM->enmVMState; 2340 2340 if (enmVMState == VMSTATE_POWERING_OFF_LS) 2341 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF_LS, VMSTATE_POWERING_OFF_LS );2341 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF_LS, VMSTATE_POWERING_OFF_LS, false /*fSetRatherThanClearFF*/); 2342 2342 else 2343 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_POWERING_OFF );2343 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_POWERING_OFF, false /*fSetRatherThanClearFF*/); 2344 2344 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect); 2345 2345 } … … 2778 2778 { 2779 2779 if (pUVM->vm.s.enmPrevVMState == VMSTATE_SUSPENDED) 2780 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_SOFT_RESETTING );2780 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_SOFT_RESETTING, false /*fSetRatherThanClearFF*/); 2781 2781 else 2782 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING, VMSTATE_SOFT_RESETTING );2782 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING, VMSTATE_SOFT_RESETTING, false /*fSetRatherThanClearFF*/); 2783 2783 } 2784 2784 else 2785 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING_LS, VMSTATE_SOFT_RESETTING_LS );2785 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING_LS, VMSTATE_SOFT_RESETTING_LS, false /*fSetRatherThanClearFF*/); 2786 2786 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect); 2787 2787 } … … 2895 2895 { 2896 2896 if (pUVM->vm.s.enmPrevVMState == VMSTATE_SUSPENDED) 2897 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_RESETTING );2897 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_RESETTING, false /*fSetRatherThanClearFF*/); 2898 2898 else 2899 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING, VMSTATE_RESETTING );2899 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING, VMSTATE_RESETTING, false /*fSetRatherThanClearFF*/); 2900 2900 } 2901 2901 else 2902 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RESETTING_LS );2902 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RESETTING_LS, false /*fSetRatherThanClearFF*/); 2903 2903 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect); 2904 2904 … … 3486 3486 * Sets the current VM state, with the AtStatCritSect already entered. 3487 3487 * 3488 * @param pVM The cross context VM structure. 3489 * @param pUVM The UVM handle. 3490 * @param enmStateNew The new state. 3491 * @param enmStateOld The old state. 3492 */ 3493 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld) 3488 * @param pVM The cross context VM structure. 3489 * @param pUVM The UVM handle. 3490 * @param enmStateNew The new state. 3491 * @param enmStateOld The old state. 3492 * @param fSetRatherThanClearFF The usual behavior is to clear the 3493 * VM_FF_CHECK_VM_STATE force flag, but for 3494 * some transitions (-> guru) we need to kick 3495 * the other EMTs to stop what they're doing. 3496 */ 3497 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld, bool fSetRatherThanClearFF) 3494 3498 { 3495 3499 vmR3ValidateStateTransition(enmStateOld, enmStateNew); … … 3497 3501 AssertMsg(pVM->enmVMState == enmStateOld, 3498 3502 ("%s != %s\n", VMR3GetStateName(pVM->enmVMState), VMR3GetStateName(enmStateOld))); 3503 3499 3504 pUVM->vm.s.enmPrevVMState = enmStateOld; 3500 3505 pVM->enmVMState = enmStateNew; 3501 VM_FF_CLEAR(pVM, VM_FF_CHECK_VM_STATE); 3506 3507 if (!fSetRatherThanClearFF) 3508 VM_FF_CLEAR(pVM, VM_FF_CHECK_VM_STATE); 3509 else if (pVM->cCpus > 0) 3510 VM_FF_SET(pVM, VM_FF_CHECK_VM_STATE); 3502 3511 3503 3512 vmR3DoAtState(pVM, pUVM, enmStateNew, enmStateOld); … … 3519 3528 AssertMsg(pVM->enmVMState == enmStateOld, 3520 3529 ("%s != %s\n", VMR3GetStateName(pVM->enmVMState), VMR3GetStateName(enmStateOld))); 3521 vmR3SetStateLocked(pVM, pUVM, enmStateNew, pVM->enmVMState );3530 vmR3SetStateLocked(pVM, pUVM, enmStateNew, pVM->enmVMState, false /*fSetRatherThanClearFF*/); 3522 3531 3523 3532 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect); … … 3572 3581 if (enmStateCur == enmStateOld) 3573 3582 { 3574 vmR3SetStateLocked(pVM, pUVM, enmStateNew, enmStateOld );3583 vmR3SetStateLocked(pVM, pUVM, enmStateNew, enmStateOld, false /*fSetRatherThanClearFF*/); 3575 3584 rc = i + 1; 3576 3585 break; … … 3622 3631 3623 3632 /** 3624 * Flag a guru meditation ... a hack. 3625 * 3633 * Interface used by EM to signal that it's entering the guru meditation state. 3634 * 3635 * This will notifying other threads. 3636 * 3637 * @returns true if the state changed to Guru, false if no state change. 3626 3638 * @param pVM The cross context VM structure. 3627 * 3628 * @todo Rewrite this part. The guru meditation should be flagged 3629 * immediately by the VMM and not by VMEmt.cpp when it's all over. 3630 */ 3631 void vmR3SetGuruMeditation(PVM pVM) 3639 */ 3640 VMMR3_INT_DECL(bool) VMR3SetGuruMeditation(PVM pVM) 3632 3641 { 3633 3642 PUVM pUVM = pVM->pUVM; … … 3635 3644 3636 3645 VMSTATE enmStateCur = pVM->enmVMState; 3646 bool fRc = true; 3637 3647 if (enmStateCur == VMSTATE_RUNNING) 3638 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_RUNNING );3648 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_RUNNING, true /*fSetRatherThanClearFF*/); 3639 3649 else if (enmStateCur == VMSTATE_RUNNING_LS) 3640 3650 { 3641 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION_LS, VMSTATE_RUNNING_LS );3651 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION_LS, VMSTATE_RUNNING_LS, true /*fSetRatherThanClearFF*/); 3642 3652 SSMR3Cancel(pUVM); 3643 3653 } 3654 else 3655 fRc = false; 3644 3656 3645 3657 RTCritSectLeave(&pUVM->vm.s.AtStateCritSect); 3658 return fRc; 3646 3659 } 3647 3660 -
trunk/src/VBox/VMM/VMMR3/VMEmt.cpp
r61628 r61643 237 237 rc = EMR3ExecuteVM(pVM, pVCpu); 238 238 Log(("vmR3EmulationThread: EMR3ExecuteVM() -> rc=%Rrc, enmVMState=%d\n", rc, pVM->enmVMState)); 239 if (EMGetState(pVCpu) == EMSTATE_GURU_MEDITATION)240 vmR3SetGuruMeditation(pVM);241 239 } 242 240 } -
trunk/src/VBox/VMM/include/VMInternal.h
r56287 r61643 457 457 DECLCALLBACK(int) vmR3SetRuntimeErrorV(PVM pVM, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list *pVa); 458 458 void vmSetRuntimeErrorCopy(PVM pVM, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list va); 459 void vmR3SetGuruMeditation(PVM pVM);460 459 void vmR3SetTerminated(PVM pVM); 461 460
Note:
See TracChangeset
for help on using the changeset viewer.

