xref: /openbmc/linux/lib/test_bpf.c (revision b593bce5)
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, so cannot get JITed there. */
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, 10 ^ 300 }, { 20, 10 ^ 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_XADD | 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_STX_XADD(BPF_W, 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_STX_XADD(BPF_W, 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_STX_XADD(BPF_W, 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_STX_XADD(BPF_DW, 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_STX_XADD(BPF_DW, 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_STX_XADD(BPF_DW, 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 #if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_S390)
5279 		CLASSIC | FLAG_EXPECTED_FAIL,
5280 #else
5281 		CLASSIC,
5282 #endif
5283 		{ },
5284 		{
5285 			{  1, SKB_VLAN_PRESENT },
5286 			{ 10, SKB_VLAN_PRESENT }
5287 		},
5288 		.fill_helper = bpf_fill_maxinsns6,
5289 		.expected_errcode = -ENOTSUPP,
5290 	},
5291 	{	/* Mainly checking JIT here. */
5292 		"BPF_MAXINSNS: Call heavy transformations",
5293 		{ },
5294 #if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_S390)
5295 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5296 #else
5297 		CLASSIC | FLAG_NO_DATA,
5298 #endif
5299 		{ },
5300 		{ { 1, 0 }, { 10, 0 } },
5301 		.fill_helper = bpf_fill_maxinsns7,
5302 		.expected_errcode = -ENOTSUPP,
5303 	},
5304 	{	/* Mainly checking JIT here. */
5305 		"BPF_MAXINSNS: Jump heavy test",
5306 		{ },
5307 		CLASSIC | FLAG_NO_DATA,
5308 		{ },
5309 		{ { 0, 0xffffffff } },
5310 		.fill_helper = bpf_fill_maxinsns8,
5311 	},
5312 	{	/* Mainly checking JIT here. */
5313 		"BPF_MAXINSNS: Very long jump backwards",
5314 		{ },
5315 		INTERNAL | FLAG_NO_DATA,
5316 		{ },
5317 		{ { 0, 0xcbababab } },
5318 		.fill_helper = bpf_fill_maxinsns9,
5319 	},
5320 	{	/* Mainly checking JIT here. */
5321 		"BPF_MAXINSNS: Edge hopping nuthouse",
5322 		{ },
5323 		INTERNAL | FLAG_NO_DATA,
5324 		{ },
5325 		{ { 0, 0xabababac } },
5326 		.fill_helper = bpf_fill_maxinsns10,
5327 	},
5328 	{
5329 		"BPF_MAXINSNS: Jump, gap, jump, ...",
5330 		{ },
5331 #if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_X86)
5332 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5333 #else
5334 		CLASSIC | FLAG_NO_DATA,
5335 #endif
5336 		{ },
5337 		{ { 0, 0xababcbac } },
5338 		.fill_helper = bpf_fill_maxinsns11,
5339 		.expected_errcode = -ENOTSUPP,
5340 	},
5341 	{
5342 		"BPF_MAXINSNS: jump over MSH",
5343 		{ },
5344 		CLASSIC | FLAG_EXPECTED_FAIL,
5345 		{ 0xfa, 0xfb, 0xfc, 0xfd, },
5346 		{ { 4, 0xabababab } },
5347 		.fill_helper = bpf_fill_maxinsns12,
5348 		.expected_errcode = -EINVAL,
5349 	},
5350 	{
5351 		"BPF_MAXINSNS: exec all MSH",
5352 		{ },
5353 #if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_S390)
5354 		CLASSIC | FLAG_EXPECTED_FAIL,
5355 #else
5356 		CLASSIC,
5357 #endif
5358 		{ 0xfa, 0xfb, 0xfc, 0xfd, },
5359 		{ { 4, 0xababab83 } },
5360 		.fill_helper = bpf_fill_maxinsns13,
5361 		.expected_errcode = -ENOTSUPP,
5362 	},
5363 	{
5364 		"BPF_MAXINSNS: ld_abs+get_processor_id",
5365 		{ },
5366 #if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_S390)
5367 		CLASSIC | FLAG_EXPECTED_FAIL,
5368 #else
5369 		CLASSIC,
5370 #endif
5371 		{ },
5372 		{ { 1, 0xbee } },
5373 		.fill_helper = bpf_fill_ld_abs_get_processor_id,
5374 		.expected_errcode = -ENOTSUPP,
5375 	},
5376 	/*
5377 	 * LD_IND / LD_ABS on fragmented SKBs
5378 	 */
5379 	{
5380 		"LD_IND byte frag",
5381 		.u.insns = {
5382 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5383 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
5384 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5385 		},
5386 		CLASSIC | FLAG_SKB_FRAG,
5387 		{ },
5388 		{ {0x40, 0x42} },
5389 		.frag_data = {
5390 			0x42, 0x00, 0x00, 0x00,
5391 			0x43, 0x44, 0x00, 0x00,
5392 			0x21, 0x07, 0x19, 0x83,
5393 		},
5394 	},
5395 	{
5396 		"LD_IND halfword frag",
5397 		.u.insns = {
5398 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5399 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
5400 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5401 		},
5402 		CLASSIC | FLAG_SKB_FRAG,
5403 		{ },
5404 		{ {0x40, 0x4344} },
5405 		.frag_data = {
5406 			0x42, 0x00, 0x00, 0x00,
5407 			0x43, 0x44, 0x00, 0x00,
5408 			0x21, 0x07, 0x19, 0x83,
5409 		},
5410 	},
5411 	{
5412 		"LD_IND word frag",
5413 		.u.insns = {
5414 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5415 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
5416 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5417 		},
5418 		CLASSIC | FLAG_SKB_FRAG,
5419 		{ },
5420 		{ {0x40, 0x21071983} },
5421 		.frag_data = {
5422 			0x42, 0x00, 0x00, 0x00,
5423 			0x43, 0x44, 0x00, 0x00,
5424 			0x21, 0x07, 0x19, 0x83,
5425 		},
5426 	},
5427 	{
5428 		"LD_IND halfword mixed head/frag",
5429 		.u.insns = {
5430 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5431 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5432 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5433 		},
5434 		CLASSIC | FLAG_SKB_FRAG,
5435 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5436 		{ {0x40, 0x0519} },
5437 		.frag_data = { 0x19, 0x82 },
5438 	},
5439 	{
5440 		"LD_IND word mixed head/frag",
5441 		.u.insns = {
5442 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5443 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5444 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5445 		},
5446 		CLASSIC | FLAG_SKB_FRAG,
5447 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5448 		{ {0x40, 0x25051982} },
5449 		.frag_data = { 0x19, 0x82 },
5450 	},
5451 	{
5452 		"LD_ABS byte frag",
5453 		.u.insns = {
5454 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
5455 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5456 		},
5457 		CLASSIC | FLAG_SKB_FRAG,
5458 		{ },
5459 		{ {0x40, 0x42} },
5460 		.frag_data = {
5461 			0x42, 0x00, 0x00, 0x00,
5462 			0x43, 0x44, 0x00, 0x00,
5463 			0x21, 0x07, 0x19, 0x83,
5464 		},
5465 	},
5466 	{
5467 		"LD_ABS halfword frag",
5468 		.u.insns = {
5469 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
5470 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5471 		},
5472 		CLASSIC | FLAG_SKB_FRAG,
5473 		{ },
5474 		{ {0x40, 0x4344} },
5475 		.frag_data = {
5476 			0x42, 0x00, 0x00, 0x00,
5477 			0x43, 0x44, 0x00, 0x00,
5478 			0x21, 0x07, 0x19, 0x83,
5479 		},
5480 	},
5481 	{
5482 		"LD_ABS word frag",
5483 		.u.insns = {
5484 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
5485 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5486 		},
5487 		CLASSIC | FLAG_SKB_FRAG,
5488 		{ },
5489 		{ {0x40, 0x21071983} },
5490 		.frag_data = {
5491 			0x42, 0x00, 0x00, 0x00,
5492 			0x43, 0x44, 0x00, 0x00,
5493 			0x21, 0x07, 0x19, 0x83,
5494 		},
5495 	},
5496 	{
5497 		"LD_ABS halfword mixed head/frag",
5498 		.u.insns = {
5499 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
5500 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5501 		},
5502 		CLASSIC | FLAG_SKB_FRAG,
5503 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5504 		{ {0x40, 0x0519} },
5505 		.frag_data = { 0x19, 0x82 },
5506 	},
5507 	{
5508 		"LD_ABS word mixed head/frag",
5509 		.u.insns = {
5510 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
5511 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5512 		},
5513 		CLASSIC | FLAG_SKB_FRAG,
5514 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5515 		{ {0x40, 0x25051982} },
5516 		.frag_data = { 0x19, 0x82 },
5517 	},
5518 	/*
5519 	 * LD_IND / LD_ABS on non fragmented SKBs
5520 	 */
5521 	{
5522 		/*
5523 		 * this tests that the JIT/interpreter correctly resets X
5524 		 * before using it in an LD_IND instruction.
5525 		 */
5526 		"LD_IND byte default X",
5527 		.u.insns = {
5528 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5529 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5530 		},
5531 		CLASSIC,
5532 		{ [0x1] = 0x42 },
5533 		{ {0x40, 0x42 } },
5534 	},
5535 	{
5536 		"LD_IND byte positive offset",
5537 		.u.insns = {
5538 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5539 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5540 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5541 		},
5542 		CLASSIC,
5543 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5544 		{ {0x40, 0x82 } },
5545 	},
5546 	{
5547 		"LD_IND byte negative offset",
5548 		.u.insns = {
5549 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5550 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
5551 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5552 		},
5553 		CLASSIC,
5554 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5555 		{ {0x40, 0x05 } },
5556 	},
5557 	{
5558 		"LD_IND byte positive offset, all ff",
5559 		.u.insns = {
5560 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5561 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5562 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5563 		},
5564 		CLASSIC,
5565 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5566 		{ {0x40, 0xff } },
5567 	},
5568 	{
5569 		"LD_IND byte positive offset, out of bounds",
5570 		.u.insns = {
5571 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5572 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5573 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5574 		},
5575 		CLASSIC,
5576 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5577 		{ {0x3f, 0 }, },
5578 	},
5579 	{
5580 		"LD_IND byte negative offset, out of bounds",
5581 		.u.insns = {
5582 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5583 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
5584 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5585 		},
5586 		CLASSIC,
5587 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5588 		{ {0x3f, 0 } },
5589 	},
5590 	{
5591 		"LD_IND byte negative offset, multiple calls",
5592 		.u.insns = {
5593 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
5594 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
5595 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
5596 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
5597 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
5598 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5599 		},
5600 		CLASSIC,
5601 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5602 		{ {0x40, 0x82 }, },
5603 	},
5604 	{
5605 		"LD_IND halfword positive offset",
5606 		.u.insns = {
5607 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5608 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
5609 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5610 		},
5611 		CLASSIC,
5612 		{
5613 			[0x1c] = 0xaa, [0x1d] = 0x55,
5614 			[0x1e] = 0xbb, [0x1f] = 0x66,
5615 			[0x20] = 0xcc, [0x21] = 0x77,
5616 			[0x22] = 0xdd, [0x23] = 0x88,
5617 		},
5618 		{ {0x40, 0xdd88 } },
5619 	},
5620 	{
5621 		"LD_IND halfword negative offset",
5622 		.u.insns = {
5623 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5624 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
5625 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5626 		},
5627 		CLASSIC,
5628 		{
5629 			[0x1c] = 0xaa, [0x1d] = 0x55,
5630 			[0x1e] = 0xbb, [0x1f] = 0x66,
5631 			[0x20] = 0xcc, [0x21] = 0x77,
5632 			[0x22] = 0xdd, [0x23] = 0x88,
5633 		},
5634 		{ {0x40, 0xbb66 } },
5635 	},
5636 	{
5637 		"LD_IND halfword unaligned",
5638 		.u.insns = {
5639 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5640 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5641 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5642 		},
5643 		CLASSIC,
5644 		{
5645 			[0x1c] = 0xaa, [0x1d] = 0x55,
5646 			[0x1e] = 0xbb, [0x1f] = 0x66,
5647 			[0x20] = 0xcc, [0x21] = 0x77,
5648 			[0x22] = 0xdd, [0x23] = 0x88,
5649 		},
5650 		{ {0x40, 0x66cc } },
5651 	},
5652 	{
5653 		"LD_IND halfword positive offset, all ff",
5654 		.u.insns = {
5655 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
5656 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
5657 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5658 		},
5659 		CLASSIC,
5660 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5661 		{ {0x40, 0xffff } },
5662 	},
5663 	{
5664 		"LD_IND halfword positive offset, out of bounds",
5665 		.u.insns = {
5666 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5667 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
5668 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5669 		},
5670 		CLASSIC,
5671 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5672 		{ {0x3f, 0 }, },
5673 	},
5674 	{
5675 		"LD_IND halfword negative offset, out of bounds",
5676 		.u.insns = {
5677 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5678 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
5679 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5680 		},
5681 		CLASSIC,
5682 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5683 		{ {0x3f, 0 } },
5684 	},
5685 	{
5686 		"LD_IND word positive offset",
5687 		.u.insns = {
5688 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5689 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
5690 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5691 		},
5692 		CLASSIC,
5693 		{
5694 			[0x1c] = 0xaa, [0x1d] = 0x55,
5695 			[0x1e] = 0xbb, [0x1f] = 0x66,
5696 			[0x20] = 0xcc, [0x21] = 0x77,
5697 			[0x22] = 0xdd, [0x23] = 0x88,
5698 			[0x24] = 0xee, [0x25] = 0x99,
5699 			[0x26] = 0xff, [0x27] = 0xaa,
5700 		},
5701 		{ {0x40, 0xee99ffaa } },
5702 	},
5703 	{
5704 		"LD_IND word negative offset",
5705 		.u.insns = {
5706 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5707 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
5708 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5709 		},
5710 		CLASSIC,
5711 		{
5712 			[0x1c] = 0xaa, [0x1d] = 0x55,
5713 			[0x1e] = 0xbb, [0x1f] = 0x66,
5714 			[0x20] = 0xcc, [0x21] = 0x77,
5715 			[0x22] = 0xdd, [0x23] = 0x88,
5716 			[0x24] = 0xee, [0x25] = 0x99,
5717 			[0x26] = 0xff, [0x27] = 0xaa,
5718 		},
5719 		{ {0x40, 0xaa55bb66 } },
5720 	},
5721 	{
5722 		"LD_IND word unaligned (addr & 3 == 2)",
5723 		.u.insns = {
5724 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5725 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5726 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5727 		},
5728 		CLASSIC,
5729 		{
5730 			[0x1c] = 0xaa, [0x1d] = 0x55,
5731 			[0x1e] = 0xbb, [0x1f] = 0x66,
5732 			[0x20] = 0xcc, [0x21] = 0x77,
5733 			[0x22] = 0xdd, [0x23] = 0x88,
5734 			[0x24] = 0xee, [0x25] = 0x99,
5735 			[0x26] = 0xff, [0x27] = 0xaa,
5736 		},
5737 		{ {0x40, 0xbb66cc77 } },
5738 	},
5739 	{
5740 		"LD_IND word unaligned (addr & 3 == 1)",
5741 		.u.insns = {
5742 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5743 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
5744 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5745 		},
5746 		CLASSIC,
5747 		{
5748 			[0x1c] = 0xaa, [0x1d] = 0x55,
5749 			[0x1e] = 0xbb, [0x1f] = 0x66,
5750 			[0x20] = 0xcc, [0x21] = 0x77,
5751 			[0x22] = 0xdd, [0x23] = 0x88,
5752 			[0x24] = 0xee, [0x25] = 0x99,
5753 			[0x26] = 0xff, [0x27] = 0xaa,
5754 		},
5755 		{ {0x40, 0x55bb66cc } },
5756 	},
5757 	{
5758 		"LD_IND word unaligned (addr & 3 == 3)",
5759 		.u.insns = {
5760 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5761 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
5762 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5763 		},
5764 		CLASSIC,
5765 		{
5766 			[0x1c] = 0xaa, [0x1d] = 0x55,
5767 			[0x1e] = 0xbb, [0x1f] = 0x66,
5768 			[0x20] = 0xcc, [0x21] = 0x77,
5769 			[0x22] = 0xdd, [0x23] = 0x88,
5770 			[0x24] = 0xee, [0x25] = 0x99,
5771 			[0x26] = 0xff, [0x27] = 0xaa,
5772 		},
5773 		{ {0x40, 0x66cc77dd } },
5774 	},
5775 	{
5776 		"LD_IND word positive offset, all ff",
5777 		.u.insns = {
5778 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
5779 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
5780 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5781 		},
5782 		CLASSIC,
5783 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5784 		{ {0x40, 0xffffffff } },
5785 	},
5786 	{
5787 		"LD_IND word positive offset, out of bounds",
5788 		.u.insns = {
5789 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5790 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
5791 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5792 		},
5793 		CLASSIC,
5794 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5795 		{ {0x3f, 0 }, },
5796 	},
5797 	{
5798 		"LD_IND word negative offset, out of bounds",
5799 		.u.insns = {
5800 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5801 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
5802 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5803 		},
5804 		CLASSIC,
5805 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5806 		{ {0x3f, 0 } },
5807 	},
5808 	{
5809 		"LD_ABS byte",
5810 		.u.insns = {
5811 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
5812 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5813 		},
5814 		CLASSIC,
5815 		{
5816 			[0x1c] = 0xaa, [0x1d] = 0x55,
5817 			[0x1e] = 0xbb, [0x1f] = 0x66,
5818 			[0x20] = 0xcc, [0x21] = 0x77,
5819 			[0x22] = 0xdd, [0x23] = 0x88,
5820 			[0x24] = 0xee, [0x25] = 0x99,
5821 			[0x26] = 0xff, [0x27] = 0xaa,
5822 		},
5823 		{ {0x40, 0xcc } },
5824 	},
5825 	{
5826 		"LD_ABS byte positive offset, all ff",
5827 		.u.insns = {
5828 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
5829 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5830 		},
5831 		CLASSIC,
5832 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5833 		{ {0x40, 0xff } },
5834 	},
5835 	{
5836 		"LD_ABS byte positive offset, out of bounds",
5837 		.u.insns = {
5838 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
5839 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5840 		},
5841 		CLASSIC,
5842 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5843 		{ {0x3f, 0 }, },
5844 	},
5845 	{
5846 		"LD_ABS byte negative offset, out of bounds load",
5847 		.u.insns = {
5848 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
5849 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5850 		},
5851 		CLASSIC | FLAG_EXPECTED_FAIL,
5852 		.expected_errcode = -EINVAL,
5853 	},
5854 	{
5855 		"LD_ABS byte negative offset, in bounds",
5856 		.u.insns = {
5857 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
5858 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5859 		},
5860 		CLASSIC,
5861 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5862 		{ {0x40, 0x82 }, },
5863 	},
5864 	{
5865 		"LD_ABS byte negative offset, out of bounds",
5866 		.u.insns = {
5867 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
5868 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5869 		},
5870 		CLASSIC,
5871 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5872 		{ {0x3f, 0 }, },
5873 	},
5874 	{
5875 		"LD_ABS byte negative offset, multiple calls",
5876 		.u.insns = {
5877 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
5878 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
5879 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
5880 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
5881 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5882 		},
5883 		CLASSIC,
5884 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5885 		{ {0x40, 0x82 }, },
5886 	},
5887 	{
5888 		"LD_ABS halfword",
5889 		.u.insns = {
5890 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
5891 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5892 		},
5893 		CLASSIC,
5894 		{
5895 			[0x1c] = 0xaa, [0x1d] = 0x55,
5896 			[0x1e] = 0xbb, [0x1f] = 0x66,
5897 			[0x20] = 0xcc, [0x21] = 0x77,
5898 			[0x22] = 0xdd, [0x23] = 0x88,
5899 			[0x24] = 0xee, [0x25] = 0x99,
5900 			[0x26] = 0xff, [0x27] = 0xaa,
5901 		},
5902 		{ {0x40, 0xdd88 } },
5903 	},
5904 	{
5905 		"LD_ABS halfword unaligned",
5906 		.u.insns = {
5907 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
5908 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5909 		},
5910 		CLASSIC,
5911 		{
5912 			[0x1c] = 0xaa, [0x1d] = 0x55,
5913 			[0x1e] = 0xbb, [0x1f] = 0x66,
5914 			[0x20] = 0xcc, [0x21] = 0x77,
5915 			[0x22] = 0xdd, [0x23] = 0x88,
5916 			[0x24] = 0xee, [0x25] = 0x99,
5917 			[0x26] = 0xff, [0x27] = 0xaa,
5918 		},
5919 		{ {0x40, 0x99ff } },
5920 	},
5921 	{
5922 		"LD_ABS halfword positive offset, all ff",
5923 		.u.insns = {
5924 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
5925 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5926 		},
5927 		CLASSIC,
5928 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5929 		{ {0x40, 0xffff } },
5930 	},
5931 	{
5932 		"LD_ABS halfword positive offset, out of bounds",
5933 		.u.insns = {
5934 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
5935 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5936 		},
5937 		CLASSIC,
5938 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5939 		{ {0x3f, 0 }, },
5940 	},
5941 	{
5942 		"LD_ABS halfword negative offset, out of bounds load",
5943 		.u.insns = {
5944 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
5945 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5946 		},
5947 		CLASSIC | FLAG_EXPECTED_FAIL,
5948 		.expected_errcode = -EINVAL,
5949 	},
5950 	{
5951 		"LD_ABS halfword negative offset, in bounds",
5952 		.u.insns = {
5953 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
5954 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5955 		},
5956 		CLASSIC,
5957 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5958 		{ {0x40, 0x1982 }, },
5959 	},
5960 	{
5961 		"LD_ABS halfword negative offset, out of bounds",
5962 		.u.insns = {
5963 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
5964 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5965 		},
5966 		CLASSIC,
5967 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5968 		{ {0x3f, 0 }, },
5969 	},
5970 	{
5971 		"LD_ABS word",
5972 		.u.insns = {
5973 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
5974 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5975 		},
5976 		CLASSIC,
5977 		{
5978 			[0x1c] = 0xaa, [0x1d] = 0x55,
5979 			[0x1e] = 0xbb, [0x1f] = 0x66,
5980 			[0x20] = 0xcc, [0x21] = 0x77,
5981 			[0x22] = 0xdd, [0x23] = 0x88,
5982 			[0x24] = 0xee, [0x25] = 0x99,
5983 			[0x26] = 0xff, [0x27] = 0xaa,
5984 		},
5985 		{ {0x40, 0xaa55bb66 } },
5986 	},
5987 	{
5988 		"LD_ABS word unaligned (addr & 3 == 2)",
5989 		.u.insns = {
5990 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
5991 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5992 		},
5993 		CLASSIC,
5994 		{
5995 			[0x1c] = 0xaa, [0x1d] = 0x55,
5996 			[0x1e] = 0xbb, [0x1f] = 0x66,
5997 			[0x20] = 0xcc, [0x21] = 0x77,
5998 			[0x22] = 0xdd, [0x23] = 0x88,
5999 			[0x24] = 0xee, [0x25] = 0x99,
6000 			[0x26] = 0xff, [0x27] = 0xaa,
6001 		},
6002 		{ {0x40, 0xdd88ee99 } },
6003 	},
6004 	{
6005 		"LD_ABS word unaligned (addr & 3 == 1)",
6006 		.u.insns = {
6007 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
6008 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6009 		},
6010 		CLASSIC,
6011 		{
6012 			[0x1c] = 0xaa, [0x1d] = 0x55,
6013 			[0x1e] = 0xbb, [0x1f] = 0x66,
6014 			[0x20] = 0xcc, [0x21] = 0x77,
6015 			[0x22] = 0xdd, [0x23] = 0x88,
6016 			[0x24] = 0xee, [0x25] = 0x99,
6017 			[0x26] = 0xff, [0x27] = 0xaa,
6018 		},
6019 		{ {0x40, 0x77dd88ee } },
6020 	},
6021 	{
6022 		"LD_ABS word unaligned (addr & 3 == 3)",
6023 		.u.insns = {
6024 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
6025 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6026 		},
6027 		CLASSIC,
6028 		{
6029 			[0x1c] = 0xaa, [0x1d] = 0x55,
6030 			[0x1e] = 0xbb, [0x1f] = 0x66,
6031 			[0x20] = 0xcc, [0x21] = 0x77,
6032 			[0x22] = 0xdd, [0x23] = 0x88,
6033 			[0x24] = 0xee, [0x25] = 0x99,
6034 			[0x26] = 0xff, [0x27] = 0xaa,
6035 		},
6036 		{ {0x40, 0x88ee99ff } },
6037 	},
6038 	{
6039 		"LD_ABS word positive offset, all ff",
6040 		.u.insns = {
6041 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
6042 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6043 		},
6044 		CLASSIC,
6045 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
6046 		{ {0x40, 0xffffffff } },
6047 	},
6048 	{
6049 		"LD_ABS word positive offset, out of bounds",
6050 		.u.insns = {
6051 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
6052 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6053 		},
6054 		CLASSIC,
6055 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6056 		{ {0x3f, 0 }, },
6057 	},
6058 	{
6059 		"LD_ABS word negative offset, out of bounds load",
6060 		.u.insns = {
6061 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
6062 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6063 		},
6064 		CLASSIC | FLAG_EXPECTED_FAIL,
6065 		.expected_errcode = -EINVAL,
6066 	},
6067 	{
6068 		"LD_ABS word negative offset, in bounds",
6069 		.u.insns = {
6070 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
6071 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6072 		},
6073 		CLASSIC,
6074 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6075 		{ {0x40, 0x25051982 }, },
6076 	},
6077 	{
6078 		"LD_ABS word negative offset, out of bounds",
6079 		.u.insns = {
6080 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
6081 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6082 		},
6083 		CLASSIC,
6084 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6085 		{ {0x3f, 0 }, },
6086 	},
6087 	{
6088 		"LDX_MSH standalone, preserved A",
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_RET | BPF_A, 0x0),
6093 		},
6094 		CLASSIC,
6095 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6096 		{ {0x40, 0xffeebbaa }, },
6097 	},
6098 	{
6099 		"LDX_MSH standalone, preserved A 2",
6100 		.u.insns = {
6101 			BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
6102 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
6103 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
6104 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
6105 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
6106 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6107 		},
6108 		CLASSIC,
6109 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6110 		{ {0x40, 0x175e9d63 }, },
6111 	},
6112 	{
6113 		"LDX_MSH standalone, test result 1",
6114 		.u.insns = {
6115 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6116 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
6117 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6118 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6119 		},
6120 		CLASSIC,
6121 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6122 		{ {0x40, 0x14 }, },
6123 	},
6124 	{
6125 		"LDX_MSH standalone, test result 2",
6126 		.u.insns = {
6127 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6128 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
6129 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6130 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6131 		},
6132 		CLASSIC,
6133 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6134 		{ {0x40, 0x24 }, },
6135 	},
6136 	{
6137 		"LDX_MSH standalone, negative offset",
6138 		.u.insns = {
6139 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6140 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
6141 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6142 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6143 		},
6144 		CLASSIC,
6145 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6146 		{ {0x40, 0 }, },
6147 	},
6148 	{
6149 		"LDX_MSH standalone, negative offset 2",
6150 		.u.insns = {
6151 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6152 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
6153 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6154 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6155 		},
6156 		CLASSIC,
6157 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6158 		{ {0x40, 0x24 }, },
6159 	},
6160 	{
6161 		"LDX_MSH standalone, out of bounds",
6162 		.u.insns = {
6163 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6164 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
6165 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6166 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6167 		},
6168 		CLASSIC,
6169 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6170 		{ {0x40, 0 }, },
6171 	},
6172 	/*
6173 	 * verify that the interpreter or JIT correctly sets A and X
6174 	 * to 0.
6175 	 */
6176 	{
6177 		"ADD default X",
6178 		.u.insns = {
6179 			/*
6180 			 * A = 0x42
6181 			 * A = A + X
6182 			 * ret A
6183 			 */
6184 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6185 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
6186 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6187 		},
6188 		CLASSIC | FLAG_NO_DATA,
6189 		{},
6190 		{ {0x1, 0x42 } },
6191 	},
6192 	{
6193 		"ADD default A",
6194 		.u.insns = {
6195 			/*
6196 			 * A = A + 0x42
6197 			 * ret A
6198 			 */
6199 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
6200 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6201 		},
6202 		CLASSIC | FLAG_NO_DATA,
6203 		{},
6204 		{ {0x1, 0x42 } },
6205 	},
6206 	{
6207 		"SUB default X",
6208 		.u.insns = {
6209 			/*
6210 			 * A = 0x66
6211 			 * A = A - X
6212 			 * ret A
6213 			 */
6214 			BPF_STMT(BPF_LD | BPF_IMM, 0x66),
6215 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
6216 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6217 		},
6218 		CLASSIC | FLAG_NO_DATA,
6219 		{},
6220 		{ {0x1, 0x66 } },
6221 	},
6222 	{
6223 		"SUB default A",
6224 		.u.insns = {
6225 			/*
6226 			 * A = A - -0x66
6227 			 * ret A
6228 			 */
6229 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
6230 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6231 		},
6232 		CLASSIC | FLAG_NO_DATA,
6233 		{},
6234 		{ {0x1, 0x66 } },
6235 	},
6236 	{
6237 		"MUL default X",
6238 		.u.insns = {
6239 			/*
6240 			 * A = 0x42
6241 			 * A = A * X
6242 			 * ret A
6243 			 */
6244 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6245 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
6246 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6247 		},
6248 		CLASSIC | FLAG_NO_DATA,
6249 		{},
6250 		{ {0x1, 0x0 } },
6251 	},
6252 	{
6253 		"MUL default A",
6254 		.u.insns = {
6255 			/*
6256 			 * A = A * 0x66
6257 			 * ret A
6258 			 */
6259 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
6260 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6261 		},
6262 		CLASSIC | FLAG_NO_DATA,
6263 		{},
6264 		{ {0x1, 0x0 } },
6265 	},
6266 	{
6267 		"DIV default X",
6268 		.u.insns = {
6269 			/*
6270 			 * A = 0x42
6271 			 * A = A / X ; this halt the filter execution if X is 0
6272 			 * ret 0x42
6273 			 */
6274 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6275 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
6276 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6277 		},
6278 		CLASSIC | FLAG_NO_DATA,
6279 		{},
6280 		{ {0x1, 0x0 } },
6281 	},
6282 	{
6283 		"DIV default A",
6284 		.u.insns = {
6285 			/*
6286 			 * A = A / 1
6287 			 * ret A
6288 			 */
6289 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
6290 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6291 		},
6292 		CLASSIC | FLAG_NO_DATA,
6293 		{},
6294 		{ {0x1, 0x0 } },
6295 	},
6296 	{
6297 		"MOD default X",
6298 		.u.insns = {
6299 			/*
6300 			 * A = 0x42
6301 			 * A = A mod X ; this halt the filter execution if X is 0
6302 			 * ret 0x42
6303 			 */
6304 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6305 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
6306 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6307 		},
6308 		CLASSIC | FLAG_NO_DATA,
6309 		{},
6310 		{ {0x1, 0x0 } },
6311 	},
6312 	{
6313 		"MOD default A",
6314 		.u.insns = {
6315 			/*
6316 			 * A = A mod 1
6317 			 * ret A
6318 			 */
6319 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
6320 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6321 		},
6322 		CLASSIC | FLAG_NO_DATA,
6323 		{},
6324 		{ {0x1, 0x0 } },
6325 	},
6326 	{
6327 		"JMP EQ default A",
6328 		.u.insns = {
6329 			/*
6330 			 * cmp A, 0x0, 0, 1
6331 			 * ret 0x42
6332 			 * ret 0x66
6333 			 */
6334 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
6335 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6336 			BPF_STMT(BPF_RET | BPF_K, 0x66),
6337 		},
6338 		CLASSIC | FLAG_NO_DATA,
6339 		{},
6340 		{ {0x1, 0x42 } },
6341 	},
6342 	{
6343 		"JMP EQ default X",
6344 		.u.insns = {
6345 			/*
6346 			 * A = 0x0
6347 			 * cmp A, X, 0, 1
6348 			 * ret 0x42
6349 			 * ret 0x66
6350 			 */
6351 			BPF_STMT(BPF_LD | BPF_IMM, 0x0),
6352 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
6353 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6354 			BPF_STMT(BPF_RET | BPF_K, 0x66),
6355 		},
6356 		CLASSIC | FLAG_NO_DATA,
6357 		{},
6358 		{ {0x1, 0x42 } },
6359 	},
6360 	/* Checking interpreter vs JIT wrt signed extended imms. */
6361 	{
6362 		"JNE signed compare, test 1",
6363 		.u.insns_int = {
6364 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6365 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6366 			BPF_MOV64_REG(R2, R1),
6367 			BPF_ALU64_REG(BPF_AND, R2, R3),
6368 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6369 			BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
6370 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6371 			BPF_EXIT_INSN(),
6372 		},
6373 		INTERNAL,
6374 		{ },
6375 		{ { 0, 1 } },
6376 	},
6377 	{
6378 		"JNE signed compare, test 2",
6379 		.u.insns_int = {
6380 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6381 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6382 			BPF_MOV64_REG(R2, R1),
6383 			BPF_ALU64_REG(BPF_AND, R2, R3),
6384 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6385 			BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
6386 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6387 			BPF_EXIT_INSN(),
6388 		},
6389 		INTERNAL,
6390 		{ },
6391 		{ { 0, 1 } },
6392 	},
6393 	{
6394 		"JNE signed compare, test 3",
6395 		.u.insns_int = {
6396 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6397 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6398 			BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
6399 			BPF_MOV64_REG(R2, R1),
6400 			BPF_ALU64_REG(BPF_AND, R2, R3),
6401 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6402 			BPF_JMP_REG(BPF_JNE, R2, R4, 1),
6403 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6404 			BPF_EXIT_INSN(),
6405 		},
6406 		INTERNAL,
6407 		{ },
6408 		{ { 0, 2 } },
6409 	},
6410 	{
6411 		"JNE signed compare, test 4",
6412 		.u.insns_int = {
6413 			BPF_LD_IMM64(R1, -17104896),
6414 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6415 			BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
6416 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6417 			BPF_EXIT_INSN(),
6418 		},
6419 		INTERNAL,
6420 		{ },
6421 		{ { 0, 2 } },
6422 	},
6423 	{
6424 		"JNE signed compare, test 5",
6425 		.u.insns_int = {
6426 			BPF_LD_IMM64(R1, 0xfefb0000),
6427 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6428 			BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
6429 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6430 			BPF_EXIT_INSN(),
6431 		},
6432 		INTERNAL,
6433 		{ },
6434 		{ { 0, 1 } },
6435 	},
6436 	{
6437 		"JNE signed compare, test 6",
6438 		.u.insns_int = {
6439 			BPF_LD_IMM64(R1, 0x7efb0000),
6440 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6441 			BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
6442 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6443 			BPF_EXIT_INSN(),
6444 		},
6445 		INTERNAL,
6446 		{ },
6447 		{ { 0, 2 } },
6448 	},
6449 	{
6450 		"JNE signed compare, test 7",
6451 		.u.insns = {
6452 			BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
6453 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
6454 			BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
6455 			BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
6456 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
6457 			BPF_STMT(BPF_RET | BPF_K, 1),
6458 			BPF_STMT(BPF_RET | BPF_K, 2),
6459 		},
6460 		CLASSIC | FLAG_NO_DATA,
6461 		{},
6462 		{ { 0, 2 } },
6463 	},
6464 };
6465 
6466 static struct net_device dev;
6467 
6468 static struct sk_buff *populate_skb(char *buf, int size)
6469 {
6470 	struct sk_buff *skb;
6471 
6472 	if (size >= MAX_DATA)
6473 		return NULL;
6474 
6475 	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
6476 	if (!skb)
6477 		return NULL;
6478 
6479 	__skb_put_data(skb, buf, size);
6480 
6481 	/* Initialize a fake skb with test pattern. */
6482 	skb_reset_mac_header(skb);
6483 	skb->protocol = htons(ETH_P_IP);
6484 	skb->pkt_type = SKB_TYPE;
6485 	skb->mark = SKB_MARK;
6486 	skb->hash = SKB_HASH;
6487 	skb->queue_mapping = SKB_QUEUE_MAP;
6488 	skb->vlan_tci = SKB_VLAN_TCI;
6489 	skb->vlan_present = SKB_VLAN_PRESENT;
6490 	skb->vlan_proto = htons(ETH_P_IP);
6491 	dev_net_set(&dev, &init_net);
6492 	skb->dev = &dev;
6493 	skb->dev->ifindex = SKB_DEV_IFINDEX;
6494 	skb->dev->type = SKB_DEV_TYPE;
6495 	skb_set_network_header(skb, min(size, ETH_HLEN));
6496 
6497 	return skb;
6498 }
6499 
6500 static void *generate_test_data(struct bpf_test *test, int sub)
6501 {
6502 	struct sk_buff *skb;
6503 	struct page *page;
6504 
6505 	if (test->aux & FLAG_NO_DATA)
6506 		return NULL;
6507 
6508 	/* Test case expects an skb, so populate one. Various
6509 	 * subtests generate skbs of different sizes based on
6510 	 * the same data.
6511 	 */
6512 	skb = populate_skb(test->data, test->test[sub].data_size);
6513 	if (!skb)
6514 		return NULL;
6515 
6516 	if (test->aux & FLAG_SKB_FRAG) {
6517 		/*
6518 		 * when the test requires a fragmented skb, add a
6519 		 * single fragment to the skb, filled with
6520 		 * test->frag_data.
6521 		 */
6522 		void *ptr;
6523 
6524 		page = alloc_page(GFP_KERNEL);
6525 
6526 		if (!page)
6527 			goto err_kfree_skb;
6528 
6529 		ptr = kmap(page);
6530 		if (!ptr)
6531 			goto err_free_page;
6532 		memcpy(ptr, test->frag_data, MAX_DATA);
6533 		kunmap(page);
6534 		skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
6535 	}
6536 
6537 	return skb;
6538 
6539 err_free_page:
6540 	__free_page(page);
6541 err_kfree_skb:
6542 	kfree_skb(skb);
6543 	return NULL;
6544 }
6545 
6546 static void release_test_data(const struct bpf_test *test, void *data)
6547 {
6548 	if (test->aux & FLAG_NO_DATA)
6549 		return;
6550 
6551 	kfree_skb(data);
6552 }
6553 
6554 static int filter_length(int which)
6555 {
6556 	struct sock_filter *fp;
6557 	int len;
6558 
6559 	if (tests[which].fill_helper)
6560 		return tests[which].u.ptr.len;
6561 
6562 	fp = tests[which].u.insns;
6563 	for (len = MAX_INSNS - 1; len > 0; --len)
6564 		if (fp[len].code != 0 || fp[len].k != 0)
6565 			break;
6566 
6567 	return len + 1;
6568 }
6569 
6570 static void *filter_pointer(int which)
6571 {
6572 	if (tests[which].fill_helper)
6573 		return tests[which].u.ptr.insns;
6574 	else
6575 		return tests[which].u.insns;
6576 }
6577 
6578 static struct bpf_prog *generate_filter(int which, int *err)
6579 {
6580 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6581 	unsigned int flen = filter_length(which);
6582 	void *fptr = filter_pointer(which);
6583 	struct sock_fprog_kern fprog;
6584 	struct bpf_prog *fp;
6585 
6586 	switch (test_type) {
6587 	case CLASSIC:
6588 		fprog.filter = fptr;
6589 		fprog.len = flen;
6590 
6591 		*err = bpf_prog_create(&fp, &fprog);
6592 		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
6593 			if (*err == tests[which].expected_errcode) {
6594 				pr_cont("PASS\n");
6595 				/* Verifier rejected filter as expected. */
6596 				*err = 0;
6597 				return NULL;
6598 			} else {
6599 				pr_cont("UNEXPECTED_PASS\n");
6600 				/* Verifier didn't reject the test that's
6601 				 * bad enough, just return!
6602 				 */
6603 				*err = -EINVAL;
6604 				return NULL;
6605 			}
6606 		}
6607 		if (*err) {
6608 			pr_cont("FAIL to prog_create err=%d len=%d\n",
6609 				*err, fprog.len);
6610 			return NULL;
6611 		}
6612 		break;
6613 
6614 	case INTERNAL:
6615 		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
6616 		if (fp == NULL) {
6617 			pr_cont("UNEXPECTED_FAIL no memory left\n");
6618 			*err = -ENOMEM;
6619 			return NULL;
6620 		}
6621 
6622 		fp->len = flen;
6623 		/* Type doesn't really matter here as long as it's not unspec. */
6624 		fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
6625 		memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
6626 		fp->aux->stack_depth = tests[which].stack_depth;
6627 
6628 		/* We cannot error here as we don't need type compatibility
6629 		 * checks.
6630 		 */
6631 		fp = bpf_prog_select_runtime(fp, err);
6632 		if (*err) {
6633 			pr_cont("FAIL to select_runtime err=%d\n", *err);
6634 			return NULL;
6635 		}
6636 		break;
6637 	}
6638 
6639 	*err = 0;
6640 	return fp;
6641 }
6642 
6643 static void release_filter(struct bpf_prog *fp, int which)
6644 {
6645 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6646 
6647 	switch (test_type) {
6648 	case CLASSIC:
6649 		bpf_prog_destroy(fp);
6650 		break;
6651 	case INTERNAL:
6652 		bpf_prog_free(fp);
6653 		break;
6654 	}
6655 }
6656 
6657 static int __run_one(const struct bpf_prog *fp, const void *data,
6658 		     int runs, u64 *duration)
6659 {
6660 	u64 start, finish;
6661 	int ret = 0, i;
6662 
6663 	preempt_disable();
6664 	start = ktime_get_ns();
6665 
6666 	for (i = 0; i < runs; i++)
6667 		ret = BPF_PROG_RUN(fp, data);
6668 
6669 	finish = ktime_get_ns();
6670 	preempt_enable();
6671 
6672 	*duration = finish - start;
6673 	do_div(*duration, runs);
6674 
6675 	return ret;
6676 }
6677 
6678 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
6679 {
6680 	int err_cnt = 0, i, runs = MAX_TESTRUNS;
6681 
6682 	for (i = 0; i < MAX_SUBTESTS; i++) {
6683 		void *data;
6684 		u64 duration;
6685 		u32 ret;
6686 
6687 		if (test->test[i].data_size == 0 &&
6688 		    test->test[i].result == 0)
6689 			break;
6690 
6691 		data = generate_test_data(test, i);
6692 		if (!data && !(test->aux & FLAG_NO_DATA)) {
6693 			pr_cont("data generation failed ");
6694 			err_cnt++;
6695 			break;
6696 		}
6697 		ret = __run_one(fp, data, runs, &duration);
6698 		release_test_data(test, data);
6699 
6700 		if (ret == test->test[i].result) {
6701 			pr_cont("%lld ", duration);
6702 		} else {
6703 			pr_cont("ret %d != %d ", ret,
6704 				test->test[i].result);
6705 			err_cnt++;
6706 		}
6707 	}
6708 
6709 	return err_cnt;
6710 }
6711 
6712 static char test_name[64];
6713 module_param_string(test_name, test_name, sizeof(test_name), 0);
6714 
6715 static int test_id = -1;
6716 module_param(test_id, int, 0);
6717 
6718 static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
6719 module_param_array(test_range, int, NULL, 0);
6720 
6721 static __init int find_test_index(const char *test_name)
6722 {
6723 	int i;
6724 
6725 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6726 		if (!strcmp(tests[i].descr, test_name))
6727 			return i;
6728 	}
6729 	return -1;
6730 }
6731 
6732 static __init int prepare_bpf_tests(void)
6733 {
6734 	int i;
6735 
6736 	if (test_id >= 0) {
6737 		/*
6738 		 * if a test_id was specified, use test_range to
6739 		 * cover only that test.
6740 		 */
6741 		if (test_id >= ARRAY_SIZE(tests)) {
6742 			pr_err("test_bpf: invalid test_id specified.\n");
6743 			return -EINVAL;
6744 		}
6745 
6746 		test_range[0] = test_id;
6747 		test_range[1] = test_id;
6748 	} else if (*test_name) {
6749 		/*
6750 		 * if a test_name was specified, find it and setup
6751 		 * test_range to cover only that test.
6752 		 */
6753 		int idx = find_test_index(test_name);
6754 
6755 		if (idx < 0) {
6756 			pr_err("test_bpf: no test named '%s' found.\n",
6757 			       test_name);
6758 			return -EINVAL;
6759 		}
6760 		test_range[0] = idx;
6761 		test_range[1] = idx;
6762 	} else {
6763 		/*
6764 		 * check that the supplied test_range is valid.
6765 		 */
6766 		if (test_range[0] >= ARRAY_SIZE(tests) ||
6767 		    test_range[1] >= ARRAY_SIZE(tests) ||
6768 		    test_range[0] < 0 || test_range[1] < 0) {
6769 			pr_err("test_bpf: test_range is out of bound.\n");
6770 			return -EINVAL;
6771 		}
6772 
6773 		if (test_range[1] < test_range[0]) {
6774 			pr_err("test_bpf: test_range is ending before it starts.\n");
6775 			return -EINVAL;
6776 		}
6777 	}
6778 
6779 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6780 		if (tests[i].fill_helper &&
6781 		    tests[i].fill_helper(&tests[i]) < 0)
6782 			return -ENOMEM;
6783 	}
6784 
6785 	return 0;
6786 }
6787 
6788 static __init void destroy_bpf_tests(void)
6789 {
6790 	int i;
6791 
6792 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6793 		if (tests[i].fill_helper)
6794 			kfree(tests[i].u.ptr.insns);
6795 	}
6796 }
6797 
6798 static bool exclude_test(int test_id)
6799 {
6800 	return test_id < test_range[0] || test_id > test_range[1];
6801 }
6802 
6803 static __init struct sk_buff *build_test_skb(void)
6804 {
6805 	u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
6806 	struct sk_buff *skb[2];
6807 	struct page *page[2];
6808 	int i, data_size = 8;
6809 
6810 	for (i = 0; i < 2; i++) {
6811 		page[i] = alloc_page(GFP_KERNEL);
6812 		if (!page[i]) {
6813 			if (i == 0)
6814 				goto err_page0;
6815 			else
6816 				goto err_page1;
6817 		}
6818 
6819 		/* this will set skb[i]->head_frag */
6820 		skb[i] = dev_alloc_skb(headroom + data_size);
6821 		if (!skb[i]) {
6822 			if (i == 0)
6823 				goto err_skb0;
6824 			else
6825 				goto err_skb1;
6826 		}
6827 
6828 		skb_reserve(skb[i], headroom);
6829 		skb_put(skb[i], data_size);
6830 		skb[i]->protocol = htons(ETH_P_IP);
6831 		skb_reset_network_header(skb[i]);
6832 		skb_set_mac_header(skb[i], -ETH_HLEN);
6833 
6834 		skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
6835 		// skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
6836 	}
6837 
6838 	/* setup shinfo */
6839 	skb_shinfo(skb[0])->gso_size = 1448;
6840 	skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
6841 	skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
6842 	skb_shinfo(skb[0])->gso_segs = 0;
6843 	skb_shinfo(skb[0])->frag_list = skb[1];
6844 
6845 	/* adjust skb[0]'s len */
6846 	skb[0]->len += skb[1]->len;
6847 	skb[0]->data_len += skb[1]->data_len;
6848 	skb[0]->truesize += skb[1]->truesize;
6849 
6850 	return skb[0];
6851 
6852 err_skb1:
6853 	__free_page(page[1]);
6854 err_page1:
6855 	kfree_skb(skb[0]);
6856 err_skb0:
6857 	__free_page(page[0]);
6858 err_page0:
6859 	return NULL;
6860 }
6861 
6862 static __init int test_skb_segment(void)
6863 {
6864 	netdev_features_t features;
6865 	struct sk_buff *skb, *segs;
6866 	int ret = -1;
6867 
6868 	features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
6869 		   NETIF_F_IPV6_CSUM;
6870 	features |= NETIF_F_RXCSUM;
6871 	skb = build_test_skb();
6872 	if (!skb) {
6873 		pr_info("%s: failed to build_test_skb", __func__);
6874 		goto done;
6875 	}
6876 
6877 	segs = skb_segment(skb, features);
6878 	if (!IS_ERR(segs)) {
6879 		kfree_skb_list(segs);
6880 		ret = 0;
6881 		pr_info("%s: success in skb_segment!", __func__);
6882 	} else {
6883 		pr_info("%s: failed in skb_segment!", __func__);
6884 	}
6885 	kfree_skb(skb);
6886 done:
6887 	return ret;
6888 }
6889 
6890 static __init int test_bpf(void)
6891 {
6892 	int i, err_cnt = 0, pass_cnt = 0;
6893 	int jit_cnt = 0, run_cnt = 0;
6894 
6895 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6896 		struct bpf_prog *fp;
6897 		int err;
6898 
6899 		cond_resched();
6900 		if (exclude_test(i))
6901 			continue;
6902 
6903 		pr_info("#%d %s ", i, tests[i].descr);
6904 
6905 		fp = generate_filter(i, &err);
6906 		if (fp == NULL) {
6907 			if (err == 0) {
6908 				pass_cnt++;
6909 				continue;
6910 			}
6911 			err_cnt++;
6912 			continue;
6913 		}
6914 
6915 		pr_cont("jited:%u ", fp->jited);
6916 
6917 		run_cnt++;
6918 		if (fp->jited)
6919 			jit_cnt++;
6920 
6921 		err = run_one(fp, &tests[i]);
6922 		release_filter(fp, i);
6923 
6924 		if (err) {
6925 			pr_cont("FAIL (%d times)\n", err);
6926 			err_cnt++;
6927 		} else {
6928 			pr_cont("PASS\n");
6929 			pass_cnt++;
6930 		}
6931 	}
6932 
6933 	pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
6934 		pass_cnt, err_cnt, jit_cnt, run_cnt);
6935 
6936 	return err_cnt ? -EINVAL : 0;
6937 }
6938 
6939 static int __init test_bpf_init(void)
6940 {
6941 	int ret;
6942 
6943 	ret = prepare_bpf_tests();
6944 	if (ret < 0)
6945 		return ret;
6946 
6947 	ret = test_bpf();
6948 	destroy_bpf_tests();
6949 	if (ret)
6950 		return ret;
6951 
6952 	return test_skb_segment();
6953 }
6954 
6955 static void __exit test_bpf_exit(void)
6956 {
6957 }
6958 
6959 module_init(test_bpf_init);
6960 module_exit(test_bpf_exit);
6961 
6962 MODULE_LICENSE("GPL");
6963