VirtualBox

Changeset 77159 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 5, 2019 7:32:22 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128634
Message:

VMM/EM: Nested VMX: bugref:9180 Fix injecting interrupts into the nested-guest.

File:
1 edited

Legend:

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

    r76856 r77159  
    17361736#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    17371737    Assert(CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx));
    1738     if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
     1738
     1739    /* Handle the "interrupt-window" VM-exit intercept. */
     1740    if (   CPUMIsGuestPhysIntrEnabled(pVCpu)
     1741        && CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
    17391742    {
    17401743        CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK);
     
    17421745        if (RT_SUCCESS(rcStrict))
    17431746        {
    1744             Assert(rcStrict != VINF_PGM_CHANGE_MODE);
    1745             Assert(rcStrict != VINF_VMX_VMEXIT);
     1747            AssertMsg(   rcStrict != VINF_PGM_CHANGE_MODE
     1748                      && rcStrict != VINF_VMX_VMEXIT
     1749                      && rcStrict != VINF_NO_CHANGE, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    17461750            return VBOXSTRICTRC_VAL(rcStrict);
    17471751        }
    1748         AssertMsgFailed(("Interrupt-window Vm-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     1752
     1753        AssertMsgFailed(("Interrupt-window VM-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    17491754        return VINF_EM_TRIPLE_FAULT;
    17501755    }
     1756
    17511757    /* Handle the "external interrupt" VM-exit intercept. */
    1752     else if (CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_EXT_INT_EXIT))
    1753     {
     1758    if (CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_EXT_INT_EXIT))
     1759    {
     1760        CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK);
    17541761        VBOXSTRICTRC rcStrict = IEMExecVmxVmexitExtInt(pVCpu, 0 /* uVector */, true /* fIntPending */);
    1755         Assert(rcStrict != VINF_PGM_CHANGE_MODE);
    1756         Assert(rcStrict != VINF_VMX_VMEXIT);
     1762        AssertMsg(   rcStrict != VINF_PGM_CHANGE_MODE
     1763                  && rcStrict != VINF_VMX_VMEXIT
     1764                  && rcStrict != VINF_NO_CHANGE, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    17571765        if (rcStrict != VINF_VMX_INTERCEPT_NOT_ACTIVE)
    17581766            return VBOXSTRICTRC_TODO(rcStrict);
     
    17751783#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    17761784    Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx));
    1777     if (CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR))
     1785
     1786    /* Handle the physical interrupt intercept (can be masked by the guest hypervisor). */
     1787    if (   CPUMIsGuestPhysIntrEnabled(pVCpu)
     1788        && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR))
    17781789    {
    17791790        CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_SVM_VMEXIT_MASK);
     
    17811792        if (RT_SUCCESS(rcStrict))
    17821793        {
    1783             Assert(rcStrict != VINF_PGM_CHANGE_MODE);
    1784             Assert(rcStrict != VINF_SVM_VMEXIT);
     1794            AssertMsg(   rcStrict != VINF_PGM_CHANGE_MODE
     1795                      && rcStrict != VINF_SVM_VMEXIT
     1796                      && rcStrict != VINF_NO_CHANGE, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    17851797            return VBOXSTRICTRC_VAL(rcStrict);
    17861798        }
     1799
    17871800        AssertMsgFailed(("INTR #VMEXIT failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    17881801        return VINF_EM_TRIPLE_FAULT;
     
    22182231                        rc2 = VINF_NO_CHANGE;
    22192232                    }
    2220                     else if (   VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)
    2221                              && CPUMIsGuestPhysIntrEnabled(pVCpu))
     2233                    else if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
    22222234                    {
    22232235                        bool fInjected = false;
    22242236                        Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI);
    22252237
    2226                         if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx))
     2238                        if (!CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx))
     2239                        {
     2240                            if (CPUMIsGuestPhysIntrEnabled(pVCpu))
     2241                                rc2 = VINF_NO_CHANGE;
     2242                            else
     2243                                rc2 = VINF_SUCCESS;
     2244                        }
     2245                        else if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx))
    22272246                            rc2 = emR3VmxNstGstIntrIntercept(pVCpu);
    2228                         else if (CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx))
     2247                        else
     2248                        {
     2249                            Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx));
    22292250                            rc2 = emR3SvmNstGstIntrIntercept(pVCpu);
    2230                         else
    2231                             rc2 = VINF_NO_CHANGE;
    2232 
     2251                        }
     2252
     2253                        /* If no interrupt has been injected so far, do so now. */
    22332254                        if (rc2 == VINF_NO_CHANGE)
    22342255                        {
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