aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/paging
diff options
context:
space:
mode:
authorMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-20 07:43:00 +0000
committerMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-20 07:43:00 +0000
commite5206b3bf1883fd9601a37f5cce392d8080b8791 (patch)
tree2fdaf6e67212b54d74d829d25ae86f9e28b11648 /arch/x86_64/src/memory/paging
parentd728052d62470799f73f6d9a2b8baa2b0b357383 (diff)
downloadteachos-e5206b3bf1883fd9601a37f5cce392d8080b8791.tar.xz
teachos-e5206b3bf1883fd9601a37f5cce392d8080b8791.zip
Add get level index method to virtual page
Diffstat (limited to 'arch/x86_64/src/memory/paging')
-rw-r--r--arch/x86_64/src/memory/paging/page_table.cpp8
-rw-r--r--arch/x86_64/src/memory/paging/virtual_page.cpp5
2 files changed, 7 insertions, 6 deletions
diff --git a/arch/x86_64/src/memory/paging/page_table.cpp b/arch/x86_64/src/memory/paging/page_table.cpp
index 8345161..9857294 100644
--- a/arch/x86_64/src/memory/paging/page_table.cpp
+++ b/arch/x86_64/src/memory/paging/page_table.cpp
@@ -26,12 +26,8 @@ namespace teachos::arch::memory::paging
exception_handling::assert(current_level != LEVEL1,
"[Page Table] Attempted to call next_table on level 1 page table");
auto address = next_table_address(table_index);
-
- if (address.has_value())
- {
- current_table = reinterpret_cast<table_content *>(address.value());
- current_level = static_cast<level>(current_level - 1U);
- }
+ current_table = reinterpret_cast<table_content *>(address.value());
+ current_level = static_cast<level>(current_level - 1U);
}
auto page_table::operator[](std::size_t index) -> entry &
diff --git a/arch/x86_64/src/memory/paging/virtual_page.cpp b/arch/x86_64/src/memory/paging/virtual_page.cpp
index 3fb6caf..dcdec7f 100644
--- a/arch/x86_64/src/memory/paging/virtual_page.cpp
+++ b/arch/x86_64/src/memory/paging/virtual_page.cpp
@@ -19,4 +19,9 @@ namespace teachos::arch::memory::paging
}
auto virtual_page::start_address() const -> uint64_t { return page_number * allocator::PAGE_FRAME_SIZE; }
+
+ auto virtual_page::get_level_index(page_table::level level) const -> uint64_t
+ {
+ return (start_address() >> (level * 9U)) & 0x1FF;
+ }
} // namespace teachos::arch::memory::paging