diff --git a/kernel/src/arch/riscv/vspace/traits.rs b/kernel/src/arch/riscv/vspace/traits.rs index adc0421..f515705 100644 --- a/kernel/src/arch/riscv/vspace/traits.rs +++ b/kernel/src/arch/riscv/vspace/traits.rs @@ -1,5 +1,6 @@ use num_traits::ToPrimitive; use utils::size::{GIB, KIB, MIB, TIB}; +use utils::MASK; use vspace::addr::{AddressOps, PhysAddr, VirtAddr}; use vspace::paging::TableLevel; @@ -8,8 +9,8 @@ pub trait PhysAddrPaging { const PPN_BITS: usize; const PPN_OFFSET: usize; - const PA_PPN_MASK: usize = ((1 << Self::PPN_BITS) - 1) << Self::PG_OFFSET; - const PTE_PPN_MASK: usize = ((1 << Self::PPN_BITS) - 1) << Self::PPN_OFFSET; + const PA_PPN_MASK: usize = MASK!(Self::PPN_BITS) << Self::PG_OFFSET; + const PTE_PPN_MASK: usize = MASK!(Self::PPN_BITS) << Self::PPN_OFFSET; fn to_ppn(&self) -> usize where Self: AddressOps { @@ -61,7 +62,7 @@ pub trait VirtAddrPaging { fn lower_bits(&self, level: usize) -> usize where Self: AddressOps { - self.as_usize() & ((1 << (Self::PG_OFFSET + Self::VPN_BITS * (level + 1))) - 1) + self.as_usize() & MASK!(Self::PG_OFFSET + Self::VPN_BITS * (level + 1)) } } diff --git a/lib/utils/src/bin.rs b/lib/utils/src/bin.rs new file mode 100644 index 0000000..fd20624 --- /dev/null +++ b/lib/utils/src/bin.rs @@ -0,0 +1,6 @@ +#[macro_export] +macro_rules! MASK { + ($bits:expr) => { + (1 << $bits) - 1 + }; +} diff --git a/lib/utils/src/lib.rs b/lib/utils/src/lib.rs index 2fc00c5..3130303 100644 --- a/lib/utils/src/lib.rs +++ b/lib/utils/src/lib.rs @@ -3,6 +3,7 @@ pub mod assert; pub mod atomic; +pub mod bin; pub mod container_of; pub mod extern_addr; pub mod function_name;