68 lines · c
1// SPDX-License-Identifier: GPL-2.02 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__ >= 1812 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#else56 57SEC("socket")58__description("cpuv4 is not supported by compiler or jit, use a dummy test")59__success60int dummy_test(void)61{62 return 0;63}64 65#endif66 67char _license[] SEC("license") = "GPL";68