Changeset 3eee37d in mainline for arch/ppc32/loader/main.c
- Timestamp:
- 2006-05-18T19:42:34Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- de1b8b1
- Parents:
- a62347a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc32/loader/main.c
ra62347a r3eee37d 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 int) KERNEL_END - (unsigned int) KERNEL_START) 36 37 #define INIT_START ((void *) &_binary_____________uspace_init_init_start) 38 #define INIT_END ((void *) &_binary_____________uspace_init_init_end) 39 #define INIT_SIZE ((unsigned int) INIT_END - (unsigned int) INIT_START) 32 #include "_components.h" 40 33 41 34 #define HEAP_GAP 1024000 … … 83 76 printf("\nHelenOS PPC Bootloader\n"); 84 77 85 check_align(KERNEL_START, "Kernel image"); 86 check_align(INIT_START, "Init image"); 87 check_align(&real_mode, "Bootstrap trampoline"); 88 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"); 89 87 90 88 if (!ofw_memmap(&bootinfo.memmap)) { 91 printf("Error: Unable to get memory map, halting.\n");89 printf("Error: unable to get memory map, halting.\n"); 92 90 halt(); 93 91 } 94 92 95 93 if (bootinfo.memmap.total == 0) { 96 printf("Error: No memory detected, halting.\n");94 printf("Error: no memory detected, halting.\n"); 97 95 halt(); 98 96 } 99 97 100 98 if (!ofw_screen(&bootinfo.screen)) { 101 printf("Error: Unable to get screen properties, halting.\n");99 printf("Error: unable to get screen properties, halting.\n"); 102 100 halt(); 103 101 } … … 112 110 113 111 printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20); 114 printf(" kernel image at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE);115 printf(" init image at %L (size %d bytes)\n", INIT_START, INIT_SIZE);116 printf(" boot info structure at %L (physical %L)\n", &bootinfo, bootinfo_pa);117 printf(" bootstrap trampoline at %L (physical %L)\n", &real_mode, real_mode_pa);118 printf(" translation table at %L (physical %L)\n", &trans, trans_pa);112 printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa); 113 printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa); 114 printf(" %L: translation table (physical %L)\n", &trans, trans_pa); 115 for (i = 0; i < COMPONENTS; i++) 116 printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); 119 117 120 unsigned int top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) + ALIGN_UP(INIT_SIZE, PAGE_SIZE);121 unsigned int kernel_pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH;122 unsigned int init_pages = ALIGN_UP(INIT_SIZE, PAGE_SIZE) >> PAGE_WIDTH;118 unsigned int top = 0; 119 for (i = 0; i < COMPONENTS; i++) 120 top += ALIGN_UP(components[i].size, PAGE_SIZE); 123 121 124 unsigned int i;122 unsigned int pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH; 125 123 126 for (i = 0; i < kernel_pages; i++) {124 for (i = 0; i < pages; i++) { 127 125 void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH)); 128 fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, " Kernel image", &top);126 fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top); 129 127 trans[i] = pa; 130 128 } 131 129 132 for (i = 0; i < init_pages; i++) { 133 void *pa = ofw_translate(INIT_START + (i << PAGE_WIDTH)); 134 fix_overlap(INIT_START + (i << PAGE_WIDTH), &pa, "Init image", &top); 135 trans[kernel_pages + i] = pa; 136 if (i == 0) { 137 bootinfo.init.addr = (void *) ((kernel_pages + i) << PAGE_WIDTH); 138 bootinfo.init.size = INIT_SIZE; 130 bootinfo.taskmap.count = 0; 131 for (i = 1; i < COMPONENTS; i++) { 132 unsigned int component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH; 133 unsigned int j; 134 135 for (j = 0; j < component_pages; j++) { 136 void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH)); 137 fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top); 138 trans[pages + j] = pa; 139 if (j == 0) { 140 bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH); 141 bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size; 142 bootinfo.taskmap.count++; 143 } 139 144 } 145 146 pages += component_pages; 140 147 } 141 148 142 fix_overlap(&real_mode, &real_mode_pa, " Bootstrap trampoline", &top);143 fix_overlap(&trans, &trans_pa, " Translation table", &top);144 fix_overlap(&bootinfo, &bootinfo_pa, " Boot info", &top);149 fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top); 150 fix_overlap(&trans, &trans_pa, "translation table", &top); 151 fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top); 145 152 146 153 printf("\nBooting the kernel...\n"); 147 jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, (kernel_pages + init_pages)<< PAGE_WIDTH, fb, real_mode_pa);154 jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, fb, real_mode_pa); 148 155 }
Note:
See TracChangeset
for help on using the changeset viewer.