use core::sync::atomic::{compiler_fence, Ordering};
#[inline]
pub fn dmb() {
compiler_fence(Ordering::SeqCst);
unsafe {
core::arch::asm!("dmb", options(nostack, preserves_flags));
}
compiler_fence(Ordering::SeqCst);
}
#[inline]
pub fn dsb() {
compiler_fence(Ordering::SeqCst);
unsafe {
core::arch::asm!("dsb", options(nostack, preserves_flags));
}
compiler_fence(Ordering::SeqCst);
}
#[inline]
pub fn isb() {
compiler_fence(Ordering::SeqCst);
unsafe {
core::arch::asm!("isb", options(nostack, preserves_flags));
}
compiler_fence(Ordering::SeqCst);
}
#[inline]
pub fn nop() {
unsafe { core::arch::asm!("nop", options(nomem, nostack, preserves_flags)) }
}
#[inline]
pub fn wfi() {
unsafe { core::arch::asm!("wfi", options(nomem, nostack, preserves_flags)) }
}
#[inline]
pub fn wfe() {
unsafe { core::arch::asm!("wfe", options(nomem, nostack, preserves_flags)) }
}
#[inline]
pub fn sev() {
unsafe {
core::arch::asm!("sev");
}
}
#[inline]
pub fn core_id() -> u32 {
let r: u32;
unsafe {
core::arch::asm!("MRC p15, 0, {}, c0, c0, 5", out(reg) r, options(nomem, nostack, preserves_flags));
}
r & 0x00FF_FFFF
}