From aa981cad951c4aa2a5e2f7a7f8f1b7b9a0ff4bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matteo=20Gm=C3=BCr?= Date: Mon, 28 Oct 2024 14:41:31 +0000 Subject: Fix lost updates, because of writing into copies instead of references --- arch/x86_64/include/arch/memory/paging/page_mapper.hpp | 4 ++-- arch/x86_64/src/kernel/main.cpp | 6 +++++- arch/x86_64/src/memory/allocator/area_frame_allocator.cpp | 8 ++++++-- arch/x86_64/src/memory/paging/page_entry.cpp | 3 ++- arch/x86_64/src/memory/paging/page_mapper.cpp | 4 ++-- 5 files changed, 17 insertions(+), 8 deletions(-) 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 4edcea9..d852fbc 100644 --- a/arch/x86_64/include/arch/memory/paging/page_mapper.hpp +++ b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp @@ -79,7 +79,7 @@ namespace teachos::arch::memory::paging current_handle = current_handle.next_table_or_create(allocator, page.get_level_index(level)); } - auto level1_entry = current_handle[page.get_level_index(page_table_handle::LEVEL1)]; + auto & level1_entry = current_handle[page.get_level_index(page_table_handle::LEVEL1)]; arch::exception_handling::assert(!level1_entry.contains_flags(entry::HUGE_PAGE), "[Page Mapper] Unable to map huge pages"); arch::exception_handling::assert(level1_entry.is_unused(), "[Page Mapper] Page table entry is already used"); @@ -141,7 +141,7 @@ namespace teachos::arch::memory::paging current_handle = next_handle.value(); } - auto level1_entry = current_handle[page.get_level_index(page_table_handle::LEVEL1)]; + auto & level1_entry = current_handle[page.get_level_index(page_table_handle::LEVEL1)]; auto const level1_frame = level1_entry.calculate_pointed_to_frame(); exception_handling::assert(level1_frame.has_value(), "[Page Mapper] Attempted to unmap page, which has not been mapped previously"); diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp index e067b48..5c55213 100644 --- a/arch/x86_64/src/kernel/main.cpp +++ b/arch/x86_64/src/kernel/main.cpp @@ -28,9 +28,13 @@ namespace teachos::arch::kernel video::vga::text::write("Mapped physical frame: ", video::vga::text::common_attributes::green_on_black); video::vga::text::write_number(optional_frame.value().frame_number, video::vga::text::common_attributes::green_on_black); + video::vga::text::write(" to virtual page: ", video::vga::text::common_attributes::green_on_black); + video::vga::text::write_number(page.page_number, video::vga::text::common_attributes::green_on_black); memory::paging::unmap_page(allocator, page); - video::vga::text::write("Unapped physical page: ", video::vga::text::common_attributes::green_on_black); + video::vga::text::newline(); + video::vga::text::write("Unapped virtual page from physical frame: ", + video::vga::text::common_attributes::green_on_black); optional_frame = memory::paging::translate_page(page); exception_handling::assert(!optional_frame.has_value(), "[Main] Ummapping failed"); video::vga::text::write_number(page.page_number, video::vga::text::common_attributes::green_on_black); diff --git a/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp b/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp index 6ec3e95..fecc6cd 100644 --- a/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp +++ b/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp @@ -85,7 +85,11 @@ namespace teachos::arch::memory::allocator auto area_frame_allocator::deallocate_frame(physical_frame physical_frame) -> void { - exception_handling::assert(false && physical_frame.frame_number == 0, - "[deallocate_frame] Not implemented Exception"); + // TODO: Implement deallocation to make unmap actually work. + if (physical_frame.frame_number == 0) + { + } + /*exception_handling::assert(false && physical_frame.frame_number == 0, + "[deallocate_frame] Not implemented Exception");*/ } } // namespace teachos::arch::memory::allocator diff --git a/arch/x86_64/src/memory/paging/page_entry.cpp b/arch/x86_64/src/memory/paging/page_entry.cpp index 8923fea..23c700f 100644 --- a/arch/x86_64/src/memory/paging/page_entry.cpp +++ b/arch/x86_64/src/memory/paging/page_entry.cpp @@ -23,7 +23,8 @@ namespace teachos::arch::memory::paging { if (contains_flags(PRESENT)) { - return allocator::physical_frame::containing_address(flags.to_ulong() & PHYSICAL_ADDRESS_MASK); + auto const address = flags.to_ulong() & PHYSICAL_ADDRESS_MASK; + return allocator::physical_frame::containing_address(address); } return std::nullopt; } diff --git a/arch/x86_64/src/memory/paging/page_mapper.cpp b/arch/x86_64/src/memory/paging/page_mapper.cpp index 3baf6ae..0a1fc65 100644 --- a/arch/x86_64/src/memory/paging/page_mapper.cpp +++ b/arch/x86_64/src/memory/paging/page_mapper.cpp @@ -55,8 +55,8 @@ namespace teachos::arch::memory::paging } auto const level1_index = page.get_level_index(page_table_handle::LEVEL1); - auto const level1_frame = current_handle[level1_index].calculate_pointed_to_frame(); - return level1_frame; + auto const level1_entry = current_handle[level1_index]; + return level1_entry.calculate_pointed_to_frame(); } auto translate_huge_page(virtual_page page) -> std::optional -- cgit v1.2.3