aboutsummaryrefslogtreecommitdiff
path: root/src/kernel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel.cc')
-rw-r--r--src/kernel.cc23
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;