]> www.infradead.org Git - nvme.git/commitdiff
selftests/bpf: Tests with may_goto and jumps to the 1st insn
authorAlexei Starovoitov <ast@kernel.org>
Wed, 19 Jun 2024 01:18:59 +0000 (18:18 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 21 Jun 2024 18:18:49 +0000 (20:18 +0200)
Add few tests with may_goto and jumps to the 1st insn.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20240619011859.79334-2-alexei.starovoitov@gmail.com
tools/testing/selftests/bpf/progs/verifier_iterating_callbacks.c

index bd676d7e615fd538aadaf890b90ec902221e79bc..8885e5239d6b734729ea1adc2ebeb6dcdea8cae8 100644 (file)
@@ -307,6 +307,100 @@ int iter_limit_bug(struct __sk_buff *skb)
        return 0;
 }
 
+SEC("socket")
+__success __retval(0)
+__naked void ja_and_may_goto(void)
+{
+       asm volatile ("                 \
+l0_%=: .byte 0xe5; /* may_goto */      \
+       .byte 0; /* regs */             \
+       .short 1; /* off 1 */           \
+       .long 0; /* imm */              \
+       goto l0_%=;                     \
+       r0 = 0;                         \
+       exit;                           \
+"      ::: __clobber_common);
+}
+
+SEC("socket")
+__success __retval(0)
+__naked void ja_and_may_goto2(void)
+{
+       asm volatile ("                 \
+l0_%=: r0 = 0;                         \
+       .byte 0xe5; /* may_goto */      \
+       .byte 0; /* regs */             \
+       .short 1; /* off 1 */           \
+       .long 0; /* imm */              \
+       goto l0_%=;                     \
+       r0 = 0;                         \
+       exit;                           \
+"      ::: __clobber_common);
+}
+
+SEC("socket")
+__success __retval(0)
+__naked void jlt_and_may_goto(void)
+{
+       asm volatile ("                 \
+l0_%=: call %[bpf_jiffies64];          \
+       .byte 0xe5; /* may_goto */      \
+       .byte 0; /* regs */             \
+       .short 1; /* off 1 */           \
+       .long 0; /* imm */              \
+       if r0 < 10 goto l0_%=;          \
+       r0 = 0;                         \
+       exit;                           \
+"      :: __imm(bpf_jiffies64)
+       : __clobber_all);
+}
+
+#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \
+       (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || \
+       defined(__TARGET_ARCH_arm) || defined(__TARGET_ARCH_s390) || \
+       defined(__TARGET_ARCH_loongarch)) && \
+       __clang_major__ >= 18
+SEC("socket")
+__success __retval(0)
+__naked void gotol_and_may_goto(void)
+{
+       asm volatile ("                 \
+l0_%=: r0 = 0;                         \
+       .byte 0xe5; /* may_goto */      \
+       .byte 0; /* regs */             \
+       .short 1; /* off 1 */           \
+       .long 0; /* imm */              \
+       gotol l0_%=;                    \
+       r0 = 0;                         \
+       exit;                           \
+"      ::: __clobber_common);
+}
+#endif
+
+SEC("socket")
+__success __retval(0)
+__naked void ja_and_may_goto_subprog(void)
+{
+       asm volatile ("                 \
+       call subprog_with_may_goto;     \
+       exit;                           \
+"      ::: __clobber_all);
+}
+
+static __naked __noinline __used
+void subprog_with_may_goto(void)
+{
+       asm volatile ("                 \
+l0_%=: .byte 0xe5; /* may_goto */      \
+       .byte 0; /* regs */             \
+       .short 1; /* off 1 */           \
+       .long 0; /* imm */              \
+       goto l0_%=;                     \
+       r0 = 0;                         \
+       exit;                           \
+"      ::: __clobber_all);
+}
+
 #define ARR_SZ 1000000
 int zero;
 char arr[ARR_SZ];