aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2024-10-20 11:23:02 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2024-10-20 11:23:02 +0000
commitf47f1468c8c281ee9603b7669f5e685e5f36fa3f (patch)
tree4d2950585980dcc8f0e760cc4fe7b8bcedf0e2db /arch/x86_64/src
parentd407d40ac54f2c714b754623e5cd9c7b9b494b86 (diff)
downloadteachos-f47f1468c8c281ee9603b7669f5e685e5f36fa3f.tar.xz
teachos-f47f1468c8c281ee9603b7669f5e685e5f36fa3f.zip
finalize map_page_to_frame
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/memory/paging/page_mapper.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/x86_64/src/memory/paging/page_mapper.cpp b/arch/x86_64/src/memory/paging/page_mapper.cpp
index ec1d5d5..6b01548 100644
--- a/arch/x86_64/src/memory/paging/page_mapper.cpp
+++ b/arch/x86_64/src/memory/paging/page_mapper.cpp
@@ -77,8 +77,8 @@ namespace teachos::arch::memory::paging
return std::nullopt;
}
- 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 map_page_to_frame(memory::allocator::area_frame_allocator & allocator, virtual_page const & page,
+ memory::allocator::physical_frame const & frame, entry::bitset flags) -> void
{
page_table page_table{};
bool is_valid = false;
@@ -87,7 +87,10 @@ namespace teachos::arch::memory::paging
{
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);
+
+ std::optional<memory::allocator::physical_frame> allocated_frame = allocator.allocate_frame();
+ exception_handling::assert(!allocated_frame.has_value(), "[Page mapper]: Unable to allocate frame");
+ page_table[level_index].set_entry(allocated_frame.value(), entry::PRESENT | entry::WRITABLE);
page_table.zero_entries();
if (!is_valid)