VirtualBox

Changeset 79097 in vbox


Ignore:
Timestamp:
Jun 12, 2019 7:27:10 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131259
Message:

VMM/EM: Nested VMX: bugref:9180 NMI VMX/SVM intercepts must be done -before- injecting an NMI (through TRPM or otherwise). Fix ordering.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r78985 r79097  
    22002200                    && !VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_BLOCK_NMIS))
    22012201                {
    2202                     if (!CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx))
     2202#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
     2203                    if (   CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)
     2204                        && CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_NMI_EXIT))
     2205                    {
     2206                        rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexitXcptNmi(pVCpu));
     2207                        Assert(rc2 != VINF_VMX_INTERCEPT_NOT_ACTIVE);
     2208                        UPDATE_RC();
     2209                    }
     2210#endif
     2211#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     2212                    else if (   CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)
     2213                             && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_NMI))
     2214                    {
     2215                        rc2 = VBOXSTRICTRC_VAL(IEMExecSvmVmexit(pVCpu, SVM_EXIT_NMI, 0 /* uExitInfo1 */,  0 /* uExitInfo2 */));
     2216                        AssertMsg(   rc2 != VINF_PGM_CHANGE_MODE
     2217                                  && rc2 != VINF_SVM_VMEXIT
     2218                                  && rc2 != VINF_NO_CHANGE, ("%Rrc\n", rc2));
     2219                        UPDATE_RC();
     2220                    }
     2221                    else
     2222#endif
    22032223                    {
    22042224                        rc2 = TRPMAssertTrap(pVCpu, X86_XCPT_NMI, TRPM_TRAP);
     
    22182238                        UPDATE_RC();
    22192239                    }
    2220 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    2221                     else if (   CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)
    2222                              && CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_NMI_EXIT))
    2223                     {
    2224                         rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexitXcptNmi(pVCpu));
    2225                         Assert(rc2 != VINF_VMX_INTERCEPT_NOT_ACTIVE);
    2226                         UPDATE_RC();
    2227                     }
    2228 #endif
    2229 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    2230                     else if (   CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)
    2231                              && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_NMI))
    2232                     {
    2233                         rc2 = VBOXSTRICTRC_VAL(IEMExecSvmVmexit(pVCpu, SVM_EXIT_NMI, 0 /* uExitInfo1 */,  0 /* uExitInfo2 */));
    2234                         AssertMsg(   rc2 != VINF_PGM_CHANGE_MODE
    2235                                   && rc2 != VINF_SVM_VMEXIT
    2236                                   && rc2 != VINF_NO_CHANGE, ("%Rrc\n", rc2));
    2237                         UPDATE_RC();
    2238                     }
    2239 #endif
    22402240                }
    22412241#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
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