From fb88d1669f3a28d2e8ee84266c8aa3ce0bce8eb1 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 8 Sep 2020 19:59:13 -0600 Subject: [PATCH] Add unmap function --- src/main.rs | 10 ++++++++++ src/page/mapper.rs | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/main.rs b/src/main.rs index eb899ca8df..801389fbe4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -228,6 +228,16 @@ unsafe fn new_tables(areas: &'static [MemoryArea]) { flush_all.consume(flush); } flush_all.flush(); + + let flush_all = PageFlushAll::new(); + for i in 0..16 { + let virt = VirtualAddress::new(MEGABYTE + i * A::PAGE_SIZE); + let flush = mapper.unmap( + virt, + ).expect("failed to unmap page"); + flush_all.consume(flush); + } + flush_all.flush(); } unsafe fn inner() { diff --git a/src/page/mapper.rs b/src/page/mapper.rs index 0c9b03e6eb..524e170719 100644 --- a/src/page/mapper.rs +++ b/src/page/mapper.rs @@ -78,4 +78,27 @@ impl<'f, A: Arch, F: FrameAllocator> PageMapper<'f, A, F> { } } } + + pub unsafe fn unmap(&mut self, virt: VirtualAddress) -> Option> { + let (old, flush) = self.unmap_phys(virt)?; + self.allocator.free_one(old.address()); + Some(flush) + } + + pub unsafe fn unmap_phys(&mut self, virt: VirtualAddress) -> Option<(PageEntry, PageFlush)> { + //TODO: verify virt is aligned + let mut table = self.table(); + //TODO: unmap parents + loop { + let i = table.index_of(virt)?; + if table.level() == 0 { + let entry_opt = table.entry(i); + table.set_entry(i, PageEntry::new(0)); + let entry = entry_opt?; + return Some((entry, PageFlush::new(virt))); + } else { + table = table.next(i)?; + } + } + } }