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/active_page_table.cpp10
-rw-r--r--arch/x86_64/src/memory/paging/inactive_page_table.cpp10
2 files changed, 20 insertions, 0 deletions
diff --git a/arch/x86_64/src/memory/paging/active_page_table.cpp b/arch/x86_64/src/memory/paging/active_page_table.cpp
index 38696f8..5f31f75 100644
--- a/arch/x86_64/src/memory/paging/active_page_table.cpp
+++ b/arch/x86_64/src/memory/paging/active_page_table.cpp
@@ -93,4 +93,14 @@ namespace teachos::arch::memory::paging
{
// Nothing to do
}
+
+ auto active_page_table::with(inactive_page_table inactive_page_table, temporary_page temporary_page,
+ active_page_table::function f) -> void
+ {
+ active_handle[511].set_entry(inactive_page_table.page_table_level_4_frame, entry::PRESENT | entry::WRITABLE);
+ invalidate_page_cache(PAGE_TABLE_LEVEL_4_ADDRESS);
+
+ f(*mapper);
+ }
+
} // namespace teachos::arch::memory::paging
diff --git a/arch/x86_64/src/memory/paging/inactive_page_table.cpp b/arch/x86_64/src/memory/paging/inactive_page_table.cpp
index 1f36aa3..afba1f0 100644
--- a/arch/x86_64/src/memory/paging/inactive_page_table.cpp
+++ b/arch/x86_64/src/memory/paging/inactive_page_table.cpp
@@ -2,4 +2,14 @@
namespace teachos::arch::memory::paging
{
+ inactive_page_table::inactive_page_table(allocator::physical_frame frame, active_page_table active_page_table,
+ temporary_page temporary_page)
+ : page_table_level_4_frame{frame}
+ {
+ auto table = temporary_page.map_table_frame(page_table_level_4_frame, active_page_table);
+ table.zero_entries();
+ table[511].set_entry(page_table_level_4_frame, entry::PRESENT | entry::WRITABLE);
+
+ temporary_page.unmap(active_page_table);
+ }
} // namespace teachos::arch::memory::paging