xref: /linux/tools/testing/selftests/bpf/progs/verifier_may_goto_1.c (revision 07fdad3a93756b872da7b53647715c48d0f4a2d0)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
3 
4 #include <linux/bpf.h>
5 #include <bpf/bpf_helpers.h>
6 #include "../../../include/linux/filter.h"
7 #include "bpf_misc.h"
8 
9 SEC("raw_tp")
10 __description("may_goto 0")
11 __arch_x86_64
12 __arch_s390x
13 __arch_arm64
14 __xlated("0: r0 = 1")
15 __xlated("1: exit")
16 __success
17 __naked void may_goto_simple(void)
18 {
19 	asm volatile (
20 	".8byte %[may_goto];"
21 	"r0 = 1;"
22 	".8byte %[may_goto];"
23 	"exit;"
24 	:
25 	: __imm_insn(may_goto, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 0 /* offset */, 0))
26 	: __clobber_all);
27 }
28 
29 SEC("raw_tp")
30 __description("batch 2 of may_goto 0")
31 __arch_x86_64
32 __arch_s390x
33 __arch_arm64
34 __xlated("0: r0 = 1")
35 __xlated("1: exit")
36 __success
37 __naked void may_goto_batch_0(void)
38 {
39 	asm volatile (
40 	".8byte %[may_goto1];"
41 	".8byte %[may_goto1];"
42 	"r0 = 1;"
43 	".8byte %[may_goto1];"
44 	".8byte %[may_goto1];"
45 	"exit;"
46 	:
47 	: __imm_insn(may_goto1, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 0 /* offset */, 0))
48 	: __clobber_all);
49 }
50 
51 SEC("raw_tp")
52 __description("may_goto batch with offsets 2/1/0")
53 __arch_x86_64
54 __arch_s390x
55 __arch_arm64
56 __xlated("0: r0 = 1")
57 __xlated("1: exit")
58 __success
59 __naked void may_goto_batch_1(void)
60 {
61 	asm volatile (
62 	".8byte %[may_goto1];"
63 	".8byte %[may_goto2];"
64 	".8byte %[may_goto3];"
65 	"r0 = 1;"
66 	".8byte %[may_goto1];"
67 	".8byte %[may_goto2];"
68 	".8byte %[may_goto3];"
69 	"exit;"
70 	:
71 	: __imm_insn(may_goto1, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 2 /* offset */, 0)),
72 	  __imm_insn(may_goto2, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 1 /* offset */, 0)),
73 	  __imm_insn(may_goto3, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 0 /* offset */, 0))
74 	: __clobber_all);
75 }
76 
77 SEC("raw_tp")
78 __description("may_goto batch with offsets 2/0")
79 __arch_x86_64
80 __arch_s390x
81 __arch_arm64
82 __xlated("0: *(u64 *)(r10 -16) = 65535")
83 __xlated("1: *(u64 *)(r10 -8) = 0")
84 __xlated("2: r11 = *(u64 *)(r10 -16)")
85 __xlated("3: if r11 == 0x0 goto pc+6")
86 __xlated("4: r11 -= 1")
87 __xlated("5: if r11 != 0x0 goto pc+2")
88 __xlated("6: r11 = -16")
89 __xlated("7: call unknown")
90 __xlated("8: *(u64 *)(r10 -16) = r11")
91 __xlated("9: r0 = 1")
92 __xlated("10: r0 = 2")
93 __xlated("11: exit")
94 __success
95 __naked void may_goto_batch_2(void)
96 {
97 	asm volatile (
98 	".8byte %[may_goto1];"
99 	".8byte %[may_goto3];"
100 	"r0 = 1;"
101 	"r0 = 2;"
102 	"exit;"
103 	:
104 	: __imm_insn(may_goto1, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 2 /* offset */, 0)),
105 	  __imm_insn(may_goto3, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 0 /* offset */, 0))
106 	: __clobber_all);
107 }
108 
109 char _license[] SEC("license") = "GPL";
110