diff mbox

[U-Boot,27/32] x86: Fix incorrect usage of relocation offset

Message ID 1296822959-3927-28-git-send-email-graeme.russ@gmail.com
State Accepted
Commit 5fed82110dff2d378e0a50787dcd1a96d83c3c5b
Delegated to: Graeme Russ
Headers show

Commit Message

Graeme Russ Feb. 4, 2011, 12:35 p.m. UTC
x86 has always used relocation offset in the opposite sense to the ELF
standard - Fix this

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/i386/cpu/start.S |    2 +-
 arch/i386/lib/board.c |   10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

Comments

Graeme Russ Feb. 12, 2011, 4:30 a.m. UTC | #1
On 04/02/11 23:35, Graeme Russ wrote:
> x86 has always used relocation offset in the opposite sense to the ELF
> standard - Fix this
> 
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
>  arch/i386/cpu/start.S |    2 +-
>  arch/i386/lib/board.c |   10 +++++-----
>  2 files changed, 6 insertions(+), 6 deletions(-)
> 

Applied to u-boot-x86

Regards,

Graeme
diff mbox

Patch

diff --git a/arch/i386/cpu/start.S b/arch/i386/cpu/start.S
index fd018bf..0031389 100644
--- a/arch/i386/cpu/start.S
+++ b/arch/i386/cpu/start.S
@@ -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
diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c
index 44441a9..02cb67d 100644
--- a/arch/i386/lib/board.c
+++ b/arch/i386/lib/board.c
@@ -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;