diff options
Diffstat (limited to 'src/kernel.cc')
-rw-r--r-- | src/kernel.cc | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/kernel.cc b/src/kernel.cc index 05e0daf..53500bc 100644 --- a/src/kernel.cc +++ b/src/kernel.cc @@ -32,7 +32,7 @@ extern "C" { void dump_multiboot(uint32_t mb_magic, uint32_t mb_addr); void dump_gdt(); -void kernel_main(uint32_t mb_magic, uint32_t mb_addr) { +void kernel_main(uint32_t mb_magic, const uint32_t mb_addr) { #ifdef HAS_SERIAL0 if constexpr (serial0_console) if (serial0.self_check()) Console::set(&serial0); @@ -54,19 +54,28 @@ void kernel_main(uint32_t mb_magic, uint32_t mb_addr) { dump_address(); // dump_gdt(); - // { - const auto mb_addr_r = kvmm.map(mb_addr, 0xc03fe000); + printk("Multiboot2 header at ", uhex{mb_addr}, '\n'); + + const auto mb_addr_r = kvmm.map(mb_addr, {768, 1020}); runtime_assert(mb_addr_r, "Failed to map mb_addr"); - mb_addr = mb_addr_r.value(); - const auto mb_size = check_multiboot(mb_magic, mb_addr); + const auto mb_addr_ = mb_addr_r.value(); + const auto mb_size = check_multiboot(mb_magic, mb_addr_); runtime_assert((mb_size != 0), "Invalid multiboot header"); - printk("Multiboot2 header at ", uhex{mb_addr}, " size: ", mb_size, '\n'); + const auto mb_addr_re = [mb_addr, mb_size]() -> Result<uint32_t, vmm::Error> { + if (mb_addr % 4096 + mb_size >= 4096) return kvmm.map((mb_addr % 4096 + 4096), {768, 1021}); + return {}; + }(); + + printk("Multiboot2 header mounted at ", uhex{mb_addr}, " size: ", mb_size, '\n'); + + dump_multiboot(mb_magic, mb_addr_); - // dump_multiboot(mb_magic, mb_addr); + if (mb_addr_r) kvmm.unmap(mb_addr_r.value()); + if (mb_addr_re) kvmm.unmap(mb_addr_re.value()); } GDT gdt; |