1 // SPDX-License-Identifier: GPL-2.0
4 #include <bpf/bpf_helpers.h>
7 #if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \
8 (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64)) && __clang_major__ >= 18
11 __description("LDSX, S8")
12 __success __success_unpriv __retval(-2)
13 __naked void ldsx_s8(void)
17 *(u64 *)(r10 - 8) = r1; \
18 r0 = *(s8 *)(r10 - 8); \
24 __description("LDSX, S16")
25 __success __success_unpriv __retval(-2)
26 __naked void ldsx_s16(void)
30 *(u64 *)(r10 - 8) = r1; \
31 r0 = *(s16 *)(r10 - 8); \
37 __description("LDSX, S32")
38 __success __success_unpriv __retval(-1)
39 __naked void ldsx_s32(void)
43 *(u64 *)(r10 - 8) = r1; \
44 r0 = *(s32 *)(r10 - 8); \
51 __description("LDSX, S8 range checking, privileged")
52 __log_level(2) __success __retval(1)
53 __msg("R1_w=scalar(smin=-128,smax=127)")
54 __naked void ldsx_s8_range_priv(void)
57 call %[bpf_get_prandom_u32]; \
58 *(u64 *)(r10 - 8) = r0; \
59 r1 = *(s8 *)(r10 - 8); \
60 /* r1 with s8 range */ \
61 if r1 s> 0x7f goto l0_%=; \
62 if r1 s< -0x80 goto l0_%=; \
70 : __imm(bpf_get_prandom_u32)
75 __description("LDSX, S16 range checking")
76 __success __success_unpriv __retval(1)
77 __naked void ldsx_s16_range(void)
80 call %[bpf_get_prandom_u32]; \
81 *(u64 *)(r10 - 8) = r0; \
82 r1 = *(s16 *)(r10 - 8); \
83 /* r1 with s16 range */ \
84 if r1 s> 0x7fff goto l0_%=; \
85 if r1 s< -0x8000 goto l0_%=; \
93 : __imm(bpf_get_prandom_u32)
98 __description("LDSX, S32 range checking")
99 __success __success_unpriv __retval(1)
100 __naked void ldsx_s32_range(void)
103 call %[bpf_get_prandom_u32]; \
104 *(u64 *)(r10 - 8) = r0; \
105 r1 = *(s32 *)(r10 - 8); \
106 /* r1 with s16 range */ \
107 if r1 s> 0x7fffFFFF goto l0_%=; \
108 if r1 s< -0x80000000 goto l0_%=; \
116 : __imm(bpf_get_prandom_u32)
123 __description("cpuv4 is not supported by compiler or jit, use a dummy test")
132 char _license[] SEC("license") = "GPL";