| 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:48 -0500 |
| Subject: ARM: spectre-v2: warn about incorrect context switching functions |
| 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-11-dave.long@linaro.org> |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| Commit c44f366ea7c85e1be27d08f2f0880f4120698125 upstream. |
| |
| Warn at error level if the context switching function is not what we |
| are expecting. This can happen with big.Little systems, which we |
| currently do not support. |
| |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| 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/mm/proc-v7-bugs.c | 15 +++++++++++++++ |
| 1 file changed, 15 insertions(+) |
| |
| --- a/arch/arm/mm/proc-v7-bugs.c |
| +++ b/arch/arm/mm/proc-v7-bugs.c |
| @@ -12,6 +12,8 @@ |
| #ifdef CONFIG_HARDEN_BRANCH_PREDICTOR |
| DEFINE_PER_CPU(harden_branch_predictor_fn_t, harden_branch_predictor_fn); |
| |
| +extern void cpu_v7_iciallu_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm); |
| +extern void cpu_v7_bpiall_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm); |
| extern void cpu_v7_smc_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm); |
| extern void cpu_v7_hvc_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm); |
| |
| @@ -50,6 +52,8 @@ static void cpu_v7_spectre_init(void) |
| case ARM_CPU_PART_CORTEX_A17: |
| case ARM_CPU_PART_CORTEX_A73: |
| case ARM_CPU_PART_CORTEX_A75: |
| + if (processor.switch_mm != cpu_v7_bpiall_switch_mm) |
| + goto bl_error; |
| per_cpu(harden_branch_predictor_fn, cpu) = |
| harden_branch_predictor_bpiall; |
| spectre_v2_method = "BPIALL"; |
| @@ -57,6 +61,8 @@ static void cpu_v7_spectre_init(void) |
| |
| case ARM_CPU_PART_CORTEX_A15: |
| case ARM_CPU_PART_BRAHMA_B15: |
| + if (processor.switch_mm != cpu_v7_iciallu_switch_mm) |
| + goto bl_error; |
| per_cpu(harden_branch_predictor_fn, cpu) = |
| harden_branch_predictor_iciallu; |
| spectre_v2_method = "ICIALLU"; |
| @@ -82,6 +88,8 @@ static void cpu_v7_spectre_init(void) |
| ARM_SMCCC_ARCH_WORKAROUND_1, &res); |
| if ((int)res.a0 != 0) |
| break; |
| + if (processor.switch_mm != cpu_v7_hvc_switch_mm && cpu) |
| + goto bl_error; |
| per_cpu(harden_branch_predictor_fn, cpu) = |
| call_hvc_arch_workaround_1; |
| processor.switch_mm = cpu_v7_hvc_switch_mm; |
| @@ -93,6 +101,8 @@ static void cpu_v7_spectre_init(void) |
| ARM_SMCCC_ARCH_WORKAROUND_1, &res); |
| if ((int)res.a0 != 0) |
| break; |
| + if (processor.switch_mm != cpu_v7_smc_switch_mm && cpu) |
| + goto bl_error; |
| per_cpu(harden_branch_predictor_fn, cpu) = |
| call_smc_arch_workaround_1; |
| processor.switch_mm = cpu_v7_smc_switch_mm; |
| @@ -109,6 +119,11 @@ static void cpu_v7_spectre_init(void) |
| if (spectre_v2_method) |
| pr_info("CPU%u: Spectre v2: using %s workaround\n", |
| smp_processor_id(), spectre_v2_method); |
| + return; |
| + |
| +bl_error: |
| + pr_err("CPU%u: Spectre v2: incorrect context switching function, system vulnerable\n", |
| + cpu); |
| } |
| #else |
| static void cpu_v7_spectre_init(void) |