[U-Boot] arm: U-Boot API - clang support broke ABI
Jeroen Hofstee
jeroen at myspectrum.nl
Tue Nov 19 23:42:51 CET 2013
Hi Leif,
On 11/18/2013 12:26 PM, Leif Lindholm wrote:
> Commit fe1378a - "ARM: use r9 for gd" - broke the ABI for users of the
> U-Boot API on ARM. Users I am aware of are GRUB and the FreeBSD loader.
> Since I only spotted this on Saturday, this code is well and truly in
> the wild, so any users of the API will need to preserve both r8 and r9
> on syscalls for the foreseeable future (which is not the end of the
> world).
I actually broke it a bit more than that, since the stubs appear
to use the gd register directly (where I wasn't aware of and
still surprises me a bit, I will have a better look later why this is).
The patch below should help for the hello_world example on master.
(as in both u-boot and the application use r9 for gd)
I am aware this doesn't answer your question and I will come
back on that if I have a bit more time to look into it (Saterday
I guess).
Regards,
Jeroen
diff --git a/examples/standalone/stubs.c b/examples/standalone/stubs.c
index 8fb1765..5d2ab56 100644
--- a/examples/standalone/stubs.c
+++ b/examples/standalone/stubs.c
@@ -40,14 +40,14 @@ gd_t *global_data;
: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) :
"r11");
#elif defined(CONFIG_ARM)
/*
- * r8 holds the pointer to the global_data, ip is a call-clobbered
+ * r9 holds the pointer to the global_data, ip is a call-clobbered
* register
*/
#define EXPORT_FUNC(x) \
asm volatile ( \
" .globl " #x "\n" \
#x ":\n" \
-" ldr ip, [r8, %0]\n" \
+" ldr ip, [r9, %0]\n" \
" ldr pc, [ip, %1]\n" \
: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) :
"ip");
#elif defined(CONFIG_MIPS)
More information about the U-Boot
mailing list