[PATCH] Fix data abort in startup for at91 machines based on ARM926EJS
Eugen.Hristev at microchip.com
Eugen.Hristev at microchip.com
Mon Mar 1 13:17:19 CET 2021
Hi,
On 26.02.2021 10:44, Martin Townsend wrote:
> The startup code in arm/cpu/arm926ejs preserves the link register across
> the call to lowlevel_init by using r4:
>
> mov r4, lr /* perserve link reg across call */
> bl lowlevel_init /* go setup pll,mux,memory */
> mov lr, r4 /* restore link */
>
> The lowlevel_init function for at91 machines based on the same CPU uses r4
> and hence corrupts it causing a data abort when it returns to the startup
> code. This patch fixes this by using r6 instead of r4 in the lowlevel_init
> function.
>
> Discovered and the fix was tested on a AT91SAM9261 based board.
Very interesting find. I have a few questions:
How is this reproducible ?
Since when this happens ?
Do you have a fixes tag for this ?
Does it affect any board using the arm926ejs ?
Currently we have sam9x60 which is an SoC based on arm 926ejs and we did
not see this behavior as of today.
Could you also modify the subject, to adhere with the rules subsystem:
component: change
In your case it's something like
ARM: at91: arm926esj: fix usage of r4 in lowlevel_init
Thanks,
Eugen
>
> Signed-off-by: Martin Townsend <martin at rufilla.com>
> ---
> arch/arm/mach-at91/arm926ejs/lowlevel_init.S | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/arch/arm/mach-at91/arm926ejs/lowlevel_init.S b/arch/arm/mach-at91/arm926ejs/lowlevel_init.S
> index 71d7582ce0..994f42eb4a 100644
> --- a/arch/arm/mach-at91/arm926ejs/lowlevel_init.S
> +++ b/arch/arm/mach-at91/arm926ejs/lowlevel_init.S
> @@ -71,10 +71,10 @@ POS1:
> str r0, [r1]
>
> /* Reading the PMC Status to detect when the Main Oscillator is enabled */
> - mov r4, #AT91_PMC_IXR_MOSCS
> + mov r6, #AT91_PMC_IXR_MOSCS
> MOSCS_Loop:
> ldr r3, [r2]
> - and r3, r4, r3
> + and r3, r6, r3
> cmp r3, #AT91_PMC_IXR_MOSCS
> bne MOSCS_Loop
>
> @@ -89,10 +89,10 @@ MOSCS_Loop:
> str r0, [r1]
>
> /* Reading the PMC Status register to detect when the PLLA is locked */
> - mov r4, #AT91_PMC_IXR_LOCKA
> + mov r6, #AT91_PMC_IXR_LOCKA
> MOSCS_Loop1:
> ldr r3, [r2]
> - and r3, r4, r3
> + and r3, r6, r3
> cmp r3, #AT91_PMC_IXR_LOCKA
> bne MOSCS_Loop1
>
> @@ -109,10 +109,10 @@ MOSCS_Loop1:
> str r0, [r1]
>
> /* Reading the PMC Status to detect when the Master clock is ready */
> - mov r4, #AT91_PMC_IXR_MCKRDY
> + mov r6, #AT91_PMC_IXR_MCKRDY
> MCKRDY_Loop:
> ldr r3, [r2]
> - and r3, r4, r3
> + and r3, r6, r3
> cmp r3, #AT91_PMC_IXR_MCKRDY
> bne MCKRDY_Loop
>
> @@ -120,10 +120,10 @@ MCKRDY_Loop:
> str r0, [r1]
>
> /* Reading the PMC Status to detect when the Master clock is ready */
> - mov r4, #AT91_PMC_IXR_MCKRDY
> + mov r6, #AT91_PMC_IXR_MCKRDY
> MCKRDY_Loop1:
> ldr r3, [r2]
> - and r3, r4, r3
> + and r3, r6, r3
> cmp r3, #AT91_PMC_IXR_MCKRDY
> bne MCKRDY_Loop1
> PLL_setup_end:
> --
> 2.25.1
>
More information about the U-Boot
mailing list