Skip to content

Commit edcba5b

Browse files
committed
x86/bhi: Enumerate Branch History Injection (BHI) bug
jira LE-2015 cve CVE-2024-2201 Rebuild_History Non-Buildable kernel-5.14.0-427.42.1.el9_4 commit-author Pawan Gupta <pawan.kumar.gupta@linux.intel.com> commit be482ff Mitigation for BHI is selected based on the bug enumeration. Add bits needed to enumerate BHI bug. Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com> Signed-off-by: Daniel Sneddon <daniel.sneddon@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com> Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org> (cherry picked from commit be482ff) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent 77f8cfc commit edcba5b

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

arch/x86/include/asm/cpufeatures.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,4 +511,5 @@
511511
#define X86_BUG_SRSO X86_BUG(1*32 + 0) /* AMD SRSO bug */
512512
#define X86_BUG_DIV0 X86_BUG(1*32 + 1) /* AMD DIV0 speculation bug */
513513
#define X86_BUG_RFDS X86_BUG(1*32 + 2) /* CPU is vulnerable to Register File Data Sampling */
514+
#define X86_BUG_BHI X86_BUG(1*32 + 3) /* CPU is affected by Branch History Injection */
514515
#endif /* _ASM_X86_CPUFEATURES_H */

arch/x86/include/asm/msr-index.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,10 @@
152152
* are restricted to targets in
153153
* kernel.
154154
*/
155+
#define ARCH_CAP_BHI_NO BIT(20) /*
156+
* CPU is not affected by Branch
157+
* History Injection.
158+
*/
155159
#define ARCH_CAP_PBRSB_NO BIT(24) /*
156160
* Not susceptible to Post-Barrier
157161
* Return Stack Buffer Predictions.

arch/x86/kernel/cpu/common.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,7 @@ static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c)
12391239
#define NO_SPECTRE_V2 BIT(8)
12401240
#define NO_MMIO BIT(9)
12411241
#define NO_EIBRS_PBRSB BIT(10)
1242+
#define NO_BHI BIT(11)
12421243

12431244
#define VULNWL(vendor, family, model, whitelist) \
12441245
X86_MATCH_VENDOR_FAM_MODEL(vendor, family, model, whitelist)
@@ -1301,18 +1302,18 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = {
13011302
VULNWL_INTEL(ATOM_TREMONT_D, NO_ITLB_MULTIHIT | NO_EIBRS_PBRSB),
13021303

13031304
/* AMD Family 0xf - 0x12 */
1304-
VULNWL_AMD(0x0f, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO),
1305-
VULNWL_AMD(0x10, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO),
1306-
VULNWL_AMD(0x11, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO),
1307-
VULNWL_AMD(0x12, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO),
1305+
VULNWL_AMD(0x0f, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI),
1306+
VULNWL_AMD(0x10, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI),
1307+
VULNWL_AMD(0x11, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI),
1308+
VULNWL_AMD(0x12, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI),
13081309

13091310
/* FAMILY_ANY must be last, otherwise 0x0f - 0x12 matches won't work */
1310-
VULNWL_AMD(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB),
1311-
VULNWL_HYGON(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB),
1311+
VULNWL_AMD(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB | NO_BHI),
1312+
VULNWL_HYGON(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB | NO_BHI),
13121313

13131314
/* Zhaoxin Family 7 */
1314-
VULNWL(CENTAUR, 7, X86_MODEL_ANY, NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO),
1315-
VULNWL(ZHAOXIN, 7, X86_MODEL_ANY, NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO),
1315+
VULNWL(CENTAUR, 7, X86_MODEL_ANY, NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO | NO_BHI),
1316+
VULNWL(ZHAOXIN, 7, X86_MODEL_ANY, NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO | NO_BHI),
13161317
{}
13171318
};
13181319

@@ -1550,6 +1551,13 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
15501551
if (vulnerable_to_rfds(ia32_cap))
15511552
setup_force_cpu_bug(X86_BUG_RFDS);
15521553

1554+
/* When virtualized, eIBRS could be hidden, assume vulnerable */
1555+
if (!(ia32_cap & ARCH_CAP_BHI_NO) &&
1556+
!cpu_matches(cpu_vuln_whitelist, NO_BHI) &&
1557+
(boot_cpu_has(X86_FEATURE_IBRS_ENHANCED) ||
1558+
boot_cpu_has(X86_FEATURE_HYPERVISOR)))
1559+
setup_force_cpu_bug(X86_BUG_BHI);
1560+
15531561
if (cpu_matches(cpu_vuln_whitelist, NO_MELTDOWN))
15541562
return;
15551563

0 commit comments

Comments
 (0)