Kind regards

Martin



Martin Townsend | Embedded Software Engineer

[email protected]<mailto:[email protected]>


W  http://www.rufilla.com<http://www.rufilla.com/>

T    +44 (0)1865 601201

A    Building D5 | Culham Science Centre | Abingdon, UK | OX14 3DB



[rufilla_logo_transparent]<http://www.rufilla.com/>



Rufilla Ltd is a company registered in England and Wales, No. 7093478.  
Registered address : 6a St Andrew’s Court, Wellington Street, Thame, 
Oxfordshire, OX9 3WT, United Kingdom.  Rufilla Ltd cannot guarantee e-mail 
transmission to be secure or error-free as information could be intercepted, 
corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. The 
sender therefore does not accept any liability whatsoever for any errors or 
omissions in the contents of this message or that arises from any data 
corruption, interception or unauthorised amendment, whether or not these arise 
as a result of the e-mail transmission. The information on which this 
communication is based has been obtained from sources we believe to be 
reliable, but we do not guarantee its accuracy or completeness. All expressions 
of opinion are subject to change without notice.  This email may contain 
confidential information and as such, should be treated as confidential. It may 
also contain legally privileged information. It is intended solely for use by 
the normal or ordinary user of the e-mail address to which it has been 
addressed. If you are not the named addressee of this e-mail you are prohibited 
from disseminating, distributing, amending, copying or otherwise acting on the 
contents, including any attachments, of this e-mail. Please notify the sender 
immediately by e-mail if you have received this e-mail in error and immediately 
delete this e-mail from your system. You may be asked to confirm that the 
e-mail received in error has been deleted from your system and/or that you have 
not made any unauthorised use, disclosure, distribution or copy of the e-mail. 
Rufilla Ltd is a VAT registered company No.131363252.



Any and all communications sent to us may be monitored and/or stored by us to 
ensure compliance with relevant legislation, rules, and policies.  All 
communications are handled in full compliance with current data protection 
legislation including, but not limited to, EU Regulation 2016/679 General Data 
Protection Regulation (“GDPR”).  For further information, please refer to our 
Privacy 
Policy<http://www.rufilla.com/s/wp-content/uploads/2018/06/GDPR_Privacy_Notice_20180615-FINAL.pdf>



<http://www.rufilla.com/site/wp-content/uploads/2018/06/GDPR_Privacy_Notice_20180615-FINAL.pdf>


________________________________
From: [email protected] <[email protected]>
Sent: 01 March 2021 12:17
To: Martin Townsend <[email protected]>; [email protected] 
<[email protected]>
Cc: [email protected] <[email protected]>; 
[email protected] <[email protected]>
Subject: Re: [PATCH] Fix data abort in startup for at91 machines based on 
ARM926EJS

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 ?
I'm getting a custom Ronetix PM9261 board working with a 2020.01 version of 
U-Boot and just noticed that it hung with no console output so I attached a 
JTAG debugger and could see that it was stuck in the data abort so I single 
stepped through the code and could see the problem was when it returned from 
lowlevel_init and that the r4 register had been corrupted.
Since when this happens ?
I have no idea I'm afraid this is the first board that I'm trying to bring up 
that has this processor architecture.
Do you have a fixes tag for this ?
I don't I'm afraid
Does it affect any board using the arm926ejs ?
I only have this Ronetix PM9261 with has a AT91SAM9261 SoC.  I've had a look 
around and can't see any other boards that I have that use the arm926ejs 
architecture.
Currently we have sam9x60 which is an SoC based on arm 926ejs and we did
not see this behavior as of today.
Does it have the SKIP_LOWLEVEL_INIT defined? (Not sure of the exact name but 
it's something like this)  The Ronetix board runs U-Boot from the NOR flash 
using XIP so the startup code runs from NOR and must run the lowlevel_init 
function.  Maybe the board you have skips the low level intiailisation, just a 
guess though.

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

Sure will do if you think it's a valid bug.

Thanks,
Eugen

>
> Signed-off-by: Martin Townsend <[email protected]>
> ---
>   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
>

Reply via email to