use core::arch::asm;
use memory_addr::VirtAddr;
use page_table_entry::loongarch64::LA64PTE;
use crate::{PageTable64, PageTable64Cursor, PagingMetaData};
#[derive(Copy, Clone, Debug)]
pub struct LA64MetaData;
impl LA64MetaData {
pub const PWCL_VALUE: u32 = 12 | (9 << 5) | (21 << 10) | (9 << 15) | (30 << 20) | (9 << 25);
pub const PWCH_VALUE: u32 = 39 | (9 << 6);
}
impl PagingMetaData for LA64MetaData {
const LEVELS: usize = 4;
const PA_MAX_BITS: usize = 48;
const VA_MAX_BITS: usize = 48;
type VirtAddr = VirtAddr;
#[inline]
fn flush_tlb(vaddr: Option<VirtAddr>) {
unsafe {
if let Some(vaddr) = vaddr {
asm!("dbar 0; invtlb 0x05, $r0, {reg}", reg = in(reg) vaddr.as_usize());
} else {
asm!("dbar 0; invtlb 0x00, $r0, $r0");
}
}
}
}
pub type LA64PageTable<H> = PageTable64<LA64MetaData, LA64PTE, H>;
pub type LA64PageTableCursor<'a, H> = PageTable64Cursor<'a, LA64MetaData, LA64PTE, H>;