From d82ba37de8d1801cd1bf47f211ca1ddcfcf8201c Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 19 Feb 2026 19:39:16 +1100 Subject: [PATCH] feat(mapper/remap_with_full): conditional remap This commit modifies the transform function (`f`) argument of `remap_with_full` to return an `Option`. This allows the caller to skip remaps based on the previous frame and page flags. It can alternatively be done by first translating the address and then remapping based on that but that would mean we have to walk the page tables twice :| Signed-off-by: Anhad Singh --- src/page/mapper.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/page/mapper.rs b/src/page/mapper.rs index 27e2b936e7..b97d21543f 100644 --- a/src/page/mapper.rs +++ b/src/page/mapper.rs @@ -63,14 +63,16 @@ impl PageMapper { pub unsafe fn remap_with_full( &mut self, virt: VirtualAddress, - f: impl FnOnce(PhysicalAddress, PageFlags) -> (PhysicalAddress, PageFlags), + f: impl FnOnce(PhysicalAddress, PageFlags) -> Option<(PhysicalAddress, PageFlags)>, ) -> Option<(PageFlags, PhysicalAddress, PageFlush)> { unsafe { self.visit(virt, |p1, i| { let old_entry = p1.entry(i)?; let old_phys = old_entry.address().ok()?; let old_flags = old_entry.flags(); - let (new_phys, new_flags) = f(old_phys, old_flags); + let Some((new_phys, new_flags)) = f(old_phys, old_flags) else { + return None; + }; // TODO: Higher-level PageEntry::new interface? let new_entry = PageEntry::new(new_phys.data(), new_flags.data()); p1.set_entry(i, new_entry); @@ -86,7 +88,7 @@ impl PageMapper { ) -> Option<(PageFlags, PhysicalAddress, PageFlush)> { unsafe { self.remap_with_full(virt, |same_phys, old_flags| { - (same_phys, map_flags(old_flags)) + Some((same_phys, map_flags(old_flags))) }) } }