#include #include #include #define DEBUG_INIT #include #include #include #include #include #include #include #include #include #include #include #include const int version_major = 0, version_minor = 0, version_patch = 1; void init_mmap(multiboot_info_t *multiboot_info) { if (multiboot_info->flags & (1 << 6)) { mmap_init_multiboot((struct multiboot_mmap_entry *) multiboot_info->mmap_addr, multiboot_info->mmap_length / sizeof(struct multiboot_mmap_entry)); } else { k_panics("mmap invalid!\n"); } } void init_pci_system() { pci_scan(); pci_init_drivers(); } void att_noreturn att_used kmain(multiboot_info_t *multiboot_info, uint32_t mb_name) { // early init isr_install(); // initialize early modules (kprint etc.) init_execute_all(INIT_STAGE_EARLY_BOOT_0); // parse multiboot if (mb_name != MULTIBOOT_BOOTLOADER_MAGIC) { k_panics("Not booted by multiboot\n"); } store_bootloader_info(multiboot_info); // initialize memory management init_mmap(multiboot_info); // safe multiboot info for later use debug_store_info(multiboot_info); gdt_init(); // initialize kprint functionality kprint_init(); // initialize early driver code (ACPI, etc.) init_execute_all(INIT_STAGE_EARLY_BOOT_1); // enable interrupts __asm__ __volatile__("sti"); // start the timer pit_int_frequency(1000); // initialize drivers that are not discovered in any other way init_execute_all(INIT_STAGE_LATE_BOOT); // init PCI init_pci_system(); printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch); // initialize tasking task_init(); // let other system provide tasks (command, kprint, blockdev) init_execute_all(INIT_STAGE_PRE_TASKING); // switch to tasking syscall_start_scheduler(); }