From 45b5817a3603ea4d6caa2f88f909feb4ce767b1e Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Thu, 18 May 2023 01:18:51 -0700 Subject: [PATCH] Recursively map the PML4 --- zion/CMakeLists.txt | 1 + zion/memory/paging_util.cpp | 20 ++++++++++++++++++++ zion/memory/paging_util.h | 6 ++++++ zion/zion.cpp | 2 ++ 4 files changed, 29 insertions(+) create mode 100644 zion/memory/paging_util.cpp create mode 100644 zion/memory/paging_util.h diff --git a/zion/CMakeLists.txt b/zion/CMakeLists.txt index d72a17f..d1de879 100644 --- a/zion/CMakeLists.txt +++ b/zion/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(zion debug/debug.cpp interrupt/interrupt.cpp interrupt/interrupt_enter.s + memory/paging_util.cpp zion.cpp) target_include_directories(zion diff --git a/zion/memory/paging_util.cpp b/zion/memory/paging_util.cpp new file mode 100644 index 0000000..48b74af --- /dev/null +++ b/zion/memory/paging_util.cpp @@ -0,0 +1,20 @@ +#include "memory/paging_util.h" + +#include "boot/boot_info.h" + +#define PRESENT_BIT 0x1 +#define READ_WRITE_BIT 0x2 + +void InitPaging() { + uint64_t pml4_addr = 0; + asm volatile("mov %%cr3, %0;" : "=r"(pml4_addr)); + InitializePml4(pml4_addr); +} + +void InitializePml4(uint64_t pml4_physical_addr) { + uint64_t* pml4_virtual = reinterpret_cast( + boot::GetHigherHalfDirectMap() + pml4_physical_addr); + + uint64_t recursive_entry = pml4_physical_addr | PRESENT_BIT | READ_WRITE_BIT; + pml4_virtual[0x1FE] = recursive_entry; +} diff --git a/zion/memory/paging_util.h b/zion/memory/paging_util.h new file mode 100644 index 0000000..75644d0 --- /dev/null +++ b/zion/memory/paging_util.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +void InitPaging(); +void InitializePml4(uint64_t pml4_physical_addr); diff --git a/zion/zion.cpp b/zion/zion.cpp index 12ffa8b..9821400 100644 --- a/zion/zion.cpp +++ b/zion/zion.cpp @@ -5,10 +5,12 @@ #include "common/gdt.h" #include "debug/debug.h" #include "interrupt/interrupt.h" +#include "memory/paging_util.h" extern "C" void zion() { InitGdt(); InitIdt(); + InitPaging(); const limine_memmap_response& resp = boot::GetMemoryMap(); dbgln("Base,Length,Type");