macro_rules! indexed_mmu_ll {
($pac:ident, entries: $entries:expr, valid: $valid:expr, val_mask: $val_mask:expr,
page_size: |$spi0:ident| $page_size:expr) => {
use crate::mmu_hal::page_shift;
#[allow(unused_imports)]
use crate::mmu_hal::{
MMU_PAGE_8KB, MMU_PAGE_16KB, MMU_PAGE_32KB, MMU_PAGE_64KB, MMU_PAGE_128KB,
MMU_PAGE_256KB,
};
fn spi0() -> &'static $pac::spi0::RegisterBlock {
unsafe { &*$pac::SPI0::ptr() }
}
pub fn mmu_ll_get_page_size(_mmu_id: u32) -> u32 {
#[allow(unused_variables)]
let $spi0 = spi0();
$page_size
}
pub fn mmu_ll_get_entry_id(mmu_id: u32, vaddr: u32) -> u32 {
let page_size = mmu_ll_get_page_size(mmu_id);
let shift = page_shift(page_size).unwrap_or(16);
(vaddr & (page_size.wrapping_mul($entries).wrapping_sub(1))) >> shift
}
pub fn mmu_ll_entry_id_to_paddr_base(mmu_id: u32, entry_id: u32) -> u32 {
let shift = page_shift(mmu_ll_get_page_size(mmu_id)).unwrap_or(16);
(mmu_entry(entry_id) & $val_mask) << shift
}
pub fn mmu_ll_check_entry_valid(_mmu_id: u32, entry_id: u32) -> bool {
entry_id < $entries && (mmu_entry(entry_id) & $valid) != 0
}
fn mmu_entry(entry_id: u32) -> u32 {
let spi0 = spi0();
spi0.mmu_item_index()
.write(|w| unsafe { w.mmu_item_index().bits(entry_id) });
spi0.mmu_item_content().read().bits()
}
};
}
pub(super) use indexed_mmu_ll;