aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-20 08:37:49 +0000
committerMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-20 08:37:49 +0000
commitd934ea6875932a7139eba77bb5248fca8be7fd01 (patch)
tree0521c077a882d4386c09fc77381d4062898bd90e /arch
parentfba2fc4ce3d4bf4997eb42c9b5b2ac1de8692150 (diff)
downloadteachos-d934ea6875932a7139eba77bb5248fca8be7fd01.tar.xz
teachos-d934ea6875932a7139eba77bb5248fca8be7fd01.zip
Implement translate page in a big brain way 🤯
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/include/arch/memory/paging/page_table.hpp2
-rw-r--r--arch/x86_64/include/arch/memory/paging/virtual_page.hpp32
-rw-r--r--arch/x86_64/src/memory/paging/page_table.cpp8
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