1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::*;

/// Disables specific interrupts and returns the previous settings
#[inline]
pub fn disable_mask(mask: u32) -> u32 {
    let prev = get_mask();
    unsafe { set_mask(prev & !mask) };
    prev
}

/// Enables specific interrupts and returns the previous setting
#[inline]
pub unsafe fn enable_mask(mask: u32) -> u32 {
    let prev = get_mask();
    set_mask(prev | mask);
    prev
}

/// Disables all interrupts and returns the previous settings
#[inline]
pub fn disable() -> u32 {
    disable_mask(MASK_ALL)
}

/// Enables all interrupts and returns the previous setting
#[inline]
pub unsafe fn enable() -> u32 {
    enable_mask(MASK_ALL)
}

/// Execute closure `f` in an interrupt-free context.
///
/// This as also known as a "critical section".
#[inline]
pub fn free<F, R>(f: F) -> R
where
    F: FnOnce(&bare_metal::CriticalSection) -> R,
{
    let cs = CriticalSection::new();
    f(&cs)
}