diff --git a/lib/utils/src/addr.rs b/lib/utils/src/addr.rs index 7748e6e..7671f55 100644 --- a/lib/utils/src/addr.rs +++ b/lib/utils/src/addr.rs @@ -14,6 +14,15 @@ pub fn align_down(addr: usize, align: usize) -> usize { addr & !(align - 1) } +#[inline(always)] +pub fn is_aligned(addr: usize, align: usize) -> bool { + if align.is_power_of_two() { + addr & (align - 1) == 0 + } else { + false + } +} + #[derive(Copy, Clone, Default, Eq, Ord, PartialOrd, PartialEq)] pub struct PhysAddr(pub usize); @@ -37,11 +46,7 @@ pub trait AddressOps: Copy + Clone + Default + Eq + Ord + PartialOrd + PartialEq where T: Into; fn is_aligned(&self, align: T) -> bool where T: Into + Copy { - if align.into().is_power_of_two() { - self.as_usize() & (align.into() - 1) == 0 - } else { - false - } + is_aligned(self.as_usize(), align.into()) } } @@ -219,6 +224,19 @@ impl From for PhysAddr { } } +impl From for PhysAddr { + fn from(addr: u32) -> Self { + PhysAddr(addr as usize) + } +} + +#[cfg(target_pointer_width = "64")] +impl From for PhysAddr { + fn from(addr: u64) -> Self { + PhysAddr(addr as usize) + } +} + impl From for PhysAddr { fn from(addr: NonZeroUsize) -> Self { PhysAddr(addr.get()) @@ -261,6 +279,19 @@ impl From for VirtAddr { } } +impl From for VirtAddr { + fn from(addr: u32) -> Self { + VirtAddr(addr as usize) + } +} + +#[cfg(target_pointer_width = "64")] +impl From for VirtAddr { + fn from(addr: u64) -> Self { + VirtAddr(addr as usize) + } +} + impl From for VirtAddr { fn from(addr: NonZeroUsize) -> Self { VirtAddr(addr.get())