diff options
| author | Matteo Gmür <matteo.gmuer1@ost.ch> | 2024-10-20 08:37:49 +0000 |
|---|---|---|
| committer | Matteo Gmür <matteo.gmuer1@ost.ch> | 2024-10-20 08:37:49 +0000 |
| commit | d934ea6875932a7139eba77bb5248fca8be7fd01 (patch) | |
| tree | 0521c077a882d4386c09fc77381d4062898bd90e | |
| parent | fba2fc4ce3d4bf4997eb42c9b5b2ac1de8692150 (diff) | |
| download | teachos-d934ea6875932a7139eba77bb5248fca8be7fd01.tar.xz teachos-d934ea6875932a7139eba77bb5248fca8be7fd01.zip | |
Implement translate page in a big brain way 🤯
| -rw-r--r-- | arch/x86_64/include/arch/memory/paging/page_table.hpp | 2 | ||||
| -rw-r--r-- | arch/x86_64/include/arch/memory/paging/virtual_page.hpp | 32 | ||||
| -rw-r--r-- | arch/x86_64/src/memory/paging/page_table.cpp | 8 |
3 files changed, 23 insertions, 19 deletions
diff --git a/arch/x86_64/include/arch/memory/paging/page_table.hpp b/arch/x86_64/include/arch/memory/paging/page_table.hpp index aa8bd5e..0fe667c 100644 --- a/arch/x86_64/include/arch/memory/paging/page_table.hpp +++ b/arch/x86_64/include/arch/memory/paging/page_table.hpp @@ -87,6 +87,8 @@ namespace teachos::arch::memory::paging ///< 1 page table table_content * current_table; ///< Current table we are accessing and indexing. }; + + auto operator--(page_table::level & level, int) -> page_table::level; } // namespace teachos::arch::memory::paging #endif // TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_TABLE_HPP diff --git a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp index 46140ff..705de29 100644 --- a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp +++ b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp @@ -67,31 +67,25 @@ namespace teachos::arch::memory::paging auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame> { page_table page_table{}; - bool is_valid = page_table.next_table(page.get_level_index(page_table::LEVEL4)); + bool is_valid = false; + auto huge_page = []() -> std::optional<allocator::physical_frame> { return std::nullopt; }; - auto huge_page = []() -> std::optional<allocator::physical_frame> { - // TODO - return std::nullopt; - }; - - if (is_valid) + for (auto level = page_table::LEVEL4; level != page_table::LEVEL1; level--) { - is_valid = page_table.next_table(page.get_level_index(page_table::LEVEL3)); - - if (is_valid) + is_valid = page_table.next_table(page.get_level_index(level)); + if (!is_valid) { - is_valid = page_table.next_table(page.get_level_index(page_table::LEVEL2)); - - if (is_valid) - { - std::size_t level1_index = page.get_level_index(page_table::LEVEL1); - std::optional<allocator::physical_frame> frame = page_table[level1_index].calculate_pointed_to_frame(); - - return frame; - } + break; } } + if (is_valid) + { + auto level1_index = page.get_level_index(page_table::LEVEL1); + auto frame = page_table[level1_index].calculate_pointed_to_frame(); + return frame; + } + return huge_page(); } diff --git a/arch/x86_64/src/memory/paging/page_table.cpp b/arch/x86_64/src/memory/paging/page_table.cpp index ab7331a..02ababe 100644 --- a/arch/x86_64/src/memory/paging/page_table.cpp +++ b/arch/x86_64/src/memory/paging/page_table.cpp @@ -54,4 +54,12 @@ namespace teachos::arch::memory::paging } return std::nullopt; } + + auto operator--(page_table::level & level, int) -> page_table::level + { + exception_handling::assert(level != page_table::LEVEL1, + "[Page table] Attemptd to decrement enum to value outside of range"); + auto value = static_cast<std::underlying_type<page_table::level>::type>(level); + return static_cast<page_table::level>(--value); + } } // namespace teachos::arch::memory::paging |
