| From bdb4fe359ed037674bec973980d462e65e37ffbc Mon Sep 17 00:00:00 2001 |
| From: Will Deacon <will@kernel.org> |
| Date: Thu, 6 Feb 2020 10:42:58 +0000 |
| Subject: [PATCH] arm64: ssbs: Fix context-switch when SSBS is present on all |
| CPUs |
| |
| commit fca3d33d8ad61eb53eca3ee4cac476d1e31b9008 upstream. |
| |
| When all CPUs in the system implement the SSBS extension, the SSBS field |
| in PSTATE is the definitive indication of the mitigation state. Further, |
| when the CPUs implement the SSBS manipulation instructions (advertised |
| to userspace via an HWCAP), EL0 can toggle the SSBS field directly and |
| so we cannot rely on any shadow state such as TIF_SSBD at all. |
| |
| Avoid forcing the SSBS field in context-switch on such a system, and |
| simply rely on the PSTATE register instead. |
| |
| Cc: <stable@vger.kernel.org> |
| Cc: Catalin Marinas <catalin.marinas@arm.com> |
| Cc: Srinivas Ramana <sramana@codeaurora.org> |
| Fixes: cbdf8a189a66 ("arm64: Force SSBS on context switch") |
| Reviewed-by: Marc Zyngier <maz@kernel.org> |
| Signed-off-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c |
| index 398601b29627..c6d7a2912e30 100644 |
| --- a/arch/arm64/kernel/process.c |
| +++ b/arch/arm64/kernel/process.c |
| @@ -455,6 +455,13 @@ static void ssbs_thread_switch(struct task_struct *next) |
| if (unlikely(next->flags & PF_KTHREAD)) |
| return; |
| |
| + /* |
| + * If all CPUs implement the SSBS extension, then we just need to |
| + * context-switch the PSTATE field. |
| + */ |
| + if (cpu_have_feature(cpu_feature(SSBS))) |
| + return; |
| + |
| /* If the mitigation is enabled, then we leave SSBS clear. */ |
| if ((arm64_get_ssbd_state() == ARM64_SSBD_FORCE_ENABLE) || |
| test_tsk_thread_flag(next, TIF_SSBD)) |
| -- |
| 2.7.4 |
| |