aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory')
-rw-r--r--arch/x86_64/src/memory/paging/page_mapper.cpp12
-rw-r--r--arch/x86_64/src/memory/paging/page_table.cpp15
2 files changed, 20 insertions, 7 deletions
diff --git a/arch/x86_64/src/memory/paging/page_mapper.cpp b/arch/x86_64/src/memory/paging/page_mapper.cpp
index cd77366..dff9ae4 100644
--- a/arch/x86_64/src/memory/paging/page_mapper.cpp
+++ b/arch/x86_64/src/memory/paging/page_mapper.cpp
@@ -4,10 +4,20 @@
namespace teachos::arch::memory::paging
{
+
auto create_or_get() -> page_table_handle
{
+ static auto initialized = false;
// TODO: As soon as linker error is fixed in toolchain make handle static and return that.
- return page_table_handle{arch::boot::page_map_level_4, page_table_handle::LEVEL4};
+ page_table_handle active_handle{boot::page_map_level_4, page_table_handle::LEVEL4};
+
+ if (!initialized)
+ {
+ active_handle.initialize_page_tables();
+ initialized = true;
+ }
+
+ return active_handle;
}
auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame>
diff --git a/arch/x86_64/src/memory/paging/page_table.cpp b/arch/x86_64/src/memory/paging/page_table.cpp
index 2f97a80..b5315a0 100644
--- a/arch/x86_64/src/memory/paging/page_table.cpp
+++ b/arch/x86_64/src/memory/paging/page_table.cpp
@@ -11,11 +11,6 @@ namespace teachos::arch::memory::paging
struct page_table
{
/**
- * @brief Defaulted constructor.
- */
- page_table() = default;
-
- /**
* @brief Set every entry of the page to unused.
*/
auto zero_entries() -> void;
@@ -105,7 +100,15 @@ namespace teachos::arch::memory::paging
: handle(handle)
, handle_level(handle_level)
{
- exception_handling::assert(handle, "[Page table] Attempted to pass nullptr as handle to page table handle method");
+ exception_handling::assert(handle, "[Page Table] Attempted to pass nullptr as handle to page table handle method");
+ }
+
+ auto page_table_handle::initialize_page_table() -> void
+ {
+ exception_handling::assert(handle_level == page_table_handle::LEVEL4,
+ "[Page Table] Attempted to initialize a page table of level 3 or lower");
+
+ auto level_3_page_table = boot::page_map_level_3;
}
auto page_table_handle::zero_entries() -> void { handle->zero_entries(); }