1#![no_std]
6
7unsafe extern "C" {
8 fn cpp_ints_disabled() -> bool;
9 fn cpp_disable_ints();
10 fn cpp_enable_ints();
11 fn cpp_interrupt_save() -> InterruptSavedState;
12 fn cpp_interrupt_restore(state: InterruptSavedState);
13 fn cpp_curr_cpu_num() -> u32;
14 fn cpp_max_num_cpus() -> u32;
15}
16
17#[inline(always)]
19pub fn ints_disabled() -> bool {
20 unsafe { cpp_ints_disabled() }
21}
22
23#[inline(always)]
25pub fn disable_ints() {
26 unsafe { cpp_disable_ints() }
27}
28
29#[inline(always)]
31pub fn enable_ints() {
32 unsafe { cpp_enable_ints() }
33}
34
35#[cfg(target_arch = "x86_64")]
37#[repr(transparent)]
38#[derive(Clone, Copy, Debug, PartialEq, Eq)]
39pub struct InterruptSavedState(usize);
40
41#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
43#[repr(transparent)]
44#[derive(Clone, Copy, Debug, PartialEq, Eq)]
45pub struct InterruptSavedState(bool);
46
47#[inline(always)]
50pub fn arch_interrupt_save() -> InterruptSavedState {
51 unsafe { cpp_interrupt_save() }
52}
53
54#[inline(always)]
56pub fn arch_interrupt_restore(state: InterruptSavedState) {
57 unsafe { cpp_interrupt_restore(state) }
58}
59
60pub struct InterruptDisableGuard {
63 state: InterruptSavedState,
64}
65
66impl InterruptDisableGuard {
67 #[inline(always)]
68 pub fn new() -> Self {
69 Self { state: arch_interrupt_save() }
70 }
71}
72
73impl Drop for InterruptDisableGuard {
74 #[inline(always)]
75 fn drop(&mut self) {
76 arch_interrupt_restore(self.state);
77 }
78}
79
80#[inline(always)]
82pub fn curr_cpu_num() -> u32 {
83 unsafe { cpp_curr_cpu_num() }
84}
85
86#[inline(always)]
88pub fn max_num_cpus() -> u32 {
89 unsafe { cpp_max_num_cpus() }
90}