diff --git a/page_table_multiarch/src/bits64.rs b/page_table_multiarch/src/bits64.rs index fe04c1b..7a8c5d2 100644 --- a/page_table_multiarch/src/bits64.rs +++ b/page_table_multiarch/src/bits64.rs @@ -1,12 +1,9 @@ extern crate alloc; -use alloc::{vec, vec::Vec}; -use core::marker::PhantomData; - -use memory_addr::{PhysAddr, VirtAddr, PAGE_SIZE_4K}; - use crate::{GenericPTE, PagingHandler, PagingMetaData}; use crate::{MappingFlags, PageSize, PagingError, PagingResult}; +use core::marker::PhantomData; +use memory_addr::{PhysAddr, VirtAddr, PAGE_SIZE_4K}; const ENTRY_COUNT: usize = 512; @@ -32,7 +29,6 @@ const fn p1_index(vaddr: VirtAddr) -> usize { /// When the [`PageTable64`] itself is dropped. pub struct PageTable64 { root_paddr: PhysAddr, - intrm_tables: Vec, _phantom: PhantomData<(M, PTE, H)>, } @@ -44,7 +40,6 @@ impl PageTable64 PageTable64(&self, limit: usize, func: &F) -> PagingResult + pub fn walk(&self, limit: usize, pre_func: Option<&F>, post_func: Option<&F>) -> PagingResult where F: Fn(usize, usize, VirtAddr, &PTE), { @@ -243,7 +240,8 @@ impl PageTable64 PageTable64(&mut self, entry: &mut PTE) -> PagingResult<&'a mut [PTE]> { if entry.is_unused() { let paddr = Self::alloc_table()?; - self.intrm_tables.push(paddr); *entry = GenericPTE::new_table(paddr); Ok(self.table_of_mut(paddr)) } else { @@ -353,7 +350,8 @@ impl PageTable64, + post_func: Option<&F>, ) -> PagingResult where F: Fn(usize, usize, VirtAddr, &PTE), @@ -362,10 +360,15 @@ impl PageTable64= limit { @@ -379,8 +382,16 @@ impl PageTable64 Drop for PageTable64 { fn drop(&mut self) { - for frame in &self.intrm_tables { - H::dealloc_frame(*frame); - } + // don't free the entries in last level, they are not array. + let _ = self.walk( + usize::MAX, + None, + Some(&|level, _index, _vaddr, entry: &PTE| { + if level < M::LEVELS - 1 && entry.is_present() && !entry.is_huge() { + H::dealloc_frame(entry.paddr()); + } + }), + ); + H::dealloc_frame(self.root_paddr()); } }