[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 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. Also, I don't see any link between the change and the commit message. With the microcode installed, STIBP and IBPB are already visible to dom0. The only required adjustment is to force STIBP == IBRSB, which must be done after applying the pv_featureset[] mask to the toolstack's choice of value. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> --- 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 |