#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static cpu_t bsp_cpu; void kernel_entry() { cpu_set(&bsp_cpu); logging_init(); logging_sethook(arch_e9_putc); arch_gdt_reload(); arch_idt_setup(); arch_idt_reload(); dpc_init(); pmm_init(); term_init(); logging_sethook(term_putchar); arch_mmu_init(); vmm_init(); alloc_init(); cmdline_parse(); arch_acpi_init(); arch_apic_init(); cpu_initstate(); // XXX fall back to another clock source time_t u = arch_hpet_init(); timekeeper_init(arch_hpet_ticks, u); arch_apic_timerinit(); sched_init(); arch_smp_wakeup(); vfs_init(); tmpfs_init(); devfs_init(); pipefs_init(); sockfs_init(); ext2_init(); tty_init(); pty_init(); netdev_init(); loopback_init(); arp_init(); ipv4_init(); udp_init(); block_init(); pseudodevices_init(); arch_e9_initdev(); pci_init(); keyboard_init(); mouse_init(); arch_ps2_init(); fb_init(); nvme_init(); virtio_init(); console_init(); logging_sethook(console_putc); char *root = cmdline_get("root"); char *rootfs = cmdline_get("rootfs"); printf("mounting %s (%s) on /\n", root == NULL ? "none" : root, rootfs); vnode_t *backing; if (root) { __assert(devfs_getbyname(root, &backing) == 0); } else { backing = NULL; } __assert(vfs_mount(backing, vfsroot, "/", rootfs, NULL) == 0); if (backing) { VOP_RELEASE(backing); } if (cmdline_get("initrd")) initrd_unpack(); sched_runinit(); sched_threadexit(); }