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