Changeset 87541 in vbox for trunk/src/VBox/VMM/VMMR0
- Timestamp:
- Feb 2, 2021 4:33:51 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142567
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r87539 r87541 1717 1717 { 1718 1718 /* Write the VMCS revision identifier to the VMXON region. */ 1719 *(uint32_t *)pvCpuPage = RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_ID);1719 *(uint32_t *)pvCpuPage = RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_ID); 1720 1720 } 1721 1721 … … 2015 2015 * See Intel spec. Appendix A.1 "Basic VMX Information". 2016 2016 */ 2017 uint32_t const cbVmcs = RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_SIZE);2017 uint32_t const cbVmcs = RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_SIZE); 2018 2018 if (cbVmcs <= X86_PAGE_4K_SIZE) 2019 2019 { /* likely */ } … … 2946 2946 if (pVM->hm.s.vmx.fVpid) 2947 2947 { 2948 bool fVpidFlush = RT_BOOL( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_INDIV_ADDR);2948 bool fVpidFlush = RT_BOOL(g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_INDIV_ADDR); 2949 2949 if (fVpidFlush) 2950 2950 { … … 3298 3298 if (pVM->hmr0.s.fNestedPaging) 3299 3299 { 3300 if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT)3301 { 3302 if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT)3300 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT) 3301 { 3302 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT) 3303 3303 pVM->hm.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_SINGLE_CONTEXT; 3304 else if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS)3304 else if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS) 3305 3305 pVM->hm.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_ALL_CONTEXTS; 3306 3306 else … … 3313 3313 3314 3314 /* Make sure the write-back cacheable memory type for EPT is supported. */ 3315 if (RT_UNLIKELY(!( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_EMT_WB)))3315 if (RT_UNLIKELY(!(g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_EMT_WB))) 3316 3316 { 3317 3317 pVM->hm.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED; … … 3321 3321 3322 3322 /* EPT requires a page-walk length of 4. */ 3323 if (RT_UNLIKELY(!( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4)))3323 if (RT_UNLIKELY(!(g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4))) 3324 3324 { 3325 3325 pVM->hm.s.vmx.enmTlbFlushEpt = VMXTLBFLUSHEPT_NOT_SUPPORTED; … … 3342 3342 if (pVM->hm.s.vmx.fVpid) 3343 3343 { 3344 if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID)3345 { 3346 if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT)3344 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID) 3345 { 3346 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT) 3347 3347 pVM->hm.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_SINGLE_CONTEXT; 3348 else if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS)3348 else if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS) 3349 3349 pVM->hm.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_ALL_CONTEXTS; 3350 3350 else 3351 3351 { 3352 3352 /* Neither SINGLE nor ALL-context flush types for VPID is supported by the CPU. Ignore VPID capability. */ 3353 if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_INDIV_ADDR)3353 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_INDIV_ADDR) 3354 3354 LogRelFunc(("Only INDIV_ADDR supported. Ignoring VPID.\n")); 3355 if ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS)3355 if (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS) 3356 3356 LogRelFunc(("Only SINGLE_CONTEXT_RETAIN_GLOBALS supported. Ignoring VPID.\n")); 3357 3357 pVM->hm.s.vmx.enmTlbFlushVpid = VMXTLBFLUSHVPID_NOT_SUPPORTED; … … 3504 3504 bool const fGstVmwriteAll = pVM->cpum.ro.GuestFeatures.fVmxVmwriteAll; 3505 3505 if ( !fGstVmwriteAll 3506 || ( pVM->hm.s.vmx.Msrs.u64Misc & VMX_MISC_VMWRITE_ALL))3506 || (g_HmMsrs.u.vmx.u64Misc & VMX_MISC_VMWRITE_ALL)) 3507 3507 { /* likely. */ } 3508 3508 else … … 3594 3594 * if the host supports VMWRITE to all supported VMCS fields. 3595 3595 */ 3596 if ( pVM->hm.s.vmx.Msrs.u64Misc & VMX_MISC_VMWRITE_ALL)3596 if (g_HmMsrs.u.vmx.u64Misc & VMX_MISC_VMWRITE_ALL) 3597 3597 { 3598 3598 uint32_t const *paShadowVmcsRoFields = pVM->hmr0.s.vmx.paShadowVmcsRoFields; … … 4234 4234 4235 4235 /* Set the CPU specified revision identifier at the beginning of the VMCS structure. */ 4236 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 4237 *(uint32_t *)pVmcsInfo->pvVmcs = RT_BF_GET(pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_ID); 4236 *(uint32_t *)pVmcsInfo->pvVmcs = RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_ID); 4238 4237 const char * const pszVmcs = fIsNstGstVmcs ? "nested-guest VMCS" : "guest VMCS"; 4239 4238 … … 4276 4275 { 4277 4276 VMXVMCSREVID VmcsRevId; 4278 VmcsRevId.u = RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_ID);4277 VmcsRevId.u = RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_ID); 4279 4278 VmcsRevId.n.fIsShadowVmcs = 1; 4280 4279 *(uint32_t *)pVmcsInfo->pvShadowVmcs = VmcsRevId.u; … … 5445 5444 * VMCS fields, so the guest can VMREAD them without causing a VM-exit. 5446 5445 */ 5447 if ( pVM->hm.s.vmx.Msrs.u64Misc & VMX_MISC_VMWRITE_ALL)5446 if (g_HmMsrs.u.vmx.u64Misc & VMX_MISC_VMWRITE_ALL) 5448 5447 { 5449 5448 uint32_t const cShadowVmcsRoFields = pVM->hmr0.s.vmx.cShadowVmcsRoFields; … … 5643 5642 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 5644 5643 5645 uint64_t fSetCr0 = pVM->hm.s.vmx.Msrs.u64Cr0Fixed0;5646 uint64_t const fZapCr0 = pVM->hm.s.vmx.Msrs.u64Cr0Fixed1;5644 uint64_t fSetCr0 = g_HmMsrs.u.vmx.u64Cr0Fixed0; 5645 uint64_t const fZapCr0 = g_HmMsrs.u.vmx.u64Cr0Fixed1; 5647 5646 if (pVM->hm.s.vmx.fUnrestrictedGuest) 5648 5647 fSetCr0 &= ~(uint64_t)(X86_CR0_PE | X86_CR0_PG); … … 5848 5847 ("EPTP %#RX64\n", pVmcsInfo->HCPhysEPTP)); 5849 5848 AssertMsg( !((pVmcsInfo->HCPhysEPTP >> 6) & 0x01) /* Bit 6 (EPT accessed & dirty bit). */ 5850 || ( pVM->hm.s.vmx.Msrs.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_EPT_ACCESS_DIRTY),5849 || (g_HmMsrs.u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_EPT_ACCESS_DIRTY), 5851 5850 ("EPTP accessed/dirty bit not supported by CPU but set %#RX64\n", pVmcsInfo->HCPhysEPTP)); 5852 5851 … … 5930 5929 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 5931 5930 5932 uint64_t const fSetCr4 = pVM->hm.s.vmx.Msrs.u64Cr4Fixed0;5933 uint64_t const fZapCr4 = pVM->hm.s.vmx.Msrs.u64Cr4Fixed1;5931 uint64_t const fSetCr4 = g_HmMsrs.u.vmx.u64Cr4Fixed0; 5932 uint64_t const fZapCr4 = g_HmMsrs.u.vmx.u64Cr4Fixed1; 5934 5933 5935 5934 /* … … 7764 7763 uint32_t const cMsrs = pVmcsInfo->cExitMsrStore; 7765 7764 Assert(pMsrs); 7766 Assert(cMsrs <= VMX_MISC_MAX_MSRS( pVM->hm.s.vmx.Msrs.u64Misc));7765 Assert(cMsrs <= VMX_MISC_MAX_MSRS(g_HmMsrs.u.vmx.u64Misc)); 7767 7766 Assert(sizeof(*pMsrs) * cMsrs <= X86_PAGE_4K_SIZE); 7768 7767 for (uint32_t i = 0; i < cMsrs; i++) … … 9693 9692 */ 9694 9693 /** @todo Why do we need to OR and AND the fixed-0 and fixed-1 bits below? */ 9695 uint64_t fSetCr0 = ( pVM->hm.s.vmx.Msrs.u64Cr0Fixed0 & pVM->hm.s.vmx.Msrs.u64Cr0Fixed1);9696 uint64_t const fZapCr0 = ( pVM->hm.s.vmx.Msrs.u64Cr0Fixed0 | pVM->hm.s.vmx.Msrs.u64Cr0Fixed1);9694 uint64_t fSetCr0 = (g_HmMsrs.u.vmx.u64Cr0Fixed0 & g_HmMsrs.u.vmx.u64Cr0Fixed1); 9695 uint64_t const fZapCr0 = (g_HmMsrs.u.vmx.u64Cr0Fixed0 | g_HmMsrs.u.vmx.u64Cr0Fixed1); 9697 9696 /* Exceptions for unrestricted guest execution for CR0 fixed bits (PE, PG). 9698 9697 See Intel spec. 26.3.1 "Checks on Guest Control Registers, Debug Registers and MSRs." */ … … 9714 9713 */ 9715 9714 /** @todo Why do we need to OR and AND the fixed-0 and fixed-1 bits below? */ 9716 uint64_t const fSetCr4 = ( pVM->hm.s.vmx.Msrs.u64Cr4Fixed0 & pVM->hm.s.vmx.Msrs.u64Cr4Fixed1);9717 uint64_t const fZapCr4 = ( pVM->hm.s.vmx.Msrs.u64Cr4Fixed0 | pVM->hm.s.vmx.Msrs.u64Cr4Fixed1);9715 uint64_t const fSetCr4 = (g_HmMsrs.u.vmx.u64Cr4Fixed0 & g_HmMsrs.u.vmx.u64Cr4Fixed1); 9716 uint64_t const fZapCr4 = (g_HmMsrs.u.vmx.u64Cr4Fixed0 | g_HmMsrs.u.vmx.u64Cr4Fixed1); 9718 9717 9719 9718 uint64_t u64GuestCr4; … … 10088 10087 AssertRC(rc); 10089 10088 HMVMX_CHECK_BREAK( !u32ActivityState 10090 || (u32ActivityState & RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Misc, VMX_BF_MISC_ACTIVITY_STATES)),10089 || (u32ActivityState & RT_BF_GET(g_HmMsrs.u.vmx.u64Misc, VMX_BF_MISC_ACTIVITY_STATES)), 10091 10090 VMX_IGS_ACTIVITY_STATE_INVALID); 10092 10091 HMVMX_CHECK_BREAK( !(pCtx->ss.Attr.n.u2Dpl) … … 10171 10170 VMXVMCSREVID VmcsRevId; 10172 10171 VmcsRevId.u = *(uint32_t *)pVmcsInfo->pvShadowVmcs; 10173 HMVMX_CHECK_BREAK(VmcsRevId.n.u31RevisionId == RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_ID),10172 HMVMX_CHECK_BREAK(VmcsRevId.n.u31RevisionId == RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_ID), 10174 10173 VMX_IGS_VMCS_LINK_PTR_SHADOW_VMCS_ID_INVALID); 10175 10174 HMVMX_CHECK_BREAK(VmcsRevId.n.fIsShadowVmcs == (uint32_t)!!(pVmcsInfo->u32ProcCtls2 & VMX_PROC_CTLS2_VMCS_SHADOWING), … … 15668 15667 Log4Func(("cs:rip=%#04x:%#RX64 %#06x/%u %c str\n", pCtx->cs.Sel, pCtx->rip, uIOPort, cbValue, fIOWrite ? 'w' : 'r')); 15669 15668 AssertReturn(pCtx->dx == uIOPort, VERR_VMX_IPE_2); 15670 bool const fInsOutsInfo = RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_INS_OUTS);15669 bool const fInsOutsInfo = RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_INS_OUTS); 15671 15670 if (fInsOutsInfo) 15672 15671 { … … 17140 17139 if (fVmxInsOutsInfo) 17141 17140 { 17142 Assert(RT_BF_GET( pVM->hm.s.vmx.Msrs.u64Basic, VMX_BF_BASIC_VMCS_INS_OUTS)); /* Paranoia. */17141 Assert(RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_INS_OUTS)); /* Paranoia. */ 17143 17142 hmR0VmxReadExitInstrInfoVmcs(pVmxTransient); 17144 17143 }
Note:
See TracChangeset
for help on using the changeset viewer.