1use crate::csr::{mstatus::mstatus, CSR};
8
9#[cfg(any(doc, all(target_arch = "riscv32", target_os = "none")))]
10#[inline(always)]
11pub fn nop() {
13 use core::arch::asm;
14 unsafe {
15 asm!("nop", options(nomem, nostack, preserves_flags));
16 }
17}
18
19#[cfg(any(doc, all(target_arch = "riscv32", target_os = "none")))]
20#[inline(always)]
21pub unsafe fn wfi() {
23 use core::arch::asm;
24 asm!("wfi", options(nomem, nostack));
25}
26
27pub unsafe fn atomic<F, R>(f: F) -> R
28where
29 F: FnOnce() -> R,
30{
31 let original_mie: usize = CSR
37 .mstatus
38 .read_and_clear_bits(mstatus::mie.mask << mstatus::mie.shift)
39 & mstatus::mie.mask << mstatus::mie.shift;
40
41 let res = f();
44
45 CSR.mstatus.read_and_set_bits(original_mie);
48
49 res
50}
51
52#[cfg(not(any(doc, all(target_arch = "riscv32", target_os = "none"))))]
54pub fn nop() {
56 unimplemented!()
57}
58
59#[cfg(not(any(doc, all(target_arch = "riscv32", target_os = "none"))))]
60pub unsafe fn wfi() {
62 unimplemented!()
63}