| 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:41 -0500 |
| Subject: ARM: bugs: hook processor bug checking into SMP and suspend paths |
| 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-4-dave.long@linaro.org> |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| Commit 26602161b5ba795928a5a719fe1d5d9f2ab5c3ef upstream. |
| |
| Check for CPU bugs when secondary processors are being brought online, |
| and also when CPUs are resuming from a low power mode. This gives an |
| opportunity to check that processor specific bug workarounds are |
| correctly enabled for all paths that a CPU re-enters the kernel. |
| |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> |
| Boot-tested-by: Tony Lindgren <tony@atomide.com> |
| Reviewed-by: Tony Lindgren <tony@atomide.com> |
| Acked-by: Marc Zyngier <marc.zyngier@arm.com> |
| Signed-off-by: David A. Long <dave.long@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm/include/asm/bugs.h | 2 ++ |
| arch/arm/kernel/bugs.c | 5 +++++ |
| arch/arm/kernel/smp.c | 4 ++++ |
| arch/arm/kernel/suspend.c | 2 ++ |
| 4 files changed, 13 insertions(+) |
| |
| --- a/arch/arm/include/asm/bugs.h |
| +++ b/arch/arm/include/asm/bugs.h |
| @@ -14,8 +14,10 @@ extern void check_writebuffer_bugs(void) |
| |
| #ifdef CONFIG_MMU |
| extern void check_bugs(void); |
| +extern void check_other_bugs(void); |
| #else |
| #define check_bugs() do { } while (0) |
| +#define check_other_bugs() do { } while (0) |
| #endif |
| |
| #endif |
| --- a/arch/arm/kernel/bugs.c |
| +++ b/arch/arm/kernel/bugs.c |
| @@ -3,7 +3,12 @@ |
| #include <asm/bugs.h> |
| #include <asm/proc-fns.h> |
| |
| +void check_other_bugs(void) |
| +{ |
| +} |
| + |
| void __init check_bugs(void) |
| { |
| check_writebuffer_bugs(); |
| + check_other_bugs(); |
| } |
| --- a/arch/arm/kernel/smp.c |
| +++ b/arch/arm/kernel/smp.c |
| @@ -29,6 +29,7 @@ |
| #include <linux/irq_work.h> |
| |
| #include <linux/atomic.h> |
| +#include <asm/bugs.h> |
| #include <asm/smp.h> |
| #include <asm/cacheflush.h> |
| #include <asm/cpu.h> |
| @@ -400,6 +401,9 @@ asmlinkage void secondary_start_kernel(v |
| * before we continue - which happens after __cpu_up returns. |
| */ |
| set_cpu_online(cpu, true); |
| + |
| + check_other_bugs(); |
| + |
| complete(&cpu_running); |
| |
| local_irq_enable(); |
| --- a/arch/arm/kernel/suspend.c |
| +++ b/arch/arm/kernel/suspend.c |
| @@ -1,6 +1,7 @@ |
| #include <linux/init.h> |
| #include <linux/slab.h> |
| |
| +#include <asm/bugs.h> |
| #include <asm/cacheflush.h> |
| #include <asm/idmap.h> |
| #include <asm/pgalloc.h> |
| @@ -34,6 +35,7 @@ int cpu_suspend(unsigned long arg, int ( |
| cpu_switch_mm(mm->pgd, mm); |
| local_flush_bp_all(); |
| local_flush_tlb_all(); |
| + check_other_bugs(); |
| } |
| |
| return ret; |