aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/include/arch/memory/paging/page_entry.hpp2
-rw-r--r--arch/x86_64/src/memory/paging/page_mapper.cpp9
2 files changed, 7 insertions, 4 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 8dd061f..109735d 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 entry::set_entry(allocator::physical_frame frame, std::bitset<64U> additional_flags) -> void;
+ auto 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/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)