diff options
| author | Fabian Imhof <fabian.imhof@ost.ch> | 2024-10-20 11:23:02 +0000 |
|---|---|---|
| committer | Fabian Imhof <fabian.imhof@ost.ch> | 2024-10-20 11:23:02 +0000 |
| commit | f47f1468c8c281ee9603b7669f5e685e5f36fa3f (patch) | |
| tree | 4d2950585980dcc8f0e760cc4fe7b8bcedf0e2db /arch/x86_64/src/memory | |
| parent | d407d40ac54f2c714b754623e5cd9c7b9b494b86 (diff) | |
| download | teachos-f47f1468c8c281ee9603b7669f5e685e5f36fa3f.tar.xz teachos-f47f1468c8c281ee9603b7669f5e685e5f36fa3f.zip | |
finalize map_page_to_frame
Diffstat (limited to 'arch/x86_64/src/memory')
| -rw-r--r-- | arch/x86_64/src/memory/paging/page_mapper.cpp | 9 |
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) |
