aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-10 12:27:37 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-10 12:27:37 +0100
commit448a79328544e3ecb72d0b3b95c0b9b0d49faafc (patch)
tree83d12677cccafe6e7df2b5c3eab947797d291c44
parentfc6d44be383213b7609b5e3c4778e235fb6b00c3 (diff)
downloadteachos-448a79328544e3ecb72d0b3b95c0b9b0d49faafc.tar.xz
teachos-448a79328544e3ecb72d0b3b95c0b9b0d49faafc.zip
x86_64/memory: fix scoped_mapping unmap logic
-rw-r--r--arch/x86_64/src/memory/scoped_mapping.cpp32
1 files changed, 13 insertions, 19 deletions
diff --git a/arch/x86_64/src/memory/scoped_mapping.cpp b/arch/x86_64/src/memory/scoped_mapping.cpp
index c9c6459..44dbf45 100644
--- a/arch/x86_64/src/memory/scoped_mapping.cpp
+++ b/arch/x86_64/src/memory/scoped_mapping.cpp
@@ -96,38 +96,32 @@ namespace teachos::memory::x86_64
system::panic("[MEM] Tried to release an unmapped temporary mapping!");
}
- auto pml3 = paging_root::get().next(pml_index<4>(m_page)).value();
+ auto pml4 = &paging_root::get();
+ auto pml3 = pml4->next(pml_index<4>(m_page)).value();
auto pml2 = pml3->next(pml_index<3>(m_page)).value();
auto pml1 = pml2->next(pml_index<2>(m_page)).value();
+ (*pml1)[pml_index<1>(m_page)].clear();
+
if (m_allocated & 1uz << 0)
{
- auto pml1_entry = (*pml1)[pml_index<1>(m_page)];
- (*pml1)[pml_index<1>(m_page)].clear();
- if (pml1->empty())
- {
- m_allocator->release(pml1_entry.frame().value());
- }
+ auto pml1_frame = (*pml2)[pml_index<2>(m_page)].frame().value();
+ m_allocator->release(pml1_frame);
+ (*pml2)[pml_index<2>(m_page)].clear();
}
if (m_allocated & 1uz << 1)
{
- auto pml2_entry = (*pml2)[pml_index<2>(m_page)];
- (*pml2)[pml_index<2>(m_page)].clear();
- if (pml2->empty())
- {
- m_allocator->release(pml2_entry.frame().value());
- }
+ auto pml2_frame = (*pml3)[pml_index<3>(m_page)].frame().value();
+ m_allocator->release(pml2_frame);
+ (*pml3)[pml_index<3>(m_page)].clear();
}
if (m_allocated & 1uz << 2)
{
- auto pml3_entry = (*pml3)[pml_index<3>(m_page)];
- (*pml3)[pml_index<3>(m_page)].clear();
- if (pml3->empty())
- {
- m_allocator->release(pml3_entry.frame().value());
- }
+ auto pml3_frame = (*pml4)[pml_index<4>(m_page)].frame().value();
+ m_allocator->release(pml3_frame);
+ (*pml4)[pml_index<4>(m_page)].clear();
}
m_mapped = false;