[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 for-4.7/4.8] x86: Fix "x86: further CPUID handling adjustments"
c/s f9616884e (a backport of c/s 0d703a701 "x86/feature: Definitions for Indirect Branch Controls") missed a CPUID adjustment when calculating the raw featureset. This impacts host administrator diagnostics. Signed-off-by: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx> c/s 62b187969 "x86: further CPUID handling adjustments" make some adjustments. However, it breaks levelling of guests, making it impossible for the toolstack to hide STIBP or IBPB from guests on hardware with up-to-date microcode. The dom0 issue referenced in the commit message was fixed by the hunk adjusting the zeroing alone. STIBP and IBPB don't need (and indeed, must not be for levelling purposes) OR'd into the leaf. One final item which was missed in backport was the need to ignore the toolstack choice of STIBP, and set it equal to IBRSB. This needs doing after the mask has been applied. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> v2: * Update the commit message, how I understand the dom0 aspect of the previous commit message. --- xen/arch/x86/cpuid.c | 2 +- xen/arch/x86/hvm/hvm.c | 8 +++++--- xen/arch/x86/traps.c | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index 451952c..fffcecd 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -113,7 +113,7 @@ static void __init calculate_raw_featureset(void) cpuid_count(0x7, 0, &tmp, &raw_featureset[FEATURESET_7b0], &raw_featureset[FEATURESET_7c0], - &tmp); + &raw_featureset[FEATURESET_7d0]); if ( max >= 0xd ) cpuid_count(0xd, 1, &raw_featureset[FEATURESET_Da1], diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index ff1c6fa..0a1d4a9 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3496,10 +3496,13 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, special_features[FEATURESET_7b0]); *ecx &= hvm_featureset[FEATURESET_7c0]; - - *edx |= cpufeat_mask(X86_FEATURE_STIBP); *edx &= hvm_featureset[FEATURESET_7d0]; + /* Force STIBP equal to IBRSB */ + *edx &= ~cpufeat_mask(X86_FEATURE_STIBP); + if ( *edx & cpufeat_mask(X86_FEATURE_IBRSB) ) + *edx |= cpufeat_mask(X86_FEATURE_STIBP); + /* Don't expose HAP-only features to non-hap guests. */ if ( !hap_enabled(d) ) { @@ -3657,7 +3660,6 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, hvm_cpuid(0x80000001, NULL, NULL, NULL, &_edx); *eax |= (_edx & cpufeat_mask(X86_FEATURE_LM) ? vaddr_bits : 32) << 8; - *ebx |= cpufeat_mask(X86_FEATURE_IBPB); *ebx &= hvm_featureset[FEATURESET_e8b]; break; } diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 0f34b21..da26749 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -1088,10 +1088,13 @@ void pv_cpuid(struct cpu_user_regs *regs) special_features[FEATURESET_7b0]); c &= pv_featureset[FEATURESET_7c0]; - - d |= cpufeat_mask(X86_FEATURE_STIBP); d &= pv_featureset[FEATURESET_7d0]; + /* Force STIBP equal to IBRSB */ + d &= ~cpufeat_mask(X86_FEATURE_STIBP); + if ( d & cpufeat_mask(X86_FEATURE_IBRSB) ) + d |= cpufeat_mask(X86_FEATURE_STIBP); + if ( !is_pvh_domain(currd) ) { /* @@ -1188,7 +1191,6 @@ void pv_cpuid(struct cpu_user_regs *regs) case 0x80000008: a = paddr_bits | (vaddr_bits << 8); - b |= cpufeat_mask(X86_FEATURE_IBPB); b &= pv_featureset[FEATURESET_e8b]; break; -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |