moa_irqflags 0.1.3

本地中断状态管理(save / restore / enable / disable)
Documentation
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);
    }
}