|
Borislav Petkov |
739064 |
From: Peter Zijlstra <peterz@infradead.org>
|
|
Borislav Petkov |
739064 |
Date: Tue, 14 Jun 2022 23:16:04 +0200
|
|
Borislav Petkov |
739064 |
Subject: x86/cpu/amd: Add Spectral Chicken
|
|
Borislav Petkov |
739064 |
Git-commit: d7caac991feeef1b871ee6988fd2c9725df09039
|
|
Borislav Petkov |
d06c64 |
Patch-mainline: v5.19-rc4
|
|
Borislav Petkov |
739064 |
References: bsc#1199657 CVE-2022-29900 CVE-2022-29901
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
Zen2 uarchs have an undocumented, unnamed, MSR that contains a chicken
|
|
Borislav Petkov |
739064 |
bit for some speculation behaviour. It needs setting.
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
Note: very belatedly AMD released naming; it's now officially called
|
|
Borislav Petkov |
739064 |
MSR_AMD64_DE_CFG2 and MSR_AMD64_DE_CFG2_SUPPRESS_NOBR_PRED_BIT
|
|
Borislav Petkov |
739064 |
but shall remain the SPECTRAL CHICKEN.
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
Suggested-by: Andrew Cooper <Andrew.Cooper3@citrix.com>
|
|
Borislav Petkov |
739064 |
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
|
Borislav Petkov |
739064 |
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Borislav Petkov |
739064 |
Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org>
|
|
Borislav Petkov |
739064 |
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Borislav Petkov |
739064 |
---
|
|
Borislav Petkov |
739064 |
arch/x86/include/asm/msr-index.h | 3 +++
|
|
Borislav Petkov |
739064 |
arch/x86/kernel/cpu/amd.c | 26 +++++++++++++++++++++++++-
|
|
Borislav Petkov |
739064 |
arch/x86/kernel/cpu/cpu.h | 2 ++
|
|
Borislav Petkov |
739064 |
arch/x86/kernel/cpu/hygon.c | 6 ++++++
|
|
Borislav Petkov |
739064 |
4 files changed, 36 insertions(+), 1 deletion(-)
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
--- a/arch/x86/include/asm/msr-index.h
|
|
Borislav Petkov |
739064 |
+++ b/arch/x86/include/asm/msr-index.h
|
|
Borislav Petkov |
739064 |
@@ -425,6 +425,9 @@
|
|
Borislav Petkov |
739064 |
/* Fam 17h MSRs */
|
|
Borislav Petkov |
739064 |
#define MSR_F17H_IRPERF 0xc00000e9
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
+#define MSR_ZEN2_SPECTRAL_CHICKEN 0xc00110e3
|
|
Borislav Petkov |
739064 |
+#define MSR_ZEN2_SPECTRAL_CHICKEN_BIT BIT_ULL(1)
|
|
Borislav Petkov |
739064 |
+
|
|
Borislav Petkov |
739064 |
/* Fam 16h MSRs */
|
|
Borislav Petkov |
739064 |
#define MSR_F16H_L2I_PERF_CTL 0xc0010230
|
|
Borislav Petkov |
739064 |
#define MSR_F16H_L2I_PERF_CTR 0xc0010231
|
|
Borislav Petkov |
739064 |
--- a/arch/x86/kernel/cpu/amd.c
|
|
Borislav Petkov |
739064 |
+++ b/arch/x86/kernel/cpu/amd.c
|
|
Borislav Petkov |
739064 |
@@ -875,6 +875,26 @@ static void init_amd_bd(struct cpuinfo_x
|
|
Borislav Petkov |
739064 |
clear_rdrand_cpuid_bit(c);
|
|
Borislav Petkov |
739064 |
}
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
+void init_spectral_chicken(struct cpuinfo_x86 *c)
|
|
Borislav Petkov |
739064 |
+{
|
|
Borislav Petkov |
739064 |
+ u64 value;
|
|
Borislav Petkov |
739064 |
+
|
|
Borislav Petkov |
739064 |
+ /*
|
|
Borislav Petkov |
739064 |
+ * On Zen2 we offer this chicken (bit) on the altar of Speculation.
|
|
Borislav Petkov |
739064 |
+ *
|
|
Borislav Petkov |
739064 |
+ * This suppresses speculation from the middle of a basic block, i.e. it
|
|
Borislav Petkov |
739064 |
+ * suppresses non-branch predictions.
|
|
Borislav Petkov |
739064 |
+ *
|
|
Borislav Petkov |
739064 |
+ * We use STIBP as a heuristic to filter out Zen2 from the rest of F17H
|
|
Borislav Petkov |
739064 |
+ */
|
|
Borislav Petkov |
739064 |
+ if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && cpu_has(c, X86_FEATURE_AMD_STIBP)) {
|
|
Borislav Petkov |
739064 |
+ if (!rdmsrl_safe(MSR_ZEN2_SPECTRAL_CHICKEN, &value)) {
|
|
Borislav Petkov |
739064 |
+ value |= MSR_ZEN2_SPECTRAL_CHICKEN_BIT;
|
|
Borislav Petkov |
739064 |
+ wrmsrl_safe(MSR_ZEN2_SPECTRAL_CHICKEN, value);
|
|
Borislav Petkov |
739064 |
+ }
|
|
Borislav Petkov |
739064 |
+ }
|
|
Borislav Petkov |
739064 |
+}
|
|
Borislav Petkov |
739064 |
+
|
|
Borislav Petkov |
739064 |
static void init_amd_zn(struct cpuinfo_x86 *c)
|
|
Borislav Petkov |
739064 |
{
|
|
Borislav Petkov |
739064 |
set_cpu_cap(c, X86_FEATURE_ZEN);
|
|
Borislav Petkov |
739064 |
@@ -920,7 +940,11 @@ static void init_amd(struct cpuinfo_x86
|
|
Borislav Petkov |
739064 |
case 0x12: init_amd_ln(c); break;
|
|
Borislav Petkov |
739064 |
case 0x15: init_amd_bd(c); break;
|
|
Borislav Petkov |
739064 |
case 0x16: init_amd_jg(c); break;
|
|
Borislav Petkov |
739064 |
- case 0x17: init_amd_zn(c); break;
|
|
Borislav Petkov |
739064 |
+ case 0x17:
|
|
Borislav Petkov |
739064 |
+ init_spectral_chicken(c);
|
|
Borislav Petkov |
739064 |
+ init_amd_zn(c);
|
|
Borislav Petkov |
739064 |
+ break;
|
|
Borislav Petkov |
739064 |
+
|
|
Borislav Petkov |
739064 |
}
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
/*
|
|
Borislav Petkov |
739064 |
--- a/arch/x86/kernel/cpu/cpu.h
|
|
Borislav Petkov |
739064 |
+++ b/arch/x86/kernel/cpu/cpu.h
|
|
Borislav Petkov |
739064 |
@@ -60,6 +60,8 @@ extern void tsx_disable(void);
|
|
Borislav Petkov |
739064 |
static inline void tsx_init(void) { }
|
|
Borislav Petkov |
739064 |
#endif /* CONFIG_CPU_SUP_INTEL */
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
+extern void init_spectral_chicken(struct cpuinfo_x86 *c);
|
|
Borislav Petkov |
739064 |
+
|
|
Borislav Petkov |
739064 |
extern void get_cpu_cap(struct cpuinfo_x86 *c);
|
|
Borislav Petkov |
739064 |
extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c);
|
|
Borislav Petkov |
739064 |
extern void x86_spec_ctrl_setup_ap(void);
|
|
Borislav Petkov |
739064 |
--- a/arch/x86/kernel/cpu/hygon.c
|
|
Borislav Petkov |
739064 |
+++ b/arch/x86/kernel/cpu/hygon.c
|
|
Borislav Petkov |
739064 |
@@ -318,6 +318,12 @@ static void init_hygon(struct cpuinfo_x8
|
|
Borislav Petkov |
739064 |
/* get apicid instead of initial apic id from cpuid */
|
|
Borislav Petkov |
739064 |
c->apicid = hard_smp_processor_id();
|
|
Borislav Petkov |
739064 |
|
|
Borislav Petkov |
739064 |
+ /*
|
|
Borislav Petkov |
739064 |
+ * XXX someone from Hygon needs to confirm this DTRT
|
|
Borislav Petkov |
739064 |
+ *
|
|
Borislav Petkov |
739064 |
+ init_spectral_chicken(c);
|
|
Borislav Petkov |
739064 |
+ */
|
|
Borislav Petkov |
739064 |
+
|
|
Borislav Petkov |
739064 |
set_cpu_cap(c, X86_FEATURE_ZEN);
|
|
Borislav Petkov |
739064 |
set_cpu_cap(c, X86_FEATURE_CPB);
|
|
Borislav Petkov |
739064 |
|