2026-06-14 00:34:11 -05:00
|
|
|
#include "multiboot.h"
|
2026-06-26 20:05:01 -05:00
|
|
|
#include "interrupts.h"
|
|
|
|
|
#include "gdt.h"
|
|
|
|
|
#include "scheduler.h"
|
2026-06-28 17:58:58 -05:00
|
|
|
#include "common.h"
|
2026-06-29 17:00:07 -05:00
|
|
|
#include "initrd.h"
|
2026-06-24 16:47:22 -05:00
|
|
|
|
2026-06-10 18:28:33 -05:00
|
|
|
#include <lib/print.h>
|
|
|
|
|
#include <lib/stream.h>
|
2026-06-24 16:47:22 -05:00
|
|
|
#include <lib/memory.h>
|
|
|
|
|
|
2026-06-26 20:05:01 -05:00
|
|
|
#include <memory/mm.h>
|
2026-06-09 23:16:25 -05:00
|
|
|
|
2026-06-26 20:05:01 -05:00
|
|
|
#include <drivers/iso/iso.h>
|
|
|
|
|
#include <drivers/ide/ide.h>
|
|
|
|
|
#include <drivers/pic/pic.h>
|
|
|
|
|
#include <drivers/ps2/ps2.h>
|
|
|
|
|
#include <drivers/pit/pit.h>
|
|
|
|
|
#include <drivers/vga/vga.h>
|
2026-06-11 23:23:39 -05:00
|
|
|
|
2026-06-14 00:34:11 -05:00
|
|
|
#include <stddef.h>
|
2026-06-11 23:23:39 -05:00
|
|
|
#include <stdint.h>
|
|
|
|
|
|
2026-06-15 18:09:04 -04:00
|
|
|
extern char __kernel_start;
|
|
|
|
|
extern char __kernel_end;
|
|
|
|
|
|
2026-06-29 17:00:07 -05:00
|
|
|
void parse_multiboot_modules(uint32_t mbi_vaddr) {
|
|
|
|
|
// find where grub put the boot module containing initrd
|
|
|
|
|
multiboot_info* mbi = (multiboot_info*)mbi_vaddr;
|
|
|
|
|
|
|
|
|
|
uint32_t mod_count = mbi->mods_count;
|
|
|
|
|
multiboot_module_t* mod = (multiboot_module_t*)((uint32_t)mbi->mods_addr + 0xC0000000);
|
|
|
|
|
|
|
|
|
|
kprintf("found %d mods starting @ [v]0x%x\n", mod_count, (uint32_t)mod);
|
|
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < mod_count; i++) {
|
|
|
|
|
uint32_t start = mod[i].mod_start;
|
|
|
|
|
uint32_t end = mod[i].mod_end;
|
|
|
|
|
uint32_t cmdline = mod[i].cmdline;
|
|
|
|
|
|
|
|
|
|
multiboot_module_info_table[i].mod_start = start + 0xC0000000;
|
|
|
|
|
multiboot_module_info_table[i].mod_end = end + 0xC0000000;
|
|
|
|
|
multiboot_module_info_table[i].cmdline = cmdline + 0xC0000000;
|
2026-06-16 18:44:31 -05:00
|
|
|
}
|
2026-06-29 17:00:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void load_initrd() {
|
|
|
|
|
multiboot_module_t* initrd_module = &multiboot_module_info_table[0];
|
|
|
|
|
kprintf("initrd found @ [v] 0x%x\n", initrd_module->mod_start);
|
|
|
|
|
kprintf("reading initrd\n");
|
|
|
|
|
|
|
|
|
|
parse_cpio((void*)initrd_module->mod_start);
|
2026-06-16 18:44:31 -05:00
|
|
|
}
|
|
|
|
|
|
2026-06-14 00:34:11 -05:00
|
|
|
void kmain(uint32_t magic, multiboot_info* mbi) {
|
2026-06-28 17:58:58 -05:00
|
|
|
disable_interrupts();
|
2026-06-15 23:35:01 -05:00
|
|
|
if (!(mbi->flags & (1 << 6))) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-06-12 23:03:00 -04:00
|
|
|
|
2026-06-26 20:05:01 -05:00
|
|
|
vga_init();
|
2026-06-16 18:44:31 -05:00
|
|
|
|
2026-06-15 23:35:01 -05:00
|
|
|
uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000;
|
|
|
|
|
init_pmm((void*)mmap_virtual_addr, mbi->mmap_length);
|
2026-06-26 20:05:01 -05:00
|
|
|
kprintf("memory detection complete. total free memory: %dMB\n", total_free_memory() / 1024 / 1024);
|
2026-06-15 23:35:01 -05:00
|
|
|
|
2026-06-12 23:03:00 -04:00
|
|
|
init_gdt();
|
2026-06-11 23:23:39 -05:00
|
|
|
init_idt();
|
2026-06-13 13:27:39 -05:00
|
|
|
init_pic();
|
|
|
|
|
init_pit();
|
2026-06-26 20:05:01 -05:00
|
|
|
|
2026-06-15 18:09:04 -04:00
|
|
|
init_page_tables();
|
2026-06-24 16:47:22 -05:00
|
|
|
|
2026-06-29 17:00:07 -05:00
|
|
|
parse_multiboot_modules((uint32_t)mbi);
|
|
|
|
|
|
|
|
|
|
load_initrd();
|
|
|
|
|
|
2026-06-26 20:05:01 -05:00
|
|
|
kprintf("basic initializations complete\n");
|
2026-06-16 10:04:49 -04:00
|
|
|
|
2026-06-28 17:58:58 -05:00
|
|
|
disable_interrupts(); // just paranoid... do it again
|
2026-06-26 20:05:01 -05:00
|
|
|
init_scheduler();
|
|
|
|
|
enable_interrupts();
|
2026-06-09 23:16:25 -05:00
|
|
|
}
|