#[cfg(not(portable_atomic_no_asm))]
use core::arch::asm;
#[cfg_attr(
portable_atomic_no_cfg_target_has_atomic,
cfg(any(test, portable_atomic_no_atomic_cas))
)]
#[cfg_attr(
not(portable_atomic_no_cfg_target_has_atomic),
cfg(any(test, not(target_has_atomic = "ptr")))
)]
pub(super) use core::sync::atomic;
pub(crate) type State = u32;
#[inline(always)]
pub(crate) fn disable() -> State {
let primask: State;
unsafe {
asm!(
"mrs {primask}, PRIMASK", "cpsid i", primask = out(reg) primask,
options(nostack, preserves_flags),
);
}
primask
}
#[inline(always)]
pub(crate) unsafe fn restore(prev_primask: State) {
unsafe {
asm!(
"msr PRIMASK, {prev_primask}", prev_primask = in(reg) prev_primask,
options(nostack, preserves_flags),
);
}
}