From e0a656540df6e0a138d3e56e928b7be218092dfc Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Fri, 14 May 2010 15:47:08 -0500 Subject: Relocate kernel image to start at 0. --- kernel.ld | 9 +++++---- start.S | 11 +++++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/kernel.ld b/kernel.ld index 9b7ddd6e0..45fb1615a 100644 --- a/kernel.ld +++ b/kernel.ld @@ -1,12 +1,13 @@ -base_load_address = 0xfff00000; -text_load_address = 0xfff08000; -hreset_load_address = 0xfffffffc; +rom_offset = 0xfff00000; +base_load_address = 0x00000000; +text_load_address = 0x00008000; +hreset_load_address = 0x000ffffc; SECTIONS { . = base_load_address; - .text.intvects ALIGN(0x1000): { + .text.intvects ALIGN(0x1000): AT(base_load_address + rom_offset) { *(.text.intvects) } diff --git a/start.S b/start.S index 4cc6891ea..57495d212 100644 --- a/start.S +++ b/start.S @@ -15,8 +15,8 @@ _start: pre_relocate: mflr 2 lis 1,0x0010 - cmp 0,2,1 ;// Check LR is less than 1MB - bc 0,0,finished_relocate ;// No need to relocate if less than 1MB + cmpl 0,2,1 ;// Check LR is less than 1MB + blt finished_relocate ;// No need to relocate if less than 1MB ;// Get addresses for relocation. ;// Write address in r5 @@ -30,6 +30,10 @@ pre_relocate: and 1,1,2 ;// and with pre_relocate's address from r2 to get start of ;// rom section. + ;// Update LR to low address. + and 6,2,3 + mtlr 6 + ;// Moving 1MB , so load r2 with (1MB / 8 bytes per word) lis 2, 0x2 mtctr 2 @@ -51,6 +55,9 @@ relocate_loop: not 10,10 and 11,11,10 mtmsr 11 + + ;// Jump to low address. + blr finished_relocate: b _main -- cgit v1.2.1