VirtualBox

Changeset 79149 in vbox


Ignore:
Timestamp:
Jun 14, 2019 9:51:25 AM (6 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Iron out return code when hmR0VmxEvaluatePendingEvent causes a VM-exit (NMI/ext. INT).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r79148 r79149  
    1049010490 * @retval  VINF_SUCCESS if we can proceed with running the guest, interrupts
    1049110491 *          have been disabled.
     10492 * @retval  VINF_VMX_VMEXIT if a nested-guest VM-exit occurs (e.g., while evaluating
     10493 *          pending events).
    1049210494 * @retval  VINF_EM_RESET if a triple-fault occurs while injecting a
    1049310495 *          double-fault into the guest.
     
    1062010622     * preparing to run a nested-guest but performed a nested-guest VM-exit, we should bail.
    1062110623     */
    10622     if (   rcStrict != VINF_SUCCESS
    10623         || (    pVmxTransient->fIsNestedGuest
    10624             && !CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)))
     10624    if (rcStrict != VINF_SUCCESS)
    1062510625        return rcStrict;
     10626    if (   pVmxTransient->fIsNestedGuest
     10627        && !CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx))
     10628        return VINF_VMX_VMEXIT;
     10629#else
     10630    Assert(rcStrict == VINF_SUCCESS);
    1062610631#endif
    1062710632
     
    1263012635#endif
    1263112636
    12632     if (rcStrict == VERR_EM_INTERPRETER)
    12633         rcStrict = VINF_EM_RAW_EMULATE_INSTR;
    12634     else if (rcStrict == VINF_EM_RESET)
    12635         rcStrict = VINF_EM_TRIPLE_FAULT;
     12637    int const rcLoop = VBOXSTRICTRC_VAL(rcStrict);
     12638    switch (rcLoop)
     12639    {
     12640        case VINF_VMX_VMEXIT:       rcStrict = VINF_SUCCESS;                break;
     12641        case VERR_EM_INTERPRETER:   rcStrict = VINF_EM_RAW_EMULATE_INSTR;   break;
     12642        case VINF_EM_RESET:         rcStrict = VINF_EM_TRIPLE_FAULT;        break;
     12643    }
    1263612644
    1263712645    int rc2 = hmR0VmxExitToRing3(pVCpu, rcStrict);
     
    1599416002            AssertRCReturn(rc, rc);
    1599516003
    15996             uint8_t const  uVector    = VMX_EXIT_INT_INFO_VECTOR(uExitIntInfo);
    15997             bool const     fIntercept = CPUMIsGuestVmxXcptInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, uVector,
    15998                                                                        pVmxTransient->uExitIntErrorCode);
     16004            uint8_t const uVector    = VMX_EXIT_INT_INFO_VECTOR(uExitIntInfo);
     16005            bool const    fIntercept = CPUMIsGuestVmxXcptInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, uVector,
     16006                                                                      pVmxTransient->uExitIntErrorCode);
    1599916007            if (fIntercept)
    1600016008            {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette