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