#include #include #include #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 register_pci_drivers() { ide_register(); } void init_pci_system() { register_pci_drivers(); pci_sort_drivers(); pci_scan(); pci_init_drivers(); } void init_block_devices() { // register drivers mbr_register_block_driver(); fat_register_block_driver(); } void noreturn 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); // initialize kprint functionality kprint_init(); // identify cpu cpuidx_print_info(); // enable interrupts __asm__ __volatile__("sti"); // start the timer init_timer(1000); // initialize devices init_keyboard(); init_pci_system(); // register block device drivers init_block_devices(); printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch); // initialize tasking task_init(); kprint_start_task(); block_dev_start_task(); #ifdef K_SHELL task_spawn(main_loop, NULL); #endif // switch to tasking syscall_start_scheduler(); }