cfg_if::cfg_if! {
if #[cfg(test)] {
#[coverage(off)]
mod null;
type Arch = null::NullArch;
} else if #[cfg(target_arch = "aarch64")] {
#[coverage(off)] pub mod aarch64;
type Arch = aarch64::AArch64;
} else if #[cfg(target_arch = "x86_64")] {
#[coverage(off)] pub mod x64;
type Arch = x64::X64;
}
}
#[allow(unused)]
trait ArchSupport: Interrupts {}
trait Interrupts {
fn enable_interrupts();
fn disable_interrupts();
fn interrupts_enabled() -> bool;
}
fn enable_interrupts() {
<Arch as Interrupts>::enable_interrupts();
}
fn disable_interrupts() {
<Arch as Interrupts>::disable_interrupts();
}
fn interrupts_enabled() -> bool {
<Arch as Interrupts>::interrupts_enabled()
}
pub(crate) fn with_interrupts_disabled<F, R>(f: F) -> R
where
F: FnOnce() -> R,
{
let enabled = interrupts_enabled();
if enabled {
disable_interrupts();
}
let result = f();
if enabled {
enable_interrupts();
}
result
}