75 lines
1.8 KiB
C
75 lines
1.8 KiB
C
#include <attributes.h>
|
|
#include <multiboot.h>
|
|
#include <stdio.h>
|
|
|
|
#define DEBUG_INIT
|
|
|
|
#include <myke/command.h>
|
|
#include <myke/cpu/gdt.h>
|
|
#include <myke/cpu/isr.h>
|
|
#include <myke/cpu/pit.h>
|
|
#include <myke/debug/debug.h>
|
|
#include <myke/drivers/pci/pci.h>
|
|
#include <myke/libk/kprint.h>
|
|
#include <myke/libk/libk.h>
|
|
#include <myke/libk/syscall.h>
|
|
#include <myke/mem/vmm.h>
|
|
#include <myke/util/init.h>
|
|
#include <myke/tasks/task.h>
|
|
|
|
const int version_major = 0,
|
|
version_minor = 0,
|
|
version_patch = 1;
|
|
|
|
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();
|
|
// initialize memory management
|
|
vmm_init(multiboot_info);
|
|
|
|
// initialize early modules (kprint etc.)
|
|
init_execute_all(INIT_STAGE_EARLY_BOOT_0);
|
|
|
|
// parse multiboot
|
|
if (mb_name != MULTIBOOT_BOOTLOADER_MAGIC) {
|
|
k_panics("Not booted by multiboot\n");
|
|
}
|
|
|
|
store_bootloader_info(multiboot_info);
|
|
|
|
// safe multiboot info for later use
|
|
debug_store_info(multiboot_info);
|
|
|
|
gdt_init();
|
|
|
|
// initialize kprint functionality
|
|
kprint_init();
|
|
// initialize early driver code (ACPI, etc.)
|
|
init_execute_all(INIT_STAGE_EARLY_BOOT_1);
|
|
|
|
// enable interrupts
|
|
__asm__ __volatile__("sti");
|
|
// start the timer
|
|
pit_int_frequency(1000);
|
|
|
|
// initialize drivers that are not discovered in any other way
|
|
init_execute_all(INIT_STAGE_LATE_BOOT);
|
|
|
|
// init PCI
|
|
init_pci_system();
|
|
|
|
printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch);
|
|
|
|
// initialize tasking
|
|
task_init();
|
|
// let other system provide tasks (command, kprint, blockdev)
|
|
init_execute_all(INIT_STAGE_PRE_TASKING);
|
|
// switch to tasking
|
|
syscall_start_scheduler();
|
|
}
|