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