Changeset 71833 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Apr 12, 2018 7:20:33 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 122040
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/HMSVMAll.cpp
r71755 r71833 156 156 * fields that are potentially modified by hardware-assisted SVM. 157 157 */ 158 pVmcbNstGstCtrl->u16InterceptRdCRx = pNstGstVmcbCache->u16InterceptRdCRx; 159 pVmcbNstGstCtrl->u16InterceptWrCRx = pNstGstVmcbCache->u16InterceptWrCRx; 160 pVmcbNstGstCtrl->u16InterceptRdDRx = pNstGstVmcbCache->u16InterceptRdDRx; 161 pVmcbNstGstCtrl->u16InterceptWrDRx = pNstGstVmcbCache->u16InterceptWrDRx; 162 pVmcbNstGstCtrl->u32InterceptXcpt = pNstGstVmcbCache->u32InterceptXcpt; 163 pVmcbNstGstCtrl->u64InterceptCtrl = pNstGstVmcbCache->u64InterceptCtrl; 164 pVmcbNstGstState->u64DBGCTL = pNstGstVmcbCache->u64DBGCTL; 165 pVmcbNstGstCtrl->u32VmcbCleanBits = pNstGstVmcbCache->u32VmcbCleanBits; 166 pVmcbNstGstCtrl->u64IOPMPhysAddr = pNstGstVmcbCache->u64IOPMPhysAddr; 167 pVmcbNstGstCtrl->u64MSRPMPhysAddr = pNstGstVmcbCache->u64MSRPMPhysAddr; 168 pVmcbNstGstCtrl->u64TSCOffset = pNstGstVmcbCache->u64TSCOffset; 169 pVmcbNstGstCtrl->IntCtrl.n.u1VIntrMasking = pNstGstVmcbCache->fVIntrMasking; 170 pVmcbNstGstCtrl->TLBCtrl = pNstGstVmcbCache->TLBCtrl; 158 pVmcbNstGstCtrl->u16InterceptRdCRx = pNstGstVmcbCache->u16InterceptRdCRx; 159 pVmcbNstGstCtrl->u16InterceptWrCRx = pNstGstVmcbCache->u16InterceptWrCRx; 160 pVmcbNstGstCtrl->u16InterceptRdDRx = pNstGstVmcbCache->u16InterceptRdDRx; 161 pVmcbNstGstCtrl->u16InterceptWrDRx = pNstGstVmcbCache->u16InterceptWrDRx; 162 pVmcbNstGstCtrl->u16PauseFilterCount = pNstGstVmcbCache->u16PauseFilterCount; 163 pVmcbNstGstCtrl->u16PauseFilterThreshold = pNstGstVmcbCache->u16PauseFilterThreshold; 164 pVmcbNstGstCtrl->u32InterceptXcpt = pNstGstVmcbCache->u32InterceptXcpt; 165 pVmcbNstGstCtrl->u64InterceptCtrl = pNstGstVmcbCache->u64InterceptCtrl; 166 pVmcbNstGstState->u64DBGCTL = pNstGstVmcbCache->u64DBGCTL; 167 pVmcbNstGstCtrl->u32VmcbCleanBits = pNstGstVmcbCache->u32VmcbCleanBits; 168 pVmcbNstGstCtrl->u64IOPMPhysAddr = pNstGstVmcbCache->u64IOPMPhysAddr; 169 pVmcbNstGstCtrl->u64MSRPMPhysAddr = pNstGstVmcbCache->u64MSRPMPhysAddr; 170 pVmcbNstGstCtrl->u64TSCOffset = pNstGstVmcbCache->u64TSCOffset; 171 pVmcbNstGstCtrl->IntCtrl.n.u1VIntrMasking = pNstGstVmcbCache->fVIntrMasking; 172 pVmcbNstGstCtrl->TLBCtrl = pNstGstVmcbCache->TLBCtrl; 171 173 172 174 /* … … 583 585 584 586 /** 587 * Returns the nested-guest VMCB pause-filter count. 588 * 589 * @returns The pause-filter count. 590 * @param pVCpu The cross context virtual CPU structure of the calling EMT. 591 * @param pCtx Pointer to the context. 592 */ 593 VMM_INT_DECL(uint16_t) HMGetGuestSvmPauseFilterCount(PVMCPU pVCpu, PCCPUMCTX pCtx) 594 { 595 Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx); 596 PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache; 597 return pVmcbNstGstCache->u16PauseFilterCount; 598 } 599 600 601 /** 585 602 * Checks whether the SVM nested-guest is in a state to receive physical (APIC) 586 603 * interrupts. -
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r71814 r71833 1041 1041 if (fPauseFilterThreshold) 1042 1042 pVmcb->ctrl.u16PauseFilterThreshold = pVM->hm.s.svm.cPauseFilterThresholdTicks; 1043 pVmcb->ctrl.u 32InterceptXcpt|= SVM_CTRL_INTERCEPT_PAUSE;1043 pVmcb->ctrl.u64InterceptCtrl |= SVM_CTRL_INTERCEPT_PAUSE; 1044 1044 } 1045 1045 … … 2048 2048 * @param pCtx Pointer to the guest-CPU context. 2049 2049 */ 2050 static void hmR0SvmLoadGuestXcptInterceptsNested(PVMCPU pVCpu, PSVMVMCB pVmcbNstGst, PCPUMCTX pCtx) 2051 { 2052 RT_NOREF(pCtx); 2050 static void hmR0SvmLoadGuestInterceptsNested(PVMCPU pVCpu, PSVMVMCB pVmcbNstGst, PCPUMCTX pCtx) 2051 { 2053 2052 if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_XCPT_INTERCEPTS)) 2054 2053 { 2055 PSVMVMCB pVmcb = pVCpu->hm.s.svm.pVmcb; 2054 PVM pVM = pVCpu->CTX_SUFF(pVM); 2055 PCSVMVMCB pVmcb = pVCpu->hm.s.svm.pVmcb; 2056 PSVMVMCBCTRL pVmcbNstGstCtrl = &pVmcbNstGst->ctrl; 2056 2057 2057 2058 /* Merge the guest's CR intercepts into the nested-guest VMCB. */ 2058 pVmcbNstGst ->ctrl.u16InterceptRdCRx |= pVmcb->ctrl.u16InterceptRdCRx;2059 pVmcbNstGst ->ctrl.u16InterceptWrCRx |= pVmcb->ctrl.u16InterceptWrCRx;2059 pVmcbNstGstCtrl->u16InterceptRdCRx |= pVmcb->ctrl.u16InterceptRdCRx; 2060 pVmcbNstGstCtrl->u16InterceptWrCRx |= pVmcb->ctrl.u16InterceptWrCRx; 2060 2061 2061 2062 /* Always intercept CR4 writes for tracking PGM mode changes. */ 2062 pVmcbNstGst ->ctrl.u16InterceptWrCRx |= RT_BIT(4);2063 pVmcbNstGstCtrl->u16InterceptWrCRx |= RT_BIT(4); 2063 2064 2064 2065 /* Without nested paging, intercept CR3 reads and writes as we load shadow page tables. */ 2065 if (!pV Cpu->CTX_SUFF(pVM)->hm.s.fNestedPaging)2066 { 2067 pVmcbNstGst ->ctrl.u16InterceptRdCRx |= RT_BIT(3);2068 pVmcbNstGst ->ctrl.u16InterceptWrCRx |= RT_BIT(3);2066 if (!pVM->hm.s.fNestedPaging) 2067 { 2068 pVmcbNstGstCtrl->u16InterceptRdCRx |= RT_BIT(3); 2069 pVmcbNstGstCtrl->u16InterceptWrCRx |= RT_BIT(3); 2069 2070 } 2070 2071 2071 2072 /** @todo Figure out debugging with nested-guests, till then just intercept 2072 2073 * all DR[0-15] accesses. */ 2073 pVmcbNstGst ->ctrl.u16InterceptRdDRx |= 0xffff;2074 pVmcbNstGst ->ctrl.u16InterceptWrDRx |= 0xffff;2074 pVmcbNstGstCtrl->u16InterceptRdDRx |= 0xffff; 2075 pVmcbNstGstCtrl->u16InterceptWrDRx |= 0xffff; 2075 2076 2076 2077 /* … … 2087 2088 */ 2088 2089 #ifndef HMSVM_ALWAYS_TRAP_ALL_XCPTS 2089 pVmcbNstGst ->ctrl.u32InterceptXcpt |= (pVmcb->ctrl.u32InterceptXcpt & ~( RT_BIT(X86_XCPT_UD)2090 pVmcbNstGstCtrl->u32InterceptXcpt |= (pVmcb->ctrl.u32InterceptXcpt & ~( RT_BIT(X86_XCPT_UD) 2090 2091 | RT_BIT(X86_XCPT_BP))); 2091 2092 #else 2092 pVmcbNstGst ->ctrl.u32InterceptXcpt |= pVmcb->ctrl.u32InterceptXcpt;2093 pVmcbNstGstCtrl->u32InterceptXcpt |= pVmcb->ctrl.u32InterceptXcpt; 2093 2094 #endif 2094 2095 … … 2103 2104 * the nested-guest, the physical CPU raises a \#UD exception as expected. 2104 2105 */ 2105 pVmcbNstGst ->ctrl.u64InterceptCtrl |= (pVmcb->ctrl.u64InterceptCtrl & ~( SVM_CTRL_INTERCEPT_VINTR2106 2107 2108 2109 Assert( (pVmcbNstGst ->ctrl.u64InterceptCtrl & HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS)2106 pVmcbNstGstCtrl->u64InterceptCtrl |= (pVmcb->ctrl.u64InterceptCtrl & ~( SVM_CTRL_INTERCEPT_VINTR 2107 | SVM_CTRL_INTERCEPT_VMMCALL)) 2108 | HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS; 2109 2110 Assert( (pVmcbNstGstCtrl->u64InterceptCtrl & HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS) 2110 2111 == HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS); 2112 2113 /* 2114 * Ensure the nested-guest pause-filter counters don't exceed the outer guest values esp. 2115 * since SVM doesn't have a preemption timer. 2116 * 2117 * We do this here rather than in hmR0SvmVmRunSetupVmcb() as we may have been executing the 2118 * nested-guest in IEM incl. PAUSE instructions which would update the pause-filter counters. 2119 */ 2120 if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_PAUSE)) 2121 { 2122 pVmcbNstGstCtrl->u16PauseFilterCount = RT_MIN(pCtx->hwvirt.svm.cPauseFilter, pVmcb->ctrl.u16PauseFilterCount); 2123 pVmcbNstGstCtrl->u16PauseFilterThreshold = RT_MIN(pCtx->hwvirt.svm.cPauseFilterThreshold, 2124 pVmcb->ctrl.u16PauseFilterThreshold); 2125 } 2126 else 2127 { 2128 pVmcbNstGstCtrl->u16PauseFilterCount = pVmcb->ctrl.u16PauseFilterCount; 2129 pVmcbNstGstCtrl->u16PauseFilterThreshold = pVmcb->ctrl.u16PauseFilterThreshold; 2130 } 2111 2131 2112 2132 /** @todo This doesn't make sense. Re-think and remove. */ … … 2118 2138 if (!pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fSvmVirtVmsaveVmload) 2119 2139 { 2120 pVmcbNstGst ->ctrl.u64InterceptCtrl |= SVM_CTRL_INTERCEPT_VMSAVE2121 2140 pVmcbNstGstCtrl->u64InterceptCtrl |= SVM_CTRL_INTERCEPT_VMSAVE 2141 | SVM_CTRL_INTERCEPT_VMLOAD; 2122 2142 } 2123 2143 … … 2128 2148 if (!pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fSvmVGif) 2129 2149 { 2130 pVmcbNstGst ->ctrl.u64InterceptCtrl |= SVM_CTRL_INTERCEPT_CLGI2131 2150 pVmcbNstGstCtrl->u64InterceptCtrl |= SVM_CTRL_INTERCEPT_CLGI 2151 | SVM_CTRL_INTERCEPT_STGI; 2132 2152 } 2133 2153 #endif 2134 2154 2135 2155 /* Finally, update the VMCB clean bits. */ 2136 pVmcbNstGst ->ctrl.u32VmcbCleanBits&= ~HMSVM_VMCB_CLEAN_INTERCEPTS;2156 pVmcbNstGstCtrl->u32VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_INTERCEPTS; 2137 2157 HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_XCPT_INTERCEPTS); 2138 2158 } … … 2412 2432 if (!fWasCached) 2413 2433 { 2414 pVmcbNstGstCache->u16InterceptRdCRx = pVmcbNstGstCtrl->u16InterceptRdCRx; 2415 pVmcbNstGstCache->u16InterceptWrCRx = pVmcbNstGstCtrl->u16InterceptWrCRx; 2416 pVmcbNstGstCache->u16InterceptRdDRx = pVmcbNstGstCtrl->u16InterceptRdDRx; 2417 pVmcbNstGstCache->u16InterceptWrDRx = pVmcbNstGstCtrl->u16InterceptWrDRx; 2418 pVmcbNstGstCache->u32InterceptXcpt = pVmcbNstGstCtrl->u32InterceptXcpt; 2419 pVmcbNstGstCache->u64InterceptCtrl = pVmcbNstGstCtrl->u64InterceptCtrl; 2420 pVmcbNstGstCache->u64CR0 = pVmcbNstGstState->u64CR0; 2421 pVmcbNstGstCache->u64CR3 = pVmcbNstGstState->u64CR3; 2422 pVmcbNstGstCache->u64CR4 = pVmcbNstGstState->u64CR4; 2423 pVmcbNstGstCache->u64EFER = pVmcbNstGstState->u64EFER; 2424 pVmcbNstGstCache->u64PAT = pVmcbNstGstState->u64PAT; 2425 pVmcbNstGstCache->u64DBGCTL = pVmcbNstGstState->u64DBGCTL; 2426 pVmcbNstGstCache->u64IOPMPhysAddr = pVmcbNstGstCtrl->u64IOPMPhysAddr; 2427 pVmcbNstGstCache->u64MSRPMPhysAddr = pVmcbNstGstCtrl->u64MSRPMPhysAddr; 2428 pVmcbNstGstCache->u64TSCOffset = pVmcbNstGstCtrl->u64TSCOffset; 2429 pVmcbNstGstCache->u32VmcbCleanBits = pVmcbNstGstCtrl->u32VmcbCleanBits; 2430 pVmcbNstGstCache->fVIntrMasking = pVmcbNstGstCtrl->IntCtrl.n.u1VIntrMasking; 2431 pVmcbNstGstCache->TLBCtrl = pVmcbNstGstCtrl->TLBCtrl; 2432 pVmcbNstGstCache->u1NestedPaging = pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging; 2433 pVmcbNstGstCache->u1LbrVirt = pVmcbNstGstCtrl->LbrVirt.n.u1LbrVirt; 2434 pCtx->hwvirt.svm.fHMCachedVmcb = true; 2434 pVmcbNstGstCache->u16InterceptRdCRx = pVmcbNstGstCtrl->u16InterceptRdCRx; 2435 pVmcbNstGstCache->u16InterceptWrCRx = pVmcbNstGstCtrl->u16InterceptWrCRx; 2436 pVmcbNstGstCache->u16InterceptRdDRx = pVmcbNstGstCtrl->u16InterceptRdDRx; 2437 pVmcbNstGstCache->u16InterceptWrDRx = pVmcbNstGstCtrl->u16InterceptWrDRx; 2438 pVmcbNstGstCache->u16PauseFilterCount = pVmcbNstGstCtrl->u16PauseFilterCount; 2439 pVmcbNstGstCache->u16PauseFilterThreshold = pVmcbNstGstCtrl->u16PauseFilterThreshold; 2440 pVmcbNstGstCache->u32InterceptXcpt = pVmcbNstGstCtrl->u32InterceptXcpt; 2441 pVmcbNstGstCache->u64InterceptCtrl = pVmcbNstGstCtrl->u64InterceptCtrl; 2442 pVmcbNstGstCache->u64CR0 = pVmcbNstGstState->u64CR0; 2443 pVmcbNstGstCache->u64CR3 = pVmcbNstGstState->u64CR3; 2444 pVmcbNstGstCache->u64CR4 = pVmcbNstGstState->u64CR4; 2445 pVmcbNstGstCache->u64EFER = pVmcbNstGstState->u64EFER; 2446 pVmcbNstGstCache->u64PAT = pVmcbNstGstState->u64PAT; 2447 pVmcbNstGstCache->u64DBGCTL = pVmcbNstGstState->u64DBGCTL; 2448 pVmcbNstGstCache->u64IOPMPhysAddr = pVmcbNstGstCtrl->u64IOPMPhysAddr; 2449 pVmcbNstGstCache->u64MSRPMPhysAddr = pVmcbNstGstCtrl->u64MSRPMPhysAddr; 2450 pVmcbNstGstCache->u64TSCOffset = pVmcbNstGstCtrl->u64TSCOffset; 2451 pVmcbNstGstCache->u32VmcbCleanBits = pVmcbNstGstCtrl->u32VmcbCleanBits; 2452 pVmcbNstGstCache->fVIntrMasking = pVmcbNstGstCtrl->IntCtrl.n.u1VIntrMasking; 2453 pVmcbNstGstCache->TLBCtrl = pVmcbNstGstCtrl->TLBCtrl; 2454 pVmcbNstGstCache->u1NestedPaging = pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging; 2455 pVmcbNstGstCache->u1LbrVirt = pVmcbNstGstCtrl->LbrVirt.n.u1LbrVirt; 2456 pCtx->hwvirt.svm.fHMCachedVmcb = true; 2435 2457 Log4(("hmR0SvmVmRunCacheVmcb: Cached VMCB fields\n")); 2436 2458 } … … 2465 2487 2466 2488 /* 2467 * Use the same nested-paging as the "outer" guest. We can't dynamically2468 * switch off nested-paging suddenly while executing a VM (see assertion at the2469 * end ofTrap0eHandler() in PGMAllBth.h).2489 * Use the same nested-paging as the outer guest. We can't dynamically switch off 2490 * nested-paging suddenly while executing a VM (see assertion at the end of 2491 * Trap0eHandler() in PGMAllBth.h). 2470 2492 */ 2471 2493 pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging = pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging; 2472 2494 2473 /* For now copy the LBR info. from outer guest VMCB. */ 2474 /** @todo fix this later. */ 2475 PCSVMVMCB pVmcb = pVCpu->hm.s.svm.pVmcb; 2495 /* Override nested-guest PAT MSR, see @bugref{7243#c109}. */ 2496 PSVMVMCBSTATESAVE pVmcbNstGstState = &pVmcbNstGst->guest; 2497 pVmcbNstGstState->u64PAT = MSR_IA32_CR_PAT_INIT_VAL; 2498 2499 #ifdef DEBUG_ramshankar 2500 /* For debugging purposes - copy the LBR info. from outer guest VMCB. */ 2476 2501 pVmcbNstGstCtrl->LbrVirt.n.u1LbrVirt = pVmcb->ctrl.LbrVirt.n.u1LbrVirt; 2477 pVmcbNstGst->guest.u64DBGCTL = pVmcb->guest.u64DBGCTL; 2478 2479 /* Override nested-guest PAT MSR, see @bugref{7243#c109}. */ 2480 pVmcbNstGst->guest.u64PAT = MSR_IA32_CR_PAT_INIT_VAL; 2502 pVmcbNstGstState->u64DBGCTL = pVmcb->guest.u64DBGCTL; 2503 #endif 2481 2504 } 2482 2505 else … … 2528 2551 #endif 2529 2552 2530 hmR0SvmLoadGuest XcptInterceptsNested(pVCpu, pVmcbNstGst, pCtx);2553 hmR0SvmLoadGuestInterceptsNested(pVCpu, pVmcbNstGst, pCtx); 2531 2554 2532 2555 rc = hmR0SvmSetupVMRunHandler(pVCpu); -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r71755 r71833 1282 1282 { 1283 1283 memset(pCtx->hwvirt.svm.CTX_SUFF(pVmcb), 0, SVM_VMCB_PAGES << PAGE_SHIFT); 1284 pCtx->hwvirt.svm.uMsrHSavePa = 0; 1284 pCtx->hwvirt.svm.uMsrHSavePa = 0; 1285 pCtx->hwvirt.svm.uPrevPauseTick = 0; 1285 1286 } 1286 1287 } -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r71184 r71833 239 239 alignb 8 240 240 .Guest.hwvirt.svm.HostState resb 184 241 .Guest.hwvirt.svm.u 16Padding0 resw1241 .Guest.hwvirt.svm.uPrevPauseTick resq 1 242 242 .Guest.hwvirt.svm.cPauseFilter resw 1 243 243 .Guest.hwvirt.svm.cPauseFilterThreshold resw 1 244 244 .Guest.hwvirt.svm.fInterceptEvents resb 1 245 245 .Guest.hwvirt.svm.fHMCachedVmcb resb 1 246 alignb 8 246 247 .Guest.hwvirt.svm.pvMsrBitmapR0 RTR0PTR_RES 1 247 248 alignb 8 … … 526 527 alignb 8 527 528 .Hyper.hwvirt.svm.HostState resb 184 528 .Hyper.hwvirt.svm.u 16Padding0 resw1529 .Hyper.hwvirt.svm.uPrevPauseTick resq 1 529 530 .Hyper.hwvirt.svm.cPauseFilter resw 1 530 531 .Hyper.hwvirt.svm.cPauseFilterThreshold resw 1 531 532 .Hyper.hwvirt.svm.fInterceptEvents resb 1 532 533 .Hyper.hwvirt.svm.fHMCachedVmcb resb 1 534 alignb 8 533 535 .Hyper.hwvirt.svm.pvMsrBitmapR0 RTR0PTR_RES 1 534 536 alignb 8 -
trunk/src/VBox/VMM/testcase/tstVMStruct.h
r70948 r71833 137 137 GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.pVmcbR3); 138 138 GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.HostState); 139 GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.uPrevPauseTick); 139 140 GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.cPauseFilter); 140 141 GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.cPauseFilterThreshold);
Note:
See TracChangeset
for help on using the changeset viewer.