Changeset 79843 in vbox
- Timestamp:
- Jul 17, 2019 5:42:11 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 132230
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/EM.cpp
r79831 r79843 1717 1717 * 1718 1718 * @returns VBox status code. 1719 * @retval VINF_NO_CHANGE if the VMX external interrupt intercept was not active. 1719 1720 * @param pVCpu The cross context virtual CPU structure. 1720 1721 */ … … 1722 1723 { 1723 1724 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX 1724 Assert(CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx));1725 1726 1725 /* Handle the "external interrupt" VM-exit intercept. */ 1727 1726 if ( CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_EXT_INT_EXIT) … … 1746 1745 * 1747 1746 * @returns VBox status code. 1747 * @retval VINF_NO_CHANGE if the SVM external interrupt intercept was not active. 1748 1748 * @param pVCpu The cross context virtual CPU structure. 1749 1749 */ … … 1751 1751 { 1752 1752 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM 1753 Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx));1754 1755 1753 /* Handle the physical interrupt intercept (can be masked by the guest hypervisor). */ 1756 if ( CPUMIsGuestPhysIntrEnabled(pVCpu) 1757 && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR)) 1754 if (CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR)) 1758 1755 { 1759 1756 CPUM_ASSERT_NOT_EXTRN(pVCpu, IEM_CPUMCTX_EXTRN_SVM_VMEXIT_MASK); … … 1781 1778 * 1782 1779 * @returns VBox status code. 1780 * @retval VINF_NO_CHANGE if the SVM virtual interrupt intercept was not active. 1783 1781 * @param pVCpu The cross context virtual CPU structure. 1784 1782 */ … … 2166 2164 && !TRPMHasTrap(pVCpu)) /* An event could already be scheduled for dispatching. */ 2167 2165 { 2166 bool fInVmxNonRootMode; 2167 bool fInSvmHwvirtMode; 2168 bool const fInNestedGuest = CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx); 2169 if (fInNestedGuest) 2170 { 2171 fInVmxNonRootMode = CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx); 2172 fInSvmHwvirtMode = CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx); 2173 } 2174 else 2175 { 2176 fInVmxNonRootMode = false; 2177 fInSvmHwvirtMode = false; 2178 } 2179 2168 2180 bool fGif = CPUMGetGuestGif(&pVCpu->cpum.GstCtx); 2169 2181 #ifdef VBOX_WITH_RAW_MODE … … 2202 2214 { 2203 2215 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX 2204 if ( CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)2216 if ( fInVmxNonRootMode 2205 2217 && CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_NMI_EXIT)) 2206 2218 { … … 2212 2224 #endif 2213 2225 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM 2214 if ( CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)2226 if ( fInSvmHwvirtMode 2215 2227 && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_NMI)) 2216 2228 { … … 2271 2283 * SVM: physical interrupts takes priority over virtual interrupts. 2272 2284 */ 2273 if ( VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)2274 && CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)2285 if ( fInVmxNonRootMode 2286 && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST) 2275 2287 && CPUMIsGuestVmxVirtIntrEnabled(pVCpu, &pVCpu->cpum.GstCtx)) 2276 2288 { 2277 2289 /** @todo NSTVMX: virtual-interrupt delivery. */ 2278 rc2 = VINF_ NO_CHANGE;2290 rc2 = VINF_SUCCESS; 2279 2291 } 2280 else if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)) 2292 else if ( VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC) 2293 && CPUMIsGuestPhysIntrEnabled(pVCpu)) 2281 2294 { 2282 bool fInjected = false;2283 2295 Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI); 2284 2285 if (!CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx)) 2286 { 2287 if (CPUMIsGuestPhysIntrEnabled(pVCpu)) 2288 rc2 = VINF_NO_CHANGE; 2289 else 2290 rc2 = VINF_SUCCESS; 2291 } 2292 else if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)) 2296 if (fInVmxNonRootMode) 2293 2297 rc2 = emR3VmxNstGstIntrIntercept(pVCpu); 2298 else if (fInSvmHwvirtMode) 2299 rc2 = emR3SvmNstGstIntrIntercept(pVCpu); 2294 2300 else 2295 { 2296 Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)); 2297 rc2 = emR3SvmNstGstIntrIntercept(pVCpu); 2298 } 2299 2300 /* If no interrupt has been injected so far, do so now. */ 2301 rc2 = VINF_NO_CHANGE; 2302 2301 2303 if (rc2 == VINF_NO_CHANGE) 2302 2304 { 2305 bool fInjected = false; 2303 2306 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_XCPT_MASK); 2304 2307 /** @todo this really isn't nice, should properly handle this */ … … 2312 2315 rc2 = VINF_EM_RESCHEDULE; 2313 2316 } 2317 #ifdef VBOX_STRICT 2318 if (fInjected) 2319 rcIrq = rc2; 2320 #endif 2314 2321 } 2315 #ifdef VBOX_STRICT2316 if (fInjected)2317 rcIrq = rc2;2318 #endif2319 2322 UPDATE_RC(); 2320 2323 } 2321 else if ( VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)2322 && CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)2324 else if ( fInSvmHwvirtMode 2325 && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST) 2323 2326 && CPUMIsGuestSvmVirtIntrEnabled(pVCpu, &pVCpu->cpum.GstCtx)) 2324 2327 {
Note:
See TracChangeset
for help on using the changeset viewer.