Calculating the offset between runtime and linked address makes the
intention of the binary copy function a bit more clear.

Signed-off-by: Sascha Hauer <[email protected]>
---
 arch/arm/cpu/start.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index 523179d..cabe4d2 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -104,7 +104,7 @@ void __naked __bare_init reset(void)
  */
 void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
 {
-       uint32_t r, addr;
+       uint32_t r, addr, offset;
 
        /*
         * Get runtime address of this function. Do not
@@ -116,13 +116,13 @@ void __naked __section(.text_ll_return) 
board_init_lowlevel_return(void)
        r = STACK_BASE + STACK_SIZE - 16;
        __asm__ __volatile__("mov sp, %0" : : "r"(r));
 
-       /* Get start of binary image */
-       addr -= (uint32_t)&__ll_return - TEXT_BASE;
+       /* Get offset between linked address and runtime address */
+       offset = (uint32_t)__ll_return - addr;
 
        /* relocate to link address if necessary */
-       if (addr != TEXT_BASE)
-               memcpy((void *)TEXT_BASE, (void *)addr,
-                               (unsigned int)&__bss_start - TEXT_BASE);
+       if (offset)
+               memcpy((void *)_text, (void *)(_text - offset),
+                               __bss_start - _text);
 
        /* clear bss */
        memset(__bss_start, 0, __bss_stop - __bss_start);
-- 
1.7.10.4


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to