162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/bpf.h>
462306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
562306a36Sopenharmony_ci#include "bpf_misc.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \
862306a36Sopenharmony_ci     (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64)) && __clang_major__ >= 18
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciSEC("socket")
1162306a36Sopenharmony_ci__description("gotol, small_imm")
1262306a36Sopenharmony_ci__success __success_unpriv __retval(1)
1362306a36Sopenharmony_ci__naked void gotol_small_imm(void)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	asm volatile ("					\
1662306a36Sopenharmony_ci	call %[bpf_ktime_get_ns];			\
1762306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
1862306a36Sopenharmony_ci	gotol l1_%=;					\
1962306a36Sopenharmony_cil2_%=:							\
2062306a36Sopenharmony_ci	gotol l3_%=;					\
2162306a36Sopenharmony_cil1_%=:							\
2262306a36Sopenharmony_ci	r0 = 1;						\
2362306a36Sopenharmony_ci	gotol l2_%=;					\
2462306a36Sopenharmony_cil0_%=:							\
2562306a36Sopenharmony_ci	r0 = 2;						\
2662306a36Sopenharmony_cil3_%=:							\
2762306a36Sopenharmony_ci	exit;						\
2862306a36Sopenharmony_ci"	:
2962306a36Sopenharmony_ci	: __imm(bpf_ktime_get_ns)
3062306a36Sopenharmony_ci	: __clobber_all);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#else
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ciSEC("socket")
3662306a36Sopenharmony_ci__description("cpuv4 is not supported by compiler or jit, use a dummy test")
3762306a36Sopenharmony_ci__success
3862306a36Sopenharmony_ciint dummy_test(void)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	return 0;
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#endif
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
46