From 433f1498c3ca64d3c300630eee6acb67b11c46ad Mon Sep 17 00:00:00 2001 From: Louis Vialar Date: Fri, 5 Jun 2026 19:21:38 +0200 Subject: [PATCH 1/2] fix(riscv64/paging): memory unmapping --- src/arch/riscv64/mm/paging.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/arch/riscv64/mm/paging.rs b/src/arch/riscv64/mm/paging.rs index 167f1099da..6ed8f99097 100644 --- a/src/arch/riscv64/mm/paging.rs +++ b/src/arch/riscv64/mm/paging.rs @@ -135,6 +135,11 @@ impl PageTableEntry { (self.physical_address_and_flags & PageTableEntryFlags::EXECUTABLE.bits()) != 0 } + /// Mark this as an invalid (not present) entry + fn unset(&mut self) { + self.physical_address_and_flags = PhysAddr::zero(); + } + /// Mark this as a valid (present) entry and set address translation and flags. /// /// # Arguments @@ -377,10 +382,15 @@ impl PageTableMethods for PageTable { let index = page.table_index::(); let flush = self.entries[index].is_present(); - self.entries[index].set( - physical_address, - S::MAP_EXTRA_FLAG | PageTableEntryFlags::ACCESSED | PageTableEntryFlags::DIRTY | flags, - ); + if physical_address.is_null() && flags == PageTableEntryFlags::BLANK { + // Clear PTE + self.entries[index].unset(); + } else { + self.entries[index].set( + physical_address, + S::MAP_EXTRA_FLAG | PageTableEntryFlags::ACCESSED | PageTableEntryFlags::DIRTY | flags, + ); + } if flush { page.flush_from_tlb(); From fdb2c8b933b4b76961637bba847ad1a04fbab1d3 Mon Sep 17 00:00:00 2001 From: Louis Vialar Date: Fri, 5 Jun 2026 19:25:05 +0200 Subject: [PATCH 2/2] fix(aarch64/paging): memory unmapping --- src/arch/aarch64/mm/paging.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/arch/aarch64/mm/paging.rs b/src/arch/aarch64/mm/paging.rs index 61316a906a..92161ddeff 100644 --- a/src/arch/aarch64/mm/paging.rs +++ b/src/arch/aarch64/mm/paging.rs @@ -413,8 +413,8 @@ impl PageTableMethods for PageTable { } if flags == PageTableEntryFlags::BLANK { - // in this case we unmap the pages - self.entries[index].set(physical_address, flags); + // We already unmapped the page + return; } else { self.entries[index].set(physical_address, S::MAP_EXTRA_FLAG | flags); }