use core::arch::asm;
const SSTATUS_SIE: usize = 1 << 1;
#[inline(always)]
pub(super) fn arch_local_irq_save() -> usize {
let flags: usize;
unsafe {
asm!(
"csrrc {0}, sstatus, {1}",
out(reg) flags,
in(reg) SSTATUS_SIE,
);
}
flags & SSTATUS_SIE
}
#[inline(always)]
pub(super) fn arch_local_irq_restore(flags: usize) {
if flags & SSTATUS_SIE != 0 {
unsafe {
asm!("csrs sstatus, {0}", in(reg) SSTATUS_SIE);
}
}
}
#[inline(always)]
pub(super) fn arch_local_irq_enable() {
unsafe {
asm!("csrs sstatus, {0}", in(reg) SSTATUS_SIE);
}
}
#[inline(always)]
pub(super) fn arch_local_irq_disable() {
unsafe {
asm!("csrc sstatus, {0}", in(reg) SSTATUS_SIE);
}
}
#[inline(always)]
pub(super) fn arch_local_save_flags() -> usize {
let flags: usize;
unsafe {
asm!(
"csrr {0}, sstatus",
out(reg) flags,
);
}
flags & SSTATUS_SIE
}
#[inline(always)]
pub(super) fn arch_irqs_disabled_flags(flags: usize) -> bool {
flags & SSTATUS_SIE == 0
}
#[inline(always)]
pub(super) fn arch_irqs_disabled() -> bool {
arch_irqs_disabled_flags(arch_local_save_flags())
}
#[inline(always)]
pub(super) fn arch_local_except_mask() {
unsafe {
asm!("csrc sstatus, {0}", in(reg) SSTATUS_SIE);
}
}
#[inline(always)]
pub(super) fn arch_local_except_unmask() {
unsafe {
asm!("csrs sstatus, {0}", in(reg) SSTATUS_SIE);
}
}