aboutsummaryrefslogtreecommitdiff
path: root/src/interrupt.rs
blob: 68719ecf4e197cb67897e1bff4cffc822734b41e (plain) (blame)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! Interrupts

pub use bare_metal::{CriticalSection, Mutex};

/// Trait for enums of external interrupt numbers.
///
/// This trait should be implemented by a peripheral access crate (PAC)
/// on its enum of available external interrupts for a specific device.
/// Each variant must convert to a u16 of its interrupt number,
/// which is its exception number - 16.
///
/// # Safety
///
/// This trait must only be implemented on enums of device interrupts. Each
/// enum variant must represent a distinct value (no duplicates are permitted),
/// and must always return the same value (do not change at runtime).
///
/// These requirements ensure safe nesting of critical sections.
pub unsafe trait InterruptNumber: Copy {
    /// Return the interrupt number associated with this variant.
    ///
    /// See trait documentation for safety requirements.
    fn number(self) -> u16;
}

/// Disables all interrupts
#[inline]
pub fn disable() {
    call_asm!(__cpsid());
}

/// Enables all the interrupts
///
/// # Safety
///
/// - Do not call this function inside an `interrupt::free` critical section
#[inline]
pub unsafe fn enable() {
    call_asm!(__cpsie());
}

/// 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(&CriticalSection) -> R,
{
    let primask = crate::register::primask::read();

    // disable interrupts
    disable();

    let r = f(unsafe { &CriticalSection::new() });

    // If the interrupts were active before our `disable` call, then re-enable
    // them. Otherwise, keep them disabled
    if primask.is_active() {
        unsafe { enable() }
    }

    r
}
ng-for-utf16'>jarred/redo-zigstring-for-utf16 Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/src/css_scanner.zig (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2023-05-20Bun.inspect gets a max depth of 32Gravatar Jarred Sumner 1-0/+1
2023-05-20[bun:test] Make forEachPropertyOrdered behave closer to forEachPropertyGravatar Jarred Sumner 1-4/+41
2023-05-20[console.log] Set depth limit to 8Gravatar Jarred Sumner 1-19/+65
2023-05-20[internal] Make `JSC.NewFunction` more type safeGravatar Jarred Sumner 3-8/+9
2023-05-20[internal] Show the file path to the calling function from JSGravatar Jarred Sumner 2-0/+2519
2023-05-20Implement `test.todo` (#2961)Gravatar Degreat 6-9/+177
2023-05-20[bun:test] Fix bug where indexed properties would print "undefined" in diffsGravatar Jarred Sumner 1-16/+24
2023-05-20[bun:test] Fix bug where indexed properties would print "undefined" in diffsGravatar Jarred Sumner 3-0/+33
2023-05-20Support test timeouts in `bun:test` (#2969)Gravatar Jarred Sumner 8-13/+140
2023-05-19smolGravatar Jarred Sumner 1-0/+4
2023-05-19fix #2964 (#2965)Gravatar e3dio 1-0/+1
2023-05-19console.log changes (#2966)Gravatar Jarred Sumner 5-82/+82
2023-05-19ensure unused variable is not eliminatedGravatar Jarred Sumner 1-0/+2
2023-05-19Fix failing node:vm testsGravatar Jarred Sumner 2-10/+22