| 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:42 -0500 |
| Subject: ARM: bugs: add support for per-processor bug checking |
| 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-5-dave.long@linaro.org> |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| Commit 9d3a04925deeabb97c8e26d940b501a2873e8af3 upstream. |
| |
| Add support for per-processor bug checking - each processor function |
| descriptor gains a function pointer for this check, which must not be |
| an __init function. If non-NULL, this will be called whenever a CPU |
| enters the kernel via which ever path (boot CPU, secondary CPU startup, |
| CPU resuming, etc.) |
| |
| This allows processor specific bug checks to validate that workaround |
| bits are properly enabled by firmware via all entry paths to 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/proc-fns.h | 4 ++++ |
| arch/arm/kernel/bugs.c | 4 ++++ |
| arch/arm/mm/proc-macros.S | 3 ++- |
| 3 files changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/arch/arm/include/asm/proc-fns.h |
| +++ b/arch/arm/include/asm/proc-fns.h |
| @@ -37,6 +37,10 @@ extern struct processor { |
| */ |
| void (*_proc_init)(void); |
| /* |
| + * Check for processor bugs |
| + */ |
| + void (*check_bugs)(void); |
| + /* |
| * Disable any processor specifics |
| */ |
| void (*_proc_fin)(void); |
| --- a/arch/arm/kernel/bugs.c |
| +++ b/arch/arm/kernel/bugs.c |
| @@ -5,6 +5,10 @@ |
| |
| void check_other_bugs(void) |
| { |
| +#ifdef MULTI_CPU |
| + if (processor.check_bugs) |
| + processor.check_bugs(); |
| +#endif |
| } |
| |
| void __init check_bugs(void) |
| --- a/arch/arm/mm/proc-macros.S |
| +++ b/arch/arm/mm/proc-macros.S |
| @@ -274,13 +274,14 @@ |
| mcr p15, 0, ip, c7, c10, 4 @ data write barrier |
| .endm |
| |
| -.macro define_processor_functions name:req, dabort:req, pabort:req, nommu=0, suspend=0 |
| +.macro define_processor_functions name:req, dabort:req, pabort:req, nommu=0, suspend=0, bugs=0 |
| .type \name\()_processor_functions, #object |
| .align 2 |
| ENTRY(\name\()_processor_functions) |
| .word \dabort |
| .word \pabort |
| .word cpu_\name\()_proc_init |
| + .word \bugs |
| .word cpu_\name\()_proc_fin |
| .word cpu_\name\()_reset |
| .word cpu_\name\()_do_idle |