Changeset 6bbb1610 in mainline for arch/ppc64/loader/main.c
- Timestamp:
- 2006-05-21T20:13:14Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 433a2aa
- Parents:
- 0ab829c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc64/loader/main.c
r0ab829c r6bbb1610 30 30 #include "printf.h" 31 31 #include "asm.h" 32 33 #define KERNEL_START ((void *) &_binary_____________kernel_kernel_bin_start) 34 #define KERNEL_END ((void *) &_binary_____________kernel_kernel_bin_end) 35 #define KERNEL_SIZE ((unsigned long) KERNEL_END - (unsigned long) KERNEL_START) 32 #include "_components.h" 36 33 37 34 #define HEAP_GAP 1024000 … … 77 74 void bootstrap(void) 78 75 { 79 printf("\nHelenOS PPC 64Bootloader\n");76 printf("\nHelenOS PPC Bootloader\n"); 80 77 81 check_align(KERNEL_START, "Kernel image"); 82 check_align(&real_mode, "Bootstrap trampoline"); 83 check_align(&trans, "Translation table"); 78 init_components(); 79 80 unsigned int i; 81 82 for (i = 0; i < COMPONENTS; i++) 83 check_align(components[i].start, components[i].name); 84 85 check_align(&real_mode, "bootstrap trampoline"); 86 check_align(&trans, "translation table"); 84 87 85 88 if (!ofw_memmap(&bootinfo.memmap)) { 86 printf("Error: Unable to get memory map, halting.\n");89 printf("Error: unable to get memory map, halting.\n"); 87 90 halt(); 88 91 } 89 92 90 93 if (bootinfo.memmap.total == 0) { 91 printf("Error: No memory detected, halting.\n");94 printf("Error: no memory detected, halting.\n"); 92 95 halt(); 93 96 } 94 97 95 98 if (!ofw_screen(&bootinfo.screen)) { 96 printf("Error: Unable to get screen properties, halting.\n");99 printf("Error: unable to get screen properties, halting.\n"); 97 100 halt(); 98 101 } … … 104 107 void *trans_pa = ofw_translate(&trans); 105 108 void *bootinfo_pa = ofw_translate(&bootinfo); 106 void *fb = (void *) (((unsigned long) bootinfo.screen.addr) & ((unsigned long) ~0 << 17));107 109 108 110 printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20); 109 printf(" kernel image at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE); 110 printf(" boot info at %L (physical %L)\n", &bootinfo, bootinfo_pa); 111 printf(" bootstrap trampoline at %L (physical %L)\n", &real_mode, real_mode_pa); 112 printf(" translation table at %L (physical %L)\n", &trans, trans_pa); 111 printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa); 112 printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa); 113 printf(" %L: translation table (physical %L)\n", &trans, trans_pa); 114 for (i = 0; i < COMPONENTS; i++) 115 printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); 113 116 114 unsigned long top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE); 115 unsigned long addr; 116 for (addr = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE) { 117 void *pa = ofw_translate(KERNEL_START + addr); 118 fix_overlap(KERNEL_START + addr, &pa, "Kernel image", &top); 119 trans[addr >> PAGE_WIDTH] = pa; 117 unsigned long top = 0; 118 for (i = 0; i < COMPONENTS; i++) 119 top += ALIGN_UP(components[i].size, PAGE_SIZE); 120 121 unsigned long pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH; 122 123 for (i = 0; i < pages; i++) { 124 void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH)); 125 fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top); 126 trans[i] = pa; 120 127 } 121 128 122 fix_overlap(&real_mode, &real_mode_pa, "Bootstrap trampoline", &top); 123 fix_overlap(&trans, &trans_pa, "Translation table", &top); 124 fix_overlap(&bootinfo, &bootinfo_pa, "Boot info", &top); 129 bootinfo.taskmap.count = 0; 130 for (i = 1; i < COMPONENTS; i++) { 131 unsigned long component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH; 132 unsigned long j; 133 134 for (j = 0; j < component_pages; j++) { 135 void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH)); 136 fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top); 137 trans[pages + j] = pa; 138 if (j == 0) { 139 bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH); 140 bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size; 141 bootinfo.taskmap.count++; 142 } 143 } 144 145 pages += component_pages; 146 } 147 148 fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top); 149 fix_overlap(&trans, &trans_pa, "translation table", &top); 150 fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top); 125 151 126 152 printf("\nBooting the kernel...\n"); 127 jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, KERNEL_SIZE, fb, real_mode_pa);153 jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, real_mode_pa); 128 154 }
Note:
See TracChangeset
for help on using the changeset viewer.