use core::sync::atomic::{compiler_fence, Ordering};
#[inline]
pub unsafe fn enable() {
compiler_fence(Ordering::SeqCst);
#[cfg(target_arch = "arm")]
unsafe {
core::arch::asm!("dsb", "cpsie i", options(nomem, nostack, preserves_flags));
};
}
#[inline]
pub fn disable() {
#[cfg(target_arch = "arm")]
unsafe {
core::arch::asm!("cpsid i", "dsb", options(nomem, nostack, preserves_flags));
};
compiler_fence(Ordering::SeqCst);
}
#[inline]
pub fn free<F, T>(f: F) -> T
where
F: FnOnce() -> T,
{
let cpsr = crate::register::Cpsr::read();
disable();
let result = f();
if cpsr.i() {
unsafe {
enable();
}
}
result
}