95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
#include <drivers/vgascreen.h>
|
|
#include <cpu/isr.h>
|
|
#include <cpu/timer.h>
|
|
#include <drivers/keyboard.h>
|
|
#include <mem/mem.h>
|
|
#include <multiboot.h>
|
|
#include <drivers/serial.h>
|
|
#include <libk/kprint.h>
|
|
#include <libk/libk.h>
|
|
#include <drivers/pci.h>
|
|
#include <drivers/ide.h>
|
|
#include <libc/kprintf.h>
|
|
#include <fs/mbr.h>
|
|
#include <fs/blockdev.h>
|
|
#include <fs/fat.h>
|
|
#include <cpu/cpuidx.h>
|
|
#include <tasks/task.h>
|
|
#include <libk/syscall.h>
|
|
#include <command.h>
|
|
#include <attributes.h>
|
|
|
|
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_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();
|
|
}
|