Changeset 01cb210 in mainline for arch/ppc32/loader/main.c
- Timestamp:
- 2006-03-16T18:55:50Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1f330de
- Parents:
- d89c554
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc32/loader/main.c
rd89c554 r01cb210 31 31 #include "asm.h" 32 32 33 #define KERNEL_PHYSICAL_ADDRESS 0x0000 34 #define KERNEL_VIRTUAL_ADDRESS 0x80000000 35 #define KERNEL_BOOT_OFFSET 0x2000 36 #define KERNEL_START &_binary_____________kernel_kernel_bin_start 37 #define KERNEL_END &_binary_____________kernel_kernel_bin_end 33 #define KERNEL_START ((void *) &_binary_____________kernel_kernel_bin_start) 34 #define KERNEL_END ((void *) &_binary_____________kernel_kernel_bin_end) 38 35 #define KERNEL_SIZE ((unsigned int) KERNEL_END - (unsigned int) KERNEL_START) 39 36 40 37 memmap_t memmap; 38 39 40 static void check_align(const void *addr, const char *desc) 41 { 42 if ((unsigned int) addr % PAGE_SIZE != 0) { 43 printf("Error: %s not on page boundary\n", desc); 44 halt(); 45 } 46 } 47 41 48 42 49 void bootstrap(void) … … 44 51 printf("\nHelenOS PPC Bootloader\n"); 45 52 46 void *phys = ofw_translate(&start); 47 printf("loaded at %L (physical %L)\n", &start, phys); 53 check_align(KERNEL_START, "Kernel image"); 54 check_align(&real_mode, "Bootstrap trampoline"); 55 check_align(&trans, "Translation table"); 56 57 void *real_mode_pa = ofw_translate(&real_mode); 58 void *trans_pa = ofw_translate(&trans); 59 void *memmap_pa = ofw_translate(&memmap); 60 61 printf("Memory statistics\n"); 62 printf(" kernel image at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE); 63 printf(" memory map at %L (physical %L)\n", &memmap, memmap_pa); 64 printf(" bootstrap trampoline at %L (physical %L)\n", &real_mode, real_mode_pa); 65 printf(" translation table at %L (physical %L)\n", &trans, trans_pa); 48 66 49 67 if (!ofw_memmap(&memmap)) { … … 51 69 halt(); 52 70 } 53 printf(" total memory %d MB\n", memmap.total >> 20);71 printf("Total memory %d MB\n", memmap.total >> 20); 54 72 55 if (ofw_map((void *) KERNEL_PHYSICAL_ADDRESS, (void *) KERNEL_VIRTUAL_ADDRESS, KERNEL_SIZE + KERNEL_BOOT_OFFSET, 0) != 0) { 56 printf("Unable to map kernel memory at %L (physical %L)\n", KERNEL_VIRTUAL_ADDRESS, KERNEL_PHYSICAL_ADDRESS); 57 halt(); 73 unsigned int addr; 74 unsigned int pages; 75 for (addr = 0, pages = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE, pages++) { 76 void *pa = ofw_translate(KERNEL_START + addr); 77 if ((unsigned int) pa < KERNEL_SIZE) { 78 printf("Error: Kernel image overlaps kernel physical area\n"); 79 halt(); 80 } 81 trans[addr >> PAGE_WIDTH] = pa; 58 82 } 59 printf("kernel memory mapped at %L (physical %L, size %d bytes)\n", KERNEL_VIRTUAL_ADDRESS, KERNEL_PHYSICAL_ADDRESS, KERNEL_SIZE);60 // FIXME: relocate the kernel in real mode61 memcpy((void *) KERNEL_VIRTUAL_ADDRESS, KERNEL_START, KERNEL_SIZE);62 83 63 // FIXME: proper hardware detection & mapping64 ofw_map((void *) 0x84000000, (void *) 0xf0000000, 0x01000000, 0);65 ofw_map((void *) 0x80816000, (void *) 0xf2000000, 0x00018000, 0);66 67 void *tramp = ofw_translate(&real_mode);68 printf("bootstrap trampoline at %L (physical %L)\n", &real_mode, tramp);69 84 printf("Booting the kernel...\n"); 70 71 flush_instruction_cache(); 72 jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS + KERNEL_BOOT_OFFSET, ofw_translate(&memmap), tramp); 85 jump_to_kernel(memmap_pa, trans_pa, pages, real_mode_pa); 73 86 }
Note:
See TracChangeset
for help on using the changeset viewer.