|
Borislav Petkov |
0f7872 |
From: Andrew Cooper <andrew.cooper3@citrix.com>
|
|
Borislav Petkov |
0f7872 |
Date: Fri, 24 Jun 2022 14:41:21 +0100
|
|
Borislav Petkov |
0f7872 |
Subject: x86/cpu/amd: Enumerate BTC_NO
|
|
Borislav Petkov |
0f7872 |
Git-commit: 26aae8ccbc1972233afd08fb3f368947c0314265
|
|
Borislav Petkov |
d06c64 |
Patch-mainline: v5.19-rc4
|
|
Borislav Petkov |
0f7872 |
References: bsc#1199657 CVE-2022-29900 CVE-2022-29901
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
BTC_NO indicates that hardware is not susceptible to Branch Type Confusion.
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
Zen3 CPUs don't suffer BTC.
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
Hypervisors are expected to synthesise BTC_NO when it is appropriate
|
|
Borislav Petkov |
0f7872 |
given the migration pool, to prevent kernels using heuristics.
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
[ bp: Massage. ]
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
|
Borislav Petkov |
0f7872 |
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Borislav Petkov |
0f7872 |
---
|
|
Borislav Petkov |
0f7872 |
arch/x86/include/asm/cpufeatures.h | 1 +
|
|
Borislav Petkov |
0f7872 |
arch/x86/kernel/cpu/amd.c | 21 +++++++++++++++------
|
|
Borislav Petkov |
0f7872 |
arch/x86/kernel/cpu/common.c | 6 ++++--
|
|
Borislav Petkov |
0f7872 |
3 files changed, 20 insertions(+), 8 deletions(-)
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
--- a/arch/x86/include/asm/cpufeatures.h
|
|
Borislav Petkov |
0f7872 |
+++ b/arch/x86/include/asm/cpufeatures.h
|
|
Borislav Petkov |
d06c64 |
@@ -303,6 +303,7 @@
|
|
Borislav Petkov |
0f7872 |
#define X86_FEATURE_AMD_SSBD (13*32+24) /* "" Speculative Store Bypass Disable */
|
|
Borislav Petkov |
0f7872 |
#define X86_FEATURE_VIRT_SSBD (13*32+25) /* Virtualized Speculative Store Bypass Disable */
|
|
Borislav Petkov |
0f7872 |
#define X86_FEATURE_AMD_SSB_NO (13*32+26) /* "" Speculative Store Bypass is fixed in hardware. */
|
|
Borislav Petkov |
0f7872 |
+#define X86_FEATURE_BTC_NO (13*32+29) /* "" Not vulnerable to Branch Type Confusion */
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
/* Thermal and Power Management Leaf, CPUID level 0x00000006 (eax), word 14 */
|
|
Borislav Petkov |
0f7872 |
#define X86_FEATURE_DTHERM (14*32+ 0) /* Digital Thermal Sensor */
|
|
Borislav Petkov |
0f7872 |
--- a/arch/x86/kernel/cpu/amd.c
|
|
Borislav Petkov |
0f7872 |
+++ b/arch/x86/kernel/cpu/amd.c
|
|
Borislav Petkov |
d06c64 |
@@ -898,12 +898,21 @@ static void init_amd_zn(struct cpuinfo_x
|
|
Borislav Petkov |
d06c64 |
{
|
|
Borislav Petkov |
d06c64 |
set_cpu_cap(c, X86_FEATURE_ZEN);
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
- /*
|
|
Borislav Petkov |
0f7872 |
- * Fix erratum 1076: CPB feature bit not being set in CPUID.
|
|
Borislav Petkov |
0f7872 |
- * Always set it, except when running under a hypervisor.
|
|
Borislav Petkov |
0f7872 |
- */
|
|
Borislav Petkov |
0f7872 |
- if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && !cpu_has(c, X86_FEATURE_CPB))
|
|
Borislav Petkov |
0f7872 |
- set_cpu_cap(c, X86_FEATURE_CPB);
|
|
Borislav Petkov |
0f7872 |
+ /* Fix up CPUID bits, but only if not virtualised. */
|
|
Borislav Petkov |
0f7872 |
+ if (!cpu_has(c, X86_FEATURE_HYPERVISOR)) {
|
|
Borislav Petkov |
0f7872 |
+
|
|
Borislav Petkov |
0f7872 |
+ /* Erratum 1076: CPB feature bit not being set in CPUID. */
|
|
Borislav Petkov |
0f7872 |
+ if (!cpu_has(c, X86_FEATURE_CPB))
|
|
Borislav Petkov |
0f7872 |
+ set_cpu_cap(c, X86_FEATURE_CPB);
|
|
Borislav Petkov |
0f7872 |
+
|
|
Borislav Petkov |
0f7872 |
+ /*
|
|
Borislav Petkov |
0f7872 |
+ * Zen3 (Fam19 model < 0x10) parts are not susceptible to
|
|
Borislav Petkov |
0f7872 |
+ * Branch Type Confusion, but predate the allocation of the
|
|
Borislav Petkov |
0f7872 |
+ * BTC_NO bit.
|
|
Borislav Petkov |
0f7872 |
+ */
|
|
Borislav Petkov |
0f7872 |
+ if (c->x86 == 0x19 && !cpu_has(c, X86_FEATURE_BTC_NO))
|
|
Borislav Petkov |
0f7872 |
+ set_cpu_cap(c, X86_FEATURE_BTC_NO);
|
|
Borislav Petkov |
0f7872 |
+ }
|
|
Borislav Petkov |
0f7872 |
}
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
static void init_amd(struct cpuinfo_x86 *c)
|
|
Borislav Petkov |
0f7872 |
--- a/arch/x86/kernel/cpu/common.c
|
|
Borislav Petkov |
0f7872 |
+++ b/arch/x86/kernel/cpu/common.c
|
|
Borislav Petkov |
0f7872 |
@@ -1142,8 +1142,10 @@ static void __init cpu_set_bug_bits(stru
|
|
Borislav Petkov |
0f7872 |
!arch_cap_mmio_immune(ia32_cap))
|
|
Borislav Petkov |
0f7872 |
setup_force_cpu_bug(X86_BUG_MMIO_STALE_DATA);
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
- if ((cpu_matches(cpu_vuln_blacklist, RETBLEED) || (ia32_cap & ARCH_CAP_RSBA)))
|
|
Borislav Petkov |
0f7872 |
- setup_force_cpu_bug(X86_BUG_RETBLEED);
|
|
Borislav Petkov |
0f7872 |
+ if (!cpu_has(c, X86_FEATURE_BTC_NO)) {
|
|
Borislav Petkov |
0f7872 |
+ if (cpu_matches(cpu_vuln_blacklist, RETBLEED) || (ia32_cap & ARCH_CAP_RSBA))
|
|
Borislav Petkov |
0f7872 |
+ setup_force_cpu_bug(X86_BUG_RETBLEED);
|
|
Borislav Petkov |
0f7872 |
+ }
|
|
Borislav Petkov |
0f7872 |
|
|
Borislav Petkov |
0f7872 |
if (cpu_matches(cpu_vuln_whitelist, NO_MELTDOWN))
|
|
Borislav Petkov |
0f7872 |
return;
|