aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/include/arch/memory/paging/page_mapper.hpp11
-rw-r--r--arch/x86_64/src/memory/paging/page_mapper.cpp55
2 files changed, 28 insertions, 38 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
index fcaba26..5960aaf 100644
--- a/arch/x86_64/include/arch/memory/paging/page_mapper.hpp
+++ b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp
@@ -1,6 +1,7 @@
#ifndef TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP
#define TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP
+#include "arch/memory/allocator/area_frame_allocator.hpp"
#include "arch/memory/paging/virtual_page.hpp"
#include <optional>
@@ -32,8 +33,16 @@ namespace teachos::arch::memory::paging
*/
auto translate_address(std::size_t virtual_address) -> std::optional<std::size_t>;
+ /**
+ * @brief TODO
+ *
+ * @param allocator
+ * @param page
+ * @param frame
+ * @param flags
+ */
auto map_page_to_frame(memory::allocator::area_frame_allocator & allocator, const virtual_page & page,
- const memory::allocator::physical_frame & frame, entry::bitset flags) -> void
+ const memory::allocator::physical_frame & frame, entry::bitset flags) -> void;
} // namespace teachos::arch::memory::paging
#endif \ No newline at end of file
diff --git a/arch/x86_64/src/memory/paging/page_mapper.cpp b/arch/x86_64/src/memory/paging/page_mapper.cpp
index 32567be..ec1d5d5 100644
--- a/arch/x86_64/src/memory/paging/page_mapper.cpp
+++ b/arch/x86_64/src/memory/paging/page_mapper.cpp
@@ -1,33 +1,9 @@
#include "arch/memory/paging/page_mapper.hpp"
#include "arch/exception_handling/assert.hpp"
-#include "arch/memory/allocator/area_frame_allocator.hpp"
namespace teachos::arch::memory::paging
{
- auto generate_page_table(virtual_page page) -> page_table *
- {
- page_table page_table{};
- bool is_valid = false;
- auto huge_page = []() -> arch::memory::paging::page_table { 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)
- {
- return &page_table;
- }
-
- return &huge_page();
- }
-
auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame>
{
page_table page_table{};
@@ -104,21 +80,26 @@ namespace teachos::arch::memory::paging
auto map_page_to_frame(memory::allocator::area_frame_allocator & allocator, const virtual_page & page,
const memory::allocator::physical_frame & frame, entry::bitset flags) -> void
{
- std::optional<allocator::physical_frame> frame =
-
- page_table page_table{};
-
- bool is_valid = page_table.next_table(page_table::LEVEL3);
- page_table = page_table.next_table(page_table::LEVEL2);
- page_table = page_table.next_table(page_table::LEVEL1);
+ page_table page_table{};
+ bool is_valid = false;
- auto p3 = p4->next_table_create(page.p4_index(), allocator);
- auto p2 = p3->next_table_create(page.p3_index(), allocator);
- auto p1 = p2->next_table_create(page.p2_index(), allocator);
+ for (auto level = page_table::LEVEL4; level != page_table::LEVEL1; level--)
+ {
+ std::size_t level_index = page.get_level_index(level);
+ is_valid = page_table.next_table(level_index);
+ page_table[level_index].set_entry(frame, entry::PRESENT | entry::WRITABLE);
+ page_table.zero_entries();
- page_table::level level1_index{page.get_level_index(page_table::LEVEL1)};
- arch::exception_handling::assert(p1[level1_index].is_unused(), "");
+ if (!is_valid)
+ {
+ break;
+ }
+ }
- p1[page.p1_index()].set(frame, flags | entry::bitset::PRESENT);
+ entry page_table_entry = page_table[page.get_level_index(page_table::LEVEL1)];
+ arch::exception_handling::assert(!page_table_entry.contains_flags(entry::HUGE_PAGE),
+ "[Page Mapper]: Unable to map huge pages");
+ arch::exception_handling::assert(!page_table_entry.is_unused(), "[Page Mapper]: Page table entry is already used");
+ page_table_entry.set_entry(frame, flags | entry::PRESENT);
}
} // namespace teachos::arch::memory::paging \ No newline at end of file