void bmk_multiboot(struct multiboot_info *mbi) { unsigned long cmdlinelen; char *cmdline; bmk_printf_init(bmk_cons_putc, NULL); bmk_core_init(BMK_THREAD_STACK_PAGE_ORDER, PAGE_SIZE); bmk_printf("rump kernel bare metal multibootstrap\n\n"); /* save the command line before something overwrites it */ cmdline = (char *)(uintptr_t)mbi->cmdline; cmdlinelen = bmk_strlen(cmdline); if (cmdlinelen >= BMK_MULTIBOOT_CMDLINE_SIZE) bmk_platform_halt("command line too long, " "increase BMK_MULTIBOOT_CMDLINE_SIZE"); bmk_strcpy(bmk_multiboot_cmdline, cmdline); if ((mbi->flags & MULTIBOOT_MEMORY_INFO) == 0) bmk_platform_halt("multiboot memory info not available\n"); if (parsemem(mbi->mmap_addr, mbi->mmap_length) != 0) bmk_platform_halt("multiboot memory parse failed"); bmk_intr_init(); }
/* * INITIAL C ENTRY POINT. */ void _minios_start_kernel(start_info_t *si) { bmk_printf_init(minios_putc, NULL); bmk_core_init(STACK_SIZE_PAGE_ORDER, PAGE_SHIFT); arch_init(si); trap_init(); bmk_sched_init(); /* print out some useful information */ minios_printk(" start_info: %p(VA)\n", si); minios_printk(" nr_pages: 0x%lx\n", si->nr_pages); minios_printk(" shared_inf: 0x%08lx(MA)\n", si->shared_info); minios_printk(" pt_base: %p(VA)\n", (void *)si->pt_base); minios_printk("nr_pt_frames: 0x%lx\n", si->nr_pt_frames); minios_printk(" mfn_list: %p(VA)\n", (void *)si->mfn_list); minios_printk(" mod_start: 0x%lx(VA)\n", si->mod_start); minios_printk(" mod_len: %lu\n", si->mod_len); minios_printk(" flags: 0x%x\n", (unsigned int)si->flags); minios_printk(" cmd_line: %s\n", si->cmd_line ? (const char *)si->cmd_line : "NULL"); /* Set up events. */ init_events(); /* ENABLE EVENT DELIVERY. This is disabled at start of day. */ __sti(); arch_print_info(); setup_xen_features(); /* Init memory management. */ init_mm(); /* Init time and timers. */ init_time(); /* Init the console driver. */ init_console(); /* Init grant tables */ init_gnttab(); /* Init XenBus */ init_xenbus(); /* Init scheduler. */ bmk_sched_startmain(_app_main, &start_info); bmk_platform_halt("unreachable"); }
void x86_boot(struct multiboot_info *mbi) { bmk_printf_init(cons_putc, NULL); bmk_printf("rump kernel bare metal bootstrap\n\n"); cpu_init(); bmk_sched_init(); multiboot(mbi); spl0(); bmk_sched_startmain(mainthread, multiboot_cmdline); }