feat: utils: addr: allow to convert from u32 and u64

This commit is contained in:
Paul Pan 2024-06-09 00:20:42 +08:00
parent 7fa26c109f
commit 77283b47ef

View File

@ -14,6 +14,15 @@ pub fn align_down(addr: usize, align: usize) -> usize {
addr & !(align - 1) 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)] #[derive(Copy, Clone, Default, Eq, Ord, PartialOrd, PartialEq)]
pub struct PhysAddr(pub usize); pub struct PhysAddr(pub usize);
@ -37,11 +46,7 @@ pub trait AddressOps: Copy + Clone + Default + Eq + Ord + PartialOrd + PartialEq
where T: Into<usize>; where T: Into<usize>;
fn is_aligned<T>(&self, align: T) -> bool fn is_aligned<T>(&self, align: T) -> bool
where T: Into<usize> + Copy { where T: Into<usize> + Copy {
if align.into().is_power_of_two() { is_aligned(self.as_usize(), align.into())
self.as_usize() & (align.into() - 1) == 0
} else {
false
}
} }
} }
@ -219,6 +224,19 @@ impl From<usize> for PhysAddr {
} }
} }
impl From<u32> for PhysAddr {
fn from(addr: u32) -> Self {
PhysAddr(addr as usize)
}
}
#[cfg(target_pointer_width = "64")]
impl From<u64> for PhysAddr {
fn from(addr: u64) -> Self {
PhysAddr(addr as usize)
}
}
impl From<NonZeroUsize> for PhysAddr { impl From<NonZeroUsize> for PhysAddr {
fn from(addr: NonZeroUsize) -> Self { fn from(addr: NonZeroUsize) -> Self {
PhysAddr(addr.get()) PhysAddr(addr.get())
@ -261,6 +279,19 @@ impl From<usize> for VirtAddr {
} }
} }
impl From<u32> for VirtAddr {
fn from(addr: u32) -> Self {
VirtAddr(addr as usize)
}
}
#[cfg(target_pointer_width = "64")]
impl From<u64> for VirtAddr {
fn from(addr: u64) -> Self {
VirtAddr(addr as usize)
}
}
impl From<NonZeroUsize> for VirtAddr { impl From<NonZeroUsize> for VirtAddr {
fn from(addr: NonZeroUsize) -> Self { fn from(addr: NonZeroUsize) -> Self {
VirtAddr(addr.get()) VirtAddr(addr.get())