aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorGraeme Russ <graeme.russ@gmail.com>2012-01-01 15:57:02 +1100
committerGraeme Russ <graeme.russ@gmail.com>2012-01-04 22:17:22 +1100
commit240ab5aa2161df500e8950c2a4f392e84324f78a (patch)
tree8a1bf59b2f6fa60ea8145fe16735d88c60b0d33f /arch
parentf48dd6fc6cc9fdf15408e98132dc5575a31026cf (diff)
x86: Rework relocation calculations
This commit introduces no functional changes - It simply re-arranges the calculations so that adding to them in future commits will be cleaner -- Changes for v2: - Fixed typo in title - Added commit message
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/lib/board.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 382ada784..6f075b7aa 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -164,24 +164,23 @@ static int calculate_relocation_address(void)
ulong text_start = (ulong)&__text_start;
ulong bss_end = (ulong)&__bss_end;
ulong dest_addr;
- ulong rel_offset;
-
- /* Calculate destination RAM Address and relocation offset */
- dest_addr = gd->ram_size;
- dest_addr -= CONFIG_SYS_STACK_SIZE;
- dest_addr -= (bss_end - text_start);
/*
- * Round destination address down to 16-byte boundary to keep
- * IDT and GDT 16-byte aligned
+ * NOTE: All destination address are rounded down to 16-byte
+ * boundary to satisfy various worst-case alignment
+ * requirements
*/
- dest_addr &= ~15;
- rel_offset = dest_addr - text_start;
+ /* Stack is at top of available memory */
+ dest_addr = gd->ram_size;
+ gd->start_addr_sp = dest_addr;
- gd->start_addr_sp = gd->ram_size;
+ /* U-Boot is below the stack */
+ dest_addr -= CONFIG_SYS_STACK_SIZE;
+ dest_addr -= (bss_end - text_start);
+ dest_addr &= ~15;
gd->relocaddr = dest_addr;
- gd->reloc_off = rel_offset;
+ gd->reloc_off = (dest_addr - text_start);
return 0;
}