[PATCH] ARM: need to save/restore arm register(r11) when it is corrupted

Nicolas Pitre nicolas.pitre at linaro.org
Fri Dec 4 12:20:21 PST 2015


On Fri, 4 Dec 2015, Anson Huang wrote:

> In cpu_v7_do_suspend routine, r11 is used while it is NOT
> saved/restored, different compiler may have different usage
> of ARM general registers, so it may cause issues during
> calling cpu_v7_do_suspend.
> 
> We meet kernel fault occurs when using GCC 4.8.3, r11 contains
> valid value before calling into cpu_v7_do_suspend, but when returned
> from this routine, r11 is corrupted and lead to kernel fault.
> Doing save/restore for those corrupted registers is a must in
> assemble code.
> 
> Signed-off-by: Anson Huang <Anson.Huang at freescale.com>

Clearly, this is a nasty bug that has been there unnoticed for the last 
4 years.  The culprit is commit 1b6ba46b7e.

You may add the following tags:

Reviewed-by: Nicolas Pitre <nico at linaro.org>
Cc: <stable at vger.kernel.org> # v3.3+

> ---
>  arch/arm/mm/proc-v7.S | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
> index de2b246..8e1ea43 100644
> --- a/arch/arm/mm/proc-v7.S
> +++ b/arch/arm/mm/proc-v7.S
> @@ -95,7 +95,7 @@ ENDPROC(cpu_v7_dcache_clean_area)
>  .equ	cpu_v7_suspend_size, 4 * 9
>  #ifdef CONFIG_ARM_CPU_SUSPEND
>  ENTRY(cpu_v7_do_suspend)
> -	stmfd	sp!, {r4 - r10, lr}
> +	stmfd	sp!, {r4 - r11, lr}
>  	mrc	p15, 0, r4, c13, c0, 0	@ FCSE/PID
>  	mrc	p15, 0, r5, c13, c0, 3	@ User r/o thread ID
>  	stmia	r0!, {r4 - r5}
> @@ -112,7 +112,7 @@ ENTRY(cpu_v7_do_suspend)
>  	mrc	p15, 0, r9, c1, c0, 1	@ Auxiliary control register
>  	mrc	p15, 0, r10, c1, c0, 2	@ Co-processor access control
>  	stmia	r0, {r5 - r11}
> -	ldmfd	sp!, {r4 - r10, pc}
> +	ldmfd	sp!, {r4 - r11, pc}
>  ENDPROC(cpu_v7_do_suspend)
>  
>  ENTRY(cpu_v7_do_resume)
> -- 
> 1.9.1
> 
> 



More information about the linux-arm-kernel mailing list