pub const PAGE_SHIFT: u64 = 12;
pub const PAGE_OFFSET_MASK: u64 = (1 << PAGE_SHIFT) - 1;
pub const VPN_MASK: u64 = 0x1FFF_FFFF_FFFF;
pub const fn crosses_cache_line(addr: u64, size: u64, cache_line_size: u64) -> bool {
if size == 0 {
return false;
}
let line_mask = cache_line_size - 1;
(addr & line_mask) + (size - 1) >= cache_line_size
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
pub struct Asid(u16);
impl Asid {
#[inline(always)]
pub const fn new(val: u16) -> Self {
Self(val)
}
#[inline(always)]
pub const fn val(self) -> u16 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
pub struct IrqId(u32);
impl IrqId {
#[inline(always)]
pub const fn new(val: u32) -> Self {
Self(val)
}
#[inline(always)]
pub const fn val(self) -> u32 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
pub struct Vpn(u64);
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
pub struct Ppn(u64);
impl Vpn {
#[inline(always)]
pub const fn new(val: u64) -> Self {
Self(val)
}
#[inline(always)]
pub const fn val(self) -> u64 {
self.0
}
#[inline(always)]
pub const fn to_addr(self) -> u64 {
self.0 << 12
}
}
impl Ppn {
#[inline(always)]
pub const fn new(val: u64) -> Self {
Self(val)
}
#[inline(always)]
pub const fn val(self) -> u64 {
self.0
}
#[inline(always)]
pub const fn to_addr(self) -> u64 {
self.0 << 12
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct VirtAddr(pub u64);
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct PhysAddr(pub u64);
impl VirtAddr {
#[inline(always)]
pub const fn new(addr: u64) -> Self {
Self(addr)
}
#[inline(always)]
pub const fn val(&self) -> u64 {
self.0
}
pub const fn page_offset(&self) -> u64 {
self.0 & 0xFFF
}
}
impl PhysAddr {
#[inline(always)]
pub const fn new(addr: u64) -> Self {
Self(addr)
}
#[inline(always)]
pub const fn val(&self) -> u64 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct LineAddr(PhysAddr);
impl LineAddr {
#[inline(always)]
pub const fn from_phys(addr: PhysAddr, line_bytes: u64) -> Self {
Self(PhysAddr(addr.0 & !(line_bytes - 1)))
}
#[inline(always)]
pub const fn phys(self) -> PhysAddr {
self.0
}
#[inline(always)]
pub const fn val(self) -> u64 {
self.0.0
}
}