//boot/trunk/arch/ppc32/loader/asm.S |
---|
180,6 → 180,53 |
blr |
jump_to_kernel: |
# r3 = kernel_start (va) |
# r4 = memmap (pa) |
# r5 = real_mode (pa) |
mtspr srr0, r5 |
# jumps to real_mode |
mfmsr r5 |
lis r6, ~0@h |
ori r6, r6, ~(msr_ir | msr_dr)@l |
and r5, r5, r6 |
mtspr srr1, r5 |
rfi |
.section REALMODE |
.align 12 |
.global real_mode |
real_mode: |
# fill segment registers |
li r5, 16 |
mtctr r5 |
li r5, 0 |
li r6, 0 |
seg_fill: |
mtsrin r6, r5 |
addis r5, r5, 0x1000 # move to next SR |
addis r6, r6, 0x10 # add 256 MB, move to next SR |
bdnz seg_fill |
# bootstrap kernel |
# |
# r3 = kernel_start (va) |
# r4 = memmap (pa) -> r10 |
mtspr srr0, r3 |
mfmsr r5 |
ori r5, r5, (msr_ir | msr_dr)@l |
mtspr srr1, r5 |
mr r10, r4 |
mtlr r3 |
blr |
rfi |
//boot/trunk/arch/ppc32/loader/main.c |
---|
52,8 → 52,7 |
} |
printf("total memory %d MB\n", memmap.total >> 20); |
// FIXME: map just the kernel |
if (ofw_map((void *) KERNEL_PHYSICAL_ADDRESS, (void *) KERNEL_VIRTUAL_ADDRESS, memmap.total - 64 * 1024 * 1024, 0) != 0) { |
if (ofw_map((void *) KERNEL_PHYSICAL_ADDRESS, (void *) KERNEL_VIRTUAL_ADDRESS, KERNEL_SIZE + KERNEL_BOOT_OFFSET, 0) != 0) { |
printf("Unable to map kernel memory at %L (physical %L)\n", KERNEL_VIRTUAL_ADDRESS, KERNEL_PHYSICAL_ADDRESS); |
halt(); |
} |
65,8 → 64,10 |
ofw_map((void *) 0x84000000, (void *) 0xf0000000, 0x01000000, 0); |
ofw_map((void *) 0x80816000, (void *) 0xf2000000, 0x00018000, 0); |
void *tramp = ofw_translate(&real_mode); |
printf("bootstrap trampoline at %L (physical %L)\n", &real_mode, tramp); |
printf("Booting the kernel...\n"); |
flush_instruction_cache(); |
jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS + KERNEL_BOOT_OFFSET, ofw_translate(&memmap)); |
jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS + KERNEL_BOOT_OFFSET, ofw_translate(&memmap), tramp); |
} |
//boot/trunk/arch/ppc32/loader/asm.h |
---|
30,7 → 30,8 |
#define __ASM_H__ |
void flush_instruction_cache(void); |
void jump_to_kernel(void *code, void *memmap) __attribute__((noreturn)); |
void jump_to_kernel(void *code, void *memmap, void *real_mode) __attribute__((noreturn)); |
void real_mode(void *code, void *memmap); |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
//boot/trunk/arch/ppc32/loader/_link.ld |
---|
9,6 → 9,7 |
SECTIONS { |
.image 0x10000000: AT (0) { |
*(BOOTSTRAP) |
*(REALMODE) |
*(.text); |
*(.rodata); |
//boot/trunk/arch/ppc32/loader/Makefile |
---|
65,7 → 65,7 |
-include Makefile.depend |
image.boot: depend $(OBJECTS) kernel.o |
$(LD) -no-check-sections -N -T _link.ld $(OBJECTS) kernel.o -o $@ |
$(LD) -no-check-sections -N -T _link.ld -Map map $(OBJECTS) kernel.o -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |