aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/include
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/include')
-rw-r--r--arch/x86_64/include/arch/memory/paging/page_mapper.hpp30
-rw-r--r--arch/x86_64/include/arch/memory/paging/virtual_page.hpp51
2 files changed, 30 insertions, 51 deletions
diff --git a/arch/x86_64/include/arch/memory/paging/page_mapper.hpp b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp
new file mode 100644
index 0000000..b151a7f
--- /dev/null
+++ b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp
@@ -0,0 +1,30 @@
+#ifndef TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP
+#define TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP
+
+#include "arch/memory/paging/virtual_page.hpp"
+
+#include <optional>
+
+namespace teachos::arch::memory::paging
+{
+ /**
+ * @brief Translate page into physical_frame
+ *
+ * @param page Page to translate into physical_frame
+ * @return Physical frame corresponding to the provided page_table
+ */
+ auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame>;
+
+ /**
+ * @brief Translate virtual into phyical address
+ *
+ * @param virtual_address Address to translate into physical
+ * @return Physical address
+ */
+ auto translate_address(std::size_t virtual_address) -> std::optional<std::size_t>;
+
+ auto map_page_to_frame(memory::allocator::area_frame_allocator & allocator, const Page & page, const Frame & frame,
+ EntryFlags flags) -> void;
+} // namespace teachos::arch::memory::paging
+
+#endif \ No newline at end of file
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 705de29..6b9a641 100644
--- a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp
+++ b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp
@@ -58,57 +58,6 @@ namespace teachos::arch::memory::paging
std::size_t page_number; ///< Index number of the current virtual page, used to distinguish it from other pages.
};
- /**
- * @brief Translate page into physical_frame
- *
- * @param page Page to translate into physical_frame
- * @return Physical frame corresponding to the provided page_table
- */
- auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame>
- {
- page_table page_table{};
- bool is_valid = false;
- auto huge_page = []() -> std::optional<allocator::physical_frame> { return std::nullopt; };
-
- for (auto level = page_table::LEVEL4; level != page_table::LEVEL1; level--)
- {
- is_valid = page_table.next_table(page.get_level_index(level));
- if (!is_valid)
- {
- 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();
- }
-
- /**
- * @brief Translate virtual into phyical address
- *
- * @param virtual_address Address to translate into physical
- * @return Physical address
- */
- auto translate_address(std::size_t virtual_address) -> std::optional<std::size_t>
- {
- std::size_t offset = virtual_address % allocator::PAGE_FRAME_SIZE;
- virtual_page page = virtual_page::containing_address(virtual_address);
- std::optional<allocator::physical_frame> frame = translate_page(page);
-
- if (frame.has_value())
- {
- return frame.value().frame_number * allocator::PAGE_FRAME_SIZE + offset;
- }
-
- return std::nullopt;
- }
-
} // namespace teachos::arch::memory::paging
#endif // TEACHOS_ARCH_X86_64_MEMORY_PAGING_VIRTUAL_PAGE_HPP