Files
my-kern/kernel/kernel.c

84 lines
2.0 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 <kprint.h>
#include <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 <stdbool.h>
#include <cpu/cpuidx.h>
#include <mem/malloc.h>
#include <tasks/task.h>
#include <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));
malloc_init();
// todo fallback on other mechanisms?
} 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();
// scan
block_dev_scan_repeat();
}
void noreturn kmain(multiboot_info_t *multiboot_info) {
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);
cpuidx_print_info();
store_bootloader_info(multiboot_info);
init_mmap(multiboot_info);
// init done, enable interrupts
__asm__ __volatile__("sti");
init_timer(1000);
init_keyboard();
init_pci_system();
init_block_devices();
printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch);
task_spawn(main_loop, NULL);
syscall_start_scheduler();
}