diff --git a/kernel/src/memory.rs b/kernel/src/memory.rs index 7c63ebc..9203bf0 100644 --- a/kernel/src/memory.rs +++ b/kernel/src/memory.rs @@ -21,9 +21,18 @@ impl PhyAddr { virt.into().0.checked_sub(hhdm_base).map(PhyAddr) } - pub fn into_hhdm_virt(&self) -> VirtAddr { + pub fn from_page_index(page_index: usize) -> Self { + PhyAddr(page_index as u64 * PAGE_SIZE as u64) + } + + pub fn as_hhdm_virt(&self) -> VirtAddr { VirtAddr(self.0 + unsafe { crate::memory::HHDM_BASE.get().unwrap_unchecked() }) } + + pub fn into_hhdm_virt(self) -> VirtAddr { + VirtAddr(self.0 + unsafe { crate::memory::HHDM_BASE.get().unwrap_unchecked() }) + } + pub fn page_add(&self, page_count: usize) -> PhyAddr { PhyAddr(self.0 + (page_count as u64 * PAGE_SIZE as u64)) } @@ -88,6 +97,9 @@ impl VirtAddr { pub fn as_mut(&self) -> *mut T { core::ptr::with_exposed_provenance_mut(self.0 as usize) } + pub fn into_nonnull(self) -> Option> { + NonZeroUsize::new(self.0 as usize).map(NonNull::with_exposed_provenance) + } } pub struct PageChunk { @@ -129,7 +141,7 @@ impl PageHeader { fn new_from_page_idx_and_count(page_idx: usize, count: usize) -> NonNull { let phy = PhyAddr(page_idx as u64 * PAGE_SIZE as u64); - let virt = phy.into_hhdm_virt(); + let virt = phy.as_hhdm_virt(); let ptr = virt.as_mut::(); unsafe { @@ -760,15 +772,24 @@ unsafe impl rbtree::UnsafeNode for PhysicalPageNode { type Key = PhysicalPageNodeKey; fn left(&self) -> Option> { - NonZeroUsize::new((self.left_bits() << 12) as usize).map(NonNull::with_exposed_provenance) + NonZeroUsize::new(self.left_bits() as usize) + .map(|n| PhyAddr::from_page_index(n.get())) + .map(PhyAddr::into_hhdm_virt) + .and_then(VirtAddr::into_nonnull) } fn right(&self) -> Option> { - NonZeroUsize::new((self.right_bits() << 12) as usize).map(NonNull::with_exposed_provenance) + NonZeroUsize::new(self.right_bits() as usize) + .map(|n| PhyAddr::from_page_index(n.get())) + .map(PhyAddr::into_hhdm_virt) + .and_then(VirtAddr::into_nonnull) } fn parent(&self) -> Option> { - NonZeroUsize::new((self.parent_bits() << 12) as usize).map(NonNull::with_exposed_provenance) + NonZeroUsize::new(self.parent_bits() as usize) + .map(|n| PhyAddr::from_page_index(n.get())) + .map(PhyAddr::into_hhdm_virt) + .and_then(VirtAddr::into_nonnull) } fn key(&self) -> &Self::Key { diff --git a/kernel/src/x86_64/paging.rs b/kernel/src/x86_64/paging.rs index 640e0bf..0f46dc9 100644 --- a/kernel/src/x86_64/paging.rs +++ b/kernel/src/x86_64/paging.rs @@ -128,7 +128,7 @@ impl PageTableEntry { unsafe { Some( self.phy() - .into_hhdm_virt() + .as_hhdm_virt() .as_ptr::() .as_ref() .unwrap_unchecked(), @@ -143,7 +143,7 @@ impl PageTableEntry { unsafe { self.phy() - .into_hhdm_virt() + .as_hhdm_virt() .as_ptr::() .as_ref() .unwrap_unchecked() @@ -192,7 +192,7 @@ pub fn get_physical_addr(virt: VirtAddr) -> Option { let frame = cr3.phy(); let page_table = unsafe { frame - .into_hhdm_virt() + .as_hhdm_virt() .as_ptr::() .as_ref() .unwrap_unchecked() @@ -235,7 +235,7 @@ pub fn get_physical_addr(virt: VirtAddr) -> Option { return None; } - let phy_addr = pt_entry.phy().into_hhdm_virt().0 + virt.offset_4k() as u64; + let phy_addr = pt_entry.phy().as_hhdm_virt().0 + virt.offset_4k() as u64; Some(PhyAddr(phy_addr)) }