VirtualBox

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


Ignore:
Timestamp:
Nov 22, 2018 6:55:12 AM (6 years ago)
Author:
vboxsync
Message:

VMM/EM: Nested VMX: bugref:9180 Clarify situation regarding interrupt-window exiting.

File:
1 edited

Legend:

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

    r75413 r75656  
    17691769    *pfInjected      = false;
    17701770
     1771    /** @todo NSTVMX: Interrupt-window VM-exits currently only trigger when an
     1772     *        interrupt is pending but in reality it should happen as soon as the
     1773     *        guest is ready to receive interrupts even if no interrupt is pending.
     1774     *        Doing it before checking the VMCPU_FF_INTERRUPT_APIC or
     1775     *        VMCPU_FF_INTERRUPT_PIC here doesn't help as the caller already checks for
     1776     *        it earlier as part of the high-priority pre-mask anyway. */
    17711777    if (CPUMCanVmxNstGstTakePhysIntr(pVCpu, &pVCpu->cpum.GstCtx))
    17721778    {
    1773         Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS));
    1774         if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
    1775         {
    1776             CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK);
    1777             VBOXSTRICTRC rcStrict = IEMExecVmxVmexitIntWindow(pVCpu);
    1778             if (rcStrict != VINF_VMX_INTERCEPT_NOT_ACTIVE)
    1779             {
    1780                 *pfWakeupPending = true;
    1781                 if (RT_SUCCESS(rcStrict))
    1782                 {
    1783                     Assert(rcStrict != VINF_PGM_CHANGE_MODE);
    1784                     if (rcStrict == VINF_VMX_VMEXIT)
    1785                         return VINF_SUCCESS;
    1786                     return VBOXSTRICTRC_VAL(rcStrict);
    1787                 }
    1788                 AssertMsgFailed(("Interrupt-window Vm-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    1789                 return VINF_EM_TRIPLE_FAULT;
    1790             }
    1791         }
    1792 
    17931779        Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI);
    17941780        if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
    17951781        {
     1782            Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS));
     1783            if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
     1784            {
     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                }
     1800            }
     1801
    17961802            int rc = emR3GstInjectIntr(pVCpu, pfWakeupPending, pfInjected);
    17971803            if (rc == VINF_VMX_VMEXIT)
Note: See TracChangeset for help on using the changeset viewer.

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