static void start_kernel(char *kernel, char *bootline, void *ofw, int isfloppy, int boothowto) { int fd; u_long marks[MARK_MAX] = {0}; int flags = LOAD_ALL; if (isfloppy) flags &= ~LOAD_BACKWARDS; /* * First, load headers using default allocator and check whether kernel * entry address matches kernel text load address. If yes, this is the * old kernel designed for ofwboot v1.8 and therefore it must be mapped * by PROM. Otherwise, map the kernel with 4MB permanent pages. */ loadfile_set_allocator(LOADFILE_NOP_ALLOCATOR); if ( (fd = loadfile(kernel, marks, LOAD_HDR|COUNT_TEXT)) != -1) { if (COMPAT_BOOT(marks) || compatmode) { (void)printf("[c] "); loadfile_set_allocator(LOADFILE_OFW_ALLOCATOR); } else { loadfile_set_allocator(LOADFILE_MMU_ALLOCATOR); } (void)printf("Loading %s: ", kernel); if (fdloadfile(fd, marks, flags) != -1) { close(fd); jump_to_kernel(marks, kernel, bootline, ofw, boothowto); } } (void)printf("Failed to load '%s'.\n", kernel); }
void parseCommand(const char *cmd){ if(strcmp(cmd, "reboot") == 0){ reboot(); }else if(strcmp(cmd, "kernel") == 0){ jump_to_kernel(); } else if(strcmp(cmd, "help") == 0){ help(); } else if(strcmp(cmd, "ramtest") == 0){ ramtest(); } else if(strcmp(cmd, "flashtest") == 0){ flashtest(); } else if(strcmp(cmd, "halt") == 0){ halt(); } else if(strcmp(cmd, "white") == 0){ vga_white(); } else if(strcmp(cmd, "black") == 0){ vga_black(); } else{ printfln("Unknown command... %s", cmd); } }
/* Prepare ATAGs, flash the cache and start the kernel */ static int start_legacy_kernel(bootm_header_t *bm_hdr_p) { int ret; struct tag *start_tag, *current_tag; ret = bootm_load_os(bm_hdr_p); if (ret) { printf("%s:%d failed to load os (%d)\n", __func__, __LINE__, ret); return ret; } start_tag = (struct tag *)CONFIG_ATAG_BASE;; current_tag = setup_start_tag(start_tag); current_tag = setup_commandline_tag(current_tag, bm_hdr_p->cmdline); current_tag = setup_memory_tags(current_tag); setup_end_tag(current_tag); cache_sync_instructions(); dcache_mmu_disable(); return jump_to_kernel(bm_hdr_p, start_tag); }
void bootstrap(void) { mmu_start(); version_print(); printf("\nMemory statistics\n"); printf(" %p|%p: bootstrap stack\n", &boot_stack, &boot_stack); printf(" %p|%p: bootstrap page table\n", &boot_pt, &boot_pt); printf(" %p|%p: boot info structure\n", &bootinfo, &bootinfo); printf(" %p|%p: kernel entry point\n", (void *) PA2KA(BOOT_OFFSET), (void *) BOOT_OFFSET); size_t i; for (i = 0; i < COMPONENTS; i++) printf(" %p|%p: %s image (%u/%u bytes)\n", components[i].start, components[i].start, components[i].name, components[i].inflated, components[i].size); void *dest[COMPONENTS]; size_t top = 0; size_t cnt = 0; bootinfo.cnt = 0; for (i = 0; i < min(COMPONENTS, TASKMAP_MAX_RECORDS); i++) { top = ALIGN_UP(top, PAGE_SIZE); if (i > 0) { bootinfo.tasks[bootinfo.cnt].addr = TOP2ADDR(top); bootinfo.tasks[bootinfo.cnt].size = components[i].inflated; str_cpy(bootinfo.tasks[bootinfo.cnt].name, BOOTINFO_TASK_NAME_BUFLEN, components[i].name); bootinfo.cnt++; } dest[i] = TOP2ADDR(top); top += components[i].inflated; cnt++; } printf("\nInflating components ... "); for (i = cnt; i > 0; i--) { void *tail = components[i - 1].start + components[i - 1].size; if (tail >= dest[i - 1]) { printf("\n%s: Image too large to fit (%p >= %p), halting.\n", components[i].name, tail, dest[i - 1]); halt(); } printf("%s ", components[i - 1].name); int err = inflate(components[i - 1].start, components[i - 1].size, dest[i - 1], components[i - 1].inflated); if (err != EOK) { printf("\n%s: Inflating error %d\n", components[i - 1].name, err); halt(); } } printf(".\n"); printf("Booting the kernel... \n"); jump_to_kernel((void *) PA2KA(BOOT_OFFSET), &bootinfo); }
void bootstrap(void) { version_print(); ofw_memmap(&bootinfo.memmap); void *bootinfo_pa = ofw_translate(&bootinfo); void *real_mode_pa = ofw_translate(&real_mode); void *loader_address_pa = ofw_translate((void *) LOADER_ADDRESS); printf("\nMemory statistics (total %llu MB)\n", bootinfo.memmap.total >> 20); printf(" %p|%p: real mode trampoline\n", &real_mode, real_mode_pa); printf(" %p|%p: boot info structure\n", &bootinfo, bootinfo_pa); printf(" %p|%p: kernel entry point\n", (void *) PA2KA(BOOT_OFFSET), (void *) BOOT_OFFSET); printf(" %p|%p: loader entry point\n", (void *) LOADER_ADDRESS, loader_address_pa); size_t i; for (i = 0; i < COMPONENTS; i++) printf(" %p|%p: %s image (%zu/%zu bytes)\n", components[i].start, ofw_translate(components[i].start), components[i].name, components[i].inflated, components[i].size); size_t dest[COMPONENTS]; size_t top = 0; size_t cnt = 0; bootinfo.taskmap.cnt = 0; for (i = 0; i < min(COMPONENTS, TASKMAP_MAX_RECORDS); i++) { top = ALIGN_UP(top, PAGE_SIZE); if (i > 0) { bootinfo.taskmap.tasks[bootinfo.taskmap.cnt].addr = (void *) PA2KA(top); bootinfo.taskmap.tasks[bootinfo.taskmap.cnt].size = components[i].inflated; str_cpy(bootinfo.taskmap.tasks[bootinfo.taskmap.cnt].name, BOOTINFO_TASK_NAME_BUFLEN, components[i].name); bootinfo.taskmap.cnt++; } dest[i] = top; top += components[i].inflated; cnt++; } void *balloc_base; void *balloc_base_pa; ofw_alloc("boot allocator area", &balloc_base, &balloc_base_pa, BALLOC_MAX_SIZE, loader_address_pa); printf(" %p|%p: boot allocator area\n", balloc_base, balloc_base_pa); void *inflate_base; void *inflate_base_pa; ofw_alloc("inflate area", &inflate_base, &inflate_base_pa, top, loader_address_pa); printf(" %p|%p: inflate area\n", inflate_base, inflate_base_pa); uintptr_t balloc_start = ALIGN_UP(top, PAGE_SIZE); size_t pages = (balloc_start + ALIGN_UP(BALLOC_MAX_SIZE, PAGE_SIZE)) >> PAGE_WIDTH; void *transtable; void *transtable_pa; ofw_alloc("translate table", &transtable, &transtable_pa, pages * sizeof(void *), loader_address_pa); printf(" %p|%p: translate table\n", transtable, transtable_pa); check_overlap("boot allocator area", balloc_base_pa, pages); check_overlap("inflate area", inflate_base_pa, pages); check_overlap("translate table", transtable_pa, pages); printf("\nInflating components ... "); for (i = cnt; i > 0; i--) { printf("%s ", components[i - 1].name); int err = inflate(components[i - 1].start, components[i - 1].size, inflate_base + dest[i - 1], components[i - 1].inflated); if (err != EOK) { printf("\n%s: Inflating error %d, halting.\n", components[i - 1].name, err); halt(); } } printf(".\n"); printf("Setting up boot allocator ...\n"); balloc_init(&bootinfo.ballocs, balloc_base, PA2KA(balloc_start), BALLOC_MAX_SIZE); printf("Setting up screens ...\n"); ofw_setup_screens(); printf("Canonizing OpenFirmware device tree ...\n"); bootinfo.ofw_root = ofw_tree_build(); printf("Setting up translate table ...\n"); for (i = 0; i < pages; i++) { uintptr_t off = i << PAGE_WIDTH; void *phys; if (off < balloc_start) phys = ofw_translate(inflate_base + off); else phys = ofw_translate(balloc_base + off - balloc_start); ((void **) transtable)[i] = phys; } printf("Booting the kernel...\n"); jump_to_kernel(bootinfo_pa, transtable_pa, pages, real_mode_pa); }