Changeset 70913 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Feb 8, 2018 3:11:15 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 120741
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
r70846 r70913 3143 3143 //| X86_CPUID_STEXT_FEATURE_ECX_PREFETCHWT1 - we do not do vector functions yet. 3144 3144 ; 3145 pCurLeaf->uEdx &= 0; /** @todo X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB, X86_CPUID_STEXT_FEATURE_EDX_STIBP and X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP */ 3145 pCurLeaf->uEdx &= 0 3146 //| X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB RT_BIT(26) 3147 //| X86_CPUID_STEXT_FEATURE_EDX_STIBP RT_BIT(27) 3148 //| X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP RT_BIT(29) 3149 ; 3146 3150 3147 3151 /* Mask out INVPCID unless FSGSBASE is exposed due to a bug in Windows 10 SMP guests, see @bugref{9089#c15}. */ … … 3150 3154 { 3151 3155 pCurLeaf->uEbx &= ~X86_CPUID_STEXT_FEATURE_EBX_INVPCID; 3152 LogRel(("CPUM: Disabled INVPCID without FSGSBASE to work around buggy guests\n"));3156 LogRel(("CPUM: Disabled INVPCID without FSGSBASE to work around buggy guests\n")); 3153 3157 } 3154 3158 … … 4309 4313 CPUMR3SetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_NX); 4310 4314 4315 /* Check if speculation control is enabled. */ 4316 rc = CFGMR3QueryBoolDef(CFGMR3GetRoot(pVM), "EnableSpecCtrl", &fEnable, false); 4317 AssertRCReturn(rc, rc); 4318 if (fEnable) 4319 CPUMR3SetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_SPEC_CTRL); 4320 4311 4321 return VINF_SUCCESS; 4312 4322 } … … 4589 4599 break; 4590 4600 4601 /* 4602 * Set up the speculation control CPUID bits and MSRs. This is quite complicated 4603 * on Intel CPUs, and different on AMDs. 4604 */ 4605 case CPUMCPUIDFEATURE_SPEC_CTRL: 4606 if (pVM->cpum.s.GuestFeatures.enmCpuVendor == CPUMCPUVENDOR_INTEL) 4607 { 4608 pLeaf = cpumR3CpuIdGetExactLeaf(&pVM->cpum.s, UINT32_C(0x00000007), 0); 4609 if ( !pLeaf 4610 || !(pVM->cpum.s.HostFeatures.fIbpb || pVM->cpum.s.HostFeatures.fIbrs)) 4611 { 4612 LogRel(("CPUM: WARNING! Can't turn on Speculation Control when the host doesn't support it!\n")); 4613 return; 4614 } 4615 4616 /* The feature can be enabled. Let's see what we can actually do. */ 4617 pVM->cpum.s.GuestFeatures.fSpeculationControl = 1; 4618 4619 /* We will only expose STIBP if IBRS is present to keep things simpler (simple is not an option). */ 4620 if (pVM->cpum.s.HostFeatures.fIbrs) 4621 { 4622 pLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB; 4623 if (pVM->cpum.s.HostFeatures.fStibp) 4624 pLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_STIBP; 4625 4626 /* Make sure we have the speculation control MSR... */ 4627 pMsrRange = cpumLookupMsrRange(pVM, MSR_IA32_SPEC_CTRL); 4628 if (!pMsrRange) 4629 { 4630 static CPUMMSRRANGE const s_SpecCtrl = 4631 { 4632 /*.uFirst =*/ MSR_IA32_SPEC_CTRL, /*.uLast =*/ MSR_IA32_SPEC_CTRL, 4633 /*.enmRdFn =*/ kCpumMsrRdFn_Ia32SpecCtrl, /*.enmWrFn =*/ kCpumMsrWrFn_Ia32SpecCtrl, 4634 /*.offCpumCpu =*/ UINT16_MAX, /*.fReserved =*/ 0, /*.uValue =*/ 0, /*.fWrIgnMask =*/ 0, /*.fWrGpMask =*/ 0, 4635 /*.szName = */ "IA32_SPEC_CTRL" 4636 }; 4637 int rc = CPUMR3MsrRangesInsert(pVM, &s_SpecCtrl); 4638 AssertLogRelRC(rc); 4639 } 4640 4641 /* ... and the predictor command MSR. */ 4642 pMsrRange = cpumLookupMsrRange(pVM, MSR_IA32_PRED_CMD); 4643 if (!pMsrRange) 4644 { 4645 static CPUMMSRRANGE const s_SpecCtrl = 4646 { 4647 /*.uFirst =*/ MSR_IA32_PRED_CMD, /*.uLast =*/ MSR_IA32_PRED_CMD, 4648 /*.enmRdFn =*/ kCpumMsrRdFn_WriteOnly, /*.enmWrFn =*/ kCpumMsrWrFn_Ia32PredCmd, 4649 /*.offCpumCpu =*/ UINT16_MAX, /*.fReserved =*/ 0, /*.uValue =*/ 0, /*.fWrIgnMask =*/ 0, /*.fWrGpMask =*/ 0, 4650 /*.szName = */ "IA32_PRED_CMD" 4651 }; 4652 int rc = CPUMR3MsrRangesInsert(pVM, &s_SpecCtrl); 4653 AssertLogRelRC(rc); 4654 } 4655 4656 } 4657 4658 if (pVM->cpum.s.HostFeatures.fArchCap) { 4659 pLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP; 4660 4661 /* Install the architectural capabilities MSR. */ 4662 pMsrRange = cpumLookupMsrRange(pVM, MSR_IA32_ARCH_CAPABILITIES); 4663 if (!pMsrRange) 4664 { 4665 static CPUMMSRRANGE const s_ArchCaps = 4666 { 4667 /*.uFirst =*/ MSR_IA32_ARCH_CAPABILITIES, /*.uLast =*/ MSR_IA32_ARCH_CAPABILITIES, 4668 /*.enmRdFn =*/ kCpumMsrRdFn_Ia32ArchCapabilities, /*.enmWrFn =*/ kCpumMsrWrFn_ReadOnly, 4669 /*.offCpumCpu =*/ UINT16_MAX, /*.fReserved =*/ 0, /*.uValue =*/ 0, /*.fWrIgnMask =*/ 0, /*.fWrGpMask =*/ UINT64_MAX, 4670 /*.szName = */ "IA32_ARCH_CAPABILITIES" 4671 }; 4672 int rc = CPUMR3MsrRangesInsert(pVM, &s_ArchCaps); 4673 AssertLogRelRC(rc); 4674 } 4675 } 4676 4677 LogRel(("CPUM: SetGuestCpuIdFeature: Enabled Speculation Control.\n")); 4678 } 4679 else if (pVM->cpum.s.GuestFeatures.enmCpuVendor == CPUMCPUVENDOR_AMD) 4680 { 4681 /* The precise details of AMD's implementation are not yet clear. */ 4682 } 4683 break; 4684 4591 4685 default: 4592 4686 AssertMsgFailed(("enmFeature=%d\n", enmFeature)); … … 4627 4721 case CPUMCPUIDFEATURE_HVP: return pVM->cpum.s.GuestFeatures.fHypervisorPresent; 4628 4722 case CPUMCPUIDFEATURE_MWAIT_EXTS: return pVM->cpum.s.GuestFeatures.fMWaitExtensions; 4723 case CPUMCPUIDFEATURE_SPEC_CTRL: return pVM->cpum.s.GuestFeatures.fSpeculationControl; 4629 4724 4630 4725 case CPUMCPUIDFEATURE_INVALID: … … 4737 4832 pVM->cpum.s.GuestFeatures.fMWaitExtensions = 0; 4738 4833 Log(("CPUM: ClearGuestCpuIdFeature: Disabled MWAIT Extensions!\n")); 4834 break; 4835 4836 case CPUMCPUIDFEATURE_SPEC_CTRL: 4837 pLeaf = cpumR3CpuIdGetExactLeaf(&pVM->cpum.s, UINT32_C(0x00000007), 0); 4838 if (pLeaf) 4839 /*pVM->cpum.s.aGuestCpuIdPatmStd[7].uEdx =*/ pLeaf->uEdx &= ~(X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB | X86_CPUID_STEXT_FEATURE_EDX_STIBP | X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP); 4840 pVM->cpum.s.GuestFeatures.fSpeculationControl = 0; 4841 Log(("CPUM: ClearGuestCpuIdFeature: Disabled speculation control!\n")); 4739 4842 break; 4740 4843
Note:
See TracChangeset
for help on using the changeset viewer.