@@ -1120,6 +1120,7 @@ static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c)
1120
1120
#define NO_SPECTRE_V2 BIT(8)
1121
1121
#define NO_MMIO BIT(9)
1122
1122
#define NO_EIBRS_PBRSB BIT(10)
1123
+ #define NO_BHI BIT(11)
1123
1124
1124
1125
#define VULNWL (vendor , family , model , whitelist ) \
1125
1126
X86_MATCH_VENDOR_FAM_MODEL(vendor, family, model, whitelist)
@@ -1182,18 +1183,18 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = {
1182
1183
VULNWL_INTEL (ATOM_TREMONT_D , NO_ITLB_MULTIHIT | NO_EIBRS_PBRSB ),
1183
1184
1184
1185
/* AMD Family 0xf - 0x12 */
1185
- VULNWL_AMD (0x0f , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO ),
1186
- VULNWL_AMD (0x10 , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO ),
1187
- VULNWL_AMD (0x11 , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO ),
1188
- VULNWL_AMD (0x12 , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO ),
1186
+ VULNWL_AMD (0x0f , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI ),
1187
+ VULNWL_AMD (0x10 , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI ),
1188
+ VULNWL_AMD (0x11 , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI ),
1189
+ VULNWL_AMD (0x12 , NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_BHI ),
1189
1190
1190
1191
/* FAMILY_ANY must be last, otherwise 0x0f - 0x12 matches won't work */
1191
- VULNWL_AMD (X86_FAMILY_ANY , NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB ),
1192
- VULNWL_HYGON (X86_FAMILY_ANY , NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB ),
1192
+ VULNWL_AMD (X86_FAMILY_ANY , NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB | NO_BHI ),
1193
+ VULNWL_HYGON (X86_FAMILY_ANY , NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS | NO_ITLB_MULTIHIT | NO_MMIO | NO_EIBRS_PBRSB | NO_BHI ),
1193
1194
1194
1195
/* Zhaoxin Family 7 */
1195
- VULNWL (CENTAUR , 7 , X86_MODEL_ANY , NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO ),
1196
- VULNWL (ZHAOXIN , 7 , X86_MODEL_ANY , NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO ),
1196
+ VULNWL (CENTAUR , 7 , X86_MODEL_ANY , NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO | NO_BHI ),
1197
+ VULNWL (ZHAOXIN , 7 , X86_MODEL_ANY , NO_SPECTRE_V2 | NO_SWAPGS | NO_MMIO | NO_BHI ),
1197
1198
{}
1198
1199
};
1199
1200
@@ -1435,6 +1436,13 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
1435
1436
if (vulnerable_to_rfds (ia32_cap ))
1436
1437
setup_force_cpu_bug (X86_BUG_RFDS );
1437
1438
1439
+ /* When virtualized, eIBRS could be hidden, assume vulnerable */
1440
+ if (!(ia32_cap & ARCH_CAP_BHI_NO ) &&
1441
+ !cpu_matches (cpu_vuln_whitelist , NO_BHI ) &&
1442
+ (boot_cpu_has (X86_FEATURE_IBRS_ENHANCED ) ||
1443
+ boot_cpu_has (X86_FEATURE_HYPERVISOR )))
1444
+ setup_force_cpu_bug (X86_BUG_BHI );
1445
+
1438
1446
if (cpu_matches (cpu_vuln_whitelist , NO_MELTDOWN ))
1439
1447
return ;
1440
1448
0 commit comments