use core::arch::asm;
#[inline]
pub unsafe fn sctlr_el1_read() -> u64 {
let val: u64;
unsafe {
asm!("mrs {}, sctlr_el1", out(reg) val, options(nostack, nomem, preserves_flags));
}
val
}
#[inline]
pub unsafe fn sctlr_el1_write(val: u64) {
unsafe {
asm!("msr sctlr_el1, {}", in(reg) val, options(nostack, nomem, preserves_flags));
}
}
#[inline]
pub unsafe fn tcr_el1_read() -> u64 {
let val: u64;
unsafe {
asm!("mrs {}, tcr_el1", out(reg) val, options(nostack, nomem, preserves_flags));
}
val
}
#[inline]
pub unsafe fn set_tcr_el1(val: u64) {
unsafe {
asm!("msr tcr_el1, {}", in(reg) val, options(nostack, nomem, preserves_flags));
}
}
#[inline]
pub unsafe fn set_mair_el1(val: u64) {
unsafe {
asm!("msr mair_el1, {}", in(reg) val, options(nostack, nomem, preserves_flags));
}
}
#[inline]
pub unsafe fn set_ttbr0_el1(val: u64) {
unsafe {
asm!("msr ttbr0_el1, {}", in(reg) val, options(nostack, nomem, preserves_flags));
}
}
#[inline]
pub unsafe fn set_ttbr1_el1(val: u64) {
unsafe {
asm!("msr ttbr1_el1, {}", in(reg) val, options(nostack, nomem, preserves_flags));
}
}
#[inline]
pub unsafe fn set_vbar_el1(val: usize) {
unsafe {
asm!(
"msr vbar_el1, {}",
in(reg) val as u64,
options(nostack, nomem, preserves_flags)
);
}
}
#[inline]
pub unsafe fn esr_el1_read() -> u64 {
let val: u64;
unsafe {
asm!("mrs {}, esr_el1", out(reg) val, options(nostack, nomem, preserves_flags));
}
val
}
#[inline]
pub unsafe fn far_el1_read() -> u64 {
let val: u64;
unsafe {
asm!("mrs {}, far_el1", out(reg) val, options(nostack, nomem, preserves_flags));
}
val
}
#[inline]
pub unsafe fn current_el() -> u8 {
let val: u64;
unsafe {
asm!("mrs {}, CurrentEL", out(reg) val, options(nostack, nomem, preserves_flags));
}
((val >> 2) & 0x3) as u8
}
#[inline]
pub unsafe fn dsb() {
unsafe {
asm!("dsb sy", options(nostack, nomem, preserves_flags));
}
}
#[inline]
pub unsafe fn isb() {
unsafe {
asm!("isb", options(nostack, nomem, preserves_flags));
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_register_accessors_compile() {
}
}