diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2010-05-19 13:23:43 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2010-06-13 13:07:12 +0200 |
commit | c21a7fb9f15ee1fb213e22c0e7a9d0f53b274cb2 (patch) | |
tree | 5ed41021e38f66932412900bc893c1a3f0eec0c9 | |
parent | ce971c2367ed57d947f73347f6f9ab3263aec4b9 (diff) | |
download | barebox-c21a7fb9f15ee1fb213e22c0e7a9d0f53b274cb2.tar.gz barebox-c21a7fb9f15ee1fb213e22c0e7a9d0f53b274cb2.tar.xz |
arm start.c: Make runtime function address calculation tolerant for more compilers
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/arm/cpu/start.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 67d54a6a76..eea7dcfa3c 100644 --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -81,21 +81,24 @@ void __naked __bare_init reset(void) */ void __naked __bare_init board_init_lowlevel_return(void) { - uint32_t r; + uint32_t r, addr; + + /* + * Get runtime address of this function. Do not + * put any code above this. + */ + __asm__ __volatile__("1: adr %0, 1b":"=r"(addr)); /* Setup the stack */ r = STACK_BASE + STACK_SIZE - 16; __asm__ __volatile__("mov sp, %0" : : "r"(r)); - /* Get runtime address of this function */ - __asm__ __volatile__("adr %0, 0":"=r"(r)); - /* Get start of binary image */ - r -= (uint32_t)&board_init_lowlevel_return - TEXT_BASE; + addr -= (uint32_t)&board_init_lowlevel_return - TEXT_BASE; /* relocate to link address if necessary */ - if (r != TEXT_BASE) - memcpy((void *)TEXT_BASE, (void *)r, + if (addr != TEXT_BASE) + memcpy((void *)TEXT_BASE, (void *)addr, (unsigned int)&__bss_start - TEXT_BASE); /* clear bss */ |