VirtualBox

Changeset 103194 in vbox for trunk/src


Ignore:
Timestamp:
Feb 5, 2024 7:23:40 AM (16 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
161459
Message:

VMM: Nested VMX: bugref:10318 Distinguish NMI vs. hardware exception 2 in TRPM (VMX and SVM have always made this subtle distinction).

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HMSVMAll.cpp

    r98103 r103194  
    317317        case SVM_EVENT_EXTERNAL_IRQ:    return TRPM_HARDWARE_INT;
    318318        case SVM_EVENT_SOFTWARE_INT:    return TRPM_SOFTWARE_INT;
    319         case SVM_EVENT_NMI:             return TRPM_TRAP;
     319        case SVM_EVENT_NMI:             return TRPM_NMI;
    320320        case SVM_EVENT_EXCEPTION:
    321321        {
  • trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp

    r100139 r103194  
    11931193
    11941194        case VMX_IDT_VECTORING_INFO_TYPE_NMI:
     1195            Assert(uVector == X86_XCPT_NMI); NOREF(uVector);
     1196            enmTrapType = TRPM_NMI;
     1197            break;
     1198
    11951199        case VMX_IDT_VECTORING_INFO_TYPE_HW_XCPT:
    11961200            enmTrapType = TRPM_TRAP;
     
    12381242        switch (uVector)
    12391243        {
    1240             case X86_XCPT_NMI:
    1241                 uIntInfoType |= (VMX_IDT_VECTORING_INFO_TYPE_NMI << VMX_IDT_VECTORING_INFO_TYPE_SHIFT);
    1242                 break;
    1243 
    12441244            case X86_XCPT_BP:
    12451245            case X86_XCPT_OF:
     
    12891289        }
    12901290    }
     1291    else if (enmTrpmEvent == TRPM_NMI)
     1292        uIntInfoType |= (VMX_IDT_VECTORING_INFO_TYPE_NMI << VMX_IDT_VECTORING_INFO_TYPE_SHIFT);
    12911293    else
    12921294        AssertMsgFailed(("Invalid TRPM event type %d\n", enmTrpmEvent));
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r102977 r103194  
    98299829
    98309830        case TRPM_TRAP:
     9831        case TRPM_NMI: /** @todo Distinguish NMI from exception 2. */
    98319832            Log(("IEMInjectTrap: %#4x trap err=%#x cr2=%#RGv\n", u8TrapNo, uErrCode, uCr2));
    98329833            fFlags = IEM_XCPT_FLAGS_T_CPU_XCPT;
  • trunk/src/VBox/VMM/VMMAll/TRPMAll.cpp

    r98103 r103194  
    227227    }
    228228
     229    /* NMI TRPM type must specify the vector as 2 (NMI). */
     230    Assert(enmType != TRPM_NMI || u8TrapNo == X86_XCPT_NMI);
     231
    229232    pVCpu->trpm.s.uActiveVector               = u8TrapNo;
    230233    pVCpu->trpm.s.enmActiveType               = enmType;
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r100357 r103194  
    34163416        switch (uVector)
    34173417        {
    3418             case X86_XCPT_NMI:
    3419             {
    3420                 Event.n.u3Type = SVM_EVENT_NMI;
    3421                 break;
    3422             }
    3423 
    34243418            case X86_XCPT_BP:
    34253419            case X86_XCPT_OF:
     
    34453439    else if (enmTrpmEvent == TRPM_SOFTWARE_INT)
    34463440        Event.n.u3Type = SVM_EVENT_SOFTWARE_INT;
     3441    else if (enmTrpmEvent == TRPM_NMI)
     3442        Event.n.u3Type = SVM_EVENT_NMI;
    34473443    else
    34483444        AssertMsgFailed(("Invalid TRPM event type %d\n", enmTrpmEvent));
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r102977 r103194  
    18501850# endif
    18511851                    {
    1852                         rc2 = TRPMAssertTrap(pVCpu, X86_XCPT_NMI, TRPM_TRAP);
     1852                        rc2 = TRPMAssertTrap(pVCpu, X86_XCPT_NMI, TRPM_NMI);
    18531853                        if (rc2 == VINF_SUCCESS)
    18541854                        {
  • trunk/src/VBox/VMM/VMMR3/TRPM.cpp

    r100140 r103194  
    114114*********************************************************************************************************************************/
    115115/** TRPM saved state version. */
    116 #define TRPM_SAVED_STATE_VERSION                10
     116#define TRPM_SAVED_STATE_VERSION                11
     117#define TRPM_SAVED_STATE_VERSION_PRE_NMI        10  /* NMI TRPM event type bumped the version */
    117118#define TRPM_SAVED_STATE_VERSION_PRE_ICEBP      9   /* INT1/ICEBP support bumped the version */
    118119#define TRPM_SAVED_STATE_VERSION_UNI            8   /* SMP support bumped the version */
     
    283284     */
    284285    if (    uVersion != TRPM_SAVED_STATE_VERSION
     286        &&  uVersion != TRPM_SAVED_STATE_VERSION_PRE_NMI
    285287        &&  uVersion != TRPM_SAVED_STATE_VERSION_PRE_ICEBP
    286288        &&  uVersion != TRPM_SAVED_STATE_VERSION_UNI)
     
    290292    }
    291293
    292     if (uVersion == TRPM_SAVED_STATE_VERSION)
     294    if (uVersion >= TRPM_SAVED_STATE_VERSION_PRE_NMI)
    293295    {
    294296        for (VMCPUID i = 0; i < pVM->cCpus; i++)
     
    350352         */
    351353        SSMR3SkipToEndOfUnit(pSSM);
     354    }
     355
     356    /*
     357     * For saved-state verions prior to introducing NMI as a separate type, convert
     358     * traps with vector 2 as NMI since the rest of VirtualBox code now expects this.
     359     */
     360    if (uVersion <= TRPM_SAVED_STATE_VERSION_PRE_NMI)
     361    {
     362        for (VMCPUID i = 0; i < pVM->cCpus; i++)
     363        {
     364            PTRPMCPU pTrpmCpu = &pVM->apCpusR3[i]->trpm.s;
     365            AssertLogRelMsgReturn(pTrpmCpu->enmActiveType != TRPM_NMI,
     366                                  ("TRPM event type (%#RX32) invalid for saved-state version %u!",
     367                                   pTrpmCpu->enmActiveType, uVersion), VERR_SSM_ENUM_VALUE_OUT_OF_RANGE);
     368            if (   pTrpmCpu->uActiveVector == X86_XCPT_NMI
     369                && pTrpmCpu->enmActiveType == TRPM_TRAP)
     370                pTrpmCpu->enmActiveType = TRPM_NMI;
     371        }
    352372    }
    353373
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