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("gotol, small_imm" ) |
15 | __success __success_unpriv __retval(1) |
16 | __naked void gotol_small_imm(void) |
17 | { |
18 | asm volatile (" \ |
19 | call %[bpf_ktime_get_ns]; \ |
20 | if r0 == 0 goto l0_%=; \ |
21 | gotol l1_%=; \ |
22 | l2_%=: \ |
23 | gotol l3_%=; \ |
24 | l1_%=: \ |
25 | r0 = 1; \ |
26 | gotol l2_%=; \ |
27 | l0_%=: \ |
28 | r0 = 2; \ |
29 | l3_%=: \ |
30 | exit; \ |
31 | " : |
32 | : __imm(bpf_ktime_get_ns) |
33 | : __clobber_all); |
34 | } |
35 | |
36 | SEC("socket" ) |
37 | __description("gotol, large_imm" ) |
38 | __success __failure_unpriv __retval(40000) |
39 | __naked void gotol_large_imm(void) |
40 | { |
41 | asm volatile (" \ |
42 | gotol 1f; \ |
43 | 0: \ |
44 | r0 = 0; \ |
45 | .rept 40000; \ |
46 | r0 += 1; \ |
47 | .endr; \ |
48 | exit; \ |
49 | 1: gotol 0b; \ |
50 | " : |
51 | : |
52 | : __clobber_all); |
53 | } |
54 | |
55 | #else |
56 | |
57 | SEC("socket" ) |
58 | __description("cpuv4 is not supported by compiler or jit, use a dummy test" ) |
59 | __success |
60 | int dummy_test(void) |
61 | { |
62 | return 0; |
63 | } |
64 | |
65 | #endif |
66 | |
67 | char _license[] SEC("license" ) = "GPL" ; |
68 | |