1 | // SPDX-License-Identifier: GPL-2.0 |
2 | |
3 | #include <linux/bpf.h> |
4 | #include <bpf/bpf_helpers.h> |
5 | #include "bpf_misc.h" |
6 | |
7 | #if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \ |
8 | (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || \ |
9 | defined(__TARGET_ARCH_arm) || defined(__TARGET_ARCH_s390) || \ |
10 | defined(__TARGET_ARCH_loongarch)) && \ |
11 | __clang_major__ >= 18 |
12 | |
13 | SEC("socket" ) |
14 | __description("BSWAP, 16" ) |
15 | __success __success_unpriv __retval(0x23ff) |
16 | __naked void bswap_16(void) |
17 | { |
18 | asm volatile (" \ |
19 | r0 = 0xff23; \ |
20 | r0 = bswap16 r0; \ |
21 | exit; \ |
22 | " ::: __clobber_all); |
23 | } |
24 | |
25 | SEC("socket" ) |
26 | __description("BSWAP, 32" ) |
27 | __success __success_unpriv __retval(0x23ff0000) |
28 | __naked void bswap_32(void) |
29 | { |
30 | asm volatile (" \ |
31 | r0 = 0xff23; \ |
32 | r0 = bswap32 r0; \ |
33 | exit; \ |
34 | " ::: __clobber_all); |
35 | } |
36 | |
37 | SEC("socket" ) |
38 | __description("BSWAP, 64" ) |
39 | __success __success_unpriv __retval(0x34ff12ff) |
40 | __naked void bswap_64(void) |
41 | { |
42 | asm volatile (" \ |
43 | r0 = %[u64_val] ll; \ |
44 | r0 = bswap64 r0; \ |
45 | exit; \ |
46 | " : |
47 | : [u64_val]"i" (0xff12ff34ff56ff78ull) |
48 | : __clobber_all); |
49 | } |
50 | |
51 | #else |
52 | |
53 | SEC("socket" ) |
54 | __description("cpuv4 is not supported by compiler or jit, use a dummy test" ) |
55 | __success |
56 | int dummy_test(void) |
57 | { |
58 | return 0; |
59 | } |
60 | |
61 | #endif |
62 | |
63 | char _license[] SEC("license" ) = "GPL" ; |
64 | |