picorv32/
interrupt.rs

1//! Interrupts
2
3use crate::asm::*;
4pub use bare_metal::{CriticalSection, Mutex, Nr};
5
6/// Disables all interrupts
7#[inline]
8pub unsafe fn disable() {
9    maskirq(0xffff_ffff);
10}
11
12/// Enables all the interrupts
13///
14/// # Safety
15///
16/// - Do not call this function inside an `interrupt::free` critical section
17#[inline]
18pub unsafe fn enable() {
19    maskirq(0);
20}
21
22/// Execute closure `f` in an interrupt-free context.
23///
24/// This as also known as a "critical section".
25pub fn free<F, R>(f: F) -> R
26where
27    F: FnOnce(&CriticalSection) -> R,
28{
29    // disable interrupts
30    let old_mask = unsafe { maskirq(0xffff_ffff) };
31
32    let r = f(unsafe { &CriticalSection::new() });
33
34    unsafe {
35        maskirq(old_mask);
36    }
37
38    r
39}