xref: /openbmc/linux/lib/test_bpf.c (revision 56cbaa45)
1 /*
2  * Testsuite for BPF interpreter and BPF JIT compiler
3  *
4  * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  */
15 
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/filter.h>
21 #include <linux/skbuff.h>
22 #include <linux/netdevice.h>
23 #include <linux/if_vlan.h>
24 #include <linux/random.h>
25 
26 /* General test specific settings */
27 #define MAX_SUBTESTS	3
28 #define MAX_TESTRUNS	10000
29 #define MAX_DATA	128
30 #define MAX_INSNS	512
31 #define MAX_K		0xffffFFFF
32 
33 /* Few constants used to init test 'skb' */
34 #define SKB_TYPE	3
35 #define SKB_MARK	0x1234aaaa
36 #define SKB_HASH	0x1234aaab
37 #define SKB_QUEUE_MAP	123
38 #define SKB_VLAN_TCI	0xffff
39 #define SKB_DEV_IFINDEX	577
40 #define SKB_DEV_TYPE	588
41 
42 /* Redefine REGs to make tests less verbose */
43 #define R0		BPF_REG_0
44 #define R1		BPF_REG_1
45 #define R2		BPF_REG_2
46 #define R3		BPF_REG_3
47 #define R4		BPF_REG_4
48 #define R5		BPF_REG_5
49 #define R6		BPF_REG_6
50 #define R7		BPF_REG_7
51 #define R8		BPF_REG_8
52 #define R9		BPF_REG_9
53 #define R10		BPF_REG_10
54 
55 /* Flags that can be passed to test cases */
56 #define FLAG_NO_DATA		BIT(0)
57 #define FLAG_EXPECTED_FAIL	BIT(1)
58 
59 enum {
60 	CLASSIC  = BIT(6),	/* Old BPF instructions only. */
61 	INTERNAL = BIT(7),	/* Extended instruction set.  */
62 };
63 
64 #define TEST_TYPE_MASK		(CLASSIC | INTERNAL)
65 
66 struct bpf_test {
67 	const char *descr;
68 	union {
69 		struct sock_filter insns[MAX_INSNS];
70 		struct bpf_insn insns_int[MAX_INSNS];
71 		struct {
72 			void *insns;
73 			unsigned int len;
74 		} ptr;
75 	} u;
76 	__u8 aux;
77 	__u8 data[MAX_DATA];
78 	struct {
79 		int data_size;
80 		__u32 result;
81 	} test[MAX_SUBTESTS];
82 	int (*fill_helper)(struct bpf_test *self);
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 struct bpf_test tests[] = {
267 	{
268 		"TAX",
269 		.u.insns = {
270 			BPF_STMT(BPF_LD | BPF_IMM, 1),
271 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
272 			BPF_STMT(BPF_LD | BPF_IMM, 2),
273 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
274 			BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
275 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
276 			BPF_STMT(BPF_LD | BPF_LEN, 0),
277 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
278 			BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
279 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
280 			BPF_STMT(BPF_RET | BPF_A, 0)
281 		},
282 		CLASSIC,
283 		{ 10, 20, 30, 40, 50 },
284 		{ { 2, 10 }, { 3, 20 }, { 4, 30 } },
285 	},
286 	{
287 		"TXA",
288 		.u.insns = {
289 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
290 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
291 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
292 			BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
293 		},
294 		CLASSIC,
295 		{ 10, 20, 30, 40, 50 },
296 		{ { 1, 2 }, { 3, 6 }, { 4, 8 } },
297 	},
298 	{
299 		"ADD_SUB_MUL_K",
300 		.u.insns = {
301 			BPF_STMT(BPF_LD | BPF_IMM, 1),
302 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
303 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
304 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
305 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
306 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
307 			BPF_STMT(BPF_RET | BPF_A, 0)
308 		},
309 		CLASSIC | FLAG_NO_DATA,
310 		{ },
311 		{ { 0, 0xfffffffd } }
312 	},
313 	{
314 		"DIV_MOD_KX",
315 		.u.insns = {
316 			BPF_STMT(BPF_LD | BPF_IMM, 8),
317 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
318 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
319 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
320 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
321 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
322 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
323 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
324 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
325 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
326 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
327 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
328 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
329 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
330 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
331 			BPF_STMT(BPF_RET | BPF_A, 0)
332 		},
333 		CLASSIC | FLAG_NO_DATA,
334 		{ },
335 		{ { 0, 0x20000000 } }
336 	},
337 	{
338 		"AND_OR_LSH_K",
339 		.u.insns = {
340 			BPF_STMT(BPF_LD | BPF_IMM, 0xff),
341 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
342 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
343 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
344 			BPF_STMT(BPF_LD | BPF_IMM, 0xf),
345 			BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
346 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
347 			BPF_STMT(BPF_RET | BPF_A, 0)
348 		},
349 		CLASSIC | FLAG_NO_DATA,
350 		{ },
351 		{ { 0, 0x800000ff }, { 1, 0x800000ff } },
352 	},
353 	{
354 		"LD_IMM_0",
355 		.u.insns = {
356 			BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
357 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
358 			BPF_STMT(BPF_RET | BPF_K, 0),
359 			BPF_STMT(BPF_RET | BPF_K, 1),
360 		},
361 		CLASSIC,
362 		{ },
363 		{ { 1, 1 } },
364 	},
365 	{
366 		"LD_IND",
367 		.u.insns = {
368 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
369 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
370 			BPF_STMT(BPF_RET | BPF_K, 1)
371 		},
372 		CLASSIC,
373 		{ },
374 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
375 	},
376 	{
377 		"LD_ABS",
378 		.u.insns = {
379 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
380 			BPF_STMT(BPF_RET | BPF_K, 1)
381 		},
382 		CLASSIC,
383 		{ },
384 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
385 	},
386 	{
387 		"LD_ABS_LL",
388 		.u.insns = {
389 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
390 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
391 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
392 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
393 			BPF_STMT(BPF_RET | BPF_A, 0)
394 		},
395 		CLASSIC,
396 		{ 1, 2, 3 },
397 		{ { 1, 0 }, { 2, 3 } },
398 	},
399 	{
400 		"LD_IND_LL",
401 		.u.insns = {
402 			BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
403 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
404 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
405 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
406 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
407 			BPF_STMT(BPF_RET | BPF_A, 0)
408 		},
409 		CLASSIC,
410 		{ 1, 2, 3, 0xff },
411 		{ { 1, 1 }, { 3, 3 }, { 4, 0xff } },
412 	},
413 	{
414 		"LD_ABS_NET",
415 		.u.insns = {
416 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
417 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
418 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
419 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
420 			BPF_STMT(BPF_RET | BPF_A, 0)
421 		},
422 		CLASSIC,
423 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
424 		{ { 15, 0 }, { 16, 3 } },
425 	},
426 	{
427 		"LD_IND_NET",
428 		.u.insns = {
429 			BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
430 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
431 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
432 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
433 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
434 			BPF_STMT(BPF_RET | BPF_A, 0)
435 		},
436 		CLASSIC,
437 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
438 		{ { 14, 0 }, { 15, 1 }, { 17, 3 } },
439 	},
440 	{
441 		"LD_PKTTYPE",
442 		.u.insns = {
443 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
444 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
445 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
446 			BPF_STMT(BPF_RET | BPF_K, 1),
447 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
448 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
449 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
450 			BPF_STMT(BPF_RET | BPF_K, 1),
451 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
452 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
453 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
454 			BPF_STMT(BPF_RET | BPF_K, 1),
455 			BPF_STMT(BPF_RET | BPF_A, 0)
456 		},
457 		CLASSIC,
458 		{ },
459 		{ { 1, 3 }, { 10, 3 } },
460 	},
461 	{
462 		"LD_MARK",
463 		.u.insns = {
464 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
465 				 SKF_AD_OFF + SKF_AD_MARK),
466 			BPF_STMT(BPF_RET | BPF_A, 0)
467 		},
468 		CLASSIC,
469 		{ },
470 		{ { 1, SKB_MARK}, { 10, SKB_MARK} },
471 	},
472 	{
473 		"LD_RXHASH",
474 		.u.insns = {
475 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
476 				 SKF_AD_OFF + SKF_AD_RXHASH),
477 			BPF_STMT(BPF_RET | BPF_A, 0)
478 		},
479 		CLASSIC,
480 		{ },
481 		{ { 1, SKB_HASH}, { 10, SKB_HASH} },
482 	},
483 	{
484 		"LD_QUEUE",
485 		.u.insns = {
486 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
487 				 SKF_AD_OFF + SKF_AD_QUEUE),
488 			BPF_STMT(BPF_RET | BPF_A, 0)
489 		},
490 		CLASSIC,
491 		{ },
492 		{ { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
493 	},
494 	{
495 		"LD_PROTOCOL",
496 		.u.insns = {
497 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
498 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
499 			BPF_STMT(BPF_RET | BPF_K, 0),
500 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
501 				 SKF_AD_OFF + SKF_AD_PROTOCOL),
502 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
503 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
504 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
505 			BPF_STMT(BPF_RET | BPF_K, 0),
506 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
507 			BPF_STMT(BPF_RET | BPF_A, 0)
508 		},
509 		CLASSIC,
510 		{ 10, 20, 30 },
511 		{ { 10, ETH_P_IP }, { 100, ETH_P_IP } },
512 	},
513 	{
514 		"LD_VLAN_TAG",
515 		.u.insns = {
516 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
517 				 SKF_AD_OFF + SKF_AD_VLAN_TAG),
518 			BPF_STMT(BPF_RET | BPF_A, 0)
519 		},
520 		CLASSIC,
521 		{ },
522 		{
523 			{ 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
524 			{ 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
525 		},
526 	},
527 	{
528 		"LD_VLAN_TAG_PRESENT",
529 		.u.insns = {
530 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
531 				 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
532 			BPF_STMT(BPF_RET | BPF_A, 0)
533 		},
534 		CLASSIC,
535 		{ },
536 		{
537 			{ 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
538 			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
539 		},
540 	},
541 	{
542 		"LD_IFINDEX",
543 		.u.insns = {
544 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
545 				 SKF_AD_OFF + SKF_AD_IFINDEX),
546 			BPF_STMT(BPF_RET | BPF_A, 0)
547 		},
548 		CLASSIC,
549 		{ },
550 		{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
551 	},
552 	{
553 		"LD_HATYPE",
554 		.u.insns = {
555 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
556 				 SKF_AD_OFF + SKF_AD_HATYPE),
557 			BPF_STMT(BPF_RET | BPF_A, 0)
558 		},
559 		CLASSIC,
560 		{ },
561 		{ { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
562 	},
563 	{
564 		"LD_CPU",
565 		.u.insns = {
566 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
567 				 SKF_AD_OFF + SKF_AD_CPU),
568 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
569 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
570 				 SKF_AD_OFF + SKF_AD_CPU),
571 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
572 			BPF_STMT(BPF_RET | BPF_A, 0)
573 		},
574 		CLASSIC,
575 		{ },
576 		{ { 1, 0 }, { 10, 0 } },
577 	},
578 	{
579 		"LD_NLATTR",
580 		.u.insns = {
581 			BPF_STMT(BPF_LDX | BPF_IMM, 2),
582 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
583 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
584 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
585 				 SKF_AD_OFF + SKF_AD_NLATTR),
586 			BPF_STMT(BPF_RET | BPF_A, 0)
587 		},
588 		CLASSIC,
589 #ifdef __BIG_ENDIAN
590 		{ 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
591 #else
592 		{ 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
593 #endif
594 		{ { 4, 0 }, { 20, 6 } },
595 	},
596 	{
597 		"LD_NLATTR_NEST",
598 		.u.insns = {
599 			BPF_STMT(BPF_LD | BPF_IMM, 2),
600 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
601 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
602 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
603 			BPF_STMT(BPF_LD | BPF_IMM, 2),
604 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
605 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
606 			BPF_STMT(BPF_LD | BPF_IMM, 2),
607 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
608 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
609 			BPF_STMT(BPF_LD | BPF_IMM, 2),
610 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
611 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
612 			BPF_STMT(BPF_LD | BPF_IMM, 2),
613 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
614 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
615 			BPF_STMT(BPF_LD | BPF_IMM, 2),
616 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
617 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
618 			BPF_STMT(BPF_LD | BPF_IMM, 2),
619 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
620 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
621 			BPF_STMT(BPF_LD | BPF_IMM, 2),
622 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
623 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
624 			BPF_STMT(BPF_RET | BPF_A, 0)
625 		},
626 		CLASSIC,
627 #ifdef __BIG_ENDIAN
628 		{ 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
629 #else
630 		{ 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
631 #endif
632 		{ { 4, 0 }, { 20, 10 } },
633 	},
634 	{
635 		"LD_PAYLOAD_OFF",
636 		.u.insns = {
637 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
638 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
639 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
640 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
641 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
642 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
643 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
644 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
645 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
646 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
647 			BPF_STMT(BPF_RET | BPF_A, 0)
648 		},
649 		CLASSIC,
650 		/* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
651 		 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
652 		 * id 9737, seq 1, length 64
653 		 */
654 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655 		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 		  0x08, 0x00,
657 		  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
658 		  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
659 		{ { 30, 0 }, { 100, 42 } },
660 	},
661 	{
662 		"LD_ANC_XOR",
663 		.u.insns = {
664 			BPF_STMT(BPF_LD | BPF_IMM, 10),
665 			BPF_STMT(BPF_LDX | BPF_IMM, 300),
666 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
667 				 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
668 			BPF_STMT(BPF_RET | BPF_A, 0)
669 		},
670 		CLASSIC,
671 		{ },
672 		{ { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
673 	},
674 	{
675 		"SPILL_FILL",
676 		.u.insns = {
677 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
678 			BPF_STMT(BPF_LD | BPF_IMM, 2),
679 			BPF_STMT(BPF_ALU | BPF_RSH, 1),
680 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
681 			BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
682 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
683 			BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
684 			BPF_STMT(BPF_STX, 15), /* M3 = len */
685 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
686 			BPF_STMT(BPF_LD | BPF_MEM, 2),
687 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
688 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
689 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
690 			BPF_STMT(BPF_RET | BPF_A, 0)
691 		},
692 		CLASSIC,
693 		{ },
694 		{ { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
695 	},
696 	{
697 		"JEQ",
698 		.u.insns = {
699 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
700 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
701 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
702 			BPF_STMT(BPF_RET | BPF_K, 1),
703 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
704 		},
705 		CLASSIC,
706 		{ 3, 3, 3, 3, 3 },
707 		{ { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
708 	},
709 	{
710 		"JGT",
711 		.u.insns = {
712 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
713 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
714 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
715 			BPF_STMT(BPF_RET | BPF_K, 1),
716 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
717 		},
718 		CLASSIC,
719 		{ 4, 4, 4, 3, 3 },
720 		{ { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
721 	},
722 	{
723 		"JGE",
724 		.u.insns = {
725 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
726 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
727 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
728 			BPF_STMT(BPF_RET | BPF_K, 10),
729 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
730 			BPF_STMT(BPF_RET | BPF_K, 20),
731 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
732 			BPF_STMT(BPF_RET | BPF_K, 30),
733 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
734 			BPF_STMT(BPF_RET | BPF_K, 40),
735 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
736 		},
737 		CLASSIC,
738 		{ 1, 2, 3, 4, 5 },
739 		{ { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
740 	},
741 	{
742 		"JSET",
743 		.u.insns = {
744 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
745 			BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
746 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
747 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
748 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
749 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
750 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
751 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
752 			BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
753 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
754 			BPF_STMT(BPF_RET | BPF_K, 10),
755 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
756 			BPF_STMT(BPF_RET | BPF_K, 20),
757 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
758 			BPF_STMT(BPF_RET | BPF_K, 30),
759 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
760 			BPF_STMT(BPF_RET | BPF_K, 30),
761 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
762 			BPF_STMT(BPF_RET | BPF_K, 30),
763 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
764 			BPF_STMT(BPF_RET | BPF_K, 30),
765 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
766 			BPF_STMT(BPF_RET | BPF_K, 30),
767 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
768 		},
769 		CLASSIC,
770 		{ 0, 0xAA, 0x55, 1 },
771 		{ { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
772 	},
773 	{
774 		"tcpdump port 22",
775 		.u.insns = {
776 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
777 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
778 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
779 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
780 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
781 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
782 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
783 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
784 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
785 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
786 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
787 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
788 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
789 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
790 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
791 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
792 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
793 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
794 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
795 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
796 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
797 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
798 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
799 			BPF_STMT(BPF_RET | BPF_K, 0),
800 		},
801 		CLASSIC,
802 		/* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
803 		 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
804 		 * seq 1305692979:1305693027, ack 3650467037, win 65535,
805 		 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
806 		 */
807 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
808 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
809 		  0x08, 0x00,
810 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
811 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
812 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
813 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
814 		  0xc2, 0x24,
815 		  0x00, 0x16 /* dst port */ },
816 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
817 	},
818 	{
819 		"tcpdump complex",
820 		.u.insns = {
821 			/* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
822 			 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
823 			 * (len > 115 or len < 30000000000)' -d
824 			 */
825 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
826 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
827 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
828 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
829 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
830 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
831 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
832 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
833 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
834 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
835 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
836 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
837 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
838 			BPF_STMT(BPF_ST, 1),
839 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
840 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
841 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
842 			BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
843 			BPF_STMT(BPF_LD | BPF_MEM, 1),
844 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
845 			BPF_STMT(BPF_ST, 5),
846 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
847 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
848 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
849 			BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
850 			BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
851 			BPF_STMT(BPF_LD | BPF_MEM, 5),
852 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
853 			BPF_STMT(BPF_LD | BPF_LEN, 0),
854 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
855 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
856 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
857 			BPF_STMT(BPF_RET | BPF_K, 0),
858 		},
859 		CLASSIC,
860 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
861 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
862 		  0x08, 0x00,
863 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
864 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
865 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
866 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
867 		  0xc2, 0x24,
868 		  0x00, 0x16 /* dst port */ },
869 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
870 	},
871 	{
872 		"RET_A",
873 		.u.insns = {
874 			/* check that unitialized X and A contain zeros */
875 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
876 			BPF_STMT(BPF_RET | BPF_A, 0)
877 		},
878 		CLASSIC,
879 		{ },
880 		{ {1, 0}, {2, 0} },
881 	},
882 	{
883 		"INT: ADD trivial",
884 		.u.insns_int = {
885 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
886 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
887 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
888 			BPF_ALU64_REG(BPF_SUB, R1, R2),
889 			BPF_ALU64_IMM(BPF_ADD, R1, -1),
890 			BPF_ALU64_IMM(BPF_MUL, R1, 3),
891 			BPF_ALU64_REG(BPF_MOV, R0, R1),
892 			BPF_EXIT_INSN(),
893 		},
894 		INTERNAL,
895 		{ },
896 		{ { 0, 0xfffffffd } }
897 	},
898 	{
899 		"INT: MUL_X",
900 		.u.insns_int = {
901 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
902 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
903 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
904 			BPF_ALU64_REG(BPF_MUL, R1, R2),
905 			BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
906 			BPF_EXIT_INSN(),
907 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
908 			BPF_EXIT_INSN(),
909 		},
910 		INTERNAL,
911 		{ },
912 		{ { 0, 1 } }
913 	},
914 	{
915 		"INT: MUL_X2",
916 		.u.insns_int = {
917 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
918 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
919 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
920 			BPF_ALU64_REG(BPF_MUL, R1, R2),
921 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
922 			BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
923 			BPF_EXIT_INSN(),
924 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
925 			BPF_EXIT_INSN(),
926 		},
927 		INTERNAL,
928 		{ },
929 		{ { 0, 1 } }
930 	},
931 	{
932 		"INT: MUL32_X",
933 		.u.insns_int = {
934 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
935 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
936 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
937 			BPF_ALU32_REG(BPF_MUL, R1, R2),
938 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
939 			BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
940 			BPF_EXIT_INSN(),
941 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
942 			BPF_EXIT_INSN(),
943 		},
944 		INTERNAL,
945 		{ },
946 		{ { 0, 1 } }
947 	},
948 	{
949 		/* Have to test all register combinations, since
950 		 * JITing of different registers will produce
951 		 * different asm code.
952 		 */
953 		"INT: ADD 64-bit",
954 		.u.insns_int = {
955 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
956 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
957 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
958 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
959 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
960 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
961 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
962 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
963 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
964 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
965 			BPF_ALU64_IMM(BPF_ADD, R0, 20),
966 			BPF_ALU64_IMM(BPF_ADD, R1, 20),
967 			BPF_ALU64_IMM(BPF_ADD, R2, 20),
968 			BPF_ALU64_IMM(BPF_ADD, R3, 20),
969 			BPF_ALU64_IMM(BPF_ADD, R4, 20),
970 			BPF_ALU64_IMM(BPF_ADD, R5, 20),
971 			BPF_ALU64_IMM(BPF_ADD, R6, 20),
972 			BPF_ALU64_IMM(BPF_ADD, R7, 20),
973 			BPF_ALU64_IMM(BPF_ADD, R8, 20),
974 			BPF_ALU64_IMM(BPF_ADD, R9, 20),
975 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
976 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
977 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
978 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
979 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
980 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
981 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
982 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
983 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
984 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
985 			BPF_ALU64_REG(BPF_ADD, R0, R0),
986 			BPF_ALU64_REG(BPF_ADD, R0, R1),
987 			BPF_ALU64_REG(BPF_ADD, R0, R2),
988 			BPF_ALU64_REG(BPF_ADD, R0, R3),
989 			BPF_ALU64_REG(BPF_ADD, R0, R4),
990 			BPF_ALU64_REG(BPF_ADD, R0, R5),
991 			BPF_ALU64_REG(BPF_ADD, R0, R6),
992 			BPF_ALU64_REG(BPF_ADD, R0, R7),
993 			BPF_ALU64_REG(BPF_ADD, R0, R8),
994 			BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
995 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
996 			BPF_EXIT_INSN(),
997 			BPF_ALU64_REG(BPF_ADD, R1, R0),
998 			BPF_ALU64_REG(BPF_ADD, R1, R1),
999 			BPF_ALU64_REG(BPF_ADD, R1, R2),
1000 			BPF_ALU64_REG(BPF_ADD, R1, R3),
1001 			BPF_ALU64_REG(BPF_ADD, R1, R4),
1002 			BPF_ALU64_REG(BPF_ADD, R1, R5),
1003 			BPF_ALU64_REG(BPF_ADD, R1, R6),
1004 			BPF_ALU64_REG(BPF_ADD, R1, R7),
1005 			BPF_ALU64_REG(BPF_ADD, R1, R8),
1006 			BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1007 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1008 			BPF_EXIT_INSN(),
1009 			BPF_ALU64_REG(BPF_ADD, R2, R0),
1010 			BPF_ALU64_REG(BPF_ADD, R2, R1),
1011 			BPF_ALU64_REG(BPF_ADD, R2, R2),
1012 			BPF_ALU64_REG(BPF_ADD, R2, R3),
1013 			BPF_ALU64_REG(BPF_ADD, R2, R4),
1014 			BPF_ALU64_REG(BPF_ADD, R2, R5),
1015 			BPF_ALU64_REG(BPF_ADD, R2, R6),
1016 			BPF_ALU64_REG(BPF_ADD, R2, R7),
1017 			BPF_ALU64_REG(BPF_ADD, R2, R8),
1018 			BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1019 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1020 			BPF_EXIT_INSN(),
1021 			BPF_ALU64_REG(BPF_ADD, R3, R0),
1022 			BPF_ALU64_REG(BPF_ADD, R3, R1),
1023 			BPF_ALU64_REG(BPF_ADD, R3, R2),
1024 			BPF_ALU64_REG(BPF_ADD, R3, R3),
1025 			BPF_ALU64_REG(BPF_ADD, R3, R4),
1026 			BPF_ALU64_REG(BPF_ADD, R3, R5),
1027 			BPF_ALU64_REG(BPF_ADD, R3, R6),
1028 			BPF_ALU64_REG(BPF_ADD, R3, R7),
1029 			BPF_ALU64_REG(BPF_ADD, R3, R8),
1030 			BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1031 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1032 			BPF_EXIT_INSN(),
1033 			BPF_ALU64_REG(BPF_ADD, R4, R0),
1034 			BPF_ALU64_REG(BPF_ADD, R4, R1),
1035 			BPF_ALU64_REG(BPF_ADD, R4, R2),
1036 			BPF_ALU64_REG(BPF_ADD, R4, R3),
1037 			BPF_ALU64_REG(BPF_ADD, R4, R4),
1038 			BPF_ALU64_REG(BPF_ADD, R4, R5),
1039 			BPF_ALU64_REG(BPF_ADD, R4, R6),
1040 			BPF_ALU64_REG(BPF_ADD, R4, R7),
1041 			BPF_ALU64_REG(BPF_ADD, R4, R8),
1042 			BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1043 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1044 			BPF_EXIT_INSN(),
1045 			BPF_ALU64_REG(BPF_ADD, R5, R0),
1046 			BPF_ALU64_REG(BPF_ADD, R5, R1),
1047 			BPF_ALU64_REG(BPF_ADD, R5, R2),
1048 			BPF_ALU64_REG(BPF_ADD, R5, R3),
1049 			BPF_ALU64_REG(BPF_ADD, R5, R4),
1050 			BPF_ALU64_REG(BPF_ADD, R5, R5),
1051 			BPF_ALU64_REG(BPF_ADD, R5, R6),
1052 			BPF_ALU64_REG(BPF_ADD, R5, R7),
1053 			BPF_ALU64_REG(BPF_ADD, R5, R8),
1054 			BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1055 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1056 			BPF_EXIT_INSN(),
1057 			BPF_ALU64_REG(BPF_ADD, R6, R0),
1058 			BPF_ALU64_REG(BPF_ADD, R6, R1),
1059 			BPF_ALU64_REG(BPF_ADD, R6, R2),
1060 			BPF_ALU64_REG(BPF_ADD, R6, R3),
1061 			BPF_ALU64_REG(BPF_ADD, R6, R4),
1062 			BPF_ALU64_REG(BPF_ADD, R6, R5),
1063 			BPF_ALU64_REG(BPF_ADD, R6, R6),
1064 			BPF_ALU64_REG(BPF_ADD, R6, R7),
1065 			BPF_ALU64_REG(BPF_ADD, R6, R8),
1066 			BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1067 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1068 			BPF_EXIT_INSN(),
1069 			BPF_ALU64_REG(BPF_ADD, R7, R0),
1070 			BPF_ALU64_REG(BPF_ADD, R7, R1),
1071 			BPF_ALU64_REG(BPF_ADD, R7, R2),
1072 			BPF_ALU64_REG(BPF_ADD, R7, R3),
1073 			BPF_ALU64_REG(BPF_ADD, R7, R4),
1074 			BPF_ALU64_REG(BPF_ADD, R7, R5),
1075 			BPF_ALU64_REG(BPF_ADD, R7, R6),
1076 			BPF_ALU64_REG(BPF_ADD, R7, R7),
1077 			BPF_ALU64_REG(BPF_ADD, R7, R8),
1078 			BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1079 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1080 			BPF_EXIT_INSN(),
1081 			BPF_ALU64_REG(BPF_ADD, R8, R0),
1082 			BPF_ALU64_REG(BPF_ADD, R8, R1),
1083 			BPF_ALU64_REG(BPF_ADD, R8, R2),
1084 			BPF_ALU64_REG(BPF_ADD, R8, R3),
1085 			BPF_ALU64_REG(BPF_ADD, R8, R4),
1086 			BPF_ALU64_REG(BPF_ADD, R8, R5),
1087 			BPF_ALU64_REG(BPF_ADD, R8, R6),
1088 			BPF_ALU64_REG(BPF_ADD, R8, R7),
1089 			BPF_ALU64_REG(BPF_ADD, R8, R8),
1090 			BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1091 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1092 			BPF_EXIT_INSN(),
1093 			BPF_ALU64_REG(BPF_ADD, R9, R0),
1094 			BPF_ALU64_REG(BPF_ADD, R9, R1),
1095 			BPF_ALU64_REG(BPF_ADD, R9, R2),
1096 			BPF_ALU64_REG(BPF_ADD, R9, R3),
1097 			BPF_ALU64_REG(BPF_ADD, R9, R4),
1098 			BPF_ALU64_REG(BPF_ADD, R9, R5),
1099 			BPF_ALU64_REG(BPF_ADD, R9, R6),
1100 			BPF_ALU64_REG(BPF_ADD, R9, R7),
1101 			BPF_ALU64_REG(BPF_ADD, R9, R8),
1102 			BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1103 			BPF_ALU64_REG(BPF_MOV, R0, R9),
1104 			BPF_EXIT_INSN(),
1105 		},
1106 		INTERNAL,
1107 		{ },
1108 		{ { 0, 2957380 } }
1109 	},
1110 	{
1111 		"INT: ADD 32-bit",
1112 		.u.insns_int = {
1113 			BPF_ALU32_IMM(BPF_MOV, R0, 20),
1114 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
1115 			BPF_ALU32_IMM(BPF_MOV, R2, 2),
1116 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
1117 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
1118 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
1119 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
1120 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
1121 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
1122 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
1123 			BPF_ALU64_IMM(BPF_ADD, R1, 10),
1124 			BPF_ALU64_IMM(BPF_ADD, R2, 10),
1125 			BPF_ALU64_IMM(BPF_ADD, R3, 10),
1126 			BPF_ALU64_IMM(BPF_ADD, R4, 10),
1127 			BPF_ALU64_IMM(BPF_ADD, R5, 10),
1128 			BPF_ALU64_IMM(BPF_ADD, R6, 10),
1129 			BPF_ALU64_IMM(BPF_ADD, R7, 10),
1130 			BPF_ALU64_IMM(BPF_ADD, R8, 10),
1131 			BPF_ALU64_IMM(BPF_ADD, R9, 10),
1132 			BPF_ALU32_REG(BPF_ADD, R0, R1),
1133 			BPF_ALU32_REG(BPF_ADD, R0, R2),
1134 			BPF_ALU32_REG(BPF_ADD, R0, R3),
1135 			BPF_ALU32_REG(BPF_ADD, R0, R4),
1136 			BPF_ALU32_REG(BPF_ADD, R0, R5),
1137 			BPF_ALU32_REG(BPF_ADD, R0, R6),
1138 			BPF_ALU32_REG(BPF_ADD, R0, R7),
1139 			BPF_ALU32_REG(BPF_ADD, R0, R8),
1140 			BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1141 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1142 			BPF_EXIT_INSN(),
1143 			BPF_ALU32_REG(BPF_ADD, R1, R0),
1144 			BPF_ALU32_REG(BPF_ADD, R1, R1),
1145 			BPF_ALU32_REG(BPF_ADD, R1, R2),
1146 			BPF_ALU32_REG(BPF_ADD, R1, R3),
1147 			BPF_ALU32_REG(BPF_ADD, R1, R4),
1148 			BPF_ALU32_REG(BPF_ADD, R1, R5),
1149 			BPF_ALU32_REG(BPF_ADD, R1, R6),
1150 			BPF_ALU32_REG(BPF_ADD, R1, R7),
1151 			BPF_ALU32_REG(BPF_ADD, R1, R8),
1152 			BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1153 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1154 			BPF_EXIT_INSN(),
1155 			BPF_ALU32_REG(BPF_ADD, R2, R0),
1156 			BPF_ALU32_REG(BPF_ADD, R2, R1),
1157 			BPF_ALU32_REG(BPF_ADD, R2, R2),
1158 			BPF_ALU32_REG(BPF_ADD, R2, R3),
1159 			BPF_ALU32_REG(BPF_ADD, R2, R4),
1160 			BPF_ALU32_REG(BPF_ADD, R2, R5),
1161 			BPF_ALU32_REG(BPF_ADD, R2, R6),
1162 			BPF_ALU32_REG(BPF_ADD, R2, R7),
1163 			BPF_ALU32_REG(BPF_ADD, R2, R8),
1164 			BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1165 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1166 			BPF_EXIT_INSN(),
1167 			BPF_ALU32_REG(BPF_ADD, R3, R0),
1168 			BPF_ALU32_REG(BPF_ADD, R3, R1),
1169 			BPF_ALU32_REG(BPF_ADD, R3, R2),
1170 			BPF_ALU32_REG(BPF_ADD, R3, R3),
1171 			BPF_ALU32_REG(BPF_ADD, R3, R4),
1172 			BPF_ALU32_REG(BPF_ADD, R3, R5),
1173 			BPF_ALU32_REG(BPF_ADD, R3, R6),
1174 			BPF_ALU32_REG(BPF_ADD, R3, R7),
1175 			BPF_ALU32_REG(BPF_ADD, R3, R8),
1176 			BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1177 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1178 			BPF_EXIT_INSN(),
1179 			BPF_ALU32_REG(BPF_ADD, R4, R0),
1180 			BPF_ALU32_REG(BPF_ADD, R4, R1),
1181 			BPF_ALU32_REG(BPF_ADD, R4, R2),
1182 			BPF_ALU32_REG(BPF_ADD, R4, R3),
1183 			BPF_ALU32_REG(BPF_ADD, R4, R4),
1184 			BPF_ALU32_REG(BPF_ADD, R4, R5),
1185 			BPF_ALU32_REG(BPF_ADD, R4, R6),
1186 			BPF_ALU32_REG(BPF_ADD, R4, R7),
1187 			BPF_ALU32_REG(BPF_ADD, R4, R8),
1188 			BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1189 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1190 			BPF_EXIT_INSN(),
1191 			BPF_ALU32_REG(BPF_ADD, R5, R0),
1192 			BPF_ALU32_REG(BPF_ADD, R5, R1),
1193 			BPF_ALU32_REG(BPF_ADD, R5, R2),
1194 			BPF_ALU32_REG(BPF_ADD, R5, R3),
1195 			BPF_ALU32_REG(BPF_ADD, R5, R4),
1196 			BPF_ALU32_REG(BPF_ADD, R5, R5),
1197 			BPF_ALU32_REG(BPF_ADD, R5, R6),
1198 			BPF_ALU32_REG(BPF_ADD, R5, R7),
1199 			BPF_ALU32_REG(BPF_ADD, R5, R8),
1200 			BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1201 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1202 			BPF_EXIT_INSN(),
1203 			BPF_ALU32_REG(BPF_ADD, R6, R0),
1204 			BPF_ALU32_REG(BPF_ADD, R6, R1),
1205 			BPF_ALU32_REG(BPF_ADD, R6, R2),
1206 			BPF_ALU32_REG(BPF_ADD, R6, R3),
1207 			BPF_ALU32_REG(BPF_ADD, R6, R4),
1208 			BPF_ALU32_REG(BPF_ADD, R6, R5),
1209 			BPF_ALU32_REG(BPF_ADD, R6, R6),
1210 			BPF_ALU32_REG(BPF_ADD, R6, R7),
1211 			BPF_ALU32_REG(BPF_ADD, R6, R8),
1212 			BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1213 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1214 			BPF_EXIT_INSN(),
1215 			BPF_ALU32_REG(BPF_ADD, R7, R0),
1216 			BPF_ALU32_REG(BPF_ADD, R7, R1),
1217 			BPF_ALU32_REG(BPF_ADD, R7, R2),
1218 			BPF_ALU32_REG(BPF_ADD, R7, R3),
1219 			BPF_ALU32_REG(BPF_ADD, R7, R4),
1220 			BPF_ALU32_REG(BPF_ADD, R7, R5),
1221 			BPF_ALU32_REG(BPF_ADD, R7, R6),
1222 			BPF_ALU32_REG(BPF_ADD, R7, R7),
1223 			BPF_ALU32_REG(BPF_ADD, R7, R8),
1224 			BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1225 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1226 			BPF_EXIT_INSN(),
1227 			BPF_ALU32_REG(BPF_ADD, R8, R0),
1228 			BPF_ALU32_REG(BPF_ADD, R8, R1),
1229 			BPF_ALU32_REG(BPF_ADD, R8, R2),
1230 			BPF_ALU32_REG(BPF_ADD, R8, R3),
1231 			BPF_ALU32_REG(BPF_ADD, R8, R4),
1232 			BPF_ALU32_REG(BPF_ADD, R8, R5),
1233 			BPF_ALU32_REG(BPF_ADD, R8, R6),
1234 			BPF_ALU32_REG(BPF_ADD, R8, R7),
1235 			BPF_ALU32_REG(BPF_ADD, R8, R8),
1236 			BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1237 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1238 			BPF_EXIT_INSN(),
1239 			BPF_ALU32_REG(BPF_ADD, R9, R0),
1240 			BPF_ALU32_REG(BPF_ADD, R9, R1),
1241 			BPF_ALU32_REG(BPF_ADD, R9, R2),
1242 			BPF_ALU32_REG(BPF_ADD, R9, R3),
1243 			BPF_ALU32_REG(BPF_ADD, R9, R4),
1244 			BPF_ALU32_REG(BPF_ADD, R9, R5),
1245 			BPF_ALU32_REG(BPF_ADD, R9, R6),
1246 			BPF_ALU32_REG(BPF_ADD, R9, R7),
1247 			BPF_ALU32_REG(BPF_ADD, R9, R8),
1248 			BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1249 			BPF_ALU32_REG(BPF_MOV, R0, R9),
1250 			BPF_EXIT_INSN(),
1251 		},
1252 		INTERNAL,
1253 		{ },
1254 		{ { 0, 2957380 } }
1255 	},
1256 	{	/* Mainly checking JIT here. */
1257 		"INT: SUB",
1258 		.u.insns_int = {
1259 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1260 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1261 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1262 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1263 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1264 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1265 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1266 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1267 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1268 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1269 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1270 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1271 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1272 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1273 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1274 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1275 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1276 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1277 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1278 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1279 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1280 			BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1281 			BPF_EXIT_INSN(),
1282 			BPF_ALU64_REG(BPF_SUB, R1, R0),
1283 			BPF_ALU64_REG(BPF_SUB, R1, R2),
1284 			BPF_ALU64_REG(BPF_SUB, R1, R3),
1285 			BPF_ALU64_REG(BPF_SUB, R1, R4),
1286 			BPF_ALU64_REG(BPF_SUB, R1, R5),
1287 			BPF_ALU64_REG(BPF_SUB, R1, R6),
1288 			BPF_ALU64_REG(BPF_SUB, R1, R7),
1289 			BPF_ALU64_REG(BPF_SUB, R1, R8),
1290 			BPF_ALU64_REG(BPF_SUB, R1, R9),
1291 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1292 			BPF_ALU64_REG(BPF_SUB, R2, R0),
1293 			BPF_ALU64_REG(BPF_SUB, R2, R1),
1294 			BPF_ALU64_REG(BPF_SUB, R2, R3),
1295 			BPF_ALU64_REG(BPF_SUB, R2, R4),
1296 			BPF_ALU64_REG(BPF_SUB, R2, R5),
1297 			BPF_ALU64_REG(BPF_SUB, R2, R6),
1298 			BPF_ALU64_REG(BPF_SUB, R2, R7),
1299 			BPF_ALU64_REG(BPF_SUB, R2, R8),
1300 			BPF_ALU64_REG(BPF_SUB, R2, R9),
1301 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1302 			BPF_ALU64_REG(BPF_SUB, R3, R0),
1303 			BPF_ALU64_REG(BPF_SUB, R3, R1),
1304 			BPF_ALU64_REG(BPF_SUB, R3, R2),
1305 			BPF_ALU64_REG(BPF_SUB, R3, R4),
1306 			BPF_ALU64_REG(BPF_SUB, R3, R5),
1307 			BPF_ALU64_REG(BPF_SUB, R3, R6),
1308 			BPF_ALU64_REG(BPF_SUB, R3, R7),
1309 			BPF_ALU64_REG(BPF_SUB, R3, R8),
1310 			BPF_ALU64_REG(BPF_SUB, R3, R9),
1311 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1312 			BPF_ALU64_REG(BPF_SUB, R4, R0),
1313 			BPF_ALU64_REG(BPF_SUB, R4, R1),
1314 			BPF_ALU64_REG(BPF_SUB, R4, R2),
1315 			BPF_ALU64_REG(BPF_SUB, R4, R3),
1316 			BPF_ALU64_REG(BPF_SUB, R4, R5),
1317 			BPF_ALU64_REG(BPF_SUB, R4, R6),
1318 			BPF_ALU64_REG(BPF_SUB, R4, R7),
1319 			BPF_ALU64_REG(BPF_SUB, R4, R8),
1320 			BPF_ALU64_REG(BPF_SUB, R4, R9),
1321 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1322 			BPF_ALU64_REG(BPF_SUB, R5, R0),
1323 			BPF_ALU64_REG(BPF_SUB, R5, R1),
1324 			BPF_ALU64_REG(BPF_SUB, R5, R2),
1325 			BPF_ALU64_REG(BPF_SUB, R5, R3),
1326 			BPF_ALU64_REG(BPF_SUB, R5, R4),
1327 			BPF_ALU64_REG(BPF_SUB, R5, R6),
1328 			BPF_ALU64_REG(BPF_SUB, R5, R7),
1329 			BPF_ALU64_REG(BPF_SUB, R5, R8),
1330 			BPF_ALU64_REG(BPF_SUB, R5, R9),
1331 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1332 			BPF_ALU64_REG(BPF_SUB, R6, R0),
1333 			BPF_ALU64_REG(BPF_SUB, R6, R1),
1334 			BPF_ALU64_REG(BPF_SUB, R6, R2),
1335 			BPF_ALU64_REG(BPF_SUB, R6, R3),
1336 			BPF_ALU64_REG(BPF_SUB, R6, R4),
1337 			BPF_ALU64_REG(BPF_SUB, R6, R5),
1338 			BPF_ALU64_REG(BPF_SUB, R6, R7),
1339 			BPF_ALU64_REG(BPF_SUB, R6, R8),
1340 			BPF_ALU64_REG(BPF_SUB, R6, R9),
1341 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1342 			BPF_ALU64_REG(BPF_SUB, R7, R0),
1343 			BPF_ALU64_REG(BPF_SUB, R7, R1),
1344 			BPF_ALU64_REG(BPF_SUB, R7, R2),
1345 			BPF_ALU64_REG(BPF_SUB, R7, R3),
1346 			BPF_ALU64_REG(BPF_SUB, R7, R4),
1347 			BPF_ALU64_REG(BPF_SUB, R7, R5),
1348 			BPF_ALU64_REG(BPF_SUB, R7, R6),
1349 			BPF_ALU64_REG(BPF_SUB, R7, R8),
1350 			BPF_ALU64_REG(BPF_SUB, R7, R9),
1351 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1352 			BPF_ALU64_REG(BPF_SUB, R8, R0),
1353 			BPF_ALU64_REG(BPF_SUB, R8, R1),
1354 			BPF_ALU64_REG(BPF_SUB, R8, R2),
1355 			BPF_ALU64_REG(BPF_SUB, R8, R3),
1356 			BPF_ALU64_REG(BPF_SUB, R8, R4),
1357 			BPF_ALU64_REG(BPF_SUB, R8, R5),
1358 			BPF_ALU64_REG(BPF_SUB, R8, R6),
1359 			BPF_ALU64_REG(BPF_SUB, R8, R7),
1360 			BPF_ALU64_REG(BPF_SUB, R8, R9),
1361 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1362 			BPF_ALU64_REG(BPF_SUB, R9, R0),
1363 			BPF_ALU64_REG(BPF_SUB, R9, R1),
1364 			BPF_ALU64_REG(BPF_SUB, R9, R2),
1365 			BPF_ALU64_REG(BPF_SUB, R9, R3),
1366 			BPF_ALU64_REG(BPF_SUB, R9, R4),
1367 			BPF_ALU64_REG(BPF_SUB, R9, R5),
1368 			BPF_ALU64_REG(BPF_SUB, R9, R6),
1369 			BPF_ALU64_REG(BPF_SUB, R9, R7),
1370 			BPF_ALU64_REG(BPF_SUB, R9, R8),
1371 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1372 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1373 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
1374 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1375 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1376 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1377 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1378 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1379 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1380 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1381 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1382 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1383 			BPF_EXIT_INSN(),
1384 		},
1385 		INTERNAL,
1386 		{ },
1387 		{ { 0, 11 } }
1388 	},
1389 	{	/* Mainly checking JIT here. */
1390 		"INT: XOR",
1391 		.u.insns_int = {
1392 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1393 			BPF_ALU64_REG(BPF_XOR, R1, R1),
1394 			BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1395 			BPF_EXIT_INSN(),
1396 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1397 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1398 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1399 			BPF_ALU64_REG(BPF_XOR, R2, R2),
1400 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1401 			BPF_EXIT_INSN(),
1402 			BPF_ALU64_REG(BPF_SUB, R2, R2),
1403 			BPF_ALU64_REG(BPF_XOR, R3, R3),
1404 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1405 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1406 			BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1407 			BPF_EXIT_INSN(),
1408 			BPF_ALU64_REG(BPF_SUB, R3, R3),
1409 			BPF_ALU64_REG(BPF_XOR, R4, R4),
1410 			BPF_ALU64_IMM(BPF_MOV, R2, 1),
1411 			BPF_ALU64_IMM(BPF_MOV, R5, -1),
1412 			BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1413 			BPF_EXIT_INSN(),
1414 			BPF_ALU64_REG(BPF_SUB, R4, R4),
1415 			BPF_ALU64_REG(BPF_XOR, R5, R5),
1416 			BPF_ALU64_IMM(BPF_MOV, R3, 1),
1417 			BPF_ALU64_IMM(BPF_MOV, R7, -1),
1418 			BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1419 			BPF_EXIT_INSN(),
1420 			BPF_ALU64_IMM(BPF_MOV, R5, 1),
1421 			BPF_ALU64_REG(BPF_SUB, R5, R5),
1422 			BPF_ALU64_REG(BPF_XOR, R6, R6),
1423 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1424 			BPF_ALU64_IMM(BPF_MOV, R8, -1),
1425 			BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1426 			BPF_EXIT_INSN(),
1427 			BPF_ALU64_REG(BPF_SUB, R6, R6),
1428 			BPF_ALU64_REG(BPF_XOR, R7, R7),
1429 			BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1430 			BPF_EXIT_INSN(),
1431 			BPF_ALU64_REG(BPF_SUB, R7, R7),
1432 			BPF_ALU64_REG(BPF_XOR, R8, R8),
1433 			BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1434 			BPF_EXIT_INSN(),
1435 			BPF_ALU64_REG(BPF_SUB, R8, R8),
1436 			BPF_ALU64_REG(BPF_XOR, R9, R9),
1437 			BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1438 			BPF_EXIT_INSN(),
1439 			BPF_ALU64_REG(BPF_SUB, R9, R9),
1440 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1441 			BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1442 			BPF_EXIT_INSN(),
1443 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1444 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1445 			BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1446 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1447 			BPF_EXIT_INSN(),
1448 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1449 			BPF_EXIT_INSN(),
1450 		},
1451 		INTERNAL,
1452 		{ },
1453 		{ { 0, 1 } }
1454 	},
1455 	{	/* Mainly checking JIT here. */
1456 		"INT: MUL",
1457 		.u.insns_int = {
1458 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1459 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1460 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1461 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1462 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1463 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1464 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1465 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1466 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1467 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1468 			BPF_ALU64_REG(BPF_MUL, R0, R0),
1469 			BPF_ALU64_REG(BPF_MUL, R0, R1),
1470 			BPF_ALU64_REG(BPF_MUL, R0, R2),
1471 			BPF_ALU64_REG(BPF_MUL, R0, R3),
1472 			BPF_ALU64_REG(BPF_MUL, R0, R4),
1473 			BPF_ALU64_REG(BPF_MUL, R0, R5),
1474 			BPF_ALU64_REG(BPF_MUL, R0, R6),
1475 			BPF_ALU64_REG(BPF_MUL, R0, R7),
1476 			BPF_ALU64_REG(BPF_MUL, R0, R8),
1477 			BPF_ALU64_REG(BPF_MUL, R0, R9),
1478 			BPF_ALU64_IMM(BPF_MUL, R0, 10),
1479 			BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1480 			BPF_EXIT_INSN(),
1481 			BPF_ALU64_REG(BPF_MUL, R1, R0),
1482 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1483 			BPF_ALU64_REG(BPF_MUL, R1, R3),
1484 			BPF_ALU64_REG(BPF_MUL, R1, R4),
1485 			BPF_ALU64_REG(BPF_MUL, R1, R5),
1486 			BPF_ALU64_REG(BPF_MUL, R1, R6),
1487 			BPF_ALU64_REG(BPF_MUL, R1, R7),
1488 			BPF_ALU64_REG(BPF_MUL, R1, R8),
1489 			BPF_ALU64_REG(BPF_MUL, R1, R9),
1490 			BPF_ALU64_IMM(BPF_MUL, R1, 10),
1491 			BPF_ALU64_REG(BPF_MOV, R2, R1),
1492 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1493 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1494 			BPF_EXIT_INSN(),
1495 			BPF_ALU64_IMM(BPF_LSH, R1, 32),
1496 			BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1497 			BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1498 			BPF_EXIT_INSN(),
1499 			BPF_ALU64_REG(BPF_MUL, R2, R0),
1500 			BPF_ALU64_REG(BPF_MUL, R2, R1),
1501 			BPF_ALU64_REG(BPF_MUL, R2, R3),
1502 			BPF_ALU64_REG(BPF_MUL, R2, R4),
1503 			BPF_ALU64_REG(BPF_MUL, R2, R5),
1504 			BPF_ALU64_REG(BPF_MUL, R2, R6),
1505 			BPF_ALU64_REG(BPF_MUL, R2, R7),
1506 			BPF_ALU64_REG(BPF_MUL, R2, R8),
1507 			BPF_ALU64_REG(BPF_MUL, R2, R9),
1508 			BPF_ALU64_IMM(BPF_MUL, R2, 10),
1509 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1510 			BPF_ALU64_REG(BPF_MOV, R0, R2),
1511 			BPF_EXIT_INSN(),
1512 		},
1513 		INTERNAL,
1514 		{ },
1515 		{ { 0, 0x35d97ef2 } }
1516 	},
1517 	{
1518 		"INT: ALU MIX",
1519 		.u.insns_int = {
1520 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1521 			BPF_ALU64_IMM(BPF_ADD, R0, -1),
1522 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1523 			BPF_ALU64_IMM(BPF_XOR, R2, 3),
1524 			BPF_ALU64_REG(BPF_DIV, R0, R2),
1525 			BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1526 			BPF_EXIT_INSN(),
1527 			BPF_ALU64_IMM(BPF_MOD, R0, 3),
1528 			BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1529 			BPF_EXIT_INSN(),
1530 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1531 			BPF_EXIT_INSN(),
1532 		},
1533 		INTERNAL,
1534 		{ },
1535 		{ { 0, -1 } }
1536 	},
1537 	{
1538 		"INT: shifts by register",
1539 		.u.insns_int = {
1540 			BPF_MOV64_IMM(R0, -1234),
1541 			BPF_MOV64_IMM(R1, 1),
1542 			BPF_ALU32_REG(BPF_RSH, R0, R1),
1543 			BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1544 			BPF_EXIT_INSN(),
1545 			BPF_MOV64_IMM(R2, 1),
1546 			BPF_ALU64_REG(BPF_LSH, R0, R2),
1547 			BPF_MOV32_IMM(R4, -1234),
1548 			BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1549 			BPF_EXIT_INSN(),
1550 			BPF_ALU64_IMM(BPF_AND, R4, 63),
1551 			BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1552 			BPF_MOV64_IMM(R3, 47),
1553 			BPF_ALU64_REG(BPF_ARSH, R0, R3),
1554 			BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1555 			BPF_EXIT_INSN(),
1556 			BPF_MOV64_IMM(R2, 1),
1557 			BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1558 			BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1559 			BPF_EXIT_INSN(),
1560 			BPF_MOV64_IMM(R4, 4),
1561 			BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1562 			BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1563 			BPF_EXIT_INSN(),
1564 			BPF_MOV64_IMM(R4, 5),
1565 			BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1566 			BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1567 			BPF_EXIT_INSN(),
1568 			BPF_MOV64_IMM(R0, -1),
1569 			BPF_EXIT_INSN(),
1570 		},
1571 		INTERNAL,
1572 		{ },
1573 		{ { 0, -1 } }
1574 	},
1575 	{
1576 		"INT: DIV + ABS",
1577 		.u.insns_int = {
1578 			BPF_ALU64_REG(BPF_MOV, R6, R1),
1579 			BPF_LD_ABS(BPF_B, 3),
1580 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1581 			BPF_ALU32_REG(BPF_DIV, R0, R2),
1582 			BPF_ALU64_REG(BPF_MOV, R8, R0),
1583 			BPF_LD_ABS(BPF_B, 4),
1584 			BPF_ALU64_REG(BPF_ADD, R8, R0),
1585 			BPF_LD_IND(BPF_B, R8, -70),
1586 			BPF_EXIT_INSN(),
1587 		},
1588 		INTERNAL,
1589 		{ 10, 20, 30, 40, 50 },
1590 		{ { 4, 0 }, { 5, 10 } }
1591 	},
1592 	{
1593 		"INT: DIV by zero",
1594 		.u.insns_int = {
1595 			BPF_ALU64_REG(BPF_MOV, R6, R1),
1596 			BPF_ALU64_IMM(BPF_MOV, R7, 0),
1597 			BPF_LD_ABS(BPF_B, 3),
1598 			BPF_ALU32_REG(BPF_DIV, R0, R7),
1599 			BPF_EXIT_INSN(),
1600 		},
1601 		INTERNAL,
1602 		{ 10, 20, 30, 40, 50 },
1603 		{ { 3, 0 }, { 4, 0 } }
1604 	},
1605 	{
1606 		"check: missing ret",
1607 		.u.insns = {
1608 			BPF_STMT(BPF_LD | BPF_IMM, 1),
1609 		},
1610 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1611 		{ },
1612 		{ }
1613 	},
1614 	{
1615 		"check: div_k_0",
1616 		.u.insns = {
1617 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
1618 			BPF_STMT(BPF_RET | BPF_K, 0)
1619 		},
1620 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1621 		{ },
1622 		{ }
1623 	},
1624 	{
1625 		"check: unknown insn",
1626 		.u.insns = {
1627 			/* seccomp insn, rejected in socket filter */
1628 			BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
1629 			BPF_STMT(BPF_RET | BPF_K, 0)
1630 		},
1631 		CLASSIC | FLAG_EXPECTED_FAIL,
1632 		{ },
1633 		{ }
1634 	},
1635 	{
1636 		"check: out of range spill/fill",
1637 		.u.insns = {
1638 			BPF_STMT(BPF_STX, 16),
1639 			BPF_STMT(BPF_RET | BPF_K, 0)
1640 		},
1641 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1642 		{ },
1643 		{ }
1644 	},
1645 	{
1646 		"JUMPS + HOLES",
1647 		.u.insns = {
1648 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1649 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
1650 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1651 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1652 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1653 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1654 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1655 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1656 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1657 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1658 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1659 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1660 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1661 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1662 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1663 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
1664 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1665 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
1666 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1667 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1668 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1669 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1670 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1671 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1672 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1673 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1674 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1675 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1676 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1677 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1678 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1679 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1680 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1681 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1682 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
1683 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
1684 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1685 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1686 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1687 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1688 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1689 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1690 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1691 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1692 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1693 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1694 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1695 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1696 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1697 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1698 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1699 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1700 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
1701 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
1702 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1703 			BPF_STMT(BPF_RET | BPF_A, 0),
1704 			BPF_STMT(BPF_RET | BPF_A, 0),
1705 		},
1706 		CLASSIC,
1707 		{ 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
1708 		  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
1709 		  0x08, 0x00,
1710 		  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
1711 		  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
1712 		  0xc0, 0xa8, 0x33, 0x01,
1713 		  0xc0, 0xa8, 0x33, 0x02,
1714 		  0xbb, 0xb6,
1715 		  0xa9, 0xfa,
1716 		  0x00, 0x14, 0x00, 0x00,
1717 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1718 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1719 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1720 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1721 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1722 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1723 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1724 		  0xcc, 0xcc, 0xcc, 0xcc },
1725 		{ { 88, 0x001b } }
1726 	},
1727 	{
1728 		"check: RET X",
1729 		.u.insns = {
1730 			BPF_STMT(BPF_RET | BPF_X, 0),
1731 		},
1732 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1733 		{ },
1734 		{ },
1735 	},
1736 	{
1737 		"check: LDX + RET X",
1738 		.u.insns = {
1739 			BPF_STMT(BPF_LDX | BPF_IMM, 42),
1740 			BPF_STMT(BPF_RET | BPF_X, 0),
1741 		},
1742 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1743 		{ },
1744 		{ },
1745 	},
1746 	{	/* Mainly checking JIT here. */
1747 		"M[]: alt STX + LDX",
1748 		.u.insns = {
1749 			BPF_STMT(BPF_LDX | BPF_IMM, 100),
1750 			BPF_STMT(BPF_STX, 0),
1751 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
1752 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1753 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1754 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1755 			BPF_STMT(BPF_STX, 1),
1756 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
1757 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1758 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1759 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1760 			BPF_STMT(BPF_STX, 2),
1761 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
1762 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1763 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1764 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1765 			BPF_STMT(BPF_STX, 3),
1766 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
1767 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1768 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1769 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1770 			BPF_STMT(BPF_STX, 4),
1771 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
1772 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1773 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1774 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1775 			BPF_STMT(BPF_STX, 5),
1776 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
1777 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1778 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1779 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1780 			BPF_STMT(BPF_STX, 6),
1781 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
1782 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1783 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1784 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1785 			BPF_STMT(BPF_STX, 7),
1786 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
1787 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1788 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1789 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1790 			BPF_STMT(BPF_STX, 8),
1791 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
1792 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1793 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1794 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1795 			BPF_STMT(BPF_STX, 9),
1796 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
1797 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1798 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1799 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1800 			BPF_STMT(BPF_STX, 10),
1801 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
1802 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1803 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1804 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1805 			BPF_STMT(BPF_STX, 11),
1806 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
1807 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1808 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1809 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1810 			BPF_STMT(BPF_STX, 12),
1811 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
1812 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1813 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1814 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1815 			BPF_STMT(BPF_STX, 13),
1816 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
1817 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1818 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1819 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1820 			BPF_STMT(BPF_STX, 14),
1821 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
1822 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1823 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1824 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1825 			BPF_STMT(BPF_STX, 15),
1826 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
1827 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1828 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1829 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1830 			BPF_STMT(BPF_RET | BPF_A, 0),
1831 		},
1832 		CLASSIC | FLAG_NO_DATA,
1833 		{ },
1834 		{ { 0, 116 } },
1835 	},
1836 	{	/* Mainly checking JIT here. */
1837 		"M[]: full STX + full LDX",
1838 		.u.insns = {
1839 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
1840 			BPF_STMT(BPF_STX, 0),
1841 			BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
1842 			BPF_STMT(BPF_STX, 1),
1843 			BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
1844 			BPF_STMT(BPF_STX, 2),
1845 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
1846 			BPF_STMT(BPF_STX, 3),
1847 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
1848 			BPF_STMT(BPF_STX, 4),
1849 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
1850 			BPF_STMT(BPF_STX, 5),
1851 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
1852 			BPF_STMT(BPF_STX, 6),
1853 			BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
1854 			BPF_STMT(BPF_STX, 7),
1855 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
1856 			BPF_STMT(BPF_STX, 8),
1857 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
1858 			BPF_STMT(BPF_STX, 9),
1859 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
1860 			BPF_STMT(BPF_STX, 10),
1861 			BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
1862 			BPF_STMT(BPF_STX, 11),
1863 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
1864 			BPF_STMT(BPF_STX, 12),
1865 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
1866 			BPF_STMT(BPF_STX, 13),
1867 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
1868 			BPF_STMT(BPF_STX, 14),
1869 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
1870 			BPF_STMT(BPF_STX, 15),
1871 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
1872 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1873 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
1874 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1875 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
1876 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1877 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
1878 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1879 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
1880 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1881 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
1882 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1883 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
1884 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1885 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
1886 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1887 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
1888 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1889 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
1890 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1891 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
1892 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1893 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
1894 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1895 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
1896 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1897 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
1898 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1899 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
1900 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1901 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
1902 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1903 			BPF_STMT(BPF_RET | BPF_A, 0),
1904 		},
1905 		CLASSIC | FLAG_NO_DATA,
1906 		{ },
1907 		{ { 0, 0x2a5a5e5 } },
1908 	},
1909 	{
1910 		"check: SKF_AD_MAX",
1911 		.u.insns = {
1912 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
1913 				 SKF_AD_OFF + SKF_AD_MAX),
1914 			BPF_STMT(BPF_RET | BPF_A, 0),
1915 		},
1916 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1917 		{ },
1918 		{ },
1919 	},
1920 	{	/* Passes checker but fails during runtime. */
1921 		"LD [SKF_AD_OFF-1]",
1922 		.u.insns = {
1923 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
1924 				 SKF_AD_OFF - 1),
1925 			BPF_STMT(BPF_RET | BPF_K, 1),
1926 		},
1927 		CLASSIC,
1928 		{ },
1929 		{ { 1, 0 } },
1930 	},
1931 	{
1932 		"load 64-bit immediate",
1933 		.u.insns_int = {
1934 			BPF_LD_IMM64(R1, 0x567800001234LL),
1935 			BPF_MOV64_REG(R2, R1),
1936 			BPF_MOV64_REG(R3, R2),
1937 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1938 			BPF_ALU64_IMM(BPF_LSH, R3, 32),
1939 			BPF_ALU64_IMM(BPF_RSH, R3, 32),
1940 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1941 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
1942 			BPF_EXIT_INSN(),
1943 			BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
1944 			BPF_EXIT_INSN(),
1945 			BPF_LD_IMM64(R0, 0x1ffffffffLL),
1946 			BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
1947 			BPF_EXIT_INSN(),
1948 		},
1949 		INTERNAL,
1950 		{ },
1951 		{ { 0, 1 } }
1952 	},
1953 	{
1954 		"nmap reduced",
1955 		.u.insns_int = {
1956 			BPF_MOV64_REG(R6, R1),
1957 			BPF_LD_ABS(BPF_H, 12),
1958 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 28),
1959 			BPF_LD_ABS(BPF_H, 12),
1960 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 26),
1961 			BPF_MOV32_IMM(R0, 18),
1962 			BPF_STX_MEM(BPF_W, R10, R0, -64),
1963 			BPF_LDX_MEM(BPF_W, R7, R10, -64),
1964 			BPF_LD_IND(BPF_W, R7, 14),
1965 			BPF_STX_MEM(BPF_W, R10, R0, -60),
1966 			BPF_MOV32_IMM(R0, 280971478),
1967 			BPF_STX_MEM(BPF_W, R10, R0, -56),
1968 			BPF_LDX_MEM(BPF_W, R7, R10, -56),
1969 			BPF_LDX_MEM(BPF_W, R0, R10, -60),
1970 			BPF_ALU32_REG(BPF_SUB, R0, R7),
1971 			BPF_JMP_IMM(BPF_JNE, R0, 0, 15),
1972 			BPF_LD_ABS(BPF_H, 12),
1973 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 13),
1974 			BPF_MOV32_IMM(R0, 22),
1975 			BPF_STX_MEM(BPF_W, R10, R0, -56),
1976 			BPF_LDX_MEM(BPF_W, R7, R10, -56),
1977 			BPF_LD_IND(BPF_H, R7, 14),
1978 			BPF_STX_MEM(BPF_W, R10, R0, -52),
1979 			BPF_MOV32_IMM(R0, 17366),
1980 			BPF_STX_MEM(BPF_W, R10, R0, -48),
1981 			BPF_LDX_MEM(BPF_W, R7, R10, -48),
1982 			BPF_LDX_MEM(BPF_W, R0, R10, -52),
1983 			BPF_ALU32_REG(BPF_SUB, R0, R7),
1984 			BPF_JMP_IMM(BPF_JNE, R0, 0, 2),
1985 			BPF_MOV32_IMM(R0, 256),
1986 			BPF_EXIT_INSN(),
1987 			BPF_MOV32_IMM(R0, 0),
1988 			BPF_EXIT_INSN(),
1989 		},
1990 		INTERNAL,
1991 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 0,
1992 		  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1993 		  0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6},
1994 		{ { 38, 256 } }
1995 	},
1996 	/* BPF_ALU | BPF_MOV | BPF_X */
1997 	{
1998 		"ALU_MOV_X: dst = 2",
1999 		.u.insns_int = {
2000 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2001 			BPF_ALU32_REG(BPF_MOV, R0, R1),
2002 			BPF_EXIT_INSN(),
2003 		},
2004 		INTERNAL,
2005 		{ },
2006 		{ { 0, 2 } },
2007 	},
2008 	{
2009 		"ALU_MOV_X: dst = 4294967295",
2010 		.u.insns_int = {
2011 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2012 			BPF_ALU32_REG(BPF_MOV, R0, R1),
2013 			BPF_EXIT_INSN(),
2014 		},
2015 		INTERNAL,
2016 		{ },
2017 		{ { 0, 4294967295U } },
2018 	},
2019 	{
2020 		"ALU64_MOV_X: dst = 2",
2021 		.u.insns_int = {
2022 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2023 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2024 			BPF_EXIT_INSN(),
2025 		},
2026 		INTERNAL,
2027 		{ },
2028 		{ { 0, 2 } },
2029 	},
2030 	{
2031 		"ALU64_MOV_X: dst = 4294967295",
2032 		.u.insns_int = {
2033 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2034 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2035 			BPF_EXIT_INSN(),
2036 		},
2037 		INTERNAL,
2038 		{ },
2039 		{ { 0, 4294967295U } },
2040 	},
2041 	/* BPF_ALU | BPF_MOV | BPF_K */
2042 	{
2043 		"ALU_MOV_K: dst = 2",
2044 		.u.insns_int = {
2045 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
2046 			BPF_EXIT_INSN(),
2047 		},
2048 		INTERNAL,
2049 		{ },
2050 		{ { 0, 2 } },
2051 	},
2052 	{
2053 		"ALU_MOV_K: dst = 4294967295",
2054 		.u.insns_int = {
2055 			BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2056 			BPF_EXIT_INSN(),
2057 		},
2058 		INTERNAL,
2059 		{ },
2060 		{ { 0, 4294967295U } },
2061 	},
2062 	{
2063 		"ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2064 		.u.insns_int = {
2065 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2066 			BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2067 			BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2068 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2069 			BPF_MOV32_IMM(R0, 2),
2070 			BPF_EXIT_INSN(),
2071 			BPF_MOV32_IMM(R0, 1),
2072 			BPF_EXIT_INSN(),
2073 		},
2074 		INTERNAL,
2075 		{ },
2076 		{ { 0, 0x1 } },
2077 	},
2078 	{
2079 		"ALU64_MOV_K: dst = 2",
2080 		.u.insns_int = {
2081 			BPF_ALU64_IMM(BPF_MOV, R0, 2),
2082 			BPF_EXIT_INSN(),
2083 		},
2084 		INTERNAL,
2085 		{ },
2086 		{ { 0, 2 } },
2087 	},
2088 	{
2089 		"ALU64_MOV_K: dst = 2147483647",
2090 		.u.insns_int = {
2091 			BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2092 			BPF_EXIT_INSN(),
2093 		},
2094 		INTERNAL,
2095 		{ },
2096 		{ { 0, 2147483647 } },
2097 	},
2098 	{
2099 		"ALU64_OR_K: dst = 0x0",
2100 		.u.insns_int = {
2101 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2102 			BPF_LD_IMM64(R3, 0x0),
2103 			BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
2104 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2105 			BPF_MOV32_IMM(R0, 2),
2106 			BPF_EXIT_INSN(),
2107 			BPF_MOV32_IMM(R0, 1),
2108 			BPF_EXIT_INSN(),
2109 		},
2110 		INTERNAL,
2111 		{ },
2112 		{ { 0, 0x1 } },
2113 	},
2114 	{
2115 		"ALU64_MOV_K: dst = -1",
2116 		.u.insns_int = {
2117 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2118 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2119 			BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2120 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2121 			BPF_MOV32_IMM(R0, 2),
2122 			BPF_EXIT_INSN(),
2123 			BPF_MOV32_IMM(R0, 1),
2124 			BPF_EXIT_INSN(),
2125 		},
2126 		INTERNAL,
2127 		{ },
2128 		{ { 0, 0x1 } },
2129 	},
2130 	/* BPF_ALU | BPF_ADD | BPF_X */
2131 	{
2132 		"ALU_ADD_X: 1 + 2 = 3",
2133 		.u.insns_int = {
2134 			BPF_LD_IMM64(R0, 1),
2135 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2136 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2137 			BPF_EXIT_INSN(),
2138 		},
2139 		INTERNAL,
2140 		{ },
2141 		{ { 0, 3 } },
2142 	},
2143 	{
2144 		"ALU_ADD_X: 1 + 4294967294 = 4294967295",
2145 		.u.insns_int = {
2146 			BPF_LD_IMM64(R0, 1),
2147 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2148 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2149 			BPF_EXIT_INSN(),
2150 		},
2151 		INTERNAL,
2152 		{ },
2153 		{ { 0, 4294967295U } },
2154 	},
2155 	{
2156 		"ALU64_ADD_X: 1 + 2 = 3",
2157 		.u.insns_int = {
2158 			BPF_LD_IMM64(R0, 1),
2159 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2160 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2161 			BPF_EXIT_INSN(),
2162 		},
2163 		INTERNAL,
2164 		{ },
2165 		{ { 0, 3 } },
2166 	},
2167 	{
2168 		"ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2169 		.u.insns_int = {
2170 			BPF_LD_IMM64(R0, 1),
2171 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2172 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2173 			BPF_EXIT_INSN(),
2174 		},
2175 		INTERNAL,
2176 		{ },
2177 		{ { 0, 4294967295U } },
2178 	},
2179 	/* BPF_ALU | BPF_ADD | BPF_K */
2180 	{
2181 		"ALU_ADD_K: 1 + 2 = 3",
2182 		.u.insns_int = {
2183 			BPF_LD_IMM64(R0, 1),
2184 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2185 			BPF_EXIT_INSN(),
2186 		},
2187 		INTERNAL,
2188 		{ },
2189 		{ { 0, 3 } },
2190 	},
2191 	{
2192 		"ALU_ADD_K: 3 + 0 = 3",
2193 		.u.insns_int = {
2194 			BPF_LD_IMM64(R0, 3),
2195 			BPF_ALU32_IMM(BPF_ADD, R0, 0),
2196 			BPF_EXIT_INSN(),
2197 		},
2198 		INTERNAL,
2199 		{ },
2200 		{ { 0, 3 } },
2201 	},
2202 	{
2203 		"ALU_ADD_K: 1 + 4294967294 = 4294967295",
2204 		.u.insns_int = {
2205 			BPF_LD_IMM64(R0, 1),
2206 			BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2207 			BPF_EXIT_INSN(),
2208 		},
2209 		INTERNAL,
2210 		{ },
2211 		{ { 0, 4294967295U } },
2212 	},
2213 	{
2214 		"ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2215 		.u.insns_int = {
2216 			BPF_LD_IMM64(R2, 0x0),
2217 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
2218 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2219 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2220 			BPF_MOV32_IMM(R0, 2),
2221 			BPF_EXIT_INSN(),
2222 			BPF_MOV32_IMM(R0, 1),
2223 			BPF_EXIT_INSN(),
2224 		},
2225 		INTERNAL,
2226 		{ },
2227 		{ { 0, 0x1 } },
2228 	},
2229 	{
2230 		"ALU64_ADD_K: 1 + 2 = 3",
2231 		.u.insns_int = {
2232 			BPF_LD_IMM64(R0, 1),
2233 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2234 			BPF_EXIT_INSN(),
2235 		},
2236 		INTERNAL,
2237 		{ },
2238 		{ { 0, 3 } },
2239 	},
2240 	{
2241 		"ALU64_ADD_K: 3 + 0 = 3",
2242 		.u.insns_int = {
2243 			BPF_LD_IMM64(R0, 3),
2244 			BPF_ALU64_IMM(BPF_ADD, R0, 0),
2245 			BPF_EXIT_INSN(),
2246 		},
2247 		INTERNAL,
2248 		{ },
2249 		{ { 0, 3 } },
2250 	},
2251 	{
2252 		"ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2253 		.u.insns_int = {
2254 			BPF_LD_IMM64(R0, 1),
2255 			BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2256 			BPF_EXIT_INSN(),
2257 		},
2258 		INTERNAL,
2259 		{ },
2260 		{ { 0, 2147483647 } },
2261 	},
2262 	{
2263 		"ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2264 		.u.insns_int = {
2265 			BPF_LD_IMM64(R0, 2147483646),
2266 			BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2267 			BPF_EXIT_INSN(),
2268 		},
2269 		INTERNAL,
2270 		{ },
2271 		{ { 0, -1 } },
2272 	},
2273 	{
2274 		"ALU64_ADD_K: 1 + 0 = 1",
2275 		.u.insns_int = {
2276 			BPF_LD_IMM64(R2, 0x1),
2277 			BPF_LD_IMM64(R3, 0x1),
2278 			BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2279 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2280 			BPF_MOV32_IMM(R0, 2),
2281 			BPF_EXIT_INSN(),
2282 			BPF_MOV32_IMM(R0, 1),
2283 			BPF_EXIT_INSN(),
2284 		},
2285 		INTERNAL,
2286 		{ },
2287 		{ { 0, 0x1 } },
2288 	},
2289 	{
2290 		"ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2291 		.u.insns_int = {
2292 			BPF_LD_IMM64(R2, 0x0),
2293 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2294 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2295 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2296 			BPF_MOV32_IMM(R0, 2),
2297 			BPF_EXIT_INSN(),
2298 			BPF_MOV32_IMM(R0, 1),
2299 			BPF_EXIT_INSN(),
2300 		},
2301 		INTERNAL,
2302 		{ },
2303 		{ { 0, 0x1 } },
2304 	},
2305 	/* BPF_ALU | BPF_SUB | BPF_X */
2306 	{
2307 		"ALU_SUB_X: 3 - 1 = 2",
2308 		.u.insns_int = {
2309 			BPF_LD_IMM64(R0, 3),
2310 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2311 			BPF_ALU32_REG(BPF_SUB, R0, R1),
2312 			BPF_EXIT_INSN(),
2313 		},
2314 		INTERNAL,
2315 		{ },
2316 		{ { 0, 2 } },
2317 	},
2318 	{
2319 		"ALU_SUB_X: 4294967295 - 4294967294 = 1",
2320 		.u.insns_int = {
2321 			BPF_LD_IMM64(R0, 4294967295U),
2322 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2323 			BPF_ALU32_REG(BPF_SUB, R0, R1),
2324 			BPF_EXIT_INSN(),
2325 		},
2326 		INTERNAL,
2327 		{ },
2328 		{ { 0, 1 } },
2329 	},
2330 	{
2331 		"ALU64_SUB_X: 3 - 1 = 2",
2332 		.u.insns_int = {
2333 			BPF_LD_IMM64(R0, 3),
2334 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2335 			BPF_ALU64_REG(BPF_SUB, R0, R1),
2336 			BPF_EXIT_INSN(),
2337 		},
2338 		INTERNAL,
2339 		{ },
2340 		{ { 0, 2 } },
2341 	},
2342 	{
2343 		"ALU64_SUB_X: 4294967295 - 4294967294 = 1",
2344 		.u.insns_int = {
2345 			BPF_LD_IMM64(R0, 4294967295U),
2346 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2347 			BPF_ALU64_REG(BPF_SUB, R0, R1),
2348 			BPF_EXIT_INSN(),
2349 		},
2350 		INTERNAL,
2351 		{ },
2352 		{ { 0, 1 } },
2353 	},
2354 	/* BPF_ALU | BPF_SUB | BPF_K */
2355 	{
2356 		"ALU_SUB_K: 3 - 1 = 2",
2357 		.u.insns_int = {
2358 			BPF_LD_IMM64(R0, 3),
2359 			BPF_ALU32_IMM(BPF_SUB, R0, 1),
2360 			BPF_EXIT_INSN(),
2361 		},
2362 		INTERNAL,
2363 		{ },
2364 		{ { 0, 2 } },
2365 	},
2366 	{
2367 		"ALU_SUB_K: 3 - 0 = 3",
2368 		.u.insns_int = {
2369 			BPF_LD_IMM64(R0, 3),
2370 			BPF_ALU32_IMM(BPF_SUB, R0, 0),
2371 			BPF_EXIT_INSN(),
2372 		},
2373 		INTERNAL,
2374 		{ },
2375 		{ { 0, 3 } },
2376 	},
2377 	{
2378 		"ALU_SUB_K: 4294967295 - 4294967294 = 1",
2379 		.u.insns_int = {
2380 			BPF_LD_IMM64(R0, 4294967295U),
2381 			BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
2382 			BPF_EXIT_INSN(),
2383 		},
2384 		INTERNAL,
2385 		{ },
2386 		{ { 0, 1 } },
2387 	},
2388 	{
2389 		"ALU64_SUB_K: 3 - 1 = 2",
2390 		.u.insns_int = {
2391 			BPF_LD_IMM64(R0, 3),
2392 			BPF_ALU64_IMM(BPF_SUB, R0, 1),
2393 			BPF_EXIT_INSN(),
2394 		},
2395 		INTERNAL,
2396 		{ },
2397 		{ { 0, 2 } },
2398 	},
2399 	{
2400 		"ALU64_SUB_K: 3 - 0 = 3",
2401 		.u.insns_int = {
2402 			BPF_LD_IMM64(R0, 3),
2403 			BPF_ALU64_IMM(BPF_SUB, R0, 0),
2404 			BPF_EXIT_INSN(),
2405 		},
2406 		INTERNAL,
2407 		{ },
2408 		{ { 0, 3 } },
2409 	},
2410 	{
2411 		"ALU64_SUB_K: 4294967294 - 4294967295 = -1",
2412 		.u.insns_int = {
2413 			BPF_LD_IMM64(R0, 4294967294U),
2414 			BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
2415 			BPF_EXIT_INSN(),
2416 		},
2417 		INTERNAL,
2418 		{ },
2419 		{ { 0, -1 } },
2420 	},
2421 	{
2422 		"ALU64_ADD_K: 2147483646 - 2147483647 = -1",
2423 		.u.insns_int = {
2424 			BPF_LD_IMM64(R0, 2147483646),
2425 			BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
2426 			BPF_EXIT_INSN(),
2427 		},
2428 		INTERNAL,
2429 		{ },
2430 		{ { 0, -1 } },
2431 	},
2432 	/* BPF_ALU | BPF_MUL | BPF_X */
2433 	{
2434 		"ALU_MUL_X: 2 * 3 = 6",
2435 		.u.insns_int = {
2436 			BPF_LD_IMM64(R0, 2),
2437 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
2438 			BPF_ALU32_REG(BPF_MUL, R0, R1),
2439 			BPF_EXIT_INSN(),
2440 		},
2441 		INTERNAL,
2442 		{ },
2443 		{ { 0, 6 } },
2444 	},
2445 	{
2446 		"ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2447 		.u.insns_int = {
2448 			BPF_LD_IMM64(R0, 2),
2449 			BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
2450 			BPF_ALU32_REG(BPF_MUL, R0, R1),
2451 			BPF_EXIT_INSN(),
2452 		},
2453 		INTERNAL,
2454 		{ },
2455 		{ { 0, 0xFFFFFFF0 } },
2456 	},
2457 	{
2458 		"ALU_MUL_X: -1 * -1 = 1",
2459 		.u.insns_int = {
2460 			BPF_LD_IMM64(R0, -1),
2461 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
2462 			BPF_ALU32_REG(BPF_MUL, R0, R1),
2463 			BPF_EXIT_INSN(),
2464 		},
2465 		INTERNAL,
2466 		{ },
2467 		{ { 0, 1 } },
2468 	},
2469 	{
2470 		"ALU64_MUL_X: 2 * 3 = 6",
2471 		.u.insns_int = {
2472 			BPF_LD_IMM64(R0, 2),
2473 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
2474 			BPF_ALU64_REG(BPF_MUL, R0, R1),
2475 			BPF_EXIT_INSN(),
2476 		},
2477 		INTERNAL,
2478 		{ },
2479 		{ { 0, 6 } },
2480 	},
2481 	{
2482 		"ALU64_MUL_X: 1 * 2147483647 = 2147483647",
2483 		.u.insns_int = {
2484 			BPF_LD_IMM64(R0, 1),
2485 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2486 			BPF_ALU64_REG(BPF_MUL, R0, R1),
2487 			BPF_EXIT_INSN(),
2488 		},
2489 		INTERNAL,
2490 		{ },
2491 		{ { 0, 2147483647 } },
2492 	},
2493 	/* BPF_ALU | BPF_MUL | BPF_K */
2494 	{
2495 		"ALU_MUL_K: 2 * 3 = 6",
2496 		.u.insns_int = {
2497 			BPF_LD_IMM64(R0, 2),
2498 			BPF_ALU32_IMM(BPF_MUL, R0, 3),
2499 			BPF_EXIT_INSN(),
2500 		},
2501 		INTERNAL,
2502 		{ },
2503 		{ { 0, 6 } },
2504 	},
2505 	{
2506 		"ALU_MUL_K: 3 * 1 = 3",
2507 		.u.insns_int = {
2508 			BPF_LD_IMM64(R0, 3),
2509 			BPF_ALU32_IMM(BPF_MUL, R0, 1),
2510 			BPF_EXIT_INSN(),
2511 		},
2512 		INTERNAL,
2513 		{ },
2514 		{ { 0, 3 } },
2515 	},
2516 	{
2517 		"ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2518 		.u.insns_int = {
2519 			BPF_LD_IMM64(R0, 2),
2520 			BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
2521 			BPF_EXIT_INSN(),
2522 		},
2523 		INTERNAL,
2524 		{ },
2525 		{ { 0, 0xFFFFFFF0 } },
2526 	},
2527 	{
2528 		"ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
2529 		.u.insns_int = {
2530 			BPF_LD_IMM64(R2, 0x1),
2531 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
2532 			BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
2533 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2534 			BPF_MOV32_IMM(R0, 2),
2535 			BPF_EXIT_INSN(),
2536 			BPF_MOV32_IMM(R0, 1),
2537 			BPF_EXIT_INSN(),
2538 		},
2539 		INTERNAL,
2540 		{ },
2541 		{ { 0, 0x1 } },
2542 	},
2543 	{
2544 		"ALU64_MUL_K: 2 * 3 = 6",
2545 		.u.insns_int = {
2546 			BPF_LD_IMM64(R0, 2),
2547 			BPF_ALU64_IMM(BPF_MUL, R0, 3),
2548 			BPF_EXIT_INSN(),
2549 		},
2550 		INTERNAL,
2551 		{ },
2552 		{ { 0, 6 } },
2553 	},
2554 	{
2555 		"ALU64_MUL_K: 3 * 1 = 3",
2556 		.u.insns_int = {
2557 			BPF_LD_IMM64(R0, 3),
2558 			BPF_ALU64_IMM(BPF_MUL, R0, 1),
2559 			BPF_EXIT_INSN(),
2560 		},
2561 		INTERNAL,
2562 		{ },
2563 		{ { 0, 3 } },
2564 	},
2565 	{
2566 		"ALU64_MUL_K: 1 * 2147483647 = 2147483647",
2567 		.u.insns_int = {
2568 			BPF_LD_IMM64(R0, 1),
2569 			BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
2570 			BPF_EXIT_INSN(),
2571 		},
2572 		INTERNAL,
2573 		{ },
2574 		{ { 0, 2147483647 } },
2575 	},
2576 	{
2577 		"ALU64_MUL_K: 1 * -2147483647 = -2147483647",
2578 		.u.insns_int = {
2579 			BPF_LD_IMM64(R0, 1),
2580 			BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
2581 			BPF_EXIT_INSN(),
2582 		},
2583 		INTERNAL,
2584 		{ },
2585 		{ { 0, -2147483647 } },
2586 	},
2587 	{
2588 		"ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
2589 		.u.insns_int = {
2590 			BPF_LD_IMM64(R2, 0x1),
2591 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2592 			BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
2593 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2594 			BPF_MOV32_IMM(R0, 2),
2595 			BPF_EXIT_INSN(),
2596 			BPF_MOV32_IMM(R0, 1),
2597 			BPF_EXIT_INSN(),
2598 		},
2599 		INTERNAL,
2600 		{ },
2601 		{ { 0, 0x1 } },
2602 	},
2603 	/* BPF_ALU | BPF_DIV | BPF_X */
2604 	{
2605 		"ALU_DIV_X: 6 / 2 = 3",
2606 		.u.insns_int = {
2607 			BPF_LD_IMM64(R0, 6),
2608 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2609 			BPF_ALU32_REG(BPF_DIV, R0, R1),
2610 			BPF_EXIT_INSN(),
2611 		},
2612 		INTERNAL,
2613 		{ },
2614 		{ { 0, 3 } },
2615 	},
2616 	{
2617 		"ALU_DIV_X: 4294967295 / 4294967295 = 1",
2618 		.u.insns_int = {
2619 			BPF_LD_IMM64(R0, 4294967295U),
2620 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2621 			BPF_ALU32_REG(BPF_DIV, R0, R1),
2622 			BPF_EXIT_INSN(),
2623 		},
2624 		INTERNAL,
2625 		{ },
2626 		{ { 0, 1 } },
2627 	},
2628 	{
2629 		"ALU64_DIV_X: 6 / 2 = 3",
2630 		.u.insns_int = {
2631 			BPF_LD_IMM64(R0, 6),
2632 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2633 			BPF_ALU64_REG(BPF_DIV, R0, R1),
2634 			BPF_EXIT_INSN(),
2635 		},
2636 		INTERNAL,
2637 		{ },
2638 		{ { 0, 3 } },
2639 	},
2640 	{
2641 		"ALU64_DIV_X: 2147483647 / 2147483647 = 1",
2642 		.u.insns_int = {
2643 			BPF_LD_IMM64(R0, 2147483647),
2644 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2645 			BPF_ALU64_REG(BPF_DIV, R0, R1),
2646 			BPF_EXIT_INSN(),
2647 		},
2648 		INTERNAL,
2649 		{ },
2650 		{ { 0, 1 } },
2651 	},
2652 	{
2653 		"ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
2654 		.u.insns_int = {
2655 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2656 			BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
2657 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
2658 			BPF_ALU64_REG(BPF_DIV, R2, R4),
2659 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2660 			BPF_MOV32_IMM(R0, 2),
2661 			BPF_EXIT_INSN(),
2662 			BPF_MOV32_IMM(R0, 1),
2663 			BPF_EXIT_INSN(),
2664 		},
2665 		INTERNAL,
2666 		{ },
2667 		{ { 0, 0x1 } },
2668 	},
2669 	/* BPF_ALU | BPF_DIV | BPF_K */
2670 	{
2671 		"ALU_DIV_K: 6 / 2 = 3",
2672 		.u.insns_int = {
2673 			BPF_LD_IMM64(R0, 6),
2674 			BPF_ALU32_IMM(BPF_DIV, R0, 2),
2675 			BPF_EXIT_INSN(),
2676 		},
2677 		INTERNAL,
2678 		{ },
2679 		{ { 0, 3 } },
2680 	},
2681 	{
2682 		"ALU_DIV_K: 3 / 1 = 3",
2683 		.u.insns_int = {
2684 			BPF_LD_IMM64(R0, 3),
2685 			BPF_ALU32_IMM(BPF_DIV, R0, 1),
2686 			BPF_EXIT_INSN(),
2687 		},
2688 		INTERNAL,
2689 		{ },
2690 		{ { 0, 3 } },
2691 	},
2692 	{
2693 		"ALU_DIV_K: 4294967295 / 4294967295 = 1",
2694 		.u.insns_int = {
2695 			BPF_LD_IMM64(R0, 4294967295U),
2696 			BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
2697 			BPF_EXIT_INSN(),
2698 		},
2699 		INTERNAL,
2700 		{ },
2701 		{ { 0, 1 } },
2702 	},
2703 	{
2704 		"ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
2705 		.u.insns_int = {
2706 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2707 			BPF_LD_IMM64(R3, 0x1UL),
2708 			BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
2709 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2710 			BPF_MOV32_IMM(R0, 2),
2711 			BPF_EXIT_INSN(),
2712 			BPF_MOV32_IMM(R0, 1),
2713 			BPF_EXIT_INSN(),
2714 		},
2715 		INTERNAL,
2716 		{ },
2717 		{ { 0, 0x1 } },
2718 	},
2719 	{
2720 		"ALU64_DIV_K: 6 / 2 = 3",
2721 		.u.insns_int = {
2722 			BPF_LD_IMM64(R0, 6),
2723 			BPF_ALU64_IMM(BPF_DIV, R0, 2),
2724 			BPF_EXIT_INSN(),
2725 		},
2726 		INTERNAL,
2727 		{ },
2728 		{ { 0, 3 } },
2729 	},
2730 	{
2731 		"ALU64_DIV_K: 3 / 1 = 3",
2732 		.u.insns_int = {
2733 			BPF_LD_IMM64(R0, 3),
2734 			BPF_ALU64_IMM(BPF_DIV, R0, 1),
2735 			BPF_EXIT_INSN(),
2736 		},
2737 		INTERNAL,
2738 		{ },
2739 		{ { 0, 3 } },
2740 	},
2741 	{
2742 		"ALU64_DIV_K: 2147483647 / 2147483647 = 1",
2743 		.u.insns_int = {
2744 			BPF_LD_IMM64(R0, 2147483647),
2745 			BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
2746 			BPF_EXIT_INSN(),
2747 		},
2748 		INTERNAL,
2749 		{ },
2750 		{ { 0, 1 } },
2751 	},
2752 	{
2753 		"ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
2754 		.u.insns_int = {
2755 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2756 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
2757 			BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
2758 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2759 			BPF_MOV32_IMM(R0, 2),
2760 			BPF_EXIT_INSN(),
2761 			BPF_MOV32_IMM(R0, 1),
2762 			BPF_EXIT_INSN(),
2763 		},
2764 		INTERNAL,
2765 		{ },
2766 		{ { 0, 0x1 } },
2767 	},
2768 	/* BPF_ALU | BPF_MOD | BPF_X */
2769 	{
2770 		"ALU_MOD_X: 3 % 2 = 1",
2771 		.u.insns_int = {
2772 			BPF_LD_IMM64(R0, 3),
2773 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2774 			BPF_ALU32_REG(BPF_MOD, R0, R1),
2775 			BPF_EXIT_INSN(),
2776 		},
2777 		INTERNAL,
2778 		{ },
2779 		{ { 0, 1 } },
2780 	},
2781 	{
2782 		"ALU_MOD_X: 4294967295 % 4294967293 = 2",
2783 		.u.insns_int = {
2784 			BPF_LD_IMM64(R0, 4294967295U),
2785 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
2786 			BPF_ALU32_REG(BPF_MOD, R0, R1),
2787 			BPF_EXIT_INSN(),
2788 		},
2789 		INTERNAL,
2790 		{ },
2791 		{ { 0, 2 } },
2792 	},
2793 	{
2794 		"ALU64_MOD_X: 3 % 2 = 1",
2795 		.u.insns_int = {
2796 			BPF_LD_IMM64(R0, 3),
2797 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2798 			BPF_ALU64_REG(BPF_MOD, R0, R1),
2799 			BPF_EXIT_INSN(),
2800 		},
2801 		INTERNAL,
2802 		{ },
2803 		{ { 0, 1 } },
2804 	},
2805 	{
2806 		"ALU64_MOD_X: 2147483647 % 2147483645 = 2",
2807 		.u.insns_int = {
2808 			BPF_LD_IMM64(R0, 2147483647),
2809 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
2810 			BPF_ALU64_REG(BPF_MOD, R0, R1),
2811 			BPF_EXIT_INSN(),
2812 		},
2813 		INTERNAL,
2814 		{ },
2815 		{ { 0, 2 } },
2816 	},
2817 	/* BPF_ALU | BPF_MOD | BPF_K */
2818 	{
2819 		"ALU_MOD_K: 3 % 2 = 1",
2820 		.u.insns_int = {
2821 			BPF_LD_IMM64(R0, 3),
2822 			BPF_ALU32_IMM(BPF_MOD, R0, 2),
2823 			BPF_EXIT_INSN(),
2824 		},
2825 		INTERNAL,
2826 		{ },
2827 		{ { 0, 1 } },
2828 	},
2829 	{
2830 		"ALU_MOD_K: 3 % 1 = 0",
2831 		.u.insns_int = {
2832 			BPF_LD_IMM64(R0, 3),
2833 			BPF_ALU32_IMM(BPF_MOD, R0, 1),
2834 			BPF_EXIT_INSN(),
2835 		},
2836 		INTERNAL,
2837 		{ },
2838 		{ { 0, 0 } },
2839 	},
2840 	{
2841 		"ALU_MOD_K: 4294967295 % 4294967293 = 2",
2842 		.u.insns_int = {
2843 			BPF_LD_IMM64(R0, 4294967295U),
2844 			BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
2845 			BPF_EXIT_INSN(),
2846 		},
2847 		INTERNAL,
2848 		{ },
2849 		{ { 0, 2 } },
2850 	},
2851 	{
2852 		"ALU64_MOD_K: 3 % 2 = 1",
2853 		.u.insns_int = {
2854 			BPF_LD_IMM64(R0, 3),
2855 			BPF_ALU64_IMM(BPF_MOD, R0, 2),
2856 			BPF_EXIT_INSN(),
2857 		},
2858 		INTERNAL,
2859 		{ },
2860 		{ { 0, 1 } },
2861 	},
2862 	{
2863 		"ALU64_MOD_K: 3 % 1 = 0",
2864 		.u.insns_int = {
2865 			BPF_LD_IMM64(R0, 3),
2866 			BPF_ALU64_IMM(BPF_MOD, R0, 1),
2867 			BPF_EXIT_INSN(),
2868 		},
2869 		INTERNAL,
2870 		{ },
2871 		{ { 0, 0 } },
2872 	},
2873 	{
2874 		"ALU64_MOD_K: 2147483647 % 2147483645 = 2",
2875 		.u.insns_int = {
2876 			BPF_LD_IMM64(R0, 2147483647),
2877 			BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
2878 			BPF_EXIT_INSN(),
2879 		},
2880 		INTERNAL,
2881 		{ },
2882 		{ { 0, 2 } },
2883 	},
2884 	/* BPF_ALU | BPF_AND | BPF_X */
2885 	{
2886 		"ALU_AND_X: 3 & 2 = 2",
2887 		.u.insns_int = {
2888 			BPF_LD_IMM64(R0, 3),
2889 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2890 			BPF_ALU32_REG(BPF_AND, R0, R1),
2891 			BPF_EXIT_INSN(),
2892 		},
2893 		INTERNAL,
2894 		{ },
2895 		{ { 0, 2 } },
2896 	},
2897 	{
2898 		"ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
2899 		.u.insns_int = {
2900 			BPF_LD_IMM64(R0, 0xffffffff),
2901 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
2902 			BPF_ALU32_REG(BPF_AND, R0, R1),
2903 			BPF_EXIT_INSN(),
2904 		},
2905 		INTERNAL,
2906 		{ },
2907 		{ { 0, 0xffffffff } },
2908 	},
2909 	{
2910 		"ALU64_AND_X: 3 & 2 = 2",
2911 		.u.insns_int = {
2912 			BPF_LD_IMM64(R0, 3),
2913 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2914 			BPF_ALU64_REG(BPF_AND, R0, R1),
2915 			BPF_EXIT_INSN(),
2916 		},
2917 		INTERNAL,
2918 		{ },
2919 		{ { 0, 2 } },
2920 	},
2921 	{
2922 		"ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
2923 		.u.insns_int = {
2924 			BPF_LD_IMM64(R0, 0xffffffff),
2925 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
2926 			BPF_ALU64_REG(BPF_AND, R0, R1),
2927 			BPF_EXIT_INSN(),
2928 		},
2929 		INTERNAL,
2930 		{ },
2931 		{ { 0, 0xffffffff } },
2932 	},
2933 	/* BPF_ALU | BPF_AND | BPF_K */
2934 	{
2935 		"ALU_AND_K: 3 & 2 = 2",
2936 		.u.insns_int = {
2937 			BPF_LD_IMM64(R0, 3),
2938 			BPF_ALU32_IMM(BPF_AND, R0, 2),
2939 			BPF_EXIT_INSN(),
2940 		},
2941 		INTERNAL,
2942 		{ },
2943 		{ { 0, 2 } },
2944 	},
2945 	{
2946 		"ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
2947 		.u.insns_int = {
2948 			BPF_LD_IMM64(R0, 0xffffffff),
2949 			BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
2950 			BPF_EXIT_INSN(),
2951 		},
2952 		INTERNAL,
2953 		{ },
2954 		{ { 0, 0xffffffff } },
2955 	},
2956 	{
2957 		"ALU64_AND_K: 3 & 2 = 2",
2958 		.u.insns_int = {
2959 			BPF_LD_IMM64(R0, 3),
2960 			BPF_ALU64_IMM(BPF_AND, R0, 2),
2961 			BPF_EXIT_INSN(),
2962 		},
2963 		INTERNAL,
2964 		{ },
2965 		{ { 0, 2 } },
2966 	},
2967 	{
2968 		"ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
2969 		.u.insns_int = {
2970 			BPF_LD_IMM64(R0, 0xffffffff),
2971 			BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
2972 			BPF_EXIT_INSN(),
2973 		},
2974 		INTERNAL,
2975 		{ },
2976 		{ { 0, 0xffffffff } },
2977 	},
2978 	{
2979 		"ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000ffff00000000",
2980 		.u.insns_int = {
2981 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2982 			BPF_LD_IMM64(R3, 0x0000000000000000LL),
2983 			BPF_ALU64_IMM(BPF_AND, R2, 0x0),
2984 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2985 			BPF_MOV32_IMM(R0, 2),
2986 			BPF_EXIT_INSN(),
2987 			BPF_MOV32_IMM(R0, 1),
2988 			BPF_EXIT_INSN(),
2989 		},
2990 		INTERNAL,
2991 		{ },
2992 		{ { 0, 0x1 } },
2993 	},
2994 	{
2995 		"ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffffffff",
2996 		.u.insns_int = {
2997 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2998 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
2999 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3000 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3001 			BPF_MOV32_IMM(R0, 2),
3002 			BPF_EXIT_INSN(),
3003 			BPF_MOV32_IMM(R0, 1),
3004 			BPF_EXIT_INSN(),
3005 		},
3006 		INTERNAL,
3007 		{ },
3008 		{ { 0, 0x1 } },
3009 	},
3010 	{
3011 		"ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3012 		.u.insns_int = {
3013 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3014 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3015 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3016 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3017 			BPF_MOV32_IMM(R0, 2),
3018 			BPF_EXIT_INSN(),
3019 			BPF_MOV32_IMM(R0, 1),
3020 			BPF_EXIT_INSN(),
3021 		},
3022 		INTERNAL,
3023 		{ },
3024 		{ { 0, 0x1 } },
3025 	},
3026 	/* BPF_ALU | BPF_OR | BPF_X */
3027 	{
3028 		"ALU_OR_X: 1 | 2 = 3",
3029 		.u.insns_int = {
3030 			BPF_LD_IMM64(R0, 1),
3031 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3032 			BPF_ALU32_REG(BPF_OR, R0, R1),
3033 			BPF_EXIT_INSN(),
3034 		},
3035 		INTERNAL,
3036 		{ },
3037 		{ { 0, 3 } },
3038 	},
3039 	{
3040 		"ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3041 		.u.insns_int = {
3042 			BPF_LD_IMM64(R0, 0),
3043 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3044 			BPF_ALU32_REG(BPF_OR, R0, R1),
3045 			BPF_EXIT_INSN(),
3046 		},
3047 		INTERNAL,
3048 		{ },
3049 		{ { 0, 0xffffffff } },
3050 	},
3051 	{
3052 		"ALU64_OR_X: 1 | 2 = 3",
3053 		.u.insns_int = {
3054 			BPF_LD_IMM64(R0, 1),
3055 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3056 			BPF_ALU64_REG(BPF_OR, R0, R1),
3057 			BPF_EXIT_INSN(),
3058 		},
3059 		INTERNAL,
3060 		{ },
3061 		{ { 0, 3 } },
3062 	},
3063 	{
3064 		"ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3065 		.u.insns_int = {
3066 			BPF_LD_IMM64(R0, 0),
3067 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3068 			BPF_ALU64_REG(BPF_OR, R0, R1),
3069 			BPF_EXIT_INSN(),
3070 		},
3071 		INTERNAL,
3072 		{ },
3073 		{ { 0, 0xffffffff } },
3074 	},
3075 	/* BPF_ALU | BPF_OR | BPF_K */
3076 	{
3077 		"ALU_OR_K: 1 | 2 = 3",
3078 		.u.insns_int = {
3079 			BPF_LD_IMM64(R0, 1),
3080 			BPF_ALU32_IMM(BPF_OR, R0, 2),
3081 			BPF_EXIT_INSN(),
3082 		},
3083 		INTERNAL,
3084 		{ },
3085 		{ { 0, 3 } },
3086 	},
3087 	{
3088 		"ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3089 		.u.insns_int = {
3090 			BPF_LD_IMM64(R0, 0),
3091 			BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3092 			BPF_EXIT_INSN(),
3093 		},
3094 		INTERNAL,
3095 		{ },
3096 		{ { 0, 0xffffffff } },
3097 	},
3098 	{
3099 		"ALU64_OR_K: 1 | 2 = 3",
3100 		.u.insns_int = {
3101 			BPF_LD_IMM64(R0, 1),
3102 			BPF_ALU64_IMM(BPF_OR, R0, 2),
3103 			BPF_EXIT_INSN(),
3104 		},
3105 		INTERNAL,
3106 		{ },
3107 		{ { 0, 3 } },
3108 	},
3109 	{
3110 		"ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
3111 		.u.insns_int = {
3112 			BPF_LD_IMM64(R0, 0),
3113 			BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
3114 			BPF_EXIT_INSN(),
3115 		},
3116 		INTERNAL,
3117 		{ },
3118 		{ { 0, 0xffffffff } },
3119 	},
3120 	{
3121 		"ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffff00000000",
3122 		.u.insns_int = {
3123 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3124 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3125 			BPF_ALU64_IMM(BPF_OR, R2, 0x0),
3126 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3127 			BPF_MOV32_IMM(R0, 2),
3128 			BPF_EXIT_INSN(),
3129 			BPF_MOV32_IMM(R0, 1),
3130 			BPF_EXIT_INSN(),
3131 		},
3132 		INTERNAL,
3133 		{ },
3134 		{ { 0, 0x1 } },
3135 	},
3136 	{
3137 		"ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
3138 		.u.insns_int = {
3139 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3140 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3141 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3142 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3143 			BPF_MOV32_IMM(R0, 2),
3144 			BPF_EXIT_INSN(),
3145 			BPF_MOV32_IMM(R0, 1),
3146 			BPF_EXIT_INSN(),
3147 		},
3148 		INTERNAL,
3149 		{ },
3150 		{ { 0, 0x1 } },
3151 	},
3152 	{
3153 		"ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
3154 		.u.insns_int = {
3155 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3156 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3157 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3158 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3159 			BPF_MOV32_IMM(R0, 2),
3160 			BPF_EXIT_INSN(),
3161 			BPF_MOV32_IMM(R0, 1),
3162 			BPF_EXIT_INSN(),
3163 		},
3164 		INTERNAL,
3165 		{ },
3166 		{ { 0, 0x1 } },
3167 	},
3168 	/* BPF_ALU | BPF_XOR | BPF_X */
3169 	{
3170 		"ALU_XOR_X: 5 ^ 6 = 3",
3171 		.u.insns_int = {
3172 			BPF_LD_IMM64(R0, 5),
3173 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3174 			BPF_ALU32_REG(BPF_XOR, R0, R1),
3175 			BPF_EXIT_INSN(),
3176 		},
3177 		INTERNAL,
3178 		{ },
3179 		{ { 0, 3 } },
3180 	},
3181 	{
3182 		"ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
3183 		.u.insns_int = {
3184 			BPF_LD_IMM64(R0, 1),
3185 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3186 			BPF_ALU32_REG(BPF_XOR, R0, R1),
3187 			BPF_EXIT_INSN(),
3188 		},
3189 		INTERNAL,
3190 		{ },
3191 		{ { 0, 0xfffffffe } },
3192 	},
3193 	{
3194 		"ALU64_XOR_X: 5 ^ 6 = 3",
3195 		.u.insns_int = {
3196 			BPF_LD_IMM64(R0, 5),
3197 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3198 			BPF_ALU64_REG(BPF_XOR, R0, R1),
3199 			BPF_EXIT_INSN(),
3200 		},
3201 		INTERNAL,
3202 		{ },
3203 		{ { 0, 3 } },
3204 	},
3205 	{
3206 		"ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
3207 		.u.insns_int = {
3208 			BPF_LD_IMM64(R0, 1),
3209 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3210 			BPF_ALU64_REG(BPF_XOR, R0, R1),
3211 			BPF_EXIT_INSN(),
3212 		},
3213 		INTERNAL,
3214 		{ },
3215 		{ { 0, 0xfffffffe } },
3216 	},
3217 	/* BPF_ALU | BPF_XOR | BPF_K */
3218 	{
3219 		"ALU_XOR_K: 5 ^ 6 = 3",
3220 		.u.insns_int = {
3221 			BPF_LD_IMM64(R0, 5),
3222 			BPF_ALU32_IMM(BPF_XOR, R0, 6),
3223 			BPF_EXIT_INSN(),
3224 		},
3225 		INTERNAL,
3226 		{ },
3227 		{ { 0, 3 } },
3228 	},
3229 	{
3230 		"ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
3231 		.u.insns_int = {
3232 			BPF_LD_IMM64(R0, 1),
3233 			BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
3234 			BPF_EXIT_INSN(),
3235 		},
3236 		INTERNAL,
3237 		{ },
3238 		{ { 0, 0xfffffffe } },
3239 	},
3240 	{
3241 		"ALU64_XOR_K: 5 ^ 6 = 3",
3242 		.u.insns_int = {
3243 			BPF_LD_IMM64(R0, 5),
3244 			BPF_ALU64_IMM(BPF_XOR, R0, 6),
3245 			BPF_EXIT_INSN(),
3246 		},
3247 		INTERNAL,
3248 		{ },
3249 		{ { 0, 3 } },
3250 	},
3251 	{
3252 		"ALU64_XOR_K: 1 & 0xffffffff = 0xfffffffe",
3253 		.u.insns_int = {
3254 			BPF_LD_IMM64(R0, 1),
3255 			BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
3256 			BPF_EXIT_INSN(),
3257 		},
3258 		INTERNAL,
3259 		{ },
3260 		{ { 0, 0xfffffffe } },
3261 	},
3262 	{
3263 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
3264 		.u.insns_int = {
3265 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3266 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3267 			BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
3268 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3269 			BPF_MOV32_IMM(R0, 2),
3270 			BPF_EXIT_INSN(),
3271 			BPF_MOV32_IMM(R0, 1),
3272 			BPF_EXIT_INSN(),
3273 		},
3274 		INTERNAL,
3275 		{ },
3276 		{ { 0, 0x1 } },
3277 	},
3278 	{
3279 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
3280 		.u.insns_int = {
3281 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3282 			BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
3283 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3284 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3285 			BPF_MOV32_IMM(R0, 2),
3286 			BPF_EXIT_INSN(),
3287 			BPF_MOV32_IMM(R0, 1),
3288 			BPF_EXIT_INSN(),
3289 		},
3290 		INTERNAL,
3291 		{ },
3292 		{ { 0, 0x1 } },
3293 	},
3294 	{
3295 		"ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
3296 		.u.insns_int = {
3297 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3298 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3299 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3300 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3301 			BPF_MOV32_IMM(R0, 2),
3302 			BPF_EXIT_INSN(),
3303 			BPF_MOV32_IMM(R0, 1),
3304 			BPF_EXIT_INSN(),
3305 		},
3306 		INTERNAL,
3307 		{ },
3308 		{ { 0, 0x1 } },
3309 	},
3310 	/* BPF_ALU | BPF_LSH | BPF_X */
3311 	{
3312 		"ALU_LSH_X: 1 << 1 = 2",
3313 		.u.insns_int = {
3314 			BPF_LD_IMM64(R0, 1),
3315 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3316 			BPF_ALU32_REG(BPF_LSH, R0, R1),
3317 			BPF_EXIT_INSN(),
3318 		},
3319 		INTERNAL,
3320 		{ },
3321 		{ { 0, 2 } },
3322 	},
3323 	{
3324 		"ALU_LSH_X: 1 << 31 = 0x80000000",
3325 		.u.insns_int = {
3326 			BPF_LD_IMM64(R0, 1),
3327 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3328 			BPF_ALU32_REG(BPF_LSH, R0, R1),
3329 			BPF_EXIT_INSN(),
3330 		},
3331 		INTERNAL,
3332 		{ },
3333 		{ { 0, 0x80000000 } },
3334 	},
3335 	{
3336 		"ALU64_LSH_X: 1 << 1 = 2",
3337 		.u.insns_int = {
3338 			BPF_LD_IMM64(R0, 1),
3339 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3340 			BPF_ALU64_REG(BPF_LSH, R0, R1),
3341 			BPF_EXIT_INSN(),
3342 		},
3343 		INTERNAL,
3344 		{ },
3345 		{ { 0, 2 } },
3346 	},
3347 	{
3348 		"ALU64_LSH_X: 1 << 31 = 0x80000000",
3349 		.u.insns_int = {
3350 			BPF_LD_IMM64(R0, 1),
3351 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3352 			BPF_ALU64_REG(BPF_LSH, R0, R1),
3353 			BPF_EXIT_INSN(),
3354 		},
3355 		INTERNAL,
3356 		{ },
3357 		{ { 0, 0x80000000 } },
3358 	},
3359 	/* BPF_ALU | BPF_LSH | BPF_K */
3360 	{
3361 		"ALU_LSH_K: 1 << 1 = 2",
3362 		.u.insns_int = {
3363 			BPF_LD_IMM64(R0, 1),
3364 			BPF_ALU32_IMM(BPF_LSH, R0, 1),
3365 			BPF_EXIT_INSN(),
3366 		},
3367 		INTERNAL,
3368 		{ },
3369 		{ { 0, 2 } },
3370 	},
3371 	{
3372 		"ALU_LSH_K: 1 << 31 = 0x80000000",
3373 		.u.insns_int = {
3374 			BPF_LD_IMM64(R0, 1),
3375 			BPF_ALU32_IMM(BPF_LSH, R0, 31),
3376 			BPF_EXIT_INSN(),
3377 		},
3378 		INTERNAL,
3379 		{ },
3380 		{ { 0, 0x80000000 } },
3381 	},
3382 	{
3383 		"ALU64_LSH_K: 1 << 1 = 2",
3384 		.u.insns_int = {
3385 			BPF_LD_IMM64(R0, 1),
3386 			BPF_ALU64_IMM(BPF_LSH, R0, 1),
3387 			BPF_EXIT_INSN(),
3388 		},
3389 		INTERNAL,
3390 		{ },
3391 		{ { 0, 2 } },
3392 	},
3393 	{
3394 		"ALU64_LSH_K: 1 << 31 = 0x80000000",
3395 		.u.insns_int = {
3396 			BPF_LD_IMM64(R0, 1),
3397 			BPF_ALU64_IMM(BPF_LSH, R0, 31),
3398 			BPF_EXIT_INSN(),
3399 		},
3400 		INTERNAL,
3401 		{ },
3402 		{ { 0, 0x80000000 } },
3403 	},
3404 	/* BPF_ALU | BPF_RSH | BPF_X */
3405 	{
3406 		"ALU_RSH_X: 2 >> 1 = 1",
3407 		.u.insns_int = {
3408 			BPF_LD_IMM64(R0, 2),
3409 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3410 			BPF_ALU32_REG(BPF_RSH, R0, R1),
3411 			BPF_EXIT_INSN(),
3412 		},
3413 		INTERNAL,
3414 		{ },
3415 		{ { 0, 1 } },
3416 	},
3417 	{
3418 		"ALU_RSH_X: 0x80000000 >> 31 = 1",
3419 		.u.insns_int = {
3420 			BPF_LD_IMM64(R0, 0x80000000),
3421 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3422 			BPF_ALU32_REG(BPF_RSH, R0, R1),
3423 			BPF_EXIT_INSN(),
3424 		},
3425 		INTERNAL,
3426 		{ },
3427 		{ { 0, 1 } },
3428 	},
3429 	{
3430 		"ALU64_RSH_X: 2 >> 1 = 1",
3431 		.u.insns_int = {
3432 			BPF_LD_IMM64(R0, 2),
3433 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3434 			BPF_ALU64_REG(BPF_RSH, R0, R1),
3435 			BPF_EXIT_INSN(),
3436 		},
3437 		INTERNAL,
3438 		{ },
3439 		{ { 0, 1 } },
3440 	},
3441 	{
3442 		"ALU64_RSH_X: 0x80000000 >> 31 = 1",
3443 		.u.insns_int = {
3444 			BPF_LD_IMM64(R0, 0x80000000),
3445 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3446 			BPF_ALU64_REG(BPF_RSH, R0, R1),
3447 			BPF_EXIT_INSN(),
3448 		},
3449 		INTERNAL,
3450 		{ },
3451 		{ { 0, 1 } },
3452 	},
3453 	/* BPF_ALU | BPF_RSH | BPF_K */
3454 	{
3455 		"ALU_RSH_K: 2 >> 1 = 1",
3456 		.u.insns_int = {
3457 			BPF_LD_IMM64(R0, 2),
3458 			BPF_ALU32_IMM(BPF_RSH, R0, 1),
3459 			BPF_EXIT_INSN(),
3460 		},
3461 		INTERNAL,
3462 		{ },
3463 		{ { 0, 1 } },
3464 	},
3465 	{
3466 		"ALU_RSH_K: 0x80000000 >> 31 = 1",
3467 		.u.insns_int = {
3468 			BPF_LD_IMM64(R0, 0x80000000),
3469 			BPF_ALU32_IMM(BPF_RSH, R0, 31),
3470 			BPF_EXIT_INSN(),
3471 		},
3472 		INTERNAL,
3473 		{ },
3474 		{ { 0, 1 } },
3475 	},
3476 	{
3477 		"ALU64_RSH_K: 2 >> 1 = 1",
3478 		.u.insns_int = {
3479 			BPF_LD_IMM64(R0, 2),
3480 			BPF_ALU64_IMM(BPF_RSH, R0, 1),
3481 			BPF_EXIT_INSN(),
3482 		},
3483 		INTERNAL,
3484 		{ },
3485 		{ { 0, 1 } },
3486 	},
3487 	{
3488 		"ALU64_RSH_K: 0x80000000 >> 31 = 1",
3489 		.u.insns_int = {
3490 			BPF_LD_IMM64(R0, 0x80000000),
3491 			BPF_ALU64_IMM(BPF_RSH, R0, 31),
3492 			BPF_EXIT_INSN(),
3493 		},
3494 		INTERNAL,
3495 		{ },
3496 		{ { 0, 1 } },
3497 	},
3498 	/* BPF_ALU | BPF_ARSH | BPF_X */
3499 	{
3500 		"ALU_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3501 		.u.insns_int = {
3502 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3503 			BPF_ALU32_IMM(BPF_MOV, R1, 40),
3504 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
3505 			BPF_EXIT_INSN(),
3506 		},
3507 		INTERNAL,
3508 		{ },
3509 		{ { 0, 0xffff00ff } },
3510 	},
3511 	/* BPF_ALU | BPF_ARSH | BPF_K */
3512 	{
3513 		"ALU_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3514 		.u.insns_int = {
3515 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3516 			BPF_ALU64_IMM(BPF_ARSH, R0, 40),
3517 			BPF_EXIT_INSN(),
3518 		},
3519 		INTERNAL,
3520 		{ },
3521 		{ { 0, 0xffff00ff } },
3522 	},
3523 	/* BPF_ALU | BPF_NEG */
3524 	{
3525 		"ALU_NEG: -(3) = -3",
3526 		.u.insns_int = {
3527 			BPF_ALU32_IMM(BPF_MOV, R0, 3),
3528 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
3529 			BPF_EXIT_INSN(),
3530 		},
3531 		INTERNAL,
3532 		{ },
3533 		{ { 0, -3 } },
3534 	},
3535 	{
3536 		"ALU_NEG: -(-3) = 3",
3537 		.u.insns_int = {
3538 			BPF_ALU32_IMM(BPF_MOV, R0, -3),
3539 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
3540 			BPF_EXIT_INSN(),
3541 		},
3542 		INTERNAL,
3543 		{ },
3544 		{ { 0, 3 } },
3545 	},
3546 	{
3547 		"ALU64_NEG: -(3) = -3",
3548 		.u.insns_int = {
3549 			BPF_LD_IMM64(R0, 3),
3550 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
3551 			BPF_EXIT_INSN(),
3552 		},
3553 		INTERNAL,
3554 		{ },
3555 		{ { 0, -3 } },
3556 	},
3557 	{
3558 		"ALU64_NEG: -(-3) = 3",
3559 		.u.insns_int = {
3560 			BPF_LD_IMM64(R0, -3),
3561 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
3562 			BPF_EXIT_INSN(),
3563 		},
3564 		INTERNAL,
3565 		{ },
3566 		{ { 0, 3 } },
3567 	},
3568 	/* BPF_ALU | BPF_END | BPF_FROM_BE */
3569 	{
3570 		"ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
3571 		.u.insns_int = {
3572 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3573 			BPF_ENDIAN(BPF_FROM_BE, R0, 16),
3574 			BPF_EXIT_INSN(),
3575 		},
3576 		INTERNAL,
3577 		{ },
3578 		{ { 0,  cpu_to_be16(0xcdef) } },
3579 	},
3580 	{
3581 		"ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
3582 		.u.insns_int = {
3583 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3584 			BPF_ENDIAN(BPF_FROM_BE, R0, 32),
3585 			BPF_EXIT_INSN(),
3586 		},
3587 		INTERNAL,
3588 		{ },
3589 		{ { 0, cpu_to_be32(0x89abcdef) } },
3590 	},
3591 	{
3592 		"ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
3593 		.u.insns_int = {
3594 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3595 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
3596 			BPF_EXIT_INSN(),
3597 		},
3598 		INTERNAL,
3599 		{ },
3600 		{ { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
3601 	},
3602 	/* BPF_ALU | BPF_END | BPF_FROM_LE */
3603 	{
3604 		"ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
3605 		.u.insns_int = {
3606 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3607 			BPF_ENDIAN(BPF_FROM_LE, R0, 16),
3608 			BPF_EXIT_INSN(),
3609 		},
3610 		INTERNAL,
3611 		{ },
3612 		{ { 0, cpu_to_le16(0xcdef) } },
3613 	},
3614 	{
3615 		"ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
3616 		.u.insns_int = {
3617 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3618 			BPF_ENDIAN(BPF_FROM_LE, R0, 32),
3619 			BPF_EXIT_INSN(),
3620 		},
3621 		INTERNAL,
3622 		{ },
3623 		{ { 0, cpu_to_le32(0x89abcdef) } },
3624 	},
3625 	{
3626 		"ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
3627 		.u.insns_int = {
3628 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3629 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
3630 			BPF_EXIT_INSN(),
3631 		},
3632 		INTERNAL,
3633 		{ },
3634 		{ { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
3635 	},
3636 	/* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
3637 	{
3638 		"ST_MEM_B: Store/Load byte: max negative",
3639 		.u.insns_int = {
3640 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3641 			BPF_ST_MEM(BPF_B, R10, -40, 0xff),
3642 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
3643 			BPF_EXIT_INSN(),
3644 		},
3645 		INTERNAL,
3646 		{ },
3647 		{ { 0, 0xff } },
3648 	},
3649 	{
3650 		"ST_MEM_B: Store/Load byte: max positive",
3651 		.u.insns_int = {
3652 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3653 			BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
3654 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
3655 			BPF_EXIT_INSN(),
3656 		},
3657 		INTERNAL,
3658 		{ },
3659 		{ { 0, 0x7f } },
3660 	},
3661 	{
3662 		"STX_MEM_B: Store/Load byte: max negative",
3663 		.u.insns_int = {
3664 			BPF_LD_IMM64(R0, 0),
3665 			BPF_LD_IMM64(R1, 0xffLL),
3666 			BPF_STX_MEM(BPF_B, R10, R1, -40),
3667 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
3668 			BPF_EXIT_INSN(),
3669 		},
3670 		INTERNAL,
3671 		{ },
3672 		{ { 0, 0xff } },
3673 	},
3674 	{
3675 		"ST_MEM_H: Store/Load half word: max negative",
3676 		.u.insns_int = {
3677 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3678 			BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
3679 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
3680 			BPF_EXIT_INSN(),
3681 		},
3682 		INTERNAL,
3683 		{ },
3684 		{ { 0, 0xffff } },
3685 	},
3686 	{
3687 		"ST_MEM_H: Store/Load half word: max positive",
3688 		.u.insns_int = {
3689 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3690 			BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
3691 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
3692 			BPF_EXIT_INSN(),
3693 		},
3694 		INTERNAL,
3695 		{ },
3696 		{ { 0, 0x7fff } },
3697 	},
3698 	{
3699 		"STX_MEM_H: Store/Load half word: max negative",
3700 		.u.insns_int = {
3701 			BPF_LD_IMM64(R0, 0),
3702 			BPF_LD_IMM64(R1, 0xffffLL),
3703 			BPF_STX_MEM(BPF_H, R10, R1, -40),
3704 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
3705 			BPF_EXIT_INSN(),
3706 		},
3707 		INTERNAL,
3708 		{ },
3709 		{ { 0, 0xffff } },
3710 	},
3711 	{
3712 		"ST_MEM_W: Store/Load word: max negative",
3713 		.u.insns_int = {
3714 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3715 			BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
3716 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
3717 			BPF_EXIT_INSN(),
3718 		},
3719 		INTERNAL,
3720 		{ },
3721 		{ { 0, 0xffffffff } },
3722 	},
3723 	{
3724 		"ST_MEM_W: Store/Load word: max positive",
3725 		.u.insns_int = {
3726 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3727 			BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
3728 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
3729 			BPF_EXIT_INSN(),
3730 		},
3731 		INTERNAL,
3732 		{ },
3733 		{ { 0, 0x7fffffff } },
3734 	},
3735 	{
3736 		"STX_MEM_W: Store/Load word: max negative",
3737 		.u.insns_int = {
3738 			BPF_LD_IMM64(R0, 0),
3739 			BPF_LD_IMM64(R1, 0xffffffffLL),
3740 			BPF_STX_MEM(BPF_W, R10, R1, -40),
3741 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
3742 			BPF_EXIT_INSN(),
3743 		},
3744 		INTERNAL,
3745 		{ },
3746 		{ { 0, 0xffffffff } },
3747 	},
3748 	{
3749 		"ST_MEM_DW: Store/Load double word: max negative",
3750 		.u.insns_int = {
3751 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3752 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
3753 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
3754 			BPF_EXIT_INSN(),
3755 		},
3756 		INTERNAL,
3757 		{ },
3758 		{ { 0, 0xffffffff } },
3759 	},
3760 	{
3761 		"ST_MEM_DW: Store/Load double word: max negative 2",
3762 		.u.insns_int = {
3763 			BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
3764 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3765 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
3766 			BPF_LDX_MEM(BPF_DW, R2, R10, -40),
3767 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3768 			BPF_MOV32_IMM(R0, 2),
3769 			BPF_EXIT_INSN(),
3770 			BPF_MOV32_IMM(R0, 1),
3771 			BPF_EXIT_INSN(),
3772 		},
3773 		INTERNAL,
3774 		{ },
3775 		{ { 0, 0x1 } },
3776 	},
3777 	{
3778 		"ST_MEM_DW: Store/Load double word: max positive",
3779 		.u.insns_int = {
3780 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3781 			BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
3782 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
3783 			BPF_EXIT_INSN(),
3784 		},
3785 		INTERNAL,
3786 		{ },
3787 		{ { 0, 0x7fffffff } },
3788 	},
3789 	{
3790 		"STX_MEM_DW: Store/Load double word: max negative",
3791 		.u.insns_int = {
3792 			BPF_LD_IMM64(R0, 0),
3793 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
3794 			BPF_STX_MEM(BPF_W, R10, R1, -40),
3795 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
3796 			BPF_EXIT_INSN(),
3797 		},
3798 		INTERNAL,
3799 		{ },
3800 		{ { 0, 0xffffffff } },
3801 	},
3802 	/* BPF_STX | BPF_XADD | BPF_W/DW */
3803 	{
3804 		"STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
3805 		.u.insns_int = {
3806 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
3807 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
3808 			BPF_STX_XADD(BPF_W, R10, R0, -40),
3809 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
3810 			BPF_EXIT_INSN(),
3811 		},
3812 		INTERNAL,
3813 		{ },
3814 		{ { 0, 0x22 } },
3815 	},
3816 	{
3817 		"STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
3818 		.u.insns_int = {
3819 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
3820 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
3821 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
3822 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
3823 			BPF_EXIT_INSN(),
3824 		},
3825 		INTERNAL,
3826 		{ },
3827 		{ { 0, 0x22 } },
3828 	},
3829 	/* BPF_JMP | BPF_EXIT */
3830 	{
3831 		"JMP_EXIT",
3832 		.u.insns_int = {
3833 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
3834 			BPF_EXIT_INSN(),
3835 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
3836 		},
3837 		INTERNAL,
3838 		{ },
3839 		{ { 0, 0x4711 } },
3840 	},
3841 	/* BPF_JMP | BPF_JA */
3842 	{
3843 		"JMP_JA: Unconditional jump: if (true) return 1",
3844 		.u.insns_int = {
3845 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3846 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
3847 			BPF_EXIT_INSN(),
3848 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3849 			BPF_EXIT_INSN(),
3850 		},
3851 		INTERNAL,
3852 		{ },
3853 		{ { 0, 1 } },
3854 	},
3855 	/* BPF_JMP | BPF_JSGT | BPF_K */
3856 	{
3857 		"JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
3858 		.u.insns_int = {
3859 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3860 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
3861 			BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
3862 			BPF_EXIT_INSN(),
3863 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3864 			BPF_EXIT_INSN(),
3865 		},
3866 		INTERNAL,
3867 		{ },
3868 		{ { 0, 1 } },
3869 	},
3870 	{
3871 		"JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
3872 		.u.insns_int = {
3873 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3874 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
3875 			BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
3876 			BPF_EXIT_INSN(),
3877 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3878 			BPF_EXIT_INSN(),
3879 		},
3880 		INTERNAL,
3881 		{ },
3882 		{ { 0, 1 } },
3883 	},
3884 	/* BPF_JMP | BPF_JSGE | BPF_K */
3885 	{
3886 		"JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
3887 		.u.insns_int = {
3888 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3889 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
3890 			BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
3891 			BPF_EXIT_INSN(),
3892 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3893 			BPF_EXIT_INSN(),
3894 		},
3895 		INTERNAL,
3896 		{ },
3897 		{ { 0, 1 } },
3898 	},
3899 	{
3900 		"JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
3901 		.u.insns_int = {
3902 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3903 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
3904 			BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
3905 			BPF_EXIT_INSN(),
3906 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3907 			BPF_EXIT_INSN(),
3908 		},
3909 		INTERNAL,
3910 		{ },
3911 		{ { 0, 1 } },
3912 	},
3913 	/* BPF_JMP | BPF_JGT | BPF_K */
3914 	{
3915 		"JMP_JGT_K: if (3 > 2) return 1",
3916 		.u.insns_int = {
3917 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3918 			BPF_LD_IMM64(R1, 3),
3919 			BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
3920 			BPF_EXIT_INSN(),
3921 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3922 			BPF_EXIT_INSN(),
3923 		},
3924 		INTERNAL,
3925 		{ },
3926 		{ { 0, 1 } },
3927 	},
3928 	/* BPF_JMP | BPF_JGE | BPF_K */
3929 	{
3930 		"JMP_JGE_K: if (3 >= 2) return 1",
3931 		.u.insns_int = {
3932 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3933 			BPF_LD_IMM64(R1, 3),
3934 			BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
3935 			BPF_EXIT_INSN(),
3936 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3937 			BPF_EXIT_INSN(),
3938 		},
3939 		INTERNAL,
3940 		{ },
3941 		{ { 0, 1 } },
3942 	},
3943 	{
3944 		"JMP_JGE_K: if (3 >= 3) return 1",
3945 		.u.insns_int = {
3946 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3947 			BPF_LD_IMM64(R1, 3),
3948 			BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
3949 			BPF_EXIT_INSN(),
3950 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3951 			BPF_EXIT_INSN(),
3952 		},
3953 		INTERNAL,
3954 		{ },
3955 		{ { 0, 1 } },
3956 	},
3957 	/* BPF_JMP | BPF_JNE | BPF_K */
3958 	{
3959 		"JMP_JNE_K: if (3 != 2) return 1",
3960 		.u.insns_int = {
3961 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3962 			BPF_LD_IMM64(R1, 3),
3963 			BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
3964 			BPF_EXIT_INSN(),
3965 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3966 			BPF_EXIT_INSN(),
3967 		},
3968 		INTERNAL,
3969 		{ },
3970 		{ { 0, 1 } },
3971 	},
3972 	/* BPF_JMP | BPF_JEQ | BPF_K */
3973 	{
3974 		"JMP_JEQ_K: if (3 == 3) return 1",
3975 		.u.insns_int = {
3976 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3977 			BPF_LD_IMM64(R1, 3),
3978 			BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
3979 			BPF_EXIT_INSN(),
3980 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3981 			BPF_EXIT_INSN(),
3982 		},
3983 		INTERNAL,
3984 		{ },
3985 		{ { 0, 1 } },
3986 	},
3987 	/* BPF_JMP | BPF_JSET | BPF_K */
3988 	{
3989 		"JMP_JSET_K: if (0x3 & 0x2) return 1",
3990 		.u.insns_int = {
3991 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3992 			BPF_LD_IMM64(R1, 3),
3993 			BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
3994 			BPF_EXIT_INSN(),
3995 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3996 			BPF_EXIT_INSN(),
3997 		},
3998 		INTERNAL,
3999 		{ },
4000 		{ { 0, 1 } },
4001 	},
4002 	{
4003 		"JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
4004 		.u.insns_int = {
4005 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4006 			BPF_LD_IMM64(R1, 3),
4007 			BPF_JMP_IMM(BPF_JNE, R1, 0xffffffff, 1),
4008 			BPF_EXIT_INSN(),
4009 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4010 			BPF_EXIT_INSN(),
4011 		},
4012 		INTERNAL,
4013 		{ },
4014 		{ { 0, 1 } },
4015 	},
4016 	/* BPF_JMP | BPF_JSGT | BPF_X */
4017 	{
4018 		"JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
4019 		.u.insns_int = {
4020 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4021 			BPF_LD_IMM64(R1, -1),
4022 			BPF_LD_IMM64(R2, -2),
4023 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4024 			BPF_EXIT_INSN(),
4025 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4026 			BPF_EXIT_INSN(),
4027 		},
4028 		INTERNAL,
4029 		{ },
4030 		{ { 0, 1 } },
4031 	},
4032 	{
4033 		"JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
4034 		.u.insns_int = {
4035 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4036 			BPF_LD_IMM64(R1, -1),
4037 			BPF_LD_IMM64(R2, -1),
4038 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4039 			BPF_EXIT_INSN(),
4040 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4041 			BPF_EXIT_INSN(),
4042 		},
4043 		INTERNAL,
4044 		{ },
4045 		{ { 0, 1 } },
4046 	},
4047 	/* BPF_JMP | BPF_JSGE | BPF_X */
4048 	{
4049 		"JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
4050 		.u.insns_int = {
4051 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4052 			BPF_LD_IMM64(R1, -1),
4053 			BPF_LD_IMM64(R2, -2),
4054 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4055 			BPF_EXIT_INSN(),
4056 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4057 			BPF_EXIT_INSN(),
4058 		},
4059 		INTERNAL,
4060 		{ },
4061 		{ { 0, 1 } },
4062 	},
4063 	{
4064 		"JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
4065 		.u.insns_int = {
4066 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4067 			BPF_LD_IMM64(R1, -1),
4068 			BPF_LD_IMM64(R2, -1),
4069 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4070 			BPF_EXIT_INSN(),
4071 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4072 			BPF_EXIT_INSN(),
4073 		},
4074 		INTERNAL,
4075 		{ },
4076 		{ { 0, 1 } },
4077 	},
4078 	/* BPF_JMP | BPF_JGT | BPF_X */
4079 	{
4080 		"JMP_JGT_X: if (3 > 2) return 1",
4081 		.u.insns_int = {
4082 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4083 			BPF_LD_IMM64(R1, 3),
4084 			BPF_LD_IMM64(R2, 2),
4085 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
4086 			BPF_EXIT_INSN(),
4087 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4088 			BPF_EXIT_INSN(),
4089 		},
4090 		INTERNAL,
4091 		{ },
4092 		{ { 0, 1 } },
4093 	},
4094 	/* BPF_JMP | BPF_JGE | BPF_X */
4095 	{
4096 		"JMP_JGE_X: if (3 >= 2) return 1",
4097 		.u.insns_int = {
4098 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4099 			BPF_LD_IMM64(R1, 3),
4100 			BPF_LD_IMM64(R2, 2),
4101 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
4102 			BPF_EXIT_INSN(),
4103 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4104 			BPF_EXIT_INSN(),
4105 		},
4106 		INTERNAL,
4107 		{ },
4108 		{ { 0, 1 } },
4109 	},
4110 	{
4111 		"JMP_JGE_X: if (3 >= 3) return 1",
4112 		.u.insns_int = {
4113 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4114 			BPF_LD_IMM64(R1, 3),
4115 			BPF_LD_IMM64(R2, 3),
4116 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
4117 			BPF_EXIT_INSN(),
4118 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4119 			BPF_EXIT_INSN(),
4120 		},
4121 		INTERNAL,
4122 		{ },
4123 		{ { 0, 1 } },
4124 	},
4125 	/* BPF_JMP | BPF_JNE | BPF_X */
4126 	{
4127 		"JMP_JNE_X: if (3 != 2) return 1",
4128 		.u.insns_int = {
4129 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4130 			BPF_LD_IMM64(R1, 3),
4131 			BPF_LD_IMM64(R2, 2),
4132 			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4133 			BPF_EXIT_INSN(),
4134 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4135 			BPF_EXIT_INSN(),
4136 		},
4137 		INTERNAL,
4138 		{ },
4139 		{ { 0, 1 } },
4140 	},
4141 	/* BPF_JMP | BPF_JEQ | BPF_X */
4142 	{
4143 		"JMP_JEQ_X: if (3 == 3) return 1",
4144 		.u.insns_int = {
4145 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4146 			BPF_LD_IMM64(R1, 3),
4147 			BPF_LD_IMM64(R2, 3),
4148 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
4149 			BPF_EXIT_INSN(),
4150 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4151 			BPF_EXIT_INSN(),
4152 		},
4153 		INTERNAL,
4154 		{ },
4155 		{ { 0, 1 } },
4156 	},
4157 	/* BPF_JMP | BPF_JSET | BPF_X */
4158 	{
4159 		"JMP_JSET_X: if (0x3 & 0x2) return 1",
4160 		.u.insns_int = {
4161 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4162 			BPF_LD_IMM64(R1, 3),
4163 			BPF_LD_IMM64(R2, 2),
4164 			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4165 			BPF_EXIT_INSN(),
4166 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4167 			BPF_EXIT_INSN(),
4168 		},
4169 		INTERNAL,
4170 		{ },
4171 		{ { 0, 1 } },
4172 	},
4173 	{
4174 		"JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
4175 		.u.insns_int = {
4176 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4177 			BPF_LD_IMM64(R1, 3),
4178 			BPF_LD_IMM64(R2, 0xffffffff),
4179 			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4180 			BPF_EXIT_INSN(),
4181 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4182 			BPF_EXIT_INSN(),
4183 		},
4184 		INTERNAL,
4185 		{ },
4186 		{ { 0, 1 } },
4187 	},
4188 	{	/* Mainly checking JIT here. */
4189 		"BPF_MAXINSNS: Maximum possible literals",
4190 		{ },
4191 		CLASSIC | FLAG_NO_DATA,
4192 		{ },
4193 		{ { 0, 0xffffffff } },
4194 		.fill_helper = bpf_fill_maxinsns1,
4195 	},
4196 	{	/* Mainly checking JIT here. */
4197 		"BPF_MAXINSNS: Single literal",
4198 		{ },
4199 		CLASSIC | FLAG_NO_DATA,
4200 		{ },
4201 		{ { 0, 0xfefefefe } },
4202 		.fill_helper = bpf_fill_maxinsns2,
4203 	},
4204 	{	/* Mainly checking JIT here. */
4205 		"BPF_MAXINSNS: Run/add until end",
4206 		{ },
4207 		CLASSIC | FLAG_NO_DATA,
4208 		{ },
4209 		{ { 0, 0x947bf368 } },
4210 		.fill_helper = bpf_fill_maxinsns3,
4211 	},
4212 	{
4213 		"BPF_MAXINSNS: Too many instructions",
4214 		{ },
4215 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4216 		{ },
4217 		{ },
4218 		.fill_helper = bpf_fill_maxinsns4,
4219 	},
4220 	{	/* Mainly checking JIT here. */
4221 		"BPF_MAXINSNS: Very long jump",
4222 		{ },
4223 		CLASSIC | FLAG_NO_DATA,
4224 		{ },
4225 		{ { 0, 0xabababab } },
4226 		.fill_helper = bpf_fill_maxinsns5,
4227 	},
4228 	{	/* Mainly checking JIT here. */
4229 		"BPF_MAXINSNS: Ctx heavy transformations",
4230 		{ },
4231 		CLASSIC,
4232 		{ },
4233 		{
4234 			{  1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
4235 			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
4236 		},
4237 		.fill_helper = bpf_fill_maxinsns6,
4238 	},
4239 	{	/* Mainly checking JIT here. */
4240 		"BPF_MAXINSNS: Call heavy transformations",
4241 		{ },
4242 		CLASSIC | FLAG_NO_DATA,
4243 		{ },
4244 		{ { 1, 0 }, { 10, 0 } },
4245 		.fill_helper = bpf_fill_maxinsns7,
4246 	},
4247 	{	/* Mainly checking JIT here. */
4248 		"BPF_MAXINSNS: Jump heavy test",
4249 		{ },
4250 		CLASSIC | FLAG_NO_DATA,
4251 		{ },
4252 		{ { 0, 0xffffffff } },
4253 		.fill_helper = bpf_fill_maxinsns8,
4254 	},
4255 };
4256 
4257 static struct net_device dev;
4258 
4259 static struct sk_buff *populate_skb(char *buf, int size)
4260 {
4261 	struct sk_buff *skb;
4262 
4263 	if (size >= MAX_DATA)
4264 		return NULL;
4265 
4266 	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
4267 	if (!skb)
4268 		return NULL;
4269 
4270 	memcpy(__skb_put(skb, size), buf, size);
4271 
4272 	/* Initialize a fake skb with test pattern. */
4273 	skb_reset_mac_header(skb);
4274 	skb->protocol = htons(ETH_P_IP);
4275 	skb->pkt_type = SKB_TYPE;
4276 	skb->mark = SKB_MARK;
4277 	skb->hash = SKB_HASH;
4278 	skb->queue_mapping = SKB_QUEUE_MAP;
4279 	skb->vlan_tci = SKB_VLAN_TCI;
4280 	skb->dev = &dev;
4281 	skb->dev->ifindex = SKB_DEV_IFINDEX;
4282 	skb->dev->type = SKB_DEV_TYPE;
4283 	skb_set_network_header(skb, min(size, ETH_HLEN));
4284 
4285 	return skb;
4286 }
4287 
4288 static void *generate_test_data(struct bpf_test *test, int sub)
4289 {
4290 	if (test->aux & FLAG_NO_DATA)
4291 		return NULL;
4292 
4293 	/* Test case expects an skb, so populate one. Various
4294 	 * subtests generate skbs of different sizes based on
4295 	 * the same data.
4296 	 */
4297 	return populate_skb(test->data, test->test[sub].data_size);
4298 }
4299 
4300 static void release_test_data(const struct bpf_test *test, void *data)
4301 {
4302 	if (test->aux & FLAG_NO_DATA)
4303 		return;
4304 
4305 	kfree_skb(data);
4306 }
4307 
4308 static int filter_length(int which)
4309 {
4310 	struct sock_filter *fp;
4311 	int len;
4312 
4313 	if (tests[which].fill_helper)
4314 		return tests[which].u.ptr.len;
4315 
4316 	fp = tests[which].u.insns;
4317 	for (len = MAX_INSNS - 1; len > 0; --len)
4318 		if (fp[len].code != 0 || fp[len].k != 0)
4319 			break;
4320 
4321 	return len + 1;
4322 }
4323 
4324 static void *filter_pointer(int which)
4325 {
4326 	if (tests[which].fill_helper)
4327 		return tests[which].u.ptr.insns;
4328 	else
4329 		return tests[which].u.insns;
4330 }
4331 
4332 static struct bpf_prog *generate_filter(int which, int *err)
4333 {
4334 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
4335 	unsigned int flen = filter_length(which);
4336 	void *fptr = filter_pointer(which);
4337 	struct sock_fprog_kern fprog;
4338 	struct bpf_prog *fp;
4339 
4340 	switch (test_type) {
4341 	case CLASSIC:
4342 		fprog.filter = fptr;
4343 		fprog.len = flen;
4344 
4345 		*err = bpf_prog_create(&fp, &fprog);
4346 		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
4347 			if (*err == -EINVAL) {
4348 				pr_cont("PASS\n");
4349 				/* Verifier rejected filter as expected. */
4350 				*err = 0;
4351 				return NULL;
4352 			} else {
4353 				pr_cont("UNEXPECTED_PASS\n");
4354 				/* Verifier didn't reject the test that's
4355 				 * bad enough, just return!
4356 				 */
4357 				*err = -EINVAL;
4358 				return NULL;
4359 			}
4360 		}
4361 		/* We don't expect to fail. */
4362 		if (*err) {
4363 			pr_cont("FAIL to attach err=%d len=%d\n",
4364 				*err, fprog.len);
4365 			return NULL;
4366 		}
4367 		break;
4368 
4369 	case INTERNAL:
4370 		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
4371 		if (fp == NULL) {
4372 			pr_cont("UNEXPECTED_FAIL no memory left\n");
4373 			*err = -ENOMEM;
4374 			return NULL;
4375 		}
4376 
4377 		fp->len = flen;
4378 		memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
4379 
4380 		bpf_prog_select_runtime(fp);
4381 		break;
4382 	}
4383 
4384 	*err = 0;
4385 	return fp;
4386 }
4387 
4388 static void release_filter(struct bpf_prog *fp, int which)
4389 {
4390 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
4391 
4392 	switch (test_type) {
4393 	case CLASSIC:
4394 		bpf_prog_destroy(fp);
4395 		break;
4396 	case INTERNAL:
4397 		bpf_prog_free(fp);
4398 		break;
4399 	}
4400 }
4401 
4402 static int __run_one(const struct bpf_prog *fp, const void *data,
4403 		     int runs, u64 *duration)
4404 {
4405 	u64 start, finish;
4406 	int ret = 0, i;
4407 
4408 	start = ktime_to_us(ktime_get());
4409 
4410 	for (i = 0; i < runs; i++)
4411 		ret = BPF_PROG_RUN(fp, data);
4412 
4413 	finish = ktime_to_us(ktime_get());
4414 
4415 	*duration = (finish - start) * 1000ULL;
4416 	do_div(*duration, runs);
4417 
4418 	return ret;
4419 }
4420 
4421 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
4422 {
4423 	int err_cnt = 0, i, runs = MAX_TESTRUNS;
4424 
4425 	for (i = 0; i < MAX_SUBTESTS; i++) {
4426 		void *data;
4427 		u64 duration;
4428 		u32 ret;
4429 
4430 		if (test->test[i].data_size == 0 &&
4431 		    test->test[i].result == 0)
4432 			break;
4433 
4434 		data = generate_test_data(test, i);
4435 		ret = __run_one(fp, data, runs, &duration);
4436 		release_test_data(test, data);
4437 
4438 		if (ret == test->test[i].result) {
4439 			pr_cont("%lld ", duration);
4440 		} else {
4441 			pr_cont("ret %d != %d ", ret,
4442 				test->test[i].result);
4443 			err_cnt++;
4444 		}
4445 	}
4446 
4447 	return err_cnt;
4448 }
4449 
4450 static __init int prepare_bpf_tests(void)
4451 {
4452 	int i;
4453 
4454 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
4455 		if (tests[i].fill_helper &&
4456 		    tests[i].fill_helper(&tests[i]) < 0)
4457 			return -ENOMEM;
4458 	}
4459 
4460 	return 0;
4461 }
4462 
4463 static __init void destroy_bpf_tests(void)
4464 {
4465 	int i;
4466 
4467 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
4468 		if (tests[i].fill_helper)
4469 			kfree(tests[i].u.ptr.insns);
4470 	}
4471 }
4472 
4473 static __init int test_bpf(void)
4474 {
4475 	int i, err_cnt = 0, pass_cnt = 0;
4476 	int jit_cnt = 0, run_cnt = 0;
4477 
4478 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
4479 		struct bpf_prog *fp;
4480 		int err;
4481 
4482 		pr_info("#%d %s ", i, tests[i].descr);
4483 
4484 		fp = generate_filter(i, &err);
4485 		if (fp == NULL) {
4486 			if (err == 0) {
4487 				pass_cnt++;
4488 				continue;
4489 			}
4490 
4491 			return err;
4492 		}
4493 
4494 		pr_cont("jited:%u ", fp->jited);
4495 
4496 		run_cnt++;
4497 		if (fp->jited)
4498 			jit_cnt++;
4499 
4500 		err = run_one(fp, &tests[i]);
4501 		release_filter(fp, i);
4502 
4503 		if (err) {
4504 			pr_cont("FAIL (%d times)\n", err);
4505 			err_cnt++;
4506 		} else {
4507 			pr_cont("PASS\n");
4508 			pass_cnt++;
4509 		}
4510 	}
4511 
4512 	pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
4513 		pass_cnt, err_cnt, jit_cnt, run_cnt);
4514 
4515 	return err_cnt ? -EINVAL : 0;
4516 }
4517 
4518 static int __init test_bpf_init(void)
4519 {
4520 	int ret;
4521 
4522 	ret = prepare_bpf_tests();
4523 	if (ret < 0)
4524 		return ret;
4525 
4526 	ret = test_bpf();
4527 
4528 	destroy_bpf_tests();
4529 	return ret;
4530 }
4531 
4532 static void __exit test_bpf_exit(void)
4533 {
4534 }
4535 
4536 module_init(test_bpf_init);
4537 module_exit(test_bpf_exit);
4538 
4539 MODULE_LICENSE("GPL");
4540