//boot/trunk/arch/ppc32/loader/asm.S |
---|
108,12 → 108,13 |
jump_to_kernel: |
# r3 = memmap (pa) |
# r4 = trans (pa) |
# r5 = kernel size |
# r6 = real_mode (pa) |
# r3 = bootinfo (pa) |
# r4 = bootinfo_size |
# r5 = trans (pa) |
# r6 = kernel size |
# r7 = real_mode (pa) |
mtspr srr0, r6 |
mtspr srr0, r7 |
# jumps to real_mode |
132,8 → 133,8 |
# copy kernel to proper location |
# |
# r4 = trans (pa) |
# r5 = kernel size |
# r5 = trans (pa) |
# r6 = kernel size |
li r31, PAGE_SIZE >> 2 |
li r30, 0 |
140,13 → 141,13 |
page_copy: |
cmpwi r5, 0 |
cmpwi r6, 0 |
beq copy_end |
# copy page |
mtctr r31 |
lwz r29, 0(r4) |
lwz r29, 0(r5) |
copy_loop: |
155,14 → 156,14 |
addi r29, r29, 4 |
addi r30, r30, 4 |
subi r5, r5, 4 |
subi r6, r6, 4 |
cmpwi r5, 0 |
cmpwi r6, 0 |
beq copy_end |
bdnz copy_loop |
addi r4, r4, 4 |
addi r5, r5, 4 |
b page_copy |
copy_end: |
238,7 → 239,7 |
# start the kernel |
# |
# r3 = memmap (pa) |
# r3 = bootinfo (pa) |
lis r31, KERNEL_START_ADDR@ha |
addi r31, r31, KERNEL_START_ADDR@l |
//boot/trunk/arch/ppc32/loader/main.c |
---|
36,11 → 36,6 |
#define HEAP_GAP 1024000 |
typedef struct { |
memmap_t memmap; |
screen_t screen; |
} bootinfo_t; |
bootinfo_t bootinfo; |
123,5 → 118,5 |
fix_overlap(&bootinfo, &bootinfo_pa, "Boot info", &top); |
printf("\nBooting the kernel...\n"); |
jump_to_kernel(bootinfo_pa, trans_pa, KERNEL_SIZE, real_mode_pa); |
jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, KERNEL_SIZE, real_mode_pa); |
} |
//boot/trunk/arch/ppc32/loader/asm.h |
---|
44,7 → 44,7 |
extern void *trans[TRANS_SIZE]; |
extern void halt(); |
extern void jump_to_kernel(void *memmap, void *trans, unsigned int kernel_size, void *real_mode) __attribute__((noreturn)); |
extern void jump_to_kernel(void *bootinfo, unsigned int bootinfo_size, void *trans, unsigned int kernel_size, void *real_mode) __attribute__((noreturn)); |
extern void real_mode(); |
#endif |
//boot/trunk/arch/ppc32/loader/main.h |
---|
38,6 → 38,11 |
*/ |
#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) |
typedef struct { |
memmap_t memmap; |
screen_t screen; |
} bootinfo_t; |
extern int _binary_____________kernel_kernel_bin_start; |
extern int _binary_____________kernel_kernel_bin_end; |
extern void start(void); |