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