Changeset 50614 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Feb 26, 2014 6:19:18 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 92489
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r50601 r50614 6952 6952 int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_PROC_EXEC, pVCpu->hm.s.vmx.u32ProcCtls); 6953 6953 AssertRC(rc); 6954 Log4(("Setup interrupt-window exiting\n")); 6954 6955 } 6955 6956 } /* 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 */ 6965 DECLINLINE(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")); 6956 6972 } 6957 6973 … … 7086 7102 if (pVCpu->hm.s.Event.fPending) 7087 7103 { 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 */ 7089 7109 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 } 7091 7117 #if defined(VBOX_STRICT) || defined(VBOX_WITH_STATISTICS) 7092 7118 if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT) … … 7098 7124 Assert(!fBlockSti); 7099 7125 Assert(!fBlockMovSS); 7126 Assert(!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT)); 7100 7127 } 7101 7128 else if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI) … … 7103 7130 Assert(!fBlockSti); 7104 7131 Assert(!fBlockMovSS); 7132 Assert(!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_INT_WINDOW_EXIT)); 7105 7133 } 7106 7134 #endif … … 7529 7557 /* Clear interrupt-window exiting control. */ 7530 7558 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); 7536 7560 7537 7561 if (!pVCpu->hm.s.Event.fPending) … … 9443 9467 9444 9468 /* 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); 9449 9470 9450 9471 /* Deliver the pending interrupt via hmR0VmxPreRunGuest()->hmR0VmxInjectEvent() and resume guest execution. */
Note:
See TracChangeset
for help on using the changeset viewer.