VirtualBox

Changeset 78978 in vbox for trunk/src


Ignore:
Timestamp:
Jun 5, 2019 6:25:09 AM (6 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:9180 Exception or NMI VM-exit handling. Fix EM to use renamed IEM function.

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

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

    r78962 r78978  
    88118811            if (   pVmxTransient->fIsNestedGuest
    88128812                && CPUMIsGuestVmxPinCtlsSet(pVCpu, pCtx, VMX_PIN_CTLS_NMI_EXIT))
    8813             {
    8814                 VBOXSTRICTRC rcStrict = IEMExecVmxVmexitNmi(pVCpu);
    8815                 if (rcStrict != VINF_VMX_INTERCEPT_NOT_ACTIVE)
    8816                     return rcStrict;
    8817             }
     8813                return IEMExecVmxVmexitXcptNmi(pVCpu);
    88188814#endif
    88198815            hmR0VmxSetPendingXcptNmi(pVCpu);
     
    1580515801    uint32_t const uExtIntType = VMX_EXIT_INT_INFO_TYPE(uExitIntInfo);
    1580615802
     15803    /*
     15804     * Make sure not to use stale/previous VM-exit instruction length since we read the
     15805     * instruction length from the VMCS below only for software exceptions and privileged
     15806     * software exceptions but we pass it for all exception VM-exits below.
     15807     */
     15808    pVmxTransient->cbInstr = 0;
     15809
    1580715810    switch (uExtIntType)
    1580815811    {
     
    1582015823         * Privileged software exceptions:
    1582115824         *    Figure out if the exception must be delivered to the guest or the nested-guest.
     15825         *
     15826         *    For VM-exits due to software exceptions (those generated by INT3 or INTO) and privileged
     15827         *    software exceptions (those generated by INT1/ICEBP) we need to supply the VM-exit instruction
     15828         *    length.
    1582215829         */
     15830        case VMX_EXIT_INT_INFO_TYPE_SW_XCPT:
     15831        case VMX_EXIT_INT_INFO_TYPE_PRIV_SW_XCPT:
     15832        {
     15833            rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     15834            RT_FALL_THRU();
     15835        }
    1582315836        case VMX_EXIT_INT_INFO_TYPE_HW_XCPT:
    1582415837        {
    15825 #if 0
    15826             /* Page-faults are subject to masking using its error code. */
    15827             uint32_t fXcptBitmap = pVmcs->u32XcptBitmap;
     15838            rc = hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient);
     15839            AssertRCReturn(rc, rc);
     15840
     15841            uint8_t const  uVector    = VMX_EXIT_INT_INFO_VECTOR(uExitIntInfo);
     15842            bool const     fIntercept = CPUMIsGuestVmxXcptInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, uVector,
     15843                                                                       pVmxTransient->uExitIntErrorCode);
     15844            if (fIntercept)
     15845            {
     15846                rc  = hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     15847                rc |= hmR0VmxReadIdtVectoringInfoVmcs(pVmxTransient);
     15848                rc |= hmR0VmxReadIdtVectoringErrorCodeVmcs(pVmxTransient);
     15849                AssertRCReturn(rc, rc);
     15850
     15851                VMXVEXITINFO ExitInfo;
     15852                RT_ZERO(ExitInfo);
     15853                ExitInfo.cbInstr = pVmxTransient->cbInstr;
     15854                ExitInfo.u64Qual = pVmxTransient->uExitQual;
     15855
     15856                VMXVEXITEVENTINFO ExitEventInfo;
     15857                RT_ZERO(ExitInfo);
     15858                ExitEventInfo.uExitIntInfo         = pVmxTransient->uExitIntInfo;
     15859                ExitEventInfo.uExitIntErrCode      = pVmxTransient->uExitIntErrorCode;
     15860                ExitEventInfo.uIdtVectoringInfo    = pVmxTransient->uIdtVectoringInfo;
     15861                ExitEventInfo.uIdtVectoringErrCode = pVmxTransient->uIdtVectoringErrorCode;
     15862
     15863                return IEMExecVmxVmexitXcpt(pVCpu, &ExitInfo, &ExitEventInfo);
     15864            }
     15865
     15866            /* If it was a #PF and the nested-guest is not intercepting it, forward it to the guest. */
    1582815867            if (uVector == X86_XCPT_PF)
    1582915868            {
    15830                 uint32_t const fXcptPFMask  = pVmcs->u32XcptPFMask;
    15831                 uint32_t const fXcptPFMatch = pVmcs->u32XcptPFMatch;
    15832                 if ((uErrCode & fXcptPFMask) != fXcptPFMatch)
    15833                     fXcptBitmap ^= RT_BIT(X86_XCPT_PF);
     15869                if (pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging)
     15870                {
     15871                    rc  = hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient);
     15872                    rc |= hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     15873                    AssertRCReturn(rc, rc);
     15874
     15875                    hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(uExitIntInfo), 0 /* cbInstr */,
     15876                                           pVmxTransient->uExitIntErrorCode, pVmxTransient->uExitQual);
     15877                }
     15878                return hmR0VmxExitXcptPF(pVCpu, pVmxTransient);
    1583415879            }
    15835 
    15836             /* Consult the exception bitmap for all other hardware exceptions. */
    15837             Assert(uVector <= X86_XCPT_LAST);
    15838             if (fXcptBitmap & RT_BIT(uVector))
    15839                 fIntercept = true;
    15840 #endif
    1584115880            break;
    1584215881        }
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r78926 r78978  
    22362236                             && CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_NMI_EXIT))
    22372237                    {
    2238                         rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexitNmi(pVCpu));
     2238                        rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexitXcptNmi(pVCpu));
    22392239                        Assert(rc2 != VINF_VMX_INTERCEPT_NOT_ACTIVE);
    22402240                        UPDATE_RC();
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