#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] pub struct PhysAddr(pub u64); #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] pub struct VirtAddr(pub u64); impl PhysAddr { /// Convert physical address to virtual via HHDM offset pub fn to_virt(self, hhdm_offset: u64) -> VirtAddr { VirtAddr(self.0 + hhdm_offset) } #[allow(dead_code)] pub fn is_aligned(self) -> bool { self.0 % 4096 == 0 } #[allow(dead_code)] pub fn align_down(self) -> Self { Self(self.0 & !0xFFF) } #[allow(dead_code)] pub fn align_up(self) -> Self { Self((self.0 + 4095) & !0xFFF) } } impl VirtAddr { #[allow(dead_code)] pub fn to_phys(self, hhdm_offset: u64) -> Option { if self.0 < hhdm_offset { return None; } Some(PhysAddr(self.0 - hhdm_offset)) } #[allow(dead_code)] pub fn as_ptr(self) -> *const T { self.0 as *const T } pub fn as_mut_ptr(self) -> *mut T { self.0 as *mut T } }