|
|
|
|
@@ -1227,6 +1227,8 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = {
|
|
|
|
|
#define GDS BIT(6)
|
|
|
|
|
/* CPU is affected by Register File Data Sampling */
|
|
|
|
|
#define RFDS BIT(7)
|
|
|
|
|
/* CPU is affected by Indirect Target Selection */
|
|
|
|
|
#define ITS BIT(8)
|
|
|
|
|
|
|
|
|
|
static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = {
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_IVYBRIDGE, X86_STEP_MAX, SRBDS),
|
|
|
|
|
@@ -1238,22 +1240,25 @@ static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = {
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_BROADWELL_G, X86_STEP_MAX, SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_BROADWELL_X, X86_STEP_MAX, MMIO),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_BROADWELL, X86_STEP_MAX, SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_SKYLAKE_X, X86_STEP_MAX, MMIO | RETBLEED | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_SKYLAKE_X, 0x5, MMIO | RETBLEED | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_SKYLAKE_X, X86_STEP_MAX, MMIO | RETBLEED | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_SKYLAKE_L, X86_STEP_MAX, MMIO | RETBLEED | GDS | SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_SKYLAKE, X86_STEP_MAX, MMIO | RETBLEED | GDS | SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_KABYLAKE_L, X86_STEP_MAX, MMIO | RETBLEED | GDS | SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_KABYLAKE, X86_STEP_MAX, MMIO | RETBLEED | GDS | SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_KABYLAKE_L, 0xb, MMIO | RETBLEED | GDS | SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_KABYLAKE_L, X86_STEP_MAX, MMIO | RETBLEED | GDS | SRBDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_KABYLAKE, 0xc, MMIO | RETBLEED | GDS | SRBDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_KABYLAKE, X86_STEP_MAX, MMIO | RETBLEED | GDS | SRBDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_CANNONLAKE_L, X86_STEP_MAX, RETBLEED),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ICELAKE_L, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ICELAKE_D, X86_STEP_MAX, MMIO | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ICELAKE_X, X86_STEP_MAX, MMIO | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_COMETLAKE, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_COMETLAKE_L, 0x0, MMIO | RETBLEED),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_COMETLAKE_L, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_TIGERLAKE_L, X86_STEP_MAX, GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_TIGERLAKE, X86_STEP_MAX, GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ICELAKE_L, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ICELAKE_D, X86_STEP_MAX, MMIO | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ICELAKE_X, X86_STEP_MAX, MMIO | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_COMETLAKE, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_COMETLAKE_L, 0x0, MMIO | RETBLEED | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_COMETLAKE_L, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_TIGERLAKE_L, X86_STEP_MAX, GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_TIGERLAKE, X86_STEP_MAX, GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_LAKEFIELD, X86_STEP_MAX, MMIO | MMIO_SBDS | RETBLEED),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ROCKETLAKE, X86_STEP_MAX, MMIO | RETBLEED | GDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ROCKETLAKE, X86_STEP_MAX, MMIO | RETBLEED | GDS | ITS),
|
|
|
|
|
VULNBL_INTEL_TYPE(INTEL_ALDERLAKE, ATOM, RFDS),
|
|
|
|
|
VULNBL_INTEL_STEPS(INTEL_ALDERLAKE_L, X86_STEP_MAX, RFDS),
|
|
|
|
|
VULNBL_INTEL_TYPE(INTEL_RAPTORLAKE, ATOM, RFDS),
|
|
|
|
|
@@ -1318,6 +1323,32 @@ static bool __init vulnerable_to_rfds(u64 x86_arch_cap_msr)
|
|
|
|
|
return cpu_matches(cpu_vuln_blacklist, RFDS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool __init vulnerable_to_its(u64 x86_arch_cap_msr)
|
|
|
|
|
{
|
|
|
|
|
/* The "immunity" bit trumps everything else: */
|
|
|
|
|
if (x86_arch_cap_msr & ARCH_CAP_ITS_NO)
|
|
|
|
|
return false;
|
|
|
|
|
if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/* None of the affected CPUs have BHI_CTRL */
|
|
|
|
|
if (boot_cpu_has(X86_FEATURE_BHI_CTRL))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If a VMM did not expose ITS_NO, assume that a guest could
|
|
|
|
|
* be running on a vulnerable hardware or may migrate to such
|
|
|
|
|
* hardware.
|
|
|
|
|
*/
|
|
|
|
|
if (boot_cpu_has(X86_FEATURE_HYPERVISOR))
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
if (cpu_matches(cpu_vuln_blacklist, ITS))
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
|
|
|
|
|
{
|
|
|
|
|
u64 x86_arch_cap_msr = x86_read_arch_cap_msr();
|
|
|
|
|
@@ -1449,6 +1480,9 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
|
|
|
|
|
if (cpu_has(c, X86_FEATURE_AMD_IBPB) && !cpu_has(c, X86_FEATURE_AMD_IBPB_RET))
|
|
|
|
|
setup_force_cpu_bug(X86_BUG_IBPB_NO_RET);
|
|
|
|
|
|
|
|
|
|
if (vulnerable_to_its(x86_arch_cap_msr))
|
|
|
|
|
setup_force_cpu_bug(X86_BUG_ITS);
|
|
|
|
|
|
|
|
|
|
if (cpu_matches(cpu_vuln_whitelist, NO_MELTDOWN))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|