Changeset 75656 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Nov 22, 2018 6:55:12 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/EM.cpp
r75413 r75656 1769 1769 *pfInjected = false; 1770 1770 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. */ 1771 1777 if (CPUMCanVmxNstGstTakePhysIntr(pVCpu, &pVCpu->cpum.GstCtx)) 1772 1778 { 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 1793 1779 Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI); 1794 1780 if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)) 1795 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)) 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 1796 1802 int rc = emR3GstInjectIntr(pVCpu, pfWakeupPending, pfInjected); 1797 1803 if (rc == VINF_VMX_VMEXIT)
Note:
See TracChangeset
for help on using the changeset viewer.