VirtualBox

Changeset 82949 in vbox for trunk


Ignore:
Timestamp:
Feb 1, 2020 2:26:43 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
135953
Message:

VMM/HMVMXR0: Fix losing the instruction length of a faulting ICEBP instruction when exiting to ring-3.

File:
1 edited

Legend:

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

    r82919 r82949  
    80798079    if (VMX_IDT_VECTORING_INFO_IS_XCPT_PF(u32IntInfo))
    80808080        TRPMSetFaultAddress(pVCpu, pVCpu->hm.s.Event.GCPtrFaultAddress);
    8081     else if (VMX_IDT_VECTORING_INFO_TYPE(u32IntInfo) == VMX_IDT_VECTORING_INFO_TYPE_SW_INT)
    8082         TRPMSetInstrLength(pVCpu, pVCpu->hm.s.Event.cbInstr);
    8083 
    8084     if (VMX_IDT_VECTORING_INFO_TYPE(u32IntInfo) == VMX_IDT_VECTORING_INFO_TYPE_PRIV_SW_XCPT)
    8085         TRPMSetTrapDueToIcebp(pVCpu);
     8081    else
     8082    {
     8083        uint8_t const uVectorType = VMX_IDT_VECTORING_INFO_TYPE(u32IntInfo);
     8084        switch (uVectorType)
     8085        {
     8086            case VMX_IDT_VECTORING_INFO_TYPE_PRIV_SW_XCPT:
     8087                TRPMSetTrapDueToIcebp(pVCpu);
     8088                RT_FALL_THRU();
     8089            case VMX_IDT_VECTORING_INFO_TYPE_SW_INT:
     8090            case VMX_IDT_VECTORING_INFO_TYPE_SW_XCPT:
     8091            {
     8092                AssertMsg(   uVectorType == VMX_IDT_VECTORING_INFO_TYPE_SW_INT
     8093                          || (   uVector == X86_XCPT_BP /* INT3 */
     8094                              || uVector == X86_XCPT_OF /* INTO */
     8095                              || uVector == X86_XCPT_DB /* INT1 (ICEBP) */),
     8096                          ("Invalid vector: uVector=%#x uVectorType=%#x\n", uVector, uVectorType));
     8097                TRPMSetInstrLength(pVCpu, pVCpu->hm.s.Event.cbInstr);
     8098                break;
     8099            }
     8100        }
     8101    }
    80868102
    80878103    /* We're now done converting the pending event. */
     
    83918407    }
    83928408#ifdef VBOX_STRICT
    8393     else
     8409    /*
     8410     * We check for rcExit here since for errors like VERR_VMX_UNABLE_TO_START_VM (which are
     8411     * fatal), we don't care about verifying duplicate injection of events. Errors like
     8412     * VERR_EM_INTERPRET are converted to their VINF_* counterparts -prior- to  calling this
     8413     * function so those should and will be checked below.
     8414     */
     8415    else if (RT_SUCCESS(rcExit))
    83948416    {
    83958417        /*
Note: See TracChangeset for help on using the changeset viewer.

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