xref: /linux/tools/testing/selftests/bpf/verifier/jmp32.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 {
2 	"jset32: BPF_K",
3 	.insns = {
4 	BPF_DIRECT_PKT_R2,
5 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
6 	/* reg, high bits shouldn't be tested */
7 	BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, -2, 1),
8 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9 	BPF_EXIT_INSN(),
10 
11 	BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 1, 1),
12 	BPF_EXIT_INSN(),
13 	BPF_MOV64_IMM(BPF_REG_0, 2),
14 	BPF_EXIT_INSN(),
15 	},
16 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
17 	.result = ACCEPT,
18 	.runs = 3,
19 	.retvals = {
20 		{ .retval = 0,
21 		  .data64 = { 1ULL << 63, }
22 		},
23 		{ .retval = 2,
24 		  .data64 = { 1, }
25 		},
26 		{ .retval = 2,
27 		  .data64 = { 1ULL << 63 | 1, }
28 		},
29 	},
30 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
31 },
32 {
33 	"jset32: BPF_X",
34 	.insns = {
35 	BPF_DIRECT_PKT_R2,
36 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
37 	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
38 	BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
39 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
40 	BPF_EXIT_INSN(),
41 
42 	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
43 	BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
44 	BPF_EXIT_INSN(),
45 	BPF_MOV64_IMM(BPF_REG_0, 2),
46 	BPF_EXIT_INSN(),
47 	},
48 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
49 	.result = ACCEPT,
50 	.runs = 3,
51 	.retvals = {
52 		{ .retval = 0,
53 		  .data64 = { 1ULL << 63, }
54 		},
55 		{ .retval = 2,
56 		  .data64 = { 1, }
57 		},
58 		{ .retval = 2,
59 		  .data64 = { 1ULL << 63 | 1, }
60 		},
61 	},
62 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
63 },
64 {
65 	"jset32: ignores upper bits",
66 	.insns = {
67 	BPF_MOV64_IMM(BPF_REG_0, 0),
68 	BPF_LD_IMM64(BPF_REG_7, 0x8000000000000000),
69 	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
70 	BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
71 	BPF_EXIT_INSN(),
72 	BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
73 	BPF_MOV64_IMM(BPF_REG_0, 2),
74 	BPF_EXIT_INSN(),
75 	},
76 	.result = ACCEPT,
77 	.retval = 2,
78 },
79 {
80 	"jset32: min/max deduction",
81 	.insns = {
82 	BPF_RAND_UEXT_R7,
83 	BPF_MOV64_IMM(BPF_REG_0, 0),
84 	BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 0x10, 1),
85 	BPF_EXIT_INSN(),
86 	BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x10, 1),
87 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
88 	BPF_EXIT_INSN(),
89 	},
90 	.errstr_unpriv = "R9 !read_ok",
91 	.result_unpriv = REJECT,
92 	.result = ACCEPT,
93 },
94 {
95 	"jeq32: BPF_K",
96 	.insns = {
97 	BPF_DIRECT_PKT_R2,
98 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
99 	BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, -1, 1),
100 	BPF_EXIT_INSN(),
101 	BPF_MOV64_IMM(BPF_REG_0, 2),
102 	BPF_EXIT_INSN(),
103 	},
104 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
105 	.result = ACCEPT,
106 	.runs = 2,
107 	.retvals = {
108 		{ .retval = 0,
109 		  .data64 = { -2, }
110 		},
111 		{ .retval = 2,
112 		  .data64 = { -1, }
113 		},
114 	},
115 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
116 },
117 {
118 	"jeq32: BPF_X",
119 	.insns = {
120 	BPF_DIRECT_PKT_R2,
121 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
122 	BPF_LD_IMM64(BPF_REG_8, 0x7000000000000001),
123 	BPF_JMP32_REG(BPF_JEQ, BPF_REG_7, BPF_REG_8, 1),
124 	BPF_EXIT_INSN(),
125 	BPF_MOV64_IMM(BPF_REG_0, 2),
126 	BPF_EXIT_INSN(),
127 	},
128 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
129 	.result = ACCEPT,
130 	.runs = 3,
131 	.retvals = {
132 		{ .retval = 0,
133 		  .data64 = { 2, }
134 		},
135 		{ .retval = 2,
136 		  .data64 = { 1, }
137 		},
138 		{ .retval = 2,
139 		  .data64 = { 1ULL << 63 | 1, }
140 		},
141 	},
142 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
143 },
144 {
145 	"jeq32: min/max deduction",
146 	.insns = {
147 	BPF_RAND_UEXT_R7,
148 	BPF_MOV64_IMM(BPF_REG_0, 0),
149 	BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, 0x10, 1),
150 	BPF_EXIT_INSN(),
151 	BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, 0xf, 1),
152 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
153 	BPF_EXIT_INSN(),
154 	},
155 	.errstr_unpriv = "R9 !read_ok",
156 	.result_unpriv = REJECT,
157 	.result = ACCEPT,
158 },
159 {
160 	"jne32: BPF_K",
161 	.insns = {
162 	BPF_DIRECT_PKT_R2,
163 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
164 	BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, -1, 1),
165 	BPF_EXIT_INSN(),
166 	BPF_MOV64_IMM(BPF_REG_0, 2),
167 	BPF_EXIT_INSN(),
168 	},
169 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
170 	.result = ACCEPT,
171 	.runs = 2,
172 	.retvals = {
173 		{ .retval = 2,
174 		  .data64 = { 1, }
175 		},
176 		{ .retval = 0,
177 		  .data64 = { -1, }
178 		},
179 	},
180 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
181 },
182 {
183 	"jne32: BPF_X",
184 	.insns = {
185 	BPF_DIRECT_PKT_R2,
186 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
187 	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
188 	BPF_JMP32_REG(BPF_JNE, BPF_REG_7, BPF_REG_8, 1),
189 	BPF_EXIT_INSN(),
190 	BPF_MOV64_IMM(BPF_REG_0, 2),
191 	BPF_EXIT_INSN(),
192 	},
193 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
194 	.result = ACCEPT,
195 	.runs = 3,
196 	.retvals = {
197 		{ .retval = 0,
198 		  .data64 = { 1, }
199 		},
200 		{ .retval = 2,
201 		  .data64 = { 2, }
202 		},
203 		{ .retval = 2,
204 		  .data64 = { 1ULL << 63 | 2, }
205 		},
206 	},
207 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
208 },
209 {
210 	"jne32: min/max deduction",
211 	.insns = {
212 	BPF_RAND_UEXT_R7,
213 	BPF_MOV64_IMM(BPF_REG_0, 0),
214 	BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
215 	BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
216 	BPF_EXIT_INSN(),
217 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
218 	BPF_EXIT_INSN(),
219 	},
220 	.errstr_unpriv = "R9 !read_ok",
221 	.result_unpriv = REJECT,
222 	.result = ACCEPT,
223 },
224 {
225 	"jge32: BPF_K",
226 	.insns = {
227 	BPF_DIRECT_PKT_R2,
228 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
229 	BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, UINT_MAX - 1, 1),
230 	BPF_EXIT_INSN(),
231 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
232 	BPF_EXIT_INSN(),
233 	},
234 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
235 	.result = ACCEPT,
236 	.runs = 3,
237 	.retvals = {
238 		{ .retval = 2,
239 		  .data64 = { UINT_MAX, }
240 		},
241 		{ .retval = 2,
242 		  .data64 = { UINT_MAX - 1, }
243 		},
244 		{ .retval = 0,
245 		  .data64 = { 0, }
246 		},
247 	},
248 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
249 },
250 {
251 	"jge32: BPF_X",
252 	.insns = {
253 	BPF_DIRECT_PKT_R2,
254 	BPF_LD_IMM64(BPF_REG_8, UINT_MAX | 1ULL << 32),
255 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
256 	BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
257 	BPF_EXIT_INSN(),
258 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
259 	BPF_EXIT_INSN(),
260 	},
261 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
262 	.result = ACCEPT,
263 	.runs = 3,
264 	.retvals = {
265 		{ .retval = 2,
266 		  .data64 = { UINT_MAX, }
267 		},
268 		{ .retval = 0,
269 		  .data64 = { INT_MAX, }
270 		},
271 		{ .retval = 0,
272 		  .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
273 		},
274 	},
275 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
276 },
277 {
278 	"jge32: min/max deduction",
279 	.insns = {
280 	BPF_RAND_UEXT_R7,
281 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
282 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
283 	BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
284 	BPF_EXIT_INSN(),
285 	BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x7ffffff0, 1),
286 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
287 	BPF_EXIT_INSN(),
288 	},
289 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
290 	.result_unpriv = REJECT,
291 	.result = ACCEPT,
292 	.retval = 2,
293 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
294 },
295 {
296 	"jgt32: BPF_K",
297 	.insns = {
298 	BPF_DIRECT_PKT_R2,
299 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
300 	BPF_JMP32_IMM(BPF_JGT, BPF_REG_7, UINT_MAX - 1, 1),
301 	BPF_EXIT_INSN(),
302 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
303 	BPF_EXIT_INSN(),
304 	},
305 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
306 	.result = ACCEPT,
307 	.runs = 3,
308 	.retvals = {
309 		{ .retval = 2,
310 		  .data64 = { UINT_MAX, }
311 		},
312 		{ .retval = 0,
313 		  .data64 = { UINT_MAX - 1, }
314 		},
315 		{ .retval = 0,
316 		  .data64 = { 0, }
317 		},
318 	},
319 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
320 },
321 {
322 	"jgt32: BPF_X",
323 	.insns = {
324 	BPF_DIRECT_PKT_R2,
325 	BPF_LD_IMM64(BPF_REG_8, (UINT_MAX - 1) | 1ULL << 32),
326 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
327 	BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
328 	BPF_EXIT_INSN(),
329 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
330 	BPF_EXIT_INSN(),
331 	},
332 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
333 	.result = ACCEPT,
334 	.runs = 3,
335 	.retvals = {
336 		{ .retval = 2,
337 		  .data64 = { UINT_MAX, }
338 		},
339 		{ .retval = 0,
340 		  .data64 = { UINT_MAX - 1, }
341 		},
342 		{ .retval = 0,
343 		  .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
344 		},
345 	},
346 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
347 },
348 {
349 	"jgt32: min/max deduction",
350 	.insns = {
351 	BPF_RAND_UEXT_R7,
352 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
353 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
354 	BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
355 	BPF_EXIT_INSN(),
356 	BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 0x7ffffff0, 1),
357 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
358 	BPF_EXIT_INSN(),
359 	},
360 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
361 	.result_unpriv = REJECT,
362 	.result = ACCEPT,
363 	.retval = 2,
364 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
365 },
366 {
367 	"jle32: BPF_K",
368 	.insns = {
369 	BPF_DIRECT_PKT_R2,
370 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
371 	BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, INT_MAX, 1),
372 	BPF_EXIT_INSN(),
373 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
374 	BPF_EXIT_INSN(),
375 	},
376 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
377 	.result = ACCEPT,
378 	.runs = 3,
379 	.retvals = {
380 		{ .retval = 2,
381 		  .data64 = { INT_MAX - 1, }
382 		},
383 		{ .retval = 0,
384 		  .data64 = { UINT_MAX, }
385 		},
386 		{ .retval = 2,
387 		  .data64 = { INT_MAX, }
388 		},
389 	},
390 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
391 },
392 {
393 	"jle32: BPF_X",
394 	.insns = {
395 	BPF_DIRECT_PKT_R2,
396 	BPF_LD_IMM64(BPF_REG_8, (INT_MAX - 1) | 2ULL << 32),
397 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
398 	BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
399 	BPF_EXIT_INSN(),
400 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
401 	BPF_EXIT_INSN(),
402 	},
403 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
404 	.result = ACCEPT,
405 	.runs = 3,
406 	.retvals = {
407 		{ .retval = 0,
408 		  .data64 = { INT_MAX | 1ULL << 32, }
409 		},
410 		{ .retval = 2,
411 		  .data64 = { INT_MAX - 2, }
412 		},
413 		{ .retval = 0,
414 		  .data64 = { UINT_MAX, }
415 		},
416 	},
417 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
418 },
419 {
420 	"jle32: min/max deduction",
421 	.insns = {
422 	BPF_RAND_UEXT_R7,
423 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
424 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
425 	BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
426 	BPF_EXIT_INSN(),
427 	BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, 0x7ffffff0, 1),
428 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
429 	BPF_EXIT_INSN(),
430 	},
431 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
432 	.result_unpriv = REJECT,
433 	.result = ACCEPT,
434 	.retval = 2,
435 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
436 },
437 {
438 	"jlt32: BPF_K",
439 	.insns = {
440 	BPF_DIRECT_PKT_R2,
441 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
442 	BPF_JMP32_IMM(BPF_JLT, BPF_REG_7, INT_MAX, 1),
443 	BPF_EXIT_INSN(),
444 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
445 	BPF_EXIT_INSN(),
446 	},
447 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
448 	.result = ACCEPT,
449 	.runs = 3,
450 	.retvals = {
451 		{ .retval = 0,
452 		  .data64 = { INT_MAX, }
453 		},
454 		{ .retval = 0,
455 		  .data64 = { UINT_MAX, }
456 		},
457 		{ .retval = 2,
458 		  .data64 = { INT_MAX - 1, }
459 		},
460 	},
461 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
462 },
463 {
464 	"jlt32: BPF_X",
465 	.insns = {
466 	BPF_DIRECT_PKT_R2,
467 	BPF_LD_IMM64(BPF_REG_8, INT_MAX | 2ULL << 32),
468 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
469 	BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
470 	BPF_EXIT_INSN(),
471 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
472 	BPF_EXIT_INSN(),
473 	},
474 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
475 	.result = ACCEPT,
476 	.runs = 3,
477 	.retvals = {
478 		{ .retval = 0,
479 		  .data64 = { INT_MAX | 1ULL << 32, }
480 		},
481 		{ .retval = 0,
482 		  .data64 = { UINT_MAX, }
483 		},
484 		{ .retval = 2,
485 		  .data64 = { (INT_MAX - 1) | 3ULL << 32, }
486 		},
487 	},
488 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
489 },
490 {
491 	"jlt32: min/max deduction",
492 	.insns = {
493 	BPF_RAND_UEXT_R7,
494 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
495 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
496 	BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
497 	BPF_EXIT_INSN(),
498 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_7, 0x7ffffff0, 1),
499 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
500 	BPF_EXIT_INSN(),
501 	},
502 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
503 	.result_unpriv = REJECT,
504 	.result = ACCEPT,
505 	.retval = 2,
506 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
507 },
508 {
509 	"jsge32: BPF_K",
510 	.insns = {
511 	BPF_DIRECT_PKT_R2,
512 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
513 	BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, -1, 1),
514 	BPF_EXIT_INSN(),
515 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
516 	BPF_EXIT_INSN(),
517 	},
518 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
519 	.result = ACCEPT,
520 	.runs = 3,
521 	.retvals = {
522 		{ .retval = 2,
523 		  .data64 = { 0, }
524 		},
525 		{ .retval = 2,
526 		  .data64 = { -1, }
527 		},
528 		{ .retval = 0,
529 		  .data64 = { -2, }
530 		},
531 	},
532 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
533 },
534 {
535 	"jsge32: BPF_X",
536 	.insns = {
537 	BPF_DIRECT_PKT_R2,
538 	BPF_LD_IMM64(BPF_REG_8, (__u32)-1 | 2ULL << 32),
539 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
540 	BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
541 	BPF_EXIT_INSN(),
542 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
543 	BPF_EXIT_INSN(),
544 	},
545 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
546 	.result = ACCEPT,
547 	.runs = 3,
548 	.retvals = {
549 		{ .retval = 2,
550 		  .data64 = { -1, }
551 		},
552 		{ .retval = 2,
553 		  .data64 = { 0x7fffffff | 1ULL << 32, }
554 		},
555 		{ .retval = 0,
556 		  .data64 = { -2, }
557 		},
558 	},
559 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
560 },
561 {
562 	"jsge32: min/max deduction",
563 	.insns = {
564 	BPF_RAND_UEXT_R7,
565 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
566 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
567 	BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
568 	BPF_EXIT_INSN(),
569 	BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0x7ffffff0, 1),
570 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
571 	BPF_EXIT_INSN(),
572 	},
573 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
574 	.result_unpriv = REJECT,
575 	.result = ACCEPT,
576 	.retval = 2,
577 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
578 },
579 {
580 	"jsgt32: BPF_K",
581 	.insns = {
582 	BPF_DIRECT_PKT_R2,
583 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
584 	BPF_JMP32_IMM(BPF_JSGT, BPF_REG_7, -1, 1),
585 	BPF_EXIT_INSN(),
586 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
587 	BPF_EXIT_INSN(),
588 	},
589 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
590 	.result = ACCEPT,
591 	.runs = 3,
592 	.retvals = {
593 		{ .retval = 0,
594 		  .data64 = { (__u32)-2, }
595 		},
596 		{ .retval = 0,
597 		  .data64 = { -1, }
598 		},
599 		{ .retval = 2,
600 		  .data64 = { 1, }
601 		},
602 	},
603 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
604 },
605 {
606 	"jsgt32: BPF_X",
607 	.insns = {
608 	BPF_DIRECT_PKT_R2,
609 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
610 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
611 	BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
612 	BPF_EXIT_INSN(),
613 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
614 	BPF_EXIT_INSN(),
615 	},
616 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
617 	.result = ACCEPT,
618 	.runs = 3,
619 	.retvals = {
620 		{ .retval = 0,
621 		  .data64 = { 0x7ffffffe, }
622 		},
623 		{ .retval = 0,
624 		  .data64 = { 0x1ffffffffULL, }
625 		},
626 		{ .retval = 2,
627 		  .data64 = { 0x7fffffff, }
628 		},
629 	},
630 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
631 },
632 {
633 	"jsgt32: min/max deduction",
634 	.insns = {
635 	BPF_RAND_SEXT_R7,
636 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
637 	BPF_LD_IMM64(BPF_REG_8, (__u32)(-2) | 1ULL << 32),
638 	BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
639 	BPF_EXIT_INSN(),
640 	BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, -2, 1),
641 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
642 	BPF_EXIT_INSN(),
643 	},
644 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
645 	.result_unpriv = REJECT,
646 	.result = ACCEPT,
647 	.retval = 2,
648 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
649 },
650 {
651 	"jsle32: BPF_K",
652 	.insns = {
653 	BPF_DIRECT_PKT_R2,
654 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
655 	BPF_JMP32_IMM(BPF_JSLE, BPF_REG_7, -1, 1),
656 	BPF_EXIT_INSN(),
657 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
658 	BPF_EXIT_INSN(),
659 	},
660 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
661 	.result = ACCEPT,
662 	.runs = 3,
663 	.retvals = {
664 		{ .retval = 2,
665 		  .data64 = { (__u32)-2, }
666 		},
667 		{ .retval = 2,
668 		  .data64 = { -1, }
669 		},
670 		{ .retval = 0,
671 		  .data64 = { 1, }
672 		},
673 	},
674 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
675 },
676 {
677 	"jsle32: BPF_X",
678 	.insns = {
679 	BPF_DIRECT_PKT_R2,
680 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
681 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
682 	BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
683 	BPF_EXIT_INSN(),
684 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
685 	BPF_EXIT_INSN(),
686 	},
687 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
688 	.result = ACCEPT,
689 	.runs = 3,
690 	.retvals = {
691 		{ .retval = 2,
692 		  .data64 = { 0x7ffffffe, }
693 		},
694 		{ .retval = 2,
695 		  .data64 = { (__u32)-1, }
696 		},
697 		{ .retval = 0,
698 		  .data64 = { 0x7fffffff | 2ULL << 32, }
699 		},
700 	},
701 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
702 },
703 {
704 	"jsle32: min/max deduction",
705 	.insns = {
706 	BPF_RAND_UEXT_R7,
707 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
708 	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
709 	BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
710 	BPF_EXIT_INSN(),
711 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_7, 0x7ffffff0, 1),
712 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
713 	BPF_EXIT_INSN(),
714 	},
715 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
716 	.result_unpriv = REJECT,
717 	.result = ACCEPT,
718 	.retval = 2,
719 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
720 },
721 {
722 	"jslt32: BPF_K",
723 	.insns = {
724 	BPF_DIRECT_PKT_R2,
725 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
726 	BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
727 	BPF_EXIT_INSN(),
728 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
729 	BPF_EXIT_INSN(),
730 	},
731 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
732 	.result = ACCEPT,
733 	.runs = 3,
734 	.retvals = {
735 		{ .retval = 2,
736 		  .data64 = { (__u32)-2, }
737 		},
738 		{ .retval = 0,
739 		  .data64 = { -1, }
740 		},
741 		{ .retval = 0,
742 		  .data64 = { 1, }
743 		},
744 	},
745 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
746 },
747 {
748 	"jslt32: BPF_X",
749 	.insns = {
750 	BPF_DIRECT_PKT_R2,
751 	BPF_LD_IMM64(BPF_REG_8, 0x7fffffff | 1ULL << 32),
752 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
753 	BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
754 	BPF_EXIT_INSN(),
755 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
756 	BPF_EXIT_INSN(),
757 	},
758 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
759 	.result = ACCEPT,
760 	.runs = 3,
761 	.retvals = {
762 		{ .retval = 2,
763 		  .data64 = { 0x7ffffffe, }
764 		},
765 		{ .retval = 2,
766 		  .data64 = { 0xffffffff, }
767 		},
768 		{ .retval = 0,
769 		  .data64 = { 0x7fffffff | 2ULL << 32, }
770 		},
771 	},
772 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
773 },
774 {
775 	"jslt32: min/max deduction",
776 	.insns = {
777 	BPF_RAND_SEXT_R7,
778 	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
779 	BPF_LD_IMM64(BPF_REG_8, (__u32)(-1) | 1ULL << 32),
780 	BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
781 	BPF_EXIT_INSN(),
782 	BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
783 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
784 	BPF_EXIT_INSN(),
785 	},
786 	.errstr_unpriv = "R0 invalid mem access 'scalar'",
787 	.result_unpriv = REJECT,
788 	.result = ACCEPT,
789 	.retval = 2,
790 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
791 },
792 {
793 	"jgt32: range bound deduction, reg op imm",
794 	.insns = {
795 	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
796 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
797 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
798 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
799 	BPF_LD_MAP_FD(BPF_REG_1, 0),
800 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
801 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
802 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
803 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
804 	BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
805 	BPF_JMP32_IMM(BPF_JGT, BPF_REG_0, 1, 5),
806 	BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
807 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
808 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
809 	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
810 	BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
811 	BPF_MOV32_IMM(BPF_REG_0, 0),
812 	BPF_EXIT_INSN(),
813 	},
814 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
815 	.fixup_map_hash_48b = { 4 },
816 	.result = ACCEPT,
817 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
818 },
819 {
820 	"jgt32: range bound deduction, reg1 op reg2, reg1 unknown",
821 	.insns = {
822 	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
823 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
824 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
825 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
826 	BPF_LD_MAP_FD(BPF_REG_1, 0),
827 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
828 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
829 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
830 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
831 	BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
832 	BPF_MOV32_IMM(BPF_REG_2, 1),
833 	BPF_JMP32_REG(BPF_JGT, BPF_REG_0, BPF_REG_2, 5),
834 	BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
835 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
836 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
837 	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
838 	BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
839 	BPF_MOV32_IMM(BPF_REG_0, 0),
840 	BPF_EXIT_INSN(),
841 	},
842 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
843 	.fixup_map_hash_48b = { 4 },
844 	.result = ACCEPT,
845 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
846 },
847 {
848 	"jle32: range bound deduction, reg1 op reg2, reg2 unknown",
849 	.insns = {
850 	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
851 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
852 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
853 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
854 	BPF_LD_MAP_FD(BPF_REG_1, 0),
855 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
856 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
857 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
858 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
859 	BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
860 	BPF_MOV32_IMM(BPF_REG_2, 1),
861 	BPF_JMP32_REG(BPF_JLE, BPF_REG_2, BPF_REG_0, 5),
862 	BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
863 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
864 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
865 	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
866 	BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
867 	BPF_MOV32_IMM(BPF_REG_0, 0),
868 	BPF_EXIT_INSN(),
869 	},
870 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
871 	.fixup_map_hash_48b = { 4 },
872 	.result = ACCEPT,
873 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
874 },
875 {
876 	"jeq32/jne32: bounds checking",
877 	.insns = {
878 	BPF_MOV64_IMM(BPF_REG_6, 563),
879 	BPF_MOV64_IMM(BPF_REG_2, 0),
880 	BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
881 	BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
882 	BPF_ALU32_REG(BPF_OR, BPF_REG_2, BPF_REG_6),
883 	BPF_JMP32_IMM(BPF_JNE, BPF_REG_2, 8, 5),
884 	BPF_JMP_IMM(BPF_JSGE, BPF_REG_2, 500, 2),
885 	BPF_MOV64_IMM(BPF_REG_0, 2),
886 	BPF_EXIT_INSN(),
887 	BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
888 	BPF_EXIT_INSN(),
889 	BPF_MOV64_IMM(BPF_REG_0, 1),
890 	BPF_EXIT_INSN(),
891 	},
892 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
893 	.result = ACCEPT,
894 	.retval = 1,
895 },
896