]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
x86: Fix incorrect usage of relocation offset
authorGraeme Russ <graeme.russ@gmail.com>
Sat, 12 Feb 2011 04:12:05 +0000 (15:12 +1100)
committerGraeme Russ <graeme.russ@gmail.com>
Sat, 12 Feb 2011 04:12:05 +0000 (15:12 +1100)
x86 has always used relocation offset in the opposite sense to the ELF
standard - Fix this

arch/i386/cpu/start.S
arch/i386/lib/board.c

index fd018bf8224be94682cc51684bfef4ab41273ebf..00313897ce8517da4288e2870a4c97593ed48adb 100644 (file)
@@ -120,7 +120,7 @@ relocate_code:
 
        /* Setup call address of in-RAM copy of board_init_r() */
        movl    $board_init_r, %ebp
-       subl    (GD_RELOC_OFF * 4)(%edx), %ebp
+       addl    (GD_RELOC_OFF * 4)(%edx), %ebp
 
        /* Setup parameters to board_init_r() */
        movl    %edx, %eax
index 32f013aefdc2c8bdeb0c3cd05a7033ed75d52093..8ec04462b9197f0a8122c4b068a666021149032d 100644 (file)
@@ -214,7 +214,7 @@ void board_init_f(ulong boot_flags)
        addr_sp = dest_addr;
        dest_addr -= CONFIG_SYS_STACK_SIZE;
        dest_addr -= (bss_end - text_start);
-       rel_offset = text_start - dest_addr;
+       rel_offset = dest_addr - text_start;
 
        /* First stage CPU initialization */
        if (cpu_init_f() != 0)
@@ -233,8 +233,8 @@ void board_init_f(ulong boot_flags)
                *dst_addr++ = *src_addr++;
 
        /* Clear BSS */
-       dst_addr = (ulong *)(bss_start - rel_offset);
-       end_addr = (ulong *)(bss_end - rel_offset);
+       dst_addr = (ulong *)(bss_start + rel_offset);
+       end_addr = (ulong *)(bss_end + rel_offset);
 
        while (dst_addr < end_addr)
                *dst_addr++ = 0x00000000;
@@ -245,8 +245,8 @@ void board_init_f(ulong boot_flags)
 
        do {
                if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE)
-                       if (*(Elf32_Addr *)(re_src->r_offset - rel_offset) >= CONFIG_SYS_TEXT_BASE)
-                               *(Elf32_Addr *)(re_src->r_offset - rel_offset) -= rel_offset;
+                       if (*(Elf32_Addr *)(re_src->r_offset + rel_offset) >= CONFIG_SYS_TEXT_BASE)
+                               *(Elf32_Addr *)(re_src->r_offset + rel_offset) += rel_offset;
        } while (re_src++ < re_end);
 
        gd->reloc_off = rel_offset;