On Mon, Oct 5, 2009 at 8:23 AM, Simon Kagstrom <simon.kagst...@netinsight.net> wrote: > 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.kagst...@netinsight.net> > --- > cpu/arm926ejs/start.S | 3 ++- > 1 files changed, 2 insertions(+), 1 deletions(-) > > diff --git a/cpu/arm926ejs/start.S b/cpu/arm926ejs/start.S > index 8043322..ca520eb 100644 > --- a/cpu/arm926ejs/start.S > +++ b/cpu/arm926ejs/start.S > @@ -171,7 +171,8 @@ 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 sp, r0, #16 /* leave 3 words for abort-stack and > */ > + /* align stack for ldrd/strd */
This doesn't guarantee an alignment. Right above this code is a series of subtractions by constants, any one of which could throw the alignment out of whack and be difficult to figure out. IMHO it's much safer to do the subtraction to R0, then mask the bottom address bits out to guarantee alignment, then stuff the results into sp. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot