From c21a7fb9f15ee1fb213e22c0e7a9d0f53b274cb2 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 19 May 2010 13:23:43 +0200 Subject: [PATCH] arm start.c: Make runtime function address calculation tolerant for more compilers Signed-off-by: Sascha Hauer --- arch/arm/cpu/start.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 67d54a6a7..eea7dcfa3 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 */