VirtualBox

Changeset 50614 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Feb 26, 2014 6:19:18 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
92489
Message:

VMM/HMVMXR0: Avoid one extra VM-exit while injecting interrupts if interrupt-window exiting was previously there but exited for other reasons.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r50601 r50614  
    69526952            int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_PROC_EXEC, pVCpu->hm.s.vmx.u32ProcCtls);
    69536953            AssertRC(rc);
     6954            Log4(("Setup interrupt-window exiting\n"));
    69546955        }
    69556956    } /* else we will deliver interrupts whenever the guest exits next and is in a state to receive events. */
     6957}
     6958
     6959
     6960/**
     6961 * Clears the interrupt-window exiting control in the VMCS.
     6962 *
     6963 * @param pVCpu             Pointer to the VMCPU.
     6964 */
     6965DECLINLINE(void) hmR0VmxClearIntWindowExitVmcs(PVMCPU pVCpu)
     6966{
     6967    Assert(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT);
     6968    pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT;
     6969    int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_PROC_EXEC, pVCpu->hm.s.vmx.u32ProcCtls);
     6970    AssertRC(rc);
     6971    Log4(("Cleared interrupt-window exiting\n"));
    69566972}
    69576973
     
    70867102    if (pVCpu->hm.s.Event.fPending)
    70877103    {
    7088 #if defined(DEBUG) || defined(VBOX_STRICT) || defined(VBOX_WITH_STATISTICS)
     7104        /*
     7105         * Clear any interrupt-window exiting control if we're going to inject an interrupt. Saves one extra
     7106         * VM-exit in situations where we previously setup interrupt-window exiting but got other VM-exits and
     7107         * ended up enabling interrupts outside VT-x.
     7108         */
    70897109        uint32_t uIntType = VMX_EXIT_INTERRUPTION_INFO_TYPE(pVCpu->hm.s.Event.u64IntInfo);
    7090 #endif
     7110        if (   (pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT)
     7111            && (   uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT
     7112                || uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI))
     7113        {
     7114            Assert(pVCpu->CTX_SUFF(pVM)->hm.s.vmx.Msrs.VmxProcCtls.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT);
     7115            hmR0VmxClearIntWindowExitVmcs(pVCpu);
     7116        }
    70917117#if defined(VBOX_STRICT) || defined(VBOX_WITH_STATISTICS)
    70927118        if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT)
     
    70987124            Assert(!fBlockSti);
    70997125            Assert(!fBlockMovSS);
     7126            Assert(!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT));
    71007127        }
    71017128        else if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI)
     
    71037130            Assert(!fBlockSti);
    71047131            Assert(!fBlockMovSS);
     7132            Assert(!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT));
    71057133        }
    71067134#endif
     
    75297557    /* Clear interrupt-window exiting control. */
    75307558    if (pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT)
    7531     {
    7532         pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT;
    7533         rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_PROC_EXEC, pVCpu->hm.s.vmx.u32ProcCtls);
    7534         AssertRC(rc);
    7535     }
     7559        hmR0VmxClearIntWindowExitVmcs(pVCpu);
    75367560
    75377561    if (!pVCpu->hm.s.Event.fPending)
     
    94439467
    94449468    /* Indicate that we no longer need to VM-exit when the guest is ready to receive interrupts, it is now ready. */
    9445     Assert(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT);
    9446     pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT;
    9447     int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_PROC_EXEC, pVCpu->hm.s.vmx.u32ProcCtls);
    9448     AssertRCReturn(rc, rc);
     9469    hmR0VmxClearIntWindowExitVmcs(pVCpu);
    94499470
    94509471    /* Deliver the pending interrupt via hmR0VmxPreRunGuest()->hmR0VmxInjectEvent() and resume guest execution. */
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