xref: /openbmc/linux/lib/test_bpf.c (revision e0f3d4c2)
1 /*
2  * Testsuite for BPF interpreter and BPF JIT compiler
3  *
4  * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  */
15 
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/filter.h>
21 #include <linux/bpf.h>
22 #include <linux/skbuff.h>
23 #include <linux/netdevice.h>
24 #include <linux/if_vlan.h>
25 #include <linux/random.h>
26 #include <linux/highmem.h>
27 
28 /* General test specific settings */
29 #define MAX_SUBTESTS	3
30 #define MAX_TESTRUNS	10000
31 #define MAX_DATA	128
32 #define MAX_INSNS	512
33 #define MAX_K		0xffffFFFF
34 
35 /* Few constants used to init test 'skb' */
36 #define SKB_TYPE	3
37 #define SKB_MARK	0x1234aaaa
38 #define SKB_HASH	0x1234aaab
39 #define SKB_QUEUE_MAP	123
40 #define SKB_VLAN_TCI	0xffff
41 #define SKB_DEV_IFINDEX	577
42 #define SKB_DEV_TYPE	588
43 
44 /* Redefine REGs to make tests less verbose */
45 #define R0		BPF_REG_0
46 #define R1		BPF_REG_1
47 #define R2		BPF_REG_2
48 #define R3		BPF_REG_3
49 #define R4		BPF_REG_4
50 #define R5		BPF_REG_5
51 #define R6		BPF_REG_6
52 #define R7		BPF_REG_7
53 #define R8		BPF_REG_8
54 #define R9		BPF_REG_9
55 #define R10		BPF_REG_10
56 
57 /* Flags that can be passed to test cases */
58 #define FLAG_NO_DATA		BIT(0)
59 #define FLAG_EXPECTED_FAIL	BIT(1)
60 #define FLAG_SKB_FRAG		BIT(2)
61 
62 enum {
63 	CLASSIC  = BIT(6),	/* Old BPF instructions only. */
64 	INTERNAL = BIT(7),	/* Extended instruction set.  */
65 };
66 
67 #define TEST_TYPE_MASK		(CLASSIC | INTERNAL)
68 
69 struct bpf_test {
70 	const char *descr;
71 	union {
72 		struct sock_filter insns[MAX_INSNS];
73 		struct bpf_insn insns_int[MAX_INSNS];
74 		struct {
75 			void *insns;
76 			unsigned int len;
77 		} ptr;
78 	} u;
79 	__u8 aux;
80 	__u8 data[MAX_DATA];
81 	struct {
82 		int data_size;
83 		__u32 result;
84 	} test[MAX_SUBTESTS];
85 	int (*fill_helper)(struct bpf_test *self);
86 	__u8 frag_data[MAX_DATA];
87 	int stack_depth; /* for eBPF only, since tests don't call verifier */
88 };
89 
90 /* Large test cases need separate allocation and fill handler. */
91 
92 static int bpf_fill_maxinsns1(struct bpf_test *self)
93 {
94 	unsigned int len = BPF_MAXINSNS;
95 	struct sock_filter *insn;
96 	__u32 k = ~0;
97 	int i;
98 
99 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
100 	if (!insn)
101 		return -ENOMEM;
102 
103 	for (i = 0; i < len; i++, k--)
104 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
105 
106 	self->u.ptr.insns = insn;
107 	self->u.ptr.len = len;
108 
109 	return 0;
110 }
111 
112 static int bpf_fill_maxinsns2(struct bpf_test *self)
113 {
114 	unsigned int len = BPF_MAXINSNS;
115 	struct sock_filter *insn;
116 	int i;
117 
118 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
119 	if (!insn)
120 		return -ENOMEM;
121 
122 	for (i = 0; i < len; i++)
123 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
124 
125 	self->u.ptr.insns = insn;
126 	self->u.ptr.len = len;
127 
128 	return 0;
129 }
130 
131 static int bpf_fill_maxinsns3(struct bpf_test *self)
132 {
133 	unsigned int len = BPF_MAXINSNS;
134 	struct sock_filter *insn;
135 	struct rnd_state rnd;
136 	int i;
137 
138 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
139 	if (!insn)
140 		return -ENOMEM;
141 
142 	prandom_seed_state(&rnd, 3141592653589793238ULL);
143 
144 	for (i = 0; i < len - 1; i++) {
145 		__u32 k = prandom_u32_state(&rnd);
146 
147 		insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
148 	}
149 
150 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
151 
152 	self->u.ptr.insns = insn;
153 	self->u.ptr.len = len;
154 
155 	return 0;
156 }
157 
158 static int bpf_fill_maxinsns4(struct bpf_test *self)
159 {
160 	unsigned int len = BPF_MAXINSNS + 1;
161 	struct sock_filter *insn;
162 	int i;
163 
164 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
165 	if (!insn)
166 		return -ENOMEM;
167 
168 	for (i = 0; i < len; i++)
169 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
170 
171 	self->u.ptr.insns = insn;
172 	self->u.ptr.len = len;
173 
174 	return 0;
175 }
176 
177 static int bpf_fill_maxinsns5(struct bpf_test *self)
178 {
179 	unsigned int len = BPF_MAXINSNS;
180 	struct sock_filter *insn;
181 	int i;
182 
183 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
184 	if (!insn)
185 		return -ENOMEM;
186 
187 	insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
188 
189 	for (i = 1; i < len - 1; i++)
190 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
191 
192 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
193 
194 	self->u.ptr.insns = insn;
195 	self->u.ptr.len = len;
196 
197 	return 0;
198 }
199 
200 static int bpf_fill_maxinsns6(struct bpf_test *self)
201 {
202 	unsigned int len = BPF_MAXINSNS;
203 	struct sock_filter *insn;
204 	int i;
205 
206 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
207 	if (!insn)
208 		return -ENOMEM;
209 
210 	for (i = 0; i < len - 1; i++)
211 		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
212 				     SKF_AD_VLAN_TAG_PRESENT);
213 
214 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
215 
216 	self->u.ptr.insns = insn;
217 	self->u.ptr.len = len;
218 
219 	return 0;
220 }
221 
222 static int bpf_fill_maxinsns7(struct bpf_test *self)
223 {
224 	unsigned int len = BPF_MAXINSNS;
225 	struct sock_filter *insn;
226 	int i;
227 
228 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
229 	if (!insn)
230 		return -ENOMEM;
231 
232 	for (i = 0; i < len - 4; i++)
233 		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
234 				     SKF_AD_CPU);
235 
236 	insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
237 	insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
238 				   SKF_AD_CPU);
239 	insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
240 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
241 
242 	self->u.ptr.insns = insn;
243 	self->u.ptr.len = len;
244 
245 	return 0;
246 }
247 
248 static int bpf_fill_maxinsns8(struct bpf_test *self)
249 {
250 	unsigned int len = BPF_MAXINSNS;
251 	struct sock_filter *insn;
252 	int i, jmp_off = len - 3;
253 
254 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
255 	if (!insn)
256 		return -ENOMEM;
257 
258 	insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
259 
260 	for (i = 1; i < len - 1; i++)
261 		insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
262 
263 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
264 
265 	self->u.ptr.insns = insn;
266 	self->u.ptr.len = len;
267 
268 	return 0;
269 }
270 
271 static int bpf_fill_maxinsns9(struct bpf_test *self)
272 {
273 	unsigned int len = BPF_MAXINSNS;
274 	struct bpf_insn *insn;
275 	int i;
276 
277 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
278 	if (!insn)
279 		return -ENOMEM;
280 
281 	insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
282 	insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
283 	insn[2] = BPF_EXIT_INSN();
284 
285 	for (i = 3; i < len - 2; i++)
286 		insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
287 
288 	insn[len - 2] = BPF_EXIT_INSN();
289 	insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
290 
291 	self->u.ptr.insns = insn;
292 	self->u.ptr.len = len;
293 
294 	return 0;
295 }
296 
297 static int bpf_fill_maxinsns10(struct bpf_test *self)
298 {
299 	unsigned int len = BPF_MAXINSNS, hlen = len - 2;
300 	struct bpf_insn *insn;
301 	int i;
302 
303 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
304 	if (!insn)
305 		return -ENOMEM;
306 
307 	for (i = 0; i < hlen / 2; i++)
308 		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
309 	for (i = hlen - 1; i > hlen / 2; i--)
310 		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
311 
312 	insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
313 	insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
314 	insn[hlen + 1] = BPF_EXIT_INSN();
315 
316 	self->u.ptr.insns = insn;
317 	self->u.ptr.len = len;
318 
319 	return 0;
320 }
321 
322 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
323 			 unsigned int plen)
324 {
325 	struct sock_filter *insn;
326 	unsigned int rlen;
327 	int i, j;
328 
329 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
330 	if (!insn)
331 		return -ENOMEM;
332 
333 	rlen = (len % plen) - 1;
334 
335 	for (i = 0; i + plen < len; i += plen)
336 		for (j = 0; j < plen; j++)
337 			insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
338 						 plen - 1 - j, 0, 0);
339 	for (j = 0; j < rlen; j++)
340 		insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
341 					 0, 0);
342 
343 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
344 
345 	self->u.ptr.insns = insn;
346 	self->u.ptr.len = len;
347 
348 	return 0;
349 }
350 
351 static int bpf_fill_maxinsns11(struct bpf_test *self)
352 {
353 	/* Hits 70 passes on x86_64, so cannot get JITed there. */
354 	return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
355 }
356 
357 static int bpf_fill_ja(struct bpf_test *self)
358 {
359 	/* Hits exactly 11 passes on x86_64 JIT. */
360 	return __bpf_fill_ja(self, 12, 9);
361 }
362 
363 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
364 {
365 	unsigned int len = BPF_MAXINSNS;
366 	struct sock_filter *insn;
367 	int i;
368 
369 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
370 	if (!insn)
371 		return -ENOMEM;
372 
373 	for (i = 0; i < len - 1; i += 2) {
374 		insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
375 		insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
376 					 SKF_AD_OFF + SKF_AD_CPU);
377 	}
378 
379 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
380 
381 	self->u.ptr.insns = insn;
382 	self->u.ptr.len = len;
383 
384 	return 0;
385 }
386 
387 #define PUSH_CNT 68
388 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */
389 static int bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self)
390 {
391 	unsigned int len = BPF_MAXINSNS;
392 	struct bpf_insn *insn;
393 	int i = 0, j, k = 0;
394 
395 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
396 	if (!insn)
397 		return -ENOMEM;
398 
399 	insn[i++] = BPF_MOV64_REG(R6, R1);
400 loop:
401 	for (j = 0; j < PUSH_CNT; j++) {
402 		insn[i++] = BPF_LD_ABS(BPF_B, 0);
403 		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
404 		i++;
405 		insn[i++] = BPF_MOV64_REG(R1, R6);
406 		insn[i++] = BPF_MOV64_IMM(R2, 1);
407 		insn[i++] = BPF_MOV64_IMM(R3, 2);
408 		insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
409 					 bpf_skb_vlan_push_proto.func - __bpf_call_base);
410 		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
411 		i++;
412 	}
413 
414 	for (j = 0; j < PUSH_CNT; j++) {
415 		insn[i++] = BPF_LD_ABS(BPF_B, 0);
416 		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
417 		i++;
418 		insn[i++] = BPF_MOV64_REG(R1, R6);
419 		insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
420 					 bpf_skb_vlan_pop_proto.func - __bpf_call_base);
421 		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
422 		i++;
423 	}
424 	if (++k < 5)
425 		goto loop;
426 
427 	for (; i < len - 1; i++)
428 		insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xbef);
429 
430 	insn[len - 1] = BPF_EXIT_INSN();
431 
432 	self->u.ptr.insns = insn;
433 	self->u.ptr.len = len;
434 
435 	return 0;
436 }
437 
438 static int bpf_fill_ld_abs_vlan_push_pop2(struct bpf_test *self)
439 {
440 	struct bpf_insn *insn;
441 
442 	insn = kmalloc_array(16, sizeof(*insn), GFP_KERNEL);
443 	if (!insn)
444 		return -ENOMEM;
445 
446 	/* Due to func address being non-const, we need to
447 	 * assemble this here.
448 	 */
449 	insn[0] = BPF_MOV64_REG(R6, R1);
450 	insn[1] = BPF_LD_ABS(BPF_B, 0);
451 	insn[2] = BPF_LD_ABS(BPF_H, 0);
452 	insn[3] = BPF_LD_ABS(BPF_W, 0);
453 	insn[4] = BPF_MOV64_REG(R7, R6);
454 	insn[5] = BPF_MOV64_IMM(R6, 0);
455 	insn[6] = BPF_MOV64_REG(R1, R7);
456 	insn[7] = BPF_MOV64_IMM(R2, 1);
457 	insn[8] = BPF_MOV64_IMM(R3, 2);
458 	insn[9] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
459 			       bpf_skb_vlan_push_proto.func - __bpf_call_base);
460 	insn[10] = BPF_MOV64_REG(R6, R7);
461 	insn[11] = BPF_LD_ABS(BPF_B, 0);
462 	insn[12] = BPF_LD_ABS(BPF_H, 0);
463 	insn[13] = BPF_LD_ABS(BPF_W, 0);
464 	insn[14] = BPF_MOV64_IMM(R0, 42);
465 	insn[15] = BPF_EXIT_INSN();
466 
467 	self->u.ptr.insns = insn;
468 	self->u.ptr.len = 16;
469 
470 	return 0;
471 }
472 
473 static int bpf_fill_jump_around_ld_abs(struct bpf_test *self)
474 {
475 	unsigned int len = BPF_MAXINSNS;
476 	struct bpf_insn *insn;
477 	int i = 0;
478 
479 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
480 	if (!insn)
481 		return -ENOMEM;
482 
483 	insn[i++] = BPF_MOV64_REG(R6, R1);
484 	insn[i++] = BPF_LD_ABS(BPF_B, 0);
485 	insn[i] = BPF_JMP_IMM(BPF_JEQ, R0, 10, len - i - 2);
486 	i++;
487 	while (i < len - 1)
488 		insn[i++] = BPF_LD_ABS(BPF_B, 1);
489 	insn[i] = BPF_EXIT_INSN();
490 
491 	self->u.ptr.insns = insn;
492 	self->u.ptr.len = len;
493 
494 	return 0;
495 }
496 
497 static int __bpf_fill_stxdw(struct bpf_test *self, int size)
498 {
499 	unsigned int len = BPF_MAXINSNS;
500 	struct bpf_insn *insn;
501 	int i;
502 
503 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
504 	if (!insn)
505 		return -ENOMEM;
506 
507 	insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
508 	insn[1] = BPF_ST_MEM(size, R10, -40, 42);
509 
510 	for (i = 2; i < len - 2; i++)
511 		insn[i] = BPF_STX_XADD(size, R10, R0, -40);
512 
513 	insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
514 	insn[len - 1] = BPF_EXIT_INSN();
515 
516 	self->u.ptr.insns = insn;
517 	self->u.ptr.len = len;
518 	self->stack_depth = 40;
519 
520 	return 0;
521 }
522 
523 static int bpf_fill_stxw(struct bpf_test *self)
524 {
525 	return __bpf_fill_stxdw(self, BPF_W);
526 }
527 
528 static int bpf_fill_stxdw(struct bpf_test *self)
529 {
530 	return __bpf_fill_stxdw(self, BPF_DW);
531 }
532 
533 static struct bpf_test tests[] = {
534 	{
535 		"TAX",
536 		.u.insns = {
537 			BPF_STMT(BPF_LD | BPF_IMM, 1),
538 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
539 			BPF_STMT(BPF_LD | BPF_IMM, 2),
540 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
541 			BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
542 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
543 			BPF_STMT(BPF_LD | BPF_LEN, 0),
544 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
545 			BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
546 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
547 			BPF_STMT(BPF_RET | BPF_A, 0)
548 		},
549 		CLASSIC,
550 		{ 10, 20, 30, 40, 50 },
551 		{ { 2, 10 }, { 3, 20 }, { 4, 30 } },
552 	},
553 	{
554 		"TXA",
555 		.u.insns = {
556 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
557 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
558 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
559 			BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
560 		},
561 		CLASSIC,
562 		{ 10, 20, 30, 40, 50 },
563 		{ { 1, 2 }, { 3, 6 }, { 4, 8 } },
564 	},
565 	{
566 		"ADD_SUB_MUL_K",
567 		.u.insns = {
568 			BPF_STMT(BPF_LD | BPF_IMM, 1),
569 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
570 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
571 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
572 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
573 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
574 			BPF_STMT(BPF_RET | BPF_A, 0)
575 		},
576 		CLASSIC | FLAG_NO_DATA,
577 		{ },
578 		{ { 0, 0xfffffffd } }
579 	},
580 	{
581 		"DIV_MOD_KX",
582 		.u.insns = {
583 			BPF_STMT(BPF_LD | BPF_IMM, 8),
584 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
585 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
586 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
587 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
588 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
589 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
590 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
591 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
592 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
593 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
594 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
595 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
596 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
597 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
598 			BPF_STMT(BPF_RET | BPF_A, 0)
599 		},
600 		CLASSIC | FLAG_NO_DATA,
601 		{ },
602 		{ { 0, 0x20000000 } }
603 	},
604 	{
605 		"AND_OR_LSH_K",
606 		.u.insns = {
607 			BPF_STMT(BPF_LD | BPF_IMM, 0xff),
608 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
609 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
610 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
611 			BPF_STMT(BPF_LD | BPF_IMM, 0xf),
612 			BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
613 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
614 			BPF_STMT(BPF_RET | BPF_A, 0)
615 		},
616 		CLASSIC | FLAG_NO_DATA,
617 		{ },
618 		{ { 0, 0x800000ff }, { 1, 0x800000ff } },
619 	},
620 	{
621 		"LD_IMM_0",
622 		.u.insns = {
623 			BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
624 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
625 			BPF_STMT(BPF_RET | BPF_K, 0),
626 			BPF_STMT(BPF_RET | BPF_K, 1),
627 		},
628 		CLASSIC,
629 		{ },
630 		{ { 1, 1 } },
631 	},
632 	{
633 		"LD_IND",
634 		.u.insns = {
635 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
636 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
637 			BPF_STMT(BPF_RET | BPF_K, 1)
638 		},
639 		CLASSIC,
640 		{ },
641 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
642 	},
643 	{
644 		"LD_ABS",
645 		.u.insns = {
646 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
647 			BPF_STMT(BPF_RET | BPF_K, 1)
648 		},
649 		CLASSIC,
650 		{ },
651 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
652 	},
653 	{
654 		"LD_ABS_LL",
655 		.u.insns = {
656 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
657 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
658 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
659 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
660 			BPF_STMT(BPF_RET | BPF_A, 0)
661 		},
662 		CLASSIC,
663 		{ 1, 2, 3 },
664 		{ { 1, 0 }, { 2, 3 } },
665 	},
666 	{
667 		"LD_IND_LL",
668 		.u.insns = {
669 			BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
670 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
671 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
672 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
673 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
674 			BPF_STMT(BPF_RET | BPF_A, 0)
675 		},
676 		CLASSIC,
677 		{ 1, 2, 3, 0xff },
678 		{ { 1, 1 }, { 3, 3 }, { 4, 0xff } },
679 	},
680 	{
681 		"LD_ABS_NET",
682 		.u.insns = {
683 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
684 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
685 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
686 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
687 			BPF_STMT(BPF_RET | BPF_A, 0)
688 		},
689 		CLASSIC,
690 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
691 		{ { 15, 0 }, { 16, 3 } },
692 	},
693 	{
694 		"LD_IND_NET",
695 		.u.insns = {
696 			BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
697 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
698 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
699 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
700 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
701 			BPF_STMT(BPF_RET | BPF_A, 0)
702 		},
703 		CLASSIC,
704 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
705 		{ { 14, 0 }, { 15, 1 }, { 17, 3 } },
706 	},
707 	{
708 		"LD_PKTTYPE",
709 		.u.insns = {
710 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
711 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
712 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
713 			BPF_STMT(BPF_RET | BPF_K, 1),
714 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
715 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
716 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
717 			BPF_STMT(BPF_RET | BPF_K, 1),
718 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
719 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
720 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
721 			BPF_STMT(BPF_RET | BPF_K, 1),
722 			BPF_STMT(BPF_RET | BPF_A, 0)
723 		},
724 		CLASSIC,
725 		{ },
726 		{ { 1, 3 }, { 10, 3 } },
727 	},
728 	{
729 		"LD_MARK",
730 		.u.insns = {
731 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
732 				 SKF_AD_OFF + SKF_AD_MARK),
733 			BPF_STMT(BPF_RET | BPF_A, 0)
734 		},
735 		CLASSIC,
736 		{ },
737 		{ { 1, SKB_MARK}, { 10, SKB_MARK} },
738 	},
739 	{
740 		"LD_RXHASH",
741 		.u.insns = {
742 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
743 				 SKF_AD_OFF + SKF_AD_RXHASH),
744 			BPF_STMT(BPF_RET | BPF_A, 0)
745 		},
746 		CLASSIC,
747 		{ },
748 		{ { 1, SKB_HASH}, { 10, SKB_HASH} },
749 	},
750 	{
751 		"LD_QUEUE",
752 		.u.insns = {
753 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
754 				 SKF_AD_OFF + SKF_AD_QUEUE),
755 			BPF_STMT(BPF_RET | BPF_A, 0)
756 		},
757 		CLASSIC,
758 		{ },
759 		{ { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
760 	},
761 	{
762 		"LD_PROTOCOL",
763 		.u.insns = {
764 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
765 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
766 			BPF_STMT(BPF_RET | BPF_K, 0),
767 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
768 				 SKF_AD_OFF + SKF_AD_PROTOCOL),
769 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
770 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
771 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
772 			BPF_STMT(BPF_RET | BPF_K, 0),
773 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
774 			BPF_STMT(BPF_RET | BPF_A, 0)
775 		},
776 		CLASSIC,
777 		{ 10, 20, 30 },
778 		{ { 10, ETH_P_IP }, { 100, ETH_P_IP } },
779 	},
780 	{
781 		"LD_VLAN_TAG",
782 		.u.insns = {
783 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
784 				 SKF_AD_OFF + SKF_AD_VLAN_TAG),
785 			BPF_STMT(BPF_RET | BPF_A, 0)
786 		},
787 		CLASSIC,
788 		{ },
789 		{
790 			{ 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
791 			{ 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
792 		},
793 	},
794 	{
795 		"LD_VLAN_TAG_PRESENT",
796 		.u.insns = {
797 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
798 				 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
799 			BPF_STMT(BPF_RET | BPF_A, 0)
800 		},
801 		CLASSIC,
802 		{ },
803 		{
804 			{ 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
805 			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
806 		},
807 	},
808 	{
809 		"LD_IFINDEX",
810 		.u.insns = {
811 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
812 				 SKF_AD_OFF + SKF_AD_IFINDEX),
813 			BPF_STMT(BPF_RET | BPF_A, 0)
814 		},
815 		CLASSIC,
816 		{ },
817 		{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
818 	},
819 	{
820 		"LD_HATYPE",
821 		.u.insns = {
822 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
823 				 SKF_AD_OFF + SKF_AD_HATYPE),
824 			BPF_STMT(BPF_RET | BPF_A, 0)
825 		},
826 		CLASSIC,
827 		{ },
828 		{ { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
829 	},
830 	{
831 		"LD_CPU",
832 		.u.insns = {
833 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
834 				 SKF_AD_OFF + SKF_AD_CPU),
835 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
836 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
837 				 SKF_AD_OFF + SKF_AD_CPU),
838 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
839 			BPF_STMT(BPF_RET | BPF_A, 0)
840 		},
841 		CLASSIC,
842 		{ },
843 		{ { 1, 0 }, { 10, 0 } },
844 	},
845 	{
846 		"LD_NLATTR",
847 		.u.insns = {
848 			BPF_STMT(BPF_LDX | BPF_IMM, 2),
849 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
850 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
851 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
852 				 SKF_AD_OFF + SKF_AD_NLATTR),
853 			BPF_STMT(BPF_RET | BPF_A, 0)
854 		},
855 		CLASSIC,
856 #ifdef __BIG_ENDIAN
857 		{ 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
858 #else
859 		{ 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
860 #endif
861 		{ { 4, 0 }, { 20, 6 } },
862 	},
863 	{
864 		"LD_NLATTR_NEST",
865 		.u.insns = {
866 			BPF_STMT(BPF_LD | BPF_IMM, 2),
867 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
868 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
869 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
870 			BPF_STMT(BPF_LD | BPF_IMM, 2),
871 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
872 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
873 			BPF_STMT(BPF_LD | BPF_IMM, 2),
874 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
875 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
876 			BPF_STMT(BPF_LD | BPF_IMM, 2),
877 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
878 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
879 			BPF_STMT(BPF_LD | BPF_IMM, 2),
880 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
881 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
882 			BPF_STMT(BPF_LD | BPF_IMM, 2),
883 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
884 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
885 			BPF_STMT(BPF_LD | BPF_IMM, 2),
886 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
887 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
888 			BPF_STMT(BPF_LD | BPF_IMM, 2),
889 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
890 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
891 			BPF_STMT(BPF_RET | BPF_A, 0)
892 		},
893 		CLASSIC,
894 #ifdef __BIG_ENDIAN
895 		{ 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
896 #else
897 		{ 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
898 #endif
899 		{ { 4, 0 }, { 20, 10 } },
900 	},
901 	{
902 		"LD_PAYLOAD_OFF",
903 		.u.insns = {
904 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
905 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
906 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
907 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
908 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
909 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
910 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
911 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
912 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
913 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
914 			BPF_STMT(BPF_RET | BPF_A, 0)
915 		},
916 		CLASSIC,
917 		/* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
918 		 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
919 		 * id 9737, seq 1, length 64
920 		 */
921 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
922 		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
923 		  0x08, 0x00,
924 		  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
925 		  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
926 		{ { 30, 0 }, { 100, 42 } },
927 	},
928 	{
929 		"LD_ANC_XOR",
930 		.u.insns = {
931 			BPF_STMT(BPF_LD | BPF_IMM, 10),
932 			BPF_STMT(BPF_LDX | BPF_IMM, 300),
933 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
934 				 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
935 			BPF_STMT(BPF_RET | BPF_A, 0)
936 		},
937 		CLASSIC,
938 		{ },
939 		{ { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
940 	},
941 	{
942 		"SPILL_FILL",
943 		.u.insns = {
944 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
945 			BPF_STMT(BPF_LD | BPF_IMM, 2),
946 			BPF_STMT(BPF_ALU | BPF_RSH, 1),
947 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
948 			BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
949 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
950 			BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
951 			BPF_STMT(BPF_STX, 15), /* M3 = len */
952 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
953 			BPF_STMT(BPF_LD | BPF_MEM, 2),
954 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
955 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
956 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
957 			BPF_STMT(BPF_RET | BPF_A, 0)
958 		},
959 		CLASSIC,
960 		{ },
961 		{ { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
962 	},
963 	{
964 		"JEQ",
965 		.u.insns = {
966 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
967 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
968 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
969 			BPF_STMT(BPF_RET | BPF_K, 1),
970 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
971 		},
972 		CLASSIC,
973 		{ 3, 3, 3, 3, 3 },
974 		{ { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
975 	},
976 	{
977 		"JGT",
978 		.u.insns = {
979 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
980 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
981 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
982 			BPF_STMT(BPF_RET | BPF_K, 1),
983 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
984 		},
985 		CLASSIC,
986 		{ 4, 4, 4, 3, 3 },
987 		{ { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
988 	},
989 	{
990 		"JGE (jt 0), test 1",
991 		.u.insns = {
992 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
993 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
994 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
995 			BPF_STMT(BPF_RET | BPF_K, 1),
996 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
997 		},
998 		CLASSIC,
999 		{ 4, 4, 4, 3, 3 },
1000 		{ { 2, 0 }, { 3, 1 }, { 4, 1 } },
1001 	},
1002 	{
1003 		"JGE (jt 0), test 2",
1004 		.u.insns = {
1005 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
1006 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
1007 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
1008 			BPF_STMT(BPF_RET | BPF_K, 1),
1009 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
1010 		},
1011 		CLASSIC,
1012 		{ 4, 4, 5, 3, 3 },
1013 		{ { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
1014 	},
1015 	{
1016 		"JGE",
1017 		.u.insns = {
1018 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
1019 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
1020 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
1021 			BPF_STMT(BPF_RET | BPF_K, 10),
1022 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
1023 			BPF_STMT(BPF_RET | BPF_K, 20),
1024 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
1025 			BPF_STMT(BPF_RET | BPF_K, 30),
1026 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
1027 			BPF_STMT(BPF_RET | BPF_K, 40),
1028 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
1029 		},
1030 		CLASSIC,
1031 		{ 1, 2, 3, 4, 5 },
1032 		{ { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
1033 	},
1034 	{
1035 		"JSET",
1036 		.u.insns = {
1037 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1038 			BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
1039 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1040 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1041 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
1042 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1043 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
1044 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1045 			BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
1046 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
1047 			BPF_STMT(BPF_RET | BPF_K, 10),
1048 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
1049 			BPF_STMT(BPF_RET | BPF_K, 20),
1050 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1051 			BPF_STMT(BPF_RET | BPF_K, 30),
1052 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1053 			BPF_STMT(BPF_RET | BPF_K, 30),
1054 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1055 			BPF_STMT(BPF_RET | BPF_K, 30),
1056 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1057 			BPF_STMT(BPF_RET | BPF_K, 30),
1058 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1059 			BPF_STMT(BPF_RET | BPF_K, 30),
1060 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
1061 		},
1062 		CLASSIC,
1063 		{ 0, 0xAA, 0x55, 1 },
1064 		{ { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
1065 	},
1066 	{
1067 		"tcpdump port 22",
1068 		.u.insns = {
1069 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1070 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
1071 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
1072 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1073 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1074 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
1075 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
1076 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
1077 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
1078 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
1079 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
1080 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1081 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1082 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1083 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
1084 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1085 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
1086 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1087 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1088 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1089 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1090 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
1091 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
1092 			BPF_STMT(BPF_RET | BPF_K, 0),
1093 		},
1094 		CLASSIC,
1095 		/* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
1096 		 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
1097 		 * seq 1305692979:1305693027, ack 3650467037, win 65535,
1098 		 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
1099 		 */
1100 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1101 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1102 		  0x08, 0x00,
1103 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1104 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1105 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
1106 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1107 		  0xc2, 0x24,
1108 		  0x00, 0x16 /* dst port */ },
1109 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1110 	},
1111 	{
1112 		"tcpdump complex",
1113 		.u.insns = {
1114 			/* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
1115 			 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
1116 			 * (len > 115 or len < 30000000000)' -d
1117 			 */
1118 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1119 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
1120 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
1121 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1122 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
1123 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1124 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
1125 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1126 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1127 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1128 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1129 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
1130 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
1131 			BPF_STMT(BPF_ST, 1),
1132 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
1133 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
1134 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
1135 			BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
1136 			BPF_STMT(BPF_LD | BPF_MEM, 1),
1137 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
1138 			BPF_STMT(BPF_ST, 5),
1139 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1140 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
1141 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
1142 			BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
1143 			BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
1144 			BPF_STMT(BPF_LD | BPF_MEM, 5),
1145 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
1146 			BPF_STMT(BPF_LD | BPF_LEN, 0),
1147 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
1148 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
1149 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
1150 			BPF_STMT(BPF_RET | BPF_K, 0),
1151 		},
1152 		CLASSIC,
1153 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1154 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1155 		  0x08, 0x00,
1156 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1157 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1158 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
1159 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1160 		  0xc2, 0x24,
1161 		  0x00, 0x16 /* dst port */ },
1162 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1163 	},
1164 	{
1165 		"RET_A",
1166 		.u.insns = {
1167 			/* check that unitialized X and A contain zeros */
1168 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1169 			BPF_STMT(BPF_RET | BPF_A, 0)
1170 		},
1171 		CLASSIC,
1172 		{ },
1173 		{ {1, 0}, {2, 0} },
1174 	},
1175 	{
1176 		"INT: ADD trivial",
1177 		.u.insns_int = {
1178 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1179 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
1180 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
1181 			BPF_ALU64_REG(BPF_SUB, R1, R2),
1182 			BPF_ALU64_IMM(BPF_ADD, R1, -1),
1183 			BPF_ALU64_IMM(BPF_MUL, R1, 3),
1184 			BPF_ALU64_REG(BPF_MOV, R0, R1),
1185 			BPF_EXIT_INSN(),
1186 		},
1187 		INTERNAL,
1188 		{ },
1189 		{ { 0, 0xfffffffd } }
1190 	},
1191 	{
1192 		"INT: MUL_X",
1193 		.u.insns_int = {
1194 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1195 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1196 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
1197 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1198 			BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
1199 			BPF_EXIT_INSN(),
1200 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1201 			BPF_EXIT_INSN(),
1202 		},
1203 		INTERNAL,
1204 		{ },
1205 		{ { 0, 1 } }
1206 	},
1207 	{
1208 		"INT: MUL_X2",
1209 		.u.insns_int = {
1210 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
1211 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
1212 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
1213 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1214 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
1215 			BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
1216 			BPF_EXIT_INSN(),
1217 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
1218 			BPF_EXIT_INSN(),
1219 		},
1220 		INTERNAL,
1221 		{ },
1222 		{ { 0, 1 } }
1223 	},
1224 	{
1225 		"INT: MUL32_X",
1226 		.u.insns_int = {
1227 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
1228 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1229 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
1230 			BPF_ALU32_REG(BPF_MUL, R1, R2),
1231 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
1232 			BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
1233 			BPF_EXIT_INSN(),
1234 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
1235 			BPF_EXIT_INSN(),
1236 		},
1237 		INTERNAL,
1238 		{ },
1239 		{ { 0, 1 } }
1240 	},
1241 	{
1242 		/* Have to test all register combinations, since
1243 		 * JITing of different registers will produce
1244 		 * different asm code.
1245 		 */
1246 		"INT: ADD 64-bit",
1247 		.u.insns_int = {
1248 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1249 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1250 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1251 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1252 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1253 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1254 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1255 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1256 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1257 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1258 			BPF_ALU64_IMM(BPF_ADD, R0, 20),
1259 			BPF_ALU64_IMM(BPF_ADD, R1, 20),
1260 			BPF_ALU64_IMM(BPF_ADD, R2, 20),
1261 			BPF_ALU64_IMM(BPF_ADD, R3, 20),
1262 			BPF_ALU64_IMM(BPF_ADD, R4, 20),
1263 			BPF_ALU64_IMM(BPF_ADD, R5, 20),
1264 			BPF_ALU64_IMM(BPF_ADD, R6, 20),
1265 			BPF_ALU64_IMM(BPF_ADD, R7, 20),
1266 			BPF_ALU64_IMM(BPF_ADD, R8, 20),
1267 			BPF_ALU64_IMM(BPF_ADD, R9, 20),
1268 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1269 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1270 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1271 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1272 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1273 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1274 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1275 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1276 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1277 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1278 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1279 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1280 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1281 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1282 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1283 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1284 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1285 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1286 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1287 			BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1288 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1289 			BPF_EXIT_INSN(),
1290 			BPF_ALU64_REG(BPF_ADD, R1, R0),
1291 			BPF_ALU64_REG(BPF_ADD, R1, R1),
1292 			BPF_ALU64_REG(BPF_ADD, R1, R2),
1293 			BPF_ALU64_REG(BPF_ADD, R1, R3),
1294 			BPF_ALU64_REG(BPF_ADD, R1, R4),
1295 			BPF_ALU64_REG(BPF_ADD, R1, R5),
1296 			BPF_ALU64_REG(BPF_ADD, R1, R6),
1297 			BPF_ALU64_REG(BPF_ADD, R1, R7),
1298 			BPF_ALU64_REG(BPF_ADD, R1, R8),
1299 			BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1300 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1301 			BPF_EXIT_INSN(),
1302 			BPF_ALU64_REG(BPF_ADD, R2, R0),
1303 			BPF_ALU64_REG(BPF_ADD, R2, R1),
1304 			BPF_ALU64_REG(BPF_ADD, R2, R2),
1305 			BPF_ALU64_REG(BPF_ADD, R2, R3),
1306 			BPF_ALU64_REG(BPF_ADD, R2, R4),
1307 			BPF_ALU64_REG(BPF_ADD, R2, R5),
1308 			BPF_ALU64_REG(BPF_ADD, R2, R6),
1309 			BPF_ALU64_REG(BPF_ADD, R2, R7),
1310 			BPF_ALU64_REG(BPF_ADD, R2, R8),
1311 			BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1312 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1313 			BPF_EXIT_INSN(),
1314 			BPF_ALU64_REG(BPF_ADD, R3, R0),
1315 			BPF_ALU64_REG(BPF_ADD, R3, R1),
1316 			BPF_ALU64_REG(BPF_ADD, R3, R2),
1317 			BPF_ALU64_REG(BPF_ADD, R3, R3),
1318 			BPF_ALU64_REG(BPF_ADD, R3, R4),
1319 			BPF_ALU64_REG(BPF_ADD, R3, R5),
1320 			BPF_ALU64_REG(BPF_ADD, R3, R6),
1321 			BPF_ALU64_REG(BPF_ADD, R3, R7),
1322 			BPF_ALU64_REG(BPF_ADD, R3, R8),
1323 			BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1324 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1325 			BPF_EXIT_INSN(),
1326 			BPF_ALU64_REG(BPF_ADD, R4, R0),
1327 			BPF_ALU64_REG(BPF_ADD, R4, R1),
1328 			BPF_ALU64_REG(BPF_ADD, R4, R2),
1329 			BPF_ALU64_REG(BPF_ADD, R4, R3),
1330 			BPF_ALU64_REG(BPF_ADD, R4, R4),
1331 			BPF_ALU64_REG(BPF_ADD, R4, R5),
1332 			BPF_ALU64_REG(BPF_ADD, R4, R6),
1333 			BPF_ALU64_REG(BPF_ADD, R4, R7),
1334 			BPF_ALU64_REG(BPF_ADD, R4, R8),
1335 			BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1336 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1337 			BPF_EXIT_INSN(),
1338 			BPF_ALU64_REG(BPF_ADD, R5, R0),
1339 			BPF_ALU64_REG(BPF_ADD, R5, R1),
1340 			BPF_ALU64_REG(BPF_ADD, R5, R2),
1341 			BPF_ALU64_REG(BPF_ADD, R5, R3),
1342 			BPF_ALU64_REG(BPF_ADD, R5, R4),
1343 			BPF_ALU64_REG(BPF_ADD, R5, R5),
1344 			BPF_ALU64_REG(BPF_ADD, R5, R6),
1345 			BPF_ALU64_REG(BPF_ADD, R5, R7),
1346 			BPF_ALU64_REG(BPF_ADD, R5, R8),
1347 			BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1348 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1349 			BPF_EXIT_INSN(),
1350 			BPF_ALU64_REG(BPF_ADD, R6, R0),
1351 			BPF_ALU64_REG(BPF_ADD, R6, R1),
1352 			BPF_ALU64_REG(BPF_ADD, R6, R2),
1353 			BPF_ALU64_REG(BPF_ADD, R6, R3),
1354 			BPF_ALU64_REG(BPF_ADD, R6, R4),
1355 			BPF_ALU64_REG(BPF_ADD, R6, R5),
1356 			BPF_ALU64_REG(BPF_ADD, R6, R6),
1357 			BPF_ALU64_REG(BPF_ADD, R6, R7),
1358 			BPF_ALU64_REG(BPF_ADD, R6, R8),
1359 			BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1360 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1361 			BPF_EXIT_INSN(),
1362 			BPF_ALU64_REG(BPF_ADD, R7, R0),
1363 			BPF_ALU64_REG(BPF_ADD, R7, R1),
1364 			BPF_ALU64_REG(BPF_ADD, R7, R2),
1365 			BPF_ALU64_REG(BPF_ADD, R7, R3),
1366 			BPF_ALU64_REG(BPF_ADD, R7, R4),
1367 			BPF_ALU64_REG(BPF_ADD, R7, R5),
1368 			BPF_ALU64_REG(BPF_ADD, R7, R6),
1369 			BPF_ALU64_REG(BPF_ADD, R7, R7),
1370 			BPF_ALU64_REG(BPF_ADD, R7, R8),
1371 			BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1372 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1373 			BPF_EXIT_INSN(),
1374 			BPF_ALU64_REG(BPF_ADD, R8, R0),
1375 			BPF_ALU64_REG(BPF_ADD, R8, R1),
1376 			BPF_ALU64_REG(BPF_ADD, R8, R2),
1377 			BPF_ALU64_REG(BPF_ADD, R8, R3),
1378 			BPF_ALU64_REG(BPF_ADD, R8, R4),
1379 			BPF_ALU64_REG(BPF_ADD, R8, R5),
1380 			BPF_ALU64_REG(BPF_ADD, R8, R6),
1381 			BPF_ALU64_REG(BPF_ADD, R8, R7),
1382 			BPF_ALU64_REG(BPF_ADD, R8, R8),
1383 			BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1384 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1385 			BPF_EXIT_INSN(),
1386 			BPF_ALU64_REG(BPF_ADD, R9, R0),
1387 			BPF_ALU64_REG(BPF_ADD, R9, R1),
1388 			BPF_ALU64_REG(BPF_ADD, R9, R2),
1389 			BPF_ALU64_REG(BPF_ADD, R9, R3),
1390 			BPF_ALU64_REG(BPF_ADD, R9, R4),
1391 			BPF_ALU64_REG(BPF_ADD, R9, R5),
1392 			BPF_ALU64_REG(BPF_ADD, R9, R6),
1393 			BPF_ALU64_REG(BPF_ADD, R9, R7),
1394 			BPF_ALU64_REG(BPF_ADD, R9, R8),
1395 			BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1396 			BPF_ALU64_REG(BPF_MOV, R0, R9),
1397 			BPF_EXIT_INSN(),
1398 		},
1399 		INTERNAL,
1400 		{ },
1401 		{ { 0, 2957380 } }
1402 	},
1403 	{
1404 		"INT: ADD 32-bit",
1405 		.u.insns_int = {
1406 			BPF_ALU32_IMM(BPF_MOV, R0, 20),
1407 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
1408 			BPF_ALU32_IMM(BPF_MOV, R2, 2),
1409 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
1410 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
1411 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
1412 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
1413 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
1414 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
1415 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
1416 			BPF_ALU64_IMM(BPF_ADD, R1, 10),
1417 			BPF_ALU64_IMM(BPF_ADD, R2, 10),
1418 			BPF_ALU64_IMM(BPF_ADD, R3, 10),
1419 			BPF_ALU64_IMM(BPF_ADD, R4, 10),
1420 			BPF_ALU64_IMM(BPF_ADD, R5, 10),
1421 			BPF_ALU64_IMM(BPF_ADD, R6, 10),
1422 			BPF_ALU64_IMM(BPF_ADD, R7, 10),
1423 			BPF_ALU64_IMM(BPF_ADD, R8, 10),
1424 			BPF_ALU64_IMM(BPF_ADD, R9, 10),
1425 			BPF_ALU32_REG(BPF_ADD, R0, R1),
1426 			BPF_ALU32_REG(BPF_ADD, R0, R2),
1427 			BPF_ALU32_REG(BPF_ADD, R0, R3),
1428 			BPF_ALU32_REG(BPF_ADD, R0, R4),
1429 			BPF_ALU32_REG(BPF_ADD, R0, R5),
1430 			BPF_ALU32_REG(BPF_ADD, R0, R6),
1431 			BPF_ALU32_REG(BPF_ADD, R0, R7),
1432 			BPF_ALU32_REG(BPF_ADD, R0, R8),
1433 			BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1434 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1435 			BPF_EXIT_INSN(),
1436 			BPF_ALU32_REG(BPF_ADD, R1, R0),
1437 			BPF_ALU32_REG(BPF_ADD, R1, R1),
1438 			BPF_ALU32_REG(BPF_ADD, R1, R2),
1439 			BPF_ALU32_REG(BPF_ADD, R1, R3),
1440 			BPF_ALU32_REG(BPF_ADD, R1, R4),
1441 			BPF_ALU32_REG(BPF_ADD, R1, R5),
1442 			BPF_ALU32_REG(BPF_ADD, R1, R6),
1443 			BPF_ALU32_REG(BPF_ADD, R1, R7),
1444 			BPF_ALU32_REG(BPF_ADD, R1, R8),
1445 			BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1446 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1447 			BPF_EXIT_INSN(),
1448 			BPF_ALU32_REG(BPF_ADD, R2, R0),
1449 			BPF_ALU32_REG(BPF_ADD, R2, R1),
1450 			BPF_ALU32_REG(BPF_ADD, R2, R2),
1451 			BPF_ALU32_REG(BPF_ADD, R2, R3),
1452 			BPF_ALU32_REG(BPF_ADD, R2, R4),
1453 			BPF_ALU32_REG(BPF_ADD, R2, R5),
1454 			BPF_ALU32_REG(BPF_ADD, R2, R6),
1455 			BPF_ALU32_REG(BPF_ADD, R2, R7),
1456 			BPF_ALU32_REG(BPF_ADD, R2, R8),
1457 			BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1458 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1459 			BPF_EXIT_INSN(),
1460 			BPF_ALU32_REG(BPF_ADD, R3, R0),
1461 			BPF_ALU32_REG(BPF_ADD, R3, R1),
1462 			BPF_ALU32_REG(BPF_ADD, R3, R2),
1463 			BPF_ALU32_REG(BPF_ADD, R3, R3),
1464 			BPF_ALU32_REG(BPF_ADD, R3, R4),
1465 			BPF_ALU32_REG(BPF_ADD, R3, R5),
1466 			BPF_ALU32_REG(BPF_ADD, R3, R6),
1467 			BPF_ALU32_REG(BPF_ADD, R3, R7),
1468 			BPF_ALU32_REG(BPF_ADD, R3, R8),
1469 			BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1470 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1471 			BPF_EXIT_INSN(),
1472 			BPF_ALU32_REG(BPF_ADD, R4, R0),
1473 			BPF_ALU32_REG(BPF_ADD, R4, R1),
1474 			BPF_ALU32_REG(BPF_ADD, R4, R2),
1475 			BPF_ALU32_REG(BPF_ADD, R4, R3),
1476 			BPF_ALU32_REG(BPF_ADD, R4, R4),
1477 			BPF_ALU32_REG(BPF_ADD, R4, R5),
1478 			BPF_ALU32_REG(BPF_ADD, R4, R6),
1479 			BPF_ALU32_REG(BPF_ADD, R4, R7),
1480 			BPF_ALU32_REG(BPF_ADD, R4, R8),
1481 			BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1482 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1483 			BPF_EXIT_INSN(),
1484 			BPF_ALU32_REG(BPF_ADD, R5, R0),
1485 			BPF_ALU32_REG(BPF_ADD, R5, R1),
1486 			BPF_ALU32_REG(BPF_ADD, R5, R2),
1487 			BPF_ALU32_REG(BPF_ADD, R5, R3),
1488 			BPF_ALU32_REG(BPF_ADD, R5, R4),
1489 			BPF_ALU32_REG(BPF_ADD, R5, R5),
1490 			BPF_ALU32_REG(BPF_ADD, R5, R6),
1491 			BPF_ALU32_REG(BPF_ADD, R5, R7),
1492 			BPF_ALU32_REG(BPF_ADD, R5, R8),
1493 			BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1494 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1495 			BPF_EXIT_INSN(),
1496 			BPF_ALU32_REG(BPF_ADD, R6, R0),
1497 			BPF_ALU32_REG(BPF_ADD, R6, R1),
1498 			BPF_ALU32_REG(BPF_ADD, R6, R2),
1499 			BPF_ALU32_REG(BPF_ADD, R6, R3),
1500 			BPF_ALU32_REG(BPF_ADD, R6, R4),
1501 			BPF_ALU32_REG(BPF_ADD, R6, R5),
1502 			BPF_ALU32_REG(BPF_ADD, R6, R6),
1503 			BPF_ALU32_REG(BPF_ADD, R6, R7),
1504 			BPF_ALU32_REG(BPF_ADD, R6, R8),
1505 			BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1506 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1507 			BPF_EXIT_INSN(),
1508 			BPF_ALU32_REG(BPF_ADD, R7, R0),
1509 			BPF_ALU32_REG(BPF_ADD, R7, R1),
1510 			BPF_ALU32_REG(BPF_ADD, R7, R2),
1511 			BPF_ALU32_REG(BPF_ADD, R7, R3),
1512 			BPF_ALU32_REG(BPF_ADD, R7, R4),
1513 			BPF_ALU32_REG(BPF_ADD, R7, R5),
1514 			BPF_ALU32_REG(BPF_ADD, R7, R6),
1515 			BPF_ALU32_REG(BPF_ADD, R7, R7),
1516 			BPF_ALU32_REG(BPF_ADD, R7, R8),
1517 			BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1518 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1519 			BPF_EXIT_INSN(),
1520 			BPF_ALU32_REG(BPF_ADD, R8, R0),
1521 			BPF_ALU32_REG(BPF_ADD, R8, R1),
1522 			BPF_ALU32_REG(BPF_ADD, R8, R2),
1523 			BPF_ALU32_REG(BPF_ADD, R8, R3),
1524 			BPF_ALU32_REG(BPF_ADD, R8, R4),
1525 			BPF_ALU32_REG(BPF_ADD, R8, R5),
1526 			BPF_ALU32_REG(BPF_ADD, R8, R6),
1527 			BPF_ALU32_REG(BPF_ADD, R8, R7),
1528 			BPF_ALU32_REG(BPF_ADD, R8, R8),
1529 			BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1530 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1531 			BPF_EXIT_INSN(),
1532 			BPF_ALU32_REG(BPF_ADD, R9, R0),
1533 			BPF_ALU32_REG(BPF_ADD, R9, R1),
1534 			BPF_ALU32_REG(BPF_ADD, R9, R2),
1535 			BPF_ALU32_REG(BPF_ADD, R9, R3),
1536 			BPF_ALU32_REG(BPF_ADD, R9, R4),
1537 			BPF_ALU32_REG(BPF_ADD, R9, R5),
1538 			BPF_ALU32_REG(BPF_ADD, R9, R6),
1539 			BPF_ALU32_REG(BPF_ADD, R9, R7),
1540 			BPF_ALU32_REG(BPF_ADD, R9, R8),
1541 			BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1542 			BPF_ALU32_REG(BPF_MOV, R0, R9),
1543 			BPF_EXIT_INSN(),
1544 		},
1545 		INTERNAL,
1546 		{ },
1547 		{ { 0, 2957380 } }
1548 	},
1549 	{	/* Mainly checking JIT here. */
1550 		"INT: SUB",
1551 		.u.insns_int = {
1552 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1553 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1554 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1555 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1556 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1557 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1558 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1559 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1560 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1561 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1562 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1563 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1564 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1565 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1566 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1567 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1568 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1569 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1570 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1571 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1572 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1573 			BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1574 			BPF_EXIT_INSN(),
1575 			BPF_ALU64_REG(BPF_SUB, R1, R0),
1576 			BPF_ALU64_REG(BPF_SUB, R1, R2),
1577 			BPF_ALU64_REG(BPF_SUB, R1, R3),
1578 			BPF_ALU64_REG(BPF_SUB, R1, R4),
1579 			BPF_ALU64_REG(BPF_SUB, R1, R5),
1580 			BPF_ALU64_REG(BPF_SUB, R1, R6),
1581 			BPF_ALU64_REG(BPF_SUB, R1, R7),
1582 			BPF_ALU64_REG(BPF_SUB, R1, R8),
1583 			BPF_ALU64_REG(BPF_SUB, R1, R9),
1584 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1585 			BPF_ALU64_REG(BPF_SUB, R2, R0),
1586 			BPF_ALU64_REG(BPF_SUB, R2, R1),
1587 			BPF_ALU64_REG(BPF_SUB, R2, R3),
1588 			BPF_ALU64_REG(BPF_SUB, R2, R4),
1589 			BPF_ALU64_REG(BPF_SUB, R2, R5),
1590 			BPF_ALU64_REG(BPF_SUB, R2, R6),
1591 			BPF_ALU64_REG(BPF_SUB, R2, R7),
1592 			BPF_ALU64_REG(BPF_SUB, R2, R8),
1593 			BPF_ALU64_REG(BPF_SUB, R2, R9),
1594 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1595 			BPF_ALU64_REG(BPF_SUB, R3, R0),
1596 			BPF_ALU64_REG(BPF_SUB, R3, R1),
1597 			BPF_ALU64_REG(BPF_SUB, R3, R2),
1598 			BPF_ALU64_REG(BPF_SUB, R3, R4),
1599 			BPF_ALU64_REG(BPF_SUB, R3, R5),
1600 			BPF_ALU64_REG(BPF_SUB, R3, R6),
1601 			BPF_ALU64_REG(BPF_SUB, R3, R7),
1602 			BPF_ALU64_REG(BPF_SUB, R3, R8),
1603 			BPF_ALU64_REG(BPF_SUB, R3, R9),
1604 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1605 			BPF_ALU64_REG(BPF_SUB, R4, R0),
1606 			BPF_ALU64_REG(BPF_SUB, R4, R1),
1607 			BPF_ALU64_REG(BPF_SUB, R4, R2),
1608 			BPF_ALU64_REG(BPF_SUB, R4, R3),
1609 			BPF_ALU64_REG(BPF_SUB, R4, R5),
1610 			BPF_ALU64_REG(BPF_SUB, R4, R6),
1611 			BPF_ALU64_REG(BPF_SUB, R4, R7),
1612 			BPF_ALU64_REG(BPF_SUB, R4, R8),
1613 			BPF_ALU64_REG(BPF_SUB, R4, R9),
1614 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1615 			BPF_ALU64_REG(BPF_SUB, R5, R0),
1616 			BPF_ALU64_REG(BPF_SUB, R5, R1),
1617 			BPF_ALU64_REG(BPF_SUB, R5, R2),
1618 			BPF_ALU64_REG(BPF_SUB, R5, R3),
1619 			BPF_ALU64_REG(BPF_SUB, R5, R4),
1620 			BPF_ALU64_REG(BPF_SUB, R5, R6),
1621 			BPF_ALU64_REG(BPF_SUB, R5, R7),
1622 			BPF_ALU64_REG(BPF_SUB, R5, R8),
1623 			BPF_ALU64_REG(BPF_SUB, R5, R9),
1624 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1625 			BPF_ALU64_REG(BPF_SUB, R6, R0),
1626 			BPF_ALU64_REG(BPF_SUB, R6, R1),
1627 			BPF_ALU64_REG(BPF_SUB, R6, R2),
1628 			BPF_ALU64_REG(BPF_SUB, R6, R3),
1629 			BPF_ALU64_REG(BPF_SUB, R6, R4),
1630 			BPF_ALU64_REG(BPF_SUB, R6, R5),
1631 			BPF_ALU64_REG(BPF_SUB, R6, R7),
1632 			BPF_ALU64_REG(BPF_SUB, R6, R8),
1633 			BPF_ALU64_REG(BPF_SUB, R6, R9),
1634 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1635 			BPF_ALU64_REG(BPF_SUB, R7, R0),
1636 			BPF_ALU64_REG(BPF_SUB, R7, R1),
1637 			BPF_ALU64_REG(BPF_SUB, R7, R2),
1638 			BPF_ALU64_REG(BPF_SUB, R7, R3),
1639 			BPF_ALU64_REG(BPF_SUB, R7, R4),
1640 			BPF_ALU64_REG(BPF_SUB, R7, R5),
1641 			BPF_ALU64_REG(BPF_SUB, R7, R6),
1642 			BPF_ALU64_REG(BPF_SUB, R7, R8),
1643 			BPF_ALU64_REG(BPF_SUB, R7, R9),
1644 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1645 			BPF_ALU64_REG(BPF_SUB, R8, R0),
1646 			BPF_ALU64_REG(BPF_SUB, R8, R1),
1647 			BPF_ALU64_REG(BPF_SUB, R8, R2),
1648 			BPF_ALU64_REG(BPF_SUB, R8, R3),
1649 			BPF_ALU64_REG(BPF_SUB, R8, R4),
1650 			BPF_ALU64_REG(BPF_SUB, R8, R5),
1651 			BPF_ALU64_REG(BPF_SUB, R8, R6),
1652 			BPF_ALU64_REG(BPF_SUB, R8, R7),
1653 			BPF_ALU64_REG(BPF_SUB, R8, R9),
1654 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1655 			BPF_ALU64_REG(BPF_SUB, R9, R0),
1656 			BPF_ALU64_REG(BPF_SUB, R9, R1),
1657 			BPF_ALU64_REG(BPF_SUB, R9, R2),
1658 			BPF_ALU64_REG(BPF_SUB, R9, R3),
1659 			BPF_ALU64_REG(BPF_SUB, R9, R4),
1660 			BPF_ALU64_REG(BPF_SUB, R9, R5),
1661 			BPF_ALU64_REG(BPF_SUB, R9, R6),
1662 			BPF_ALU64_REG(BPF_SUB, R9, R7),
1663 			BPF_ALU64_REG(BPF_SUB, R9, R8),
1664 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1665 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1666 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
1667 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1668 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1669 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1670 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1671 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1672 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1673 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1674 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1675 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1676 			BPF_EXIT_INSN(),
1677 		},
1678 		INTERNAL,
1679 		{ },
1680 		{ { 0, 11 } }
1681 	},
1682 	{	/* Mainly checking JIT here. */
1683 		"INT: XOR",
1684 		.u.insns_int = {
1685 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1686 			BPF_ALU64_REG(BPF_XOR, R1, R1),
1687 			BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1688 			BPF_EXIT_INSN(),
1689 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1690 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1691 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1692 			BPF_ALU64_REG(BPF_XOR, R2, R2),
1693 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1694 			BPF_EXIT_INSN(),
1695 			BPF_ALU64_REG(BPF_SUB, R2, R2),
1696 			BPF_ALU64_REG(BPF_XOR, R3, R3),
1697 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1698 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1699 			BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1700 			BPF_EXIT_INSN(),
1701 			BPF_ALU64_REG(BPF_SUB, R3, R3),
1702 			BPF_ALU64_REG(BPF_XOR, R4, R4),
1703 			BPF_ALU64_IMM(BPF_MOV, R2, 1),
1704 			BPF_ALU64_IMM(BPF_MOV, R5, -1),
1705 			BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1706 			BPF_EXIT_INSN(),
1707 			BPF_ALU64_REG(BPF_SUB, R4, R4),
1708 			BPF_ALU64_REG(BPF_XOR, R5, R5),
1709 			BPF_ALU64_IMM(BPF_MOV, R3, 1),
1710 			BPF_ALU64_IMM(BPF_MOV, R7, -1),
1711 			BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1712 			BPF_EXIT_INSN(),
1713 			BPF_ALU64_IMM(BPF_MOV, R5, 1),
1714 			BPF_ALU64_REG(BPF_SUB, R5, R5),
1715 			BPF_ALU64_REG(BPF_XOR, R6, R6),
1716 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1717 			BPF_ALU64_IMM(BPF_MOV, R8, -1),
1718 			BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1719 			BPF_EXIT_INSN(),
1720 			BPF_ALU64_REG(BPF_SUB, R6, R6),
1721 			BPF_ALU64_REG(BPF_XOR, R7, R7),
1722 			BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1723 			BPF_EXIT_INSN(),
1724 			BPF_ALU64_REG(BPF_SUB, R7, R7),
1725 			BPF_ALU64_REG(BPF_XOR, R8, R8),
1726 			BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1727 			BPF_EXIT_INSN(),
1728 			BPF_ALU64_REG(BPF_SUB, R8, R8),
1729 			BPF_ALU64_REG(BPF_XOR, R9, R9),
1730 			BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1731 			BPF_EXIT_INSN(),
1732 			BPF_ALU64_REG(BPF_SUB, R9, R9),
1733 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1734 			BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1735 			BPF_EXIT_INSN(),
1736 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1737 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1738 			BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1739 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1740 			BPF_EXIT_INSN(),
1741 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1742 			BPF_EXIT_INSN(),
1743 		},
1744 		INTERNAL,
1745 		{ },
1746 		{ { 0, 1 } }
1747 	},
1748 	{	/* Mainly checking JIT here. */
1749 		"INT: MUL",
1750 		.u.insns_int = {
1751 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1752 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1753 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1754 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1755 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1756 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1757 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1758 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1759 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1760 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1761 			BPF_ALU64_REG(BPF_MUL, R0, R0),
1762 			BPF_ALU64_REG(BPF_MUL, R0, R1),
1763 			BPF_ALU64_REG(BPF_MUL, R0, R2),
1764 			BPF_ALU64_REG(BPF_MUL, R0, R3),
1765 			BPF_ALU64_REG(BPF_MUL, R0, R4),
1766 			BPF_ALU64_REG(BPF_MUL, R0, R5),
1767 			BPF_ALU64_REG(BPF_MUL, R0, R6),
1768 			BPF_ALU64_REG(BPF_MUL, R0, R7),
1769 			BPF_ALU64_REG(BPF_MUL, R0, R8),
1770 			BPF_ALU64_REG(BPF_MUL, R0, R9),
1771 			BPF_ALU64_IMM(BPF_MUL, R0, 10),
1772 			BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1773 			BPF_EXIT_INSN(),
1774 			BPF_ALU64_REG(BPF_MUL, R1, R0),
1775 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1776 			BPF_ALU64_REG(BPF_MUL, R1, R3),
1777 			BPF_ALU64_REG(BPF_MUL, R1, R4),
1778 			BPF_ALU64_REG(BPF_MUL, R1, R5),
1779 			BPF_ALU64_REG(BPF_MUL, R1, R6),
1780 			BPF_ALU64_REG(BPF_MUL, R1, R7),
1781 			BPF_ALU64_REG(BPF_MUL, R1, R8),
1782 			BPF_ALU64_REG(BPF_MUL, R1, R9),
1783 			BPF_ALU64_IMM(BPF_MUL, R1, 10),
1784 			BPF_ALU64_REG(BPF_MOV, R2, R1),
1785 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1786 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1787 			BPF_EXIT_INSN(),
1788 			BPF_ALU64_IMM(BPF_LSH, R1, 32),
1789 			BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1790 			BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1791 			BPF_EXIT_INSN(),
1792 			BPF_ALU64_REG(BPF_MUL, R2, R0),
1793 			BPF_ALU64_REG(BPF_MUL, R2, R1),
1794 			BPF_ALU64_REG(BPF_MUL, R2, R3),
1795 			BPF_ALU64_REG(BPF_MUL, R2, R4),
1796 			BPF_ALU64_REG(BPF_MUL, R2, R5),
1797 			BPF_ALU64_REG(BPF_MUL, R2, R6),
1798 			BPF_ALU64_REG(BPF_MUL, R2, R7),
1799 			BPF_ALU64_REG(BPF_MUL, R2, R8),
1800 			BPF_ALU64_REG(BPF_MUL, R2, R9),
1801 			BPF_ALU64_IMM(BPF_MUL, R2, 10),
1802 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1803 			BPF_ALU64_REG(BPF_MOV, R0, R2),
1804 			BPF_EXIT_INSN(),
1805 		},
1806 		INTERNAL,
1807 		{ },
1808 		{ { 0, 0x35d97ef2 } }
1809 	},
1810 	{	/* Mainly checking JIT here. */
1811 		"MOV REG64",
1812 		.u.insns_int = {
1813 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1814 			BPF_MOV64_REG(R1, R0),
1815 			BPF_MOV64_REG(R2, R1),
1816 			BPF_MOV64_REG(R3, R2),
1817 			BPF_MOV64_REG(R4, R3),
1818 			BPF_MOV64_REG(R5, R4),
1819 			BPF_MOV64_REG(R6, R5),
1820 			BPF_MOV64_REG(R7, R6),
1821 			BPF_MOV64_REG(R8, R7),
1822 			BPF_MOV64_REG(R9, R8),
1823 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1824 			BPF_ALU64_IMM(BPF_MOV, R1, 0),
1825 			BPF_ALU64_IMM(BPF_MOV, R2, 0),
1826 			BPF_ALU64_IMM(BPF_MOV, R3, 0),
1827 			BPF_ALU64_IMM(BPF_MOV, R4, 0),
1828 			BPF_ALU64_IMM(BPF_MOV, R5, 0),
1829 			BPF_ALU64_IMM(BPF_MOV, R6, 0),
1830 			BPF_ALU64_IMM(BPF_MOV, R7, 0),
1831 			BPF_ALU64_IMM(BPF_MOV, R8, 0),
1832 			BPF_ALU64_IMM(BPF_MOV, R9, 0),
1833 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1834 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1835 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1836 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1837 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1838 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1839 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1840 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1841 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1842 			BPF_ALU64_REG(BPF_ADD, R0, R9),
1843 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1844 			BPF_EXIT_INSN(),
1845 		},
1846 		INTERNAL,
1847 		{ },
1848 		{ { 0, 0xfefe } }
1849 	},
1850 	{	/* Mainly checking JIT here. */
1851 		"MOV REG32",
1852 		.u.insns_int = {
1853 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1854 			BPF_MOV64_REG(R1, R0),
1855 			BPF_MOV64_REG(R2, R1),
1856 			BPF_MOV64_REG(R3, R2),
1857 			BPF_MOV64_REG(R4, R3),
1858 			BPF_MOV64_REG(R5, R4),
1859 			BPF_MOV64_REG(R6, R5),
1860 			BPF_MOV64_REG(R7, R6),
1861 			BPF_MOV64_REG(R8, R7),
1862 			BPF_MOV64_REG(R9, R8),
1863 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
1864 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
1865 			BPF_ALU32_IMM(BPF_MOV, R2, 0),
1866 			BPF_ALU32_IMM(BPF_MOV, R3, 0),
1867 			BPF_ALU32_IMM(BPF_MOV, R4, 0),
1868 			BPF_ALU32_IMM(BPF_MOV, R5, 0),
1869 			BPF_ALU32_IMM(BPF_MOV, R6, 0),
1870 			BPF_ALU32_IMM(BPF_MOV, R7, 0),
1871 			BPF_ALU32_IMM(BPF_MOV, R8, 0),
1872 			BPF_ALU32_IMM(BPF_MOV, R9, 0),
1873 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1874 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1875 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1876 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1877 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1878 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1879 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1880 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1881 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1882 			BPF_ALU64_REG(BPF_ADD, R0, R9),
1883 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1884 			BPF_EXIT_INSN(),
1885 		},
1886 		INTERNAL,
1887 		{ },
1888 		{ { 0, 0xfefe } }
1889 	},
1890 	{	/* Mainly checking JIT here. */
1891 		"LD IMM64",
1892 		.u.insns_int = {
1893 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1894 			BPF_MOV64_REG(R1, R0),
1895 			BPF_MOV64_REG(R2, R1),
1896 			BPF_MOV64_REG(R3, R2),
1897 			BPF_MOV64_REG(R4, R3),
1898 			BPF_MOV64_REG(R5, R4),
1899 			BPF_MOV64_REG(R6, R5),
1900 			BPF_MOV64_REG(R7, R6),
1901 			BPF_MOV64_REG(R8, R7),
1902 			BPF_MOV64_REG(R9, R8),
1903 			BPF_LD_IMM64(R0, 0x0LL),
1904 			BPF_LD_IMM64(R1, 0x0LL),
1905 			BPF_LD_IMM64(R2, 0x0LL),
1906 			BPF_LD_IMM64(R3, 0x0LL),
1907 			BPF_LD_IMM64(R4, 0x0LL),
1908 			BPF_LD_IMM64(R5, 0x0LL),
1909 			BPF_LD_IMM64(R6, 0x0LL),
1910 			BPF_LD_IMM64(R7, 0x0LL),
1911 			BPF_LD_IMM64(R8, 0x0LL),
1912 			BPF_LD_IMM64(R9, 0x0LL),
1913 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1914 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1915 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1916 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1917 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1918 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1919 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1920 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1921 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1922 			BPF_ALU64_REG(BPF_ADD, R0, R9),
1923 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1924 			BPF_EXIT_INSN(),
1925 		},
1926 		INTERNAL,
1927 		{ },
1928 		{ { 0, 0xfefe } }
1929 	},
1930 	{
1931 		"INT: ALU MIX",
1932 		.u.insns_int = {
1933 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1934 			BPF_ALU64_IMM(BPF_ADD, R0, -1),
1935 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1936 			BPF_ALU64_IMM(BPF_XOR, R2, 3),
1937 			BPF_ALU64_REG(BPF_DIV, R0, R2),
1938 			BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1939 			BPF_EXIT_INSN(),
1940 			BPF_ALU64_IMM(BPF_MOD, R0, 3),
1941 			BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1942 			BPF_EXIT_INSN(),
1943 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1944 			BPF_EXIT_INSN(),
1945 		},
1946 		INTERNAL,
1947 		{ },
1948 		{ { 0, -1 } }
1949 	},
1950 	{
1951 		"INT: shifts by register",
1952 		.u.insns_int = {
1953 			BPF_MOV64_IMM(R0, -1234),
1954 			BPF_MOV64_IMM(R1, 1),
1955 			BPF_ALU32_REG(BPF_RSH, R0, R1),
1956 			BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1957 			BPF_EXIT_INSN(),
1958 			BPF_MOV64_IMM(R2, 1),
1959 			BPF_ALU64_REG(BPF_LSH, R0, R2),
1960 			BPF_MOV32_IMM(R4, -1234),
1961 			BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1962 			BPF_EXIT_INSN(),
1963 			BPF_ALU64_IMM(BPF_AND, R4, 63),
1964 			BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1965 			BPF_MOV64_IMM(R3, 47),
1966 			BPF_ALU64_REG(BPF_ARSH, R0, R3),
1967 			BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1968 			BPF_EXIT_INSN(),
1969 			BPF_MOV64_IMM(R2, 1),
1970 			BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1971 			BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1972 			BPF_EXIT_INSN(),
1973 			BPF_MOV64_IMM(R4, 4),
1974 			BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1975 			BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1976 			BPF_EXIT_INSN(),
1977 			BPF_MOV64_IMM(R4, 5),
1978 			BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1979 			BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1980 			BPF_EXIT_INSN(),
1981 			BPF_MOV64_IMM(R0, -1),
1982 			BPF_EXIT_INSN(),
1983 		},
1984 		INTERNAL,
1985 		{ },
1986 		{ { 0, -1 } }
1987 	},
1988 	{
1989 		"INT: DIV + ABS",
1990 		.u.insns_int = {
1991 			BPF_ALU64_REG(BPF_MOV, R6, R1),
1992 			BPF_LD_ABS(BPF_B, 3),
1993 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1994 			BPF_ALU32_REG(BPF_DIV, R0, R2),
1995 			BPF_ALU64_REG(BPF_MOV, R8, R0),
1996 			BPF_LD_ABS(BPF_B, 4),
1997 			BPF_ALU64_REG(BPF_ADD, R8, R0),
1998 			BPF_LD_IND(BPF_B, R8, -70),
1999 			BPF_EXIT_INSN(),
2000 		},
2001 		INTERNAL,
2002 		{ 10, 20, 30, 40, 50 },
2003 		{ { 4, 0 }, { 5, 10 } }
2004 	},
2005 	{
2006 		"INT: DIV by zero",
2007 		.u.insns_int = {
2008 			BPF_ALU64_REG(BPF_MOV, R6, R1),
2009 			BPF_ALU64_IMM(BPF_MOV, R7, 0),
2010 			BPF_LD_ABS(BPF_B, 3),
2011 			BPF_ALU32_REG(BPF_DIV, R0, R7),
2012 			BPF_EXIT_INSN(),
2013 		},
2014 		INTERNAL,
2015 		{ 10, 20, 30, 40, 50 },
2016 		{ { 3, 0 }, { 4, 0 } }
2017 	},
2018 	{
2019 		"check: missing ret",
2020 		.u.insns = {
2021 			BPF_STMT(BPF_LD | BPF_IMM, 1),
2022 		},
2023 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2024 		{ },
2025 		{ }
2026 	},
2027 	{
2028 		"check: div_k_0",
2029 		.u.insns = {
2030 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
2031 			BPF_STMT(BPF_RET | BPF_K, 0)
2032 		},
2033 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2034 		{ },
2035 		{ }
2036 	},
2037 	{
2038 		"check: unknown insn",
2039 		.u.insns = {
2040 			/* seccomp insn, rejected in socket filter */
2041 			BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
2042 			BPF_STMT(BPF_RET | BPF_K, 0)
2043 		},
2044 		CLASSIC | FLAG_EXPECTED_FAIL,
2045 		{ },
2046 		{ }
2047 	},
2048 	{
2049 		"check: out of range spill/fill",
2050 		.u.insns = {
2051 			BPF_STMT(BPF_STX, 16),
2052 			BPF_STMT(BPF_RET | BPF_K, 0)
2053 		},
2054 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2055 		{ },
2056 		{ }
2057 	},
2058 	{
2059 		"JUMPS + HOLES",
2060 		.u.insns = {
2061 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2062 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
2063 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2064 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2065 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2066 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2067 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2068 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2069 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2070 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2071 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2072 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2073 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2074 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2075 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2076 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
2077 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2078 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
2079 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2080 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2081 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2082 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2083 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2084 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2085 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2086 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2087 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2088 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2089 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2090 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2091 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2092 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2093 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2094 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2095 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
2096 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
2097 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2098 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2099 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2100 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2101 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2102 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2103 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2104 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2105 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2106 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2107 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2108 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2109 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2110 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2111 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2112 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2113 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
2114 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
2115 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2116 			BPF_STMT(BPF_RET | BPF_A, 0),
2117 			BPF_STMT(BPF_RET | BPF_A, 0),
2118 		},
2119 		CLASSIC,
2120 		{ 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
2121 		  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
2122 		  0x08, 0x00,
2123 		  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
2124 		  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
2125 		  0xc0, 0xa8, 0x33, 0x01,
2126 		  0xc0, 0xa8, 0x33, 0x02,
2127 		  0xbb, 0xb6,
2128 		  0xa9, 0xfa,
2129 		  0x00, 0x14, 0x00, 0x00,
2130 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2131 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2132 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2133 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2134 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2135 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2136 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2137 		  0xcc, 0xcc, 0xcc, 0xcc },
2138 		{ { 88, 0x001b } }
2139 	},
2140 	{
2141 		"check: RET X",
2142 		.u.insns = {
2143 			BPF_STMT(BPF_RET | BPF_X, 0),
2144 		},
2145 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2146 		{ },
2147 		{ },
2148 	},
2149 	{
2150 		"check: LDX + RET X",
2151 		.u.insns = {
2152 			BPF_STMT(BPF_LDX | BPF_IMM, 42),
2153 			BPF_STMT(BPF_RET | BPF_X, 0),
2154 		},
2155 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2156 		{ },
2157 		{ },
2158 	},
2159 	{	/* Mainly checking JIT here. */
2160 		"M[]: alt STX + LDX",
2161 		.u.insns = {
2162 			BPF_STMT(BPF_LDX | BPF_IMM, 100),
2163 			BPF_STMT(BPF_STX, 0),
2164 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
2165 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2166 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2167 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2168 			BPF_STMT(BPF_STX, 1),
2169 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2170 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2171 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2172 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2173 			BPF_STMT(BPF_STX, 2),
2174 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
2175 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2176 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2177 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2178 			BPF_STMT(BPF_STX, 3),
2179 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
2180 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2181 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2182 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2183 			BPF_STMT(BPF_STX, 4),
2184 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
2185 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2186 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2187 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2188 			BPF_STMT(BPF_STX, 5),
2189 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
2190 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2191 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2192 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2193 			BPF_STMT(BPF_STX, 6),
2194 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
2195 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2196 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2197 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2198 			BPF_STMT(BPF_STX, 7),
2199 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
2200 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2201 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2202 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2203 			BPF_STMT(BPF_STX, 8),
2204 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
2205 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2206 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2207 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2208 			BPF_STMT(BPF_STX, 9),
2209 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
2210 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2211 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2212 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2213 			BPF_STMT(BPF_STX, 10),
2214 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
2215 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2216 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2217 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2218 			BPF_STMT(BPF_STX, 11),
2219 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
2220 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2221 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2222 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2223 			BPF_STMT(BPF_STX, 12),
2224 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
2225 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2226 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2227 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2228 			BPF_STMT(BPF_STX, 13),
2229 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
2230 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2231 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2232 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2233 			BPF_STMT(BPF_STX, 14),
2234 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
2235 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2236 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2237 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2238 			BPF_STMT(BPF_STX, 15),
2239 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2240 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2241 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2242 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2243 			BPF_STMT(BPF_RET | BPF_A, 0),
2244 		},
2245 		CLASSIC | FLAG_NO_DATA,
2246 		{ },
2247 		{ { 0, 116 } },
2248 	},
2249 	{	/* Mainly checking JIT here. */
2250 		"M[]: full STX + full LDX",
2251 		.u.insns = {
2252 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
2253 			BPF_STMT(BPF_STX, 0),
2254 			BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
2255 			BPF_STMT(BPF_STX, 1),
2256 			BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
2257 			BPF_STMT(BPF_STX, 2),
2258 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
2259 			BPF_STMT(BPF_STX, 3),
2260 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
2261 			BPF_STMT(BPF_STX, 4),
2262 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
2263 			BPF_STMT(BPF_STX, 5),
2264 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
2265 			BPF_STMT(BPF_STX, 6),
2266 			BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
2267 			BPF_STMT(BPF_STX, 7),
2268 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
2269 			BPF_STMT(BPF_STX, 8),
2270 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
2271 			BPF_STMT(BPF_STX, 9),
2272 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
2273 			BPF_STMT(BPF_STX, 10),
2274 			BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
2275 			BPF_STMT(BPF_STX, 11),
2276 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
2277 			BPF_STMT(BPF_STX, 12),
2278 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
2279 			BPF_STMT(BPF_STX, 13),
2280 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
2281 			BPF_STMT(BPF_STX, 14),
2282 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
2283 			BPF_STMT(BPF_STX, 15),
2284 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
2285 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2286 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2287 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2288 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
2289 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2290 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
2291 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2292 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
2293 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2294 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
2295 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2296 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
2297 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2298 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
2299 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2300 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
2301 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2302 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
2303 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2304 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
2305 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2306 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
2307 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2308 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
2309 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2310 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
2311 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2312 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
2313 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2314 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2315 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2316 			BPF_STMT(BPF_RET | BPF_A, 0),
2317 		},
2318 		CLASSIC | FLAG_NO_DATA,
2319 		{ },
2320 		{ { 0, 0x2a5a5e5 } },
2321 	},
2322 	{
2323 		"check: SKF_AD_MAX",
2324 		.u.insns = {
2325 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2326 				 SKF_AD_OFF + SKF_AD_MAX),
2327 			BPF_STMT(BPF_RET | BPF_A, 0),
2328 		},
2329 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2330 		{ },
2331 		{ },
2332 	},
2333 	{	/* Passes checker but fails during runtime. */
2334 		"LD [SKF_AD_OFF-1]",
2335 		.u.insns = {
2336 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2337 				 SKF_AD_OFF - 1),
2338 			BPF_STMT(BPF_RET | BPF_K, 1),
2339 		},
2340 		CLASSIC,
2341 		{ },
2342 		{ { 1, 0 } },
2343 	},
2344 	{
2345 		"load 64-bit immediate",
2346 		.u.insns_int = {
2347 			BPF_LD_IMM64(R1, 0x567800001234LL),
2348 			BPF_MOV64_REG(R2, R1),
2349 			BPF_MOV64_REG(R3, R2),
2350 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
2351 			BPF_ALU64_IMM(BPF_LSH, R3, 32),
2352 			BPF_ALU64_IMM(BPF_RSH, R3, 32),
2353 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
2354 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
2355 			BPF_EXIT_INSN(),
2356 			BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
2357 			BPF_EXIT_INSN(),
2358 			BPF_LD_IMM64(R0, 0x1ffffffffLL),
2359 			BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
2360 			BPF_EXIT_INSN(),
2361 		},
2362 		INTERNAL,
2363 		{ },
2364 		{ { 0, 1 } }
2365 	},
2366 	{
2367 		"nmap reduced",
2368 		.u.insns_int = {
2369 			BPF_MOV64_REG(R6, R1),
2370 			BPF_LD_ABS(BPF_H, 12),
2371 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 28),
2372 			BPF_LD_ABS(BPF_H, 12),
2373 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 26),
2374 			BPF_MOV32_IMM(R0, 18),
2375 			BPF_STX_MEM(BPF_W, R10, R0, -64),
2376 			BPF_LDX_MEM(BPF_W, R7, R10, -64),
2377 			BPF_LD_IND(BPF_W, R7, 14),
2378 			BPF_STX_MEM(BPF_W, R10, R0, -60),
2379 			BPF_MOV32_IMM(R0, 280971478),
2380 			BPF_STX_MEM(BPF_W, R10, R0, -56),
2381 			BPF_LDX_MEM(BPF_W, R7, R10, -56),
2382 			BPF_LDX_MEM(BPF_W, R0, R10, -60),
2383 			BPF_ALU32_REG(BPF_SUB, R0, R7),
2384 			BPF_JMP_IMM(BPF_JNE, R0, 0, 15),
2385 			BPF_LD_ABS(BPF_H, 12),
2386 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 13),
2387 			BPF_MOV32_IMM(R0, 22),
2388 			BPF_STX_MEM(BPF_W, R10, R0, -56),
2389 			BPF_LDX_MEM(BPF_W, R7, R10, -56),
2390 			BPF_LD_IND(BPF_H, R7, 14),
2391 			BPF_STX_MEM(BPF_W, R10, R0, -52),
2392 			BPF_MOV32_IMM(R0, 17366),
2393 			BPF_STX_MEM(BPF_W, R10, R0, -48),
2394 			BPF_LDX_MEM(BPF_W, R7, R10, -48),
2395 			BPF_LDX_MEM(BPF_W, R0, R10, -52),
2396 			BPF_ALU32_REG(BPF_SUB, R0, R7),
2397 			BPF_JMP_IMM(BPF_JNE, R0, 0, 2),
2398 			BPF_MOV32_IMM(R0, 256),
2399 			BPF_EXIT_INSN(),
2400 			BPF_MOV32_IMM(R0, 0),
2401 			BPF_EXIT_INSN(),
2402 		},
2403 		INTERNAL,
2404 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 0,
2405 		  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2406 		  0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6},
2407 		{ { 38, 256 } },
2408 		.stack_depth = 64,
2409 	},
2410 	/* BPF_ALU | BPF_MOV | BPF_X */
2411 	{
2412 		"ALU_MOV_X: dst = 2",
2413 		.u.insns_int = {
2414 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2415 			BPF_ALU32_REG(BPF_MOV, R0, R1),
2416 			BPF_EXIT_INSN(),
2417 		},
2418 		INTERNAL,
2419 		{ },
2420 		{ { 0, 2 } },
2421 	},
2422 	{
2423 		"ALU_MOV_X: dst = 4294967295",
2424 		.u.insns_int = {
2425 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2426 			BPF_ALU32_REG(BPF_MOV, R0, R1),
2427 			BPF_EXIT_INSN(),
2428 		},
2429 		INTERNAL,
2430 		{ },
2431 		{ { 0, 4294967295U } },
2432 	},
2433 	{
2434 		"ALU64_MOV_X: dst = 2",
2435 		.u.insns_int = {
2436 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2437 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2438 			BPF_EXIT_INSN(),
2439 		},
2440 		INTERNAL,
2441 		{ },
2442 		{ { 0, 2 } },
2443 	},
2444 	{
2445 		"ALU64_MOV_X: dst = 4294967295",
2446 		.u.insns_int = {
2447 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2448 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2449 			BPF_EXIT_INSN(),
2450 		},
2451 		INTERNAL,
2452 		{ },
2453 		{ { 0, 4294967295U } },
2454 	},
2455 	/* BPF_ALU | BPF_MOV | BPF_K */
2456 	{
2457 		"ALU_MOV_K: dst = 2",
2458 		.u.insns_int = {
2459 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
2460 			BPF_EXIT_INSN(),
2461 		},
2462 		INTERNAL,
2463 		{ },
2464 		{ { 0, 2 } },
2465 	},
2466 	{
2467 		"ALU_MOV_K: dst = 4294967295",
2468 		.u.insns_int = {
2469 			BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2470 			BPF_EXIT_INSN(),
2471 		},
2472 		INTERNAL,
2473 		{ },
2474 		{ { 0, 4294967295U } },
2475 	},
2476 	{
2477 		"ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2478 		.u.insns_int = {
2479 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2480 			BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2481 			BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2482 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2483 			BPF_MOV32_IMM(R0, 2),
2484 			BPF_EXIT_INSN(),
2485 			BPF_MOV32_IMM(R0, 1),
2486 			BPF_EXIT_INSN(),
2487 		},
2488 		INTERNAL,
2489 		{ },
2490 		{ { 0, 0x1 } },
2491 	},
2492 	{
2493 		"ALU64_MOV_K: dst = 2",
2494 		.u.insns_int = {
2495 			BPF_ALU64_IMM(BPF_MOV, R0, 2),
2496 			BPF_EXIT_INSN(),
2497 		},
2498 		INTERNAL,
2499 		{ },
2500 		{ { 0, 2 } },
2501 	},
2502 	{
2503 		"ALU64_MOV_K: dst = 2147483647",
2504 		.u.insns_int = {
2505 			BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2506 			BPF_EXIT_INSN(),
2507 		},
2508 		INTERNAL,
2509 		{ },
2510 		{ { 0, 2147483647 } },
2511 	},
2512 	{
2513 		"ALU64_OR_K: dst = 0x0",
2514 		.u.insns_int = {
2515 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2516 			BPF_LD_IMM64(R3, 0x0),
2517 			BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
2518 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2519 			BPF_MOV32_IMM(R0, 2),
2520 			BPF_EXIT_INSN(),
2521 			BPF_MOV32_IMM(R0, 1),
2522 			BPF_EXIT_INSN(),
2523 		},
2524 		INTERNAL,
2525 		{ },
2526 		{ { 0, 0x1 } },
2527 	},
2528 	{
2529 		"ALU64_MOV_K: dst = -1",
2530 		.u.insns_int = {
2531 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2532 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2533 			BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2534 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2535 			BPF_MOV32_IMM(R0, 2),
2536 			BPF_EXIT_INSN(),
2537 			BPF_MOV32_IMM(R0, 1),
2538 			BPF_EXIT_INSN(),
2539 		},
2540 		INTERNAL,
2541 		{ },
2542 		{ { 0, 0x1 } },
2543 	},
2544 	/* BPF_ALU | BPF_ADD | BPF_X */
2545 	{
2546 		"ALU_ADD_X: 1 + 2 = 3",
2547 		.u.insns_int = {
2548 			BPF_LD_IMM64(R0, 1),
2549 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2550 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2551 			BPF_EXIT_INSN(),
2552 		},
2553 		INTERNAL,
2554 		{ },
2555 		{ { 0, 3 } },
2556 	},
2557 	{
2558 		"ALU_ADD_X: 1 + 4294967294 = 4294967295",
2559 		.u.insns_int = {
2560 			BPF_LD_IMM64(R0, 1),
2561 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2562 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2563 			BPF_EXIT_INSN(),
2564 		},
2565 		INTERNAL,
2566 		{ },
2567 		{ { 0, 4294967295U } },
2568 	},
2569 	{
2570 		"ALU_ADD_X: 2 + 4294967294 = 0",
2571 		.u.insns_int = {
2572 			BPF_LD_IMM64(R0, 2),
2573 			BPF_LD_IMM64(R1, 4294967294U),
2574 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2575 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2576 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2577 			BPF_EXIT_INSN(),
2578 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2579 			BPF_EXIT_INSN(),
2580 		},
2581 		INTERNAL,
2582 		{ },
2583 		{ { 0, 1 } },
2584 	},
2585 	{
2586 		"ALU64_ADD_X: 1 + 2 = 3",
2587 		.u.insns_int = {
2588 			BPF_LD_IMM64(R0, 1),
2589 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2590 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2591 			BPF_EXIT_INSN(),
2592 		},
2593 		INTERNAL,
2594 		{ },
2595 		{ { 0, 3 } },
2596 	},
2597 	{
2598 		"ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2599 		.u.insns_int = {
2600 			BPF_LD_IMM64(R0, 1),
2601 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2602 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2603 			BPF_EXIT_INSN(),
2604 		},
2605 		INTERNAL,
2606 		{ },
2607 		{ { 0, 4294967295U } },
2608 	},
2609 	{
2610 		"ALU64_ADD_X: 2 + 4294967294 = 4294967296",
2611 		.u.insns_int = {
2612 			BPF_LD_IMM64(R0, 2),
2613 			BPF_LD_IMM64(R1, 4294967294U),
2614 			BPF_LD_IMM64(R2, 4294967296ULL),
2615 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2616 			BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
2617 			BPF_MOV32_IMM(R0, 0),
2618 			BPF_EXIT_INSN(),
2619 			BPF_MOV32_IMM(R0, 1),
2620 			BPF_EXIT_INSN(),
2621 		},
2622 		INTERNAL,
2623 		{ },
2624 		{ { 0, 1 } },
2625 	},
2626 	/* BPF_ALU | BPF_ADD | BPF_K */
2627 	{
2628 		"ALU_ADD_K: 1 + 2 = 3",
2629 		.u.insns_int = {
2630 			BPF_LD_IMM64(R0, 1),
2631 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2632 			BPF_EXIT_INSN(),
2633 		},
2634 		INTERNAL,
2635 		{ },
2636 		{ { 0, 3 } },
2637 	},
2638 	{
2639 		"ALU_ADD_K: 3 + 0 = 3",
2640 		.u.insns_int = {
2641 			BPF_LD_IMM64(R0, 3),
2642 			BPF_ALU32_IMM(BPF_ADD, R0, 0),
2643 			BPF_EXIT_INSN(),
2644 		},
2645 		INTERNAL,
2646 		{ },
2647 		{ { 0, 3 } },
2648 	},
2649 	{
2650 		"ALU_ADD_K: 1 + 4294967294 = 4294967295",
2651 		.u.insns_int = {
2652 			BPF_LD_IMM64(R0, 1),
2653 			BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2654 			BPF_EXIT_INSN(),
2655 		},
2656 		INTERNAL,
2657 		{ },
2658 		{ { 0, 4294967295U } },
2659 	},
2660 	{
2661 		"ALU_ADD_K: 4294967294 + 2 = 0",
2662 		.u.insns_int = {
2663 			BPF_LD_IMM64(R0, 4294967294U),
2664 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2665 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2666 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2667 			BPF_EXIT_INSN(),
2668 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2669 			BPF_EXIT_INSN(),
2670 		},
2671 		INTERNAL,
2672 		{ },
2673 		{ { 0, 1 } },
2674 	},
2675 	{
2676 		"ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2677 		.u.insns_int = {
2678 			BPF_LD_IMM64(R2, 0x0),
2679 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
2680 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2681 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2682 			BPF_MOV32_IMM(R0, 2),
2683 			BPF_EXIT_INSN(),
2684 			BPF_MOV32_IMM(R0, 1),
2685 			BPF_EXIT_INSN(),
2686 		},
2687 		INTERNAL,
2688 		{ },
2689 		{ { 0, 0x1 } },
2690 	},
2691 	{
2692 		"ALU_ADD_K: 0 + 0xffff = 0xffff",
2693 		.u.insns_int = {
2694 			BPF_LD_IMM64(R2, 0x0),
2695 			BPF_LD_IMM64(R3, 0xffff),
2696 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
2697 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2698 			BPF_MOV32_IMM(R0, 2),
2699 			BPF_EXIT_INSN(),
2700 			BPF_MOV32_IMM(R0, 1),
2701 			BPF_EXIT_INSN(),
2702 		},
2703 		INTERNAL,
2704 		{ },
2705 		{ { 0, 0x1 } },
2706 	},
2707 	{
2708 		"ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2709 		.u.insns_int = {
2710 			BPF_LD_IMM64(R2, 0x0),
2711 			BPF_LD_IMM64(R3, 0x7fffffff),
2712 			BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
2713 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2714 			BPF_MOV32_IMM(R0, 2),
2715 			BPF_EXIT_INSN(),
2716 			BPF_MOV32_IMM(R0, 1),
2717 			BPF_EXIT_INSN(),
2718 		},
2719 		INTERNAL,
2720 		{ },
2721 		{ { 0, 0x1 } },
2722 	},
2723 	{
2724 		"ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
2725 		.u.insns_int = {
2726 			BPF_LD_IMM64(R2, 0x0),
2727 			BPF_LD_IMM64(R3, 0x80000000),
2728 			BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
2729 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2730 			BPF_MOV32_IMM(R0, 2),
2731 			BPF_EXIT_INSN(),
2732 			BPF_MOV32_IMM(R0, 1),
2733 			BPF_EXIT_INSN(),
2734 		},
2735 		INTERNAL,
2736 		{ },
2737 		{ { 0, 0x1 } },
2738 	},
2739 	{
2740 		"ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
2741 		.u.insns_int = {
2742 			BPF_LD_IMM64(R2, 0x0),
2743 			BPF_LD_IMM64(R3, 0x80008000),
2744 			BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
2745 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2746 			BPF_MOV32_IMM(R0, 2),
2747 			BPF_EXIT_INSN(),
2748 			BPF_MOV32_IMM(R0, 1),
2749 			BPF_EXIT_INSN(),
2750 		},
2751 		INTERNAL,
2752 		{ },
2753 		{ { 0, 0x1 } },
2754 	},
2755 	{
2756 		"ALU64_ADD_K: 1 + 2 = 3",
2757 		.u.insns_int = {
2758 			BPF_LD_IMM64(R0, 1),
2759 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2760 			BPF_EXIT_INSN(),
2761 		},
2762 		INTERNAL,
2763 		{ },
2764 		{ { 0, 3 } },
2765 	},
2766 	{
2767 		"ALU64_ADD_K: 3 + 0 = 3",
2768 		.u.insns_int = {
2769 			BPF_LD_IMM64(R0, 3),
2770 			BPF_ALU64_IMM(BPF_ADD, R0, 0),
2771 			BPF_EXIT_INSN(),
2772 		},
2773 		INTERNAL,
2774 		{ },
2775 		{ { 0, 3 } },
2776 	},
2777 	{
2778 		"ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2779 		.u.insns_int = {
2780 			BPF_LD_IMM64(R0, 1),
2781 			BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2782 			BPF_EXIT_INSN(),
2783 		},
2784 		INTERNAL,
2785 		{ },
2786 		{ { 0, 2147483647 } },
2787 	},
2788 	{
2789 		"ALU64_ADD_K: 4294967294 + 2 = 4294967296",
2790 		.u.insns_int = {
2791 			BPF_LD_IMM64(R0, 4294967294U),
2792 			BPF_LD_IMM64(R1, 4294967296ULL),
2793 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2794 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
2795 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2796 			BPF_EXIT_INSN(),
2797 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2798 			BPF_EXIT_INSN(),
2799 		},
2800 		INTERNAL,
2801 		{ },
2802 		{ { 0, 1 } },
2803 	},
2804 	{
2805 		"ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2806 		.u.insns_int = {
2807 			BPF_LD_IMM64(R0, 2147483646),
2808 			BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2809 			BPF_EXIT_INSN(),
2810 		},
2811 		INTERNAL,
2812 		{ },
2813 		{ { 0, -1 } },
2814 	},
2815 	{
2816 		"ALU64_ADD_K: 1 + 0 = 1",
2817 		.u.insns_int = {
2818 			BPF_LD_IMM64(R2, 0x1),
2819 			BPF_LD_IMM64(R3, 0x1),
2820 			BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2821 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2822 			BPF_MOV32_IMM(R0, 2),
2823 			BPF_EXIT_INSN(),
2824 			BPF_MOV32_IMM(R0, 1),
2825 			BPF_EXIT_INSN(),
2826 		},
2827 		INTERNAL,
2828 		{ },
2829 		{ { 0, 0x1 } },
2830 	},
2831 	{
2832 		"ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2833 		.u.insns_int = {
2834 			BPF_LD_IMM64(R2, 0x0),
2835 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2836 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2837 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2838 			BPF_MOV32_IMM(R0, 2),
2839 			BPF_EXIT_INSN(),
2840 			BPF_MOV32_IMM(R0, 1),
2841 			BPF_EXIT_INSN(),
2842 		},
2843 		INTERNAL,
2844 		{ },
2845 		{ { 0, 0x1 } },
2846 	},
2847 	{
2848 		"ALU64_ADD_K: 0 + 0xffff = 0xffff",
2849 		.u.insns_int = {
2850 			BPF_LD_IMM64(R2, 0x0),
2851 			BPF_LD_IMM64(R3, 0xffff),
2852 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
2853 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2854 			BPF_MOV32_IMM(R0, 2),
2855 			BPF_EXIT_INSN(),
2856 			BPF_MOV32_IMM(R0, 1),
2857 			BPF_EXIT_INSN(),
2858 		},
2859 		INTERNAL,
2860 		{ },
2861 		{ { 0, 0x1 } },
2862 	},
2863 	{
2864 		"ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2865 		.u.insns_int = {
2866 			BPF_LD_IMM64(R2, 0x0),
2867 			BPF_LD_IMM64(R3, 0x7fffffff),
2868 			BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
2869 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2870 			BPF_MOV32_IMM(R0, 2),
2871 			BPF_EXIT_INSN(),
2872 			BPF_MOV32_IMM(R0, 1),
2873 			BPF_EXIT_INSN(),
2874 		},
2875 		INTERNAL,
2876 		{ },
2877 		{ { 0, 0x1 } },
2878 	},
2879 	{
2880 		"ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
2881 		.u.insns_int = {
2882 			BPF_LD_IMM64(R2, 0x0),
2883 			BPF_LD_IMM64(R3, 0xffffffff80000000LL),
2884 			BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
2885 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2886 			BPF_MOV32_IMM(R0, 2),
2887 			BPF_EXIT_INSN(),
2888 			BPF_MOV32_IMM(R0, 1),
2889 			BPF_EXIT_INSN(),
2890 		},
2891 		INTERNAL,
2892 		{ },
2893 		{ { 0, 0x1 } },
2894 	},
2895 	{
2896 		"ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
2897 		.u.insns_int = {
2898 			BPF_LD_IMM64(R2, 0x0),
2899 			BPF_LD_IMM64(R3, 0xffffffff80008000LL),
2900 			BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
2901 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2902 			BPF_MOV32_IMM(R0, 2),
2903 			BPF_EXIT_INSN(),
2904 			BPF_MOV32_IMM(R0, 1),
2905 			BPF_EXIT_INSN(),
2906 		},
2907 		INTERNAL,
2908 		{ },
2909 		{ { 0, 0x1 } },
2910 	},
2911 	/* BPF_ALU | BPF_SUB | BPF_X */
2912 	{
2913 		"ALU_SUB_X: 3 - 1 = 2",
2914 		.u.insns_int = {
2915 			BPF_LD_IMM64(R0, 3),
2916 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2917 			BPF_ALU32_REG(BPF_SUB, R0, R1),
2918 			BPF_EXIT_INSN(),
2919 		},
2920 		INTERNAL,
2921 		{ },
2922 		{ { 0, 2 } },
2923 	},
2924 	{
2925 		"ALU_SUB_X: 4294967295 - 4294967294 = 1",
2926 		.u.insns_int = {
2927 			BPF_LD_IMM64(R0, 4294967295U),
2928 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2929 			BPF_ALU32_REG(BPF_SUB, R0, R1),
2930 			BPF_EXIT_INSN(),
2931 		},
2932 		INTERNAL,
2933 		{ },
2934 		{ { 0, 1 } },
2935 	},
2936 	{
2937 		"ALU64_SUB_X: 3 - 1 = 2",
2938 		.u.insns_int = {
2939 			BPF_LD_IMM64(R0, 3),
2940 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2941 			BPF_ALU64_REG(BPF_SUB, R0, R1),
2942 			BPF_EXIT_INSN(),
2943 		},
2944 		INTERNAL,
2945 		{ },
2946 		{ { 0, 2 } },
2947 	},
2948 	{
2949 		"ALU64_SUB_X: 4294967295 - 4294967294 = 1",
2950 		.u.insns_int = {
2951 			BPF_LD_IMM64(R0, 4294967295U),
2952 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2953 			BPF_ALU64_REG(BPF_SUB, R0, R1),
2954 			BPF_EXIT_INSN(),
2955 		},
2956 		INTERNAL,
2957 		{ },
2958 		{ { 0, 1 } },
2959 	},
2960 	/* BPF_ALU | BPF_SUB | BPF_K */
2961 	{
2962 		"ALU_SUB_K: 3 - 1 = 2",
2963 		.u.insns_int = {
2964 			BPF_LD_IMM64(R0, 3),
2965 			BPF_ALU32_IMM(BPF_SUB, R0, 1),
2966 			BPF_EXIT_INSN(),
2967 		},
2968 		INTERNAL,
2969 		{ },
2970 		{ { 0, 2 } },
2971 	},
2972 	{
2973 		"ALU_SUB_K: 3 - 0 = 3",
2974 		.u.insns_int = {
2975 			BPF_LD_IMM64(R0, 3),
2976 			BPF_ALU32_IMM(BPF_SUB, R0, 0),
2977 			BPF_EXIT_INSN(),
2978 		},
2979 		INTERNAL,
2980 		{ },
2981 		{ { 0, 3 } },
2982 	},
2983 	{
2984 		"ALU_SUB_K: 4294967295 - 4294967294 = 1",
2985 		.u.insns_int = {
2986 			BPF_LD_IMM64(R0, 4294967295U),
2987 			BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
2988 			BPF_EXIT_INSN(),
2989 		},
2990 		INTERNAL,
2991 		{ },
2992 		{ { 0, 1 } },
2993 	},
2994 	{
2995 		"ALU64_SUB_K: 3 - 1 = 2",
2996 		.u.insns_int = {
2997 			BPF_LD_IMM64(R0, 3),
2998 			BPF_ALU64_IMM(BPF_SUB, R0, 1),
2999 			BPF_EXIT_INSN(),
3000 		},
3001 		INTERNAL,
3002 		{ },
3003 		{ { 0, 2 } },
3004 	},
3005 	{
3006 		"ALU64_SUB_K: 3 - 0 = 3",
3007 		.u.insns_int = {
3008 			BPF_LD_IMM64(R0, 3),
3009 			BPF_ALU64_IMM(BPF_SUB, R0, 0),
3010 			BPF_EXIT_INSN(),
3011 		},
3012 		INTERNAL,
3013 		{ },
3014 		{ { 0, 3 } },
3015 	},
3016 	{
3017 		"ALU64_SUB_K: 4294967294 - 4294967295 = -1",
3018 		.u.insns_int = {
3019 			BPF_LD_IMM64(R0, 4294967294U),
3020 			BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
3021 			BPF_EXIT_INSN(),
3022 		},
3023 		INTERNAL,
3024 		{ },
3025 		{ { 0, -1 } },
3026 	},
3027 	{
3028 		"ALU64_ADD_K: 2147483646 - 2147483647 = -1",
3029 		.u.insns_int = {
3030 			BPF_LD_IMM64(R0, 2147483646),
3031 			BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
3032 			BPF_EXIT_INSN(),
3033 		},
3034 		INTERNAL,
3035 		{ },
3036 		{ { 0, -1 } },
3037 	},
3038 	/* BPF_ALU | BPF_MUL | BPF_X */
3039 	{
3040 		"ALU_MUL_X: 2 * 3 = 6",
3041 		.u.insns_int = {
3042 			BPF_LD_IMM64(R0, 2),
3043 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
3044 			BPF_ALU32_REG(BPF_MUL, R0, R1),
3045 			BPF_EXIT_INSN(),
3046 		},
3047 		INTERNAL,
3048 		{ },
3049 		{ { 0, 6 } },
3050 	},
3051 	{
3052 		"ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
3053 		.u.insns_int = {
3054 			BPF_LD_IMM64(R0, 2),
3055 			BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
3056 			BPF_ALU32_REG(BPF_MUL, R0, R1),
3057 			BPF_EXIT_INSN(),
3058 		},
3059 		INTERNAL,
3060 		{ },
3061 		{ { 0, 0xFFFFFFF0 } },
3062 	},
3063 	{
3064 		"ALU_MUL_X: -1 * -1 = 1",
3065 		.u.insns_int = {
3066 			BPF_LD_IMM64(R0, -1),
3067 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
3068 			BPF_ALU32_REG(BPF_MUL, R0, R1),
3069 			BPF_EXIT_INSN(),
3070 		},
3071 		INTERNAL,
3072 		{ },
3073 		{ { 0, 1 } },
3074 	},
3075 	{
3076 		"ALU64_MUL_X: 2 * 3 = 6",
3077 		.u.insns_int = {
3078 			BPF_LD_IMM64(R0, 2),
3079 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
3080 			BPF_ALU64_REG(BPF_MUL, R0, R1),
3081 			BPF_EXIT_INSN(),
3082 		},
3083 		INTERNAL,
3084 		{ },
3085 		{ { 0, 6 } },
3086 	},
3087 	{
3088 		"ALU64_MUL_X: 1 * 2147483647 = 2147483647",
3089 		.u.insns_int = {
3090 			BPF_LD_IMM64(R0, 1),
3091 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3092 			BPF_ALU64_REG(BPF_MUL, R0, R1),
3093 			BPF_EXIT_INSN(),
3094 		},
3095 		INTERNAL,
3096 		{ },
3097 		{ { 0, 2147483647 } },
3098 	},
3099 	/* BPF_ALU | BPF_MUL | BPF_K */
3100 	{
3101 		"ALU_MUL_K: 2 * 3 = 6",
3102 		.u.insns_int = {
3103 			BPF_LD_IMM64(R0, 2),
3104 			BPF_ALU32_IMM(BPF_MUL, R0, 3),
3105 			BPF_EXIT_INSN(),
3106 		},
3107 		INTERNAL,
3108 		{ },
3109 		{ { 0, 6 } },
3110 	},
3111 	{
3112 		"ALU_MUL_K: 3 * 1 = 3",
3113 		.u.insns_int = {
3114 			BPF_LD_IMM64(R0, 3),
3115 			BPF_ALU32_IMM(BPF_MUL, R0, 1),
3116 			BPF_EXIT_INSN(),
3117 		},
3118 		INTERNAL,
3119 		{ },
3120 		{ { 0, 3 } },
3121 	},
3122 	{
3123 		"ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
3124 		.u.insns_int = {
3125 			BPF_LD_IMM64(R0, 2),
3126 			BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
3127 			BPF_EXIT_INSN(),
3128 		},
3129 		INTERNAL,
3130 		{ },
3131 		{ { 0, 0xFFFFFFF0 } },
3132 	},
3133 	{
3134 		"ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
3135 		.u.insns_int = {
3136 			BPF_LD_IMM64(R2, 0x1),
3137 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
3138 			BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
3139 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3140 			BPF_MOV32_IMM(R0, 2),
3141 			BPF_EXIT_INSN(),
3142 			BPF_MOV32_IMM(R0, 1),
3143 			BPF_EXIT_INSN(),
3144 		},
3145 		INTERNAL,
3146 		{ },
3147 		{ { 0, 0x1 } },
3148 	},
3149 	{
3150 		"ALU64_MUL_K: 2 * 3 = 6",
3151 		.u.insns_int = {
3152 			BPF_LD_IMM64(R0, 2),
3153 			BPF_ALU64_IMM(BPF_MUL, R0, 3),
3154 			BPF_EXIT_INSN(),
3155 		},
3156 		INTERNAL,
3157 		{ },
3158 		{ { 0, 6 } },
3159 	},
3160 	{
3161 		"ALU64_MUL_K: 3 * 1 = 3",
3162 		.u.insns_int = {
3163 			BPF_LD_IMM64(R0, 3),
3164 			BPF_ALU64_IMM(BPF_MUL, R0, 1),
3165 			BPF_EXIT_INSN(),
3166 		},
3167 		INTERNAL,
3168 		{ },
3169 		{ { 0, 3 } },
3170 	},
3171 	{
3172 		"ALU64_MUL_K: 1 * 2147483647 = 2147483647",
3173 		.u.insns_int = {
3174 			BPF_LD_IMM64(R0, 1),
3175 			BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
3176 			BPF_EXIT_INSN(),
3177 		},
3178 		INTERNAL,
3179 		{ },
3180 		{ { 0, 2147483647 } },
3181 	},
3182 	{
3183 		"ALU64_MUL_K: 1 * -2147483647 = -2147483647",
3184 		.u.insns_int = {
3185 			BPF_LD_IMM64(R0, 1),
3186 			BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
3187 			BPF_EXIT_INSN(),
3188 		},
3189 		INTERNAL,
3190 		{ },
3191 		{ { 0, -2147483647 } },
3192 	},
3193 	{
3194 		"ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
3195 		.u.insns_int = {
3196 			BPF_LD_IMM64(R2, 0x1),
3197 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3198 			BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
3199 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3200 			BPF_MOV32_IMM(R0, 2),
3201 			BPF_EXIT_INSN(),
3202 			BPF_MOV32_IMM(R0, 1),
3203 			BPF_EXIT_INSN(),
3204 		},
3205 		INTERNAL,
3206 		{ },
3207 		{ { 0, 0x1 } },
3208 	},
3209 	/* BPF_ALU | BPF_DIV | BPF_X */
3210 	{
3211 		"ALU_DIV_X: 6 / 2 = 3",
3212 		.u.insns_int = {
3213 			BPF_LD_IMM64(R0, 6),
3214 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3215 			BPF_ALU32_REG(BPF_DIV, R0, R1),
3216 			BPF_EXIT_INSN(),
3217 		},
3218 		INTERNAL,
3219 		{ },
3220 		{ { 0, 3 } },
3221 	},
3222 	{
3223 		"ALU_DIV_X: 4294967295 / 4294967295 = 1",
3224 		.u.insns_int = {
3225 			BPF_LD_IMM64(R0, 4294967295U),
3226 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
3227 			BPF_ALU32_REG(BPF_DIV, R0, R1),
3228 			BPF_EXIT_INSN(),
3229 		},
3230 		INTERNAL,
3231 		{ },
3232 		{ { 0, 1 } },
3233 	},
3234 	{
3235 		"ALU64_DIV_X: 6 / 2 = 3",
3236 		.u.insns_int = {
3237 			BPF_LD_IMM64(R0, 6),
3238 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3239 			BPF_ALU64_REG(BPF_DIV, R0, R1),
3240 			BPF_EXIT_INSN(),
3241 		},
3242 		INTERNAL,
3243 		{ },
3244 		{ { 0, 3 } },
3245 	},
3246 	{
3247 		"ALU64_DIV_X: 2147483647 / 2147483647 = 1",
3248 		.u.insns_int = {
3249 			BPF_LD_IMM64(R0, 2147483647),
3250 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3251 			BPF_ALU64_REG(BPF_DIV, R0, R1),
3252 			BPF_EXIT_INSN(),
3253 		},
3254 		INTERNAL,
3255 		{ },
3256 		{ { 0, 1 } },
3257 	},
3258 	{
3259 		"ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3260 		.u.insns_int = {
3261 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3262 			BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
3263 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
3264 			BPF_ALU64_REG(BPF_DIV, R2, R4),
3265 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3266 			BPF_MOV32_IMM(R0, 2),
3267 			BPF_EXIT_INSN(),
3268 			BPF_MOV32_IMM(R0, 1),
3269 			BPF_EXIT_INSN(),
3270 		},
3271 		INTERNAL,
3272 		{ },
3273 		{ { 0, 0x1 } },
3274 	},
3275 	/* BPF_ALU | BPF_DIV | BPF_K */
3276 	{
3277 		"ALU_DIV_K: 6 / 2 = 3",
3278 		.u.insns_int = {
3279 			BPF_LD_IMM64(R0, 6),
3280 			BPF_ALU32_IMM(BPF_DIV, R0, 2),
3281 			BPF_EXIT_INSN(),
3282 		},
3283 		INTERNAL,
3284 		{ },
3285 		{ { 0, 3 } },
3286 	},
3287 	{
3288 		"ALU_DIV_K: 3 / 1 = 3",
3289 		.u.insns_int = {
3290 			BPF_LD_IMM64(R0, 3),
3291 			BPF_ALU32_IMM(BPF_DIV, R0, 1),
3292 			BPF_EXIT_INSN(),
3293 		},
3294 		INTERNAL,
3295 		{ },
3296 		{ { 0, 3 } },
3297 	},
3298 	{
3299 		"ALU_DIV_K: 4294967295 / 4294967295 = 1",
3300 		.u.insns_int = {
3301 			BPF_LD_IMM64(R0, 4294967295U),
3302 			BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
3303 			BPF_EXIT_INSN(),
3304 		},
3305 		INTERNAL,
3306 		{ },
3307 		{ { 0, 1 } },
3308 	},
3309 	{
3310 		"ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
3311 		.u.insns_int = {
3312 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3313 			BPF_LD_IMM64(R3, 0x1UL),
3314 			BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
3315 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3316 			BPF_MOV32_IMM(R0, 2),
3317 			BPF_EXIT_INSN(),
3318 			BPF_MOV32_IMM(R0, 1),
3319 			BPF_EXIT_INSN(),
3320 		},
3321 		INTERNAL,
3322 		{ },
3323 		{ { 0, 0x1 } },
3324 	},
3325 	{
3326 		"ALU64_DIV_K: 6 / 2 = 3",
3327 		.u.insns_int = {
3328 			BPF_LD_IMM64(R0, 6),
3329 			BPF_ALU64_IMM(BPF_DIV, R0, 2),
3330 			BPF_EXIT_INSN(),
3331 		},
3332 		INTERNAL,
3333 		{ },
3334 		{ { 0, 3 } },
3335 	},
3336 	{
3337 		"ALU64_DIV_K: 3 / 1 = 3",
3338 		.u.insns_int = {
3339 			BPF_LD_IMM64(R0, 3),
3340 			BPF_ALU64_IMM(BPF_DIV, R0, 1),
3341 			BPF_EXIT_INSN(),
3342 		},
3343 		INTERNAL,
3344 		{ },
3345 		{ { 0, 3 } },
3346 	},
3347 	{
3348 		"ALU64_DIV_K: 2147483647 / 2147483647 = 1",
3349 		.u.insns_int = {
3350 			BPF_LD_IMM64(R0, 2147483647),
3351 			BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
3352 			BPF_EXIT_INSN(),
3353 		},
3354 		INTERNAL,
3355 		{ },
3356 		{ { 0, 1 } },
3357 	},
3358 	{
3359 		"ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3360 		.u.insns_int = {
3361 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3362 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
3363 			BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
3364 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3365 			BPF_MOV32_IMM(R0, 2),
3366 			BPF_EXIT_INSN(),
3367 			BPF_MOV32_IMM(R0, 1),
3368 			BPF_EXIT_INSN(),
3369 		},
3370 		INTERNAL,
3371 		{ },
3372 		{ { 0, 0x1 } },
3373 	},
3374 	/* BPF_ALU | BPF_MOD | BPF_X */
3375 	{
3376 		"ALU_MOD_X: 3 % 2 = 1",
3377 		.u.insns_int = {
3378 			BPF_LD_IMM64(R0, 3),
3379 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3380 			BPF_ALU32_REG(BPF_MOD, R0, R1),
3381 			BPF_EXIT_INSN(),
3382 		},
3383 		INTERNAL,
3384 		{ },
3385 		{ { 0, 1 } },
3386 	},
3387 	{
3388 		"ALU_MOD_X: 4294967295 % 4294967293 = 2",
3389 		.u.insns_int = {
3390 			BPF_LD_IMM64(R0, 4294967295U),
3391 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
3392 			BPF_ALU32_REG(BPF_MOD, R0, R1),
3393 			BPF_EXIT_INSN(),
3394 		},
3395 		INTERNAL,
3396 		{ },
3397 		{ { 0, 2 } },
3398 	},
3399 	{
3400 		"ALU64_MOD_X: 3 % 2 = 1",
3401 		.u.insns_int = {
3402 			BPF_LD_IMM64(R0, 3),
3403 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3404 			BPF_ALU64_REG(BPF_MOD, R0, R1),
3405 			BPF_EXIT_INSN(),
3406 		},
3407 		INTERNAL,
3408 		{ },
3409 		{ { 0, 1 } },
3410 	},
3411 	{
3412 		"ALU64_MOD_X: 2147483647 % 2147483645 = 2",
3413 		.u.insns_int = {
3414 			BPF_LD_IMM64(R0, 2147483647),
3415 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
3416 			BPF_ALU64_REG(BPF_MOD, R0, R1),
3417 			BPF_EXIT_INSN(),
3418 		},
3419 		INTERNAL,
3420 		{ },
3421 		{ { 0, 2 } },
3422 	},
3423 	/* BPF_ALU | BPF_MOD | BPF_K */
3424 	{
3425 		"ALU_MOD_K: 3 % 2 = 1",
3426 		.u.insns_int = {
3427 			BPF_LD_IMM64(R0, 3),
3428 			BPF_ALU32_IMM(BPF_MOD, R0, 2),
3429 			BPF_EXIT_INSN(),
3430 		},
3431 		INTERNAL,
3432 		{ },
3433 		{ { 0, 1 } },
3434 	},
3435 	{
3436 		"ALU_MOD_K: 3 % 1 = 0",
3437 		.u.insns_int = {
3438 			BPF_LD_IMM64(R0, 3),
3439 			BPF_ALU32_IMM(BPF_MOD, R0, 1),
3440 			BPF_EXIT_INSN(),
3441 		},
3442 		INTERNAL,
3443 		{ },
3444 		{ { 0, 0 } },
3445 	},
3446 	{
3447 		"ALU_MOD_K: 4294967295 % 4294967293 = 2",
3448 		.u.insns_int = {
3449 			BPF_LD_IMM64(R0, 4294967295U),
3450 			BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
3451 			BPF_EXIT_INSN(),
3452 		},
3453 		INTERNAL,
3454 		{ },
3455 		{ { 0, 2 } },
3456 	},
3457 	{
3458 		"ALU64_MOD_K: 3 % 2 = 1",
3459 		.u.insns_int = {
3460 			BPF_LD_IMM64(R0, 3),
3461 			BPF_ALU64_IMM(BPF_MOD, R0, 2),
3462 			BPF_EXIT_INSN(),
3463 		},
3464 		INTERNAL,
3465 		{ },
3466 		{ { 0, 1 } },
3467 	},
3468 	{
3469 		"ALU64_MOD_K: 3 % 1 = 0",
3470 		.u.insns_int = {
3471 			BPF_LD_IMM64(R0, 3),
3472 			BPF_ALU64_IMM(BPF_MOD, R0, 1),
3473 			BPF_EXIT_INSN(),
3474 		},
3475 		INTERNAL,
3476 		{ },
3477 		{ { 0, 0 } },
3478 	},
3479 	{
3480 		"ALU64_MOD_K: 2147483647 % 2147483645 = 2",
3481 		.u.insns_int = {
3482 			BPF_LD_IMM64(R0, 2147483647),
3483 			BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
3484 			BPF_EXIT_INSN(),
3485 		},
3486 		INTERNAL,
3487 		{ },
3488 		{ { 0, 2 } },
3489 	},
3490 	/* BPF_ALU | BPF_AND | BPF_X */
3491 	{
3492 		"ALU_AND_X: 3 & 2 = 2",
3493 		.u.insns_int = {
3494 			BPF_LD_IMM64(R0, 3),
3495 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3496 			BPF_ALU32_REG(BPF_AND, R0, R1),
3497 			BPF_EXIT_INSN(),
3498 		},
3499 		INTERNAL,
3500 		{ },
3501 		{ { 0, 2 } },
3502 	},
3503 	{
3504 		"ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3505 		.u.insns_int = {
3506 			BPF_LD_IMM64(R0, 0xffffffff),
3507 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3508 			BPF_ALU32_REG(BPF_AND, R0, R1),
3509 			BPF_EXIT_INSN(),
3510 		},
3511 		INTERNAL,
3512 		{ },
3513 		{ { 0, 0xffffffff } },
3514 	},
3515 	{
3516 		"ALU64_AND_X: 3 & 2 = 2",
3517 		.u.insns_int = {
3518 			BPF_LD_IMM64(R0, 3),
3519 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3520 			BPF_ALU64_REG(BPF_AND, R0, R1),
3521 			BPF_EXIT_INSN(),
3522 		},
3523 		INTERNAL,
3524 		{ },
3525 		{ { 0, 2 } },
3526 	},
3527 	{
3528 		"ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3529 		.u.insns_int = {
3530 			BPF_LD_IMM64(R0, 0xffffffff),
3531 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3532 			BPF_ALU64_REG(BPF_AND, R0, R1),
3533 			BPF_EXIT_INSN(),
3534 		},
3535 		INTERNAL,
3536 		{ },
3537 		{ { 0, 0xffffffff } },
3538 	},
3539 	/* BPF_ALU | BPF_AND | BPF_K */
3540 	{
3541 		"ALU_AND_K: 3 & 2 = 2",
3542 		.u.insns_int = {
3543 			BPF_LD_IMM64(R0, 3),
3544 			BPF_ALU32_IMM(BPF_AND, R0, 2),
3545 			BPF_EXIT_INSN(),
3546 		},
3547 		INTERNAL,
3548 		{ },
3549 		{ { 0, 2 } },
3550 	},
3551 	{
3552 		"ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3553 		.u.insns_int = {
3554 			BPF_LD_IMM64(R0, 0xffffffff),
3555 			BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
3556 			BPF_EXIT_INSN(),
3557 		},
3558 		INTERNAL,
3559 		{ },
3560 		{ { 0, 0xffffffff } },
3561 	},
3562 	{
3563 		"ALU64_AND_K: 3 & 2 = 2",
3564 		.u.insns_int = {
3565 			BPF_LD_IMM64(R0, 3),
3566 			BPF_ALU64_IMM(BPF_AND, R0, 2),
3567 			BPF_EXIT_INSN(),
3568 		},
3569 		INTERNAL,
3570 		{ },
3571 		{ { 0, 2 } },
3572 	},
3573 	{
3574 		"ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3575 		.u.insns_int = {
3576 			BPF_LD_IMM64(R0, 0xffffffff),
3577 			BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
3578 			BPF_EXIT_INSN(),
3579 		},
3580 		INTERNAL,
3581 		{ },
3582 		{ { 0, 0xffffffff } },
3583 	},
3584 	{
3585 		"ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000ffff00000000",
3586 		.u.insns_int = {
3587 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3588 			BPF_LD_IMM64(R3, 0x0000000000000000LL),
3589 			BPF_ALU64_IMM(BPF_AND, R2, 0x0),
3590 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3591 			BPF_MOV32_IMM(R0, 2),
3592 			BPF_EXIT_INSN(),
3593 			BPF_MOV32_IMM(R0, 1),
3594 			BPF_EXIT_INSN(),
3595 		},
3596 		INTERNAL,
3597 		{ },
3598 		{ { 0, 0x1 } },
3599 	},
3600 	{
3601 		"ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffffffff",
3602 		.u.insns_int = {
3603 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3604 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3605 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3606 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3607 			BPF_MOV32_IMM(R0, 2),
3608 			BPF_EXIT_INSN(),
3609 			BPF_MOV32_IMM(R0, 1),
3610 			BPF_EXIT_INSN(),
3611 		},
3612 		INTERNAL,
3613 		{ },
3614 		{ { 0, 0x1 } },
3615 	},
3616 	{
3617 		"ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3618 		.u.insns_int = {
3619 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3620 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3621 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3622 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3623 			BPF_MOV32_IMM(R0, 2),
3624 			BPF_EXIT_INSN(),
3625 			BPF_MOV32_IMM(R0, 1),
3626 			BPF_EXIT_INSN(),
3627 		},
3628 		INTERNAL,
3629 		{ },
3630 		{ { 0, 0x1 } },
3631 	},
3632 	/* BPF_ALU | BPF_OR | BPF_X */
3633 	{
3634 		"ALU_OR_X: 1 | 2 = 3",
3635 		.u.insns_int = {
3636 			BPF_LD_IMM64(R0, 1),
3637 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3638 			BPF_ALU32_REG(BPF_OR, R0, R1),
3639 			BPF_EXIT_INSN(),
3640 		},
3641 		INTERNAL,
3642 		{ },
3643 		{ { 0, 3 } },
3644 	},
3645 	{
3646 		"ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3647 		.u.insns_int = {
3648 			BPF_LD_IMM64(R0, 0),
3649 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3650 			BPF_ALU32_REG(BPF_OR, R0, R1),
3651 			BPF_EXIT_INSN(),
3652 		},
3653 		INTERNAL,
3654 		{ },
3655 		{ { 0, 0xffffffff } },
3656 	},
3657 	{
3658 		"ALU64_OR_X: 1 | 2 = 3",
3659 		.u.insns_int = {
3660 			BPF_LD_IMM64(R0, 1),
3661 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3662 			BPF_ALU64_REG(BPF_OR, R0, R1),
3663 			BPF_EXIT_INSN(),
3664 		},
3665 		INTERNAL,
3666 		{ },
3667 		{ { 0, 3 } },
3668 	},
3669 	{
3670 		"ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3671 		.u.insns_int = {
3672 			BPF_LD_IMM64(R0, 0),
3673 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3674 			BPF_ALU64_REG(BPF_OR, R0, R1),
3675 			BPF_EXIT_INSN(),
3676 		},
3677 		INTERNAL,
3678 		{ },
3679 		{ { 0, 0xffffffff } },
3680 	},
3681 	/* BPF_ALU | BPF_OR | BPF_K */
3682 	{
3683 		"ALU_OR_K: 1 | 2 = 3",
3684 		.u.insns_int = {
3685 			BPF_LD_IMM64(R0, 1),
3686 			BPF_ALU32_IMM(BPF_OR, R0, 2),
3687 			BPF_EXIT_INSN(),
3688 		},
3689 		INTERNAL,
3690 		{ },
3691 		{ { 0, 3 } },
3692 	},
3693 	{
3694 		"ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3695 		.u.insns_int = {
3696 			BPF_LD_IMM64(R0, 0),
3697 			BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3698 			BPF_EXIT_INSN(),
3699 		},
3700 		INTERNAL,
3701 		{ },
3702 		{ { 0, 0xffffffff } },
3703 	},
3704 	{
3705 		"ALU64_OR_K: 1 | 2 = 3",
3706 		.u.insns_int = {
3707 			BPF_LD_IMM64(R0, 1),
3708 			BPF_ALU64_IMM(BPF_OR, R0, 2),
3709 			BPF_EXIT_INSN(),
3710 		},
3711 		INTERNAL,
3712 		{ },
3713 		{ { 0, 3 } },
3714 	},
3715 	{
3716 		"ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
3717 		.u.insns_int = {
3718 			BPF_LD_IMM64(R0, 0),
3719 			BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
3720 			BPF_EXIT_INSN(),
3721 		},
3722 		INTERNAL,
3723 		{ },
3724 		{ { 0, 0xffffffff } },
3725 	},
3726 	{
3727 		"ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffff00000000",
3728 		.u.insns_int = {
3729 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3730 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3731 			BPF_ALU64_IMM(BPF_OR, R2, 0x0),
3732 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3733 			BPF_MOV32_IMM(R0, 2),
3734 			BPF_EXIT_INSN(),
3735 			BPF_MOV32_IMM(R0, 1),
3736 			BPF_EXIT_INSN(),
3737 		},
3738 		INTERNAL,
3739 		{ },
3740 		{ { 0, 0x1 } },
3741 	},
3742 	{
3743 		"ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
3744 		.u.insns_int = {
3745 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3746 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3747 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3748 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3749 			BPF_MOV32_IMM(R0, 2),
3750 			BPF_EXIT_INSN(),
3751 			BPF_MOV32_IMM(R0, 1),
3752 			BPF_EXIT_INSN(),
3753 		},
3754 		INTERNAL,
3755 		{ },
3756 		{ { 0, 0x1 } },
3757 	},
3758 	{
3759 		"ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
3760 		.u.insns_int = {
3761 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3762 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3763 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3764 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3765 			BPF_MOV32_IMM(R0, 2),
3766 			BPF_EXIT_INSN(),
3767 			BPF_MOV32_IMM(R0, 1),
3768 			BPF_EXIT_INSN(),
3769 		},
3770 		INTERNAL,
3771 		{ },
3772 		{ { 0, 0x1 } },
3773 	},
3774 	/* BPF_ALU | BPF_XOR | BPF_X */
3775 	{
3776 		"ALU_XOR_X: 5 ^ 6 = 3",
3777 		.u.insns_int = {
3778 			BPF_LD_IMM64(R0, 5),
3779 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3780 			BPF_ALU32_REG(BPF_XOR, R0, R1),
3781 			BPF_EXIT_INSN(),
3782 		},
3783 		INTERNAL,
3784 		{ },
3785 		{ { 0, 3 } },
3786 	},
3787 	{
3788 		"ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
3789 		.u.insns_int = {
3790 			BPF_LD_IMM64(R0, 1),
3791 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3792 			BPF_ALU32_REG(BPF_XOR, R0, R1),
3793 			BPF_EXIT_INSN(),
3794 		},
3795 		INTERNAL,
3796 		{ },
3797 		{ { 0, 0xfffffffe } },
3798 	},
3799 	{
3800 		"ALU64_XOR_X: 5 ^ 6 = 3",
3801 		.u.insns_int = {
3802 			BPF_LD_IMM64(R0, 5),
3803 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3804 			BPF_ALU64_REG(BPF_XOR, R0, R1),
3805 			BPF_EXIT_INSN(),
3806 		},
3807 		INTERNAL,
3808 		{ },
3809 		{ { 0, 3 } },
3810 	},
3811 	{
3812 		"ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
3813 		.u.insns_int = {
3814 			BPF_LD_IMM64(R0, 1),
3815 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3816 			BPF_ALU64_REG(BPF_XOR, R0, R1),
3817 			BPF_EXIT_INSN(),
3818 		},
3819 		INTERNAL,
3820 		{ },
3821 		{ { 0, 0xfffffffe } },
3822 	},
3823 	/* BPF_ALU | BPF_XOR | BPF_K */
3824 	{
3825 		"ALU_XOR_K: 5 ^ 6 = 3",
3826 		.u.insns_int = {
3827 			BPF_LD_IMM64(R0, 5),
3828 			BPF_ALU32_IMM(BPF_XOR, R0, 6),
3829 			BPF_EXIT_INSN(),
3830 		},
3831 		INTERNAL,
3832 		{ },
3833 		{ { 0, 3 } },
3834 	},
3835 	{
3836 		"ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
3837 		.u.insns_int = {
3838 			BPF_LD_IMM64(R0, 1),
3839 			BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
3840 			BPF_EXIT_INSN(),
3841 		},
3842 		INTERNAL,
3843 		{ },
3844 		{ { 0, 0xfffffffe } },
3845 	},
3846 	{
3847 		"ALU64_XOR_K: 5 ^ 6 = 3",
3848 		.u.insns_int = {
3849 			BPF_LD_IMM64(R0, 5),
3850 			BPF_ALU64_IMM(BPF_XOR, R0, 6),
3851 			BPF_EXIT_INSN(),
3852 		},
3853 		INTERNAL,
3854 		{ },
3855 		{ { 0, 3 } },
3856 	},
3857 	{
3858 		"ALU64_XOR_K: 1 & 0xffffffff = 0xfffffffe",
3859 		.u.insns_int = {
3860 			BPF_LD_IMM64(R0, 1),
3861 			BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
3862 			BPF_EXIT_INSN(),
3863 		},
3864 		INTERNAL,
3865 		{ },
3866 		{ { 0, 0xfffffffe } },
3867 	},
3868 	{
3869 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
3870 		.u.insns_int = {
3871 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3872 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3873 			BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
3874 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3875 			BPF_MOV32_IMM(R0, 2),
3876 			BPF_EXIT_INSN(),
3877 			BPF_MOV32_IMM(R0, 1),
3878 			BPF_EXIT_INSN(),
3879 		},
3880 		INTERNAL,
3881 		{ },
3882 		{ { 0, 0x1 } },
3883 	},
3884 	{
3885 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
3886 		.u.insns_int = {
3887 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3888 			BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
3889 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3890 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3891 			BPF_MOV32_IMM(R0, 2),
3892 			BPF_EXIT_INSN(),
3893 			BPF_MOV32_IMM(R0, 1),
3894 			BPF_EXIT_INSN(),
3895 		},
3896 		INTERNAL,
3897 		{ },
3898 		{ { 0, 0x1 } },
3899 	},
3900 	{
3901 		"ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
3902 		.u.insns_int = {
3903 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3904 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3905 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3906 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3907 			BPF_MOV32_IMM(R0, 2),
3908 			BPF_EXIT_INSN(),
3909 			BPF_MOV32_IMM(R0, 1),
3910 			BPF_EXIT_INSN(),
3911 		},
3912 		INTERNAL,
3913 		{ },
3914 		{ { 0, 0x1 } },
3915 	},
3916 	/* BPF_ALU | BPF_LSH | BPF_X */
3917 	{
3918 		"ALU_LSH_X: 1 << 1 = 2",
3919 		.u.insns_int = {
3920 			BPF_LD_IMM64(R0, 1),
3921 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3922 			BPF_ALU32_REG(BPF_LSH, R0, R1),
3923 			BPF_EXIT_INSN(),
3924 		},
3925 		INTERNAL,
3926 		{ },
3927 		{ { 0, 2 } },
3928 	},
3929 	{
3930 		"ALU_LSH_X: 1 << 31 = 0x80000000",
3931 		.u.insns_int = {
3932 			BPF_LD_IMM64(R0, 1),
3933 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3934 			BPF_ALU32_REG(BPF_LSH, R0, R1),
3935 			BPF_EXIT_INSN(),
3936 		},
3937 		INTERNAL,
3938 		{ },
3939 		{ { 0, 0x80000000 } },
3940 	},
3941 	{
3942 		"ALU64_LSH_X: 1 << 1 = 2",
3943 		.u.insns_int = {
3944 			BPF_LD_IMM64(R0, 1),
3945 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3946 			BPF_ALU64_REG(BPF_LSH, R0, R1),
3947 			BPF_EXIT_INSN(),
3948 		},
3949 		INTERNAL,
3950 		{ },
3951 		{ { 0, 2 } },
3952 	},
3953 	{
3954 		"ALU64_LSH_X: 1 << 31 = 0x80000000",
3955 		.u.insns_int = {
3956 			BPF_LD_IMM64(R0, 1),
3957 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3958 			BPF_ALU64_REG(BPF_LSH, R0, R1),
3959 			BPF_EXIT_INSN(),
3960 		},
3961 		INTERNAL,
3962 		{ },
3963 		{ { 0, 0x80000000 } },
3964 	},
3965 	/* BPF_ALU | BPF_LSH | BPF_K */
3966 	{
3967 		"ALU_LSH_K: 1 << 1 = 2",
3968 		.u.insns_int = {
3969 			BPF_LD_IMM64(R0, 1),
3970 			BPF_ALU32_IMM(BPF_LSH, R0, 1),
3971 			BPF_EXIT_INSN(),
3972 		},
3973 		INTERNAL,
3974 		{ },
3975 		{ { 0, 2 } },
3976 	},
3977 	{
3978 		"ALU_LSH_K: 1 << 31 = 0x80000000",
3979 		.u.insns_int = {
3980 			BPF_LD_IMM64(R0, 1),
3981 			BPF_ALU32_IMM(BPF_LSH, R0, 31),
3982 			BPF_EXIT_INSN(),
3983 		},
3984 		INTERNAL,
3985 		{ },
3986 		{ { 0, 0x80000000 } },
3987 	},
3988 	{
3989 		"ALU64_LSH_K: 1 << 1 = 2",
3990 		.u.insns_int = {
3991 			BPF_LD_IMM64(R0, 1),
3992 			BPF_ALU64_IMM(BPF_LSH, R0, 1),
3993 			BPF_EXIT_INSN(),
3994 		},
3995 		INTERNAL,
3996 		{ },
3997 		{ { 0, 2 } },
3998 	},
3999 	{
4000 		"ALU64_LSH_K: 1 << 31 = 0x80000000",
4001 		.u.insns_int = {
4002 			BPF_LD_IMM64(R0, 1),
4003 			BPF_ALU64_IMM(BPF_LSH, R0, 31),
4004 			BPF_EXIT_INSN(),
4005 		},
4006 		INTERNAL,
4007 		{ },
4008 		{ { 0, 0x80000000 } },
4009 	},
4010 	/* BPF_ALU | BPF_RSH | BPF_X */
4011 	{
4012 		"ALU_RSH_X: 2 >> 1 = 1",
4013 		.u.insns_int = {
4014 			BPF_LD_IMM64(R0, 2),
4015 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
4016 			BPF_ALU32_REG(BPF_RSH, R0, R1),
4017 			BPF_EXIT_INSN(),
4018 		},
4019 		INTERNAL,
4020 		{ },
4021 		{ { 0, 1 } },
4022 	},
4023 	{
4024 		"ALU_RSH_X: 0x80000000 >> 31 = 1",
4025 		.u.insns_int = {
4026 			BPF_LD_IMM64(R0, 0x80000000),
4027 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
4028 			BPF_ALU32_REG(BPF_RSH, R0, R1),
4029 			BPF_EXIT_INSN(),
4030 		},
4031 		INTERNAL,
4032 		{ },
4033 		{ { 0, 1 } },
4034 	},
4035 	{
4036 		"ALU64_RSH_X: 2 >> 1 = 1",
4037 		.u.insns_int = {
4038 			BPF_LD_IMM64(R0, 2),
4039 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
4040 			BPF_ALU64_REG(BPF_RSH, R0, R1),
4041 			BPF_EXIT_INSN(),
4042 		},
4043 		INTERNAL,
4044 		{ },
4045 		{ { 0, 1 } },
4046 	},
4047 	{
4048 		"ALU64_RSH_X: 0x80000000 >> 31 = 1",
4049 		.u.insns_int = {
4050 			BPF_LD_IMM64(R0, 0x80000000),
4051 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
4052 			BPF_ALU64_REG(BPF_RSH, R0, R1),
4053 			BPF_EXIT_INSN(),
4054 		},
4055 		INTERNAL,
4056 		{ },
4057 		{ { 0, 1 } },
4058 	},
4059 	/* BPF_ALU | BPF_RSH | BPF_K */
4060 	{
4061 		"ALU_RSH_K: 2 >> 1 = 1",
4062 		.u.insns_int = {
4063 			BPF_LD_IMM64(R0, 2),
4064 			BPF_ALU32_IMM(BPF_RSH, R0, 1),
4065 			BPF_EXIT_INSN(),
4066 		},
4067 		INTERNAL,
4068 		{ },
4069 		{ { 0, 1 } },
4070 	},
4071 	{
4072 		"ALU_RSH_K: 0x80000000 >> 31 = 1",
4073 		.u.insns_int = {
4074 			BPF_LD_IMM64(R0, 0x80000000),
4075 			BPF_ALU32_IMM(BPF_RSH, R0, 31),
4076 			BPF_EXIT_INSN(),
4077 		},
4078 		INTERNAL,
4079 		{ },
4080 		{ { 0, 1 } },
4081 	},
4082 	{
4083 		"ALU64_RSH_K: 2 >> 1 = 1",
4084 		.u.insns_int = {
4085 			BPF_LD_IMM64(R0, 2),
4086 			BPF_ALU64_IMM(BPF_RSH, R0, 1),
4087 			BPF_EXIT_INSN(),
4088 		},
4089 		INTERNAL,
4090 		{ },
4091 		{ { 0, 1 } },
4092 	},
4093 	{
4094 		"ALU64_RSH_K: 0x80000000 >> 31 = 1",
4095 		.u.insns_int = {
4096 			BPF_LD_IMM64(R0, 0x80000000),
4097 			BPF_ALU64_IMM(BPF_RSH, R0, 31),
4098 			BPF_EXIT_INSN(),
4099 		},
4100 		INTERNAL,
4101 		{ },
4102 		{ { 0, 1 } },
4103 	},
4104 	/* BPF_ALU | BPF_ARSH | BPF_X */
4105 	{
4106 		"ALU_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
4107 		.u.insns_int = {
4108 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
4109 			BPF_ALU32_IMM(BPF_MOV, R1, 40),
4110 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
4111 			BPF_EXIT_INSN(),
4112 		},
4113 		INTERNAL,
4114 		{ },
4115 		{ { 0, 0xffff00ff } },
4116 	},
4117 	/* BPF_ALU | BPF_ARSH | BPF_K */
4118 	{
4119 		"ALU_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
4120 		.u.insns_int = {
4121 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
4122 			BPF_ALU64_IMM(BPF_ARSH, R0, 40),
4123 			BPF_EXIT_INSN(),
4124 		},
4125 		INTERNAL,
4126 		{ },
4127 		{ { 0, 0xffff00ff } },
4128 	},
4129 	/* BPF_ALU | BPF_NEG */
4130 	{
4131 		"ALU_NEG: -(3) = -3",
4132 		.u.insns_int = {
4133 			BPF_ALU32_IMM(BPF_MOV, R0, 3),
4134 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
4135 			BPF_EXIT_INSN(),
4136 		},
4137 		INTERNAL,
4138 		{ },
4139 		{ { 0, -3 } },
4140 	},
4141 	{
4142 		"ALU_NEG: -(-3) = 3",
4143 		.u.insns_int = {
4144 			BPF_ALU32_IMM(BPF_MOV, R0, -3),
4145 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
4146 			BPF_EXIT_INSN(),
4147 		},
4148 		INTERNAL,
4149 		{ },
4150 		{ { 0, 3 } },
4151 	},
4152 	{
4153 		"ALU64_NEG: -(3) = -3",
4154 		.u.insns_int = {
4155 			BPF_LD_IMM64(R0, 3),
4156 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
4157 			BPF_EXIT_INSN(),
4158 		},
4159 		INTERNAL,
4160 		{ },
4161 		{ { 0, -3 } },
4162 	},
4163 	{
4164 		"ALU64_NEG: -(-3) = 3",
4165 		.u.insns_int = {
4166 			BPF_LD_IMM64(R0, -3),
4167 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
4168 			BPF_EXIT_INSN(),
4169 		},
4170 		INTERNAL,
4171 		{ },
4172 		{ { 0, 3 } },
4173 	},
4174 	/* BPF_ALU | BPF_END | BPF_FROM_BE */
4175 	{
4176 		"ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
4177 		.u.insns_int = {
4178 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4179 			BPF_ENDIAN(BPF_FROM_BE, R0, 16),
4180 			BPF_EXIT_INSN(),
4181 		},
4182 		INTERNAL,
4183 		{ },
4184 		{ { 0,  cpu_to_be16(0xcdef) } },
4185 	},
4186 	{
4187 		"ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
4188 		.u.insns_int = {
4189 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4190 			BPF_ENDIAN(BPF_FROM_BE, R0, 32),
4191 			BPF_ALU64_REG(BPF_MOV, R1, R0),
4192 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
4193 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
4194 			BPF_EXIT_INSN(),
4195 		},
4196 		INTERNAL,
4197 		{ },
4198 		{ { 0, cpu_to_be32(0x89abcdef) } },
4199 	},
4200 	{
4201 		"ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
4202 		.u.insns_int = {
4203 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4204 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
4205 			BPF_EXIT_INSN(),
4206 		},
4207 		INTERNAL,
4208 		{ },
4209 		{ { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
4210 	},
4211 	/* BPF_ALU | BPF_END | BPF_FROM_LE */
4212 	{
4213 		"ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
4214 		.u.insns_int = {
4215 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4216 			BPF_ENDIAN(BPF_FROM_LE, R0, 16),
4217 			BPF_EXIT_INSN(),
4218 		},
4219 		INTERNAL,
4220 		{ },
4221 		{ { 0, cpu_to_le16(0xcdef) } },
4222 	},
4223 	{
4224 		"ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
4225 		.u.insns_int = {
4226 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4227 			BPF_ENDIAN(BPF_FROM_LE, R0, 32),
4228 			BPF_ALU64_REG(BPF_MOV, R1, R0),
4229 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
4230 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
4231 			BPF_EXIT_INSN(),
4232 		},
4233 		INTERNAL,
4234 		{ },
4235 		{ { 0, cpu_to_le32(0x89abcdef) } },
4236 	},
4237 	{
4238 		"ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
4239 		.u.insns_int = {
4240 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4241 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
4242 			BPF_EXIT_INSN(),
4243 		},
4244 		INTERNAL,
4245 		{ },
4246 		{ { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
4247 	},
4248 	/* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
4249 	{
4250 		"ST_MEM_B: Store/Load byte: max negative",
4251 		.u.insns_int = {
4252 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4253 			BPF_ST_MEM(BPF_B, R10, -40, 0xff),
4254 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
4255 			BPF_EXIT_INSN(),
4256 		},
4257 		INTERNAL,
4258 		{ },
4259 		{ { 0, 0xff } },
4260 		.stack_depth = 40,
4261 	},
4262 	{
4263 		"ST_MEM_B: Store/Load byte: max positive",
4264 		.u.insns_int = {
4265 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4266 			BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
4267 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4268 			BPF_EXIT_INSN(),
4269 		},
4270 		INTERNAL,
4271 		{ },
4272 		{ { 0, 0x7f } },
4273 		.stack_depth = 40,
4274 	},
4275 	{
4276 		"STX_MEM_B: Store/Load byte: max negative",
4277 		.u.insns_int = {
4278 			BPF_LD_IMM64(R0, 0),
4279 			BPF_LD_IMM64(R1, 0xffLL),
4280 			BPF_STX_MEM(BPF_B, R10, R1, -40),
4281 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
4282 			BPF_EXIT_INSN(),
4283 		},
4284 		INTERNAL,
4285 		{ },
4286 		{ { 0, 0xff } },
4287 		.stack_depth = 40,
4288 	},
4289 	{
4290 		"ST_MEM_H: Store/Load half word: max negative",
4291 		.u.insns_int = {
4292 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4293 			BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
4294 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4295 			BPF_EXIT_INSN(),
4296 		},
4297 		INTERNAL,
4298 		{ },
4299 		{ { 0, 0xffff } },
4300 		.stack_depth = 40,
4301 	},
4302 	{
4303 		"ST_MEM_H: Store/Load half word: max positive",
4304 		.u.insns_int = {
4305 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4306 			BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
4307 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4308 			BPF_EXIT_INSN(),
4309 		},
4310 		INTERNAL,
4311 		{ },
4312 		{ { 0, 0x7fff } },
4313 		.stack_depth = 40,
4314 	},
4315 	{
4316 		"STX_MEM_H: Store/Load half word: max negative",
4317 		.u.insns_int = {
4318 			BPF_LD_IMM64(R0, 0),
4319 			BPF_LD_IMM64(R1, 0xffffLL),
4320 			BPF_STX_MEM(BPF_H, R10, R1, -40),
4321 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4322 			BPF_EXIT_INSN(),
4323 		},
4324 		INTERNAL,
4325 		{ },
4326 		{ { 0, 0xffff } },
4327 		.stack_depth = 40,
4328 	},
4329 	{
4330 		"ST_MEM_W: Store/Load word: max negative",
4331 		.u.insns_int = {
4332 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4333 			BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
4334 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4335 			BPF_EXIT_INSN(),
4336 		},
4337 		INTERNAL,
4338 		{ },
4339 		{ { 0, 0xffffffff } },
4340 		.stack_depth = 40,
4341 	},
4342 	{
4343 		"ST_MEM_W: Store/Load word: max positive",
4344 		.u.insns_int = {
4345 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4346 			BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
4347 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4348 			BPF_EXIT_INSN(),
4349 		},
4350 		INTERNAL,
4351 		{ },
4352 		{ { 0, 0x7fffffff } },
4353 		.stack_depth = 40,
4354 	},
4355 	{
4356 		"STX_MEM_W: Store/Load word: max negative",
4357 		.u.insns_int = {
4358 			BPF_LD_IMM64(R0, 0),
4359 			BPF_LD_IMM64(R1, 0xffffffffLL),
4360 			BPF_STX_MEM(BPF_W, R10, R1, -40),
4361 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4362 			BPF_EXIT_INSN(),
4363 		},
4364 		INTERNAL,
4365 		{ },
4366 		{ { 0, 0xffffffff } },
4367 		.stack_depth = 40,
4368 	},
4369 	{
4370 		"ST_MEM_DW: Store/Load double word: max negative",
4371 		.u.insns_int = {
4372 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4373 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4374 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4375 			BPF_EXIT_INSN(),
4376 		},
4377 		INTERNAL,
4378 		{ },
4379 		{ { 0, 0xffffffff } },
4380 		.stack_depth = 40,
4381 	},
4382 	{
4383 		"ST_MEM_DW: Store/Load double word: max negative 2",
4384 		.u.insns_int = {
4385 			BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
4386 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4387 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4388 			BPF_LDX_MEM(BPF_DW, R2, R10, -40),
4389 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4390 			BPF_MOV32_IMM(R0, 2),
4391 			BPF_EXIT_INSN(),
4392 			BPF_MOV32_IMM(R0, 1),
4393 			BPF_EXIT_INSN(),
4394 		},
4395 		INTERNAL,
4396 		{ },
4397 		{ { 0, 0x1 } },
4398 		.stack_depth = 40,
4399 	},
4400 	{
4401 		"ST_MEM_DW: Store/Load double word: max positive",
4402 		.u.insns_int = {
4403 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4404 			BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
4405 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4406 			BPF_EXIT_INSN(),
4407 		},
4408 		INTERNAL,
4409 		{ },
4410 		{ { 0, 0x7fffffff } },
4411 		.stack_depth = 40,
4412 	},
4413 	{
4414 		"STX_MEM_DW: Store/Load double word: max negative",
4415 		.u.insns_int = {
4416 			BPF_LD_IMM64(R0, 0),
4417 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4418 			BPF_STX_MEM(BPF_W, R10, R1, -40),
4419 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4420 			BPF_EXIT_INSN(),
4421 		},
4422 		INTERNAL,
4423 		{ },
4424 		{ { 0, 0xffffffff } },
4425 		.stack_depth = 40,
4426 	},
4427 	/* BPF_STX | BPF_XADD | BPF_W/DW */
4428 	{
4429 		"STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
4430 		.u.insns_int = {
4431 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4432 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4433 			BPF_STX_XADD(BPF_W, R10, R0, -40),
4434 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4435 			BPF_EXIT_INSN(),
4436 		},
4437 		INTERNAL,
4438 		{ },
4439 		{ { 0, 0x22 } },
4440 		.stack_depth = 40,
4441 	},
4442 	{
4443 		"STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22",
4444 		.u.insns_int = {
4445 			BPF_ALU64_REG(BPF_MOV, R1, R10),
4446 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4447 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4448 			BPF_STX_XADD(BPF_W, R10, R0, -40),
4449 			BPF_ALU64_REG(BPF_MOV, R0, R10),
4450 			BPF_ALU64_REG(BPF_SUB, R0, R1),
4451 			BPF_EXIT_INSN(),
4452 		},
4453 		INTERNAL,
4454 		{ },
4455 		{ { 0, 0 } },
4456 		.stack_depth = 40,
4457 	},
4458 	{
4459 		"STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22",
4460 		.u.insns_int = {
4461 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4462 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4463 			BPF_STX_XADD(BPF_W, R10, R0, -40),
4464 			BPF_EXIT_INSN(),
4465 		},
4466 		INTERNAL,
4467 		{ },
4468 		{ { 0, 0x12 } },
4469 		.stack_depth = 40,
4470 	},
4471 	{
4472 		"STX_XADD_W: X + 1 + 1 + 1 + ...",
4473 		{ },
4474 		INTERNAL,
4475 		{ },
4476 		{ { 0, 4134 } },
4477 		.fill_helper = bpf_fill_stxw,
4478 	},
4479 	{
4480 		"STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
4481 		.u.insns_int = {
4482 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4483 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4484 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4485 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4486 			BPF_EXIT_INSN(),
4487 		},
4488 		INTERNAL,
4489 		{ },
4490 		{ { 0, 0x22 } },
4491 		.stack_depth = 40,
4492 	},
4493 	{
4494 		"STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22",
4495 		.u.insns_int = {
4496 			BPF_ALU64_REG(BPF_MOV, R1, R10),
4497 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4498 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4499 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4500 			BPF_ALU64_REG(BPF_MOV, R0, R10),
4501 			BPF_ALU64_REG(BPF_SUB, R0, R1),
4502 			BPF_EXIT_INSN(),
4503 		},
4504 		INTERNAL,
4505 		{ },
4506 		{ { 0, 0 } },
4507 		.stack_depth = 40,
4508 	},
4509 	{
4510 		"STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22",
4511 		.u.insns_int = {
4512 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4513 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4514 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4515 			BPF_EXIT_INSN(),
4516 		},
4517 		INTERNAL,
4518 		{ },
4519 		{ { 0, 0x12 } },
4520 		.stack_depth = 40,
4521 	},
4522 	{
4523 		"STX_XADD_DW: X + 1 + 1 + 1 + ...",
4524 		{ },
4525 		INTERNAL,
4526 		{ },
4527 		{ { 0, 4134 } },
4528 		.fill_helper = bpf_fill_stxdw,
4529 	},
4530 	/* BPF_JMP | BPF_EXIT */
4531 	{
4532 		"JMP_EXIT",
4533 		.u.insns_int = {
4534 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
4535 			BPF_EXIT_INSN(),
4536 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
4537 		},
4538 		INTERNAL,
4539 		{ },
4540 		{ { 0, 0x4711 } },
4541 	},
4542 	/* BPF_JMP | BPF_JA */
4543 	{
4544 		"JMP_JA: Unconditional jump: if (true) return 1",
4545 		.u.insns_int = {
4546 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4547 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4548 			BPF_EXIT_INSN(),
4549 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4550 			BPF_EXIT_INSN(),
4551 		},
4552 		INTERNAL,
4553 		{ },
4554 		{ { 0, 1 } },
4555 	},
4556 	/* BPF_JMP | BPF_JSLT | BPF_K */
4557 	{
4558 		"JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
4559 		.u.insns_int = {
4560 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4561 			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
4562 			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
4563 			BPF_EXIT_INSN(),
4564 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4565 			BPF_EXIT_INSN(),
4566 		},
4567 		INTERNAL,
4568 		{ },
4569 		{ { 0, 1 } },
4570 	},
4571 	{
4572 		"JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
4573 		.u.insns_int = {
4574 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4575 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4576 			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
4577 			BPF_EXIT_INSN(),
4578 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4579 			BPF_EXIT_INSN(),
4580 		},
4581 		INTERNAL,
4582 		{ },
4583 		{ { 0, 1 } },
4584 	},
4585 	/* BPF_JMP | BPF_JSGT | BPF_K */
4586 	{
4587 		"JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
4588 		.u.insns_int = {
4589 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4590 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4591 			BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
4592 			BPF_EXIT_INSN(),
4593 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4594 			BPF_EXIT_INSN(),
4595 		},
4596 		INTERNAL,
4597 		{ },
4598 		{ { 0, 1 } },
4599 	},
4600 	{
4601 		"JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
4602 		.u.insns_int = {
4603 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4604 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4605 			BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
4606 			BPF_EXIT_INSN(),
4607 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4608 			BPF_EXIT_INSN(),
4609 		},
4610 		INTERNAL,
4611 		{ },
4612 		{ { 0, 1 } },
4613 	},
4614 	/* BPF_JMP | BPF_JSLE | BPF_K */
4615 	{
4616 		"JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
4617 		.u.insns_int = {
4618 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4619 			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
4620 			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
4621 			BPF_EXIT_INSN(),
4622 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4623 			BPF_EXIT_INSN(),
4624 		},
4625 		INTERNAL,
4626 		{ },
4627 		{ { 0, 1 } },
4628 	},
4629 	{
4630 		"JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
4631 		.u.insns_int = {
4632 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4633 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4634 			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
4635 			BPF_EXIT_INSN(),
4636 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4637 			BPF_EXIT_INSN(),
4638 		},
4639 		INTERNAL,
4640 		{ },
4641 		{ { 0, 1 } },
4642 	},
4643 	{
4644 		"JMP_JSLE_K: Signed jump: value walk 1",
4645 		.u.insns_int = {
4646 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4647 			BPF_LD_IMM64(R1, 3),
4648 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
4649 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4650 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
4651 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4652 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
4653 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4654 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
4655 			BPF_EXIT_INSN(),		/* bad exit */
4656 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4657 			BPF_EXIT_INSN(),
4658 		},
4659 		INTERNAL,
4660 		{ },
4661 		{ { 0, 1 } },
4662 	},
4663 	{
4664 		"JMP_JSLE_K: Signed jump: value walk 2",
4665 		.u.insns_int = {
4666 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4667 			BPF_LD_IMM64(R1, 3),
4668 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
4669 			BPF_ALU64_IMM(BPF_SUB, R1, 2),
4670 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
4671 			BPF_ALU64_IMM(BPF_SUB, R1, 2),
4672 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
4673 			BPF_EXIT_INSN(),		/* bad exit */
4674 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4675 			BPF_EXIT_INSN(),
4676 		},
4677 		INTERNAL,
4678 		{ },
4679 		{ { 0, 1 } },
4680 	},
4681 	/* BPF_JMP | BPF_JSGE | BPF_K */
4682 	{
4683 		"JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
4684 		.u.insns_int = {
4685 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4686 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4687 			BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
4688 			BPF_EXIT_INSN(),
4689 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4690 			BPF_EXIT_INSN(),
4691 		},
4692 		INTERNAL,
4693 		{ },
4694 		{ { 0, 1 } },
4695 	},
4696 	{
4697 		"JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
4698 		.u.insns_int = {
4699 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4700 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4701 			BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
4702 			BPF_EXIT_INSN(),
4703 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4704 			BPF_EXIT_INSN(),
4705 		},
4706 		INTERNAL,
4707 		{ },
4708 		{ { 0, 1 } },
4709 	},
4710 	{
4711 		"JMP_JSGE_K: Signed jump: value walk 1",
4712 		.u.insns_int = {
4713 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4714 			BPF_LD_IMM64(R1, -3),
4715 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
4716 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4717 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
4718 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4719 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
4720 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4721 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
4722 			BPF_EXIT_INSN(),		/* bad exit */
4723 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4724 			BPF_EXIT_INSN(),
4725 		},
4726 		INTERNAL,
4727 		{ },
4728 		{ { 0, 1 } },
4729 	},
4730 	{
4731 		"JMP_JSGE_K: Signed jump: value walk 2",
4732 		.u.insns_int = {
4733 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4734 			BPF_LD_IMM64(R1, -3),
4735 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
4736 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
4737 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
4738 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
4739 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
4740 			BPF_EXIT_INSN(),		/* bad exit */
4741 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4742 			BPF_EXIT_INSN(),
4743 		},
4744 		INTERNAL,
4745 		{ },
4746 		{ { 0, 1 } },
4747 	},
4748 	/* BPF_JMP | BPF_JGT | BPF_K */
4749 	{
4750 		"JMP_JGT_K: if (3 > 2) return 1",
4751 		.u.insns_int = {
4752 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4753 			BPF_LD_IMM64(R1, 3),
4754 			BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
4755 			BPF_EXIT_INSN(),
4756 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4757 			BPF_EXIT_INSN(),
4758 		},
4759 		INTERNAL,
4760 		{ },
4761 		{ { 0, 1 } },
4762 	},
4763 	{
4764 		"JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
4765 		.u.insns_int = {
4766 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4767 			BPF_LD_IMM64(R1, -1),
4768 			BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
4769 			BPF_EXIT_INSN(),
4770 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4771 			BPF_EXIT_INSN(),
4772 		},
4773 		INTERNAL,
4774 		{ },
4775 		{ { 0, 1 } },
4776 	},
4777 	/* BPF_JMP | BPF_JLT | BPF_K */
4778 	{
4779 		"JMP_JLT_K: if (2 < 3) return 1",
4780 		.u.insns_int = {
4781 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4782 			BPF_LD_IMM64(R1, 2),
4783 			BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
4784 			BPF_EXIT_INSN(),
4785 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4786 			BPF_EXIT_INSN(),
4787 		},
4788 		INTERNAL,
4789 		{ },
4790 		{ { 0, 1 } },
4791 	},
4792 	{
4793 		"JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
4794 		.u.insns_int = {
4795 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4796 			BPF_LD_IMM64(R1, 1),
4797 			BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
4798 			BPF_EXIT_INSN(),
4799 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4800 			BPF_EXIT_INSN(),
4801 		},
4802 		INTERNAL,
4803 		{ },
4804 		{ { 0, 1 } },
4805 	},
4806 	/* BPF_JMP | BPF_JGE | BPF_K */
4807 	{
4808 		"JMP_JGE_K: if (3 >= 2) return 1",
4809 		.u.insns_int = {
4810 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4811 			BPF_LD_IMM64(R1, 3),
4812 			BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
4813 			BPF_EXIT_INSN(),
4814 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4815 			BPF_EXIT_INSN(),
4816 		},
4817 		INTERNAL,
4818 		{ },
4819 		{ { 0, 1 } },
4820 	},
4821 	/* BPF_JMP | BPF_JLE | BPF_K */
4822 	{
4823 		"JMP_JLE_K: if (2 <= 3) return 1",
4824 		.u.insns_int = {
4825 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4826 			BPF_LD_IMM64(R1, 2),
4827 			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
4828 			BPF_EXIT_INSN(),
4829 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4830 			BPF_EXIT_INSN(),
4831 		},
4832 		INTERNAL,
4833 		{ },
4834 		{ { 0, 1 } },
4835 	},
4836 	/* BPF_JMP | BPF_JGT | BPF_K jump backwards */
4837 	{
4838 		"JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
4839 		.u.insns_int = {
4840 			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4841 			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4842 			BPF_EXIT_INSN(),
4843 			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4844 			BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
4845 			BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
4846 			BPF_EXIT_INSN(),
4847 		},
4848 		INTERNAL,
4849 		{ },
4850 		{ { 0, 1 } },
4851 	},
4852 	{
4853 		"JMP_JGE_K: if (3 >= 3) return 1",
4854 		.u.insns_int = {
4855 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4856 			BPF_LD_IMM64(R1, 3),
4857 			BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
4858 			BPF_EXIT_INSN(),
4859 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4860 			BPF_EXIT_INSN(),
4861 		},
4862 		INTERNAL,
4863 		{ },
4864 		{ { 0, 1 } },
4865 	},
4866 	/* BPF_JMP | BPF_JLT | BPF_K jump backwards */
4867 	{
4868 		"JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
4869 		.u.insns_int = {
4870 			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4871 			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4872 			BPF_EXIT_INSN(),
4873 			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4874 			BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
4875 			BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
4876 			BPF_EXIT_INSN(),
4877 		},
4878 		INTERNAL,
4879 		{ },
4880 		{ { 0, 1 } },
4881 	},
4882 	{
4883 		"JMP_JLE_K: if (3 <= 3) return 1",
4884 		.u.insns_int = {
4885 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4886 			BPF_LD_IMM64(R1, 3),
4887 			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
4888 			BPF_EXIT_INSN(),
4889 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4890 			BPF_EXIT_INSN(),
4891 		},
4892 		INTERNAL,
4893 		{ },
4894 		{ { 0, 1 } },
4895 	},
4896 	/* BPF_JMP | BPF_JNE | BPF_K */
4897 	{
4898 		"JMP_JNE_K: if (3 != 2) return 1",
4899 		.u.insns_int = {
4900 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4901 			BPF_LD_IMM64(R1, 3),
4902 			BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4903 			BPF_EXIT_INSN(),
4904 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4905 			BPF_EXIT_INSN(),
4906 		},
4907 		INTERNAL,
4908 		{ },
4909 		{ { 0, 1 } },
4910 	},
4911 	/* BPF_JMP | BPF_JEQ | BPF_K */
4912 	{
4913 		"JMP_JEQ_K: if (3 == 3) return 1",
4914 		.u.insns_int = {
4915 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4916 			BPF_LD_IMM64(R1, 3),
4917 			BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
4918 			BPF_EXIT_INSN(),
4919 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4920 			BPF_EXIT_INSN(),
4921 		},
4922 		INTERNAL,
4923 		{ },
4924 		{ { 0, 1 } },
4925 	},
4926 	/* BPF_JMP | BPF_JSET | BPF_K */
4927 	{
4928 		"JMP_JSET_K: if (0x3 & 0x2) return 1",
4929 		.u.insns_int = {
4930 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4931 			BPF_LD_IMM64(R1, 3),
4932 			BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
4933 			BPF_EXIT_INSN(),
4934 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4935 			BPF_EXIT_INSN(),
4936 		},
4937 		INTERNAL,
4938 		{ },
4939 		{ { 0, 1 } },
4940 	},
4941 	{
4942 		"JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
4943 		.u.insns_int = {
4944 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4945 			BPF_LD_IMM64(R1, 3),
4946 			BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
4947 			BPF_EXIT_INSN(),
4948 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4949 			BPF_EXIT_INSN(),
4950 		},
4951 		INTERNAL,
4952 		{ },
4953 		{ { 0, 1 } },
4954 	},
4955 	/* BPF_JMP | BPF_JSGT | BPF_X */
4956 	{
4957 		"JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
4958 		.u.insns_int = {
4959 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4960 			BPF_LD_IMM64(R1, -1),
4961 			BPF_LD_IMM64(R2, -2),
4962 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4963 			BPF_EXIT_INSN(),
4964 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4965 			BPF_EXIT_INSN(),
4966 		},
4967 		INTERNAL,
4968 		{ },
4969 		{ { 0, 1 } },
4970 	},
4971 	{
4972 		"JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
4973 		.u.insns_int = {
4974 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4975 			BPF_LD_IMM64(R1, -1),
4976 			BPF_LD_IMM64(R2, -1),
4977 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4978 			BPF_EXIT_INSN(),
4979 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4980 			BPF_EXIT_INSN(),
4981 		},
4982 		INTERNAL,
4983 		{ },
4984 		{ { 0, 1 } },
4985 	},
4986 	/* BPF_JMP | BPF_JSLT | BPF_X */
4987 	{
4988 		"JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
4989 		.u.insns_int = {
4990 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4991 			BPF_LD_IMM64(R1, -1),
4992 			BPF_LD_IMM64(R2, -2),
4993 			BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
4994 			BPF_EXIT_INSN(),
4995 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4996 			BPF_EXIT_INSN(),
4997 		},
4998 		INTERNAL,
4999 		{ },
5000 		{ { 0, 1 } },
5001 	},
5002 	{
5003 		"JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
5004 		.u.insns_int = {
5005 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5006 			BPF_LD_IMM64(R1, -1),
5007 			BPF_LD_IMM64(R2, -1),
5008 			BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
5009 			BPF_EXIT_INSN(),
5010 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5011 			BPF_EXIT_INSN(),
5012 		},
5013 		INTERNAL,
5014 		{ },
5015 		{ { 0, 1 } },
5016 	},
5017 	/* BPF_JMP | BPF_JSGE | BPF_X */
5018 	{
5019 		"JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
5020 		.u.insns_int = {
5021 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5022 			BPF_LD_IMM64(R1, -1),
5023 			BPF_LD_IMM64(R2, -2),
5024 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
5025 			BPF_EXIT_INSN(),
5026 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5027 			BPF_EXIT_INSN(),
5028 		},
5029 		INTERNAL,
5030 		{ },
5031 		{ { 0, 1 } },
5032 	},
5033 	{
5034 		"JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
5035 		.u.insns_int = {
5036 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5037 			BPF_LD_IMM64(R1, -1),
5038 			BPF_LD_IMM64(R2, -1),
5039 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
5040 			BPF_EXIT_INSN(),
5041 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5042 			BPF_EXIT_INSN(),
5043 		},
5044 		INTERNAL,
5045 		{ },
5046 		{ { 0, 1 } },
5047 	},
5048 	/* BPF_JMP | BPF_JSLE | BPF_X */
5049 	{
5050 		"JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
5051 		.u.insns_int = {
5052 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5053 			BPF_LD_IMM64(R1, -1),
5054 			BPF_LD_IMM64(R2, -2),
5055 			BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
5056 			BPF_EXIT_INSN(),
5057 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5058 			BPF_EXIT_INSN(),
5059 		},
5060 		INTERNAL,
5061 		{ },
5062 		{ { 0, 1 } },
5063 	},
5064 	{
5065 		"JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
5066 		.u.insns_int = {
5067 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5068 			BPF_LD_IMM64(R1, -1),
5069 			BPF_LD_IMM64(R2, -1),
5070 			BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
5071 			BPF_EXIT_INSN(),
5072 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5073 			BPF_EXIT_INSN(),
5074 		},
5075 		INTERNAL,
5076 		{ },
5077 		{ { 0, 1 } },
5078 	},
5079 	/* BPF_JMP | BPF_JGT | BPF_X */
5080 	{
5081 		"JMP_JGT_X: if (3 > 2) return 1",
5082 		.u.insns_int = {
5083 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5084 			BPF_LD_IMM64(R1, 3),
5085 			BPF_LD_IMM64(R2, 2),
5086 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
5087 			BPF_EXIT_INSN(),
5088 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5089 			BPF_EXIT_INSN(),
5090 		},
5091 		INTERNAL,
5092 		{ },
5093 		{ { 0, 1 } },
5094 	},
5095 	{
5096 		"JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
5097 		.u.insns_int = {
5098 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5099 			BPF_LD_IMM64(R1, -1),
5100 			BPF_LD_IMM64(R2, 1),
5101 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
5102 			BPF_EXIT_INSN(),
5103 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5104 			BPF_EXIT_INSN(),
5105 		},
5106 		INTERNAL,
5107 		{ },
5108 		{ { 0, 1 } },
5109 	},
5110 	/* BPF_JMP | BPF_JLT | BPF_X */
5111 	{
5112 		"JMP_JLT_X: if (2 < 3) return 1",
5113 		.u.insns_int = {
5114 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5115 			BPF_LD_IMM64(R1, 3),
5116 			BPF_LD_IMM64(R2, 2),
5117 			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
5118 			BPF_EXIT_INSN(),
5119 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5120 			BPF_EXIT_INSN(),
5121 		},
5122 		INTERNAL,
5123 		{ },
5124 		{ { 0, 1 } },
5125 	},
5126 	{
5127 		"JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
5128 		.u.insns_int = {
5129 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5130 			BPF_LD_IMM64(R1, -1),
5131 			BPF_LD_IMM64(R2, 1),
5132 			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
5133 			BPF_EXIT_INSN(),
5134 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5135 			BPF_EXIT_INSN(),
5136 		},
5137 		INTERNAL,
5138 		{ },
5139 		{ { 0, 1 } },
5140 	},
5141 	/* BPF_JMP | BPF_JGE | BPF_X */
5142 	{
5143 		"JMP_JGE_X: if (3 >= 2) return 1",
5144 		.u.insns_int = {
5145 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5146 			BPF_LD_IMM64(R1, 3),
5147 			BPF_LD_IMM64(R2, 2),
5148 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
5149 			BPF_EXIT_INSN(),
5150 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5151 			BPF_EXIT_INSN(),
5152 		},
5153 		INTERNAL,
5154 		{ },
5155 		{ { 0, 1 } },
5156 	},
5157 	{
5158 		"JMP_JGE_X: if (3 >= 3) return 1",
5159 		.u.insns_int = {
5160 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5161 			BPF_LD_IMM64(R1, 3),
5162 			BPF_LD_IMM64(R2, 3),
5163 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
5164 			BPF_EXIT_INSN(),
5165 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5166 			BPF_EXIT_INSN(),
5167 		},
5168 		INTERNAL,
5169 		{ },
5170 		{ { 0, 1 } },
5171 	},
5172 	/* BPF_JMP | BPF_JLE | BPF_X */
5173 	{
5174 		"JMP_JLE_X: if (2 <= 3) return 1",
5175 		.u.insns_int = {
5176 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5177 			BPF_LD_IMM64(R1, 3),
5178 			BPF_LD_IMM64(R2, 2),
5179 			BPF_JMP_REG(BPF_JLE, R2, R1, 1),
5180 			BPF_EXIT_INSN(),
5181 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5182 			BPF_EXIT_INSN(),
5183 		},
5184 		INTERNAL,
5185 		{ },
5186 		{ { 0, 1 } },
5187 	},
5188 	{
5189 		"JMP_JLE_X: if (3 <= 3) return 1",
5190 		.u.insns_int = {
5191 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5192 			BPF_LD_IMM64(R1, 3),
5193 			BPF_LD_IMM64(R2, 3),
5194 			BPF_JMP_REG(BPF_JLE, R1, R2, 1),
5195 			BPF_EXIT_INSN(),
5196 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5197 			BPF_EXIT_INSN(),
5198 		},
5199 		INTERNAL,
5200 		{ },
5201 		{ { 0, 1 } },
5202 	},
5203 	{
5204 		/* Mainly testing JIT + imm64 here. */
5205 		"JMP_JGE_X: ldimm64 test 1",
5206 		.u.insns_int = {
5207 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5208 			BPF_LD_IMM64(R1, 3),
5209 			BPF_LD_IMM64(R2, 2),
5210 			BPF_JMP_REG(BPF_JGE, R1, R2, 2),
5211 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5212 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5213 			BPF_EXIT_INSN(),
5214 		},
5215 		INTERNAL,
5216 		{ },
5217 		{ { 0, 0xeeeeeeeeU } },
5218 	},
5219 	{
5220 		"JMP_JGE_X: ldimm64 test 2",
5221 		.u.insns_int = {
5222 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5223 			BPF_LD_IMM64(R1, 3),
5224 			BPF_LD_IMM64(R2, 2),
5225 			BPF_JMP_REG(BPF_JGE, R1, R2, 0),
5226 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5227 			BPF_EXIT_INSN(),
5228 		},
5229 		INTERNAL,
5230 		{ },
5231 		{ { 0, 0xffffffffU } },
5232 	},
5233 	{
5234 		"JMP_JGE_X: ldimm64 test 3",
5235 		.u.insns_int = {
5236 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5237 			BPF_LD_IMM64(R1, 3),
5238 			BPF_LD_IMM64(R2, 2),
5239 			BPF_JMP_REG(BPF_JGE, R1, R2, 4),
5240 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5241 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5242 			BPF_EXIT_INSN(),
5243 		},
5244 		INTERNAL,
5245 		{ },
5246 		{ { 0, 1 } },
5247 	},
5248 	{
5249 		"JMP_JLE_X: ldimm64 test 1",
5250 		.u.insns_int = {
5251 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5252 			BPF_LD_IMM64(R1, 3),
5253 			BPF_LD_IMM64(R2, 2),
5254 			BPF_JMP_REG(BPF_JLE, R2, R1, 2),
5255 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5256 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5257 			BPF_EXIT_INSN(),
5258 		},
5259 		INTERNAL,
5260 		{ },
5261 		{ { 0, 0xeeeeeeeeU } },
5262 	},
5263 	{
5264 		"JMP_JLE_X: ldimm64 test 2",
5265 		.u.insns_int = {
5266 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5267 			BPF_LD_IMM64(R1, 3),
5268 			BPF_LD_IMM64(R2, 2),
5269 			BPF_JMP_REG(BPF_JLE, R2, R1, 0),
5270 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5271 			BPF_EXIT_INSN(),
5272 		},
5273 		INTERNAL,
5274 		{ },
5275 		{ { 0, 0xffffffffU } },
5276 	},
5277 	{
5278 		"JMP_JLE_X: ldimm64 test 3",
5279 		.u.insns_int = {
5280 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5281 			BPF_LD_IMM64(R1, 3),
5282 			BPF_LD_IMM64(R2, 2),
5283 			BPF_JMP_REG(BPF_JLE, R2, R1, 4),
5284 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5285 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5286 			BPF_EXIT_INSN(),
5287 		},
5288 		INTERNAL,
5289 		{ },
5290 		{ { 0, 1 } },
5291 	},
5292 	/* BPF_JMP | BPF_JNE | BPF_X */
5293 	{
5294 		"JMP_JNE_X: if (3 != 2) return 1",
5295 		.u.insns_int = {
5296 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5297 			BPF_LD_IMM64(R1, 3),
5298 			BPF_LD_IMM64(R2, 2),
5299 			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
5300 			BPF_EXIT_INSN(),
5301 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5302 			BPF_EXIT_INSN(),
5303 		},
5304 		INTERNAL,
5305 		{ },
5306 		{ { 0, 1 } },
5307 	},
5308 	/* BPF_JMP | BPF_JEQ | BPF_X */
5309 	{
5310 		"JMP_JEQ_X: if (3 == 3) return 1",
5311 		.u.insns_int = {
5312 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5313 			BPF_LD_IMM64(R1, 3),
5314 			BPF_LD_IMM64(R2, 3),
5315 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
5316 			BPF_EXIT_INSN(),
5317 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5318 			BPF_EXIT_INSN(),
5319 		},
5320 		INTERNAL,
5321 		{ },
5322 		{ { 0, 1 } },
5323 	},
5324 	/* BPF_JMP | BPF_JSET | BPF_X */
5325 	{
5326 		"JMP_JSET_X: if (0x3 & 0x2) return 1",
5327 		.u.insns_int = {
5328 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5329 			BPF_LD_IMM64(R1, 3),
5330 			BPF_LD_IMM64(R2, 2),
5331 			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
5332 			BPF_EXIT_INSN(),
5333 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5334 			BPF_EXIT_INSN(),
5335 		},
5336 		INTERNAL,
5337 		{ },
5338 		{ { 0, 1 } },
5339 	},
5340 	{
5341 		"JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
5342 		.u.insns_int = {
5343 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5344 			BPF_LD_IMM64(R1, 3),
5345 			BPF_LD_IMM64(R2, 0xffffffff),
5346 			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
5347 			BPF_EXIT_INSN(),
5348 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5349 			BPF_EXIT_INSN(),
5350 		},
5351 		INTERNAL,
5352 		{ },
5353 		{ { 0, 1 } },
5354 	},
5355 	{
5356 		"JMP_JA: Jump, gap, jump, ...",
5357 		{ },
5358 		CLASSIC | FLAG_NO_DATA,
5359 		{ },
5360 		{ { 0, 0xababcbac } },
5361 		.fill_helper = bpf_fill_ja,
5362 	},
5363 	{	/* Mainly checking JIT here. */
5364 		"BPF_MAXINSNS: Maximum possible literals",
5365 		{ },
5366 		CLASSIC | FLAG_NO_DATA,
5367 		{ },
5368 		{ { 0, 0xffffffff } },
5369 		.fill_helper = bpf_fill_maxinsns1,
5370 	},
5371 	{	/* Mainly checking JIT here. */
5372 		"BPF_MAXINSNS: Single literal",
5373 		{ },
5374 		CLASSIC | FLAG_NO_DATA,
5375 		{ },
5376 		{ { 0, 0xfefefefe } },
5377 		.fill_helper = bpf_fill_maxinsns2,
5378 	},
5379 	{	/* Mainly checking JIT here. */
5380 		"BPF_MAXINSNS: Run/add until end",
5381 		{ },
5382 		CLASSIC | FLAG_NO_DATA,
5383 		{ },
5384 		{ { 0, 0x947bf368 } },
5385 		.fill_helper = bpf_fill_maxinsns3,
5386 	},
5387 	{
5388 		"BPF_MAXINSNS: Too many instructions",
5389 		{ },
5390 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5391 		{ },
5392 		{ },
5393 		.fill_helper = bpf_fill_maxinsns4,
5394 	},
5395 	{	/* Mainly checking JIT here. */
5396 		"BPF_MAXINSNS: Very long jump",
5397 		{ },
5398 		CLASSIC | FLAG_NO_DATA,
5399 		{ },
5400 		{ { 0, 0xabababab } },
5401 		.fill_helper = bpf_fill_maxinsns5,
5402 	},
5403 	{	/* Mainly checking JIT here. */
5404 		"BPF_MAXINSNS: Ctx heavy transformations",
5405 		{ },
5406 		CLASSIC,
5407 		{ },
5408 		{
5409 			{  1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
5410 			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
5411 		},
5412 		.fill_helper = bpf_fill_maxinsns6,
5413 	},
5414 	{	/* Mainly checking JIT here. */
5415 		"BPF_MAXINSNS: Call heavy transformations",
5416 		{ },
5417 		CLASSIC | FLAG_NO_DATA,
5418 		{ },
5419 		{ { 1, 0 }, { 10, 0 } },
5420 		.fill_helper = bpf_fill_maxinsns7,
5421 	},
5422 	{	/* Mainly checking JIT here. */
5423 		"BPF_MAXINSNS: Jump heavy test",
5424 		{ },
5425 		CLASSIC | FLAG_NO_DATA,
5426 		{ },
5427 		{ { 0, 0xffffffff } },
5428 		.fill_helper = bpf_fill_maxinsns8,
5429 	},
5430 	{	/* Mainly checking JIT here. */
5431 		"BPF_MAXINSNS: Very long jump backwards",
5432 		{ },
5433 		INTERNAL | FLAG_NO_DATA,
5434 		{ },
5435 		{ { 0, 0xcbababab } },
5436 		.fill_helper = bpf_fill_maxinsns9,
5437 	},
5438 	{	/* Mainly checking JIT here. */
5439 		"BPF_MAXINSNS: Edge hopping nuthouse",
5440 		{ },
5441 		INTERNAL | FLAG_NO_DATA,
5442 		{ },
5443 		{ { 0, 0xabababac } },
5444 		.fill_helper = bpf_fill_maxinsns10,
5445 	},
5446 	{
5447 		"BPF_MAXINSNS: Jump, gap, jump, ...",
5448 		{ },
5449 		CLASSIC | FLAG_NO_DATA,
5450 		{ },
5451 		{ { 0, 0xababcbac } },
5452 		.fill_helper = bpf_fill_maxinsns11,
5453 	},
5454 	{
5455 		"BPF_MAXINSNS: ld_abs+get_processor_id",
5456 		{ },
5457 		CLASSIC,
5458 		{ },
5459 		{ { 1, 0xbee } },
5460 		.fill_helper = bpf_fill_ld_abs_get_processor_id,
5461 	},
5462 	{
5463 		"BPF_MAXINSNS: ld_abs+vlan_push/pop",
5464 		{ },
5465 		INTERNAL,
5466 		{ 0x34 },
5467 		{ { ETH_HLEN, 0xbef } },
5468 		.fill_helper = bpf_fill_ld_abs_vlan_push_pop,
5469 	},
5470 	{
5471 		"BPF_MAXINSNS: jump around ld_abs",
5472 		{ },
5473 		INTERNAL,
5474 		{ 10, 11 },
5475 		{ { 2, 10 } },
5476 		.fill_helper = bpf_fill_jump_around_ld_abs,
5477 	},
5478 	/*
5479 	 * LD_IND / LD_ABS on fragmented SKBs
5480 	 */
5481 	{
5482 		"LD_IND byte frag",
5483 		.u.insns = {
5484 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5485 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
5486 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5487 		},
5488 		CLASSIC | FLAG_SKB_FRAG,
5489 		{ },
5490 		{ {0x40, 0x42} },
5491 		.frag_data = {
5492 			0x42, 0x00, 0x00, 0x00,
5493 			0x43, 0x44, 0x00, 0x00,
5494 			0x21, 0x07, 0x19, 0x83,
5495 		},
5496 	},
5497 	{
5498 		"LD_IND halfword frag",
5499 		.u.insns = {
5500 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5501 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
5502 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5503 		},
5504 		CLASSIC | FLAG_SKB_FRAG,
5505 		{ },
5506 		{ {0x40, 0x4344} },
5507 		.frag_data = {
5508 			0x42, 0x00, 0x00, 0x00,
5509 			0x43, 0x44, 0x00, 0x00,
5510 			0x21, 0x07, 0x19, 0x83,
5511 		},
5512 	},
5513 	{
5514 		"LD_IND word frag",
5515 		.u.insns = {
5516 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5517 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
5518 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5519 		},
5520 		CLASSIC | FLAG_SKB_FRAG,
5521 		{ },
5522 		{ {0x40, 0x21071983} },
5523 		.frag_data = {
5524 			0x42, 0x00, 0x00, 0x00,
5525 			0x43, 0x44, 0x00, 0x00,
5526 			0x21, 0x07, 0x19, 0x83,
5527 		},
5528 	},
5529 	{
5530 		"LD_IND halfword mixed head/frag",
5531 		.u.insns = {
5532 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5533 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5534 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5535 		},
5536 		CLASSIC | FLAG_SKB_FRAG,
5537 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5538 		{ {0x40, 0x0519} },
5539 		.frag_data = { 0x19, 0x82 },
5540 	},
5541 	{
5542 		"LD_IND word mixed head/frag",
5543 		.u.insns = {
5544 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5545 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5546 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5547 		},
5548 		CLASSIC | FLAG_SKB_FRAG,
5549 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5550 		{ {0x40, 0x25051982} },
5551 		.frag_data = { 0x19, 0x82 },
5552 	},
5553 	{
5554 		"LD_ABS byte frag",
5555 		.u.insns = {
5556 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
5557 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5558 		},
5559 		CLASSIC | FLAG_SKB_FRAG,
5560 		{ },
5561 		{ {0x40, 0x42} },
5562 		.frag_data = {
5563 			0x42, 0x00, 0x00, 0x00,
5564 			0x43, 0x44, 0x00, 0x00,
5565 			0x21, 0x07, 0x19, 0x83,
5566 		},
5567 	},
5568 	{
5569 		"LD_ABS halfword frag",
5570 		.u.insns = {
5571 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
5572 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5573 		},
5574 		CLASSIC | FLAG_SKB_FRAG,
5575 		{ },
5576 		{ {0x40, 0x4344} },
5577 		.frag_data = {
5578 			0x42, 0x00, 0x00, 0x00,
5579 			0x43, 0x44, 0x00, 0x00,
5580 			0x21, 0x07, 0x19, 0x83,
5581 		},
5582 	},
5583 	{
5584 		"LD_ABS word frag",
5585 		.u.insns = {
5586 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
5587 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5588 		},
5589 		CLASSIC | FLAG_SKB_FRAG,
5590 		{ },
5591 		{ {0x40, 0x21071983} },
5592 		.frag_data = {
5593 			0x42, 0x00, 0x00, 0x00,
5594 			0x43, 0x44, 0x00, 0x00,
5595 			0x21, 0x07, 0x19, 0x83,
5596 		},
5597 	},
5598 	{
5599 		"LD_ABS halfword mixed head/frag",
5600 		.u.insns = {
5601 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
5602 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5603 		},
5604 		CLASSIC | FLAG_SKB_FRAG,
5605 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5606 		{ {0x40, 0x0519} },
5607 		.frag_data = { 0x19, 0x82 },
5608 	},
5609 	{
5610 		"LD_ABS word mixed head/frag",
5611 		.u.insns = {
5612 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
5613 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5614 		},
5615 		CLASSIC | FLAG_SKB_FRAG,
5616 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5617 		{ {0x40, 0x25051982} },
5618 		.frag_data = { 0x19, 0x82 },
5619 	},
5620 	/*
5621 	 * LD_IND / LD_ABS on non fragmented SKBs
5622 	 */
5623 	{
5624 		/*
5625 		 * this tests that the JIT/interpreter correctly resets X
5626 		 * before using it in an LD_IND instruction.
5627 		 */
5628 		"LD_IND byte default X",
5629 		.u.insns = {
5630 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5631 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5632 		},
5633 		CLASSIC,
5634 		{ [0x1] = 0x42 },
5635 		{ {0x40, 0x42 } },
5636 	},
5637 	{
5638 		"LD_IND byte positive offset",
5639 		.u.insns = {
5640 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5641 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5642 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5643 		},
5644 		CLASSIC,
5645 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5646 		{ {0x40, 0x82 } },
5647 	},
5648 	{
5649 		"LD_IND byte negative offset",
5650 		.u.insns = {
5651 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5652 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
5653 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5654 		},
5655 		CLASSIC,
5656 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5657 		{ {0x40, 0x05 } },
5658 	},
5659 	{
5660 		"LD_IND halfword positive offset",
5661 		.u.insns = {
5662 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5663 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
5664 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5665 		},
5666 		CLASSIC,
5667 		{
5668 			[0x1c] = 0xaa, [0x1d] = 0x55,
5669 			[0x1e] = 0xbb, [0x1f] = 0x66,
5670 			[0x20] = 0xcc, [0x21] = 0x77,
5671 			[0x22] = 0xdd, [0x23] = 0x88,
5672 		},
5673 		{ {0x40, 0xdd88 } },
5674 	},
5675 	{
5676 		"LD_IND halfword negative offset",
5677 		.u.insns = {
5678 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5679 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
5680 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5681 		},
5682 		CLASSIC,
5683 		{
5684 			[0x1c] = 0xaa, [0x1d] = 0x55,
5685 			[0x1e] = 0xbb, [0x1f] = 0x66,
5686 			[0x20] = 0xcc, [0x21] = 0x77,
5687 			[0x22] = 0xdd, [0x23] = 0x88,
5688 		},
5689 		{ {0x40, 0xbb66 } },
5690 	},
5691 	{
5692 		"LD_IND halfword unaligned",
5693 		.u.insns = {
5694 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5695 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5696 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5697 		},
5698 		CLASSIC,
5699 		{
5700 			[0x1c] = 0xaa, [0x1d] = 0x55,
5701 			[0x1e] = 0xbb, [0x1f] = 0x66,
5702 			[0x20] = 0xcc, [0x21] = 0x77,
5703 			[0x22] = 0xdd, [0x23] = 0x88,
5704 		},
5705 		{ {0x40, 0x66cc } },
5706 	},
5707 	{
5708 		"LD_IND word positive offset",
5709 		.u.insns = {
5710 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5711 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
5712 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5713 		},
5714 		CLASSIC,
5715 		{
5716 			[0x1c] = 0xaa, [0x1d] = 0x55,
5717 			[0x1e] = 0xbb, [0x1f] = 0x66,
5718 			[0x20] = 0xcc, [0x21] = 0x77,
5719 			[0x22] = 0xdd, [0x23] = 0x88,
5720 			[0x24] = 0xee, [0x25] = 0x99,
5721 			[0x26] = 0xff, [0x27] = 0xaa,
5722 		},
5723 		{ {0x40, 0xee99ffaa } },
5724 	},
5725 	{
5726 		"LD_IND word negative offset",
5727 		.u.insns = {
5728 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5729 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
5730 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5731 		},
5732 		CLASSIC,
5733 		{
5734 			[0x1c] = 0xaa, [0x1d] = 0x55,
5735 			[0x1e] = 0xbb, [0x1f] = 0x66,
5736 			[0x20] = 0xcc, [0x21] = 0x77,
5737 			[0x22] = 0xdd, [0x23] = 0x88,
5738 			[0x24] = 0xee, [0x25] = 0x99,
5739 			[0x26] = 0xff, [0x27] = 0xaa,
5740 		},
5741 		{ {0x40, 0xaa55bb66 } },
5742 	},
5743 	{
5744 		"LD_IND word unaligned (addr & 3 == 2)",
5745 		.u.insns = {
5746 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5747 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5748 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5749 		},
5750 		CLASSIC,
5751 		{
5752 			[0x1c] = 0xaa, [0x1d] = 0x55,
5753 			[0x1e] = 0xbb, [0x1f] = 0x66,
5754 			[0x20] = 0xcc, [0x21] = 0x77,
5755 			[0x22] = 0xdd, [0x23] = 0x88,
5756 			[0x24] = 0xee, [0x25] = 0x99,
5757 			[0x26] = 0xff, [0x27] = 0xaa,
5758 		},
5759 		{ {0x40, 0xbb66cc77 } },
5760 	},
5761 	{
5762 		"LD_IND word unaligned (addr & 3 == 1)",
5763 		.u.insns = {
5764 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5765 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
5766 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5767 		},
5768 		CLASSIC,
5769 		{
5770 			[0x1c] = 0xaa, [0x1d] = 0x55,
5771 			[0x1e] = 0xbb, [0x1f] = 0x66,
5772 			[0x20] = 0xcc, [0x21] = 0x77,
5773 			[0x22] = 0xdd, [0x23] = 0x88,
5774 			[0x24] = 0xee, [0x25] = 0x99,
5775 			[0x26] = 0xff, [0x27] = 0xaa,
5776 		},
5777 		{ {0x40, 0x55bb66cc } },
5778 	},
5779 	{
5780 		"LD_IND word unaligned (addr & 3 == 3)",
5781 		.u.insns = {
5782 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5783 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
5784 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5785 		},
5786 		CLASSIC,
5787 		{
5788 			[0x1c] = 0xaa, [0x1d] = 0x55,
5789 			[0x1e] = 0xbb, [0x1f] = 0x66,
5790 			[0x20] = 0xcc, [0x21] = 0x77,
5791 			[0x22] = 0xdd, [0x23] = 0x88,
5792 			[0x24] = 0xee, [0x25] = 0x99,
5793 			[0x26] = 0xff, [0x27] = 0xaa,
5794 		},
5795 		{ {0x40, 0x66cc77dd } },
5796 	},
5797 	{
5798 		"LD_ABS byte",
5799 		.u.insns = {
5800 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
5801 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5802 		},
5803 		CLASSIC,
5804 		{
5805 			[0x1c] = 0xaa, [0x1d] = 0x55,
5806 			[0x1e] = 0xbb, [0x1f] = 0x66,
5807 			[0x20] = 0xcc, [0x21] = 0x77,
5808 			[0x22] = 0xdd, [0x23] = 0x88,
5809 			[0x24] = 0xee, [0x25] = 0x99,
5810 			[0x26] = 0xff, [0x27] = 0xaa,
5811 		},
5812 		{ {0x40, 0xcc } },
5813 	},
5814 	{
5815 		"LD_ABS halfword",
5816 		.u.insns = {
5817 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
5818 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5819 		},
5820 		CLASSIC,
5821 		{
5822 			[0x1c] = 0xaa, [0x1d] = 0x55,
5823 			[0x1e] = 0xbb, [0x1f] = 0x66,
5824 			[0x20] = 0xcc, [0x21] = 0x77,
5825 			[0x22] = 0xdd, [0x23] = 0x88,
5826 			[0x24] = 0xee, [0x25] = 0x99,
5827 			[0x26] = 0xff, [0x27] = 0xaa,
5828 		},
5829 		{ {0x40, 0xdd88 } },
5830 	},
5831 	{
5832 		"LD_ABS halfword unaligned",
5833 		.u.insns = {
5834 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
5835 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5836 		},
5837 		CLASSIC,
5838 		{
5839 			[0x1c] = 0xaa, [0x1d] = 0x55,
5840 			[0x1e] = 0xbb, [0x1f] = 0x66,
5841 			[0x20] = 0xcc, [0x21] = 0x77,
5842 			[0x22] = 0xdd, [0x23] = 0x88,
5843 			[0x24] = 0xee, [0x25] = 0x99,
5844 			[0x26] = 0xff, [0x27] = 0xaa,
5845 		},
5846 		{ {0x40, 0x99ff } },
5847 	},
5848 	{
5849 		"LD_ABS word",
5850 		.u.insns = {
5851 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
5852 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5853 		},
5854 		CLASSIC,
5855 		{
5856 			[0x1c] = 0xaa, [0x1d] = 0x55,
5857 			[0x1e] = 0xbb, [0x1f] = 0x66,
5858 			[0x20] = 0xcc, [0x21] = 0x77,
5859 			[0x22] = 0xdd, [0x23] = 0x88,
5860 			[0x24] = 0xee, [0x25] = 0x99,
5861 			[0x26] = 0xff, [0x27] = 0xaa,
5862 		},
5863 		{ {0x40, 0xaa55bb66 } },
5864 	},
5865 	{
5866 		"LD_ABS word unaligned (addr & 3 == 2)",
5867 		.u.insns = {
5868 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
5869 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5870 		},
5871 		CLASSIC,
5872 		{
5873 			[0x1c] = 0xaa, [0x1d] = 0x55,
5874 			[0x1e] = 0xbb, [0x1f] = 0x66,
5875 			[0x20] = 0xcc, [0x21] = 0x77,
5876 			[0x22] = 0xdd, [0x23] = 0x88,
5877 			[0x24] = 0xee, [0x25] = 0x99,
5878 			[0x26] = 0xff, [0x27] = 0xaa,
5879 		},
5880 		{ {0x40, 0xdd88ee99 } },
5881 	},
5882 	{
5883 		"LD_ABS word unaligned (addr & 3 == 1)",
5884 		.u.insns = {
5885 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
5886 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5887 		},
5888 		CLASSIC,
5889 		{
5890 			[0x1c] = 0xaa, [0x1d] = 0x55,
5891 			[0x1e] = 0xbb, [0x1f] = 0x66,
5892 			[0x20] = 0xcc, [0x21] = 0x77,
5893 			[0x22] = 0xdd, [0x23] = 0x88,
5894 			[0x24] = 0xee, [0x25] = 0x99,
5895 			[0x26] = 0xff, [0x27] = 0xaa,
5896 		},
5897 		{ {0x40, 0x77dd88ee } },
5898 	},
5899 	{
5900 		"LD_ABS word unaligned (addr & 3 == 3)",
5901 		.u.insns = {
5902 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
5903 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5904 		},
5905 		CLASSIC,
5906 		{
5907 			[0x1c] = 0xaa, [0x1d] = 0x55,
5908 			[0x1e] = 0xbb, [0x1f] = 0x66,
5909 			[0x20] = 0xcc, [0x21] = 0x77,
5910 			[0x22] = 0xdd, [0x23] = 0x88,
5911 			[0x24] = 0xee, [0x25] = 0x99,
5912 			[0x26] = 0xff, [0x27] = 0xaa,
5913 		},
5914 		{ {0x40, 0x88ee99ff } },
5915 	},
5916 	/*
5917 	 * verify that the interpreter or JIT correctly sets A and X
5918 	 * to 0.
5919 	 */
5920 	{
5921 		"ADD default X",
5922 		.u.insns = {
5923 			/*
5924 			 * A = 0x42
5925 			 * A = A + X
5926 			 * ret A
5927 			 */
5928 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5929 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
5930 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5931 		},
5932 		CLASSIC | FLAG_NO_DATA,
5933 		{},
5934 		{ {0x1, 0x42 } },
5935 	},
5936 	{
5937 		"ADD default A",
5938 		.u.insns = {
5939 			/*
5940 			 * A = A + 0x42
5941 			 * ret A
5942 			 */
5943 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
5944 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5945 		},
5946 		CLASSIC | FLAG_NO_DATA,
5947 		{},
5948 		{ {0x1, 0x42 } },
5949 	},
5950 	{
5951 		"SUB default X",
5952 		.u.insns = {
5953 			/*
5954 			 * A = 0x66
5955 			 * A = A - X
5956 			 * ret A
5957 			 */
5958 			BPF_STMT(BPF_LD | BPF_IMM, 0x66),
5959 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
5960 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5961 		},
5962 		CLASSIC | FLAG_NO_DATA,
5963 		{},
5964 		{ {0x1, 0x66 } },
5965 	},
5966 	{
5967 		"SUB default A",
5968 		.u.insns = {
5969 			/*
5970 			 * A = A - -0x66
5971 			 * ret A
5972 			 */
5973 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
5974 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5975 		},
5976 		CLASSIC | FLAG_NO_DATA,
5977 		{},
5978 		{ {0x1, 0x66 } },
5979 	},
5980 	{
5981 		"MUL default X",
5982 		.u.insns = {
5983 			/*
5984 			 * A = 0x42
5985 			 * A = A * X
5986 			 * ret A
5987 			 */
5988 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5989 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
5990 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5991 		},
5992 		CLASSIC | FLAG_NO_DATA,
5993 		{},
5994 		{ {0x1, 0x0 } },
5995 	},
5996 	{
5997 		"MUL default A",
5998 		.u.insns = {
5999 			/*
6000 			 * A = A * 0x66
6001 			 * ret A
6002 			 */
6003 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
6004 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6005 		},
6006 		CLASSIC | FLAG_NO_DATA,
6007 		{},
6008 		{ {0x1, 0x0 } },
6009 	},
6010 	{
6011 		"DIV default X",
6012 		.u.insns = {
6013 			/*
6014 			 * A = 0x42
6015 			 * A = A / X ; this halt the filter execution if X is 0
6016 			 * ret 0x42
6017 			 */
6018 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6019 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
6020 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6021 		},
6022 		CLASSIC | FLAG_NO_DATA,
6023 		{},
6024 		{ {0x1, 0x0 } },
6025 	},
6026 	{
6027 		"DIV default A",
6028 		.u.insns = {
6029 			/*
6030 			 * A = A / 1
6031 			 * ret A
6032 			 */
6033 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
6034 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6035 		},
6036 		CLASSIC | FLAG_NO_DATA,
6037 		{},
6038 		{ {0x1, 0x0 } },
6039 	},
6040 	{
6041 		"MOD default X",
6042 		.u.insns = {
6043 			/*
6044 			 * A = 0x42
6045 			 * A = A mod X ; this halt the filter execution if X is 0
6046 			 * ret 0x42
6047 			 */
6048 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6049 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
6050 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6051 		},
6052 		CLASSIC | FLAG_NO_DATA,
6053 		{},
6054 		{ {0x1, 0x0 } },
6055 	},
6056 	{
6057 		"MOD default A",
6058 		.u.insns = {
6059 			/*
6060 			 * A = A mod 1
6061 			 * ret A
6062 			 */
6063 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
6064 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6065 		},
6066 		CLASSIC | FLAG_NO_DATA,
6067 		{},
6068 		{ {0x1, 0x0 } },
6069 	},
6070 	{
6071 		"JMP EQ default A",
6072 		.u.insns = {
6073 			/*
6074 			 * cmp A, 0x0, 0, 1
6075 			 * ret 0x42
6076 			 * ret 0x66
6077 			 */
6078 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
6079 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6080 			BPF_STMT(BPF_RET | BPF_K, 0x66),
6081 		},
6082 		CLASSIC | FLAG_NO_DATA,
6083 		{},
6084 		{ {0x1, 0x42 } },
6085 	},
6086 	{
6087 		"JMP EQ default X",
6088 		.u.insns = {
6089 			/*
6090 			 * A = 0x0
6091 			 * cmp A, X, 0, 1
6092 			 * ret 0x42
6093 			 * ret 0x66
6094 			 */
6095 			BPF_STMT(BPF_LD | BPF_IMM, 0x0),
6096 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
6097 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6098 			BPF_STMT(BPF_RET | BPF_K, 0x66),
6099 		},
6100 		CLASSIC | FLAG_NO_DATA,
6101 		{},
6102 		{ {0x1, 0x42 } },
6103 	},
6104 	{
6105 		"LD_ABS with helper changing skb data",
6106 		{ },
6107 		INTERNAL,
6108 		{ 0x34 },
6109 		{ { ETH_HLEN, 42 } },
6110 		.fill_helper = bpf_fill_ld_abs_vlan_push_pop2,
6111 	},
6112 };
6113 
6114 static struct net_device dev;
6115 
6116 static struct sk_buff *populate_skb(char *buf, int size)
6117 {
6118 	struct sk_buff *skb;
6119 
6120 	if (size >= MAX_DATA)
6121 		return NULL;
6122 
6123 	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
6124 	if (!skb)
6125 		return NULL;
6126 
6127 	__skb_put_data(skb, buf, size);
6128 
6129 	/* Initialize a fake skb with test pattern. */
6130 	skb_reset_mac_header(skb);
6131 	skb->protocol = htons(ETH_P_IP);
6132 	skb->pkt_type = SKB_TYPE;
6133 	skb->mark = SKB_MARK;
6134 	skb->hash = SKB_HASH;
6135 	skb->queue_mapping = SKB_QUEUE_MAP;
6136 	skb->vlan_tci = SKB_VLAN_TCI;
6137 	skb->vlan_proto = htons(ETH_P_IP);
6138 	skb->dev = &dev;
6139 	skb->dev->ifindex = SKB_DEV_IFINDEX;
6140 	skb->dev->type = SKB_DEV_TYPE;
6141 	skb_set_network_header(skb, min(size, ETH_HLEN));
6142 
6143 	return skb;
6144 }
6145 
6146 static void *generate_test_data(struct bpf_test *test, int sub)
6147 {
6148 	struct sk_buff *skb;
6149 	struct page *page;
6150 
6151 	if (test->aux & FLAG_NO_DATA)
6152 		return NULL;
6153 
6154 	/* Test case expects an skb, so populate one. Various
6155 	 * subtests generate skbs of different sizes based on
6156 	 * the same data.
6157 	 */
6158 	skb = populate_skb(test->data, test->test[sub].data_size);
6159 	if (!skb)
6160 		return NULL;
6161 
6162 	if (test->aux & FLAG_SKB_FRAG) {
6163 		/*
6164 		 * when the test requires a fragmented skb, add a
6165 		 * single fragment to the skb, filled with
6166 		 * test->frag_data.
6167 		 */
6168 		void *ptr;
6169 
6170 		page = alloc_page(GFP_KERNEL);
6171 
6172 		if (!page)
6173 			goto err_kfree_skb;
6174 
6175 		ptr = kmap(page);
6176 		if (!ptr)
6177 			goto err_free_page;
6178 		memcpy(ptr, test->frag_data, MAX_DATA);
6179 		kunmap(page);
6180 		skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
6181 	}
6182 
6183 	return skb;
6184 
6185 err_free_page:
6186 	__free_page(page);
6187 err_kfree_skb:
6188 	kfree_skb(skb);
6189 	return NULL;
6190 }
6191 
6192 static void release_test_data(const struct bpf_test *test, void *data)
6193 {
6194 	if (test->aux & FLAG_NO_DATA)
6195 		return;
6196 
6197 	kfree_skb(data);
6198 }
6199 
6200 static int filter_length(int which)
6201 {
6202 	struct sock_filter *fp;
6203 	int len;
6204 
6205 	if (tests[which].fill_helper)
6206 		return tests[which].u.ptr.len;
6207 
6208 	fp = tests[which].u.insns;
6209 	for (len = MAX_INSNS - 1; len > 0; --len)
6210 		if (fp[len].code != 0 || fp[len].k != 0)
6211 			break;
6212 
6213 	return len + 1;
6214 }
6215 
6216 static void *filter_pointer(int which)
6217 {
6218 	if (tests[which].fill_helper)
6219 		return tests[which].u.ptr.insns;
6220 	else
6221 		return tests[which].u.insns;
6222 }
6223 
6224 static struct bpf_prog *generate_filter(int which, int *err)
6225 {
6226 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6227 	unsigned int flen = filter_length(which);
6228 	void *fptr = filter_pointer(which);
6229 	struct sock_fprog_kern fprog;
6230 	struct bpf_prog *fp;
6231 
6232 	switch (test_type) {
6233 	case CLASSIC:
6234 		fprog.filter = fptr;
6235 		fprog.len = flen;
6236 
6237 		*err = bpf_prog_create(&fp, &fprog);
6238 		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
6239 			if (*err == -EINVAL) {
6240 				pr_cont("PASS\n");
6241 				/* Verifier rejected filter as expected. */
6242 				*err = 0;
6243 				return NULL;
6244 			} else {
6245 				pr_cont("UNEXPECTED_PASS\n");
6246 				/* Verifier didn't reject the test that's
6247 				 * bad enough, just return!
6248 				 */
6249 				*err = -EINVAL;
6250 				return NULL;
6251 			}
6252 		}
6253 		/* We don't expect to fail. */
6254 		if (*err) {
6255 			pr_cont("FAIL to attach err=%d len=%d\n",
6256 				*err, fprog.len);
6257 			return NULL;
6258 		}
6259 		break;
6260 
6261 	case INTERNAL:
6262 		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
6263 		if (fp == NULL) {
6264 			pr_cont("UNEXPECTED_FAIL no memory left\n");
6265 			*err = -ENOMEM;
6266 			return NULL;
6267 		}
6268 
6269 		fp->len = flen;
6270 		/* Type doesn't really matter here as long as it's not unspec. */
6271 		fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
6272 		memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
6273 		fp->aux->stack_depth = tests[which].stack_depth;
6274 
6275 		/* We cannot error here as we don't need type compatibility
6276 		 * checks.
6277 		 */
6278 		fp = bpf_prog_select_runtime(fp, err);
6279 		break;
6280 	}
6281 
6282 	*err = 0;
6283 	return fp;
6284 }
6285 
6286 static void release_filter(struct bpf_prog *fp, int which)
6287 {
6288 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6289 
6290 	switch (test_type) {
6291 	case CLASSIC:
6292 		bpf_prog_destroy(fp);
6293 		break;
6294 	case INTERNAL:
6295 		bpf_prog_free(fp);
6296 		break;
6297 	}
6298 }
6299 
6300 static int __run_one(const struct bpf_prog *fp, const void *data,
6301 		     int runs, u64 *duration)
6302 {
6303 	u64 start, finish;
6304 	int ret = 0, i;
6305 
6306 	start = ktime_get_ns();
6307 
6308 	for (i = 0; i < runs; i++)
6309 		ret = BPF_PROG_RUN(fp, data);
6310 
6311 	finish = ktime_get_ns();
6312 
6313 	*duration = finish - start;
6314 	do_div(*duration, runs);
6315 
6316 	return ret;
6317 }
6318 
6319 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
6320 {
6321 	int err_cnt = 0, i, runs = MAX_TESTRUNS;
6322 
6323 	for (i = 0; i < MAX_SUBTESTS; i++) {
6324 		void *data;
6325 		u64 duration;
6326 		u32 ret;
6327 
6328 		if (test->test[i].data_size == 0 &&
6329 		    test->test[i].result == 0)
6330 			break;
6331 
6332 		data = generate_test_data(test, i);
6333 		if (!data && !(test->aux & FLAG_NO_DATA)) {
6334 			pr_cont("data generation failed ");
6335 			err_cnt++;
6336 			break;
6337 		}
6338 		ret = __run_one(fp, data, runs, &duration);
6339 		release_test_data(test, data);
6340 
6341 		if (ret == test->test[i].result) {
6342 			pr_cont("%lld ", duration);
6343 		} else {
6344 			pr_cont("ret %d != %d ", ret,
6345 				test->test[i].result);
6346 			err_cnt++;
6347 		}
6348 	}
6349 
6350 	return err_cnt;
6351 }
6352 
6353 static char test_name[64];
6354 module_param_string(test_name, test_name, sizeof(test_name), 0);
6355 
6356 static int test_id = -1;
6357 module_param(test_id, int, 0);
6358 
6359 static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
6360 module_param_array(test_range, int, NULL, 0);
6361 
6362 static __init int find_test_index(const char *test_name)
6363 {
6364 	int i;
6365 
6366 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6367 		if (!strcmp(tests[i].descr, test_name))
6368 			return i;
6369 	}
6370 	return -1;
6371 }
6372 
6373 static __init int prepare_bpf_tests(void)
6374 {
6375 	int i;
6376 
6377 	if (test_id >= 0) {
6378 		/*
6379 		 * if a test_id was specified, use test_range to
6380 		 * cover only that test.
6381 		 */
6382 		if (test_id >= ARRAY_SIZE(tests)) {
6383 			pr_err("test_bpf: invalid test_id specified.\n");
6384 			return -EINVAL;
6385 		}
6386 
6387 		test_range[0] = test_id;
6388 		test_range[1] = test_id;
6389 	} else if (*test_name) {
6390 		/*
6391 		 * if a test_name was specified, find it and setup
6392 		 * test_range to cover only that test.
6393 		 */
6394 		int idx = find_test_index(test_name);
6395 
6396 		if (idx < 0) {
6397 			pr_err("test_bpf: no test named '%s' found.\n",
6398 			       test_name);
6399 			return -EINVAL;
6400 		}
6401 		test_range[0] = idx;
6402 		test_range[1] = idx;
6403 	} else {
6404 		/*
6405 		 * check that the supplied test_range is valid.
6406 		 */
6407 		if (test_range[0] >= ARRAY_SIZE(tests) ||
6408 		    test_range[1] >= ARRAY_SIZE(tests) ||
6409 		    test_range[0] < 0 || test_range[1] < 0) {
6410 			pr_err("test_bpf: test_range is out of bound.\n");
6411 			return -EINVAL;
6412 		}
6413 
6414 		if (test_range[1] < test_range[0]) {
6415 			pr_err("test_bpf: test_range is ending before it starts.\n");
6416 			return -EINVAL;
6417 		}
6418 	}
6419 
6420 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6421 		if (tests[i].fill_helper &&
6422 		    tests[i].fill_helper(&tests[i]) < 0)
6423 			return -ENOMEM;
6424 	}
6425 
6426 	return 0;
6427 }
6428 
6429 static __init void destroy_bpf_tests(void)
6430 {
6431 	int i;
6432 
6433 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6434 		if (tests[i].fill_helper)
6435 			kfree(tests[i].u.ptr.insns);
6436 	}
6437 }
6438 
6439 static bool exclude_test(int test_id)
6440 {
6441 	return test_id < test_range[0] || test_id > test_range[1];
6442 }
6443 
6444 static __init int test_bpf(void)
6445 {
6446 	int i, err_cnt = 0, pass_cnt = 0;
6447 	int jit_cnt = 0, run_cnt = 0;
6448 
6449 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6450 		struct bpf_prog *fp;
6451 		int err;
6452 
6453 		if (exclude_test(i))
6454 			continue;
6455 
6456 		pr_info("#%d %s ", i, tests[i].descr);
6457 
6458 		fp = generate_filter(i, &err);
6459 		if (fp == NULL) {
6460 			if (err == 0) {
6461 				pass_cnt++;
6462 				continue;
6463 			}
6464 
6465 			return err;
6466 		}
6467 
6468 		pr_cont("jited:%u ", fp->jited);
6469 
6470 		run_cnt++;
6471 		if (fp->jited)
6472 			jit_cnt++;
6473 
6474 		err = run_one(fp, &tests[i]);
6475 		release_filter(fp, i);
6476 
6477 		if (err) {
6478 			pr_cont("FAIL (%d times)\n", err);
6479 			err_cnt++;
6480 		} else {
6481 			pr_cont("PASS\n");
6482 			pass_cnt++;
6483 		}
6484 	}
6485 
6486 	pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
6487 		pass_cnt, err_cnt, jit_cnt, run_cnt);
6488 
6489 	return err_cnt ? -EINVAL : 0;
6490 }
6491 
6492 static int __init test_bpf_init(void)
6493 {
6494 	int ret;
6495 
6496 	ret = prepare_bpf_tests();
6497 	if (ret < 0)
6498 		return ret;
6499 
6500 	ret = test_bpf();
6501 
6502 	destroy_bpf_tests();
6503 	return ret;
6504 }
6505 
6506 static void __exit test_bpf_exit(void)
6507 {
6508 }
6509 
6510 module_init(test_bpf_init);
6511 module_exit(test_bpf_exit);
6512 
6513 MODULE_LICENSE("GPL");
6514