use core::arch::asm;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(transparent)]
pub struct ExceptionMask(u32);
const AIF_MASK: u32 = 0x7 << 6;
impl ExceptionMask {
pub fn mask() -> Self {
let prev: u32;
unsafe {
asm!(
"mrs {prev}, CPSR",
"cpsid aif",
options(nostack),
prev = out(reg) prev,
);
}
Self(prev & AIF_MASK)
}
pub unsafe fn restore(self) {
let mask = self.0 | !AIF_MASK;
unsafe {
asm!(
"mrs {temp}, CPSR",
"and {temp}, {temp}, {mask}",
"msr CPSR, {temp}",
options(nostack),
temp = out(reg) _,
mask = in(reg) mask,
);
}
}
}