xref: /linux/tools/testing/selftests/bpf/verifier/map_kptr.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* Common tests */
2 {
3 	"map_kptr: BPF_ST imm != 0",
4 	.insns = {
5 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6 	BPF_LD_MAP_FD(BPF_REG_6, 0),
7 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
8 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
9 	BPF_MOV64_IMM(BPF_REG_0, 0),
10 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
12 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
13 	BPF_EXIT_INSN(),
14 	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1),
15 	BPF_EXIT_INSN(),
16 	},
17 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
18 	.fixup_map_kptr = { 1 },
19 	.result = REJECT,
20 	.errstr = "BPF_ST imm must be 0 when storing to kptr at off=0",
21 },
22 {
23 	"map_kptr: size != bpf_size_to_bytes(BPF_DW)",
24 	.insns = {
25 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
26 	BPF_LD_MAP_FD(BPF_REG_6, 0),
27 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
28 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
29 	BPF_MOV64_IMM(BPF_REG_0, 0),
30 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
31 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
32 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
33 	BPF_EXIT_INSN(),
34 	BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0),
35 	BPF_EXIT_INSN(),
36 	},
37 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
38 	.fixup_map_kptr = { 1 },
39 	.result = REJECT,
40 	.errstr = "kptr access size must be BPF_DW",
41 },
42 {
43 	"map_kptr: map_value non-const var_off",
44 	.insns = {
45 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
46 	BPF_LD_MAP_FD(BPF_REG_6, 0),
47 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
48 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
49 	BPF_MOV64_IMM(BPF_REG_0, 0),
50 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
51 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
52 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
53 	BPF_EXIT_INSN(),
54 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
55 	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
56 	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
57 	BPF_EXIT_INSN(),
58 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 0),
59 	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
60 	BPF_EXIT_INSN(),
61 	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
62 	BPF_EXIT_INSN(),
63 	BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
64 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
65 	BPF_EXIT_INSN(),
66 	},
67 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
68 	.fixup_map_kptr = { 1 },
69 	.result = REJECT,
70 	.errstr = "kptr access cannot have variable offset",
71 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
72 },
73 {
74 	"map_kptr: bpf_kptr_xchg non-const var_off",
75 	.insns = {
76 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
77 	BPF_LD_MAP_FD(BPF_REG_6, 0),
78 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
79 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
80 	BPF_MOV64_IMM(BPF_REG_0, 0),
81 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
82 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
83 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
84 	BPF_EXIT_INSN(),
85 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
86 	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
87 	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
88 	BPF_EXIT_INSN(),
89 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 0),
90 	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
91 	BPF_EXIT_INSN(),
92 	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
93 	BPF_EXIT_INSN(),
94 	BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
95 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_3),
96 	BPF_MOV64_IMM(BPF_REG_2, 0),
97 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
98 	BPF_EXIT_INSN(),
99 	},
100 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
101 	.fixup_map_kptr = { 1 },
102 	.result = REJECT,
103 	.errstr = "R1 doesn't have constant offset. kptr has to be at the constant offset",
104 },
105 {
106 	"map_kptr: unaligned boundary load/store",
107 	.insns = {
108 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
109 	BPF_LD_MAP_FD(BPF_REG_6, 0),
110 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
111 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
112 	BPF_MOV64_IMM(BPF_REG_0, 0),
113 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
114 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
115 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
116 	BPF_EXIT_INSN(),
117 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 7),
118 	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
119 	BPF_EXIT_INSN(),
120 	},
121 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
122 	.fixup_map_kptr = { 1 },
123 	.result = REJECT,
124 	.errstr = "kptr access misaligned expected=0 off=7",
125 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
126 },
127 {
128 	"map_kptr: reject var_off != 0",
129 	.insns = {
130 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
131 	BPF_LD_MAP_FD(BPF_REG_6, 0),
132 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
133 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
134 	BPF_MOV64_IMM(BPF_REG_0, 0),
135 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
136 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
137 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
138 	BPF_EXIT_INSN(),
139 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
140 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
141 	BPF_EXIT_INSN(),
142 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
143 	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
144 	BPF_EXIT_INSN(),
145 	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
146 	BPF_EXIT_INSN(),
147 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
148 	BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
149 	BPF_EXIT_INSN(),
150 	},
151 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
152 	.fixup_map_kptr = { 1 },
153 	.result = REJECT,
154 	.errstr = "variable untrusted_ptr_ access var_off=(0x0; 0x7) disallowed",
155 },
156 /* Tests for unreferenced PTR_TO_BTF_ID */
157 {
158 	"map_kptr: unref: reject btf_struct_ids_match == false",
159 	.insns = {
160 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
161 	BPF_LD_MAP_FD(BPF_REG_6, 0),
162 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
163 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
164 	BPF_MOV64_IMM(BPF_REG_0, 0),
165 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
166 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
167 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
168 	BPF_EXIT_INSN(),
169 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
170 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
171 	BPF_EXIT_INSN(),
172 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
173 	BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
174 	BPF_EXIT_INSN(),
175 	},
176 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
177 	.fixup_map_kptr = { 1 },
178 	.result = REJECT,
179 	.errstr = "invalid kptr access, R1 type=untrusted_ptr_prog_test_ref_kfunc expected=ptr_prog_test",
180 },
181 {
182 	"map_kptr: unref: loaded pointer marked as untrusted",
183 	.insns = {
184 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
185 	BPF_LD_MAP_FD(BPF_REG_6, 0),
186 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
187 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
188 	BPF_MOV64_IMM(BPF_REG_0, 0),
189 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
190 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
191 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
192 	BPF_EXIT_INSN(),
193 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
194 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0),
195 	BPF_EXIT_INSN(),
196 	},
197 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
198 	.fixup_map_kptr = { 1 },
199 	.result = REJECT,
200 	.errstr = "R0 invalid mem access 'untrusted_ptr_or_null_'",
201 },
202 {
203 	"map_kptr: unref: correct in kernel type size",
204 	.insns = {
205 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
206 	BPF_LD_MAP_FD(BPF_REG_6, 0),
207 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
208 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
209 	BPF_MOV64_IMM(BPF_REG_0, 0),
210 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
211 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
212 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
213 	BPF_EXIT_INSN(),
214 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
215 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
216 	BPF_EXIT_INSN(),
217 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 32),
218 	BPF_EXIT_INSN(),
219 	},
220 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
221 	.fixup_map_kptr = { 1 },
222 	.result = REJECT,
223 	.errstr = "access beyond struct prog_test_ref_kfunc at off 32 size 8",
224 },
225 {
226 	"map_kptr: unref: inherit PTR_UNTRUSTED on struct walk",
227 	.insns = {
228 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
229 	BPF_LD_MAP_FD(BPF_REG_6, 0),
230 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
231 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
232 	BPF_MOV64_IMM(BPF_REG_0, 0),
233 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
234 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
235 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
236 	BPF_EXIT_INSN(),
237 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
238 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
239 	BPF_EXIT_INSN(),
240 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 16),
241 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_this_cpu_ptr),
242 	BPF_EXIT_INSN(),
243 	},
244 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
245 	.fixup_map_kptr = { 1 },
246 	.result = REJECT,
247 	.errstr = "R1 type=untrusted_ptr_ expected=percpu_ptr_",
248 },
249 {
250 	"map_kptr: unref: no reference state created",
251 	.insns = {
252 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
253 	BPF_LD_MAP_FD(BPF_REG_6, 0),
254 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
255 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
256 	BPF_MOV64_IMM(BPF_REG_0, 0),
257 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
258 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
259 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
260 	BPF_EXIT_INSN(),
261 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
262 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
263 	BPF_EXIT_INSN(),
264 	BPF_EXIT_INSN(),
265 	},
266 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
267 	.fixup_map_kptr = { 1 },
268 	.result = ACCEPT,
269 },
270 {
271 	"map_kptr: unref: bpf_kptr_xchg rejected",
272 	.insns = {
273 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
274 	BPF_LD_MAP_FD(BPF_REG_6, 0),
275 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
276 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
277 	BPF_MOV64_IMM(BPF_REG_0, 0),
278 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
279 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
280 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
281 	BPF_EXIT_INSN(),
282 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
283 	BPF_MOV64_IMM(BPF_REG_2, 0),
284 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
285 	BPF_MOV64_IMM(BPF_REG_0, 0),
286 	BPF_EXIT_INSN(),
287 	},
288 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
289 	.fixup_map_kptr = { 1 },
290 	.result = REJECT,
291 	.errstr = "off=0 kptr isn't referenced kptr",
292 },
293 /* Tests for referenced PTR_TO_BTF_ID */
294 {
295 	"map_kptr: ref: loaded pointer marked as untrusted",
296 	.insns = {
297 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
298 	BPF_LD_MAP_FD(BPF_REG_6, 0),
299 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
300 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
301 	BPF_MOV64_IMM(BPF_REG_0, 0),
302 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
303 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
304 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
305 	BPF_EXIT_INSN(),
306 	BPF_MOV64_IMM(BPF_REG_1, 0),
307 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 8),
308 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_this_cpu_ptr),
309 	BPF_EXIT_INSN(),
310 	},
311 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
312 	.fixup_map_kptr = { 1 },
313 	.result = REJECT,
314 	.errstr = "R1 type=rcu_ptr_or_null_ expected=percpu_ptr_",
315 },
316 {
317 	"map_kptr: ref: reject off != 0",
318 	.insns = {
319 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
320 	BPF_LD_MAP_FD(BPF_REG_6, 0),
321 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
322 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
323 	BPF_MOV64_IMM(BPF_REG_0, 0),
324 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
325 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
326 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
327 	BPF_EXIT_INSN(),
328 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
329 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
330 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
331 	BPF_MOV64_IMM(BPF_REG_2, 0),
332 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
333 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
334 	BPF_EXIT_INSN(),
335 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
336 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
337 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
338 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
339 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
340 	BPF_EXIT_INSN(),
341 	},
342 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
343 	.fixup_map_kptr = { 1 },
344 	.result = REJECT,
345 	.errstr = "invalid kptr access, R2 type=ptr_prog_test_ref_kfunc expected=ptr_prog_test_member",
346 },
347 {
348 	"map_kptr: ref: reference state created and released on xchg",
349 	.insns = {
350 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
351 	BPF_LD_MAP_FD(BPF_REG_6, 0),
352 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
353 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
354 	BPF_MOV64_IMM(BPF_REG_0, 0),
355 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
356 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
357 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
358 	BPF_EXIT_INSN(),
359 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
360 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
361 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
362 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
363 	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
364 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
365 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
366 	BPF_EXIT_INSN(),
367 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
368 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
369 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
370 	BPF_MOV64_IMM(BPF_REG_0, 0),
371 	BPF_EXIT_INSN(),
372 	},
373 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
374 	.fixup_map_kptr = { 1 },
375 	.result = REJECT,
376 	.errstr = "Unreleased reference id=5 alloc_insn=20",
377 	.fixup_kfunc_btf_id = {
378 		{ "bpf_kfunc_call_test_acquire", 15 },
379 	}
380 },
381 {
382 	"map_kptr: ref: reject STX",
383 	.insns = {
384 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
385 	BPF_LD_MAP_FD(BPF_REG_6, 0),
386 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
387 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
388 	BPF_MOV64_IMM(BPF_REG_0, 0),
389 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
390 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
391 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
392 	BPF_EXIT_INSN(),
393 	BPF_MOV64_REG(BPF_REG_1, 0),
394 	BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
395 	BPF_EXIT_INSN(),
396 	},
397 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
398 	.fixup_map_kptr = { 1 },
399 	.result = REJECT,
400 	.errstr = "store to referenced kptr disallowed",
401 },
402 {
403 	"map_kptr: ref: reject ST",
404 	.insns = {
405 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
406 	BPF_LD_MAP_FD(BPF_REG_6, 0),
407 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
408 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
409 	BPF_MOV64_IMM(BPF_REG_0, 0),
410 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
411 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
412 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
413 	BPF_EXIT_INSN(),
414 	BPF_ST_MEM(BPF_DW, BPF_REG_0, 8, 0),
415 	BPF_EXIT_INSN(),
416 	},
417 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
418 	.fixup_map_kptr = { 1 },
419 	.result = REJECT,
420 	.errstr = "store to referenced kptr disallowed",
421 },
422 {
423 	"map_kptr: reject helper access to kptr",
424 	.insns = {
425 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
426 	BPF_LD_MAP_FD(BPF_REG_6, 0),
427 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
428 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
429 	BPF_MOV64_IMM(BPF_REG_0, 0),
430 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
431 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
432 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
433 	BPF_EXIT_INSN(),
434 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
435 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
436 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
437 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_delete_elem),
438 	BPF_EXIT_INSN(),
439 	},
440 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
441 	.fixup_map_kptr = { 1 },
442 	.result = REJECT,
443 	.errstr = "kptr cannot be accessed indirectly by helper",
444 },
445