aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2024-10-20 09:37:08 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2024-10-20 09:37:08 +0000
commit4c0f7c2179622d9221af8860d610d8192dee3707 (patch)
tree290e84697fce6fe267bd61ab0233cdf286cce822 /arch/x86_64
parent04bd6a059b9eb105024044d74122b0cb76cebf14 (diff)
downloadteachos-4c0f7c2179622d9221af8860d610d8192dee3707.tar.xz
teachos-4c0f7c2179622d9221af8860d610d8192dee3707.zip
update page_mapper
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/include/arch/memory/paging/page_entry.hpp2
-rw-r--r--arch/x86_64/include/arch/memory/paging/page_mapper.hpp4
-rw-r--r--arch/x86_64/src/memory/paging/page_entry.cpp4
-rw-r--r--arch/x86_64/src/memory/paging/page_mapper.cpp43
4 files changed, 42 insertions, 11 deletions
diff --git a/arch/x86_64/include/arch/memory/paging/page_entry.hpp b/arch/x86_64/include/arch/memory/paging/page_entry.hpp
index 016e054..8dd061f 100644
--- a/arch/x86_64/include/arch/memory/paging/page_entry.hpp
+++ b/arch/x86_64/include/arch/memory/paging/page_entry.hpp
@@ -60,7 +60,7 @@ namespace teachos::arch::memory::paging
*
* @param frame Physical frame that contains the address we want to copy into our underlying std::bitset.
*/
- auto set_address(allocator::physical_frame frame) -> void;
+ auto entry::set_entry(allocator::physical_frame frame, std::bitset<64U> additional_flags) -> void;
/**
* @brief Checks if the given std::bitset is a subset or equivalent to the underlying std::bitset, meaning that all
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 ad9db52..fcaba26 100644
--- a/arch/x86_64/include/arch/memory/paging/page_mapper.hpp
+++ b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp
@@ -32,8 +32,8 @@ namespace teachos::arch::memory::paging
*/
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;
+ 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
} // namespace teachos::arch::memory::paging
#endif \ No newline at end of file
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