VirtualBox

Changeset 75657 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Nov 22, 2018 6:58:18 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
126839
Message:

VMM/EM: Nested VMX: bugref:9180 Fix interrupt-window exiting.

File:
1 edited

Legend:

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

    r75656 r75657  
    17751775     *        VMCPU_FF_INTERRUPT_PIC here doesn't help as the caller already checks for
    17761776     *        it earlier as part of the high-priority pre-mask anyway. */
    1777     if (CPUMCanVmxNstGstTakePhysIntr(pVCpu, &pVCpu->cpum.GstCtx))
     1777    if (   VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)
     1778        && CPUMCanVmxNstGstTakePhysIntr(pVCpu, &pVCpu->cpum.GstCtx))
    17781779    {
    17791780        Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI);
    1780         if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
    1781         {
    1782             Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS));
    1783             if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
     1781        Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS));
     1782        if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
     1783        {
     1784            CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK);
     1785            VBOXSTRICTRC rcStrict = IEMExecVmxVmexitIntWindow(pVCpu);
     1786            if (RT_SUCCESS(rcStrict))
    17841787            {
    1785                 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK);
    1786                 VBOXSTRICTRC rcStrict = IEMExecVmxVmexitIntWindow(pVCpu);
    1787                 if (rcStrict != VINF_VMX_INTERCEPT_NOT_ACTIVE)
    1788                 {
    1789                     *pfWakeupPending = true;
    1790                     if (RT_SUCCESS(rcStrict))
    1791                     {
    1792                         Assert(rcStrict != VINF_PGM_CHANGE_MODE);
    1793                         if (rcStrict == VINF_VMX_VMEXIT)
    1794                             return VINF_SUCCESS;
    1795                         return VBOXSTRICTRC_VAL(rcStrict);
    1796                     }
    1797                     AssertMsgFailed(("Interrupt-window Vm-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    1798                     return VINF_EM_TRIPLE_FAULT;
    1799                 }
     1788                *pfWakeupPending = true;
     1789                Assert(rcStrict != VINF_PGM_CHANGE_MODE);
     1790                if (rcStrict == VINF_VMX_VMEXIT)
     1791                    return VINF_SUCCESS;
     1792                return VBOXSTRICTRC_VAL(rcStrict);
    18001793            }
    1801 
    1802             int rc = emR3GstInjectIntr(pVCpu, pfWakeupPending, pfInjected);
    1803             if (rc == VINF_VMX_VMEXIT)
    1804                 rc = VINF_SUCCESS;
    1805             return rc;
    1806         }
     1794            AssertMsgFailed(("Interrupt-window Vm-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     1795            return VINF_EM_TRIPLE_FAULT;
     1796        }
     1797
     1798        int rc = emR3GstInjectIntr(pVCpu, pfWakeupPending, pfInjected);
     1799        if (rc == VINF_VMX_VMEXIT)
     1800            rc = VINF_SUCCESS;
     1801        return rc;
    18071802    }
    18081803
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