use core::arch::asm;
use page_table_entry::arm::A32PTE;
use crate::{PageTable32, PageTable32Cursor, PagingMetaData};
pub struct A32PagingMetaData;
impl PagingMetaData for A32PagingMetaData {
const LEVELS: usize = 2; const PA_MAX_BITS: usize = 32;
const VA_MAX_BITS: usize = 32;
type VirtAddr = memory_addr::VirtAddr;
fn vaddr_is_valid(_vaddr: usize) -> bool {
true
}
#[inline]
fn flush_tlb(vaddr: Option<memory_addr::VirtAddr>) {
unsafe {
if let Some(vaddr) = vaddr {
asm!(
"mcr p15, 0, {0}, c8, c7, 1", in(reg) vaddr.as_usize(),
);
} else {
let zero: usize = 0;
asm!(
"mcr p15, 0, {0}, c8, c7, 0", in(reg) zero,
);
}
asm!("dsb");
asm!("isb");
}
}
}
pub type A32PageTable<H> = PageTable32<A32PagingMetaData, A32PTE, H>;
pub type A32PageCursor<'a, H> = PageTable32Cursor<'a, A32PagingMetaData, A32PTE, H>;