#include #include #include #define DEBUG_INIT #include #include #include #include #include #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(); vga_clear_screen(); vga_clear_screen(' ', VGA_WHITE | (VGA_GRAY << VGA_SHIFT_BG)); kprint_register(vga_kprint); serial_init(); kprint_register(serial_kprint); // 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); gdt_init(); // initialize kprint functionality kprint_init(); debug_store_info(multiboot_info); // identify cpu cpuidx_print_info(); // enable interrupts __asm__ __volatile__("sti"); // start the timer init_timer(1000); // initialize devices init_keyboard(); init_pci_system(); printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch); // initializing modules init_execute_all(); // initialize tasking task_init(); kprint_start_task(); block_dev_start_task(); #ifdef K_SHELL task_spawn(main_loop, NULL, "main"); #endif // switch to tasking syscall_start_scheduler(); }