[U-Boot] [PATCH v2] arm926ejs: 16-byte align stack to avoid LDRD/STRD problems

Måns Rullgård mans at mansr.com
Tue Oct 6 00:07:04 CEST 2009


Simon Kagstrom <simon.kagstrom at netinsight.net> writes:

> U-boot for Marvell Kirkwood boards no longer work after the EABI changes
> introduced in commit f772acf8a584067033eff1e231fcd1fb3a00d3d9. This
> turns out to be caused by a stack alignment issue. The armv5te
> instructions ldrd/strd instructions require 8-byte alignment to work
> properly (otherwise undefined behavior), and start.S gave the stack a
> 12-byte alignment.
>
> Tested on an OpenRD base board, where both printouts and ubifs stuff now
> works.
>
> Signed-off-by: Simon Kagstrom <simon.kagstrom at netinsight.net>
> ---
> ChangeLog:
>  v2: Update after Andrews comments
>    * Mask away the low address bits to get 16-byte alignment
>
>  cpu/arm926ejs/start.S |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/cpu/arm926ejs/start.S b/cpu/arm926ejs/start.S
> index 8043322..cd3a6bd 100644
> --- a/cpu/arm926ejs/start.S
> +++ b/cpu/arm926ejs/start.S
> @@ -171,7 +171,10 @@ stack_setup:
>  #ifdef CONFIG_USE_IRQ
>  	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
>  #endif
> -	sub	sp, r0, #12		/* leave 3 words for abort-stack    */
> +	sub	r0, r0, #12		/* leave 3 words for abort-stack and */
> +	mov	r1, #7			/* 8-byte align stack for ldrd/strd */
> +	and	r1, r0
> +	sub	sp, r0, r1

Why not simply do this:

	sub	r0, r0, #12
	bic	sp, r0, #7

-- 
Måns Rullgård
mans at mansr.com



More information about the U-Boot mailing list