From: Andrew Cooper Date: Mon, 5 Jun 2023 10:09:11 +0000 (+0100) Subject: x86/spec-ctrl: Use a taint for CET without MSR_SPEC_CTRL X-Git-Tag: RELEASE-4.14.6~20 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=efc4bdd2c969e858fe41e3a1eff8aa99dc093132;p=xen.git x86/spec-ctrl: Use a taint for CET without MSR_SPEC_CTRL Reword the comment for 'S' to include an incompatible set of features on the same core. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich (cherry picked from commit 3f63f4510422c29fda7ba238b880cbb53eca34fe) Also minimal fragments from: c/s 0bf9efb9ee4c ("xen/arm: Sanitize cpuinfo ID registers fields") to introduce TAINT_CPU_OUT_OF_SPEC. --- diff --git a/xen/arch/x86/spec_ctrl.c b/xen/arch/x86/spec_ctrl.c index 9efc49ace7..44fb4c9d45 100644 --- a/xen/arch/x86/spec_ctrl.c +++ b/xen/arch/x86/spec_ctrl.c @@ -1112,7 +1112,10 @@ void __init init_speculation_mitigations(void) if ( read_cr4() & X86_CR4_CET ) { if ( !has_spec_ctrl ) + { printk(XENLOG_WARNING "?!? CET active, but no MSR_SPEC_CTRL?\n"); + add_taint(TAINT_CPU_OUT_OF_SPEC); + } else if ( opt_ibrs == -1 ) opt_ibrs = ibrs = true; diff --git a/xen/common/kernel.c b/xen/common/kernel.c index f07ff41d88..35c9489929 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -338,6 +338,7 @@ unsigned int tainted; * 'E' - An error (e.g. a machine check exceptions) has been injected. * 'H' - HVM forced emulation prefix is permitted. * 'M' - Machine had a machine check experience. + * 'S' - Out of spec CPU (Incompatible features on one or more cores). * * The string is overwritten by the next call to print_taint(). */ @@ -345,11 +346,12 @@ char *print_tainted(char *str) { if ( tainted ) { - snprintf(str, TAINT_STRING_MAX_LEN, "Tainted: %c%c%c%c", + snprintf(str, TAINT_STRING_MAX_LEN, "Tainted: %c%c%c%c%c", tainted & TAINT_MACHINE_CHECK ? 'M' : ' ', tainted & TAINT_SYNC_CONSOLE ? 'C' : ' ', tainted & TAINT_ERROR_INJECT ? 'E' : ' ', - tainted & TAINT_HVM_FEP ? 'H' : ' '); + tainted & TAINT_HVM_FEP ? 'H' : ' ', + tainted & TAINT_CPU_OUT_OF_SPEC ? 'S' : ' '); } else { diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index 900c0ce3e4..c072d5a597 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -183,6 +183,7 @@ uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c); #define TAINT_MACHINE_CHECK (1u << 1) #define TAINT_ERROR_INJECT (1u << 2) #define TAINT_HVM_FEP (1u << 3) +#define TAINT_CPU_OUT_OF_SPEC (1u << 5) extern unsigned int tainted; #define TAINT_STRING_MAX_LEN 20 extern char *print_tainted(char *str);