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
13SEC("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_%=; \
22l2_%=: \
23 gotol l3_%=; \
24l1_%=: \
25 r0 = 1; \
26 gotol l2_%=; \
27l0_%=: \
28 r0 = 2; \
29l3_%=: \
30 exit; \
31" :
32 : __imm(bpf_ktime_get_ns)
33 : __clobber_all);
34}
35
36SEC("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; \
430: \
44 r0 = 0; \
45 .rept 40000; \
46 r0 += 1; \
47 .endr; \
48 exit; \
491: gotol 0b; \
50" :
51 :
52 : __clobber_all);
53}
54
55#else
56
57SEC("socket")
58__description("cpuv4 is not supported by compiler or jit, use a dummy test")
59__success
60int dummy_test(void)
61{
62 return 0;
63}
64
65#endif
66
67char _license[] SEC("license") = "GPL";
68

source code of linux/tools/testing/selftests/bpf/progs/verifier_gotol.c