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;