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}