pc_atomics/
lib.rs

1#![deny(warnings)]
2
3#![no_std]
4
5#[cfg(pc_atomics)]
6mod atomics {
7    use core::arch::asm;
8    use core::ffi::c_int;
9
10    #[no_mangle]
11    unsafe extern "C" fn __atomic_load(src: *const usize, _model: c_int) -> usize {
12        asm!("cli");
13        let dest = *src;
14        asm!("sti", "nop");
15        dest
16    }
17
18    #[no_mangle]
19    unsafe extern "C" fn __atomic_store(dest: *mut usize, src: usize, _model: c_int) {
20        asm!("cli");
21        *dest = src;
22        asm!("sti", "nop");
23    }
24
25    #[no_mangle]
26    unsafe extern "C" fn __atomic_load_1(src: *const u8, _model: c_int) -> u8 {
27        asm!("cli");
28        let dest = *src;
29        asm!("sti", "nop");
30        dest
31    }
32
33    #[no_mangle]
34    unsafe extern "C" fn __atomic_store_1(dest: *mut u8, src: u8, _model: c_int) {
35        asm!("cli");
36        *dest = src;
37        asm!("sti", "nop");
38    }
39
40    #[no_mangle]
41    unsafe extern "C" fn __atomic_load_2(src: *const u16, _model: c_int) -> u16 {
42        asm!("cli");
43        let dest = *src;
44        asm!("sti", "nop");
45        dest
46    }
47
48    #[no_mangle]
49    unsafe extern "C" fn __atomic_store_2(dest: *mut u16, src: u16, _model: c_int) {
50        asm!("cli");
51        *dest = src;
52        asm!("sti", "nop");
53    }
54
55    #[no_mangle]
56    unsafe extern "C" fn __atomic_load_4(src: *const u32, _model: c_int) -> u32 {
57        asm!("cli");
58        let dest = *src;
59        asm!("sti", "nop");
60        dest
61    }
62
63    #[no_mangle]
64    unsafe extern "C" fn __atomic_store_4(dest: *mut u32, src: u32, _model: c_int) {
65        asm!("cli");
66        *dest = src;
67        asm!("sti", "nop");
68    }
69
70    #[no_mangle]
71    unsafe extern "C" fn __atomic_load_8(src: *const u64, _model: c_int) -> u64 {
72        asm!("cli");
73        let dest = *src;
74        asm!("sti", "nop");
75        dest
76    }
77
78    #[no_mangle]
79    unsafe extern "C" fn __atomic_store_8(dest: *mut u64, src: u64, _model: c_int) {
80        asm!("cli");
81        *dest = src;
82        asm!("sti", "nop");
83    }
84}