Files
my-kern/kernel/kernel.c
2021-08-13 21:07:40 +02:00

95 lines
2.3 KiB
C

#include <attributes.h>
#include <multiboot.h>
#include <stdio.h>
#define DEBUG_INIT
#include <myke/command.h>
#include <myke/cpu/cpuidx.h>
#include <myke/cpu/gdt.h>
#include <myke/cpu/isr.h>
#include <myke/cpu/timer.h>
#include <myke/debug/debug.h>
#include <myke/drivers/keyboard.h>
#include <myke/drivers/pci/pci.h>
#include <myke/drivers/serial.h>
#include <myke/drivers/vgascreen.h>
#include <myke/vfs/blockdev.h>
#include <myke/libk/kprint.h>
#include <myke/libk/libk.h>
#include <myke/libk/syscall.h>
#include <myke/mem/mem.h>
#include <myke/util/init.h>
#include <myke/tasks/task.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_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();
}