Changeset 87546 in vbox
- Timestamp:
- Feb 2, 2021 5:21:19 PM (4 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMR0.cpp
r87543 r87546 1171 1171 /* Enable VPID if supported and configured. */ 1172 1172 if (g_HmMsrs.u.vmx.ProcCtls2.n.allowed1 & VMX_PROC_CTLS2_VPID) 1173 pVM->hm.s.vmx.fVpid = pVM->hm.s.vmx.fAllowVpid; /* Can be overridden by CFGM in HMR3Init(). */ 1173 pVM->hm.s.vmx.fVpidForRing3 1174 = pVM->hmr0.s.vmx.fVpid = pVM->hm.s.vmx.fAllowVpid; /* Can be overridden by CFGM in HMR3Init(). */ 1174 1175 1175 1176 /* Use VMCS shadowing if supported. */ -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r87543 r87546 2893 2893 static void hmR0VmxFlushVpid(PVMCPUCC pVCpu, VMXTLBFLUSHVPID enmTlbFlush, RTGCPTR GCPtr) 2894 2894 { 2895 Assert(pVCpu->CTX_SUFF(pVM)->hm .s.vmx.fVpid);2895 Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.fVpid); 2896 2896 2897 2897 uint64_t au64Descriptor[2]; … … 2944 2944 */ 2945 2945 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 2946 if (pVM->hm.s.vmx.fVpid) 2947 { 2948 bool fVpidFlush = RT_BOOL(g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_INDIV_ADDR); 2949 if (fVpidFlush) 2946 if (pVM->hmr0.s.vmx.fVpid) 2947 { 2948 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_INDIV_ADDR) 2950 2949 { 2951 2950 hmR0VmxFlushVpid(pVCpu, VMXTLBFLUSHVPID_INDIV_ADDR, GCVirt); … … 3019 3018 3020 3019 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 3021 AssertMsg(pVM->hmr0.s.fNestedPaging && pVM->hm .s.vmx.fVpid,3020 AssertMsg(pVM->hmr0.s.fNestedPaging && pVM->hmr0.s.vmx.fVpid, 3022 3021 ("hmR0VmxFlushTaggedTlbBoth cannot be invoked unless NestedPaging & VPID are enabled." 3023 "fNestedPaging=%RTbool fVpid=%RTbool", pVM->hmr0.s.fNestedPaging, pVM->hm .s.vmx.fVpid));3022 "fNestedPaging=%RTbool fVpid=%RTbool", pVM->hmr0.s.fNestedPaging, pVM->hmr0.s.vmx.fVpid)); 3024 3023 3025 3024 /* … … 3048 3047 * invalidated. We don't need to flush-by-VPID here as flushing by EPT covers it. See @bugref{6568}. 3049 3048 */ 3050 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVM->hm .s.vmx.enmTlbFlushEpt);3049 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVM->hmr0.s.vmx.enmTlbFlushEpt); 3051 3050 STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushTlbWorldSwitch); 3052 3051 HMVMX_SET_TAGGED_TLB_FLUSHED(); … … 3064 3063 * See Intel spec. 28.3.2 "Creating and Using Cached Translation Information". 3065 3064 */ 3066 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVM->hm .s.vmx.enmTlbFlushEpt);3065 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVM->hmr0.s.vmx.enmTlbFlushEpt); 3067 3066 STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushTlb); 3068 3067 HMVMX_SET_TAGGED_TLB_FLUSHED(); … … 3076 3075 * See Intel spec. 28.3.3.4 "Guidelines for Use of the INVEPT Instruction". 3077 3076 */ 3078 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVM->hm .s.vmx.enmTlbFlushEpt);3077 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVM->hmr0.s.vmx.enmTlbFlushEpt); 3079 3078 pVCpu->hm.s.vmx.fSwitchedNstGstFlushTlb = false; 3080 3079 STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushTlbNstGst); … … 3119 3118 Assert(pHostCpu->idCpu != NIL_RTCPUID); 3120 3119 AssertMsg(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging, ("hmR0VmxFlushTaggedTlbEpt cannot be invoked without NestedPaging.")); 3121 AssertMsg(!pVCpu->CTX_SUFF(pVM)->hm .s.vmx.fVpid, ("hmR0VmxFlushTaggedTlbEpt cannot be invoked with VPID."));3120 AssertMsg(!pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.fVpid, ("hmR0VmxFlushTaggedTlbEpt cannot be invoked with VPID.")); 3122 3121 3123 3122 /* … … 3152 3151 if (pVCpu->hmr0.s.fForceTLBFlush) 3153 3152 { 3154 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVCpu->CTX_SUFF(pVM)->hm .s.vmx.enmTlbFlushEpt);3153 hmR0VmxFlushEpt(pVCpu, pVmcsInfo, pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.enmTlbFlushEpt); 3155 3154 pVCpu->hmr0.s.fForceTLBFlush = false; 3156 3155 } … … 3171 3170 AssertPtr(pHostCpu); 3172 3171 Assert(pHostCpu->idCpu != NIL_RTCPUID); 3173 AssertMsg(pVCpu->CTX_SUFF(pVM)->hm .s.vmx.fVpid, ("hmR0VmxFlushTlbVpid cannot be invoked without VPID."));3172 AssertMsg(pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.fVpid, ("hmR0VmxFlushTlbVpid cannot be invoked without VPID.")); 3174 3173 AssertMsg(!pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging, ("hmR0VmxFlushTlbVpid cannot be invoked with NestedPaging")); 3175 3174 … … 3225 3224 if (pHostCpu->fFlushAsidBeforeUse) 3226 3225 { 3227 if (pVM->hm .s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_SINGLE_CONTEXT)3226 if (pVM->hmr0.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_SINGLE_CONTEXT) 3228 3227 hmR0VmxFlushVpid(pVCpu, VMXTLBFLUSHVPID_SINGLE_CONTEXT, 0 /* GCPtr */); 3229 else if (pVM->hm .s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_ALL_CONTEXTS)3228 else if (pVM->hmr0.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_ALL_CONTEXTS) 3230 3229 { 3231 3230 hmR0VmxFlushVpid(pVCpu, VMXTLBFLUSHVPID_ALL_CONTEXTS, 0 /* GCPtr */); … … 3268 3267 #endif 3269 3268 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 3270 switch (pVM->hm .s.vmx.enmTlbFlushType)3269 switch (pVM->hmr0.s.vmx.enmTlbFlushType) 3271 3270 { 3272 3271 case VMXTLBFLUSHTYPE_EPT_VPID: hmR0VmxFlushTaggedTlbBoth(pHostCpu, pVCpu, pVmcsInfo); break; … … 3301 3300 { 3302 3301 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT) 3303 pVM->hm .s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_SINGLE_CONTEXT;3302 pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_SINGLE_CONTEXT; 3304 3303 else if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS) 3305 pVM->hm .s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_ALL_CONTEXTS;3304 pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_ALL_CONTEXTS; 3306 3305 else 3307 3306 { 3308 3307 /* Shouldn't happen. EPT is supported but no suitable flush-types supported. */ 3309 pVM->hm .s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED;3308 pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED; 3310 3309 VMCC_GET_CPU_0(pVM)->hm.s.u32HMError = VMX_UFC_EPT_FLUSH_TYPE_UNSUPPORTED; 3311 3310 return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO; … … 3315 3314 if (RT_UNLIKELY(!(g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_EMT_WB))) 3316 3315 { 3317 pVM->hm .s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED;3316 pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED; 3318 3317 VMCC_GET_CPU_0(pVM)->hm.s.u32HMError = VMX_UFC_EPT_MEM_TYPE_NOT_WB; 3319 3318 return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO; … … 3323 3322 if (RT_UNLIKELY(!(g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4))) 3324 3323 { 3325 pVM->hm .s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED;3324 pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED; 3326 3325 VMCC_GET_CPU_0(pVM)->hm.s.u32HMError = VMX_UFC_EPT_PAGE_WALK_LENGTH_UNSUPPORTED; 3327 3326 return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO; … … 3331 3330 { 3332 3331 /* Shouldn't happen. EPT is supported but INVEPT instruction is not supported. */ 3333 pVM->hm .s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED;3332 pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED; 3334 3333 VMCC_GET_CPU_0(pVM)->hm.s.u32HMError = VMX_UFC_EPT_INVEPT_UNAVAILABLE; 3335 3334 return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO; … … 3340 3339 * Determine optimal flush type for VPID. 3341 3340 */ 3342 if (pVM->hm .s.vmx.fVpid)3341 if (pVM->hmr0.s.vmx.fVpid) 3343 3342 { 3344 3343 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID) 3345 3344 { 3346 3345 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT) 3347 pVM->hm .s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_SINGLE_CONTEXT;3346 pVM->hmr0.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_SINGLE_CONTEXT; 3348 3347 else if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS) 3349 pVM->hm .s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_ALL_CONTEXTS;3348 pVM->hmr0.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_ALL_CONTEXTS; 3350 3349 else 3351 3350 { … … 3355 3354 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS) 3356 3355 LogRelFunc(("Only SINGLE_CONTEXT_RETAIN_GLOBALS supported. Ignoring VPID.\n")); 3357 pVM->hm .s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NOT_SUPPORTED;3358 pVM->hm.s.vmx.fVpid = false;3356 pVM->hmr0.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NOT_SUPPORTED; 3357 pVM->hm.s.vmx.fVpidForRing3 = pVM->hmr0.s.vmx.fVpid = false; 3359 3358 } 3360 3359 } … … 3363 3362 /* Shouldn't happen. VPID is supported but INVVPID is not supported by the CPU. Ignore VPID capability. */ 3364 3363 Log4Func(("VPID supported without INVEPT support. Ignoring VPID.\n")); 3365 pVM->hm .s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NOT_SUPPORTED;3366 pVM->hm.s.vmx.fVpid = false;3364 pVM->hmr0.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NOT_SUPPORTED; 3365 pVM->hm.s.vmx.fVpidForRing3 = pVM->hmr0.s.vmx.fVpid = false; 3367 3366 } 3368 3367 } … … 3371 3370 * Setup the handler for flushing tagged-TLBs. 3372 3371 */ 3373 if (pVM->hmr0.s.fNestedPaging && pVM->hm .s.vmx.fVpid)3374 pVM->hm .s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_EPT_VPID;3372 if (pVM->hmr0.s.fNestedPaging && pVM->hmr0.s.vmx.fVpid) 3373 pVM->hmr0.s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_EPT_VPID; 3375 3374 else if (pVM->hmr0.s.fNestedPaging) 3376 pVM->hm .s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_EPT;3377 else if (pVM->hm .s.vmx.fVpid)3378 pVM->hm .s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_VPID;3375 pVM->hmr0.s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_EPT; 3376 else if (pVM->hmr0.s.vmx.fVpid) 3377 pVM->hmr0.s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_VPID; 3379 3378 else 3380 pVM->hm.s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_NONE; 3379 pVM->hmr0.s.vmx.enmTlbFlushType = VMXTLBFLUSHTYPE_NONE; 3380 3381 3382 /* 3383 * Copy out the result to ring-3. 3384 */ 3385 pVM->hm.s.vmx.fVpidForRing3 = pVM->hmr0.s.vmx.fVpid; 3386 pVM->hm.s.vmx.enmTlbFlushTypeForRing3 = pVM->hmr0.s.vmx.enmTlbFlushType; 3387 pVM->hm.s.vmx.enmTlbFlushEptForRing3 = pVM->hmr0.s.vmx.enmTlbFlushEpt; 3388 pVM->hm.s.vmx.enmTlbFlushVpidForRing3 = pVM->hmr0.s.vmx.enmTlbFlushVpid; 3381 3389 return VINF_SUCCESS; 3382 3390 } … … 3867 3875 3868 3876 /* Enable VPID. */ 3869 if (pVM->hm .s.vmx.fVpid)3877 if (pVM->hmr0.s.vmx.fVpid) 3870 3878 fVal |= VMX_PROC_CTLS2_VPID; 3871 3879 … … 4528 4536 4529 4537 /* Initialize these always, see hmR3InitFinalizeR0().*/ 4530 pVM->hm.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NONE;4531 pVM->hm.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NONE;4538 pVM->hm.s.vmx.enmTlbFlushEptForRing3 = pVM->hmr0.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NONE; 4539 pVM->hm.s.vmx.enmTlbFlushVpidForRing3 = pVM->hmr0.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NONE; 4532 4540 4533 4541 /* Setup the tagged-TLB flush handlers. */ … … 7010 7018 { 7011 7019 case VMX_VMCS64_CTRL_EPTP_FULL: fSupported = pVM->hmr0.s.fNestedPaging; break; 7012 case VMX_VMCS16_VPID: fSupported = pVM->hm .s.vmx.fVpid; break;7020 case VMX_VMCS16_VPID: fSupported = pVM->hmr0.s.vmx.fVpid; break; 7013 7021 case VMX_VMCS32_CTRL_PROC_EXEC2: 7014 7022 fSupported = RT_BOOL(pVmcsInfo->u32ProcCtls & VMX_PROC_CTLS_USE_SECONDARY_CTLS); -
trunk/src/VBox/VMM/VMMR3/HM.cpp
r87543 r87546 1697 1697 { 1698 1698 LogRel(("HM: Enabled nested paging\n")); 1699 if (pVM->hm.s.vmx.enmTlbFlushEpt == VMXTLBFLUSHEPT_SINGLE_CONTEXT)1699 if (pVM->hm.s.vmx.enmTlbFlushEptForRing3 == VMXTLBFLUSHEPT_SINGLE_CONTEXT) 1700 1700 LogRel(("HM: EPT flush type = Single context\n")); 1701 else if (pVM->hm.s.vmx.enmTlbFlushEpt == VMXTLBFLUSHEPT_ALL_CONTEXTS)1701 else if (pVM->hm.s.vmx.enmTlbFlushEptForRing3 == VMXTLBFLUSHEPT_ALL_CONTEXTS) 1702 1702 LogRel(("HM: EPT flush type = All contexts\n")); 1703 else if (pVM->hm.s.vmx.enmTlbFlushEpt == VMXTLBFLUSHEPT_NOT_SUPPORTED)1703 else if (pVM->hm.s.vmx.enmTlbFlushEptForRing3 == VMXTLBFLUSHEPT_NOT_SUPPORTED) 1704 1704 LogRel(("HM: EPT flush type = Not supported\n")); 1705 1705 else 1706 LogRel(("HM: EPT flush type = %#x\n", pVM->hm.s.vmx.enmTlbFlushEpt ));1706 LogRel(("HM: EPT flush type = %#x\n", pVM->hm.s.vmx.enmTlbFlushEptForRing3)); 1707 1707 1708 1708 if (pVM->hm.s.vmx.fUnrestrictedGuest) … … 1719 1719 Assert(!pVM->hm.s.vmx.fUnrestrictedGuest); 1720 1720 1721 if (pVM->hm.s.vmx.fVpid )1721 if (pVM->hm.s.vmx.fVpidForRing3) 1722 1722 { 1723 1723 LogRel(("HM: Enabled VPID\n")); 1724 if (pVM->hm.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_INDIV_ADDR)1724 if (pVM->hm.s.vmx.enmTlbFlushVpidForRing3 == VMXTLBFLUSHVPID_INDIV_ADDR) 1725 1725 LogRel(("HM: VPID flush type = Individual addresses\n")); 1726 else if (pVM->hm.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_SINGLE_CONTEXT)1726 else if (pVM->hm.s.vmx.enmTlbFlushVpidForRing3 == VMXTLBFLUSHVPID_SINGLE_CONTEXT) 1727 1727 LogRel(("HM: VPID flush type = Single context\n")); 1728 else if (pVM->hm.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_ALL_CONTEXTS)1728 else if (pVM->hm.s.vmx.enmTlbFlushVpidForRing3 == VMXTLBFLUSHVPID_ALL_CONTEXTS) 1729 1729 LogRel(("HM: VPID flush type = All contexts\n")); 1730 else if (pVM->hm.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_SINGLE_CONTEXT_RETAIN_GLOBALS)1730 else if (pVM->hm.s.vmx.enmTlbFlushVpidForRing3 == VMXTLBFLUSHVPID_SINGLE_CONTEXT_RETAIN_GLOBALS) 1731 1731 LogRel(("HM: VPID flush type = Single context retain globals\n")); 1732 1732 else 1733 LogRel(("HM: VPID flush type = %#x\n", pVM->hm.s.vmx.enmTlbFlushVpid ));1734 } 1735 else if (pVM->hm.s.vmx.enmTlbFlushVpid == VMXTLBFLUSHVPID_NOT_SUPPORTED)1733 LogRel(("HM: VPID flush type = %#x\n", pVM->hm.s.vmx.enmTlbFlushVpidForRing3)); 1734 } 1735 else if (pVM->hm.s.vmx.enmTlbFlushVpidForRing3 == VMXTLBFLUSHVPID_NOT_SUPPORTED) 1736 1736 LogRel(("HM: Ignoring VPID capabilities of CPU\n")); 1737 1737 … … 2836 2836 PVM pVM = pUVM->pVM; 2837 2837 VM_ASSERT_VALID_EXT_RETURN(pVM, false); 2838 return pVM->hm.s.vmx.fVpid ;2838 return pVM->hm.s.vmx.fVpidForRing3; 2839 2839 } 2840 2840 -
trunk/src/VBox/VMM/include/HMInternal.h
r87543 r87546 492 492 /** Set when we've enabled VMX. */ 493 493 bool fEnabled; 494 /** Set if VPID is supported . */495 bool fVpid ;494 /** Set if VPID is supported (ring-3 copy). */ 495 bool fVpidForRing3; 496 496 /** Set if VT-x VPID is allowed. */ 497 497 bool fAllowVpid; … … 504 504 uint8_t cPreemptTimerShift; 505 505 /** Padding. */ 506 bool afPadding0; 507 508 /** Tagged-TLB flush type. */ 509 VMXTLBFLUSHTYPE enmTlbFlushType; 510 /** Flush type to use for INVEPT. */ 511 VMXTLBFLUSHEPT enmTlbFlushEpt; 512 /** Flush type to use for INVVPID. */ 513 VMXTLBFLUSHVPID enmTlbFlushVpid; 506 bool afPadding0[1]; 514 507 515 508 /** Pause-loop exiting (PLE) gap in ticks. */ … … 517 510 /** Pause-loop exiting (PLE) window in ticks. */ 518 511 uint32_t cPleWindowTicks; 519 uint32_t u32Alignment0;520 512 521 513 /** Host CR4 value (set by ring-0 VMX init) */ … … 548 540 uint32_t u32Alignment1; 549 541 550 /** Host-physical address for a failing VMXON instruction ( diagnostics). */542 /** Host-physical address for a failing VMXON instruction (for diagnostics, ring-3). */ 551 543 RTHCPHYS HCPhysVmxEnableError; 552 553 /** VMX MSR values. */ 544 /** VMX MSR values (only for ring-3 consumption). */ 554 545 VMXMSRS MsrsForRing3; 546 /** Tagged-TLB flush type (only for ring-3 consumption). */ 547 VMXTLBFLUSHTYPE enmTlbFlushTypeForRing3; 548 /** Flush type to use for INVEPT (only for ring-3 consumption). */ 549 VMXTLBFLUSHEPT enmTlbFlushEptForRing3; 550 /** Flush type to use for INVVPID (only for ring-3 consumption). */ 551 VMXTLBFLUSHVPID enmTlbFlushVpidForRing3; 552 uint32_t u32Alignment2; 555 553 556 554 /** Virtual address of the TSS page used for real mode emulation. */ … … 646 644 struct HMR0VMXVM 647 645 { 646 /** Set if VPID is supported (copy in HM::vmx::fVpidForRing3). */ 647 bool fVpid; 648 bool afAlignment1[3]; 649 650 /** Tagged-TLB flush type. */ 651 VMXTLBFLUSHTYPE enmTlbFlushType; 652 /** Flush type to use for INVEPT. */ 653 VMXTLBFLUSHEPT enmTlbFlushEpt; 654 /** Flush type to use for INVVPID. */ 655 VMXTLBFLUSHVPID enmTlbFlushVpid; 656 648 657 /** Virtual address of the APIC-access page. */ 649 658 R0PTRTYPE(uint8_t *) pbApicAccess;
Note:
See TracChangeset
for help on using the changeset viewer.