#![no_std]
cfg_if::cfg_if! {
if #[cfg(aarch64_moana)] {
#[path = "aarch64.rs"]
mod arch;
} else if #[cfg(riscv64_moana)] {
#[path = "riscv64.rs"]
mod arch;
} else {
#[path = "stub.rs"]
mod arch;
}
}
cfg_if::cfg_if! {
if #[cfg(any(aarch64_moana, riscv64_moana))] {
pub use arch::*;
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PageLevel {
Page4K,
Page2M,
Page1G,
}
impl PageLevel {
pub const fn size(self) -> usize {
match self {
PageLevel::Page4K => PAGE_SIZE,
PageLevel::Page2M => PMD_SIZE,
PageLevel::Page1G => PGD_SIZE,
}
}
pub const fn mask(self) -> usize {
!(self.size() - 1)
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PageProt: usize {
const R = 1 << 0;
const W = 1 << 1;
const X = 1 << 2;
const U = 1 << 3;
const NC = 1 << 4;
const IO = 1 << 5;
}
}
pub const PAGE_SIZE: usize = 1 << PAGE_SHIFT;
pub const PAGE_SHIFT: usize = 12;
pub const PAGE_MASK: usize = !(PAGE_SIZE - 1);
pub const PTRS_PER_TABLE: usize = 512;
pub const PMD_SIZE: usize = 1 << PMD_SHIFT;
pub const PMD_SHIFT: usize = 21;
pub const PMD_MASK: usize = !(PMD_SIZE - 1);
pub const PGD_SIZE: usize = 1 << PGD_SHIFT;
pub const PGD_SHIFT: usize = 30;
pub const PGD_MASK: usize = !(PGD_SIZE - 1);
#[inline(always)]
pub fn paddr_to_table(paddr: usize) -> usize {
arch::paddr_to_table(paddr)
}
#[inline(always)]
pub fn table_to_paddr(entry: usize) -> usize {
arch::table_to_paddr(entry)
}
#[inline(always)]
pub fn paddr_to_leaf(paddr: usize, prot: PageProt, level: PageLevel) -> usize {
arch::paddr_to_leaf(paddr, prot, level)
}
#[inline(always)]
pub fn leaf_to_paddr(entry: usize) -> usize {
arch::leaf_to_paddr(entry)
}
#[inline(always)]
pub fn entry_is_valid(entry: usize) -> bool {
arch::entry_is_valid(entry)
}
#[inline(always)]
pub fn entry_is_leaf(entry: usize) -> bool {
arch::entry_is_leaf(entry)
}
use moa_const_sizes::{SZ_1G, SZ_4G, SZ_8K, SZ_16K, SZ_32G};
pub const VA_BITS: usize = 39;
pub const USER_ADDR_START: usize = 0;
pub const USER_ADDR_END: usize = (1 << (VA_BITS - 1)) - 1;
pub const KERNEL_ADDR_START: usize = !((1 << (VA_BITS - 1)) - 1);
pub const KERNEL_ADDR_END: usize = usize::MAX;
pub const KIMAGE_ADDR_START: usize = KERNEL_ADDR_START;
pub const KIMAGE_ADDR_SIZE: usize = SZ_4G;
pub const KFIXMAP_ADDR_START: usize = KIMAGE_ADDR_START + KIMAGE_ADDR_SIZE - PMD_SIZE;
pub const KFIXMAP_NR_PAGES: usize = PTRS_PER_TABLE;
pub const KFDT_ADDR_START: usize = KIMAGE_ADDR_START + KIMAGE_ADDR_SIZE;
pub const KFDT_ADDR_SIZE: usize = SZ_1G;
pub const KIO_ADDR_START: usize = KFDT_ADDR_START + KFDT_ADDR_SIZE;
pub const KIO_ADDR_SIZE: usize = SZ_4G;
pub const KPAGE_ADDR_START: usize = KIO_ADDR_START + KIO_ADDR_SIZE;
pub const KPAGE_ADDR_SIZE: usize = SZ_32G;
pub const KMEM_ADDR_START: usize = KPAGE_ADDR_START + KPAGE_ADDR_SIZE;
pub const KMEM_ADDR_END: usize = usize::MAX;
pub const KERNEL_STACK_SIZE: usize = SZ_16K;
pub const BOOT_STACK_SIZE: usize = SZ_8K;