File Index
Files and directories
Sign in
FILE

jmp32.c

File preview with syntax highlighting.

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