|
1 |
| -use core::intrinsics; |
2 |
| - |
3 |
| -macro_rules! defer { |
4 |
| - ($($symbol:ident),+ -> $routine:ident) => { |
5 |
| - $( |
6 |
| - #[naked] |
7 |
| - #[no_mangle] |
8 |
| - pub extern "C" fn $symbol() { |
9 |
| - unsafe { |
10 |
| - asm!(concat!("b ", stringify!($routine))); |
11 |
| - intrinsics::unreachable(); |
12 |
| - } |
13 |
| - } |
14 |
| - )+ |
15 |
| - } |
| 1 | +extern "C" { |
| 2 | + fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32; |
| 3 | + fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8; |
| 4 | + fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8; |
| 5 | + fn memset(dest: *mut u8, c: i32, n: usize) -> *mut u8; |
16 | 6 | }
|
17 | 7 |
|
18 |
| -// FIXME only `__aeabi_memcmp` should be defined like this. The `*4` and `*8` variants should be |
19 |
| -// defined as aliases of `__aeabi_memcmp` |
20 |
| -defer!(__aeabi_memcmp, __aeabi_memcmp4, __aeabi_memcmp8 -> memcmp); |
21 |
| - |
22 |
| -// FIXME same issue as `__aeabi_memcmp*` |
23 |
| -defer!(__aeabi_memcpy, __aeabi_memcpy4, __aeabi_memcpy8 -> memcpy); |
| 8 | +// FIXME: The `*4` and `*8` variants should be defined as aliases. |
24 | 9 |
|
25 |
| -// FIXME same issue as `__aeabi_memcmp*` |
26 |
| -defer!(__aeabi_memmove, __aeabi_memmove4, __aeabi_memmove8 -> memmove); |
| 10 | +#[no_mangle] |
| 11 | +pub unsafe extern "aapcs" fn __aeabi_memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { |
| 12 | + memcmp(s1, s2, n) |
| 13 | +} |
| 14 | +#[no_mangle] |
| 15 | +pub unsafe extern "aapcs" fn __aeabi_memcmp4(s1: *const u8, s2: *const u8, n: usize) -> i32 { |
| 16 | + memcmp(s1, s2, n) |
| 17 | +} |
| 18 | +#[no_mangle] |
| 19 | +pub unsafe extern "aapcs" fn __aeabi_memcmp8(s1: *const u8, s2: *const u8, n: usize) -> i32 { |
| 20 | + memcmp(s1, s2, n) |
| 21 | +} |
27 | 22 |
|
28 |
| -macro_rules! memset { |
29 |
| - ($($symbol:ident),+) => { |
30 |
| - $( |
31 |
| - #[naked] |
32 |
| - #[no_mangle] |
33 |
| - pub extern "C" fn $symbol() { |
34 |
| - unsafe { |
35 |
| - asm!("mov r3, r1 |
36 |
| - mov r1, r2 |
37 |
| - mov r2, r3 |
38 |
| - b memset"); |
39 |
| - intrinsics::unreachable(); |
40 |
| - } |
41 |
| - } |
42 |
| - )+ |
43 |
| - } |
| 23 | +#[no_mangle] |
| 24 | +pub unsafe extern "aapcs" fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize) { |
| 25 | + memcpy(dest, src, n); |
| 26 | +} |
| 27 | +#[no_mangle] |
| 28 | +pub unsafe extern "aapcs" fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, n: usize) { |
| 29 | + memcpy(dest, src, n); |
| 30 | +} |
| 31 | +#[no_mangle] |
| 32 | +pub unsafe extern "aapcs" fn __aeabi_memcpy8(dest: *mut u8, src: *const u8, n: usize) { |
| 33 | + memcpy(dest, src, n); |
44 | 34 | }
|
45 | 35 |
|
46 |
| -// FIXME same issue as `__aeabi_memcmp*` |
47 |
| -memset!(__aeabi_memset, __aeabi_memset4, __aeabi_memset8); |
| 36 | +#[no_mangle] |
| 37 | +pub unsafe extern "aapcs" fn __aeabi_memmove(dest: *mut u8, src: *const u8, n: usize) { |
| 38 | + memmove(dest, src, n); |
| 39 | +} |
| 40 | +#[no_mangle] |
| 41 | +pub unsafe extern "aapcs" fn __aeabi_memmove4(dest: *mut u8, src: *const u8, n: usize) { |
| 42 | + memmove(dest, src, n); |
| 43 | +} |
| 44 | +#[no_mangle] |
| 45 | +pub unsafe extern "aapcs" fn __aeabi_memmove8(dest: *mut u8, src: *const u8, n: usize) { |
| 46 | + memmove(dest, src, n); |
| 47 | +} |
48 | 48 |
|
49 |
| -macro_rules! memclr { |
50 |
| - ($($symbol:ident),+) => { |
51 |
| - $( |
52 |
| - #[naked] |
53 |
| - #[no_mangle] |
54 |
| - pub extern "C" fn $symbol() { |
55 |
| - unsafe { |
56 |
| - asm!("mov r2, r1 |
57 |
| - mov r1, #0 |
58 |
| - b memset"); |
59 |
| - intrinsics::unreachable(); |
60 |
| - } |
61 |
| - } |
62 |
| - )+ |
63 |
| - } |
| 49 | +// Note the different argument order |
| 50 | +#[no_mangle] |
| 51 | +pub unsafe extern "aapcs" fn __aeabi_memset(dest: *mut u8, n: usize, c: i32) { |
| 52 | + memset(dest, c, n); |
| 53 | +} |
| 54 | +#[no_mangle] |
| 55 | +pub unsafe extern "aapcs" fn __aeabi_memset4(dest: *mut u8, n: usize, c: i32) { |
| 56 | + memset(dest, c, n); |
| 57 | +} |
| 58 | +#[no_mangle] |
| 59 | +pub unsafe extern "aapcs" fn __aeabi_memset8(dest: *mut u8, n: usize, c: i32) { |
| 60 | + memset(dest, c, n); |
64 | 61 | }
|
65 | 62 |
|
66 |
| -// FIXME same issue as `__aeabi_memcmp*` |
67 |
| -memclr!(__aeabi_memclr, __aeabi_memclr4, __aeabi_memclr8); |
| 63 | +#[no_mangle] |
| 64 | +pub unsafe extern "aapcs" fn __aeabi_memclr(dest: *mut u8, n: usize) { |
| 65 | + memset(dest, 0, n); |
| 66 | +} |
| 67 | +#[no_mangle] |
| 68 | +pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) { |
| 69 | + memset(dest, 0, n); |
| 70 | +} |
| 71 | +#[no_mangle] |
| 72 | +pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) { |
| 73 | + memset(dest, 0, n); |
| 74 | +} |
0 commit comments