aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.9.21/0036-x86-cpuid-Fix-up-virtual-IBRS-IBPB-STIBP-feature-bit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0036-x86-cpuid-Fix-up-virtual-IBRS-IBPB-STIBP-feature-bit.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.9.21/0036-x86-cpuid-Fix-up-virtual-IBRS-IBPB-STIBP-feature-bit.patch127
1 files changed, 0 insertions, 127 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0036-x86-cpuid-Fix-up-virtual-IBRS-IBPB-STIBP-feature-bit.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0036-x86-cpuid-Fix-up-virtual-IBRS-IBPB-STIBP-feature-bit.patch
deleted file mode 100644
index 54039e5f..00000000
--- a/common/recipes-kernel/linux/linux-yocto-4.9.21/0036-x86-cpuid-Fix-up-virtual-IBRS-IBPB-STIBP-feature-bit.patch
+++ /dev/null
@@ -1,127 +0,0 @@
-From 230aaaad00ca4c1e2c350ce30188d03417a170fe Mon Sep 17 00:00:00 2001
-From: David Woodhouse <dwmw@amazon.co.uk>
-Date: Tue, 30 Jan 2018 14:30:23 +0000
-Subject: [PATCH 36/42] x86/cpuid: Fix up "virtual" IBRS/IBPB/STIBP feature
- bits on Intel
-
-(cherry picked from commit 7fcae1118f5fd44a862aa5c3525248e35ee67c3b)
-
-Despite the fact that all the other code there seems to be doing it, just
-using set_cpu_cap() in early_intel_init() doesn't actually work.
-
-For CPUs with PKU support, setup_pku() calls get_cpu_cap() after
-c->c_init() has set those feature bits. That resets those bits back to what
-was queried from the hardware.
-
-Turning the bits off for bad microcode is easy to fix. That can just use
-setup_clear_cpu_cap() to force them off for all CPUs.
-
-I was less keen on forcing the feature bits *on* that way, just in case
-of inconsistencies. I appreciate that the kernel is going to get this
-utterly wrong if CPU features are not consistent, because it has already
-applied alternatives by the time secondary CPUs are brought up.
-
-But at least if setup_force_cpu_cap() isn't being used, we might have a
-chance of *detecting* the lack of the corresponding bit and either
-panicking or refusing to bring the offending CPU online.
-
-So ensure that the appropriate feature bits are set within get_cpu_cap()
-regardless of how many extra times it's called.
-
-Fixes: 2961298e ("x86/cpufeatures: Clean up Spectre v2 related CPUID flags")
-Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
-Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-Cc: karahmed@amazon.de
-Cc: peterz@infradead.org
-Cc: bp@alien8.de
-Link: https://lkml.kernel.org/r/1517322623-15261-1-git-send-email-dwmw@amazon.co.uk
-Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- arch/x86/kernel/cpu/common.c | 21 +++++++++++++++++++++
- arch/x86/kernel/cpu/intel.c | 27 ++++++++-------------------
- 2 files changed, 29 insertions(+), 19 deletions(-)
-
-diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
-index cfa026f..60e537d 100644
---- a/arch/x86/kernel/cpu/common.c
-+++ b/arch/x86/kernel/cpu/common.c
-@@ -718,6 +718,26 @@ static void apply_forced_caps(struct cpuinfo_x86 *c)
- }
- }
-
-+static void init_speculation_control(struct cpuinfo_x86 *c)
-+{
-+ /*
-+ * The Intel SPEC_CTRL CPUID bit implies IBRS and IBPB support,
-+ * and they also have a different bit for STIBP support. Also,
-+ * a hypervisor might have set the individual AMD bits even on
-+ * Intel CPUs, for finer-grained selection of what's available.
-+ *
-+ * We use the AMD bits in 0x8000_0008 EBX as the generic hardware
-+ * features, which are visible in /proc/cpuinfo and used by the
-+ * kernel. So set those accordingly from the Intel bits.
-+ */
-+ if (cpu_has(c, X86_FEATURE_SPEC_CTRL)) {
-+ set_cpu_cap(c, X86_FEATURE_IBRS);
-+ set_cpu_cap(c, X86_FEATURE_IBPB);
-+ }
-+ if (cpu_has(c, X86_FEATURE_INTEL_STIBP))
-+ set_cpu_cap(c, X86_FEATURE_STIBP);
-+}
-+
- void get_cpu_cap(struct cpuinfo_x86 *c)
- {
- u32 eax, ebx, ecx, edx;
-@@ -812,6 +832,7 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
- c->x86_capability[CPUID_8000_000A_EDX] = cpuid_edx(0x8000000a);
-
- init_scattered_cpuid_features(c);
-+ init_speculation_control(c);
- }
-
- static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c)
-diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
-index 2e257f8..4097b43 100644
---- a/arch/x86/kernel/cpu/intel.c
-+++ b/arch/x86/kernel/cpu/intel.c
-@@ -140,28 +140,17 @@ static void early_init_intel(struct cpuinfo_x86 *c)
- rdmsr(MSR_IA32_UCODE_REV, lower_word, c->microcode);
- }
-
-- /*
-- * The Intel SPEC_CTRL CPUID bit implies IBRS and IBPB support,
-- * and they also have a different bit for STIBP support. Also,
-- * a hypervisor might have set the individual AMD bits even on
-- * Intel CPUs, for finer-grained selection of what's available.
-- */
-- if (cpu_has(c, X86_FEATURE_SPEC_CTRL)) {
-- set_cpu_cap(c, X86_FEATURE_IBRS);
-- set_cpu_cap(c, X86_FEATURE_IBPB);
-- }
-- if (cpu_has(c, X86_FEATURE_INTEL_STIBP))
-- set_cpu_cap(c, X86_FEATURE_STIBP);
--
- /* Now if any of them are set, check the blacklist and clear the lot */
-- if ((cpu_has(c, X86_FEATURE_IBRS) || cpu_has(c, X86_FEATURE_IBPB) ||
-+ if ((cpu_has(c, X86_FEATURE_SPEC_CTRL) ||
-+ cpu_has(c, X86_FEATURE_INTEL_STIBP) ||
-+ cpu_has(c, X86_FEATURE_IBRS) || cpu_has(c, X86_FEATURE_IBPB) ||
- cpu_has(c, X86_FEATURE_STIBP)) && bad_spectre_microcode(c)) {
- pr_warn("Intel Spectre v2 broken microcode detected; disabling Speculation Control\n");
-- clear_cpu_cap(c, X86_FEATURE_IBRS);
-- clear_cpu_cap(c, X86_FEATURE_IBPB);
-- clear_cpu_cap(c, X86_FEATURE_STIBP);
-- clear_cpu_cap(c, X86_FEATURE_SPEC_CTRL);
-- clear_cpu_cap(c, X86_FEATURE_INTEL_STIBP);
-+ setup_clear_cpu_cap(X86_FEATURE_IBRS);
-+ setup_clear_cpu_cap(X86_FEATURE_IBPB);
-+ setup_clear_cpu_cap(X86_FEATURE_STIBP);
-+ setup_clear_cpu_cap(X86_FEATURE_SPEC_CTRL);
-+ setup_clear_cpu_cap(X86_FEATURE_INTEL_STIBP);
- }
-
- /*
---
-2.7.4
-