| From foo@baz Wed Nov 21 19:20:53 CET 2018 |
| From: David Long <dave.long@linaro.org> |
| Date: Wed, 7 Nov 2018 11:43:55 -0500 |
| Subject: ARM: spectre-v1: add array_index_mask_nospec() implementation |
| To: stable@vger.kernel.org, Russell King - ARM Linux <linux@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Tony Lindgren <tony@atomide.com>, Marc Zyngier <marc.zyngier@arm.com>, Mark Rutland <mark.rutland@arm.com> |
| Cc: Greg KH <gregkh@linuxfoundation.org>, Mark Brown <broonie@kernel.org> |
| Message-ID: <20181107164402.9380-18-dave.long@linaro.org> |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| Commit 1d4238c56f9816ce0f9c8dbe42d7f2ad81cb6613 upstream. |
| |
| Add an implementation of the array_index_mask_nospec() function for |
| mitigating Spectre variant 1 throughout the kernel. |
| |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Acked-by: Mark Rutland <mark.rutland@arm.com> |
| Boot-tested-by: Tony Lindgren <tony@atomide.com> |
| Reviewed-by: Tony Lindgren <tony@atomide.com> |
| Signed-off-by: David A. Long <dave.long@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm/include/asm/barrier.h | 19 +++++++++++++++++++ |
| 1 file changed, 19 insertions(+) |
| |
| --- a/arch/arm/include/asm/barrier.h |
| +++ b/arch/arm/include/asm/barrier.h |
| @@ -75,6 +75,25 @@ extern void arm_heavy_mb(void); |
| #define __smp_rmb() __smp_mb() |
| #define __smp_wmb() dmb(ishst) |
| |
| +#ifdef CONFIG_CPU_SPECTRE |
| +static inline unsigned long array_index_mask_nospec(unsigned long idx, |
| + unsigned long sz) |
| +{ |
| + unsigned long mask; |
| + |
| + asm volatile( |
| + "cmp %1, %2\n" |
| + " sbc %0, %1, %1\n" |
| + CSDB |
| + : "=r" (mask) |
| + : "r" (idx), "Ir" (sz) |
| + : "cc"); |
| + |
| + return mask; |
| +} |
| +#define array_index_mask_nospec array_index_mask_nospec |
| +#endif |
| + |
| #include <asm-generic/barrier.h> |
| |
| #endif /* !__ASSEMBLY__ */ |