Rev 534 | Rev 845 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 534 | Rev 843 | ||
---|---|---|---|
Line 25... | Line 25... | ||
25 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
25 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | # |
27 | # |
28 | 28 | ||
29 | #include <arch/asm/macro.h> |
29 | #include <arch/asm/macro.h> |
- | 30 | #include <arch/asm/spr.h> |
|
30 | 31 | ||
31 | .section K_TEXT_START |
32 | .section K_TEXT_START |
32 | 33 | ||
33 | .global kernel_image_start |
34 | .global kernel_image_start |
34 | 35 | ||
- | 36 | .org 0x0 |
|
- | 37 | /* 256 bytes of some data */ |
|
- | 38 | /* exception table - must use 'ba' instructions for branches, |
|
- | 39 | * because it is elsewhere than the linker thinks |
|
- | 40 | */ |
|
- | 41 | .space 4096 |
|
- | 42 | ||
35 | kernel_image_start: |
43 | kernel_image_start: |
- | 44 | /* Initialize OFW, might be needed before relocate_kernel? */ |
|
36 | lis r4, ofw@ha |
45 | lis r4, ofw@ha |
37 | addi r4, r4, ofw@l |
46 | addi r4, r4, ofw@l |
38 | stw r5, 0(r4) |
47 | stw r5, 0(r4) |
39 | 48 | ||
40 | bl ofw_init |
49 | bl ofw_init |
- | 50 | bl preboot_read_config |
|
41 | 51 | ||
- | 52 | bl relocate_kernel |
|
- | 53 | __after_reloc: |
|
- | 54 | /* Set stack to some more meaningful value */ |
|
- | 55 | /* TODO: This is hardcoded for PearPC, must be changed later */ |
|
- | 56 | lis r1, 0x70 |
|
42 | b main_bsp |
57 | b main_bsp |
- | 58 | ||
- | 59 | relocate_kernel: |
|
- | 60 | /* TODO: We _know_ that pearpc loads it to 8MB, and |
|
- | 61 | * but it should be really generic |
|
- | 62 | */ |
|
- | 63 | lis r4, 0x80 /* r4 is where data was loaded - 8MB */ |
|
- | 64 | ||
- | 65 | bl to_real_mode |
|
- | 66 | /* Now we are in real mode, copy first block and jump to it, |
|
- | 67 | * we are running in the loaded kernel now |
|
- | 68 | * We still have in r3 physical load kernel address |
|
- | 69 | */ |
|
- | 70 | ||
- | 71 | b __after_reloc /* We know in pearpc we are ok, so return, |
|
- | 72 | * otherwise we should relocate kernel |
|
- | 73 | * here |
|
- | 74 | */ |
|
- | 75 | ||
- | 76 | ||
- | 77 | ||
- | 78 | ||
- | 79 | /* Turn off page translation |
|
- | 80 | * - assume that physical-loaded address is in r4 |
|
- | 81 | */ |
|
- | 82 | to_real_mode: |
|
- | 83 | mflr r0 |
|
- | 84 | ||
- | 85 | lis r5, ktext_start@ha // Expected start of kernel |
|
- | 86 | addi r5, r5, ktext_start@l |
|
- | 87 | ||
- | 88 | add r0, r4, r0 |
|
- | 89 | sub r0, r0, r5 // r0 now contains physical return address |
|
- | 90 | ||
- | 91 | mfmsr r3 |
|
- | 92 | andis. r3, r3, (~MSR_DR | MSR_IR) >> 16 |
|
- | 93 | mtspr SPRN_SRR0, r0 |
|
- | 94 | mtspr SPRN_SRR1, r3 |
|
- | 95 | sync // Really needed? RFI should do it as well? |
|
- | 96 | RFI |
|
- | 97 |