VirtualBox

Changeset 79750 in vbox


Ignore:
Timestamp:
Jul 13, 2019 6:17:38 AM (5 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Unify the guest and nested-guest exception handlers after special case handling for both.

File:
1 edited

Legend:

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

    r79721 r79750  
    1436014360#endif
    1436114361        pVCpu->hm.s.Event.fPending = false;                  /* In case it's a contributory or vectoring #PF. */
    14362         if (RT_LIKELY(!pVmxTransient->fVectoringDoublePF))
     14362        if (!pVmxTransient->fVectoringDoublePF)
    1436314363        {
    1436414364            hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 0 /* cbInstr */,
     
    1436814368        {
    1436914369            /* A guest page-fault occurred during delivery of a page-fault. Inject #DF. */
     14370            Assert(!pVmxTransient->fIsNestedGuest);
    1437014371            hmR0VmxSetPendingXcptDF(pVCpu);
    1437114372            Log4Func(("Pending #DF due to vectoring #PF w/ NestedPaging\n"));
     
    1437414375        return rc;
    1437514376    }
     14377
     14378    Assert(!pVmxTransient->fIsNestedGuest);
    1437614379
    1437714380    /* If it's a vectoring #PF, emulate injecting the original event injection as PGMTrap0eHandler() is incapable
     
    1446014463    }
    1446114464
     14465    rc  = hmR0VmxReadExitIntInfoVmcs(pVmxTransient);
     14466    rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient);
     14467    rc |= hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     14468    AssertRCReturn(rc, rc);
     14469
    1446214470    hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), pVmxTransient->cbInstr,
    1446314471                           pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */);
     
    1447814486
    1447914487    PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    14480     rc = DBGFRZTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx));
     14488    if (!pVmxTransient->fIsNestedGuest)
     14489        rc = DBGFRZTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx));
     14490    else
     14491        rc = VINF_EM_RAW_GUEST_TRAP;
    1448114492    if (rc == VINF_EM_RAW_GUEST_TRAP)
    1448214493    {
     
    1449614507
    1449714508/**
    14498  * VM-exit exception handler for \#AC (alignment check exception).
     14509 * VM-exit exception handler for \#AC (Alignment-check exception).
    1449914510 */
    1450014511static VBOXSTRICTRC hmR0VmxExitXcptAC(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     
    1453614547
    1453714548    PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    14538     rc = DBGFRZTrap01Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx), uDR6, pVCpu->hm.s.fSingleInstruction);
     14549    if (!pVmxTransient->fIsNestedGuest)
     14550        rc = DBGFRZTrap01Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx), uDR6, pVCpu->hm.s.fSingleInstruction);
     14551    else
     14552        rc = VINF_EM_RAW_GUEST_TRAP;
    1453914553    Log6Func(("rc=%Rrc\n", rc));
    1454014554    if (rc == VINF_EM_RAW_GUEST_TRAP)
     
    1466714681}
    1466814682
     14683
    1466914684/**
    1467014685 * VM-exit exception handler for \#GP (General-protection exception).
    14671  *
    14672  * @remarks Requires pVmxTransient->uExitIntInfo to be up-to-date.
    1467314686 */
    1467414687static VBOXSTRICTRC hmR0VmxExitXcptGP(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     
    1468614699        Assert(pVCpu->hm.s.fUsingDebugLoop || pVCpu->hm.s.fTrapXcptGpForLovelyMesaDrv || pVmxTransient->fIsNestedGuest);
    1468714700#endif
    14688         /* If the guest is not in real-mode or we have unrestricted guest execution support, reflect #GP to the guest. */
     14701        /*
     14702         * If the guest is not in real-mode or we have unrestricted guest execution support, or if we are
     14703         * executing a nested-guest, reflect #GP to the guest or nested-guest.
     14704         */
    1468914705        int rc  = hmR0VmxReadExitIntInfoVmcs(pVmxTransient);
    1469014706        rc     |= hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient);
     
    1474614762
    1474714763/**
    14748  * VM-exit exception handler wrapper for generic exceptions.
     14764 * VM-exit exception handler wrapper for all other exceptions that are not handled
     14765 * by a specific handler.
    1474914766 *
    1475014767 * This simply re-injects the exception back into the VM without any special
    1475114768 * processing.
    1475214769 */
    14753 static VBOXSTRICTRC hmR0VmxExitXcptGeneric(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     14770static VBOXSTRICTRC hmR0VmxExitXcptOthers(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
    1475414771{
    1475514772    HMVMX_VALIDATE_EXIT_XCPT_HANDLER_PARAMS(pVCpu, pVmxTransient);
     
    1481414831    return VINF_SUCCESS;
    1481514832}
     14833
     14834
     14835/**
     14836 * VM-exit exception handler for all exceptions.
     14837 *
     14838 * @remarks This may be called for both guests and nested-guests. Take care to not
     14839 *          make assumptions and avoid doing anything that is not relevant when
     14840 *          executing a nested-guest (e.g., Mesa driver hacks).
     14841 */
     14842DECL_FORCE_INLINE(VBOXSTRICTRC) hmR0VmxExitXcptAll(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient, uint8_t uVector)
     14843{
     14844    switch (uVector)
     14845    {
     14846        case X86_XCPT_PF: return hmR0VmxExitXcptPF(pVCpu, pVmxTransient);
     14847        case X86_XCPT_GP: return hmR0VmxExitXcptGP(pVCpu, pVmxTransient);
     14848        case X86_XCPT_MF: return hmR0VmxExitXcptMF(pVCpu, pVmxTransient);
     14849        case X86_XCPT_DB: return hmR0VmxExitXcptDB(pVCpu, pVmxTransient);
     14850        case X86_XCPT_BP: return hmR0VmxExitXcptBP(pVCpu, pVmxTransient);
     14851        case X86_XCPT_AC: return hmR0VmxExitXcptAC(pVCpu, pVmxTransient);
     14852        default:
     14853            return hmR0VmxExitXcptOthers(pVCpu, pVmxTransient);
     14854    }
     14855}
    1481614856/** @} */
    1481714857
     
    1491214952                break;
    1491314953            }
    14914 
    14915             switch (uVector)
    14916             {
    14917                 case X86_XCPT_PF: rcStrict = hmR0VmxExitXcptPF(pVCpu, pVmxTransient);   break;
    14918                 case X86_XCPT_GP: rcStrict = hmR0VmxExitXcptGP(pVCpu, pVmxTransient);   break;
    14919                 case X86_XCPT_MF: rcStrict = hmR0VmxExitXcptMF(pVCpu, pVmxTransient);   break;
    14920                 case X86_XCPT_DB: rcStrict = hmR0VmxExitXcptDB(pVCpu, pVmxTransient);   break;
    14921                 case X86_XCPT_BP: rcStrict = hmR0VmxExitXcptBP(pVCpu, pVmxTransient);   break;
    14922                 case X86_XCPT_AC: rcStrict = hmR0VmxExitXcptAC(pVCpu, pVmxTransient);   break;
    14923                 default:
    14924                     rcStrict = hmR0VmxExitXcptGeneric(pVCpu, pVmxTransient);
    14925                     break;
    14926             }
     14954            rcStrict = hmR0VmxExitXcptAll(pVCpu, pVmxTransient, uVector);
    1492714955            break;
    1492814956        }
     
    1706617094             */
    1706717095            pVCpu->hm.s.Event.fPending = false;
    17068             hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(uExitIntInfo), pVmxTransient->cbInstr,
    17069                                    pVmxTransient->uExitIntErrorCode, pVmxTransient->uExitQual);
    17070             return VINF_SUCCESS;
     17096            return hmR0VmxExitXcptAll(pVCpu, pVmxTransient, uVector);
    1707117097        }
    1707217098
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