@@ -1251,6 +1251,8 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = {
1251
1251
#define GDS BIT(6)
1252
1252
/* CPU is affected by Register File Data Sampling */
1253
1253
#define RFDS BIT(7)
1254
+ /* CPU is affected by Indirect Target Selection */
1255
+ #define ITS BIT(8)
1254
1256
1255
1257
static const struct x86_cpu_id cpu_vuln_blacklist [] __initconst = {
1256
1258
VULNBL_INTEL_STEPPINGS (IVYBRIDGE , X86_STEPPING_ANY , SRBDS ),
@@ -1262,22 +1264,25 @@ static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = {
1262
1264
VULNBL_INTEL_STEPPINGS (BROADWELL_G , X86_STEPPING_ANY , SRBDS ),
1263
1265
VULNBL_INTEL_STEPPINGS (BROADWELL_X , X86_STEPPING_ANY , MMIO ),
1264
1266
VULNBL_INTEL_STEPPINGS (BROADWELL , X86_STEPPING_ANY , SRBDS ),
1265
- VULNBL_INTEL_STEPPINGS (SKYLAKE_X , X86_STEPPING_ANY , MMIO | RETBLEED | GDS ),
1267
+ VULNBL_INTEL_STEPPINGS (SKYLAKE_X , X86_STEPPINGS (0x0 , 0x5 ), MMIO | RETBLEED | GDS ),
1268
+ VULNBL_INTEL_STEPPINGS (SKYLAKE_X , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | ITS ),
1266
1269
VULNBL_INTEL_STEPPINGS (SKYLAKE_L , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | SRBDS ),
1267
1270
VULNBL_INTEL_STEPPINGS (SKYLAKE , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | SRBDS ),
1268
- VULNBL_INTEL_STEPPINGS (KABYLAKE_L , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | SRBDS ),
1269
- VULNBL_INTEL_STEPPINGS (KABYLAKE , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | SRBDS ),
1271
+ VULNBL_INTEL_STEPPINGS (KABYLAKE_L , X86_STEPPINGS (0x0 , 0xb ), MMIO | RETBLEED | GDS | SRBDS ),
1272
+ VULNBL_INTEL_STEPPINGS (KABYLAKE_L , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | SRBDS | ITS ),
1273
+ VULNBL_INTEL_STEPPINGS (KABYLAKE , X86_STEPPINGS (0x0 , 0xc ), MMIO | RETBLEED | GDS | SRBDS ),
1274
+ VULNBL_INTEL_STEPPINGS (KABYLAKE , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | SRBDS | ITS ),
1270
1275
VULNBL_INTEL_STEPPINGS (CANNONLAKE_L , X86_STEPPING_ANY , RETBLEED ),
1271
- VULNBL_INTEL_STEPPINGS (ICELAKE_L , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED | GDS ),
1272
- VULNBL_INTEL_STEPPINGS (ICELAKE_D , X86_STEPPING_ANY , MMIO | GDS ),
1273
- VULNBL_INTEL_STEPPINGS (ICELAKE_X , X86_STEPPING_ANY , MMIO | GDS ),
1274
- VULNBL_INTEL_STEPPINGS (COMETLAKE , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED | GDS ),
1275
- VULNBL_INTEL_STEPPINGS (COMETLAKE_L , X86_STEPPINGS (0x0 , 0x0 ), MMIO | RETBLEED ),
1276
- VULNBL_INTEL_STEPPINGS (COMETLAKE_L , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED | GDS ),
1277
- VULNBL_INTEL_STEPPINGS (TIGERLAKE_L , X86_STEPPING_ANY , GDS ),
1278
- VULNBL_INTEL_STEPPINGS (TIGERLAKE , X86_STEPPING_ANY , GDS ),
1276
+ VULNBL_INTEL_STEPPINGS (ICELAKE_L , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED | GDS | ITS ),
1277
+ VULNBL_INTEL_STEPPINGS (ICELAKE_D , X86_STEPPING_ANY , MMIO | GDS | ITS ),
1278
+ VULNBL_INTEL_STEPPINGS (ICELAKE_X , X86_STEPPING_ANY , MMIO | GDS | ITS ),
1279
+ VULNBL_INTEL_STEPPINGS (COMETLAKE , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED | GDS | ITS ),
1280
+ VULNBL_INTEL_STEPPINGS (COMETLAKE_L , X86_STEPPINGS (0x0 , 0x0 ), MMIO | RETBLEED | ITS ),
1281
+ VULNBL_INTEL_STEPPINGS (COMETLAKE_L , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED | GDS | ITS ),
1282
+ VULNBL_INTEL_STEPPINGS (TIGERLAKE_L , X86_STEPPING_ANY , GDS | ITS ),
1283
+ VULNBL_INTEL_STEPPINGS (TIGERLAKE , X86_STEPPING_ANY , GDS | ITS ),
1279
1284
VULNBL_INTEL_STEPPINGS (LAKEFIELD , X86_STEPPING_ANY , MMIO | MMIO_SBDS | RETBLEED ),
1280
- VULNBL_INTEL_STEPPINGS (ROCKETLAKE , X86_STEPPING_ANY , MMIO | RETBLEED | GDS ),
1285
+ VULNBL_INTEL_STEPPINGS (ROCKETLAKE , X86_STEPPING_ANY , MMIO | RETBLEED | GDS | ITS ),
1281
1286
VULNBL_INTEL_STEPPINGS (ALDERLAKE , X86_STEPPING_ANY , RFDS ),
1282
1287
VULNBL_INTEL_STEPPINGS (ALDERLAKE_L , X86_STEPPING_ANY , RFDS ),
1283
1288
VULNBL_INTEL_STEPPINGS (RAPTORLAKE , X86_STEPPING_ANY , RFDS ),
@@ -1341,6 +1346,32 @@ static bool __init vulnerable_to_rfds(u64 x86_arch_cap_msr)
1341
1346
return cpu_matches (cpu_vuln_blacklist , RFDS );
1342
1347
}
1343
1348
1349
+ static bool __init vulnerable_to_its (u64 x86_arch_cap_msr )
1350
+ {
1351
+ /* The "immunity" bit trumps everything else: */
1352
+ if (x86_arch_cap_msr & ARCH_CAP_ITS_NO )
1353
+ return false;
1354
+ if (boot_cpu_data .x86_vendor != X86_VENDOR_INTEL )
1355
+ return false;
1356
+
1357
+ /* None of the affected CPUs have BHI_CTRL */
1358
+ if (boot_cpu_has (X86_FEATURE_BHI_CTRL ))
1359
+ return false;
1360
+
1361
+ /*
1362
+ * If a VMM did not expose ITS_NO, assume that a guest could
1363
+ * be running on a vulnerable hardware or may migrate to such
1364
+ * hardware.
1365
+ */
1366
+ if (boot_cpu_has (X86_FEATURE_HYPERVISOR ))
1367
+ return true;
1368
+
1369
+ if (cpu_matches (cpu_vuln_blacklist , ITS ))
1370
+ return true;
1371
+
1372
+ return false;
1373
+ }
1374
+
1344
1375
static void __init cpu_set_bug_bits (struct cpuinfo_x86 * c )
1345
1376
{
1346
1377
u64 x86_arch_cap_msr = x86_read_arch_cap_msr ();
@@ -1468,6 +1499,9 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
1468
1499
if (cpu_has (c , X86_FEATURE_AMD_IBPB ) && !cpu_has (c , X86_FEATURE_AMD_IBPB_RET ))
1469
1500
setup_force_cpu_bug (X86_BUG_IBPB_NO_RET );
1470
1501
1502
+ if (vulnerable_to_its (x86_arch_cap_msr ))
1503
+ setup_force_cpu_bug (X86_BUG_ITS );
1504
+
1471
1505
if (cpu_matches (cpu_vuln_whitelist , NO_MELTDOWN ))
1472
1506
return ;
1473
1507
0 commit comments