Denis Kirjanov 74e540
From 25fc42b6b09d0f4626f8766e29d32e95186d4414 Mon Sep 17 00:00:00 2001
Denis Kirjanov 74e540
From: Marc Zyngier <maz@kernel.org>
Denis Kirjanov 74e540
Date: Thu, 16 Jul 2020 17:11:09 +0100
Denis Kirjanov 74e540
Subject: [PATCH 5/6] arm64: Run ARCH_WORKAROUND_1 enabling code on all CPUs
Denis Kirjanov 74e540
Git-commit: 18fce56134c987e5b4eceddafdbe4b00c07e2ae1
Denis Kirjanov 74e540
Patch-mainline: v5.10-rc1
Denis Kirjanov 74e540
References: git-fixes
Denis Kirjanov 74e540
Denis Kirjanov 74e540
Commit 73f381660959 ("arm64: Advertise mitigation of Spectre-v2, or lack
Denis Kirjanov 74e540
thereof") changed the way we deal with ARCH_WORKAROUND_1, by moving most
Denis Kirjanov 74e540
of the enabling code to the .matches() callback.
Denis Kirjanov 74e540
Denis Kirjanov 74e540
This has the unfortunate effect that the workaround gets only enabled on
Denis Kirjanov 74e540
the first affected CPU, and no other.
Denis Kirjanov 74e540
Denis Kirjanov 74e540
In order to address this, forcefully call the .matches() callback from a
Denis Kirjanov 74e540
.cpu_enable() callback, which brings us back to the original behaviour.
Denis Kirjanov 74e540
Denis Kirjanov 74e540
Fixes: 73f381660959 ("arm64: Advertise mitigation of Spectre-v2, or lack thereof")
Denis Kirjanov 74e540
Cc: <stable@vger.kernel.org>
Denis Kirjanov 74e540
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Denis Kirjanov 74e540
Signed-off-by: Marc Zyngier <maz@kernel.org>
Denis Kirjanov 74e540
Signed-off-by: Will Deacon <will@kernel.org>
Denis Kirjanov 74e540
Acked-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov 74e540
---
Denis Kirjanov 74e540
 arch/arm64/kernel/cpu_errata.c | 8 ++++++++
Denis Kirjanov 74e540
 1 file changed, 8 insertions(+)
Denis Kirjanov 74e540
Denis Kirjanov 74e540
diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
Denis Kirjanov 74e540
index 8d2562f16e7f..858880c86c50 100644
Denis Kirjanov 74e540
--- a/arch/arm64/kernel/cpu_errata.c
Denis Kirjanov 74e540
+++ b/arch/arm64/kernel/cpu_errata.c
Denis Kirjanov 74e540
@@ -646,6 +646,12 @@ check_branch_predictor(const struct arm64_cpu_capabilities *entry, int scope)
Denis Kirjanov 74e540
 	return (need_wa > 0);
Denis Kirjanov 74e540
 }
Denis Kirjanov 74e540
 
Denis Kirjanov 74e540
+static void
Denis Kirjanov 74e540
+cpu_enable_branch_predictor_hardening(const struct arm64_cpu_capabilities *cap)
Denis Kirjanov 74e540
+{
Denis Kirjanov 74e540
+	cap->matches(cap, SCOPE_LOCAL_CPU);
Denis Kirjanov 74e540
+}
Denis Kirjanov 74e540
+
Denis Kirjanov 74e540
 #ifdef CONFIG_CAVIUM_ERRATUM_27456
Denis Kirjanov 74e540
 const struct midr_range cavium_erratum_27456_cpus[] = {
Denis Kirjanov 74e540
 	/* Cavium ThunderX, T88 pass 1.x - 2.1 */
Denis Kirjanov 74e540
@@ -797,9 +803,11 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
Denis Kirjanov 74e540
 	},
Denis Kirjanov 74e540
 #endif
Denis Kirjanov 74e540
 	{
Denis Kirjanov 74e540
+		.desc = "Branch predictor hardening",
Denis Kirjanov 74e540
 		.capability = ARM64_HARDEN_BRANCH_PREDICTOR,
Denis Kirjanov 74e540
 		.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
Denis Kirjanov 74e540
 		.matches = check_branch_predictor,
Denis Kirjanov 74e540
+		.cpu_enable = cpu_enable_branch_predictor_hardening,
Denis Kirjanov 74e540
 	},
Denis Kirjanov 74e540
 	{
Denis Kirjanov 74e540
 		.desc = "Speculative Store Bypass Disable",
Denis Kirjanov 74e540
-- 
Denis Kirjanov 74e540
2.16.4
Denis Kirjanov 74e540