From 59a7c32126f7aa856221d080fa9eaba3d8bde1d2 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Thu, 13 May 2010 23:14:01 -0500 Subject: Boot, set 64bit mode, relocate from ROM. --- start.S | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 start.S (limited to 'start.S') diff --git a/start.S b/start.S new file mode 100644 index 000000000..e3d7f6d35 --- /dev/null +++ b/start.S @@ -0,0 +1,64 @@ +.section .text.intvects + +.global _start +_start: + ;// Enter 64 bit mode + mfmsr 0 + lis 11, 0x8000 + sldi 11,11, 32 + or 11,11,0 + mtmsr 11 + isync + + ;// Relocate code + bl pre_relocate ;// fill LR with address +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 + + ;// Get addresses for relocation. + ;// Write address in r5 + ;// Read address in r1 + li 5,0 + li 1, -1 ;// fill r1 with ffff..ffffff + lis 3, 0x1 + subi 3,3,1 ;// fill r3 with 0000..00ffff + xor 1,1,3 ;// mask off r1 ffff..ff0000 + + and 1,1,2 ;// and with pre_relocate's address from r2 to get start of + ;// rom section. + + ;// Moving 1MB , so load r2 with (1MB / 8 bytes per word) + lis 2, 0x2 + mtctr 2 +relocate_loop: + ld 4, 0(1) + std 4, 0(5) + dcbt 0,1 + sync + icbi 0,5 + sync + addi 1,1,8 + addi 5,5,8 + bdnz+ relocate_loop + isync + + ;// Now that we've relocated, erase exception prefix. + mfmsr 11 + li 10, 0x40 ;// bit 6 is MSR_EP + not 10,10 + and 11,11,10 + mtmsr 11 + +finished_relocate: + b _main + +.org _start + 0x100 +intvect_system_reset: + b _start + +.section .text.hreset +hreset: + b _start -- cgit v1.2.1