[U-Boot] [PATCH v2] arm926ejs: 16-byte align stack to avoid LDRD/STRD problems
Simon Kagstrom
simon.kagstrom at netinsight.net
Mon Oct 5 16:53:24 CEST 2009
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
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
--
1.6.0.4
More information about the U-Boot
mailing list