Patch "x86/cpufeature: Blacklist SPEC_CTRL/PRED_CMD on early Spectre v2 microcodes" has been added to the 4.15-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/cpufeature: Blacklist SPEC_CTRL/PRED_CMD on early Spectre v2 microcodes
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86cpufeature_Blacklist_SPEC_CTRLPRED_CMD_on_early_Spectre_v2_microcodes.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Subject: x86/cpufeature: Blacklist SPEC_CTRL/PRED_CMD on early Spectre v2 microcodes
From: David Woodhouse [email protected]
Date: Thu Jan 25 16:14:14 2018 +0000
From: David Woodhouse [email protected]
commit a5b2966364538a0e68c9fa29bc0a3a1651799035
This doesn't refuse to load the affected microcodes; it just refuses to use the Spectre v2 mitigation features if they're detected, by clearing the appropriate feature bits.
The AMD CPUID bits are handled here too, because hypervisors *may* have been exposing those bits even on Intel chips, for fine-grained control of what's available.
It is non-trivial to use x86_match_cpu() for this table because that doesn't handle steppings. And the approach taken in commit bd9240a18 almost made me lose my lunch.
--- arch/x86/kernel/cpu/intel.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
arch/x86/kernel/cpu/intel.c +66 -0
@@ -102,6 +102,59 @@ static void probe_xeon_phi_r3mwait(strucELF_HWCAP2 |=HWCAP2_RING3MWAIT ; } +/* +* Early microcode releases for the Spectre v2 mitigation were broken. +* Information taken from; +* - https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/microcode-update-guidance.pdf +* - https://kb.vmware.com/s/article/52345 +* - Microcode revisions observed in the wild +* - Release note from 20180108 microcode release +*/ +struct sku_microcode { +u8 model; +u8 stepping; +u32 microcode; +}; +static const struct sku_microcode spectre_bad_microcodes[] = { + {INTEL_FAM6_KABYLAKE_DESKTOP ,0x0B ,0x84 }, + {INTEL_FAM6_KABYLAKE_DESKTOP ,0x0A ,0x84 }, + {INTEL_FAM6_KABYLAKE_DESKTOP ,0x09 ,0x84 }, + {INTEL_FAM6_KABYLAKE_MOBILE ,0x0A ,0x84 }, + {INTEL_FAM6_KABYLAKE_MOBILE ,0x09 ,0x84 }, + {INTEL_FAM6_SKYLAKE_X ,0x03 ,0x0100013e }, + {INTEL_FAM6_SKYLAKE_X ,0x04 ,0x0200003c }, + {INTEL_FAM6_SKYLAKE_MOBILE ,0x03 ,0xc2 }, + {INTEL_FAM6_SKYLAKE_DESKTOP ,0x03 ,0xc2 }, + {INTEL_FAM6_BROADWELL_CORE ,0x04 ,0x28 }, + {INTEL_FAM6_BROADWELL_GT3E ,0x01 ,0x1b }, + {INTEL_FAM6_BROADWELL_XEON_D ,0x02 ,0x14 }, + {INTEL_FAM6_BROADWELL_XEON_D ,0x03 ,0x07000011 }, + {INTEL_FAM6_BROADWELL_X ,0x01 ,0x0b000025 }, + {INTEL_FAM6_HASWELL_ULT ,0x01 ,0x21 }, + {INTEL_FAM6_HASWELL_GT3E ,0x01 ,0x18 }, + {INTEL_FAM6_HASWELL_CORE ,0x03 ,0x23 }, + {INTEL_FAM6_HASWELL_X ,0x02 ,0x3b }, + {INTEL_FAM6_HASWELL_X ,0x04 ,0x10 }, + {INTEL_FAM6_IVYBRIDGE_X ,0x04 ,0x42a }, +/* Updated in the 20180108 release; blacklist until we know otherwise */ + {INTEL_FAM6_ATOM_GEMINI_LAKE ,0x01 ,0x22 }, +/* Observed in the wild */ + {INTEL_FAM6_SANDYBRIDGE_X ,0x06 ,0x61b }, + {INTEL_FAM6_SANDYBRIDGE_X ,0x07 ,0x712 }, +}; + +static bool bad_spectre_microcode (struct cpuinfo_x86 *c) +{ +int i; + +for (i =0 ; i <ARRAY_SIZE (spectre_bad_microcodes); i++) { +if (c->x86_model == spectre_bad_microcodes[i].model && + c->x86_mask == spectre_bad_microcodes[i].stepping) +return (c->microcode <= spectre_bad_microcodes[i].microcode); + } +return false; +} +static void early_init_intel (struct cpuinfo_x86 *c) {u64 misc_enable;
@@ -122,6 +175,19 @@ static void early_init_intel(struct cpuiif (c->x86 >=6 && !cpu_has (c,X86_FEATURE_IA64 )) c->microcode =intel_get_microcode_revision (); +if ((cpu_has (c,X86_FEATURE_SPEC_CTRL ) || +cpu_has (c,X86_FEATURE_STIBP ) || +cpu_has (c,X86_FEATURE_AMD_SPEC_CTRL ) || +cpu_has (c,X86_FEATURE_AMD_PRED_CMD ) || +cpu_has (c,X86_FEATURE_AMD_STIBP )) &&bad_spectre_microcode (c)) { +pr_warn ("Intel Spectre v2 broken microcode detected; disabling SPEC_CTRL\n" ); +clear_cpu_cap (c,X86_FEATURE_SPEC_CTRL ); +clear_cpu_cap (c,X86_FEATURE_STIBP ); +clear_cpu_cap (c,X86_FEATURE_AMD_SPEC_CTRL ); +clear_cpu_cap (c,X86_FEATURE_AMD_PRED_CMD ); +clear_cpu_cap (c,X86_FEATURE_AMD_STIBP ); + } +/* * Atom erratum AAE44/AAF40/AAG38/AAH41: *
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/x86pti_Do_not_enable_PTI_on_CPUs_which_are_not_vulnerable_to_Meltdown.patch queue-4.15/x86cpufeature_Blacklist_SPEC_CTRLPRED_CMD_on_early_Spectre_v2_microcodes.patch queue-4.15/x86cpufeatures_Add_Intel_feature_bits_for_Speculation_Control.patch queue-4.15/KVM_VMX_Make_indirect_call_speculation_safe.patch queue-4.15/x86msr_Add_definitions_for_new_speculation_control_MSRs.patch queue-4.15/x86cpufeatures_Add_CPUID_7_EDX_CPUID_leaf.patch queue-4.15/x86cpufeatures_Add_AMD_feature_bits_for_Speculation_Control.patch queue-4.15/x86speculation_Add_basic_IBPB_(Indirect_Branch_Prediction_Barrier)_support.patch queue-4.15/x86speculation_Simplify_indirect_branch_prediction_barrier().patch queue-4.15/KVM_x86_Make_indirect_calls_in_emulator_speculation_safe.patch queue-4.15/x86retpoline_Simplify_vmexit_fill_RSB().patch queue-4.15/x86cpufeatures_Clean_up_Spectre_v2_related_CPUID_flags.patch