diff options
| author | Fabian Imhof <fabian.imhof@ost.ch> | 2024-10-20 09:37:08 +0000 |
|---|---|---|
| committer | Fabian Imhof <fabian.imhof@ost.ch> | 2024-10-20 09:37:08 +0000 |
| commit | 4c0f7c2179622d9221af8860d610d8192dee3707 (patch) | |
| tree | 290e84697fce6fe267bd61ab0233cdf286cce822 /arch/x86_64/src/memory/paging | |
| parent | 04bd6a059b9eb105024044d74122b0cb76cebf14 (diff) | |
| download | teachos-4c0f7c2179622d9221af8860d610d8192dee3707.tar.xz teachos-4c0f7c2179622d9221af8860d610d8192dee3707.zip | |
update page_mapper
Diffstat (limited to 'arch/x86_64/src/memory/paging')
| -rw-r--r-- | arch/x86_64/src/memory/paging/page_entry.cpp | 4 | ||||
| -rw-r--r-- | arch/x86_64/src/memory/paging/page_mapper.cpp | 43 |
2 files changed, 39 insertions, 8 deletions
diff --git a/arch/x86_64/src/memory/paging/page_entry.cpp b/arch/x86_64/src/memory/paging/page_entry.cpp index 692f8ae..0dbbae1 100644 --- a/arch/x86_64/src/memory/paging/page_entry.cpp +++ b/arch/x86_64/src/memory/paging/page_entry.cpp @@ -33,10 +33,10 @@ namespace teachos::arch::memory::paging auto entry::contains_flags(std::bitset<64U> other) const -> bool { return (flags & other) == other; } - auto entry::set_address(allocator::physical_frame frame) -> void + auto entry::set_entry(allocator::physical_frame frame, std::bitset<64U> additional_flags) -> void { exception_handling::assert((frame.start_address() & ~0x000fffff'fffff000) == 0, "Start address is not aligned with Page"); - flags = std::bitset<64U>(frame.start_address()) | flags; + flags = std::bitset<64U>(frame.start_address()) | additional_flags; } } // namespace teachos::arch::memory::paging diff --git a/arch/x86_64/src/memory/paging/page_mapper.cpp b/arch/x86_64/src/memory/paging/page_mapper.cpp index e68bc68..32567be 100644 --- a/arch/x86_64/src/memory/paging/page_mapper.cpp +++ b/arch/x86_64/src/memory/paging/page_mapper.cpp @@ -1,15 +1,37 @@ +#include "arch/memory/paging/page_mapper.hpp" + #include "arch/exception_handling/assert.hpp" #include "arch/memory/allocator/area_frame_allocator.hpp" -#include "arch/memory/paging/virtual_page.hpp" namespace teachos::arch::memory::paging { - auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame> + 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; }; - auto huge_page = [&]() -> std::optional<allocator::physical_frame> {}; + 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{}; + bool is_valid = false; for (auto level = page_table::LEVEL4; level != page_table::LEVEL1; level--) { @@ -82,12 +104,21 @@ 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 { - auto p4 = reinterpret_cast<P4 *>(P4); // Assuming P4 is defined somewhere + 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); + 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); - assert(p1[page.p1_index()].is_unused()); - p1[page.p1_index()].set(frame, flags | PRESENT); + page_table::level level1_index{page.get_level_index(page_table::LEVEL1)}; + arch::exception_handling::assert(p1[level1_index].is_unused(), ""); + + p1[page.p1_index()].set(frame, flags | entry::bitset::PRESENT); } } // namespace teachos::arch::memory::paging
\ No newline at end of file |
