Changeset 77159 in vbox for trunk/src/VBox
- Timestamp:
- Feb 5, 2019 7:32:22 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 128634
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/EM.cpp
r76856 r77159 1736 1736 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX 1737 1737 Assert(CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)); 1738 if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT)) 1738 1739 /* Handle the "interrupt-window" VM-exit intercept. */ 1740 if ( CPUMIsGuestPhysIntrEnabled(pVCpu) 1741 && CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT)) 1739 1742 { 1740 1743 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK); … … 1742 1745 if (RT_SUCCESS(rcStrict)) 1743 1746 { 1744 Assert(rcStrict != VINF_PGM_CHANGE_MODE); 1745 Assert(rcStrict != VINF_VMX_VMEXIT); 1747 AssertMsg( rcStrict != VINF_PGM_CHANGE_MODE 1748 && rcStrict != VINF_VMX_VMEXIT 1749 && rcStrict != VINF_NO_CHANGE, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 1746 1750 return VBOXSTRICTRC_VAL(rcStrict); 1747 1751 } 1748 AssertMsgFailed(("Interrupt-window Vm-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 1752 1753 AssertMsgFailed(("Interrupt-window VM-exit failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 1749 1754 return VINF_EM_TRIPLE_FAULT; 1750 1755 } 1756 1751 1757 /* Handle the "external interrupt" VM-exit intercept. */ 1752 else if (CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_EXT_INT_EXIT)) 1753 { 1758 if (CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_EXT_INT_EXIT)) 1759 { 1760 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK); 1754 1761 VBOXSTRICTRC rcStrict = IEMExecVmxVmexitExtInt(pVCpu, 0 /* uVector */, true /* fIntPending */); 1755 Assert(rcStrict != VINF_PGM_CHANGE_MODE); 1756 Assert(rcStrict != VINF_VMX_VMEXIT); 1762 AssertMsg( rcStrict != VINF_PGM_CHANGE_MODE 1763 && rcStrict != VINF_VMX_VMEXIT 1764 && rcStrict != VINF_NO_CHANGE, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 1757 1765 if (rcStrict != VINF_VMX_INTERCEPT_NOT_ACTIVE) 1758 1766 return VBOXSTRICTRC_TODO(rcStrict); … … 1775 1783 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM 1776 1784 Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)); 1777 if (CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR)) 1785 1786 /* Handle the physical interrupt intercept (can be masked by the guest hypervisor). */ 1787 if ( CPUMIsGuestPhysIntrEnabled(pVCpu) 1788 && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR)) 1778 1789 { 1779 1790 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_SVM_VMEXIT_MASK); … … 1781 1792 if (RT_SUCCESS(rcStrict)) 1782 1793 { 1783 Assert(rcStrict != VINF_PGM_CHANGE_MODE); 1784 Assert(rcStrict != VINF_SVM_VMEXIT); 1794 AssertMsg( rcStrict != VINF_PGM_CHANGE_MODE 1795 && rcStrict != VINF_SVM_VMEXIT 1796 && rcStrict != VINF_NO_CHANGE, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 1785 1797 return VBOXSTRICTRC_VAL(rcStrict); 1786 1798 } 1799 1787 1800 AssertMsgFailed(("INTR #VMEXIT failed! rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 1788 1801 return VINF_EM_TRIPLE_FAULT; … … 2218 2231 rc2 = VINF_NO_CHANGE; 2219 2232 } 2220 else if ( VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC) 2221 && CPUMIsGuestPhysIntrEnabled(pVCpu)) 2233 else if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)) 2222 2234 { 2223 2235 bool fInjected = false; 2224 2236 Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI); 2225 2237 2226 if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)) 2238 if (!CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx)) 2239 { 2240 if (CPUMIsGuestPhysIntrEnabled(pVCpu)) 2241 rc2 = VINF_NO_CHANGE; 2242 else 2243 rc2 = VINF_SUCCESS; 2244 } 2245 else if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)) 2227 2246 rc2 = emR3VmxNstGstIntrIntercept(pVCpu); 2228 else if (CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)) 2247 else 2248 { 2249 Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)); 2229 2250 rc2 = emR3SvmNstGstIntrIntercept(pVCpu); 2230 else2231 rc2 = VINF_NO_CHANGE; 2232 2251 } 2252 2253 /* If no interrupt has been injected so far, do so now. */ 2233 2254 if (rc2 == VINF_NO_CHANGE) 2234 2255 {
Note:
See TracChangeset
for help on using the changeset viewer.