xref: /openbmc/linux/lib/test_bpf.c (revision 89b63462)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Testsuite for BPF interpreter and BPF JIT compiler
4  *
5  * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
6  */
7 
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9 
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/filter.h>
13 #include <linux/bpf.h>
14 #include <linux/skbuff.h>
15 #include <linux/netdevice.h>
16 #include <linux/if_vlan.h>
17 #include <linux/random.h>
18 #include <linux/highmem.h>
19 #include <linux/sched.h>
20 
21 /* General test specific settings */
22 #define MAX_SUBTESTS	3
23 #define MAX_TESTRUNS	1000
24 #define MAX_DATA	128
25 #define MAX_INSNS	512
26 #define MAX_K		0xffffFFFF
27 
28 /* Few constants used to init test 'skb' */
29 #define SKB_TYPE	3
30 #define SKB_MARK	0x1234aaaa
31 #define SKB_HASH	0x1234aaab
32 #define SKB_QUEUE_MAP	123
33 #define SKB_VLAN_TCI	0xffff
34 #define SKB_VLAN_PRESENT	1
35 #define SKB_DEV_IFINDEX	577
36 #define SKB_DEV_TYPE	588
37 
38 /* Redefine REGs to make tests less verbose */
39 #define R0		BPF_REG_0
40 #define R1		BPF_REG_1
41 #define R2		BPF_REG_2
42 #define R3		BPF_REG_3
43 #define R4		BPF_REG_4
44 #define R5		BPF_REG_5
45 #define R6		BPF_REG_6
46 #define R7		BPF_REG_7
47 #define R8		BPF_REG_8
48 #define R9		BPF_REG_9
49 #define R10		BPF_REG_10
50 
51 /* Flags that can be passed to test cases */
52 #define FLAG_NO_DATA		BIT(0)
53 #define FLAG_EXPECTED_FAIL	BIT(1)
54 #define FLAG_SKB_FRAG		BIT(2)
55 #define FLAG_VERIFIER_ZEXT	BIT(3)
56 
57 enum {
58 	CLASSIC  = BIT(6),	/* Old BPF instructions only. */
59 	INTERNAL = BIT(7),	/* Extended instruction set.  */
60 };
61 
62 #define TEST_TYPE_MASK		(CLASSIC | INTERNAL)
63 
64 struct bpf_test {
65 	const char *descr;
66 	union {
67 		struct sock_filter insns[MAX_INSNS];
68 		struct bpf_insn insns_int[MAX_INSNS];
69 		struct {
70 			void *insns;
71 			unsigned int len;
72 		} ptr;
73 	} u;
74 	__u8 aux;
75 	__u8 data[MAX_DATA];
76 	struct {
77 		int data_size;
78 		__u32 result;
79 	} test[MAX_SUBTESTS];
80 	int (*fill_helper)(struct bpf_test *self);
81 	int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
82 	__u8 frag_data[MAX_DATA];
83 	int stack_depth; /* for eBPF only, since tests don't call verifier */
84 	int nr_testruns; /* Custom run count, defaults to MAX_TESTRUNS if 0 */
85 };
86 
87 /* Large test cases need separate allocation and fill handler. */
88 
89 static int bpf_fill_maxinsns1(struct bpf_test *self)
90 {
91 	unsigned int len = BPF_MAXINSNS;
92 	struct sock_filter *insn;
93 	__u32 k = ~0;
94 	int i;
95 
96 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
97 	if (!insn)
98 		return -ENOMEM;
99 
100 	for (i = 0; i < len; i++, k--)
101 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
102 
103 	self->u.ptr.insns = insn;
104 	self->u.ptr.len = len;
105 
106 	return 0;
107 }
108 
109 static int bpf_fill_maxinsns2(struct bpf_test *self)
110 {
111 	unsigned int len = BPF_MAXINSNS;
112 	struct sock_filter *insn;
113 	int i;
114 
115 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
116 	if (!insn)
117 		return -ENOMEM;
118 
119 	for (i = 0; i < len; i++)
120 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
121 
122 	self->u.ptr.insns = insn;
123 	self->u.ptr.len = len;
124 
125 	return 0;
126 }
127 
128 static int bpf_fill_maxinsns3(struct bpf_test *self)
129 {
130 	unsigned int len = BPF_MAXINSNS;
131 	struct sock_filter *insn;
132 	struct rnd_state rnd;
133 	int i;
134 
135 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
136 	if (!insn)
137 		return -ENOMEM;
138 
139 	prandom_seed_state(&rnd, 3141592653589793238ULL);
140 
141 	for (i = 0; i < len - 1; i++) {
142 		__u32 k = prandom_u32_state(&rnd);
143 
144 		insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
145 	}
146 
147 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
148 
149 	self->u.ptr.insns = insn;
150 	self->u.ptr.len = len;
151 
152 	return 0;
153 }
154 
155 static int bpf_fill_maxinsns4(struct bpf_test *self)
156 {
157 	unsigned int len = BPF_MAXINSNS + 1;
158 	struct sock_filter *insn;
159 	int i;
160 
161 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
162 	if (!insn)
163 		return -ENOMEM;
164 
165 	for (i = 0; i < len; i++)
166 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
167 
168 	self->u.ptr.insns = insn;
169 	self->u.ptr.len = len;
170 
171 	return 0;
172 }
173 
174 static int bpf_fill_maxinsns5(struct bpf_test *self)
175 {
176 	unsigned int len = BPF_MAXINSNS;
177 	struct sock_filter *insn;
178 	int i;
179 
180 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
181 	if (!insn)
182 		return -ENOMEM;
183 
184 	insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
185 
186 	for (i = 1; i < len - 1; i++)
187 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
188 
189 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
190 
191 	self->u.ptr.insns = insn;
192 	self->u.ptr.len = len;
193 
194 	return 0;
195 }
196 
197 static int bpf_fill_maxinsns6(struct bpf_test *self)
198 {
199 	unsigned int len = BPF_MAXINSNS;
200 	struct sock_filter *insn;
201 	int i;
202 
203 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
204 	if (!insn)
205 		return -ENOMEM;
206 
207 	for (i = 0; i < len - 1; i++)
208 		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
209 				     SKF_AD_VLAN_TAG_PRESENT);
210 
211 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
212 
213 	self->u.ptr.insns = insn;
214 	self->u.ptr.len = len;
215 
216 	return 0;
217 }
218 
219 static int bpf_fill_maxinsns7(struct bpf_test *self)
220 {
221 	unsigned int len = BPF_MAXINSNS;
222 	struct sock_filter *insn;
223 	int i;
224 
225 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
226 	if (!insn)
227 		return -ENOMEM;
228 
229 	for (i = 0; i < len - 4; i++)
230 		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
231 				     SKF_AD_CPU);
232 
233 	insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
234 	insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
235 				   SKF_AD_CPU);
236 	insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
237 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
238 
239 	self->u.ptr.insns = insn;
240 	self->u.ptr.len = len;
241 
242 	return 0;
243 }
244 
245 static int bpf_fill_maxinsns8(struct bpf_test *self)
246 {
247 	unsigned int len = BPF_MAXINSNS;
248 	struct sock_filter *insn;
249 	int i, jmp_off = len - 3;
250 
251 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
252 	if (!insn)
253 		return -ENOMEM;
254 
255 	insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
256 
257 	for (i = 1; i < len - 1; i++)
258 		insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
259 
260 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
261 
262 	self->u.ptr.insns = insn;
263 	self->u.ptr.len = len;
264 
265 	return 0;
266 }
267 
268 static int bpf_fill_maxinsns9(struct bpf_test *self)
269 {
270 	unsigned int len = BPF_MAXINSNS;
271 	struct bpf_insn *insn;
272 	int i;
273 
274 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
275 	if (!insn)
276 		return -ENOMEM;
277 
278 	insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
279 	insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
280 	insn[2] = BPF_EXIT_INSN();
281 
282 	for (i = 3; i < len - 2; i++)
283 		insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
284 
285 	insn[len - 2] = BPF_EXIT_INSN();
286 	insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
287 
288 	self->u.ptr.insns = insn;
289 	self->u.ptr.len = len;
290 
291 	return 0;
292 }
293 
294 static int bpf_fill_maxinsns10(struct bpf_test *self)
295 {
296 	unsigned int len = BPF_MAXINSNS, hlen = len - 2;
297 	struct bpf_insn *insn;
298 	int i;
299 
300 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
301 	if (!insn)
302 		return -ENOMEM;
303 
304 	for (i = 0; i < hlen / 2; i++)
305 		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
306 	for (i = hlen - 1; i > hlen / 2; i--)
307 		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
308 
309 	insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
310 	insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
311 	insn[hlen + 1] = BPF_EXIT_INSN();
312 
313 	self->u.ptr.insns = insn;
314 	self->u.ptr.len = len;
315 
316 	return 0;
317 }
318 
319 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
320 			 unsigned int plen)
321 {
322 	struct sock_filter *insn;
323 	unsigned int rlen;
324 	int i, j;
325 
326 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
327 	if (!insn)
328 		return -ENOMEM;
329 
330 	rlen = (len % plen) - 1;
331 
332 	for (i = 0; i + plen < len; i += plen)
333 		for (j = 0; j < plen; j++)
334 			insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
335 						 plen - 1 - j, 0, 0);
336 	for (j = 0; j < rlen; j++)
337 		insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
338 					 0, 0);
339 
340 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
341 
342 	self->u.ptr.insns = insn;
343 	self->u.ptr.len = len;
344 
345 	return 0;
346 }
347 
348 static int bpf_fill_maxinsns11(struct bpf_test *self)
349 {
350 	/* Hits 70 passes on x86_64 and triggers NOPs padding. */
351 	return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
352 }
353 
354 static int bpf_fill_maxinsns12(struct bpf_test *self)
355 {
356 	unsigned int len = BPF_MAXINSNS;
357 	struct sock_filter *insn;
358 	int i = 0;
359 
360 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
361 	if (!insn)
362 		return -ENOMEM;
363 
364 	insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
365 
366 	for (i = 1; i < len - 1; i++)
367 		insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
368 
369 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
370 
371 	self->u.ptr.insns = insn;
372 	self->u.ptr.len = len;
373 
374 	return 0;
375 }
376 
377 static int bpf_fill_maxinsns13(struct bpf_test *self)
378 {
379 	unsigned int len = BPF_MAXINSNS;
380 	struct sock_filter *insn;
381 	int i = 0;
382 
383 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
384 	if (!insn)
385 		return -ENOMEM;
386 
387 	for (i = 0; i < len - 3; i++)
388 		insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
389 
390 	insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
391 	insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
392 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
393 
394 	self->u.ptr.insns = insn;
395 	self->u.ptr.len = len;
396 
397 	return 0;
398 }
399 
400 static int bpf_fill_ja(struct bpf_test *self)
401 {
402 	/* Hits exactly 11 passes on x86_64 JIT. */
403 	return __bpf_fill_ja(self, 12, 9);
404 }
405 
406 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
407 {
408 	unsigned int len = BPF_MAXINSNS;
409 	struct sock_filter *insn;
410 	int i;
411 
412 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
413 	if (!insn)
414 		return -ENOMEM;
415 
416 	for (i = 0; i < len - 1; i += 2) {
417 		insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
418 		insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
419 					 SKF_AD_OFF + SKF_AD_CPU);
420 	}
421 
422 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
423 
424 	self->u.ptr.insns = insn;
425 	self->u.ptr.len = len;
426 
427 	return 0;
428 }
429 
430 static int __bpf_fill_stxdw(struct bpf_test *self, int size)
431 {
432 	unsigned int len = BPF_MAXINSNS;
433 	struct bpf_insn *insn;
434 	int i;
435 
436 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
437 	if (!insn)
438 		return -ENOMEM;
439 
440 	insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
441 	insn[1] = BPF_ST_MEM(size, R10, -40, 42);
442 
443 	for (i = 2; i < len - 2; i++)
444 		insn[i] = BPF_STX_XADD(size, R10, R0, -40);
445 
446 	insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
447 	insn[len - 1] = BPF_EXIT_INSN();
448 
449 	self->u.ptr.insns = insn;
450 	self->u.ptr.len = len;
451 	self->stack_depth = 40;
452 
453 	return 0;
454 }
455 
456 static int bpf_fill_stxw(struct bpf_test *self)
457 {
458 	return __bpf_fill_stxdw(self, BPF_W);
459 }
460 
461 static int bpf_fill_stxdw(struct bpf_test *self)
462 {
463 	return __bpf_fill_stxdw(self, BPF_DW);
464 }
465 
466 static int __bpf_ld_imm64(struct bpf_insn insns[2], u8 reg, s64 imm64)
467 {
468 	struct bpf_insn tmp[] = {BPF_LD_IMM64(reg, imm64)};
469 
470 	memcpy(insns, tmp, sizeof(tmp));
471 	return 2;
472 }
473 
474 /*
475  * Branch conversion tests. Complex operations can expand to a lot
476  * of instructions when JITed. This in turn may cause jump offsets
477  * to overflow the field size of the native instruction, triggering
478  * a branch conversion mechanism in some JITs.
479  */
480 static int __bpf_fill_max_jmp(struct bpf_test *self, int jmp, int imm)
481 {
482 	struct bpf_insn *insns;
483 	int len = S16_MAX + 5;
484 	int i;
485 
486 	insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
487 	if (!insns)
488 		return -ENOMEM;
489 
490 	i = __bpf_ld_imm64(insns, R1, 0x0123456789abcdefULL);
491 	insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
492 	insns[i++] = BPF_JMP_IMM(jmp, R0, imm, S16_MAX);
493 	insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 2);
494 	insns[i++] = BPF_EXIT_INSN();
495 
496 	while (i < len - 1) {
497 		static const int ops[] = {
498 			BPF_LSH, BPF_RSH, BPF_ARSH, BPF_ADD,
499 			BPF_SUB, BPF_MUL, BPF_DIV, BPF_MOD,
500 		};
501 		int op = ops[(i >> 1) % ARRAY_SIZE(ops)];
502 
503 		if (i & 1)
504 			insns[i++] = BPF_ALU32_REG(op, R0, R1);
505 		else
506 			insns[i++] = BPF_ALU64_REG(op, R0, R1);
507 	}
508 
509 	insns[i++] = BPF_EXIT_INSN();
510 	self->u.ptr.insns = insns;
511 	self->u.ptr.len = len;
512 	BUG_ON(i != len);
513 
514 	return 0;
515 }
516 
517 /* Branch taken by runtime decision */
518 static int bpf_fill_max_jmp_taken(struct bpf_test *self)
519 {
520 	return __bpf_fill_max_jmp(self, BPF_JEQ, 1);
521 }
522 
523 /* Branch not taken by runtime decision */
524 static int bpf_fill_max_jmp_not_taken(struct bpf_test *self)
525 {
526 	return __bpf_fill_max_jmp(self, BPF_JEQ, 0);
527 }
528 
529 /* Branch always taken, known at JIT time */
530 static int bpf_fill_max_jmp_always_taken(struct bpf_test *self)
531 {
532 	return __bpf_fill_max_jmp(self, BPF_JGE, 0);
533 }
534 
535 /* Branch never taken, known at JIT time */
536 static int bpf_fill_max_jmp_never_taken(struct bpf_test *self)
537 {
538 	return __bpf_fill_max_jmp(self, BPF_JLT, 0);
539 }
540 
541 /* Test an ALU shift operation for all valid shift values */
542 static int __bpf_fill_alu_shift(struct bpf_test *self, u8 op,
543 				u8 mode, bool alu32)
544 {
545 	static const s64 regs[] = {
546 		0x0123456789abcdefLL, /* dword > 0, word < 0 */
547 		0xfedcba9876543210LL, /* dowrd < 0, word > 0 */
548 		0xfedcba0198765432LL, /* dowrd < 0, word < 0 */
549 		0x0123458967abcdefLL, /* dword > 0, word > 0 */
550 	};
551 	int bits = alu32 ? 32 : 64;
552 	int len = (2 + 7 * bits) * ARRAY_SIZE(regs) + 3;
553 	struct bpf_insn *insn;
554 	int imm, k;
555 	int i = 0;
556 
557 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
558 	if (!insn)
559 		return -ENOMEM;
560 
561 	insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
562 
563 	for (k = 0; k < ARRAY_SIZE(regs); k++) {
564 		s64 reg = regs[k];
565 
566 		i += __bpf_ld_imm64(&insn[i], R3, reg);
567 
568 		for (imm = 0; imm < bits; imm++) {
569 			u64 val;
570 
571 			/* Perform operation */
572 			insn[i++] = BPF_ALU64_REG(BPF_MOV, R1, R3);
573 			insn[i++] = BPF_ALU64_IMM(BPF_MOV, R2, imm);
574 			if (alu32) {
575 				if (mode == BPF_K)
576 					insn[i++] = BPF_ALU32_IMM(op, R1, imm);
577 				else
578 					insn[i++] = BPF_ALU32_REG(op, R1, R2);
579 				switch (op) {
580 				case BPF_LSH:
581 					val = (u32)reg << imm;
582 					break;
583 				case BPF_RSH:
584 					val = (u32)reg >> imm;
585 					break;
586 				case BPF_ARSH:
587 					val = (u32)reg >> imm;
588 					if (imm > 0 && (reg & 0x80000000))
589 						val |= ~(u32)0 << (32 - imm);
590 					break;
591 				}
592 			} else {
593 				if (mode == BPF_K)
594 					insn[i++] = BPF_ALU64_IMM(op, R1, imm);
595 				else
596 					insn[i++] = BPF_ALU64_REG(op, R1, R2);
597 				switch (op) {
598 				case BPF_LSH:
599 					val = (u64)reg << imm;
600 					break;
601 				case BPF_RSH:
602 					val = (u64)reg >> imm;
603 					break;
604 				case BPF_ARSH:
605 					val = (u64)reg >> imm;
606 					if (imm > 0 && reg < 0)
607 						val |= ~(u64)0 << (64 - imm);
608 					break;
609 				}
610 			}
611 
612 			/*
613 			 * When debugging a JIT that fails this test, one
614 			 * can write the immediate value to R0 here to find
615 			 * out which operand values that fail.
616 			 */
617 
618 			/* Load reference and check the result */
619 			i += __bpf_ld_imm64(&insn[i], R4, val);
620 			insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R4, 1);
621 			insn[i++] = BPF_EXIT_INSN();
622 		}
623 	}
624 
625 	insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
626 	insn[i++] = BPF_EXIT_INSN();
627 
628 	self->u.ptr.insns = insn;
629 	self->u.ptr.len = len;
630 	BUG_ON(i > len);
631 
632 	return 0;
633 }
634 
635 static int bpf_fill_alu_lsh_imm(struct bpf_test *self)
636 {
637 	return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, false);
638 }
639 
640 static int bpf_fill_alu_rsh_imm(struct bpf_test *self)
641 {
642 	return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, false);
643 }
644 
645 static int bpf_fill_alu_arsh_imm(struct bpf_test *self)
646 {
647 	return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, false);
648 }
649 
650 static int bpf_fill_alu_lsh_reg(struct bpf_test *self)
651 {
652 	return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, false);
653 }
654 
655 static int bpf_fill_alu_rsh_reg(struct bpf_test *self)
656 {
657 	return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, false);
658 }
659 
660 static int bpf_fill_alu_arsh_reg(struct bpf_test *self)
661 {
662 	return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, false);
663 }
664 
665 static int bpf_fill_alu32_lsh_imm(struct bpf_test *self)
666 {
667 	return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, true);
668 }
669 
670 static int bpf_fill_alu32_rsh_imm(struct bpf_test *self)
671 {
672 	return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, true);
673 }
674 
675 static int bpf_fill_alu32_arsh_imm(struct bpf_test *self)
676 {
677 	return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, true);
678 }
679 
680 static int bpf_fill_alu32_lsh_reg(struct bpf_test *self)
681 {
682 	return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, true);
683 }
684 
685 static int bpf_fill_alu32_rsh_reg(struct bpf_test *self)
686 {
687 	return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, true);
688 }
689 
690 static int bpf_fill_alu32_arsh_reg(struct bpf_test *self)
691 {
692 	return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, true);
693 }
694 
695 /*
696  * Common operand pattern generator for exhaustive power-of-two magnitudes
697  * tests. The block size parameters can be adjusted to increase/reduce the
698  * number of combinatons tested and thereby execution speed and memory
699  * footprint.
700  */
701 
702 static inline s64 value(int msb, int delta, int sign)
703 {
704 	return sign * (1LL << msb) + delta;
705 }
706 
707 static int __bpf_fill_pattern(struct bpf_test *self, void *arg,
708 			      int dbits, int sbits, int block1, int block2,
709 			      int (*emit)(struct bpf_test*, void*,
710 					  struct bpf_insn*, s64, s64))
711 {
712 	static const int sgn[][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
713 	struct bpf_insn *insns;
714 	int di, si, bt, db, sb;
715 	int count, len, k;
716 	int extra = 1 + 2;
717 	int i = 0;
718 
719 	/* Total number of iterations for the two pattern */
720 	count = (dbits - 1) * (sbits - 1) * block1 * block1 * ARRAY_SIZE(sgn);
721 	count += (max(dbits, sbits) - 1) * block2 * block2 * ARRAY_SIZE(sgn);
722 
723 	/* Compute the maximum number of insns and allocate the buffer */
724 	len = extra + count * (*emit)(self, arg, NULL, 0, 0);
725 	insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
726 	if (!insns)
727 		return -ENOMEM;
728 
729 	/* Add head instruction(s) */
730 	insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
731 
732 	/*
733 	 * Pattern 1: all combinations of power-of-two magnitudes and sign,
734 	 * and with a block of contiguous values around each magnitude.
735 	 */
736 	for (di = 0; di < dbits - 1; di++)                 /* Dst magnitudes */
737 		for (si = 0; si < sbits - 1; si++)         /* Src magnitudes */
738 			for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */
739 				for (db = -(block1 / 2);
740 				     db < (block1 + 1) / 2; db++)
741 					for (sb = -(block1 / 2);
742 					     sb < (block1 + 1) / 2; sb++) {
743 						s64 dst, src;
744 
745 						dst = value(di, db, sgn[k][0]);
746 						src = value(si, sb, sgn[k][1]);
747 						i += (*emit)(self, arg,
748 							     &insns[i],
749 							     dst, src);
750 					}
751 	/*
752 	 * Pattern 2: all combinations for a larger block of values
753 	 * for each power-of-two magnitude and sign, where the magnitude is
754 	 * the same for both operands.
755 	 */
756 	for (bt = 0; bt < max(dbits, sbits) - 1; bt++)        /* Magnitude   */
757 		for (k = 0; k < ARRAY_SIZE(sgn); k++)         /* Sign combos */
758 			for (db = -(block2 / 2); db < (block2 + 1) / 2; db++)
759 				for (sb = -(block2 / 2);
760 				     sb < (block2 + 1) / 2; sb++) {
761 					s64 dst, src;
762 
763 					dst = value(bt % dbits, db, sgn[k][0]);
764 					src = value(bt % sbits, sb, sgn[k][1]);
765 					i += (*emit)(self, arg, &insns[i],
766 						     dst, src);
767 				}
768 
769 	/* Append tail instructions */
770 	insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
771 	insns[i++] = BPF_EXIT_INSN();
772 	BUG_ON(i > len);
773 
774 	self->u.ptr.insns = insns;
775 	self->u.ptr.len = i;
776 
777 	return 0;
778 }
779 
780 /*
781  * Block size parameters used in pattern tests below. une as needed to
782  * increase/reduce the number combinations tested, see following examples.
783  *        block   values per operand MSB
784  * ----------------------------------------
785  *           0     none
786  *           1     (1 << MSB)
787  *           2     (1 << MSB) + [-1, 0]
788  *           3     (1 << MSB) + [-1, 0, 1]
789  */
790 #define PATTERN_BLOCK1 1
791 #define PATTERN_BLOCK2 5
792 
793 /* Number of test runs for a pattern test */
794 #define NR_PATTERN_RUNS 1
795 
796 /*
797  * Exhaustive tests of ALU operations for all combinations of power-of-two
798  * magnitudes of the operands, both for positive and negative values. The
799  * test is designed to verify e.g. the JMP and JMP32 operations for JITs that
800  * emit different code depending on the magnitude of the immediate value.
801  */
802 
803 static bool __bpf_alu_result(u64 *res, u64 v1, u64 v2, u8 op)
804 {
805 	*res = 0;
806 	switch (op) {
807 	case BPF_MOV:
808 		*res = v2;
809 		break;
810 	case BPF_AND:
811 		*res = v1 & v2;
812 		break;
813 	case BPF_OR:
814 		*res = v1 | v2;
815 		break;
816 	case BPF_XOR:
817 		*res = v1 ^ v2;
818 		break;
819 	case BPF_ADD:
820 		*res = v1 + v2;
821 		break;
822 	case BPF_SUB:
823 		*res = v1 - v2;
824 		break;
825 	case BPF_MUL:
826 		*res = v1 * v2;
827 		break;
828 	case BPF_DIV:
829 		if (v2 == 0)
830 			return false;
831 		*res = div64_u64(v1, v2);
832 		break;
833 	case BPF_MOD:
834 		if (v2 == 0)
835 			return false;
836 		div64_u64_rem(v1, v2, res);
837 		break;
838 	}
839 	return true;
840 }
841 
842 static int __bpf_emit_alu64_imm(struct bpf_test *self, void *arg,
843 				struct bpf_insn *insns, s64 dst, s64 imm)
844 {
845 	int op = *(int *)arg;
846 	int i = 0;
847 	u64 res;
848 
849 	if (!insns)
850 		return 7;
851 
852 	if (__bpf_alu_result(&res, dst, (s32)imm, op)) {
853 		i += __bpf_ld_imm64(&insns[i], R1, dst);
854 		i += __bpf_ld_imm64(&insns[i], R3, res);
855 		insns[i++] = BPF_ALU64_IMM(op, R1, imm);
856 		insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
857 		insns[i++] = BPF_EXIT_INSN();
858 	}
859 
860 	return i;
861 }
862 
863 static int __bpf_emit_alu32_imm(struct bpf_test *self, void *arg,
864 				struct bpf_insn *insns, s64 dst, s64 imm)
865 {
866 	int op = *(int *)arg;
867 	int i = 0;
868 	u64 res;
869 
870 	if (!insns)
871 		return 7;
872 
873 	if (__bpf_alu_result(&res, (u32)dst, (u32)imm, op)) {
874 		i += __bpf_ld_imm64(&insns[i], R1, dst);
875 		i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
876 		insns[i++] = BPF_ALU32_IMM(op, R1, imm);
877 		insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
878 		insns[i++] = BPF_EXIT_INSN();
879 	}
880 
881 	return i;
882 }
883 
884 static int __bpf_emit_alu64_reg(struct bpf_test *self, void *arg,
885 				struct bpf_insn *insns, s64 dst, s64 src)
886 {
887 	int op = *(int *)arg;
888 	int i = 0;
889 	u64 res;
890 
891 	if (!insns)
892 		return 9;
893 
894 	if (__bpf_alu_result(&res, dst, src, op)) {
895 		i += __bpf_ld_imm64(&insns[i], R1, dst);
896 		i += __bpf_ld_imm64(&insns[i], R2, src);
897 		i += __bpf_ld_imm64(&insns[i], R3, res);
898 		insns[i++] = BPF_ALU64_REG(op, R1, R2);
899 		insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
900 		insns[i++] = BPF_EXIT_INSN();
901 	}
902 
903 	return i;
904 }
905 
906 static int __bpf_emit_alu32_reg(struct bpf_test *self, void *arg,
907 				struct bpf_insn *insns, s64 dst, s64 src)
908 {
909 	int op = *(int *)arg;
910 	int i = 0;
911 	u64 res;
912 
913 	if (!insns)
914 		return 9;
915 
916 	if (__bpf_alu_result(&res, (u32)dst, (u32)src, op)) {
917 		i += __bpf_ld_imm64(&insns[i], R1, dst);
918 		i += __bpf_ld_imm64(&insns[i], R2, src);
919 		i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
920 		insns[i++] = BPF_ALU32_REG(op, R1, R2);
921 		insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
922 		insns[i++] = BPF_EXIT_INSN();
923 	}
924 
925 	return i;
926 }
927 
928 static int __bpf_fill_alu64_imm(struct bpf_test *self, int op)
929 {
930 	return __bpf_fill_pattern(self, &op, 64, 32,
931 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
932 				  &__bpf_emit_alu64_imm);
933 }
934 
935 static int __bpf_fill_alu32_imm(struct bpf_test *self, int op)
936 {
937 	return __bpf_fill_pattern(self, &op, 64, 32,
938 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
939 				  &__bpf_emit_alu32_imm);
940 }
941 
942 static int __bpf_fill_alu64_reg(struct bpf_test *self, int op)
943 {
944 	return __bpf_fill_pattern(self, &op, 64, 64,
945 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
946 				  &__bpf_emit_alu64_reg);
947 }
948 
949 static int __bpf_fill_alu32_reg(struct bpf_test *self, int op)
950 {
951 	return __bpf_fill_pattern(self, &op, 64, 64,
952 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
953 				  &__bpf_emit_alu32_reg);
954 }
955 
956 /* ALU64 immediate operations */
957 static int bpf_fill_alu64_mov_imm(struct bpf_test *self)
958 {
959 	return __bpf_fill_alu64_imm(self, BPF_MOV);
960 }
961 
962 static int bpf_fill_alu64_and_imm(struct bpf_test *self)
963 {
964 	return __bpf_fill_alu64_imm(self, BPF_AND);
965 }
966 
967 static int bpf_fill_alu64_or_imm(struct bpf_test *self)
968 {
969 	return __bpf_fill_alu64_imm(self, BPF_OR);
970 }
971 
972 static int bpf_fill_alu64_xor_imm(struct bpf_test *self)
973 {
974 	return __bpf_fill_alu64_imm(self, BPF_XOR);
975 }
976 
977 static int bpf_fill_alu64_add_imm(struct bpf_test *self)
978 {
979 	return __bpf_fill_alu64_imm(self, BPF_ADD);
980 }
981 
982 static int bpf_fill_alu64_sub_imm(struct bpf_test *self)
983 {
984 	return __bpf_fill_alu64_imm(self, BPF_SUB);
985 }
986 
987 static int bpf_fill_alu64_mul_imm(struct bpf_test *self)
988 {
989 	return __bpf_fill_alu64_imm(self, BPF_MUL);
990 }
991 
992 static int bpf_fill_alu64_div_imm(struct bpf_test *self)
993 {
994 	return __bpf_fill_alu64_imm(self, BPF_DIV);
995 }
996 
997 static int bpf_fill_alu64_mod_imm(struct bpf_test *self)
998 {
999 	return __bpf_fill_alu64_imm(self, BPF_MOD);
1000 }
1001 
1002 /* ALU32 immediate operations */
1003 static int bpf_fill_alu32_mov_imm(struct bpf_test *self)
1004 {
1005 	return __bpf_fill_alu32_imm(self, BPF_MOV);
1006 }
1007 
1008 static int bpf_fill_alu32_and_imm(struct bpf_test *self)
1009 {
1010 	return __bpf_fill_alu32_imm(self, BPF_AND);
1011 }
1012 
1013 static int bpf_fill_alu32_or_imm(struct bpf_test *self)
1014 {
1015 	return __bpf_fill_alu32_imm(self, BPF_OR);
1016 }
1017 
1018 static int bpf_fill_alu32_xor_imm(struct bpf_test *self)
1019 {
1020 	return __bpf_fill_alu32_imm(self, BPF_XOR);
1021 }
1022 
1023 static int bpf_fill_alu32_add_imm(struct bpf_test *self)
1024 {
1025 	return __bpf_fill_alu32_imm(self, BPF_ADD);
1026 }
1027 
1028 static int bpf_fill_alu32_sub_imm(struct bpf_test *self)
1029 {
1030 	return __bpf_fill_alu32_imm(self, BPF_SUB);
1031 }
1032 
1033 static int bpf_fill_alu32_mul_imm(struct bpf_test *self)
1034 {
1035 	return __bpf_fill_alu32_imm(self, BPF_MUL);
1036 }
1037 
1038 static int bpf_fill_alu32_div_imm(struct bpf_test *self)
1039 {
1040 	return __bpf_fill_alu32_imm(self, BPF_DIV);
1041 }
1042 
1043 static int bpf_fill_alu32_mod_imm(struct bpf_test *self)
1044 {
1045 	return __bpf_fill_alu32_imm(self, BPF_MOD);
1046 }
1047 
1048 /* ALU64 register operations */
1049 static int bpf_fill_alu64_mov_reg(struct bpf_test *self)
1050 {
1051 	return __bpf_fill_alu64_reg(self, BPF_MOV);
1052 }
1053 
1054 static int bpf_fill_alu64_and_reg(struct bpf_test *self)
1055 {
1056 	return __bpf_fill_alu64_reg(self, BPF_AND);
1057 }
1058 
1059 static int bpf_fill_alu64_or_reg(struct bpf_test *self)
1060 {
1061 	return __bpf_fill_alu64_reg(self, BPF_OR);
1062 }
1063 
1064 static int bpf_fill_alu64_xor_reg(struct bpf_test *self)
1065 {
1066 	return __bpf_fill_alu64_reg(self, BPF_XOR);
1067 }
1068 
1069 static int bpf_fill_alu64_add_reg(struct bpf_test *self)
1070 {
1071 	return __bpf_fill_alu64_reg(self, BPF_ADD);
1072 }
1073 
1074 static int bpf_fill_alu64_sub_reg(struct bpf_test *self)
1075 {
1076 	return __bpf_fill_alu64_reg(self, BPF_SUB);
1077 }
1078 
1079 static int bpf_fill_alu64_mul_reg(struct bpf_test *self)
1080 {
1081 	return __bpf_fill_alu64_reg(self, BPF_MUL);
1082 }
1083 
1084 static int bpf_fill_alu64_div_reg(struct bpf_test *self)
1085 {
1086 	return __bpf_fill_alu64_reg(self, BPF_DIV);
1087 }
1088 
1089 static int bpf_fill_alu64_mod_reg(struct bpf_test *self)
1090 {
1091 	return __bpf_fill_alu64_reg(self, BPF_MOD);
1092 }
1093 
1094 /* ALU32 register operations */
1095 static int bpf_fill_alu32_mov_reg(struct bpf_test *self)
1096 {
1097 	return __bpf_fill_alu32_reg(self, BPF_MOV);
1098 }
1099 
1100 static int bpf_fill_alu32_and_reg(struct bpf_test *self)
1101 {
1102 	return __bpf_fill_alu32_reg(self, BPF_AND);
1103 }
1104 
1105 static int bpf_fill_alu32_or_reg(struct bpf_test *self)
1106 {
1107 	return __bpf_fill_alu32_reg(self, BPF_OR);
1108 }
1109 
1110 static int bpf_fill_alu32_xor_reg(struct bpf_test *self)
1111 {
1112 	return __bpf_fill_alu32_reg(self, BPF_XOR);
1113 }
1114 
1115 static int bpf_fill_alu32_add_reg(struct bpf_test *self)
1116 {
1117 	return __bpf_fill_alu32_reg(self, BPF_ADD);
1118 }
1119 
1120 static int bpf_fill_alu32_sub_reg(struct bpf_test *self)
1121 {
1122 	return __bpf_fill_alu32_reg(self, BPF_SUB);
1123 }
1124 
1125 static int bpf_fill_alu32_mul_reg(struct bpf_test *self)
1126 {
1127 	return __bpf_fill_alu32_reg(self, BPF_MUL);
1128 }
1129 
1130 static int bpf_fill_alu32_div_reg(struct bpf_test *self)
1131 {
1132 	return __bpf_fill_alu32_reg(self, BPF_DIV);
1133 }
1134 
1135 static int bpf_fill_alu32_mod_reg(struct bpf_test *self)
1136 {
1137 	return __bpf_fill_alu32_reg(self, BPF_MOD);
1138 }
1139 
1140 /*
1141  * Test the two-instruction 64-bit immediate load operation for all
1142  * power-of-two magnitudes of the immediate operand. For each MSB, a block
1143  * of immediate values centered around the power-of-two MSB are tested,
1144  * both for positive and negative values. The test is designed to verify
1145  * the operation for JITs that emit different code depending on the magnitude
1146  * of the immediate value. This is often the case if the native instruction
1147  * immediate field width is narrower than 32 bits.
1148  */
1149 static int bpf_fill_ld_imm64(struct bpf_test *self)
1150 {
1151 	int block = 64; /* Increase for more tests per MSB position */
1152 	int len = 3 + 8 * 63 * block * 2;
1153 	struct bpf_insn *insn;
1154 	int bit, adj, sign;
1155 	int i = 0;
1156 
1157 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
1158 	if (!insn)
1159 		return -ENOMEM;
1160 
1161 	insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
1162 
1163 	for (bit = 0; bit <= 62; bit++) {
1164 		for (adj = -block / 2; adj < block / 2; adj++) {
1165 			for (sign = -1; sign <= 1; sign += 2) {
1166 				s64 imm = sign * ((1LL << bit) + adj);
1167 
1168 				/* Perform operation */
1169 				i += __bpf_ld_imm64(&insn[i], R1, imm);
1170 
1171 				/* Load reference */
1172 				insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
1173 				insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3,
1174 							  (u32)(imm >> 32));
1175 				insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
1176 				insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
1177 
1178 				/* Check result */
1179 				insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
1180 				insn[i++] = BPF_EXIT_INSN();
1181 			}
1182 		}
1183 	}
1184 
1185 	insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
1186 	insn[i++] = BPF_EXIT_INSN();
1187 
1188 	self->u.ptr.insns = insn;
1189 	self->u.ptr.len = len;
1190 	BUG_ON(i != len);
1191 
1192 	return 0;
1193 }
1194 
1195 /*
1196  * Exhaustive tests of JMP operations for all combinations of power-of-two
1197  * magnitudes of the operands, both for positive and negative values. The
1198  * test is designed to verify e.g. the JMP and JMP32 operations for JITs that
1199  * emit different code depending on the magnitude of the immediate value.
1200  */
1201 
1202 static bool __bpf_match_jmp_cond(s64 v1, s64 v2, u8 op)
1203 {
1204 	switch (op) {
1205 	case BPF_JSET:
1206 		return !!(v1 & v2);
1207 	case BPF_JEQ:
1208 		return v1 == v2;
1209 	case BPF_JNE:
1210 		return v1 != v2;
1211 	case BPF_JGT:
1212 		return (u64)v1 > (u64)v2;
1213 	case BPF_JGE:
1214 		return (u64)v1 >= (u64)v2;
1215 	case BPF_JLT:
1216 		return (u64)v1 < (u64)v2;
1217 	case BPF_JLE:
1218 		return (u64)v1 <= (u64)v2;
1219 	case BPF_JSGT:
1220 		return v1 > v2;
1221 	case BPF_JSGE:
1222 		return v1 >= v2;
1223 	case BPF_JSLT:
1224 		return v1 < v2;
1225 	case BPF_JSLE:
1226 		return v1 <= v2;
1227 	}
1228 	return false;
1229 }
1230 
1231 static int __bpf_emit_jmp_imm(struct bpf_test *self, void *arg,
1232 			      struct bpf_insn *insns, s64 dst, s64 imm)
1233 {
1234 	int op = *(int *)arg;
1235 
1236 	if (insns) {
1237 		bool match = __bpf_match_jmp_cond(dst, (s32)imm, op);
1238 		int i = 0;
1239 
1240 		insns[i++] = BPF_ALU32_IMM(BPF_MOV, R0, match);
1241 
1242 		i += __bpf_ld_imm64(&insns[i], R1, dst);
1243 		insns[i++] = BPF_JMP_IMM(op, R1, imm, 1);
1244 		if (!match)
1245 			insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
1246 		insns[i++] = BPF_EXIT_INSN();
1247 
1248 		return i;
1249 	}
1250 
1251 	return 5 + 1;
1252 }
1253 
1254 static int __bpf_emit_jmp32_imm(struct bpf_test *self, void *arg,
1255 				struct bpf_insn *insns, s64 dst, s64 imm)
1256 {
1257 	int op = *(int *)arg;
1258 
1259 	if (insns) {
1260 		bool match = __bpf_match_jmp_cond((s32)dst, (s32)imm, op);
1261 		int i = 0;
1262 
1263 		i += __bpf_ld_imm64(&insns[i], R1, dst);
1264 		insns[i++] = BPF_JMP32_IMM(op, R1, imm, 1);
1265 		if (!match)
1266 			insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
1267 		insns[i++] = BPF_EXIT_INSN();
1268 
1269 		return i;
1270 	}
1271 
1272 	return 5;
1273 }
1274 
1275 static int __bpf_emit_jmp_reg(struct bpf_test *self, void *arg,
1276 			      struct bpf_insn *insns, s64 dst, s64 src)
1277 {
1278 	int op = *(int *)arg;
1279 
1280 	if (insns) {
1281 		bool match = __bpf_match_jmp_cond(dst, src, op);
1282 		int i = 0;
1283 
1284 		i += __bpf_ld_imm64(&insns[i], R1, dst);
1285 		i += __bpf_ld_imm64(&insns[i], R2, src);
1286 		insns[i++] = BPF_JMP_REG(op, R1, R2, 1);
1287 		if (!match)
1288 			insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
1289 		insns[i++] = BPF_EXIT_INSN();
1290 
1291 		return i;
1292 	}
1293 
1294 	return 7;
1295 }
1296 
1297 static int __bpf_emit_jmp32_reg(struct bpf_test *self, void *arg,
1298 				struct bpf_insn *insns, s64 dst, s64 src)
1299 {
1300 	int op = *(int *)arg;
1301 
1302 	if (insns) {
1303 		bool match = __bpf_match_jmp_cond((s32)dst, (s32)src, op);
1304 		int i = 0;
1305 
1306 		i += __bpf_ld_imm64(&insns[i], R1, dst);
1307 		i += __bpf_ld_imm64(&insns[i], R2, src);
1308 		insns[i++] = BPF_JMP32_REG(op, R1, R2, 1);
1309 		if (!match)
1310 			insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
1311 		insns[i++] = BPF_EXIT_INSN();
1312 
1313 		return i;
1314 	}
1315 
1316 	return 7;
1317 }
1318 
1319 static int __bpf_fill_jmp_imm(struct bpf_test *self, int op)
1320 {
1321 	return __bpf_fill_pattern(self, &op, 64, 32,
1322 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
1323 				  &__bpf_emit_jmp_imm);
1324 }
1325 
1326 static int __bpf_fill_jmp32_imm(struct bpf_test *self, int op)
1327 {
1328 	return __bpf_fill_pattern(self, &op, 64, 32,
1329 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
1330 				  &__bpf_emit_jmp32_imm);
1331 }
1332 
1333 static int __bpf_fill_jmp_reg(struct bpf_test *self, int op)
1334 {
1335 	return __bpf_fill_pattern(self, &op, 64, 64,
1336 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
1337 				  &__bpf_emit_jmp_reg);
1338 }
1339 
1340 static int __bpf_fill_jmp32_reg(struct bpf_test *self, int op)
1341 {
1342 	return __bpf_fill_pattern(self, &op, 64, 64,
1343 				  PATTERN_BLOCK1, PATTERN_BLOCK2,
1344 				  &__bpf_emit_jmp32_reg);
1345 }
1346 
1347 /* JMP immediate tests */
1348 static int bpf_fill_jmp_jset_imm(struct bpf_test *self)
1349 {
1350 	return __bpf_fill_jmp_imm(self, BPF_JSET);
1351 }
1352 
1353 static int bpf_fill_jmp_jeq_imm(struct bpf_test *self)
1354 {
1355 	return __bpf_fill_jmp_imm(self, BPF_JEQ);
1356 }
1357 
1358 static int bpf_fill_jmp_jne_imm(struct bpf_test *self)
1359 {
1360 	return __bpf_fill_jmp_imm(self, BPF_JNE);
1361 }
1362 
1363 static int bpf_fill_jmp_jgt_imm(struct bpf_test *self)
1364 {
1365 	return __bpf_fill_jmp_imm(self, BPF_JGT);
1366 }
1367 
1368 static int bpf_fill_jmp_jge_imm(struct bpf_test *self)
1369 {
1370 	return __bpf_fill_jmp_imm(self, BPF_JGE);
1371 }
1372 
1373 static int bpf_fill_jmp_jlt_imm(struct bpf_test *self)
1374 {
1375 	return __bpf_fill_jmp_imm(self, BPF_JLT);
1376 }
1377 
1378 static int bpf_fill_jmp_jle_imm(struct bpf_test *self)
1379 {
1380 	return __bpf_fill_jmp_imm(self, BPF_JLE);
1381 }
1382 
1383 static int bpf_fill_jmp_jsgt_imm(struct bpf_test *self)
1384 {
1385 	return __bpf_fill_jmp_imm(self, BPF_JSGT);
1386 }
1387 
1388 static int bpf_fill_jmp_jsge_imm(struct bpf_test *self)
1389 {
1390 	return __bpf_fill_jmp_imm(self, BPF_JSGE);
1391 }
1392 
1393 static int bpf_fill_jmp_jslt_imm(struct bpf_test *self)
1394 {
1395 	return __bpf_fill_jmp_imm(self, BPF_JSLT);
1396 }
1397 
1398 static int bpf_fill_jmp_jsle_imm(struct bpf_test *self)
1399 {
1400 	return __bpf_fill_jmp_imm(self, BPF_JSLE);
1401 }
1402 
1403 /* JMP32 immediate tests */
1404 static int bpf_fill_jmp32_jset_imm(struct bpf_test *self)
1405 {
1406 	return __bpf_fill_jmp32_imm(self, BPF_JSET);
1407 }
1408 
1409 static int bpf_fill_jmp32_jeq_imm(struct bpf_test *self)
1410 {
1411 	return __bpf_fill_jmp32_imm(self, BPF_JEQ);
1412 }
1413 
1414 static int bpf_fill_jmp32_jne_imm(struct bpf_test *self)
1415 {
1416 	return __bpf_fill_jmp32_imm(self, BPF_JNE);
1417 }
1418 
1419 static int bpf_fill_jmp32_jgt_imm(struct bpf_test *self)
1420 {
1421 	return __bpf_fill_jmp32_imm(self, BPF_JGT);
1422 }
1423 
1424 static int bpf_fill_jmp32_jge_imm(struct bpf_test *self)
1425 {
1426 	return __bpf_fill_jmp32_imm(self, BPF_JGE);
1427 }
1428 
1429 static int bpf_fill_jmp32_jlt_imm(struct bpf_test *self)
1430 {
1431 	return __bpf_fill_jmp32_imm(self, BPF_JLT);
1432 }
1433 
1434 static int bpf_fill_jmp32_jle_imm(struct bpf_test *self)
1435 {
1436 	return __bpf_fill_jmp32_imm(self, BPF_JLE);
1437 }
1438 
1439 static int bpf_fill_jmp32_jsgt_imm(struct bpf_test *self)
1440 {
1441 	return __bpf_fill_jmp32_imm(self, BPF_JSGT);
1442 }
1443 
1444 static int bpf_fill_jmp32_jsge_imm(struct bpf_test *self)
1445 {
1446 	return __bpf_fill_jmp32_imm(self, BPF_JSGE);
1447 }
1448 
1449 static int bpf_fill_jmp32_jslt_imm(struct bpf_test *self)
1450 {
1451 	return __bpf_fill_jmp32_imm(self, BPF_JSLT);
1452 }
1453 
1454 static int bpf_fill_jmp32_jsle_imm(struct bpf_test *self)
1455 {
1456 	return __bpf_fill_jmp32_imm(self, BPF_JSLE);
1457 }
1458 
1459 /* JMP register tests */
1460 static int bpf_fill_jmp_jset_reg(struct bpf_test *self)
1461 {
1462 	return __bpf_fill_jmp_reg(self, BPF_JSET);
1463 }
1464 
1465 static int bpf_fill_jmp_jeq_reg(struct bpf_test *self)
1466 {
1467 	return __bpf_fill_jmp_reg(self, BPF_JEQ);
1468 }
1469 
1470 static int bpf_fill_jmp_jne_reg(struct bpf_test *self)
1471 {
1472 	return __bpf_fill_jmp_reg(self, BPF_JNE);
1473 }
1474 
1475 static int bpf_fill_jmp_jgt_reg(struct bpf_test *self)
1476 {
1477 	return __bpf_fill_jmp_reg(self, BPF_JGT);
1478 }
1479 
1480 static int bpf_fill_jmp_jge_reg(struct bpf_test *self)
1481 {
1482 	return __bpf_fill_jmp_reg(self, BPF_JGE);
1483 }
1484 
1485 static int bpf_fill_jmp_jlt_reg(struct bpf_test *self)
1486 {
1487 	return __bpf_fill_jmp_reg(self, BPF_JLT);
1488 }
1489 
1490 static int bpf_fill_jmp_jle_reg(struct bpf_test *self)
1491 {
1492 	return __bpf_fill_jmp_reg(self, BPF_JLE);
1493 }
1494 
1495 static int bpf_fill_jmp_jsgt_reg(struct bpf_test *self)
1496 {
1497 	return __bpf_fill_jmp_reg(self, BPF_JSGT);
1498 }
1499 
1500 static int bpf_fill_jmp_jsge_reg(struct bpf_test *self)
1501 {
1502 	return __bpf_fill_jmp_reg(self, BPF_JSGE);
1503 }
1504 
1505 static int bpf_fill_jmp_jslt_reg(struct bpf_test *self)
1506 {
1507 	return __bpf_fill_jmp_reg(self, BPF_JSLT);
1508 }
1509 
1510 static int bpf_fill_jmp_jsle_reg(struct bpf_test *self)
1511 {
1512 	return __bpf_fill_jmp_reg(self, BPF_JSLE);
1513 }
1514 
1515 /* JMP32 register tests */
1516 static int bpf_fill_jmp32_jset_reg(struct bpf_test *self)
1517 {
1518 	return __bpf_fill_jmp32_reg(self, BPF_JSET);
1519 }
1520 
1521 static int bpf_fill_jmp32_jeq_reg(struct bpf_test *self)
1522 {
1523 	return __bpf_fill_jmp32_reg(self, BPF_JEQ);
1524 }
1525 
1526 static int bpf_fill_jmp32_jne_reg(struct bpf_test *self)
1527 {
1528 	return __bpf_fill_jmp32_reg(self, BPF_JNE);
1529 }
1530 
1531 static int bpf_fill_jmp32_jgt_reg(struct bpf_test *self)
1532 {
1533 	return __bpf_fill_jmp32_reg(self, BPF_JGT);
1534 }
1535 
1536 static int bpf_fill_jmp32_jge_reg(struct bpf_test *self)
1537 {
1538 	return __bpf_fill_jmp32_reg(self, BPF_JGE);
1539 }
1540 
1541 static int bpf_fill_jmp32_jlt_reg(struct bpf_test *self)
1542 {
1543 	return __bpf_fill_jmp32_reg(self, BPF_JLT);
1544 }
1545 
1546 static int bpf_fill_jmp32_jle_reg(struct bpf_test *self)
1547 {
1548 	return __bpf_fill_jmp32_reg(self, BPF_JLE);
1549 }
1550 
1551 static int bpf_fill_jmp32_jsgt_reg(struct bpf_test *self)
1552 {
1553 	return __bpf_fill_jmp32_reg(self, BPF_JSGT);
1554 }
1555 
1556 static int bpf_fill_jmp32_jsge_reg(struct bpf_test *self)
1557 {
1558 	return __bpf_fill_jmp32_reg(self, BPF_JSGE);
1559 }
1560 
1561 static int bpf_fill_jmp32_jslt_reg(struct bpf_test *self)
1562 {
1563 	return __bpf_fill_jmp32_reg(self, BPF_JSLT);
1564 }
1565 
1566 static int bpf_fill_jmp32_jsle_reg(struct bpf_test *self)
1567 {
1568 	return __bpf_fill_jmp32_reg(self, BPF_JSLE);
1569 }
1570 
1571 /*
1572  * Set up a sequence of staggered jumps, forwards and backwards with
1573  * increasing offset. This tests the conversion of relative jumps to
1574  * JITed native jumps. On some architectures, for example MIPS, a large
1575  * PC-relative jump offset may overflow the immediate field of the native
1576  * conditional branch instruction, triggering a conversion to use an
1577  * absolute jump instead. Since this changes the jump offsets, another
1578  * offset computation pass is necessary, and that may in turn trigger
1579  * another branch conversion. This jump sequence is particularly nasty
1580  * in that regard.
1581  *
1582  * The sequence generation is parameterized by size and jump type.
1583  * The size must be even, and the expected result is always size + 1.
1584  * Below is an example with size=8 and result=9.
1585  *
1586  *                     ________________________Start
1587  *                     R0 = 0
1588  *                     R1 = r1
1589  *                     R2 = r2
1590  *            ,------- JMP +4 * 3______________Preamble: 4 insns
1591  * ,----------|-ind 0- if R0 != 7 JMP 8 * 3 + 1 <--------------------.
1592  * |          |        R0 = 8                                        |
1593  * |          |        JMP +7 * 3               ------------------------.
1594  * | ,--------|-----1- if R0 != 5 JMP 7 * 3 + 1 <--------------.     |  |
1595  * | |        |        R0 = 6                                  |     |  |
1596  * | |        |        JMP +5 * 3               ------------------.  |  |
1597  * | | ,------|-----2- if R0 != 3 JMP 6 * 3 + 1 <--------.     |  |  |  |
1598  * | | |      |        R0 = 4                            |     |  |  |  |
1599  * | | |      |        JMP +3 * 3               ------------.  |  |  |  |
1600  * | | | ,----|-----3- if R0 != 1 JMP 5 * 3 + 1 <--.     |  |  |  |  |  |
1601  * | | | |    |        R0 = 2                      |     |  |  |  |  |  |
1602  * | | | |    |        JMP +1 * 3               ------.  |  |  |  |  |  |
1603  * | | | | ,--t=====4> if R0 != 0 JMP 4 * 3 + 1    1  2  3  4  5  6  7  8 loc
1604  * | | | | |           R0 = 1                     -1 +2 -3 +4 -5 +6 -7 +8 off
1605  * | | | | |           JMP -2 * 3               ---'  |  |  |  |  |  |  |
1606  * | | | | | ,------5- if R0 != 2 JMP 3 * 3 + 1 <-----'  |  |  |  |  |  |
1607  * | | | | | |         R0 = 3                            |  |  |  |  |  |
1608  * | | | | | |         JMP -4 * 3               ---------'  |  |  |  |  |
1609  * | | | | | | ,----6- if R0 != 4 JMP 2 * 3 + 1 <-----------'  |  |  |  |
1610  * | | | | | | |       R0 = 5                                  |  |  |  |
1611  * | | | | | | |       JMP -6 * 3               ---------------'  |  |  |
1612  * | | | | | | | ,--7- if R0 != 6 JMP 1 * 3 + 1 <-----------------'  |  |
1613  * | | | | | | | |     R0 = 7                                        |  |
1614  * | | Error | | |     JMP -8 * 3               ---------------------'  |
1615  * | | paths | | | ,8- if R0 != 8 JMP 0 * 3 + 1 <-----------------------'
1616  * | | | | | | | | |   R0 = 9__________________Sequence: 3 * size - 1 insns
1617  * `-+-+-+-+-+-+-+-+-> EXIT____________________Return: 1 insn
1618  *
1619  */
1620 
1621 /* The maximum size parameter */
1622 #define MAX_STAGGERED_JMP_SIZE ((0x7fff / 3) & ~1)
1623 
1624 /* We use a reduced number of iterations to get a reasonable execution time */
1625 #define NR_STAGGERED_JMP_RUNS 10
1626 
1627 static int __bpf_fill_staggered_jumps(struct bpf_test *self,
1628 				      const struct bpf_insn *jmp,
1629 				      u64 r1, u64 r2)
1630 {
1631 	int size = self->test[0].result - 1;
1632 	int len = 4 + 3 * (size + 1);
1633 	struct bpf_insn *insns;
1634 	int off, ind;
1635 
1636 	insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
1637 	if (!insns)
1638 		return -ENOMEM;
1639 
1640 	/* Preamble */
1641 	insns[0] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
1642 	insns[1] = BPF_ALU64_IMM(BPF_MOV, R1, r1);
1643 	insns[2] = BPF_ALU64_IMM(BPF_MOV, R2, r2);
1644 	insns[3] = BPF_JMP_IMM(BPF_JA, 0, 0, 3 * size / 2);
1645 
1646 	/* Sequence */
1647 	for (ind = 0, off = size; ind <= size; ind++, off -= 2) {
1648 		struct bpf_insn *ins = &insns[4 + 3 * ind];
1649 		int loc;
1650 
1651 		if (off == 0)
1652 			off--;
1653 
1654 		loc = abs(off);
1655 		ins[0] = BPF_JMP_IMM(BPF_JNE, R0, loc - 1,
1656 				     3 * (size - ind) + 1);
1657 		ins[1] = BPF_ALU64_IMM(BPF_MOV, R0, loc);
1658 		ins[2] = *jmp;
1659 		ins[2].off = 3 * (off - 1);
1660 	}
1661 
1662 	/* Return */
1663 	insns[len - 1] = BPF_EXIT_INSN();
1664 
1665 	self->u.ptr.insns = insns;
1666 	self->u.ptr.len = len;
1667 
1668 	return 0;
1669 }
1670 
1671 /* 64-bit unconditional jump */
1672 static int bpf_fill_staggered_ja(struct bpf_test *self)
1673 {
1674 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JA, 0, 0, 0);
1675 
1676 	return __bpf_fill_staggered_jumps(self, &jmp, 0, 0);
1677 }
1678 
1679 /* 64-bit immediate jumps */
1680 static int bpf_fill_staggered_jeq_imm(struct bpf_test *self)
1681 {
1682 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JEQ, R1, 1234, 0);
1683 
1684 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1685 }
1686 
1687 static int bpf_fill_staggered_jne_imm(struct bpf_test *self)
1688 {
1689 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JNE, R1, 1234, 0);
1690 
1691 	return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
1692 }
1693 
1694 static int bpf_fill_staggered_jset_imm(struct bpf_test *self)
1695 {
1696 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSET, R1, 0x82, 0);
1697 
1698 	return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
1699 }
1700 
1701 static int bpf_fill_staggered_jgt_imm(struct bpf_test *self)
1702 {
1703 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGT, R1, 1234, 0);
1704 
1705 	return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
1706 }
1707 
1708 static int bpf_fill_staggered_jge_imm(struct bpf_test *self)
1709 {
1710 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGE, R1, 1234, 0);
1711 
1712 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1713 }
1714 
1715 static int bpf_fill_staggered_jlt_imm(struct bpf_test *self)
1716 {
1717 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLT, R1, 0x80000000, 0);
1718 
1719 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1720 }
1721 
1722 static int bpf_fill_staggered_jle_imm(struct bpf_test *self)
1723 {
1724 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLE, R1, 1234, 0);
1725 
1726 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1727 }
1728 
1729 static int bpf_fill_staggered_jsgt_imm(struct bpf_test *self)
1730 {
1731 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGT, R1, -2, 0);
1732 
1733 	return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
1734 }
1735 
1736 static int bpf_fill_staggered_jsge_imm(struct bpf_test *self)
1737 {
1738 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGE, R1, -2, 0);
1739 
1740 	return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
1741 }
1742 
1743 static int bpf_fill_staggered_jslt_imm(struct bpf_test *self)
1744 {
1745 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLT, R1, -1, 0);
1746 
1747 	return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
1748 }
1749 
1750 static int bpf_fill_staggered_jsle_imm(struct bpf_test *self)
1751 {
1752 	struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLE, R1, -1, 0);
1753 
1754 	return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
1755 }
1756 
1757 /* 64-bit register jumps */
1758 static int bpf_fill_staggered_jeq_reg(struct bpf_test *self)
1759 {
1760 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JEQ, R1, R2, 0);
1761 
1762 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
1763 }
1764 
1765 static int bpf_fill_staggered_jne_reg(struct bpf_test *self)
1766 {
1767 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JNE, R1, R2, 0);
1768 
1769 	return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
1770 }
1771 
1772 static int bpf_fill_staggered_jset_reg(struct bpf_test *self)
1773 {
1774 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JSET, R1, R2, 0);
1775 
1776 	return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
1777 }
1778 
1779 static int bpf_fill_staggered_jgt_reg(struct bpf_test *self)
1780 {
1781 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JGT, R1, R2, 0);
1782 
1783 	return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
1784 }
1785 
1786 static int bpf_fill_staggered_jge_reg(struct bpf_test *self)
1787 {
1788 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JGE, R1, R2, 0);
1789 
1790 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
1791 }
1792 
1793 static int bpf_fill_staggered_jlt_reg(struct bpf_test *self)
1794 {
1795 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JLT, R1, R2, 0);
1796 
1797 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
1798 }
1799 
1800 static int bpf_fill_staggered_jle_reg(struct bpf_test *self)
1801 {
1802 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JLE, R1, R2, 0);
1803 
1804 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
1805 }
1806 
1807 static int bpf_fill_staggered_jsgt_reg(struct bpf_test *self)
1808 {
1809 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGT, R1, R2, 0);
1810 
1811 	return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
1812 }
1813 
1814 static int bpf_fill_staggered_jsge_reg(struct bpf_test *self)
1815 {
1816 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGE, R1, R2, 0);
1817 
1818 	return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
1819 }
1820 
1821 static int bpf_fill_staggered_jslt_reg(struct bpf_test *self)
1822 {
1823 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLT, R1, R2, 0);
1824 
1825 	return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
1826 }
1827 
1828 static int bpf_fill_staggered_jsle_reg(struct bpf_test *self)
1829 {
1830 	struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLE, R1, R2, 0);
1831 
1832 	return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
1833 }
1834 
1835 /* 32-bit immediate jumps */
1836 static int bpf_fill_staggered_jeq32_imm(struct bpf_test *self)
1837 {
1838 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JEQ, R1, 1234, 0);
1839 
1840 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1841 }
1842 
1843 static int bpf_fill_staggered_jne32_imm(struct bpf_test *self)
1844 {
1845 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JNE, R1, 1234, 0);
1846 
1847 	return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
1848 }
1849 
1850 static int bpf_fill_staggered_jset32_imm(struct bpf_test *self)
1851 {
1852 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSET, R1, 0x82, 0);
1853 
1854 	return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
1855 }
1856 
1857 static int bpf_fill_staggered_jgt32_imm(struct bpf_test *self)
1858 {
1859 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGT, R1, 1234, 0);
1860 
1861 	return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
1862 }
1863 
1864 static int bpf_fill_staggered_jge32_imm(struct bpf_test *self)
1865 {
1866 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGE, R1, 1234, 0);
1867 
1868 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1869 }
1870 
1871 static int bpf_fill_staggered_jlt32_imm(struct bpf_test *self)
1872 {
1873 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLT, R1, 0x80000000, 0);
1874 
1875 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1876 }
1877 
1878 static int bpf_fill_staggered_jle32_imm(struct bpf_test *self)
1879 {
1880 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLE, R1, 1234, 0);
1881 
1882 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
1883 }
1884 
1885 static int bpf_fill_staggered_jsgt32_imm(struct bpf_test *self)
1886 {
1887 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGT, R1, -2, 0);
1888 
1889 	return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
1890 }
1891 
1892 static int bpf_fill_staggered_jsge32_imm(struct bpf_test *self)
1893 {
1894 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGE, R1, -2, 0);
1895 
1896 	return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
1897 }
1898 
1899 static int bpf_fill_staggered_jslt32_imm(struct bpf_test *self)
1900 {
1901 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLT, R1, -1, 0);
1902 
1903 	return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
1904 }
1905 
1906 static int bpf_fill_staggered_jsle32_imm(struct bpf_test *self)
1907 {
1908 	struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLE, R1, -1, 0);
1909 
1910 	return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
1911 }
1912 
1913 /* 32-bit register jumps */
1914 static int bpf_fill_staggered_jeq32_reg(struct bpf_test *self)
1915 {
1916 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JEQ, R1, R2, 0);
1917 
1918 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
1919 }
1920 
1921 static int bpf_fill_staggered_jne32_reg(struct bpf_test *self)
1922 {
1923 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JNE, R1, R2, 0);
1924 
1925 	return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
1926 }
1927 
1928 static int bpf_fill_staggered_jset32_reg(struct bpf_test *self)
1929 {
1930 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSET, R1, R2, 0);
1931 
1932 	return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
1933 }
1934 
1935 static int bpf_fill_staggered_jgt32_reg(struct bpf_test *self)
1936 {
1937 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGT, R1, R2, 0);
1938 
1939 	return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
1940 }
1941 
1942 static int bpf_fill_staggered_jge32_reg(struct bpf_test *self)
1943 {
1944 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGE, R1, R2, 0);
1945 
1946 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
1947 }
1948 
1949 static int bpf_fill_staggered_jlt32_reg(struct bpf_test *self)
1950 {
1951 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLT, R1, R2, 0);
1952 
1953 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
1954 }
1955 
1956 static int bpf_fill_staggered_jle32_reg(struct bpf_test *self)
1957 {
1958 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLE, R1, R2, 0);
1959 
1960 	return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
1961 }
1962 
1963 static int bpf_fill_staggered_jsgt32_reg(struct bpf_test *self)
1964 {
1965 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGT, R1, R2, 0);
1966 
1967 	return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
1968 }
1969 
1970 static int bpf_fill_staggered_jsge32_reg(struct bpf_test *self)
1971 {
1972 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGE, R1, R2, 0);
1973 
1974 	return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
1975 }
1976 
1977 static int bpf_fill_staggered_jslt32_reg(struct bpf_test *self)
1978 {
1979 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLT, R1, R2, 0);
1980 
1981 	return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
1982 }
1983 
1984 static int bpf_fill_staggered_jsle32_reg(struct bpf_test *self)
1985 {
1986 	struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLE, R1, R2, 0);
1987 
1988 	return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
1989 }
1990 
1991 
1992 static struct bpf_test tests[] = {
1993 	{
1994 		"TAX",
1995 		.u.insns = {
1996 			BPF_STMT(BPF_LD | BPF_IMM, 1),
1997 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1998 			BPF_STMT(BPF_LD | BPF_IMM, 2),
1999 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2000 			BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
2001 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2002 			BPF_STMT(BPF_LD | BPF_LEN, 0),
2003 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2004 			BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
2005 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
2006 			BPF_STMT(BPF_RET | BPF_A, 0)
2007 		},
2008 		CLASSIC,
2009 		{ 10, 20, 30, 40, 50 },
2010 		{ { 2, 10 }, { 3, 20 }, { 4, 30 } },
2011 	},
2012 	{
2013 		"TXA",
2014 		.u.insns = {
2015 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2016 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2017 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2018 			BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
2019 		},
2020 		CLASSIC,
2021 		{ 10, 20, 30, 40, 50 },
2022 		{ { 1, 2 }, { 3, 6 }, { 4, 8 } },
2023 	},
2024 	{
2025 		"ADD_SUB_MUL_K",
2026 		.u.insns = {
2027 			BPF_STMT(BPF_LD | BPF_IMM, 1),
2028 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
2029 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
2030 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
2031 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
2032 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
2033 			BPF_STMT(BPF_RET | BPF_A, 0)
2034 		},
2035 		CLASSIC | FLAG_NO_DATA,
2036 		{ },
2037 		{ { 0, 0xfffffffd } }
2038 	},
2039 	{
2040 		"DIV_MOD_KX",
2041 		.u.insns = {
2042 			BPF_STMT(BPF_LD | BPF_IMM, 8),
2043 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
2044 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2045 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
2046 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
2047 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2048 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
2049 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
2050 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2051 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
2052 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
2053 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2054 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
2055 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
2056 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2057 			BPF_STMT(BPF_RET | BPF_A, 0)
2058 		},
2059 		CLASSIC | FLAG_NO_DATA,
2060 		{ },
2061 		{ { 0, 0x20000000 } }
2062 	},
2063 	{
2064 		"AND_OR_LSH_K",
2065 		.u.insns = {
2066 			BPF_STMT(BPF_LD | BPF_IMM, 0xff),
2067 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
2068 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
2069 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2070 			BPF_STMT(BPF_LD | BPF_IMM, 0xf),
2071 			BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
2072 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2073 			BPF_STMT(BPF_RET | BPF_A, 0)
2074 		},
2075 		CLASSIC | FLAG_NO_DATA,
2076 		{ },
2077 		{ { 0, 0x800000ff }, { 1, 0x800000ff } },
2078 	},
2079 	{
2080 		"LD_IMM_0",
2081 		.u.insns = {
2082 			BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
2083 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
2084 			BPF_STMT(BPF_RET | BPF_K, 0),
2085 			BPF_STMT(BPF_RET | BPF_K, 1),
2086 		},
2087 		CLASSIC,
2088 		{ },
2089 		{ { 1, 1 } },
2090 	},
2091 	{
2092 		"LD_IND",
2093 		.u.insns = {
2094 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2095 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
2096 			BPF_STMT(BPF_RET | BPF_K, 1)
2097 		},
2098 		CLASSIC,
2099 		{ },
2100 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
2101 	},
2102 	{
2103 		"LD_ABS",
2104 		.u.insns = {
2105 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
2106 			BPF_STMT(BPF_RET | BPF_K, 1)
2107 		},
2108 		CLASSIC,
2109 		{ },
2110 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
2111 	},
2112 	{
2113 		"LD_ABS_LL",
2114 		.u.insns = {
2115 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
2116 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2117 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
2118 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2119 			BPF_STMT(BPF_RET | BPF_A, 0)
2120 		},
2121 		CLASSIC,
2122 		{ 1, 2, 3 },
2123 		{ { 1, 0 }, { 2, 3 } },
2124 	},
2125 	{
2126 		"LD_IND_LL",
2127 		.u.insns = {
2128 			BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
2129 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2130 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2131 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2132 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
2133 			BPF_STMT(BPF_RET | BPF_A, 0)
2134 		},
2135 		CLASSIC,
2136 		{ 1, 2, 3, 0xff },
2137 		{ { 1, 1 }, { 3, 3 }, { 4, 0xff } },
2138 	},
2139 	{
2140 		"LD_ABS_NET",
2141 		.u.insns = {
2142 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
2143 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2144 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
2145 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2146 			BPF_STMT(BPF_RET | BPF_A, 0)
2147 		},
2148 		CLASSIC,
2149 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
2150 		{ { 15, 0 }, { 16, 3 } },
2151 	},
2152 	{
2153 		"LD_IND_NET",
2154 		.u.insns = {
2155 			BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
2156 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2157 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2158 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2159 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
2160 			BPF_STMT(BPF_RET | BPF_A, 0)
2161 		},
2162 		CLASSIC,
2163 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
2164 		{ { 14, 0 }, { 15, 1 }, { 17, 3 } },
2165 	},
2166 	{
2167 		"LD_PKTTYPE",
2168 		.u.insns = {
2169 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2170 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
2171 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
2172 			BPF_STMT(BPF_RET | BPF_K, 1),
2173 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2174 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
2175 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
2176 			BPF_STMT(BPF_RET | BPF_K, 1),
2177 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2178 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
2179 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
2180 			BPF_STMT(BPF_RET | BPF_K, 1),
2181 			BPF_STMT(BPF_RET | BPF_A, 0)
2182 		},
2183 		CLASSIC,
2184 		{ },
2185 		{ { 1, 3 }, { 10, 3 } },
2186 	},
2187 	{
2188 		"LD_MARK",
2189 		.u.insns = {
2190 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2191 				 SKF_AD_OFF + SKF_AD_MARK),
2192 			BPF_STMT(BPF_RET | BPF_A, 0)
2193 		},
2194 		CLASSIC,
2195 		{ },
2196 		{ { 1, SKB_MARK}, { 10, SKB_MARK} },
2197 	},
2198 	{
2199 		"LD_RXHASH",
2200 		.u.insns = {
2201 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2202 				 SKF_AD_OFF + SKF_AD_RXHASH),
2203 			BPF_STMT(BPF_RET | BPF_A, 0)
2204 		},
2205 		CLASSIC,
2206 		{ },
2207 		{ { 1, SKB_HASH}, { 10, SKB_HASH} },
2208 	},
2209 	{
2210 		"LD_QUEUE",
2211 		.u.insns = {
2212 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2213 				 SKF_AD_OFF + SKF_AD_QUEUE),
2214 			BPF_STMT(BPF_RET | BPF_A, 0)
2215 		},
2216 		CLASSIC,
2217 		{ },
2218 		{ { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
2219 	},
2220 	{
2221 		"LD_PROTOCOL",
2222 		.u.insns = {
2223 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
2224 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
2225 			BPF_STMT(BPF_RET | BPF_K, 0),
2226 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2227 				 SKF_AD_OFF + SKF_AD_PROTOCOL),
2228 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2229 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
2230 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
2231 			BPF_STMT(BPF_RET | BPF_K, 0),
2232 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2233 			BPF_STMT(BPF_RET | BPF_A, 0)
2234 		},
2235 		CLASSIC,
2236 		{ 10, 20, 30 },
2237 		{ { 10, ETH_P_IP }, { 100, ETH_P_IP } },
2238 	},
2239 	{
2240 		"LD_VLAN_TAG",
2241 		.u.insns = {
2242 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2243 				 SKF_AD_OFF + SKF_AD_VLAN_TAG),
2244 			BPF_STMT(BPF_RET | BPF_A, 0)
2245 		},
2246 		CLASSIC,
2247 		{ },
2248 		{
2249 			{ 1, SKB_VLAN_TCI },
2250 			{ 10, SKB_VLAN_TCI }
2251 		},
2252 	},
2253 	{
2254 		"LD_VLAN_TAG_PRESENT",
2255 		.u.insns = {
2256 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2257 				 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
2258 			BPF_STMT(BPF_RET | BPF_A, 0)
2259 		},
2260 		CLASSIC,
2261 		{ },
2262 		{
2263 			{ 1, SKB_VLAN_PRESENT },
2264 			{ 10, SKB_VLAN_PRESENT }
2265 		},
2266 	},
2267 	{
2268 		"LD_IFINDEX",
2269 		.u.insns = {
2270 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2271 				 SKF_AD_OFF + SKF_AD_IFINDEX),
2272 			BPF_STMT(BPF_RET | BPF_A, 0)
2273 		},
2274 		CLASSIC,
2275 		{ },
2276 		{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
2277 	},
2278 	{
2279 		"LD_HATYPE",
2280 		.u.insns = {
2281 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2282 				 SKF_AD_OFF + SKF_AD_HATYPE),
2283 			BPF_STMT(BPF_RET | BPF_A, 0)
2284 		},
2285 		CLASSIC,
2286 		{ },
2287 		{ { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
2288 	},
2289 	{
2290 		"LD_CPU",
2291 		.u.insns = {
2292 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2293 				 SKF_AD_OFF + SKF_AD_CPU),
2294 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2295 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2296 				 SKF_AD_OFF + SKF_AD_CPU),
2297 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
2298 			BPF_STMT(BPF_RET | BPF_A, 0)
2299 		},
2300 		CLASSIC,
2301 		{ },
2302 		{ { 1, 0 }, { 10, 0 } },
2303 	},
2304 	{
2305 		"LD_NLATTR",
2306 		.u.insns = {
2307 			BPF_STMT(BPF_LDX | BPF_IMM, 2),
2308 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2309 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
2310 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2311 				 SKF_AD_OFF + SKF_AD_NLATTR),
2312 			BPF_STMT(BPF_RET | BPF_A, 0)
2313 		},
2314 		CLASSIC,
2315 #ifdef __BIG_ENDIAN
2316 		{ 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
2317 #else
2318 		{ 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
2319 #endif
2320 		{ { 4, 0 }, { 20, 6 } },
2321 	},
2322 	{
2323 		"LD_NLATTR_NEST",
2324 		.u.insns = {
2325 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2326 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
2327 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2328 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2329 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2330 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2331 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2332 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2333 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2334 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2335 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2336 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2337 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2338 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2339 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2340 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2341 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2342 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2343 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2344 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2345 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2346 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2347 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2348 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2349 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
2350 			BPF_STMT(BPF_RET | BPF_A, 0)
2351 		},
2352 		CLASSIC,
2353 #ifdef __BIG_ENDIAN
2354 		{ 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
2355 #else
2356 		{ 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
2357 #endif
2358 		{ { 4, 0 }, { 20, 10 } },
2359 	},
2360 	{
2361 		"LD_PAYLOAD_OFF",
2362 		.u.insns = {
2363 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2364 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
2365 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2366 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
2367 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2368 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
2369 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2370 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
2371 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2372 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
2373 			BPF_STMT(BPF_RET | BPF_A, 0)
2374 		},
2375 		CLASSIC,
2376 		/* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
2377 		 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
2378 		 * id 9737, seq 1, length 64
2379 		 */
2380 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2381 		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2382 		  0x08, 0x00,
2383 		  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
2384 		  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
2385 		{ { 30, 0 }, { 100, 42 } },
2386 	},
2387 	{
2388 		"LD_ANC_XOR",
2389 		.u.insns = {
2390 			BPF_STMT(BPF_LD | BPF_IMM, 10),
2391 			BPF_STMT(BPF_LDX | BPF_IMM, 300),
2392 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2393 				 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
2394 			BPF_STMT(BPF_RET | BPF_A, 0)
2395 		},
2396 		CLASSIC,
2397 		{ },
2398 		{ { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } },
2399 	},
2400 	{
2401 		"SPILL_FILL",
2402 		.u.insns = {
2403 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2404 			BPF_STMT(BPF_LD | BPF_IMM, 2),
2405 			BPF_STMT(BPF_ALU | BPF_RSH, 1),
2406 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
2407 			BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
2408 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
2409 			BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
2410 			BPF_STMT(BPF_STX, 15), /* M3 = len */
2411 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2412 			BPF_STMT(BPF_LD | BPF_MEM, 2),
2413 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
2414 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2415 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
2416 			BPF_STMT(BPF_RET | BPF_A, 0)
2417 		},
2418 		CLASSIC,
2419 		{ },
2420 		{ { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
2421 	},
2422 	{
2423 		"JEQ",
2424 		.u.insns = {
2425 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2426 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
2427 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
2428 			BPF_STMT(BPF_RET | BPF_K, 1),
2429 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
2430 		},
2431 		CLASSIC,
2432 		{ 3, 3, 3, 3, 3 },
2433 		{ { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
2434 	},
2435 	{
2436 		"JGT",
2437 		.u.insns = {
2438 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2439 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
2440 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
2441 			BPF_STMT(BPF_RET | BPF_K, 1),
2442 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
2443 		},
2444 		CLASSIC,
2445 		{ 4, 4, 4, 3, 3 },
2446 		{ { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
2447 	},
2448 	{
2449 		"JGE (jt 0), test 1",
2450 		.u.insns = {
2451 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2452 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
2453 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
2454 			BPF_STMT(BPF_RET | BPF_K, 1),
2455 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
2456 		},
2457 		CLASSIC,
2458 		{ 4, 4, 4, 3, 3 },
2459 		{ { 2, 0 }, { 3, 1 }, { 4, 1 } },
2460 	},
2461 	{
2462 		"JGE (jt 0), test 2",
2463 		.u.insns = {
2464 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2465 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
2466 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
2467 			BPF_STMT(BPF_RET | BPF_K, 1),
2468 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
2469 		},
2470 		CLASSIC,
2471 		{ 4, 4, 5, 3, 3 },
2472 		{ { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
2473 	},
2474 	{
2475 		"JGE",
2476 		.u.insns = {
2477 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2478 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
2479 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
2480 			BPF_STMT(BPF_RET | BPF_K, 10),
2481 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
2482 			BPF_STMT(BPF_RET | BPF_K, 20),
2483 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
2484 			BPF_STMT(BPF_RET | BPF_K, 30),
2485 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
2486 			BPF_STMT(BPF_RET | BPF_K, 40),
2487 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
2488 		},
2489 		CLASSIC,
2490 		{ 1, 2, 3, 4, 5 },
2491 		{ { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
2492 	},
2493 	{
2494 		"JSET",
2495 		.u.insns = {
2496 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
2497 			BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
2498 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
2499 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
2500 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
2501 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2502 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
2503 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2504 			BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
2505 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
2506 			BPF_STMT(BPF_RET | BPF_K, 10),
2507 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
2508 			BPF_STMT(BPF_RET | BPF_K, 20),
2509 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
2510 			BPF_STMT(BPF_RET | BPF_K, 30),
2511 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
2512 			BPF_STMT(BPF_RET | BPF_K, 30),
2513 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
2514 			BPF_STMT(BPF_RET | BPF_K, 30),
2515 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
2516 			BPF_STMT(BPF_RET | BPF_K, 30),
2517 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
2518 			BPF_STMT(BPF_RET | BPF_K, 30),
2519 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
2520 		},
2521 		CLASSIC,
2522 		{ 0, 0xAA, 0x55, 1 },
2523 		{ { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
2524 	},
2525 	{
2526 		"tcpdump port 22",
2527 		.u.insns = {
2528 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
2529 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
2530 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
2531 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
2532 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
2533 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
2534 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
2535 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
2536 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
2537 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
2538 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
2539 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
2540 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
2541 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
2542 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
2543 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
2544 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
2545 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
2546 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
2547 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
2548 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
2549 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
2550 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
2551 			BPF_STMT(BPF_RET | BPF_K, 0),
2552 		},
2553 		CLASSIC,
2554 		/* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
2555 		 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
2556 		 * seq 1305692979:1305693027, ack 3650467037, win 65535,
2557 		 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
2558 		 */
2559 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
2560 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
2561 		  0x08, 0x00,
2562 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
2563 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
2564 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
2565 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
2566 		  0xc2, 0x24,
2567 		  0x00, 0x16 /* dst port */ },
2568 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
2569 	},
2570 	{
2571 		"tcpdump complex",
2572 		.u.insns = {
2573 			/* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
2574 			 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
2575 			 * (len > 115 or len < 30000000000)' -d
2576 			 */
2577 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
2578 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
2579 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
2580 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
2581 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
2582 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
2583 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
2584 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
2585 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
2586 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
2587 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
2588 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
2589 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
2590 			BPF_STMT(BPF_ST, 1),
2591 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
2592 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
2593 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
2594 			BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
2595 			BPF_STMT(BPF_LD | BPF_MEM, 1),
2596 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
2597 			BPF_STMT(BPF_ST, 5),
2598 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
2599 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
2600 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
2601 			BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
2602 			BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
2603 			BPF_STMT(BPF_LD | BPF_MEM, 5),
2604 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
2605 			BPF_STMT(BPF_LD | BPF_LEN, 0),
2606 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
2607 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
2608 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
2609 			BPF_STMT(BPF_RET | BPF_K, 0),
2610 		},
2611 		CLASSIC,
2612 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
2613 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
2614 		  0x08, 0x00,
2615 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
2616 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
2617 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
2618 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
2619 		  0xc2, 0x24,
2620 		  0x00, 0x16 /* dst port */ },
2621 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
2622 	},
2623 	{
2624 		"RET_A",
2625 		.u.insns = {
2626 			/* check that uninitialized X and A contain zeros */
2627 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2628 			BPF_STMT(BPF_RET | BPF_A, 0)
2629 		},
2630 		CLASSIC,
2631 		{ },
2632 		{ {1, 0}, {2, 0} },
2633 	},
2634 	{
2635 		"INT: ADD trivial",
2636 		.u.insns_int = {
2637 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
2638 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
2639 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
2640 			BPF_ALU64_REG(BPF_SUB, R1, R2),
2641 			BPF_ALU64_IMM(BPF_ADD, R1, -1),
2642 			BPF_ALU64_IMM(BPF_MUL, R1, 3),
2643 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2644 			BPF_EXIT_INSN(),
2645 		},
2646 		INTERNAL,
2647 		{ },
2648 		{ { 0, 0xfffffffd } }
2649 	},
2650 	{
2651 		"INT: MUL_X",
2652 		.u.insns_int = {
2653 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
2654 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
2655 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
2656 			BPF_ALU64_REG(BPF_MUL, R1, R2),
2657 			BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
2658 			BPF_EXIT_INSN(),
2659 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
2660 			BPF_EXIT_INSN(),
2661 		},
2662 		INTERNAL,
2663 		{ },
2664 		{ { 0, 1 } }
2665 	},
2666 	{
2667 		"INT: MUL_X2",
2668 		.u.insns_int = {
2669 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
2670 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
2671 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
2672 			BPF_ALU64_REG(BPF_MUL, R1, R2),
2673 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
2674 			BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
2675 			BPF_EXIT_INSN(),
2676 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2677 			BPF_EXIT_INSN(),
2678 		},
2679 		INTERNAL,
2680 		{ },
2681 		{ { 0, 1 } }
2682 	},
2683 	{
2684 		"INT: MUL32_X",
2685 		.u.insns_int = {
2686 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
2687 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
2688 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
2689 			BPF_ALU32_REG(BPF_MUL, R1, R2),
2690 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
2691 			BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
2692 			BPF_EXIT_INSN(),
2693 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2694 			BPF_EXIT_INSN(),
2695 		},
2696 		INTERNAL,
2697 		{ },
2698 		{ { 0, 1 } }
2699 	},
2700 	{
2701 		/* Have to test all register combinations, since
2702 		 * JITing of different registers will produce
2703 		 * different asm code.
2704 		 */
2705 		"INT: ADD 64-bit",
2706 		.u.insns_int = {
2707 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
2708 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
2709 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
2710 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
2711 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
2712 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
2713 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
2714 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
2715 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
2716 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
2717 			BPF_ALU64_IMM(BPF_ADD, R0, 20),
2718 			BPF_ALU64_IMM(BPF_ADD, R1, 20),
2719 			BPF_ALU64_IMM(BPF_ADD, R2, 20),
2720 			BPF_ALU64_IMM(BPF_ADD, R3, 20),
2721 			BPF_ALU64_IMM(BPF_ADD, R4, 20),
2722 			BPF_ALU64_IMM(BPF_ADD, R5, 20),
2723 			BPF_ALU64_IMM(BPF_ADD, R6, 20),
2724 			BPF_ALU64_IMM(BPF_ADD, R7, 20),
2725 			BPF_ALU64_IMM(BPF_ADD, R8, 20),
2726 			BPF_ALU64_IMM(BPF_ADD, R9, 20),
2727 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
2728 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
2729 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
2730 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
2731 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
2732 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
2733 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
2734 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
2735 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
2736 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
2737 			BPF_ALU64_REG(BPF_ADD, R0, R0),
2738 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2739 			BPF_ALU64_REG(BPF_ADD, R0, R2),
2740 			BPF_ALU64_REG(BPF_ADD, R0, R3),
2741 			BPF_ALU64_REG(BPF_ADD, R0, R4),
2742 			BPF_ALU64_REG(BPF_ADD, R0, R5),
2743 			BPF_ALU64_REG(BPF_ADD, R0, R6),
2744 			BPF_ALU64_REG(BPF_ADD, R0, R7),
2745 			BPF_ALU64_REG(BPF_ADD, R0, R8),
2746 			BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
2747 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
2748 			BPF_EXIT_INSN(),
2749 			BPF_ALU64_REG(BPF_ADD, R1, R0),
2750 			BPF_ALU64_REG(BPF_ADD, R1, R1),
2751 			BPF_ALU64_REG(BPF_ADD, R1, R2),
2752 			BPF_ALU64_REG(BPF_ADD, R1, R3),
2753 			BPF_ALU64_REG(BPF_ADD, R1, R4),
2754 			BPF_ALU64_REG(BPF_ADD, R1, R5),
2755 			BPF_ALU64_REG(BPF_ADD, R1, R6),
2756 			BPF_ALU64_REG(BPF_ADD, R1, R7),
2757 			BPF_ALU64_REG(BPF_ADD, R1, R8),
2758 			BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
2759 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
2760 			BPF_EXIT_INSN(),
2761 			BPF_ALU64_REG(BPF_ADD, R2, R0),
2762 			BPF_ALU64_REG(BPF_ADD, R2, R1),
2763 			BPF_ALU64_REG(BPF_ADD, R2, R2),
2764 			BPF_ALU64_REG(BPF_ADD, R2, R3),
2765 			BPF_ALU64_REG(BPF_ADD, R2, R4),
2766 			BPF_ALU64_REG(BPF_ADD, R2, R5),
2767 			BPF_ALU64_REG(BPF_ADD, R2, R6),
2768 			BPF_ALU64_REG(BPF_ADD, R2, R7),
2769 			BPF_ALU64_REG(BPF_ADD, R2, R8),
2770 			BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
2771 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
2772 			BPF_EXIT_INSN(),
2773 			BPF_ALU64_REG(BPF_ADD, R3, R0),
2774 			BPF_ALU64_REG(BPF_ADD, R3, R1),
2775 			BPF_ALU64_REG(BPF_ADD, R3, R2),
2776 			BPF_ALU64_REG(BPF_ADD, R3, R3),
2777 			BPF_ALU64_REG(BPF_ADD, R3, R4),
2778 			BPF_ALU64_REG(BPF_ADD, R3, R5),
2779 			BPF_ALU64_REG(BPF_ADD, R3, R6),
2780 			BPF_ALU64_REG(BPF_ADD, R3, R7),
2781 			BPF_ALU64_REG(BPF_ADD, R3, R8),
2782 			BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
2783 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
2784 			BPF_EXIT_INSN(),
2785 			BPF_ALU64_REG(BPF_ADD, R4, R0),
2786 			BPF_ALU64_REG(BPF_ADD, R4, R1),
2787 			BPF_ALU64_REG(BPF_ADD, R4, R2),
2788 			BPF_ALU64_REG(BPF_ADD, R4, R3),
2789 			BPF_ALU64_REG(BPF_ADD, R4, R4),
2790 			BPF_ALU64_REG(BPF_ADD, R4, R5),
2791 			BPF_ALU64_REG(BPF_ADD, R4, R6),
2792 			BPF_ALU64_REG(BPF_ADD, R4, R7),
2793 			BPF_ALU64_REG(BPF_ADD, R4, R8),
2794 			BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
2795 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
2796 			BPF_EXIT_INSN(),
2797 			BPF_ALU64_REG(BPF_ADD, R5, R0),
2798 			BPF_ALU64_REG(BPF_ADD, R5, R1),
2799 			BPF_ALU64_REG(BPF_ADD, R5, R2),
2800 			BPF_ALU64_REG(BPF_ADD, R5, R3),
2801 			BPF_ALU64_REG(BPF_ADD, R5, R4),
2802 			BPF_ALU64_REG(BPF_ADD, R5, R5),
2803 			BPF_ALU64_REG(BPF_ADD, R5, R6),
2804 			BPF_ALU64_REG(BPF_ADD, R5, R7),
2805 			BPF_ALU64_REG(BPF_ADD, R5, R8),
2806 			BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
2807 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
2808 			BPF_EXIT_INSN(),
2809 			BPF_ALU64_REG(BPF_ADD, R6, R0),
2810 			BPF_ALU64_REG(BPF_ADD, R6, R1),
2811 			BPF_ALU64_REG(BPF_ADD, R6, R2),
2812 			BPF_ALU64_REG(BPF_ADD, R6, R3),
2813 			BPF_ALU64_REG(BPF_ADD, R6, R4),
2814 			BPF_ALU64_REG(BPF_ADD, R6, R5),
2815 			BPF_ALU64_REG(BPF_ADD, R6, R6),
2816 			BPF_ALU64_REG(BPF_ADD, R6, R7),
2817 			BPF_ALU64_REG(BPF_ADD, R6, R8),
2818 			BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
2819 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
2820 			BPF_EXIT_INSN(),
2821 			BPF_ALU64_REG(BPF_ADD, R7, R0),
2822 			BPF_ALU64_REG(BPF_ADD, R7, R1),
2823 			BPF_ALU64_REG(BPF_ADD, R7, R2),
2824 			BPF_ALU64_REG(BPF_ADD, R7, R3),
2825 			BPF_ALU64_REG(BPF_ADD, R7, R4),
2826 			BPF_ALU64_REG(BPF_ADD, R7, R5),
2827 			BPF_ALU64_REG(BPF_ADD, R7, R6),
2828 			BPF_ALU64_REG(BPF_ADD, R7, R7),
2829 			BPF_ALU64_REG(BPF_ADD, R7, R8),
2830 			BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
2831 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
2832 			BPF_EXIT_INSN(),
2833 			BPF_ALU64_REG(BPF_ADD, R8, R0),
2834 			BPF_ALU64_REG(BPF_ADD, R8, R1),
2835 			BPF_ALU64_REG(BPF_ADD, R8, R2),
2836 			BPF_ALU64_REG(BPF_ADD, R8, R3),
2837 			BPF_ALU64_REG(BPF_ADD, R8, R4),
2838 			BPF_ALU64_REG(BPF_ADD, R8, R5),
2839 			BPF_ALU64_REG(BPF_ADD, R8, R6),
2840 			BPF_ALU64_REG(BPF_ADD, R8, R7),
2841 			BPF_ALU64_REG(BPF_ADD, R8, R8),
2842 			BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
2843 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
2844 			BPF_EXIT_INSN(),
2845 			BPF_ALU64_REG(BPF_ADD, R9, R0),
2846 			BPF_ALU64_REG(BPF_ADD, R9, R1),
2847 			BPF_ALU64_REG(BPF_ADD, R9, R2),
2848 			BPF_ALU64_REG(BPF_ADD, R9, R3),
2849 			BPF_ALU64_REG(BPF_ADD, R9, R4),
2850 			BPF_ALU64_REG(BPF_ADD, R9, R5),
2851 			BPF_ALU64_REG(BPF_ADD, R9, R6),
2852 			BPF_ALU64_REG(BPF_ADD, R9, R7),
2853 			BPF_ALU64_REG(BPF_ADD, R9, R8),
2854 			BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
2855 			BPF_ALU64_REG(BPF_MOV, R0, R9),
2856 			BPF_EXIT_INSN(),
2857 		},
2858 		INTERNAL,
2859 		{ },
2860 		{ { 0, 2957380 } }
2861 	},
2862 	{
2863 		"INT: ADD 32-bit",
2864 		.u.insns_int = {
2865 			BPF_ALU32_IMM(BPF_MOV, R0, 20),
2866 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2867 			BPF_ALU32_IMM(BPF_MOV, R2, 2),
2868 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
2869 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
2870 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
2871 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
2872 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
2873 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
2874 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
2875 			BPF_ALU64_IMM(BPF_ADD, R1, 10),
2876 			BPF_ALU64_IMM(BPF_ADD, R2, 10),
2877 			BPF_ALU64_IMM(BPF_ADD, R3, 10),
2878 			BPF_ALU64_IMM(BPF_ADD, R4, 10),
2879 			BPF_ALU64_IMM(BPF_ADD, R5, 10),
2880 			BPF_ALU64_IMM(BPF_ADD, R6, 10),
2881 			BPF_ALU64_IMM(BPF_ADD, R7, 10),
2882 			BPF_ALU64_IMM(BPF_ADD, R8, 10),
2883 			BPF_ALU64_IMM(BPF_ADD, R9, 10),
2884 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2885 			BPF_ALU32_REG(BPF_ADD, R0, R2),
2886 			BPF_ALU32_REG(BPF_ADD, R0, R3),
2887 			BPF_ALU32_REG(BPF_ADD, R0, R4),
2888 			BPF_ALU32_REG(BPF_ADD, R0, R5),
2889 			BPF_ALU32_REG(BPF_ADD, R0, R6),
2890 			BPF_ALU32_REG(BPF_ADD, R0, R7),
2891 			BPF_ALU32_REG(BPF_ADD, R0, R8),
2892 			BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
2893 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
2894 			BPF_EXIT_INSN(),
2895 			BPF_ALU32_REG(BPF_ADD, R1, R0),
2896 			BPF_ALU32_REG(BPF_ADD, R1, R1),
2897 			BPF_ALU32_REG(BPF_ADD, R1, R2),
2898 			BPF_ALU32_REG(BPF_ADD, R1, R3),
2899 			BPF_ALU32_REG(BPF_ADD, R1, R4),
2900 			BPF_ALU32_REG(BPF_ADD, R1, R5),
2901 			BPF_ALU32_REG(BPF_ADD, R1, R6),
2902 			BPF_ALU32_REG(BPF_ADD, R1, R7),
2903 			BPF_ALU32_REG(BPF_ADD, R1, R8),
2904 			BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
2905 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
2906 			BPF_EXIT_INSN(),
2907 			BPF_ALU32_REG(BPF_ADD, R2, R0),
2908 			BPF_ALU32_REG(BPF_ADD, R2, R1),
2909 			BPF_ALU32_REG(BPF_ADD, R2, R2),
2910 			BPF_ALU32_REG(BPF_ADD, R2, R3),
2911 			BPF_ALU32_REG(BPF_ADD, R2, R4),
2912 			BPF_ALU32_REG(BPF_ADD, R2, R5),
2913 			BPF_ALU32_REG(BPF_ADD, R2, R6),
2914 			BPF_ALU32_REG(BPF_ADD, R2, R7),
2915 			BPF_ALU32_REG(BPF_ADD, R2, R8),
2916 			BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
2917 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
2918 			BPF_EXIT_INSN(),
2919 			BPF_ALU32_REG(BPF_ADD, R3, R0),
2920 			BPF_ALU32_REG(BPF_ADD, R3, R1),
2921 			BPF_ALU32_REG(BPF_ADD, R3, R2),
2922 			BPF_ALU32_REG(BPF_ADD, R3, R3),
2923 			BPF_ALU32_REG(BPF_ADD, R3, R4),
2924 			BPF_ALU32_REG(BPF_ADD, R3, R5),
2925 			BPF_ALU32_REG(BPF_ADD, R3, R6),
2926 			BPF_ALU32_REG(BPF_ADD, R3, R7),
2927 			BPF_ALU32_REG(BPF_ADD, R3, R8),
2928 			BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
2929 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
2930 			BPF_EXIT_INSN(),
2931 			BPF_ALU32_REG(BPF_ADD, R4, R0),
2932 			BPF_ALU32_REG(BPF_ADD, R4, R1),
2933 			BPF_ALU32_REG(BPF_ADD, R4, R2),
2934 			BPF_ALU32_REG(BPF_ADD, R4, R3),
2935 			BPF_ALU32_REG(BPF_ADD, R4, R4),
2936 			BPF_ALU32_REG(BPF_ADD, R4, R5),
2937 			BPF_ALU32_REG(BPF_ADD, R4, R6),
2938 			BPF_ALU32_REG(BPF_ADD, R4, R7),
2939 			BPF_ALU32_REG(BPF_ADD, R4, R8),
2940 			BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
2941 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
2942 			BPF_EXIT_INSN(),
2943 			BPF_ALU32_REG(BPF_ADD, R5, R0),
2944 			BPF_ALU32_REG(BPF_ADD, R5, R1),
2945 			BPF_ALU32_REG(BPF_ADD, R5, R2),
2946 			BPF_ALU32_REG(BPF_ADD, R5, R3),
2947 			BPF_ALU32_REG(BPF_ADD, R5, R4),
2948 			BPF_ALU32_REG(BPF_ADD, R5, R5),
2949 			BPF_ALU32_REG(BPF_ADD, R5, R6),
2950 			BPF_ALU32_REG(BPF_ADD, R5, R7),
2951 			BPF_ALU32_REG(BPF_ADD, R5, R8),
2952 			BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
2953 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
2954 			BPF_EXIT_INSN(),
2955 			BPF_ALU32_REG(BPF_ADD, R6, R0),
2956 			BPF_ALU32_REG(BPF_ADD, R6, R1),
2957 			BPF_ALU32_REG(BPF_ADD, R6, R2),
2958 			BPF_ALU32_REG(BPF_ADD, R6, R3),
2959 			BPF_ALU32_REG(BPF_ADD, R6, R4),
2960 			BPF_ALU32_REG(BPF_ADD, R6, R5),
2961 			BPF_ALU32_REG(BPF_ADD, R6, R6),
2962 			BPF_ALU32_REG(BPF_ADD, R6, R7),
2963 			BPF_ALU32_REG(BPF_ADD, R6, R8),
2964 			BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
2965 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
2966 			BPF_EXIT_INSN(),
2967 			BPF_ALU32_REG(BPF_ADD, R7, R0),
2968 			BPF_ALU32_REG(BPF_ADD, R7, R1),
2969 			BPF_ALU32_REG(BPF_ADD, R7, R2),
2970 			BPF_ALU32_REG(BPF_ADD, R7, R3),
2971 			BPF_ALU32_REG(BPF_ADD, R7, R4),
2972 			BPF_ALU32_REG(BPF_ADD, R7, R5),
2973 			BPF_ALU32_REG(BPF_ADD, R7, R6),
2974 			BPF_ALU32_REG(BPF_ADD, R7, R7),
2975 			BPF_ALU32_REG(BPF_ADD, R7, R8),
2976 			BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
2977 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
2978 			BPF_EXIT_INSN(),
2979 			BPF_ALU32_REG(BPF_ADD, R8, R0),
2980 			BPF_ALU32_REG(BPF_ADD, R8, R1),
2981 			BPF_ALU32_REG(BPF_ADD, R8, R2),
2982 			BPF_ALU32_REG(BPF_ADD, R8, R3),
2983 			BPF_ALU32_REG(BPF_ADD, R8, R4),
2984 			BPF_ALU32_REG(BPF_ADD, R8, R5),
2985 			BPF_ALU32_REG(BPF_ADD, R8, R6),
2986 			BPF_ALU32_REG(BPF_ADD, R8, R7),
2987 			BPF_ALU32_REG(BPF_ADD, R8, R8),
2988 			BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
2989 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
2990 			BPF_EXIT_INSN(),
2991 			BPF_ALU32_REG(BPF_ADD, R9, R0),
2992 			BPF_ALU32_REG(BPF_ADD, R9, R1),
2993 			BPF_ALU32_REG(BPF_ADD, R9, R2),
2994 			BPF_ALU32_REG(BPF_ADD, R9, R3),
2995 			BPF_ALU32_REG(BPF_ADD, R9, R4),
2996 			BPF_ALU32_REG(BPF_ADD, R9, R5),
2997 			BPF_ALU32_REG(BPF_ADD, R9, R6),
2998 			BPF_ALU32_REG(BPF_ADD, R9, R7),
2999 			BPF_ALU32_REG(BPF_ADD, R9, R8),
3000 			BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
3001 			BPF_ALU32_REG(BPF_MOV, R0, R9),
3002 			BPF_EXIT_INSN(),
3003 		},
3004 		INTERNAL,
3005 		{ },
3006 		{ { 0, 2957380 } }
3007 	},
3008 	{	/* Mainly checking JIT here. */
3009 		"INT: SUB",
3010 		.u.insns_int = {
3011 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
3012 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
3013 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
3014 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
3015 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
3016 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
3017 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
3018 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
3019 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
3020 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
3021 			BPF_ALU64_REG(BPF_SUB, R0, R0),
3022 			BPF_ALU64_REG(BPF_SUB, R0, R1),
3023 			BPF_ALU64_REG(BPF_SUB, R0, R2),
3024 			BPF_ALU64_REG(BPF_SUB, R0, R3),
3025 			BPF_ALU64_REG(BPF_SUB, R0, R4),
3026 			BPF_ALU64_REG(BPF_SUB, R0, R5),
3027 			BPF_ALU64_REG(BPF_SUB, R0, R6),
3028 			BPF_ALU64_REG(BPF_SUB, R0, R7),
3029 			BPF_ALU64_REG(BPF_SUB, R0, R8),
3030 			BPF_ALU64_REG(BPF_SUB, R0, R9),
3031 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
3032 			BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
3033 			BPF_EXIT_INSN(),
3034 			BPF_ALU64_REG(BPF_SUB, R1, R0),
3035 			BPF_ALU64_REG(BPF_SUB, R1, R2),
3036 			BPF_ALU64_REG(BPF_SUB, R1, R3),
3037 			BPF_ALU64_REG(BPF_SUB, R1, R4),
3038 			BPF_ALU64_REG(BPF_SUB, R1, R5),
3039 			BPF_ALU64_REG(BPF_SUB, R1, R6),
3040 			BPF_ALU64_REG(BPF_SUB, R1, R7),
3041 			BPF_ALU64_REG(BPF_SUB, R1, R8),
3042 			BPF_ALU64_REG(BPF_SUB, R1, R9),
3043 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
3044 			BPF_ALU64_REG(BPF_SUB, R2, R0),
3045 			BPF_ALU64_REG(BPF_SUB, R2, R1),
3046 			BPF_ALU64_REG(BPF_SUB, R2, R3),
3047 			BPF_ALU64_REG(BPF_SUB, R2, R4),
3048 			BPF_ALU64_REG(BPF_SUB, R2, R5),
3049 			BPF_ALU64_REG(BPF_SUB, R2, R6),
3050 			BPF_ALU64_REG(BPF_SUB, R2, R7),
3051 			BPF_ALU64_REG(BPF_SUB, R2, R8),
3052 			BPF_ALU64_REG(BPF_SUB, R2, R9),
3053 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
3054 			BPF_ALU64_REG(BPF_SUB, R3, R0),
3055 			BPF_ALU64_REG(BPF_SUB, R3, R1),
3056 			BPF_ALU64_REG(BPF_SUB, R3, R2),
3057 			BPF_ALU64_REG(BPF_SUB, R3, R4),
3058 			BPF_ALU64_REG(BPF_SUB, R3, R5),
3059 			BPF_ALU64_REG(BPF_SUB, R3, R6),
3060 			BPF_ALU64_REG(BPF_SUB, R3, R7),
3061 			BPF_ALU64_REG(BPF_SUB, R3, R8),
3062 			BPF_ALU64_REG(BPF_SUB, R3, R9),
3063 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
3064 			BPF_ALU64_REG(BPF_SUB, R4, R0),
3065 			BPF_ALU64_REG(BPF_SUB, R4, R1),
3066 			BPF_ALU64_REG(BPF_SUB, R4, R2),
3067 			BPF_ALU64_REG(BPF_SUB, R4, R3),
3068 			BPF_ALU64_REG(BPF_SUB, R4, R5),
3069 			BPF_ALU64_REG(BPF_SUB, R4, R6),
3070 			BPF_ALU64_REG(BPF_SUB, R4, R7),
3071 			BPF_ALU64_REG(BPF_SUB, R4, R8),
3072 			BPF_ALU64_REG(BPF_SUB, R4, R9),
3073 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
3074 			BPF_ALU64_REG(BPF_SUB, R5, R0),
3075 			BPF_ALU64_REG(BPF_SUB, R5, R1),
3076 			BPF_ALU64_REG(BPF_SUB, R5, R2),
3077 			BPF_ALU64_REG(BPF_SUB, R5, R3),
3078 			BPF_ALU64_REG(BPF_SUB, R5, R4),
3079 			BPF_ALU64_REG(BPF_SUB, R5, R6),
3080 			BPF_ALU64_REG(BPF_SUB, R5, R7),
3081 			BPF_ALU64_REG(BPF_SUB, R5, R8),
3082 			BPF_ALU64_REG(BPF_SUB, R5, R9),
3083 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
3084 			BPF_ALU64_REG(BPF_SUB, R6, R0),
3085 			BPF_ALU64_REG(BPF_SUB, R6, R1),
3086 			BPF_ALU64_REG(BPF_SUB, R6, R2),
3087 			BPF_ALU64_REG(BPF_SUB, R6, R3),
3088 			BPF_ALU64_REG(BPF_SUB, R6, R4),
3089 			BPF_ALU64_REG(BPF_SUB, R6, R5),
3090 			BPF_ALU64_REG(BPF_SUB, R6, R7),
3091 			BPF_ALU64_REG(BPF_SUB, R6, R8),
3092 			BPF_ALU64_REG(BPF_SUB, R6, R9),
3093 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
3094 			BPF_ALU64_REG(BPF_SUB, R7, R0),
3095 			BPF_ALU64_REG(BPF_SUB, R7, R1),
3096 			BPF_ALU64_REG(BPF_SUB, R7, R2),
3097 			BPF_ALU64_REG(BPF_SUB, R7, R3),
3098 			BPF_ALU64_REG(BPF_SUB, R7, R4),
3099 			BPF_ALU64_REG(BPF_SUB, R7, R5),
3100 			BPF_ALU64_REG(BPF_SUB, R7, R6),
3101 			BPF_ALU64_REG(BPF_SUB, R7, R8),
3102 			BPF_ALU64_REG(BPF_SUB, R7, R9),
3103 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
3104 			BPF_ALU64_REG(BPF_SUB, R8, R0),
3105 			BPF_ALU64_REG(BPF_SUB, R8, R1),
3106 			BPF_ALU64_REG(BPF_SUB, R8, R2),
3107 			BPF_ALU64_REG(BPF_SUB, R8, R3),
3108 			BPF_ALU64_REG(BPF_SUB, R8, R4),
3109 			BPF_ALU64_REG(BPF_SUB, R8, R5),
3110 			BPF_ALU64_REG(BPF_SUB, R8, R6),
3111 			BPF_ALU64_REG(BPF_SUB, R8, R7),
3112 			BPF_ALU64_REG(BPF_SUB, R8, R9),
3113 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
3114 			BPF_ALU64_REG(BPF_SUB, R9, R0),
3115 			BPF_ALU64_REG(BPF_SUB, R9, R1),
3116 			BPF_ALU64_REG(BPF_SUB, R9, R2),
3117 			BPF_ALU64_REG(BPF_SUB, R9, R3),
3118 			BPF_ALU64_REG(BPF_SUB, R9, R4),
3119 			BPF_ALU64_REG(BPF_SUB, R9, R5),
3120 			BPF_ALU64_REG(BPF_SUB, R9, R6),
3121 			BPF_ALU64_REG(BPF_SUB, R9, R7),
3122 			BPF_ALU64_REG(BPF_SUB, R9, R8),
3123 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
3124 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
3125 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
3126 			BPF_ALU64_REG(BPF_SUB, R0, R1),
3127 			BPF_ALU64_REG(BPF_SUB, R0, R2),
3128 			BPF_ALU64_REG(BPF_SUB, R0, R3),
3129 			BPF_ALU64_REG(BPF_SUB, R0, R4),
3130 			BPF_ALU64_REG(BPF_SUB, R0, R5),
3131 			BPF_ALU64_REG(BPF_SUB, R0, R6),
3132 			BPF_ALU64_REG(BPF_SUB, R0, R7),
3133 			BPF_ALU64_REG(BPF_SUB, R0, R8),
3134 			BPF_ALU64_REG(BPF_SUB, R0, R9),
3135 			BPF_EXIT_INSN(),
3136 		},
3137 		INTERNAL,
3138 		{ },
3139 		{ { 0, 11 } }
3140 	},
3141 	{	/* Mainly checking JIT here. */
3142 		"INT: XOR",
3143 		.u.insns_int = {
3144 			BPF_ALU64_REG(BPF_SUB, R0, R0),
3145 			BPF_ALU64_REG(BPF_XOR, R1, R1),
3146 			BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
3147 			BPF_EXIT_INSN(),
3148 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
3149 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
3150 			BPF_ALU64_REG(BPF_SUB, R1, R1),
3151 			BPF_ALU64_REG(BPF_XOR, R2, R2),
3152 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
3153 			BPF_EXIT_INSN(),
3154 			BPF_ALU64_REG(BPF_SUB, R2, R2),
3155 			BPF_ALU64_REG(BPF_XOR, R3, R3),
3156 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
3157 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
3158 			BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
3159 			BPF_EXIT_INSN(),
3160 			BPF_ALU64_REG(BPF_SUB, R3, R3),
3161 			BPF_ALU64_REG(BPF_XOR, R4, R4),
3162 			BPF_ALU64_IMM(BPF_MOV, R2, 1),
3163 			BPF_ALU64_IMM(BPF_MOV, R5, -1),
3164 			BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
3165 			BPF_EXIT_INSN(),
3166 			BPF_ALU64_REG(BPF_SUB, R4, R4),
3167 			BPF_ALU64_REG(BPF_XOR, R5, R5),
3168 			BPF_ALU64_IMM(BPF_MOV, R3, 1),
3169 			BPF_ALU64_IMM(BPF_MOV, R7, -1),
3170 			BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
3171 			BPF_EXIT_INSN(),
3172 			BPF_ALU64_IMM(BPF_MOV, R5, 1),
3173 			BPF_ALU64_REG(BPF_SUB, R5, R5),
3174 			BPF_ALU64_REG(BPF_XOR, R6, R6),
3175 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
3176 			BPF_ALU64_IMM(BPF_MOV, R8, -1),
3177 			BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
3178 			BPF_EXIT_INSN(),
3179 			BPF_ALU64_REG(BPF_SUB, R6, R6),
3180 			BPF_ALU64_REG(BPF_XOR, R7, R7),
3181 			BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
3182 			BPF_EXIT_INSN(),
3183 			BPF_ALU64_REG(BPF_SUB, R7, R7),
3184 			BPF_ALU64_REG(BPF_XOR, R8, R8),
3185 			BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
3186 			BPF_EXIT_INSN(),
3187 			BPF_ALU64_REG(BPF_SUB, R8, R8),
3188 			BPF_ALU64_REG(BPF_XOR, R9, R9),
3189 			BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
3190 			BPF_EXIT_INSN(),
3191 			BPF_ALU64_REG(BPF_SUB, R9, R9),
3192 			BPF_ALU64_REG(BPF_XOR, R0, R0),
3193 			BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
3194 			BPF_EXIT_INSN(),
3195 			BPF_ALU64_REG(BPF_SUB, R1, R1),
3196 			BPF_ALU64_REG(BPF_XOR, R0, R0),
3197 			BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
3198 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
3199 			BPF_EXIT_INSN(),
3200 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
3201 			BPF_EXIT_INSN(),
3202 		},
3203 		INTERNAL,
3204 		{ },
3205 		{ { 0, 1 } }
3206 	},
3207 	{	/* Mainly checking JIT here. */
3208 		"INT: MUL",
3209 		.u.insns_int = {
3210 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
3211 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
3212 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
3213 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
3214 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
3215 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
3216 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
3217 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
3218 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
3219 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
3220 			BPF_ALU64_REG(BPF_MUL, R0, R0),
3221 			BPF_ALU64_REG(BPF_MUL, R0, R1),
3222 			BPF_ALU64_REG(BPF_MUL, R0, R2),
3223 			BPF_ALU64_REG(BPF_MUL, R0, R3),
3224 			BPF_ALU64_REG(BPF_MUL, R0, R4),
3225 			BPF_ALU64_REG(BPF_MUL, R0, R5),
3226 			BPF_ALU64_REG(BPF_MUL, R0, R6),
3227 			BPF_ALU64_REG(BPF_MUL, R0, R7),
3228 			BPF_ALU64_REG(BPF_MUL, R0, R8),
3229 			BPF_ALU64_REG(BPF_MUL, R0, R9),
3230 			BPF_ALU64_IMM(BPF_MUL, R0, 10),
3231 			BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
3232 			BPF_EXIT_INSN(),
3233 			BPF_ALU64_REG(BPF_MUL, R1, R0),
3234 			BPF_ALU64_REG(BPF_MUL, R1, R2),
3235 			BPF_ALU64_REG(BPF_MUL, R1, R3),
3236 			BPF_ALU64_REG(BPF_MUL, R1, R4),
3237 			BPF_ALU64_REG(BPF_MUL, R1, R5),
3238 			BPF_ALU64_REG(BPF_MUL, R1, R6),
3239 			BPF_ALU64_REG(BPF_MUL, R1, R7),
3240 			BPF_ALU64_REG(BPF_MUL, R1, R8),
3241 			BPF_ALU64_REG(BPF_MUL, R1, R9),
3242 			BPF_ALU64_IMM(BPF_MUL, R1, 10),
3243 			BPF_ALU64_REG(BPF_MOV, R2, R1),
3244 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
3245 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
3246 			BPF_EXIT_INSN(),
3247 			BPF_ALU64_IMM(BPF_LSH, R1, 32),
3248 			BPF_ALU64_IMM(BPF_ARSH, R1, 32),
3249 			BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
3250 			BPF_EXIT_INSN(),
3251 			BPF_ALU64_REG(BPF_MUL, R2, R0),
3252 			BPF_ALU64_REG(BPF_MUL, R2, R1),
3253 			BPF_ALU64_REG(BPF_MUL, R2, R3),
3254 			BPF_ALU64_REG(BPF_MUL, R2, R4),
3255 			BPF_ALU64_REG(BPF_MUL, R2, R5),
3256 			BPF_ALU64_REG(BPF_MUL, R2, R6),
3257 			BPF_ALU64_REG(BPF_MUL, R2, R7),
3258 			BPF_ALU64_REG(BPF_MUL, R2, R8),
3259 			BPF_ALU64_REG(BPF_MUL, R2, R9),
3260 			BPF_ALU64_IMM(BPF_MUL, R2, 10),
3261 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
3262 			BPF_ALU64_REG(BPF_MOV, R0, R2),
3263 			BPF_EXIT_INSN(),
3264 		},
3265 		INTERNAL,
3266 		{ },
3267 		{ { 0, 0x35d97ef2 } }
3268 	},
3269 	{	/* Mainly checking JIT here. */
3270 		"MOV REG64",
3271 		.u.insns_int = {
3272 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
3273 			BPF_MOV64_REG(R1, R0),
3274 			BPF_MOV64_REG(R2, R1),
3275 			BPF_MOV64_REG(R3, R2),
3276 			BPF_MOV64_REG(R4, R3),
3277 			BPF_MOV64_REG(R5, R4),
3278 			BPF_MOV64_REG(R6, R5),
3279 			BPF_MOV64_REG(R7, R6),
3280 			BPF_MOV64_REG(R8, R7),
3281 			BPF_MOV64_REG(R9, R8),
3282 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
3283 			BPF_ALU64_IMM(BPF_MOV, R1, 0),
3284 			BPF_ALU64_IMM(BPF_MOV, R2, 0),
3285 			BPF_ALU64_IMM(BPF_MOV, R3, 0),
3286 			BPF_ALU64_IMM(BPF_MOV, R4, 0),
3287 			BPF_ALU64_IMM(BPF_MOV, R5, 0),
3288 			BPF_ALU64_IMM(BPF_MOV, R6, 0),
3289 			BPF_ALU64_IMM(BPF_MOV, R7, 0),
3290 			BPF_ALU64_IMM(BPF_MOV, R8, 0),
3291 			BPF_ALU64_IMM(BPF_MOV, R9, 0),
3292 			BPF_ALU64_REG(BPF_ADD, R0, R0),
3293 			BPF_ALU64_REG(BPF_ADD, R0, R1),
3294 			BPF_ALU64_REG(BPF_ADD, R0, R2),
3295 			BPF_ALU64_REG(BPF_ADD, R0, R3),
3296 			BPF_ALU64_REG(BPF_ADD, R0, R4),
3297 			BPF_ALU64_REG(BPF_ADD, R0, R5),
3298 			BPF_ALU64_REG(BPF_ADD, R0, R6),
3299 			BPF_ALU64_REG(BPF_ADD, R0, R7),
3300 			BPF_ALU64_REG(BPF_ADD, R0, R8),
3301 			BPF_ALU64_REG(BPF_ADD, R0, R9),
3302 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
3303 			BPF_EXIT_INSN(),
3304 		},
3305 		INTERNAL,
3306 		{ },
3307 		{ { 0, 0xfefe } }
3308 	},
3309 	{	/* Mainly checking JIT here. */
3310 		"MOV REG32",
3311 		.u.insns_int = {
3312 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
3313 			BPF_MOV64_REG(R1, R0),
3314 			BPF_MOV64_REG(R2, R1),
3315 			BPF_MOV64_REG(R3, R2),
3316 			BPF_MOV64_REG(R4, R3),
3317 			BPF_MOV64_REG(R5, R4),
3318 			BPF_MOV64_REG(R6, R5),
3319 			BPF_MOV64_REG(R7, R6),
3320 			BPF_MOV64_REG(R8, R7),
3321 			BPF_MOV64_REG(R9, R8),
3322 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3323 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
3324 			BPF_ALU32_IMM(BPF_MOV, R2, 0),
3325 			BPF_ALU32_IMM(BPF_MOV, R3, 0),
3326 			BPF_ALU32_IMM(BPF_MOV, R4, 0),
3327 			BPF_ALU32_IMM(BPF_MOV, R5, 0),
3328 			BPF_ALU32_IMM(BPF_MOV, R6, 0),
3329 			BPF_ALU32_IMM(BPF_MOV, R7, 0),
3330 			BPF_ALU32_IMM(BPF_MOV, R8, 0),
3331 			BPF_ALU32_IMM(BPF_MOV, R9, 0),
3332 			BPF_ALU64_REG(BPF_ADD, R0, R0),
3333 			BPF_ALU64_REG(BPF_ADD, R0, R1),
3334 			BPF_ALU64_REG(BPF_ADD, R0, R2),
3335 			BPF_ALU64_REG(BPF_ADD, R0, R3),
3336 			BPF_ALU64_REG(BPF_ADD, R0, R4),
3337 			BPF_ALU64_REG(BPF_ADD, R0, R5),
3338 			BPF_ALU64_REG(BPF_ADD, R0, R6),
3339 			BPF_ALU64_REG(BPF_ADD, R0, R7),
3340 			BPF_ALU64_REG(BPF_ADD, R0, R8),
3341 			BPF_ALU64_REG(BPF_ADD, R0, R9),
3342 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
3343 			BPF_EXIT_INSN(),
3344 		},
3345 		INTERNAL,
3346 		{ },
3347 		{ { 0, 0xfefe } }
3348 	},
3349 	{	/* Mainly checking JIT here. */
3350 		"LD IMM64",
3351 		.u.insns_int = {
3352 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
3353 			BPF_MOV64_REG(R1, R0),
3354 			BPF_MOV64_REG(R2, R1),
3355 			BPF_MOV64_REG(R3, R2),
3356 			BPF_MOV64_REG(R4, R3),
3357 			BPF_MOV64_REG(R5, R4),
3358 			BPF_MOV64_REG(R6, R5),
3359 			BPF_MOV64_REG(R7, R6),
3360 			BPF_MOV64_REG(R8, R7),
3361 			BPF_MOV64_REG(R9, R8),
3362 			BPF_LD_IMM64(R0, 0x0LL),
3363 			BPF_LD_IMM64(R1, 0x0LL),
3364 			BPF_LD_IMM64(R2, 0x0LL),
3365 			BPF_LD_IMM64(R3, 0x0LL),
3366 			BPF_LD_IMM64(R4, 0x0LL),
3367 			BPF_LD_IMM64(R5, 0x0LL),
3368 			BPF_LD_IMM64(R6, 0x0LL),
3369 			BPF_LD_IMM64(R7, 0x0LL),
3370 			BPF_LD_IMM64(R8, 0x0LL),
3371 			BPF_LD_IMM64(R9, 0x0LL),
3372 			BPF_ALU64_REG(BPF_ADD, R0, R0),
3373 			BPF_ALU64_REG(BPF_ADD, R0, R1),
3374 			BPF_ALU64_REG(BPF_ADD, R0, R2),
3375 			BPF_ALU64_REG(BPF_ADD, R0, R3),
3376 			BPF_ALU64_REG(BPF_ADD, R0, R4),
3377 			BPF_ALU64_REG(BPF_ADD, R0, R5),
3378 			BPF_ALU64_REG(BPF_ADD, R0, R6),
3379 			BPF_ALU64_REG(BPF_ADD, R0, R7),
3380 			BPF_ALU64_REG(BPF_ADD, R0, R8),
3381 			BPF_ALU64_REG(BPF_ADD, R0, R9),
3382 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
3383 			BPF_EXIT_INSN(),
3384 		},
3385 		INTERNAL,
3386 		{ },
3387 		{ { 0, 0xfefe } }
3388 	},
3389 	{
3390 		"INT: ALU MIX",
3391 		.u.insns_int = {
3392 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
3393 			BPF_ALU64_IMM(BPF_ADD, R0, -1),
3394 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
3395 			BPF_ALU64_IMM(BPF_XOR, R2, 3),
3396 			BPF_ALU64_REG(BPF_DIV, R0, R2),
3397 			BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
3398 			BPF_EXIT_INSN(),
3399 			BPF_ALU64_IMM(BPF_MOD, R0, 3),
3400 			BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
3401 			BPF_EXIT_INSN(),
3402 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
3403 			BPF_EXIT_INSN(),
3404 		},
3405 		INTERNAL,
3406 		{ },
3407 		{ { 0, -1 } }
3408 	},
3409 	{
3410 		"INT: shifts by register",
3411 		.u.insns_int = {
3412 			BPF_MOV64_IMM(R0, -1234),
3413 			BPF_MOV64_IMM(R1, 1),
3414 			BPF_ALU32_REG(BPF_RSH, R0, R1),
3415 			BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
3416 			BPF_EXIT_INSN(),
3417 			BPF_MOV64_IMM(R2, 1),
3418 			BPF_ALU64_REG(BPF_LSH, R0, R2),
3419 			BPF_MOV32_IMM(R4, -1234),
3420 			BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
3421 			BPF_EXIT_INSN(),
3422 			BPF_ALU64_IMM(BPF_AND, R4, 63),
3423 			BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
3424 			BPF_MOV64_IMM(R3, 47),
3425 			BPF_ALU64_REG(BPF_ARSH, R0, R3),
3426 			BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
3427 			BPF_EXIT_INSN(),
3428 			BPF_MOV64_IMM(R2, 1),
3429 			BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
3430 			BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
3431 			BPF_EXIT_INSN(),
3432 			BPF_MOV64_IMM(R4, 4),
3433 			BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
3434 			BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
3435 			BPF_EXIT_INSN(),
3436 			BPF_MOV64_IMM(R4, 5),
3437 			BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
3438 			BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
3439 			BPF_EXIT_INSN(),
3440 			BPF_MOV64_IMM(R0, -1),
3441 			BPF_EXIT_INSN(),
3442 		},
3443 		INTERNAL,
3444 		{ },
3445 		{ { 0, -1 } }
3446 	},
3447 	{
3448 		/*
3449 		 * Register (non-)clobbering test, in the case where a 32-bit
3450 		 * JIT implements complex ALU64 operations via function calls.
3451 		 * If so, the function call must be invisible in the eBPF
3452 		 * registers. The JIT must then save and restore relevant
3453 		 * registers during the call. The following tests check that
3454 		 * the eBPF registers retain their values after such a call.
3455 		 */
3456 		"INT: Register clobbering, R1 updated",
3457 		.u.insns_int = {
3458 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3459 			BPF_ALU32_IMM(BPF_MOV, R1, 123456789),
3460 			BPF_ALU32_IMM(BPF_MOV, R2, 2),
3461 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
3462 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
3463 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
3464 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
3465 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
3466 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
3467 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
3468 			BPF_ALU64_IMM(BPF_DIV, R1, 123456789),
3469 			BPF_JMP_IMM(BPF_JNE, R0, 0, 10),
3470 			BPF_JMP_IMM(BPF_JNE, R1, 1, 9),
3471 			BPF_JMP_IMM(BPF_JNE, R2, 2, 8),
3472 			BPF_JMP_IMM(BPF_JNE, R3, 3, 7),
3473 			BPF_JMP_IMM(BPF_JNE, R4, 4, 6),
3474 			BPF_JMP_IMM(BPF_JNE, R5, 5, 5),
3475 			BPF_JMP_IMM(BPF_JNE, R6, 6, 4),
3476 			BPF_JMP_IMM(BPF_JNE, R7, 7, 3),
3477 			BPF_JMP_IMM(BPF_JNE, R8, 8, 2),
3478 			BPF_JMP_IMM(BPF_JNE, R9, 9, 1),
3479 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3480 			BPF_EXIT_INSN(),
3481 		},
3482 		INTERNAL,
3483 		{ },
3484 		{ { 0, 1 } }
3485 	},
3486 	{
3487 		"INT: Register clobbering, R2 updated",
3488 		.u.insns_int = {
3489 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3490 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3491 			BPF_ALU32_IMM(BPF_MOV, R2, 2 * 123456789),
3492 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
3493 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
3494 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
3495 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
3496 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
3497 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
3498 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
3499 			BPF_ALU64_IMM(BPF_DIV, R2, 123456789),
3500 			BPF_JMP_IMM(BPF_JNE, R0, 0, 10),
3501 			BPF_JMP_IMM(BPF_JNE, R1, 1, 9),
3502 			BPF_JMP_IMM(BPF_JNE, R2, 2, 8),
3503 			BPF_JMP_IMM(BPF_JNE, R3, 3, 7),
3504 			BPF_JMP_IMM(BPF_JNE, R4, 4, 6),
3505 			BPF_JMP_IMM(BPF_JNE, R5, 5, 5),
3506 			BPF_JMP_IMM(BPF_JNE, R6, 6, 4),
3507 			BPF_JMP_IMM(BPF_JNE, R7, 7, 3),
3508 			BPF_JMP_IMM(BPF_JNE, R8, 8, 2),
3509 			BPF_JMP_IMM(BPF_JNE, R9, 9, 1),
3510 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3511 			BPF_EXIT_INSN(),
3512 		},
3513 		INTERNAL,
3514 		{ },
3515 		{ { 0, 1 } }
3516 	},
3517 	{
3518 		/*
3519 		 * Test 32-bit JITs that implement complex ALU64 operations as
3520 		 * function calls R0 = f(R1, R2), and must re-arrange operands.
3521 		 */
3522 #define NUMER 0xfedcba9876543210ULL
3523 #define DENOM 0x0123456789abcdefULL
3524 		"ALU64_DIV X: Operand register permutations",
3525 		.u.insns_int = {
3526 			/* R0 / R2 */
3527 			BPF_LD_IMM64(R0, NUMER),
3528 			BPF_LD_IMM64(R2, DENOM),
3529 			BPF_ALU64_REG(BPF_DIV, R0, R2),
3530 			BPF_JMP_IMM(BPF_JEQ, R0, NUMER / DENOM, 1),
3531 			BPF_EXIT_INSN(),
3532 			/* R1 / R0 */
3533 			BPF_LD_IMM64(R1, NUMER),
3534 			BPF_LD_IMM64(R0, DENOM),
3535 			BPF_ALU64_REG(BPF_DIV, R1, R0),
3536 			BPF_JMP_IMM(BPF_JEQ, R1, NUMER / DENOM, 1),
3537 			BPF_EXIT_INSN(),
3538 			/* R0 / R1 */
3539 			BPF_LD_IMM64(R0, NUMER),
3540 			BPF_LD_IMM64(R1, DENOM),
3541 			BPF_ALU64_REG(BPF_DIV, R0, R1),
3542 			BPF_JMP_IMM(BPF_JEQ, R0, NUMER / DENOM, 1),
3543 			BPF_EXIT_INSN(),
3544 			/* R2 / R0 */
3545 			BPF_LD_IMM64(R2, NUMER),
3546 			BPF_LD_IMM64(R0, DENOM),
3547 			BPF_ALU64_REG(BPF_DIV, R2, R0),
3548 			BPF_JMP_IMM(BPF_JEQ, R2, NUMER / DENOM, 1),
3549 			BPF_EXIT_INSN(),
3550 			/* R2 / R1 */
3551 			BPF_LD_IMM64(R2, NUMER),
3552 			BPF_LD_IMM64(R1, DENOM),
3553 			BPF_ALU64_REG(BPF_DIV, R2, R1),
3554 			BPF_JMP_IMM(BPF_JEQ, R2, NUMER / DENOM, 1),
3555 			BPF_EXIT_INSN(),
3556 			/* R1 / R2 */
3557 			BPF_LD_IMM64(R1, NUMER),
3558 			BPF_LD_IMM64(R2, DENOM),
3559 			BPF_ALU64_REG(BPF_DIV, R1, R2),
3560 			BPF_JMP_IMM(BPF_JEQ, R1, NUMER / DENOM, 1),
3561 			BPF_EXIT_INSN(),
3562 			/* R1 / R1 */
3563 			BPF_LD_IMM64(R1, NUMER),
3564 			BPF_ALU64_REG(BPF_DIV, R1, R1),
3565 			BPF_JMP_IMM(BPF_JEQ, R1, 1, 1),
3566 			BPF_EXIT_INSN(),
3567 			/* R2 / R2 */
3568 			BPF_LD_IMM64(R2, DENOM),
3569 			BPF_ALU64_REG(BPF_DIV, R2, R2),
3570 			BPF_JMP_IMM(BPF_JEQ, R2, 1, 1),
3571 			BPF_EXIT_INSN(),
3572 			/* R3 / R4 */
3573 			BPF_LD_IMM64(R3, NUMER),
3574 			BPF_LD_IMM64(R4, DENOM),
3575 			BPF_ALU64_REG(BPF_DIV, R3, R4),
3576 			BPF_JMP_IMM(BPF_JEQ, R3, NUMER / DENOM, 1),
3577 			BPF_EXIT_INSN(),
3578 			/* Successful return */
3579 			BPF_LD_IMM64(R0, 1),
3580 			BPF_EXIT_INSN(),
3581 		},
3582 		INTERNAL,
3583 		{ },
3584 		{ { 0, 1 } },
3585 #undef NUMER
3586 #undef DENOM
3587 	},
3588 #ifdef CONFIG_32BIT
3589 	{
3590 		"INT: 32-bit context pointer word order and zero-extension",
3591 		.u.insns_int = {
3592 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
3593 			BPF_JMP32_IMM(BPF_JEQ, R1, 0, 3),
3594 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
3595 			BPF_JMP32_IMM(BPF_JNE, R1, 0, 1),
3596 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
3597 			BPF_EXIT_INSN(),
3598 		},
3599 		INTERNAL,
3600 		{ },
3601 		{ { 0, 1 } }
3602 	},
3603 #endif
3604 	{
3605 		"check: missing ret",
3606 		.u.insns = {
3607 			BPF_STMT(BPF_LD | BPF_IMM, 1),
3608 		},
3609 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
3610 		{ },
3611 		{ },
3612 		.fill_helper = NULL,
3613 		.expected_errcode = -EINVAL,
3614 	},
3615 	{
3616 		"check: div_k_0",
3617 		.u.insns = {
3618 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
3619 			BPF_STMT(BPF_RET | BPF_K, 0)
3620 		},
3621 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
3622 		{ },
3623 		{ },
3624 		.fill_helper = NULL,
3625 		.expected_errcode = -EINVAL,
3626 	},
3627 	{
3628 		"check: unknown insn",
3629 		.u.insns = {
3630 			/* seccomp insn, rejected in socket filter */
3631 			BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
3632 			BPF_STMT(BPF_RET | BPF_K, 0)
3633 		},
3634 		CLASSIC | FLAG_EXPECTED_FAIL,
3635 		{ },
3636 		{ },
3637 		.fill_helper = NULL,
3638 		.expected_errcode = -EINVAL,
3639 	},
3640 	{
3641 		"check: out of range spill/fill",
3642 		.u.insns = {
3643 			BPF_STMT(BPF_STX, 16),
3644 			BPF_STMT(BPF_RET | BPF_K, 0)
3645 		},
3646 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
3647 		{ },
3648 		{ },
3649 		.fill_helper = NULL,
3650 		.expected_errcode = -EINVAL,
3651 	},
3652 	{
3653 		"JUMPS + HOLES",
3654 		.u.insns = {
3655 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3656 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
3657 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3658 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3659 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3660 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3661 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3662 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3663 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3664 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3665 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3666 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3667 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3668 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3669 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3670 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
3671 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3672 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
3673 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3674 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
3675 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
3676 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3677 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3678 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3679 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3680 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3681 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3682 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3683 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3684 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3685 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3686 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3687 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3688 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3689 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
3690 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
3691 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3692 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
3693 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
3694 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3695 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3696 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3697 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3698 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3699 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3700 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3701 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3702 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3703 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3704 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3705 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3706 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3707 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
3708 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
3709 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
3710 			BPF_STMT(BPF_RET | BPF_A, 0),
3711 			BPF_STMT(BPF_RET | BPF_A, 0),
3712 		},
3713 		CLASSIC,
3714 		{ 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
3715 		  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
3716 		  0x08, 0x00,
3717 		  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
3718 		  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
3719 		  0xc0, 0xa8, 0x33, 0x01,
3720 		  0xc0, 0xa8, 0x33, 0x02,
3721 		  0xbb, 0xb6,
3722 		  0xa9, 0xfa,
3723 		  0x00, 0x14, 0x00, 0x00,
3724 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3725 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3726 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3727 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3728 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3729 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3730 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
3731 		  0xcc, 0xcc, 0xcc, 0xcc },
3732 		{ { 88, 0x001b } }
3733 	},
3734 	{
3735 		"check: RET X",
3736 		.u.insns = {
3737 			BPF_STMT(BPF_RET | BPF_X, 0),
3738 		},
3739 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
3740 		{ },
3741 		{ },
3742 		.fill_helper = NULL,
3743 		.expected_errcode = -EINVAL,
3744 	},
3745 	{
3746 		"check: LDX + RET X",
3747 		.u.insns = {
3748 			BPF_STMT(BPF_LDX | BPF_IMM, 42),
3749 			BPF_STMT(BPF_RET | BPF_X, 0),
3750 		},
3751 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
3752 		{ },
3753 		{ },
3754 		.fill_helper = NULL,
3755 		.expected_errcode = -EINVAL,
3756 	},
3757 	{	/* Mainly checking JIT here. */
3758 		"M[]: alt STX + LDX",
3759 		.u.insns = {
3760 			BPF_STMT(BPF_LDX | BPF_IMM, 100),
3761 			BPF_STMT(BPF_STX, 0),
3762 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
3763 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3764 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3765 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3766 			BPF_STMT(BPF_STX, 1),
3767 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
3768 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3769 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3770 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3771 			BPF_STMT(BPF_STX, 2),
3772 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
3773 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3774 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3775 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3776 			BPF_STMT(BPF_STX, 3),
3777 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
3778 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3779 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3780 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3781 			BPF_STMT(BPF_STX, 4),
3782 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
3783 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3784 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3785 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3786 			BPF_STMT(BPF_STX, 5),
3787 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
3788 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3789 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3790 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3791 			BPF_STMT(BPF_STX, 6),
3792 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
3793 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3794 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3795 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3796 			BPF_STMT(BPF_STX, 7),
3797 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
3798 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3799 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3800 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3801 			BPF_STMT(BPF_STX, 8),
3802 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
3803 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3804 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3805 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3806 			BPF_STMT(BPF_STX, 9),
3807 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
3808 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3809 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3810 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3811 			BPF_STMT(BPF_STX, 10),
3812 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
3813 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3814 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3815 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3816 			BPF_STMT(BPF_STX, 11),
3817 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
3818 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3819 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3820 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3821 			BPF_STMT(BPF_STX, 12),
3822 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
3823 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3824 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3825 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3826 			BPF_STMT(BPF_STX, 13),
3827 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
3828 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3829 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3830 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3831 			BPF_STMT(BPF_STX, 14),
3832 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
3833 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3834 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3835 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3836 			BPF_STMT(BPF_STX, 15),
3837 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
3838 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3839 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
3840 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
3841 			BPF_STMT(BPF_RET | BPF_A, 0),
3842 		},
3843 		CLASSIC | FLAG_NO_DATA,
3844 		{ },
3845 		{ { 0, 116 } },
3846 	},
3847 	{	/* Mainly checking JIT here. */
3848 		"M[]: full STX + full LDX",
3849 		.u.insns = {
3850 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
3851 			BPF_STMT(BPF_STX, 0),
3852 			BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
3853 			BPF_STMT(BPF_STX, 1),
3854 			BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
3855 			BPF_STMT(BPF_STX, 2),
3856 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
3857 			BPF_STMT(BPF_STX, 3),
3858 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
3859 			BPF_STMT(BPF_STX, 4),
3860 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
3861 			BPF_STMT(BPF_STX, 5),
3862 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
3863 			BPF_STMT(BPF_STX, 6),
3864 			BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
3865 			BPF_STMT(BPF_STX, 7),
3866 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
3867 			BPF_STMT(BPF_STX, 8),
3868 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
3869 			BPF_STMT(BPF_STX, 9),
3870 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
3871 			BPF_STMT(BPF_STX, 10),
3872 			BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
3873 			BPF_STMT(BPF_STX, 11),
3874 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
3875 			BPF_STMT(BPF_STX, 12),
3876 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
3877 			BPF_STMT(BPF_STX, 13),
3878 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
3879 			BPF_STMT(BPF_STX, 14),
3880 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
3881 			BPF_STMT(BPF_STX, 15),
3882 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
3883 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
3884 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
3885 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3886 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
3887 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3888 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
3889 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3890 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
3891 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3892 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
3893 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3894 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
3895 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3896 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
3897 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3898 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
3899 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3900 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
3901 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3902 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
3903 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3904 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
3905 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3906 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
3907 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3908 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
3909 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3910 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
3911 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3912 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
3913 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3914 			BPF_STMT(BPF_RET | BPF_A, 0),
3915 		},
3916 		CLASSIC | FLAG_NO_DATA,
3917 		{ },
3918 		{ { 0, 0x2a5a5e5 } },
3919 	},
3920 	{
3921 		"check: SKF_AD_MAX",
3922 		.u.insns = {
3923 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3924 				 SKF_AD_OFF + SKF_AD_MAX),
3925 			BPF_STMT(BPF_RET | BPF_A, 0),
3926 		},
3927 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
3928 		{ },
3929 		{ },
3930 		.fill_helper = NULL,
3931 		.expected_errcode = -EINVAL,
3932 	},
3933 	{	/* Passes checker but fails during runtime. */
3934 		"LD [SKF_AD_OFF-1]",
3935 		.u.insns = {
3936 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3937 				 SKF_AD_OFF - 1),
3938 			BPF_STMT(BPF_RET | BPF_K, 1),
3939 		},
3940 		CLASSIC,
3941 		{ },
3942 		{ { 1, 0 } },
3943 	},
3944 	{
3945 		"load 64-bit immediate",
3946 		.u.insns_int = {
3947 			BPF_LD_IMM64(R1, 0x567800001234LL),
3948 			BPF_MOV64_REG(R2, R1),
3949 			BPF_MOV64_REG(R3, R2),
3950 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
3951 			BPF_ALU64_IMM(BPF_LSH, R3, 32),
3952 			BPF_ALU64_IMM(BPF_RSH, R3, 32),
3953 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
3954 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
3955 			BPF_EXIT_INSN(),
3956 			BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
3957 			BPF_EXIT_INSN(),
3958 			BPF_LD_IMM64(R0, 0x1ffffffffLL),
3959 			BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
3960 			BPF_EXIT_INSN(),
3961 		},
3962 		INTERNAL,
3963 		{ },
3964 		{ { 0, 1 } }
3965 	},
3966 	/* BPF_ALU | BPF_MOV | BPF_X */
3967 	{
3968 		"ALU_MOV_X: dst = 2",
3969 		.u.insns_int = {
3970 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3971 			BPF_ALU32_REG(BPF_MOV, R0, R1),
3972 			BPF_EXIT_INSN(),
3973 		},
3974 		INTERNAL,
3975 		{ },
3976 		{ { 0, 2 } },
3977 	},
3978 	{
3979 		"ALU_MOV_X: dst = 4294967295",
3980 		.u.insns_int = {
3981 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
3982 			BPF_ALU32_REG(BPF_MOV, R0, R1),
3983 			BPF_EXIT_INSN(),
3984 		},
3985 		INTERNAL,
3986 		{ },
3987 		{ { 0, 4294967295U } },
3988 	},
3989 	{
3990 		"ALU64_MOV_X: dst = 2",
3991 		.u.insns_int = {
3992 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3993 			BPF_ALU64_REG(BPF_MOV, R0, R1),
3994 			BPF_EXIT_INSN(),
3995 		},
3996 		INTERNAL,
3997 		{ },
3998 		{ { 0, 2 } },
3999 	},
4000 	{
4001 		"ALU64_MOV_X: dst = 4294967295",
4002 		.u.insns_int = {
4003 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
4004 			BPF_ALU64_REG(BPF_MOV, R0, R1),
4005 			BPF_EXIT_INSN(),
4006 		},
4007 		INTERNAL,
4008 		{ },
4009 		{ { 0, 4294967295U } },
4010 	},
4011 	/* BPF_ALU | BPF_MOV | BPF_K */
4012 	{
4013 		"ALU_MOV_K: dst = 2",
4014 		.u.insns_int = {
4015 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
4016 			BPF_EXIT_INSN(),
4017 		},
4018 		INTERNAL,
4019 		{ },
4020 		{ { 0, 2 } },
4021 	},
4022 	{
4023 		"ALU_MOV_K: dst = 4294967295",
4024 		.u.insns_int = {
4025 			BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
4026 			BPF_EXIT_INSN(),
4027 		},
4028 		INTERNAL,
4029 		{ },
4030 		{ { 0, 4294967295U } },
4031 	},
4032 	{
4033 		"ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
4034 		.u.insns_int = {
4035 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4036 			BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
4037 			BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
4038 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4039 			BPF_MOV32_IMM(R0, 2),
4040 			BPF_EXIT_INSN(),
4041 			BPF_MOV32_IMM(R0, 1),
4042 			BPF_EXIT_INSN(),
4043 		},
4044 		INTERNAL,
4045 		{ },
4046 		{ { 0, 0x1 } },
4047 	},
4048 	{
4049 		"ALU_MOV_K: small negative",
4050 		.u.insns_int = {
4051 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
4052 			BPF_EXIT_INSN(),
4053 		},
4054 		INTERNAL,
4055 		{ },
4056 		{ { 0, -123 } }
4057 	},
4058 	{
4059 		"ALU_MOV_K: small negative zero extension",
4060 		.u.insns_int = {
4061 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
4062 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
4063 			BPF_EXIT_INSN(),
4064 		},
4065 		INTERNAL,
4066 		{ },
4067 		{ { 0, 0 } }
4068 	},
4069 	{
4070 		"ALU_MOV_K: large negative",
4071 		.u.insns_int = {
4072 			BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
4073 			BPF_EXIT_INSN(),
4074 		},
4075 		INTERNAL,
4076 		{ },
4077 		{ { 0, -123456789 } }
4078 	},
4079 	{
4080 		"ALU_MOV_K: large negative zero extension",
4081 		.u.insns_int = {
4082 			BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
4083 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
4084 			BPF_EXIT_INSN(),
4085 		},
4086 		INTERNAL,
4087 		{ },
4088 		{ { 0, 0 } }
4089 	},
4090 	{
4091 		"ALU64_MOV_K: dst = 2",
4092 		.u.insns_int = {
4093 			BPF_ALU64_IMM(BPF_MOV, R0, 2),
4094 			BPF_EXIT_INSN(),
4095 		},
4096 		INTERNAL,
4097 		{ },
4098 		{ { 0, 2 } },
4099 	},
4100 	{
4101 		"ALU64_MOV_K: dst = 2147483647",
4102 		.u.insns_int = {
4103 			BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
4104 			BPF_EXIT_INSN(),
4105 		},
4106 		INTERNAL,
4107 		{ },
4108 		{ { 0, 2147483647 } },
4109 	},
4110 	{
4111 		"ALU64_OR_K: dst = 0x0",
4112 		.u.insns_int = {
4113 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4114 			BPF_LD_IMM64(R3, 0x0),
4115 			BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
4116 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4117 			BPF_MOV32_IMM(R0, 2),
4118 			BPF_EXIT_INSN(),
4119 			BPF_MOV32_IMM(R0, 1),
4120 			BPF_EXIT_INSN(),
4121 		},
4122 		INTERNAL,
4123 		{ },
4124 		{ { 0, 0x1 } },
4125 	},
4126 	{
4127 		"ALU64_MOV_K: dst = -1",
4128 		.u.insns_int = {
4129 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4130 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4131 			BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
4132 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4133 			BPF_MOV32_IMM(R0, 2),
4134 			BPF_EXIT_INSN(),
4135 			BPF_MOV32_IMM(R0, 1),
4136 			BPF_EXIT_INSN(),
4137 		},
4138 		INTERNAL,
4139 		{ },
4140 		{ { 0, 0x1 } },
4141 	},
4142 	{
4143 		"ALU64_MOV_K: small negative",
4144 		.u.insns_int = {
4145 			BPF_ALU64_IMM(BPF_MOV, R0, -123),
4146 			BPF_EXIT_INSN(),
4147 		},
4148 		INTERNAL,
4149 		{ },
4150 		{ { 0, -123 } }
4151 	},
4152 	{
4153 		"ALU64_MOV_K: small negative sign extension",
4154 		.u.insns_int = {
4155 			BPF_ALU64_IMM(BPF_MOV, R0, -123),
4156 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
4157 			BPF_EXIT_INSN(),
4158 		},
4159 		INTERNAL,
4160 		{ },
4161 		{ { 0, 0xffffffff } }
4162 	},
4163 	{
4164 		"ALU64_MOV_K: large negative",
4165 		.u.insns_int = {
4166 			BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
4167 			BPF_EXIT_INSN(),
4168 		},
4169 		INTERNAL,
4170 		{ },
4171 		{ { 0, -123456789 } }
4172 	},
4173 	{
4174 		"ALU64_MOV_K: large negative sign extension",
4175 		.u.insns_int = {
4176 			BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
4177 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
4178 			BPF_EXIT_INSN(),
4179 		},
4180 		INTERNAL,
4181 		{ },
4182 		{ { 0, 0xffffffff } }
4183 	},
4184 	/* BPF_ALU | BPF_ADD | BPF_X */
4185 	{
4186 		"ALU_ADD_X: 1 + 2 = 3",
4187 		.u.insns_int = {
4188 			BPF_LD_IMM64(R0, 1),
4189 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
4190 			BPF_ALU32_REG(BPF_ADD, R0, R1),
4191 			BPF_EXIT_INSN(),
4192 		},
4193 		INTERNAL,
4194 		{ },
4195 		{ { 0, 3 } },
4196 	},
4197 	{
4198 		"ALU_ADD_X: 1 + 4294967294 = 4294967295",
4199 		.u.insns_int = {
4200 			BPF_LD_IMM64(R0, 1),
4201 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
4202 			BPF_ALU32_REG(BPF_ADD, R0, R1),
4203 			BPF_EXIT_INSN(),
4204 		},
4205 		INTERNAL,
4206 		{ },
4207 		{ { 0, 4294967295U } },
4208 	},
4209 	{
4210 		"ALU_ADD_X: 2 + 4294967294 = 0",
4211 		.u.insns_int = {
4212 			BPF_LD_IMM64(R0, 2),
4213 			BPF_LD_IMM64(R1, 4294967294U),
4214 			BPF_ALU32_REG(BPF_ADD, R0, R1),
4215 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
4216 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4217 			BPF_EXIT_INSN(),
4218 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4219 			BPF_EXIT_INSN(),
4220 		},
4221 		INTERNAL,
4222 		{ },
4223 		{ { 0, 1 } },
4224 	},
4225 	{
4226 		"ALU64_ADD_X: 1 + 2 = 3",
4227 		.u.insns_int = {
4228 			BPF_LD_IMM64(R0, 1),
4229 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
4230 			BPF_ALU64_REG(BPF_ADD, R0, R1),
4231 			BPF_EXIT_INSN(),
4232 		},
4233 		INTERNAL,
4234 		{ },
4235 		{ { 0, 3 } },
4236 	},
4237 	{
4238 		"ALU64_ADD_X: 1 + 4294967294 = 4294967295",
4239 		.u.insns_int = {
4240 			BPF_LD_IMM64(R0, 1),
4241 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
4242 			BPF_ALU64_REG(BPF_ADD, R0, R1),
4243 			BPF_EXIT_INSN(),
4244 		},
4245 		INTERNAL,
4246 		{ },
4247 		{ { 0, 4294967295U } },
4248 	},
4249 	{
4250 		"ALU64_ADD_X: 2 + 4294967294 = 4294967296",
4251 		.u.insns_int = {
4252 			BPF_LD_IMM64(R0, 2),
4253 			BPF_LD_IMM64(R1, 4294967294U),
4254 			BPF_LD_IMM64(R2, 4294967296ULL),
4255 			BPF_ALU64_REG(BPF_ADD, R0, R1),
4256 			BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
4257 			BPF_MOV32_IMM(R0, 0),
4258 			BPF_EXIT_INSN(),
4259 			BPF_MOV32_IMM(R0, 1),
4260 			BPF_EXIT_INSN(),
4261 		},
4262 		INTERNAL,
4263 		{ },
4264 		{ { 0, 1 } },
4265 	},
4266 	/* BPF_ALU | BPF_ADD | BPF_K */
4267 	{
4268 		"ALU_ADD_K: 1 + 2 = 3",
4269 		.u.insns_int = {
4270 			BPF_LD_IMM64(R0, 1),
4271 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
4272 			BPF_EXIT_INSN(),
4273 		},
4274 		INTERNAL,
4275 		{ },
4276 		{ { 0, 3 } },
4277 	},
4278 	{
4279 		"ALU_ADD_K: 3 + 0 = 3",
4280 		.u.insns_int = {
4281 			BPF_LD_IMM64(R0, 3),
4282 			BPF_ALU32_IMM(BPF_ADD, R0, 0),
4283 			BPF_EXIT_INSN(),
4284 		},
4285 		INTERNAL,
4286 		{ },
4287 		{ { 0, 3 } },
4288 	},
4289 	{
4290 		"ALU_ADD_K: 1 + 4294967294 = 4294967295",
4291 		.u.insns_int = {
4292 			BPF_LD_IMM64(R0, 1),
4293 			BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
4294 			BPF_EXIT_INSN(),
4295 		},
4296 		INTERNAL,
4297 		{ },
4298 		{ { 0, 4294967295U } },
4299 	},
4300 	{
4301 		"ALU_ADD_K: 4294967294 + 2 = 0",
4302 		.u.insns_int = {
4303 			BPF_LD_IMM64(R0, 4294967294U),
4304 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
4305 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
4306 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4307 			BPF_EXIT_INSN(),
4308 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4309 			BPF_EXIT_INSN(),
4310 		},
4311 		INTERNAL,
4312 		{ },
4313 		{ { 0, 1 } },
4314 	},
4315 	{
4316 		"ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
4317 		.u.insns_int = {
4318 			BPF_LD_IMM64(R2, 0x0),
4319 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
4320 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
4321 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4322 			BPF_MOV32_IMM(R0, 2),
4323 			BPF_EXIT_INSN(),
4324 			BPF_MOV32_IMM(R0, 1),
4325 			BPF_EXIT_INSN(),
4326 		},
4327 		INTERNAL,
4328 		{ },
4329 		{ { 0, 0x1 } },
4330 	},
4331 	{
4332 		"ALU_ADD_K: 0 + 0xffff = 0xffff",
4333 		.u.insns_int = {
4334 			BPF_LD_IMM64(R2, 0x0),
4335 			BPF_LD_IMM64(R3, 0xffff),
4336 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
4337 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4338 			BPF_MOV32_IMM(R0, 2),
4339 			BPF_EXIT_INSN(),
4340 			BPF_MOV32_IMM(R0, 1),
4341 			BPF_EXIT_INSN(),
4342 		},
4343 		INTERNAL,
4344 		{ },
4345 		{ { 0, 0x1 } },
4346 	},
4347 	{
4348 		"ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
4349 		.u.insns_int = {
4350 			BPF_LD_IMM64(R2, 0x0),
4351 			BPF_LD_IMM64(R3, 0x7fffffff),
4352 			BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
4353 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4354 			BPF_MOV32_IMM(R0, 2),
4355 			BPF_EXIT_INSN(),
4356 			BPF_MOV32_IMM(R0, 1),
4357 			BPF_EXIT_INSN(),
4358 		},
4359 		INTERNAL,
4360 		{ },
4361 		{ { 0, 0x1 } },
4362 	},
4363 	{
4364 		"ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
4365 		.u.insns_int = {
4366 			BPF_LD_IMM64(R2, 0x0),
4367 			BPF_LD_IMM64(R3, 0x80000000),
4368 			BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
4369 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4370 			BPF_MOV32_IMM(R0, 2),
4371 			BPF_EXIT_INSN(),
4372 			BPF_MOV32_IMM(R0, 1),
4373 			BPF_EXIT_INSN(),
4374 		},
4375 		INTERNAL,
4376 		{ },
4377 		{ { 0, 0x1 } },
4378 	},
4379 	{
4380 		"ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
4381 		.u.insns_int = {
4382 			BPF_LD_IMM64(R2, 0x0),
4383 			BPF_LD_IMM64(R3, 0x80008000),
4384 			BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
4385 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4386 			BPF_MOV32_IMM(R0, 2),
4387 			BPF_EXIT_INSN(),
4388 			BPF_MOV32_IMM(R0, 1),
4389 			BPF_EXIT_INSN(),
4390 		},
4391 		INTERNAL,
4392 		{ },
4393 		{ { 0, 0x1 } },
4394 	},
4395 	{
4396 		"ALU64_ADD_K: 1 + 2 = 3",
4397 		.u.insns_int = {
4398 			BPF_LD_IMM64(R0, 1),
4399 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
4400 			BPF_EXIT_INSN(),
4401 		},
4402 		INTERNAL,
4403 		{ },
4404 		{ { 0, 3 } },
4405 	},
4406 	{
4407 		"ALU64_ADD_K: 3 + 0 = 3",
4408 		.u.insns_int = {
4409 			BPF_LD_IMM64(R0, 3),
4410 			BPF_ALU64_IMM(BPF_ADD, R0, 0),
4411 			BPF_EXIT_INSN(),
4412 		},
4413 		INTERNAL,
4414 		{ },
4415 		{ { 0, 3 } },
4416 	},
4417 	{
4418 		"ALU64_ADD_K: 1 + 2147483646 = 2147483647",
4419 		.u.insns_int = {
4420 			BPF_LD_IMM64(R0, 1),
4421 			BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
4422 			BPF_EXIT_INSN(),
4423 		},
4424 		INTERNAL,
4425 		{ },
4426 		{ { 0, 2147483647 } },
4427 	},
4428 	{
4429 		"ALU64_ADD_K: 4294967294 + 2 = 4294967296",
4430 		.u.insns_int = {
4431 			BPF_LD_IMM64(R0, 4294967294U),
4432 			BPF_LD_IMM64(R1, 4294967296ULL),
4433 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
4434 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
4435 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4436 			BPF_EXIT_INSN(),
4437 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4438 			BPF_EXIT_INSN(),
4439 		},
4440 		INTERNAL,
4441 		{ },
4442 		{ { 0, 1 } },
4443 	},
4444 	{
4445 		"ALU64_ADD_K: 2147483646 + -2147483647 = -1",
4446 		.u.insns_int = {
4447 			BPF_LD_IMM64(R0, 2147483646),
4448 			BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
4449 			BPF_EXIT_INSN(),
4450 		},
4451 		INTERNAL,
4452 		{ },
4453 		{ { 0, -1 } },
4454 	},
4455 	{
4456 		"ALU64_ADD_K: 1 + 0 = 1",
4457 		.u.insns_int = {
4458 			BPF_LD_IMM64(R2, 0x1),
4459 			BPF_LD_IMM64(R3, 0x1),
4460 			BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
4461 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4462 			BPF_MOV32_IMM(R0, 2),
4463 			BPF_EXIT_INSN(),
4464 			BPF_MOV32_IMM(R0, 1),
4465 			BPF_EXIT_INSN(),
4466 		},
4467 		INTERNAL,
4468 		{ },
4469 		{ { 0, 0x1 } },
4470 	},
4471 	{
4472 		"ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
4473 		.u.insns_int = {
4474 			BPF_LD_IMM64(R2, 0x0),
4475 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4476 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
4477 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4478 			BPF_MOV32_IMM(R0, 2),
4479 			BPF_EXIT_INSN(),
4480 			BPF_MOV32_IMM(R0, 1),
4481 			BPF_EXIT_INSN(),
4482 		},
4483 		INTERNAL,
4484 		{ },
4485 		{ { 0, 0x1 } },
4486 	},
4487 	{
4488 		"ALU64_ADD_K: 0 + 0xffff = 0xffff",
4489 		.u.insns_int = {
4490 			BPF_LD_IMM64(R2, 0x0),
4491 			BPF_LD_IMM64(R3, 0xffff),
4492 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
4493 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4494 			BPF_MOV32_IMM(R0, 2),
4495 			BPF_EXIT_INSN(),
4496 			BPF_MOV32_IMM(R0, 1),
4497 			BPF_EXIT_INSN(),
4498 		},
4499 		INTERNAL,
4500 		{ },
4501 		{ { 0, 0x1 } },
4502 	},
4503 	{
4504 		"ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
4505 		.u.insns_int = {
4506 			BPF_LD_IMM64(R2, 0x0),
4507 			BPF_LD_IMM64(R3, 0x7fffffff),
4508 			BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
4509 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4510 			BPF_MOV32_IMM(R0, 2),
4511 			BPF_EXIT_INSN(),
4512 			BPF_MOV32_IMM(R0, 1),
4513 			BPF_EXIT_INSN(),
4514 		},
4515 		INTERNAL,
4516 		{ },
4517 		{ { 0, 0x1 } },
4518 	},
4519 	{
4520 		"ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
4521 		.u.insns_int = {
4522 			BPF_LD_IMM64(R2, 0x0),
4523 			BPF_LD_IMM64(R3, 0xffffffff80000000LL),
4524 			BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
4525 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4526 			BPF_MOV32_IMM(R0, 2),
4527 			BPF_EXIT_INSN(),
4528 			BPF_MOV32_IMM(R0, 1),
4529 			BPF_EXIT_INSN(),
4530 		},
4531 		INTERNAL,
4532 		{ },
4533 		{ { 0, 0x1 } },
4534 	},
4535 	{
4536 		"ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
4537 		.u.insns_int = {
4538 			BPF_LD_IMM64(R2, 0x0),
4539 			BPF_LD_IMM64(R3, 0xffffffff80008000LL),
4540 			BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
4541 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4542 			BPF_MOV32_IMM(R0, 2),
4543 			BPF_EXIT_INSN(),
4544 			BPF_MOV32_IMM(R0, 1),
4545 			BPF_EXIT_INSN(),
4546 		},
4547 		INTERNAL,
4548 		{ },
4549 		{ { 0, 0x1 } },
4550 	},
4551 	/* BPF_ALU | BPF_SUB | BPF_X */
4552 	{
4553 		"ALU_SUB_X: 3 - 1 = 2",
4554 		.u.insns_int = {
4555 			BPF_LD_IMM64(R0, 3),
4556 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
4557 			BPF_ALU32_REG(BPF_SUB, R0, R1),
4558 			BPF_EXIT_INSN(),
4559 		},
4560 		INTERNAL,
4561 		{ },
4562 		{ { 0, 2 } },
4563 	},
4564 	{
4565 		"ALU_SUB_X: 4294967295 - 4294967294 = 1",
4566 		.u.insns_int = {
4567 			BPF_LD_IMM64(R0, 4294967295U),
4568 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
4569 			BPF_ALU32_REG(BPF_SUB, R0, R1),
4570 			BPF_EXIT_INSN(),
4571 		},
4572 		INTERNAL,
4573 		{ },
4574 		{ { 0, 1 } },
4575 	},
4576 	{
4577 		"ALU64_SUB_X: 3 - 1 = 2",
4578 		.u.insns_int = {
4579 			BPF_LD_IMM64(R0, 3),
4580 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
4581 			BPF_ALU64_REG(BPF_SUB, R0, R1),
4582 			BPF_EXIT_INSN(),
4583 		},
4584 		INTERNAL,
4585 		{ },
4586 		{ { 0, 2 } },
4587 	},
4588 	{
4589 		"ALU64_SUB_X: 4294967295 - 4294967294 = 1",
4590 		.u.insns_int = {
4591 			BPF_LD_IMM64(R0, 4294967295U),
4592 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
4593 			BPF_ALU64_REG(BPF_SUB, R0, R1),
4594 			BPF_EXIT_INSN(),
4595 		},
4596 		INTERNAL,
4597 		{ },
4598 		{ { 0, 1 } },
4599 	},
4600 	/* BPF_ALU | BPF_SUB | BPF_K */
4601 	{
4602 		"ALU_SUB_K: 3 - 1 = 2",
4603 		.u.insns_int = {
4604 			BPF_LD_IMM64(R0, 3),
4605 			BPF_ALU32_IMM(BPF_SUB, R0, 1),
4606 			BPF_EXIT_INSN(),
4607 		},
4608 		INTERNAL,
4609 		{ },
4610 		{ { 0, 2 } },
4611 	},
4612 	{
4613 		"ALU_SUB_K: 3 - 0 = 3",
4614 		.u.insns_int = {
4615 			BPF_LD_IMM64(R0, 3),
4616 			BPF_ALU32_IMM(BPF_SUB, R0, 0),
4617 			BPF_EXIT_INSN(),
4618 		},
4619 		INTERNAL,
4620 		{ },
4621 		{ { 0, 3 } },
4622 	},
4623 	{
4624 		"ALU_SUB_K: 4294967295 - 4294967294 = 1",
4625 		.u.insns_int = {
4626 			BPF_LD_IMM64(R0, 4294967295U),
4627 			BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
4628 			BPF_EXIT_INSN(),
4629 		},
4630 		INTERNAL,
4631 		{ },
4632 		{ { 0, 1 } },
4633 	},
4634 	{
4635 		"ALU64_SUB_K: 3 - 1 = 2",
4636 		.u.insns_int = {
4637 			BPF_LD_IMM64(R0, 3),
4638 			BPF_ALU64_IMM(BPF_SUB, R0, 1),
4639 			BPF_EXIT_INSN(),
4640 		},
4641 		INTERNAL,
4642 		{ },
4643 		{ { 0, 2 } },
4644 	},
4645 	{
4646 		"ALU64_SUB_K: 3 - 0 = 3",
4647 		.u.insns_int = {
4648 			BPF_LD_IMM64(R0, 3),
4649 			BPF_ALU64_IMM(BPF_SUB, R0, 0),
4650 			BPF_EXIT_INSN(),
4651 		},
4652 		INTERNAL,
4653 		{ },
4654 		{ { 0, 3 } },
4655 	},
4656 	{
4657 		"ALU64_SUB_K: 4294967294 - 4294967295 = -1",
4658 		.u.insns_int = {
4659 			BPF_LD_IMM64(R0, 4294967294U),
4660 			BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
4661 			BPF_EXIT_INSN(),
4662 		},
4663 		INTERNAL,
4664 		{ },
4665 		{ { 0, -1 } },
4666 	},
4667 	{
4668 		"ALU64_ADD_K: 2147483646 - 2147483647 = -1",
4669 		.u.insns_int = {
4670 			BPF_LD_IMM64(R0, 2147483646),
4671 			BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
4672 			BPF_EXIT_INSN(),
4673 		},
4674 		INTERNAL,
4675 		{ },
4676 		{ { 0, -1 } },
4677 	},
4678 	/* BPF_ALU | BPF_MUL | BPF_X */
4679 	{
4680 		"ALU_MUL_X: 2 * 3 = 6",
4681 		.u.insns_int = {
4682 			BPF_LD_IMM64(R0, 2),
4683 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
4684 			BPF_ALU32_REG(BPF_MUL, R0, R1),
4685 			BPF_EXIT_INSN(),
4686 		},
4687 		INTERNAL,
4688 		{ },
4689 		{ { 0, 6 } },
4690 	},
4691 	{
4692 		"ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
4693 		.u.insns_int = {
4694 			BPF_LD_IMM64(R0, 2),
4695 			BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
4696 			BPF_ALU32_REG(BPF_MUL, R0, R1),
4697 			BPF_EXIT_INSN(),
4698 		},
4699 		INTERNAL,
4700 		{ },
4701 		{ { 0, 0xFFFFFFF0 } },
4702 	},
4703 	{
4704 		"ALU_MUL_X: -1 * -1 = 1",
4705 		.u.insns_int = {
4706 			BPF_LD_IMM64(R0, -1),
4707 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
4708 			BPF_ALU32_REG(BPF_MUL, R0, R1),
4709 			BPF_EXIT_INSN(),
4710 		},
4711 		INTERNAL,
4712 		{ },
4713 		{ { 0, 1 } },
4714 	},
4715 	{
4716 		"ALU64_MUL_X: 2 * 3 = 6",
4717 		.u.insns_int = {
4718 			BPF_LD_IMM64(R0, 2),
4719 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
4720 			BPF_ALU64_REG(BPF_MUL, R0, R1),
4721 			BPF_EXIT_INSN(),
4722 		},
4723 		INTERNAL,
4724 		{ },
4725 		{ { 0, 6 } },
4726 	},
4727 	{
4728 		"ALU64_MUL_X: 1 * 2147483647 = 2147483647",
4729 		.u.insns_int = {
4730 			BPF_LD_IMM64(R0, 1),
4731 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
4732 			BPF_ALU64_REG(BPF_MUL, R0, R1),
4733 			BPF_EXIT_INSN(),
4734 		},
4735 		INTERNAL,
4736 		{ },
4737 		{ { 0, 2147483647 } },
4738 	},
4739 	{
4740 		"ALU64_MUL_X: 64x64 multiply, low word",
4741 		.u.insns_int = {
4742 			BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
4743 			BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
4744 			BPF_ALU64_REG(BPF_MUL, R0, R1),
4745 			BPF_EXIT_INSN(),
4746 		},
4747 		INTERNAL,
4748 		{ },
4749 		{ { 0, 0xe5618cf0 } }
4750 	},
4751 	{
4752 		"ALU64_MUL_X: 64x64 multiply, high word",
4753 		.u.insns_int = {
4754 			BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
4755 			BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
4756 			BPF_ALU64_REG(BPF_MUL, R0, R1),
4757 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
4758 			BPF_EXIT_INSN(),
4759 		},
4760 		INTERNAL,
4761 		{ },
4762 		{ { 0, 0x2236d88f } }
4763 	},
4764 	/* BPF_ALU | BPF_MUL | BPF_K */
4765 	{
4766 		"ALU_MUL_K: 2 * 3 = 6",
4767 		.u.insns_int = {
4768 			BPF_LD_IMM64(R0, 2),
4769 			BPF_ALU32_IMM(BPF_MUL, R0, 3),
4770 			BPF_EXIT_INSN(),
4771 		},
4772 		INTERNAL,
4773 		{ },
4774 		{ { 0, 6 } },
4775 	},
4776 	{
4777 		"ALU_MUL_K: 3 * 1 = 3",
4778 		.u.insns_int = {
4779 			BPF_LD_IMM64(R0, 3),
4780 			BPF_ALU32_IMM(BPF_MUL, R0, 1),
4781 			BPF_EXIT_INSN(),
4782 		},
4783 		INTERNAL,
4784 		{ },
4785 		{ { 0, 3 } },
4786 	},
4787 	{
4788 		"ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
4789 		.u.insns_int = {
4790 			BPF_LD_IMM64(R0, 2),
4791 			BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
4792 			BPF_EXIT_INSN(),
4793 		},
4794 		INTERNAL,
4795 		{ },
4796 		{ { 0, 0xFFFFFFF0 } },
4797 	},
4798 	{
4799 		"ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
4800 		.u.insns_int = {
4801 			BPF_LD_IMM64(R2, 0x1),
4802 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
4803 			BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
4804 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4805 			BPF_MOV32_IMM(R0, 2),
4806 			BPF_EXIT_INSN(),
4807 			BPF_MOV32_IMM(R0, 1),
4808 			BPF_EXIT_INSN(),
4809 		},
4810 		INTERNAL,
4811 		{ },
4812 		{ { 0, 0x1 } },
4813 	},
4814 	{
4815 		"ALU64_MUL_K: 2 * 3 = 6",
4816 		.u.insns_int = {
4817 			BPF_LD_IMM64(R0, 2),
4818 			BPF_ALU64_IMM(BPF_MUL, R0, 3),
4819 			BPF_EXIT_INSN(),
4820 		},
4821 		INTERNAL,
4822 		{ },
4823 		{ { 0, 6 } },
4824 	},
4825 	{
4826 		"ALU64_MUL_K: 3 * 1 = 3",
4827 		.u.insns_int = {
4828 			BPF_LD_IMM64(R0, 3),
4829 			BPF_ALU64_IMM(BPF_MUL, R0, 1),
4830 			BPF_EXIT_INSN(),
4831 		},
4832 		INTERNAL,
4833 		{ },
4834 		{ { 0, 3 } },
4835 	},
4836 	{
4837 		"ALU64_MUL_K: 1 * 2147483647 = 2147483647",
4838 		.u.insns_int = {
4839 			BPF_LD_IMM64(R0, 1),
4840 			BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
4841 			BPF_EXIT_INSN(),
4842 		},
4843 		INTERNAL,
4844 		{ },
4845 		{ { 0, 2147483647 } },
4846 	},
4847 	{
4848 		"ALU64_MUL_K: 1 * -2147483647 = -2147483647",
4849 		.u.insns_int = {
4850 			BPF_LD_IMM64(R0, 1),
4851 			BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
4852 			BPF_EXIT_INSN(),
4853 		},
4854 		INTERNAL,
4855 		{ },
4856 		{ { 0, -2147483647 } },
4857 	},
4858 	{
4859 		"ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
4860 		.u.insns_int = {
4861 			BPF_LD_IMM64(R2, 0x1),
4862 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4863 			BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
4864 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4865 			BPF_MOV32_IMM(R0, 2),
4866 			BPF_EXIT_INSN(),
4867 			BPF_MOV32_IMM(R0, 1),
4868 			BPF_EXIT_INSN(),
4869 		},
4870 		INTERNAL,
4871 		{ },
4872 		{ { 0, 0x1 } },
4873 	},
4874 	{
4875 		"ALU64_MUL_K: 64x32 multiply, low word",
4876 		.u.insns_int = {
4877 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4878 			BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
4879 			BPF_EXIT_INSN(),
4880 		},
4881 		INTERNAL,
4882 		{ },
4883 		{ { 0, 0xe242d208 } }
4884 	},
4885 	{
4886 		"ALU64_MUL_K: 64x32 multiply, high word",
4887 		.u.insns_int = {
4888 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4889 			BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
4890 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
4891 			BPF_EXIT_INSN(),
4892 		},
4893 		INTERNAL,
4894 		{ },
4895 		{ { 0, 0xc28f5c28 } }
4896 	},
4897 	/* BPF_ALU | BPF_DIV | BPF_X */
4898 	{
4899 		"ALU_DIV_X: 6 / 2 = 3",
4900 		.u.insns_int = {
4901 			BPF_LD_IMM64(R0, 6),
4902 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
4903 			BPF_ALU32_REG(BPF_DIV, R0, R1),
4904 			BPF_EXIT_INSN(),
4905 		},
4906 		INTERNAL,
4907 		{ },
4908 		{ { 0, 3 } },
4909 	},
4910 	{
4911 		"ALU_DIV_X: 4294967295 / 4294967295 = 1",
4912 		.u.insns_int = {
4913 			BPF_LD_IMM64(R0, 4294967295U),
4914 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
4915 			BPF_ALU32_REG(BPF_DIV, R0, R1),
4916 			BPF_EXIT_INSN(),
4917 		},
4918 		INTERNAL,
4919 		{ },
4920 		{ { 0, 1 } },
4921 	},
4922 	{
4923 		"ALU64_DIV_X: 6 / 2 = 3",
4924 		.u.insns_int = {
4925 			BPF_LD_IMM64(R0, 6),
4926 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
4927 			BPF_ALU64_REG(BPF_DIV, R0, R1),
4928 			BPF_EXIT_INSN(),
4929 		},
4930 		INTERNAL,
4931 		{ },
4932 		{ { 0, 3 } },
4933 	},
4934 	{
4935 		"ALU64_DIV_X: 2147483647 / 2147483647 = 1",
4936 		.u.insns_int = {
4937 			BPF_LD_IMM64(R0, 2147483647),
4938 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
4939 			BPF_ALU64_REG(BPF_DIV, R0, R1),
4940 			BPF_EXIT_INSN(),
4941 		},
4942 		INTERNAL,
4943 		{ },
4944 		{ { 0, 1 } },
4945 	},
4946 	{
4947 		"ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
4948 		.u.insns_int = {
4949 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
4950 			BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
4951 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
4952 			BPF_ALU64_REG(BPF_DIV, R2, R4),
4953 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4954 			BPF_MOV32_IMM(R0, 2),
4955 			BPF_EXIT_INSN(),
4956 			BPF_MOV32_IMM(R0, 1),
4957 			BPF_EXIT_INSN(),
4958 		},
4959 		INTERNAL,
4960 		{ },
4961 		{ { 0, 0x1 } },
4962 	},
4963 	/* BPF_ALU | BPF_DIV | BPF_K */
4964 	{
4965 		"ALU_DIV_K: 6 / 2 = 3",
4966 		.u.insns_int = {
4967 			BPF_LD_IMM64(R0, 6),
4968 			BPF_ALU32_IMM(BPF_DIV, R0, 2),
4969 			BPF_EXIT_INSN(),
4970 		},
4971 		INTERNAL,
4972 		{ },
4973 		{ { 0, 3 } },
4974 	},
4975 	{
4976 		"ALU_DIV_K: 3 / 1 = 3",
4977 		.u.insns_int = {
4978 			BPF_LD_IMM64(R0, 3),
4979 			BPF_ALU32_IMM(BPF_DIV, R0, 1),
4980 			BPF_EXIT_INSN(),
4981 		},
4982 		INTERNAL,
4983 		{ },
4984 		{ { 0, 3 } },
4985 	},
4986 	{
4987 		"ALU_DIV_K: 4294967295 / 4294967295 = 1",
4988 		.u.insns_int = {
4989 			BPF_LD_IMM64(R0, 4294967295U),
4990 			BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
4991 			BPF_EXIT_INSN(),
4992 		},
4993 		INTERNAL,
4994 		{ },
4995 		{ { 0, 1 } },
4996 	},
4997 	{
4998 		"ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
4999 		.u.insns_int = {
5000 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5001 			BPF_LD_IMM64(R3, 0x1UL),
5002 			BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
5003 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5004 			BPF_MOV32_IMM(R0, 2),
5005 			BPF_EXIT_INSN(),
5006 			BPF_MOV32_IMM(R0, 1),
5007 			BPF_EXIT_INSN(),
5008 		},
5009 		INTERNAL,
5010 		{ },
5011 		{ { 0, 0x1 } },
5012 	},
5013 	{
5014 		"ALU64_DIV_K: 6 / 2 = 3",
5015 		.u.insns_int = {
5016 			BPF_LD_IMM64(R0, 6),
5017 			BPF_ALU64_IMM(BPF_DIV, R0, 2),
5018 			BPF_EXIT_INSN(),
5019 		},
5020 		INTERNAL,
5021 		{ },
5022 		{ { 0, 3 } },
5023 	},
5024 	{
5025 		"ALU64_DIV_K: 3 / 1 = 3",
5026 		.u.insns_int = {
5027 			BPF_LD_IMM64(R0, 3),
5028 			BPF_ALU64_IMM(BPF_DIV, R0, 1),
5029 			BPF_EXIT_INSN(),
5030 		},
5031 		INTERNAL,
5032 		{ },
5033 		{ { 0, 3 } },
5034 	},
5035 	{
5036 		"ALU64_DIV_K: 2147483647 / 2147483647 = 1",
5037 		.u.insns_int = {
5038 			BPF_LD_IMM64(R0, 2147483647),
5039 			BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
5040 			BPF_EXIT_INSN(),
5041 		},
5042 		INTERNAL,
5043 		{ },
5044 		{ { 0, 1 } },
5045 	},
5046 	{
5047 		"ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
5048 		.u.insns_int = {
5049 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5050 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
5051 			BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
5052 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5053 			BPF_MOV32_IMM(R0, 2),
5054 			BPF_EXIT_INSN(),
5055 			BPF_MOV32_IMM(R0, 1),
5056 			BPF_EXIT_INSN(),
5057 		},
5058 		INTERNAL,
5059 		{ },
5060 		{ { 0, 0x1 } },
5061 	},
5062 	/* BPF_ALU | BPF_MOD | BPF_X */
5063 	{
5064 		"ALU_MOD_X: 3 % 2 = 1",
5065 		.u.insns_int = {
5066 			BPF_LD_IMM64(R0, 3),
5067 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
5068 			BPF_ALU32_REG(BPF_MOD, R0, R1),
5069 			BPF_EXIT_INSN(),
5070 		},
5071 		INTERNAL,
5072 		{ },
5073 		{ { 0, 1 } },
5074 	},
5075 	{
5076 		"ALU_MOD_X: 4294967295 % 4294967293 = 2",
5077 		.u.insns_int = {
5078 			BPF_LD_IMM64(R0, 4294967295U),
5079 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
5080 			BPF_ALU32_REG(BPF_MOD, R0, R1),
5081 			BPF_EXIT_INSN(),
5082 		},
5083 		INTERNAL,
5084 		{ },
5085 		{ { 0, 2 } },
5086 	},
5087 	{
5088 		"ALU64_MOD_X: 3 % 2 = 1",
5089 		.u.insns_int = {
5090 			BPF_LD_IMM64(R0, 3),
5091 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
5092 			BPF_ALU64_REG(BPF_MOD, R0, R1),
5093 			BPF_EXIT_INSN(),
5094 		},
5095 		INTERNAL,
5096 		{ },
5097 		{ { 0, 1 } },
5098 	},
5099 	{
5100 		"ALU64_MOD_X: 2147483647 % 2147483645 = 2",
5101 		.u.insns_int = {
5102 			BPF_LD_IMM64(R0, 2147483647),
5103 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
5104 			BPF_ALU64_REG(BPF_MOD, R0, R1),
5105 			BPF_EXIT_INSN(),
5106 		},
5107 		INTERNAL,
5108 		{ },
5109 		{ { 0, 2 } },
5110 	},
5111 	/* BPF_ALU | BPF_MOD | BPF_K */
5112 	{
5113 		"ALU_MOD_K: 3 % 2 = 1",
5114 		.u.insns_int = {
5115 			BPF_LD_IMM64(R0, 3),
5116 			BPF_ALU32_IMM(BPF_MOD, R0, 2),
5117 			BPF_EXIT_INSN(),
5118 		},
5119 		INTERNAL,
5120 		{ },
5121 		{ { 0, 1 } },
5122 	},
5123 	{
5124 		"ALU_MOD_K: 3 % 1 = 0",
5125 		.u.insns_int = {
5126 			BPF_LD_IMM64(R0, 3),
5127 			BPF_ALU32_IMM(BPF_MOD, R0, 1),
5128 			BPF_EXIT_INSN(),
5129 		},
5130 		INTERNAL,
5131 		{ },
5132 		{ { 0, 0 } },
5133 	},
5134 	{
5135 		"ALU_MOD_K: 4294967295 % 4294967293 = 2",
5136 		.u.insns_int = {
5137 			BPF_LD_IMM64(R0, 4294967295U),
5138 			BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
5139 			BPF_EXIT_INSN(),
5140 		},
5141 		INTERNAL,
5142 		{ },
5143 		{ { 0, 2 } },
5144 	},
5145 	{
5146 		"ALU64_MOD_K: 3 % 2 = 1",
5147 		.u.insns_int = {
5148 			BPF_LD_IMM64(R0, 3),
5149 			BPF_ALU64_IMM(BPF_MOD, R0, 2),
5150 			BPF_EXIT_INSN(),
5151 		},
5152 		INTERNAL,
5153 		{ },
5154 		{ { 0, 1 } },
5155 	},
5156 	{
5157 		"ALU64_MOD_K: 3 % 1 = 0",
5158 		.u.insns_int = {
5159 			BPF_LD_IMM64(R0, 3),
5160 			BPF_ALU64_IMM(BPF_MOD, R0, 1),
5161 			BPF_EXIT_INSN(),
5162 		},
5163 		INTERNAL,
5164 		{ },
5165 		{ { 0, 0 } },
5166 	},
5167 	{
5168 		"ALU64_MOD_K: 2147483647 % 2147483645 = 2",
5169 		.u.insns_int = {
5170 			BPF_LD_IMM64(R0, 2147483647),
5171 			BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
5172 			BPF_EXIT_INSN(),
5173 		},
5174 		INTERNAL,
5175 		{ },
5176 		{ { 0, 2 } },
5177 	},
5178 	/* BPF_ALU | BPF_AND | BPF_X */
5179 	{
5180 		"ALU_AND_X: 3 & 2 = 2",
5181 		.u.insns_int = {
5182 			BPF_LD_IMM64(R0, 3),
5183 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
5184 			BPF_ALU32_REG(BPF_AND, R0, R1),
5185 			BPF_EXIT_INSN(),
5186 		},
5187 		INTERNAL,
5188 		{ },
5189 		{ { 0, 2 } },
5190 	},
5191 	{
5192 		"ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
5193 		.u.insns_int = {
5194 			BPF_LD_IMM64(R0, 0xffffffff),
5195 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
5196 			BPF_ALU32_REG(BPF_AND, R0, R1),
5197 			BPF_EXIT_INSN(),
5198 		},
5199 		INTERNAL,
5200 		{ },
5201 		{ { 0, 0xffffffff } },
5202 	},
5203 	{
5204 		"ALU64_AND_X: 3 & 2 = 2",
5205 		.u.insns_int = {
5206 			BPF_LD_IMM64(R0, 3),
5207 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
5208 			BPF_ALU64_REG(BPF_AND, R0, R1),
5209 			BPF_EXIT_INSN(),
5210 		},
5211 		INTERNAL,
5212 		{ },
5213 		{ { 0, 2 } },
5214 	},
5215 	{
5216 		"ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
5217 		.u.insns_int = {
5218 			BPF_LD_IMM64(R0, 0xffffffff),
5219 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
5220 			BPF_ALU64_REG(BPF_AND, R0, R1),
5221 			BPF_EXIT_INSN(),
5222 		},
5223 		INTERNAL,
5224 		{ },
5225 		{ { 0, 0xffffffff } },
5226 	},
5227 	/* BPF_ALU | BPF_AND | BPF_K */
5228 	{
5229 		"ALU_AND_K: 3 & 2 = 2",
5230 		.u.insns_int = {
5231 			BPF_LD_IMM64(R0, 3),
5232 			BPF_ALU32_IMM(BPF_AND, R0, 2),
5233 			BPF_EXIT_INSN(),
5234 		},
5235 		INTERNAL,
5236 		{ },
5237 		{ { 0, 2 } },
5238 	},
5239 	{
5240 		"ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
5241 		.u.insns_int = {
5242 			BPF_LD_IMM64(R0, 0xffffffff),
5243 			BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
5244 			BPF_EXIT_INSN(),
5245 		},
5246 		INTERNAL,
5247 		{ },
5248 		{ { 0, 0xffffffff } },
5249 	},
5250 	{
5251 		"ALU_AND_K: Small immediate",
5252 		.u.insns_int = {
5253 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
5254 			BPF_ALU32_IMM(BPF_AND, R0, 15),
5255 			BPF_EXIT_INSN(),
5256 		},
5257 		INTERNAL,
5258 		{ },
5259 		{ { 0, 4 } }
5260 	},
5261 	{
5262 		"ALU_AND_K: Large immediate",
5263 		.u.insns_int = {
5264 			BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
5265 			BPF_ALU32_IMM(BPF_AND, R0, 0xafbfcfdf),
5266 			BPF_EXIT_INSN(),
5267 		},
5268 		INTERNAL,
5269 		{ },
5270 		{ { 0, 0xa1b2c3d4 } }
5271 	},
5272 	{
5273 		"ALU_AND_K: Zero extension",
5274 		.u.insns_int = {
5275 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5276 			BPF_LD_IMM64(R1, 0x0000000080a0c0e0LL),
5277 			BPF_ALU32_IMM(BPF_AND, R0, 0xf0f0f0f0),
5278 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5279 			BPF_MOV32_IMM(R0, 2),
5280 			BPF_EXIT_INSN(),
5281 			BPF_MOV32_IMM(R0, 1),
5282 			BPF_EXIT_INSN(),
5283 		},
5284 		INTERNAL,
5285 		{ },
5286 		{ { 0, 1 } }
5287 	},
5288 	{
5289 		"ALU64_AND_K: 3 & 2 = 2",
5290 		.u.insns_int = {
5291 			BPF_LD_IMM64(R0, 3),
5292 			BPF_ALU64_IMM(BPF_AND, R0, 2),
5293 			BPF_EXIT_INSN(),
5294 		},
5295 		INTERNAL,
5296 		{ },
5297 		{ { 0, 2 } },
5298 	},
5299 	{
5300 		"ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
5301 		.u.insns_int = {
5302 			BPF_LD_IMM64(R0, 0xffffffff),
5303 			BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
5304 			BPF_EXIT_INSN(),
5305 		},
5306 		INTERNAL,
5307 		{ },
5308 		{ { 0, 0xffffffff } },
5309 	},
5310 	{
5311 		"ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000000000000000",
5312 		.u.insns_int = {
5313 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5314 			BPF_LD_IMM64(R3, 0x0000000000000000LL),
5315 			BPF_ALU64_IMM(BPF_AND, R2, 0x0),
5316 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5317 			BPF_MOV32_IMM(R0, 2),
5318 			BPF_EXIT_INSN(),
5319 			BPF_MOV32_IMM(R0, 1),
5320 			BPF_EXIT_INSN(),
5321 		},
5322 		INTERNAL,
5323 		{ },
5324 		{ { 0, 0x1 } },
5325 	},
5326 	{
5327 		"ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffff0000",
5328 		.u.insns_int = {
5329 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5330 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
5331 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
5332 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5333 			BPF_MOV32_IMM(R0, 2),
5334 			BPF_EXIT_INSN(),
5335 			BPF_MOV32_IMM(R0, 1),
5336 			BPF_EXIT_INSN(),
5337 		},
5338 		INTERNAL,
5339 		{ },
5340 		{ { 0, 0x1 } },
5341 	},
5342 	{
5343 		"ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
5344 		.u.insns_int = {
5345 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5346 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5347 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
5348 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5349 			BPF_MOV32_IMM(R0, 2),
5350 			BPF_EXIT_INSN(),
5351 			BPF_MOV32_IMM(R0, 1),
5352 			BPF_EXIT_INSN(),
5353 		},
5354 		INTERNAL,
5355 		{ },
5356 		{ { 0, 0x1 } },
5357 	},
5358 	{
5359 		"ALU64_AND_K: Sign extension 1",
5360 		.u.insns_int = {
5361 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5362 			BPF_LD_IMM64(R1, 0x00000000090b0d0fLL),
5363 			BPF_ALU64_IMM(BPF_AND, R0, 0x0f0f0f0f),
5364 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5365 			BPF_MOV32_IMM(R0, 2),
5366 			BPF_EXIT_INSN(),
5367 			BPF_MOV32_IMM(R0, 1),
5368 			BPF_EXIT_INSN(),
5369 		},
5370 		INTERNAL,
5371 		{ },
5372 		{ { 0, 1 } }
5373 	},
5374 	{
5375 		"ALU64_AND_K: Sign extension 2",
5376 		.u.insns_int = {
5377 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5378 			BPF_LD_IMM64(R1, 0x0123456780a0c0e0LL),
5379 			BPF_ALU64_IMM(BPF_AND, R0, 0xf0f0f0f0),
5380 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5381 			BPF_MOV32_IMM(R0, 2),
5382 			BPF_EXIT_INSN(),
5383 			BPF_MOV32_IMM(R0, 1),
5384 			BPF_EXIT_INSN(),
5385 		},
5386 		INTERNAL,
5387 		{ },
5388 		{ { 0, 1 } }
5389 	},
5390 	/* BPF_ALU | BPF_OR | BPF_X */
5391 	{
5392 		"ALU_OR_X: 1 | 2 = 3",
5393 		.u.insns_int = {
5394 			BPF_LD_IMM64(R0, 1),
5395 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
5396 			BPF_ALU32_REG(BPF_OR, R0, R1),
5397 			BPF_EXIT_INSN(),
5398 		},
5399 		INTERNAL,
5400 		{ },
5401 		{ { 0, 3 } },
5402 	},
5403 	{
5404 		"ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
5405 		.u.insns_int = {
5406 			BPF_LD_IMM64(R0, 0),
5407 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
5408 			BPF_ALU32_REG(BPF_OR, R0, R1),
5409 			BPF_EXIT_INSN(),
5410 		},
5411 		INTERNAL,
5412 		{ },
5413 		{ { 0, 0xffffffff } },
5414 	},
5415 	{
5416 		"ALU64_OR_X: 1 | 2 = 3",
5417 		.u.insns_int = {
5418 			BPF_LD_IMM64(R0, 1),
5419 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
5420 			BPF_ALU64_REG(BPF_OR, R0, R1),
5421 			BPF_EXIT_INSN(),
5422 		},
5423 		INTERNAL,
5424 		{ },
5425 		{ { 0, 3 } },
5426 	},
5427 	{
5428 		"ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
5429 		.u.insns_int = {
5430 			BPF_LD_IMM64(R0, 0),
5431 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
5432 			BPF_ALU64_REG(BPF_OR, R0, R1),
5433 			BPF_EXIT_INSN(),
5434 		},
5435 		INTERNAL,
5436 		{ },
5437 		{ { 0, 0xffffffff } },
5438 	},
5439 	/* BPF_ALU | BPF_OR | BPF_K */
5440 	{
5441 		"ALU_OR_K: 1 | 2 = 3",
5442 		.u.insns_int = {
5443 			BPF_LD_IMM64(R0, 1),
5444 			BPF_ALU32_IMM(BPF_OR, R0, 2),
5445 			BPF_EXIT_INSN(),
5446 		},
5447 		INTERNAL,
5448 		{ },
5449 		{ { 0, 3 } },
5450 	},
5451 	{
5452 		"ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
5453 		.u.insns_int = {
5454 			BPF_LD_IMM64(R0, 0),
5455 			BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
5456 			BPF_EXIT_INSN(),
5457 		},
5458 		INTERNAL,
5459 		{ },
5460 		{ { 0, 0xffffffff } },
5461 	},
5462 	{
5463 		"ALU_OR_K: Small immediate",
5464 		.u.insns_int = {
5465 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
5466 			BPF_ALU32_IMM(BPF_OR, R0, 1),
5467 			BPF_EXIT_INSN(),
5468 		},
5469 		INTERNAL,
5470 		{ },
5471 		{ { 0, 0x01020305 } }
5472 	},
5473 	{
5474 		"ALU_OR_K: Large immediate",
5475 		.u.insns_int = {
5476 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
5477 			BPF_ALU32_IMM(BPF_OR, R0, 0xa0b0c0d0),
5478 			BPF_EXIT_INSN(),
5479 		},
5480 		INTERNAL,
5481 		{ },
5482 		{ { 0, 0xa1b2c3d4 } }
5483 	},
5484 	{
5485 		"ALU_OR_K: Zero extension",
5486 		.u.insns_int = {
5487 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5488 			BPF_LD_IMM64(R1, 0x00000000f9fbfdffLL),
5489 			BPF_ALU32_IMM(BPF_OR, R0, 0xf0f0f0f0),
5490 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5491 			BPF_MOV32_IMM(R0, 2),
5492 			BPF_EXIT_INSN(),
5493 			BPF_MOV32_IMM(R0, 1),
5494 			BPF_EXIT_INSN(),
5495 		},
5496 		INTERNAL,
5497 		{ },
5498 		{ { 0, 1 } }
5499 	},
5500 	{
5501 		"ALU64_OR_K: 1 | 2 = 3",
5502 		.u.insns_int = {
5503 			BPF_LD_IMM64(R0, 1),
5504 			BPF_ALU64_IMM(BPF_OR, R0, 2),
5505 			BPF_EXIT_INSN(),
5506 		},
5507 		INTERNAL,
5508 		{ },
5509 		{ { 0, 3 } },
5510 	},
5511 	{
5512 		"ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
5513 		.u.insns_int = {
5514 			BPF_LD_IMM64(R0, 0),
5515 			BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
5516 			BPF_EXIT_INSN(),
5517 		},
5518 		INTERNAL,
5519 		{ },
5520 		{ { 0, 0xffffffff } },
5521 	},
5522 	{
5523 		"ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffffffff0000",
5524 		.u.insns_int = {
5525 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5526 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
5527 			BPF_ALU64_IMM(BPF_OR, R2, 0x0),
5528 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5529 			BPF_MOV32_IMM(R0, 2),
5530 			BPF_EXIT_INSN(),
5531 			BPF_MOV32_IMM(R0, 1),
5532 			BPF_EXIT_INSN(),
5533 		},
5534 		INTERNAL,
5535 		{ },
5536 		{ { 0, 0x1 } },
5537 	},
5538 	{
5539 		"ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
5540 		.u.insns_int = {
5541 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5542 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5543 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
5544 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5545 			BPF_MOV32_IMM(R0, 2),
5546 			BPF_EXIT_INSN(),
5547 			BPF_MOV32_IMM(R0, 1),
5548 			BPF_EXIT_INSN(),
5549 		},
5550 		INTERNAL,
5551 		{ },
5552 		{ { 0, 0x1 } },
5553 	},
5554 	{
5555 		"ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
5556 		.u.insns_int = {
5557 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
5558 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5559 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
5560 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5561 			BPF_MOV32_IMM(R0, 2),
5562 			BPF_EXIT_INSN(),
5563 			BPF_MOV32_IMM(R0, 1),
5564 			BPF_EXIT_INSN(),
5565 		},
5566 		INTERNAL,
5567 		{ },
5568 		{ { 0, 0x1 } },
5569 	},
5570 	{
5571 		"ALU64_OR_K: Sign extension 1",
5572 		.u.insns_int = {
5573 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5574 			BPF_LD_IMM64(R1, 0x012345678fafcfefLL),
5575 			BPF_ALU64_IMM(BPF_OR, R0, 0x0f0f0f0f),
5576 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5577 			BPF_MOV32_IMM(R0, 2),
5578 			BPF_EXIT_INSN(),
5579 			BPF_MOV32_IMM(R0, 1),
5580 			BPF_EXIT_INSN(),
5581 		},
5582 		INTERNAL,
5583 		{ },
5584 		{ { 0, 1 } }
5585 	},
5586 	{
5587 		"ALU64_OR_K: Sign extension 2",
5588 		.u.insns_int = {
5589 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5590 			BPF_LD_IMM64(R1, 0xfffffffff9fbfdffLL),
5591 			BPF_ALU64_IMM(BPF_OR, R0, 0xf0f0f0f0),
5592 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5593 			BPF_MOV32_IMM(R0, 2),
5594 			BPF_EXIT_INSN(),
5595 			BPF_MOV32_IMM(R0, 1),
5596 			BPF_EXIT_INSN(),
5597 		},
5598 		INTERNAL,
5599 		{ },
5600 		{ { 0, 1 } }
5601 	},
5602 	/* BPF_ALU | BPF_XOR | BPF_X */
5603 	{
5604 		"ALU_XOR_X: 5 ^ 6 = 3",
5605 		.u.insns_int = {
5606 			BPF_LD_IMM64(R0, 5),
5607 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
5608 			BPF_ALU32_REG(BPF_XOR, R0, R1),
5609 			BPF_EXIT_INSN(),
5610 		},
5611 		INTERNAL,
5612 		{ },
5613 		{ { 0, 3 } },
5614 	},
5615 	{
5616 		"ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
5617 		.u.insns_int = {
5618 			BPF_LD_IMM64(R0, 1),
5619 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
5620 			BPF_ALU32_REG(BPF_XOR, R0, R1),
5621 			BPF_EXIT_INSN(),
5622 		},
5623 		INTERNAL,
5624 		{ },
5625 		{ { 0, 0xfffffffe } },
5626 	},
5627 	{
5628 		"ALU64_XOR_X: 5 ^ 6 = 3",
5629 		.u.insns_int = {
5630 			BPF_LD_IMM64(R0, 5),
5631 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
5632 			BPF_ALU64_REG(BPF_XOR, R0, R1),
5633 			BPF_EXIT_INSN(),
5634 		},
5635 		INTERNAL,
5636 		{ },
5637 		{ { 0, 3 } },
5638 	},
5639 	{
5640 		"ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
5641 		.u.insns_int = {
5642 			BPF_LD_IMM64(R0, 1),
5643 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
5644 			BPF_ALU64_REG(BPF_XOR, R0, R1),
5645 			BPF_EXIT_INSN(),
5646 		},
5647 		INTERNAL,
5648 		{ },
5649 		{ { 0, 0xfffffffe } },
5650 	},
5651 	/* BPF_ALU | BPF_XOR | BPF_K */
5652 	{
5653 		"ALU_XOR_K: 5 ^ 6 = 3",
5654 		.u.insns_int = {
5655 			BPF_LD_IMM64(R0, 5),
5656 			BPF_ALU32_IMM(BPF_XOR, R0, 6),
5657 			BPF_EXIT_INSN(),
5658 		},
5659 		INTERNAL,
5660 		{ },
5661 		{ { 0, 3 } },
5662 	},
5663 	{
5664 		"ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
5665 		.u.insns_int = {
5666 			BPF_LD_IMM64(R0, 1),
5667 			BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
5668 			BPF_EXIT_INSN(),
5669 		},
5670 		INTERNAL,
5671 		{ },
5672 		{ { 0, 0xfffffffe } },
5673 	},
5674 	{
5675 		"ALU_XOR_K: Small immediate",
5676 		.u.insns_int = {
5677 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
5678 			BPF_ALU32_IMM(BPF_XOR, R0, 15),
5679 			BPF_EXIT_INSN(),
5680 		},
5681 		INTERNAL,
5682 		{ },
5683 		{ { 0, 0x0102030b } }
5684 	},
5685 	{
5686 		"ALU_XOR_K: Large immediate",
5687 		.u.insns_int = {
5688 			BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
5689 			BPF_ALU32_IMM(BPF_XOR, R0, 0xafbfcfdf),
5690 			BPF_EXIT_INSN(),
5691 		},
5692 		INTERNAL,
5693 		{ },
5694 		{ { 0, 0x5e4d3c2b } }
5695 	},
5696 	{
5697 		"ALU_XOR_K: Zero extension",
5698 		.u.insns_int = {
5699 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5700 			BPF_LD_IMM64(R1, 0x00000000795b3d1fLL),
5701 			BPF_ALU32_IMM(BPF_XOR, R0, 0xf0f0f0f0),
5702 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5703 			BPF_MOV32_IMM(R0, 2),
5704 			BPF_EXIT_INSN(),
5705 			BPF_MOV32_IMM(R0, 1),
5706 			BPF_EXIT_INSN(),
5707 		},
5708 		INTERNAL,
5709 		{ },
5710 		{ { 0, 1 } }
5711 	},
5712 	{
5713 		"ALU64_XOR_K: 5 ^ 6 = 3",
5714 		.u.insns_int = {
5715 			BPF_LD_IMM64(R0, 5),
5716 			BPF_ALU64_IMM(BPF_XOR, R0, 6),
5717 			BPF_EXIT_INSN(),
5718 		},
5719 		INTERNAL,
5720 		{ },
5721 		{ { 0, 3 } },
5722 	},
5723 	{
5724 		"ALU64_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
5725 		.u.insns_int = {
5726 			BPF_LD_IMM64(R0, 1),
5727 			BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
5728 			BPF_EXIT_INSN(),
5729 		},
5730 		INTERNAL,
5731 		{ },
5732 		{ { 0, 0xfffffffe } },
5733 	},
5734 	{
5735 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
5736 		.u.insns_int = {
5737 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5738 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
5739 			BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
5740 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5741 			BPF_MOV32_IMM(R0, 2),
5742 			BPF_EXIT_INSN(),
5743 			BPF_MOV32_IMM(R0, 1),
5744 			BPF_EXIT_INSN(),
5745 		},
5746 		INTERNAL,
5747 		{ },
5748 		{ { 0, 0x1 } },
5749 	},
5750 	{
5751 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
5752 		.u.insns_int = {
5753 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5754 			BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
5755 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
5756 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5757 			BPF_MOV32_IMM(R0, 2),
5758 			BPF_EXIT_INSN(),
5759 			BPF_MOV32_IMM(R0, 1),
5760 			BPF_EXIT_INSN(),
5761 		},
5762 		INTERNAL,
5763 		{ },
5764 		{ { 0, 0x1 } },
5765 	},
5766 	{
5767 		"ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
5768 		.u.insns_int = {
5769 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
5770 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5771 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
5772 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5773 			BPF_MOV32_IMM(R0, 2),
5774 			BPF_EXIT_INSN(),
5775 			BPF_MOV32_IMM(R0, 1),
5776 			BPF_EXIT_INSN(),
5777 		},
5778 		INTERNAL,
5779 		{ },
5780 		{ { 0, 0x1 } },
5781 	},
5782 	{
5783 		"ALU64_XOR_K: Sign extension 1",
5784 		.u.insns_int = {
5785 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5786 			BPF_LD_IMM64(R1, 0x0123456786a4c2e0LL),
5787 			BPF_ALU64_IMM(BPF_XOR, R0, 0x0f0f0f0f),
5788 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5789 			BPF_MOV32_IMM(R0, 2),
5790 			BPF_EXIT_INSN(),
5791 			BPF_MOV32_IMM(R0, 1),
5792 			BPF_EXIT_INSN(),
5793 		},
5794 		INTERNAL,
5795 		{ },
5796 		{ { 0, 1 } }
5797 	},
5798 	{
5799 		"ALU64_XOR_K: Sign extension 2",
5800 		.u.insns_int = {
5801 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5802 			BPF_LD_IMM64(R1, 0xfedcba98795b3d1fLL),
5803 			BPF_ALU64_IMM(BPF_XOR, R0, 0xf0f0f0f0),
5804 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5805 			BPF_MOV32_IMM(R0, 2),
5806 			BPF_EXIT_INSN(),
5807 			BPF_MOV32_IMM(R0, 1),
5808 			BPF_EXIT_INSN(),
5809 		},
5810 		INTERNAL,
5811 		{ },
5812 		{ { 0, 1 } }
5813 	},
5814 	/* BPF_ALU | BPF_LSH | BPF_X */
5815 	{
5816 		"ALU_LSH_X: 1 << 1 = 2",
5817 		.u.insns_int = {
5818 			BPF_LD_IMM64(R0, 1),
5819 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
5820 			BPF_ALU32_REG(BPF_LSH, R0, R1),
5821 			BPF_EXIT_INSN(),
5822 		},
5823 		INTERNAL,
5824 		{ },
5825 		{ { 0, 2 } },
5826 	},
5827 	{
5828 		"ALU_LSH_X: 1 << 31 = 0x80000000",
5829 		.u.insns_int = {
5830 			BPF_LD_IMM64(R0, 1),
5831 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
5832 			BPF_ALU32_REG(BPF_LSH, R0, R1),
5833 			BPF_EXIT_INSN(),
5834 		},
5835 		INTERNAL,
5836 		{ },
5837 		{ { 0, 0x80000000 } },
5838 	},
5839 	{
5840 		"ALU_LSH_X: 0x12345678 << 12 = 0x45678000",
5841 		.u.insns_int = {
5842 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
5843 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
5844 			BPF_ALU32_REG(BPF_LSH, R0, R1),
5845 			BPF_EXIT_INSN(),
5846 		},
5847 		INTERNAL,
5848 		{ },
5849 		{ { 0, 0x45678000 } }
5850 	},
5851 	{
5852 		"ALU64_LSH_X: 1 << 1 = 2",
5853 		.u.insns_int = {
5854 			BPF_LD_IMM64(R0, 1),
5855 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
5856 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5857 			BPF_EXIT_INSN(),
5858 		},
5859 		INTERNAL,
5860 		{ },
5861 		{ { 0, 2 } },
5862 	},
5863 	{
5864 		"ALU64_LSH_X: 1 << 31 = 0x80000000",
5865 		.u.insns_int = {
5866 			BPF_LD_IMM64(R0, 1),
5867 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
5868 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5869 			BPF_EXIT_INSN(),
5870 		},
5871 		INTERNAL,
5872 		{ },
5873 		{ { 0, 0x80000000 } },
5874 	},
5875 	{
5876 		"ALU64_LSH_X: Shift < 32, low word",
5877 		.u.insns_int = {
5878 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5879 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
5880 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5881 			BPF_EXIT_INSN(),
5882 		},
5883 		INTERNAL,
5884 		{ },
5885 		{ { 0, 0xbcdef000 } }
5886 	},
5887 	{
5888 		"ALU64_LSH_X: Shift < 32, high word",
5889 		.u.insns_int = {
5890 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5891 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
5892 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5893 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
5894 			BPF_EXIT_INSN(),
5895 		},
5896 		INTERNAL,
5897 		{ },
5898 		{ { 0, 0x3456789a } }
5899 	},
5900 	{
5901 		"ALU64_LSH_X: Shift > 32, low word",
5902 		.u.insns_int = {
5903 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5904 			BPF_ALU32_IMM(BPF_MOV, R1, 36),
5905 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5906 			BPF_EXIT_INSN(),
5907 		},
5908 		INTERNAL,
5909 		{ },
5910 		{ { 0, 0 } }
5911 	},
5912 	{
5913 		"ALU64_LSH_X: Shift > 32, high word",
5914 		.u.insns_int = {
5915 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5916 			BPF_ALU32_IMM(BPF_MOV, R1, 36),
5917 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5918 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
5919 			BPF_EXIT_INSN(),
5920 		},
5921 		INTERNAL,
5922 		{ },
5923 		{ { 0, 0x9abcdef0 } }
5924 	},
5925 	{
5926 		"ALU64_LSH_X: Shift == 32, low word",
5927 		.u.insns_int = {
5928 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5929 			BPF_ALU32_IMM(BPF_MOV, R1, 32),
5930 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5931 			BPF_EXIT_INSN(),
5932 		},
5933 		INTERNAL,
5934 		{ },
5935 		{ { 0, 0 } }
5936 	},
5937 	{
5938 		"ALU64_LSH_X: Shift == 32, high word",
5939 		.u.insns_int = {
5940 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5941 			BPF_ALU32_IMM(BPF_MOV, R1, 32),
5942 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5943 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
5944 			BPF_EXIT_INSN(),
5945 		},
5946 		INTERNAL,
5947 		{ },
5948 		{ { 0, 0x89abcdef } }
5949 	},
5950 	{
5951 		"ALU64_LSH_X: Zero shift, low word",
5952 		.u.insns_int = {
5953 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5954 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
5955 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5956 			BPF_EXIT_INSN(),
5957 		},
5958 		INTERNAL,
5959 		{ },
5960 		{ { 0, 0x89abcdef } }
5961 	},
5962 	{
5963 		"ALU64_LSH_X: Zero shift, high word",
5964 		.u.insns_int = {
5965 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5966 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
5967 			BPF_ALU64_REG(BPF_LSH, R0, R1),
5968 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
5969 			BPF_EXIT_INSN(),
5970 		},
5971 		INTERNAL,
5972 		{ },
5973 		{ { 0, 0x01234567 } }
5974 	},
5975 	/* BPF_ALU | BPF_LSH | BPF_K */
5976 	{
5977 		"ALU_LSH_K: 1 << 1 = 2",
5978 		.u.insns_int = {
5979 			BPF_LD_IMM64(R0, 1),
5980 			BPF_ALU32_IMM(BPF_LSH, R0, 1),
5981 			BPF_EXIT_INSN(),
5982 		},
5983 		INTERNAL,
5984 		{ },
5985 		{ { 0, 2 } },
5986 	},
5987 	{
5988 		"ALU_LSH_K: 1 << 31 = 0x80000000",
5989 		.u.insns_int = {
5990 			BPF_LD_IMM64(R0, 1),
5991 			BPF_ALU32_IMM(BPF_LSH, R0, 31),
5992 			BPF_EXIT_INSN(),
5993 		},
5994 		INTERNAL,
5995 		{ },
5996 		{ { 0, 0x80000000 } },
5997 	},
5998 	{
5999 		"ALU_LSH_K: 0x12345678 << 12 = 0x45678000",
6000 		.u.insns_int = {
6001 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6002 			BPF_ALU32_IMM(BPF_LSH, R0, 12),
6003 			BPF_EXIT_INSN(),
6004 		},
6005 		INTERNAL,
6006 		{ },
6007 		{ { 0, 0x45678000 } }
6008 	},
6009 	{
6010 		"ALU_LSH_K: 0x12345678 << 0 = 0x12345678",
6011 		.u.insns_int = {
6012 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6013 			BPF_ALU32_IMM(BPF_LSH, R0, 0),
6014 			BPF_EXIT_INSN(),
6015 		},
6016 		INTERNAL,
6017 		{ },
6018 		{ { 0, 0x12345678 } }
6019 	},
6020 	{
6021 		"ALU64_LSH_K: 1 << 1 = 2",
6022 		.u.insns_int = {
6023 			BPF_LD_IMM64(R0, 1),
6024 			BPF_ALU64_IMM(BPF_LSH, R0, 1),
6025 			BPF_EXIT_INSN(),
6026 		},
6027 		INTERNAL,
6028 		{ },
6029 		{ { 0, 2 } },
6030 	},
6031 	{
6032 		"ALU64_LSH_K: 1 << 31 = 0x80000000",
6033 		.u.insns_int = {
6034 			BPF_LD_IMM64(R0, 1),
6035 			BPF_ALU64_IMM(BPF_LSH, R0, 31),
6036 			BPF_EXIT_INSN(),
6037 		},
6038 		INTERNAL,
6039 		{ },
6040 		{ { 0, 0x80000000 } },
6041 	},
6042 	{
6043 		"ALU64_LSH_K: Shift < 32, low word",
6044 		.u.insns_int = {
6045 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6046 			BPF_ALU64_IMM(BPF_LSH, R0, 12),
6047 			BPF_EXIT_INSN(),
6048 		},
6049 		INTERNAL,
6050 		{ },
6051 		{ { 0, 0xbcdef000 } }
6052 	},
6053 	{
6054 		"ALU64_LSH_K: Shift < 32, high word",
6055 		.u.insns_int = {
6056 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6057 			BPF_ALU64_IMM(BPF_LSH, R0, 12),
6058 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6059 			BPF_EXIT_INSN(),
6060 		},
6061 		INTERNAL,
6062 		{ },
6063 		{ { 0, 0x3456789a } }
6064 	},
6065 	{
6066 		"ALU64_LSH_K: Shift > 32, low word",
6067 		.u.insns_int = {
6068 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6069 			BPF_ALU64_IMM(BPF_LSH, R0, 36),
6070 			BPF_EXIT_INSN(),
6071 		},
6072 		INTERNAL,
6073 		{ },
6074 		{ { 0, 0 } }
6075 	},
6076 	{
6077 		"ALU64_LSH_K: Shift > 32, high word",
6078 		.u.insns_int = {
6079 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6080 			BPF_ALU64_IMM(BPF_LSH, R0, 36),
6081 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6082 			BPF_EXIT_INSN(),
6083 		},
6084 		INTERNAL,
6085 		{ },
6086 		{ { 0, 0x9abcdef0 } }
6087 	},
6088 	{
6089 		"ALU64_LSH_K: Shift == 32, low word",
6090 		.u.insns_int = {
6091 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6092 			BPF_ALU64_IMM(BPF_LSH, R0, 32),
6093 			BPF_EXIT_INSN(),
6094 		},
6095 		INTERNAL,
6096 		{ },
6097 		{ { 0, 0 } }
6098 	},
6099 	{
6100 		"ALU64_LSH_K: Shift == 32, high word",
6101 		.u.insns_int = {
6102 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6103 			BPF_ALU64_IMM(BPF_LSH, R0, 32),
6104 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6105 			BPF_EXIT_INSN(),
6106 		},
6107 		INTERNAL,
6108 		{ },
6109 		{ { 0, 0x89abcdef } }
6110 	},
6111 	{
6112 		"ALU64_LSH_K: Zero shift",
6113 		.u.insns_int = {
6114 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6115 			BPF_ALU64_IMM(BPF_LSH, R0, 0),
6116 			BPF_EXIT_INSN(),
6117 		},
6118 		INTERNAL,
6119 		{ },
6120 		{ { 0, 0x89abcdef } }
6121 	},
6122 	/* BPF_ALU | BPF_RSH | BPF_X */
6123 	{
6124 		"ALU_RSH_X: 2 >> 1 = 1",
6125 		.u.insns_int = {
6126 			BPF_LD_IMM64(R0, 2),
6127 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
6128 			BPF_ALU32_REG(BPF_RSH, R0, R1),
6129 			BPF_EXIT_INSN(),
6130 		},
6131 		INTERNAL,
6132 		{ },
6133 		{ { 0, 1 } },
6134 	},
6135 	{
6136 		"ALU_RSH_X: 0x80000000 >> 31 = 1",
6137 		.u.insns_int = {
6138 			BPF_LD_IMM64(R0, 0x80000000),
6139 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
6140 			BPF_ALU32_REG(BPF_RSH, R0, R1),
6141 			BPF_EXIT_INSN(),
6142 		},
6143 		INTERNAL,
6144 		{ },
6145 		{ { 0, 1 } },
6146 	},
6147 	{
6148 		"ALU_RSH_X: 0x12345678 >> 20 = 0x123",
6149 		.u.insns_int = {
6150 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6151 			BPF_ALU32_IMM(BPF_MOV, R1, 20),
6152 			BPF_ALU32_REG(BPF_RSH, R0, R1),
6153 			BPF_EXIT_INSN(),
6154 		},
6155 		INTERNAL,
6156 		{ },
6157 		{ { 0, 0x123 } }
6158 	},
6159 	{
6160 		"ALU64_RSH_X: 2 >> 1 = 1",
6161 		.u.insns_int = {
6162 			BPF_LD_IMM64(R0, 2),
6163 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
6164 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6165 			BPF_EXIT_INSN(),
6166 		},
6167 		INTERNAL,
6168 		{ },
6169 		{ { 0, 1 } },
6170 	},
6171 	{
6172 		"ALU64_RSH_X: 0x80000000 >> 31 = 1",
6173 		.u.insns_int = {
6174 			BPF_LD_IMM64(R0, 0x80000000),
6175 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
6176 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6177 			BPF_EXIT_INSN(),
6178 		},
6179 		INTERNAL,
6180 		{ },
6181 		{ { 0, 1 } },
6182 	},
6183 	{
6184 		"ALU64_RSH_X: Shift < 32, low word",
6185 		.u.insns_int = {
6186 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6187 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
6188 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6189 			BPF_EXIT_INSN(),
6190 		},
6191 		INTERNAL,
6192 		{ },
6193 		{ { 0, 0x56789abc } }
6194 	},
6195 	{
6196 		"ALU64_RSH_X: Shift < 32, high word",
6197 		.u.insns_int = {
6198 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6199 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
6200 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6201 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6202 			BPF_EXIT_INSN(),
6203 		},
6204 		INTERNAL,
6205 		{ },
6206 		{ { 0, 0x00081234 } }
6207 	},
6208 	{
6209 		"ALU64_RSH_X: Shift > 32, low word",
6210 		.u.insns_int = {
6211 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6212 			BPF_ALU32_IMM(BPF_MOV, R1, 36),
6213 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6214 			BPF_EXIT_INSN(),
6215 		},
6216 		INTERNAL,
6217 		{ },
6218 		{ { 0, 0x08123456 } }
6219 	},
6220 	{
6221 		"ALU64_RSH_X: Shift > 32, high word",
6222 		.u.insns_int = {
6223 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6224 			BPF_ALU32_IMM(BPF_MOV, R1, 36),
6225 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6226 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6227 			BPF_EXIT_INSN(),
6228 		},
6229 		INTERNAL,
6230 		{ },
6231 		{ { 0, 0 } }
6232 	},
6233 	{
6234 		"ALU64_RSH_X: Shift == 32, low word",
6235 		.u.insns_int = {
6236 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6237 			BPF_ALU32_IMM(BPF_MOV, R1, 32),
6238 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6239 			BPF_EXIT_INSN(),
6240 		},
6241 		INTERNAL,
6242 		{ },
6243 		{ { 0, 0x81234567 } }
6244 	},
6245 	{
6246 		"ALU64_RSH_X: Shift == 32, high word",
6247 		.u.insns_int = {
6248 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6249 			BPF_ALU32_IMM(BPF_MOV, R1, 32),
6250 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6251 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6252 			BPF_EXIT_INSN(),
6253 		},
6254 		INTERNAL,
6255 		{ },
6256 		{ { 0, 0 } }
6257 	},
6258 	{
6259 		"ALU64_RSH_X: Zero shift, low word",
6260 		.u.insns_int = {
6261 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6262 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
6263 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6264 			BPF_EXIT_INSN(),
6265 		},
6266 		INTERNAL,
6267 		{ },
6268 		{ { 0, 0x89abcdef } }
6269 	},
6270 	{
6271 		"ALU64_RSH_X: Zero shift, high word",
6272 		.u.insns_int = {
6273 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6274 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
6275 			BPF_ALU64_REG(BPF_RSH, R0, R1),
6276 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6277 			BPF_EXIT_INSN(),
6278 		},
6279 		INTERNAL,
6280 		{ },
6281 		{ { 0, 0x81234567 } }
6282 	},
6283 	/* BPF_ALU | BPF_RSH | BPF_K */
6284 	{
6285 		"ALU_RSH_K: 2 >> 1 = 1",
6286 		.u.insns_int = {
6287 			BPF_LD_IMM64(R0, 2),
6288 			BPF_ALU32_IMM(BPF_RSH, R0, 1),
6289 			BPF_EXIT_INSN(),
6290 		},
6291 		INTERNAL,
6292 		{ },
6293 		{ { 0, 1 } },
6294 	},
6295 	{
6296 		"ALU_RSH_K: 0x80000000 >> 31 = 1",
6297 		.u.insns_int = {
6298 			BPF_LD_IMM64(R0, 0x80000000),
6299 			BPF_ALU32_IMM(BPF_RSH, R0, 31),
6300 			BPF_EXIT_INSN(),
6301 		},
6302 		INTERNAL,
6303 		{ },
6304 		{ { 0, 1 } },
6305 	},
6306 	{
6307 		"ALU_RSH_K: 0x12345678 >> 20 = 0x123",
6308 		.u.insns_int = {
6309 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6310 			BPF_ALU32_IMM(BPF_RSH, R0, 20),
6311 			BPF_EXIT_INSN(),
6312 		},
6313 		INTERNAL,
6314 		{ },
6315 		{ { 0, 0x123 } }
6316 	},
6317 	{
6318 		"ALU_RSH_K: 0x12345678 >> 0 = 0x12345678",
6319 		.u.insns_int = {
6320 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6321 			BPF_ALU32_IMM(BPF_RSH, R0, 0),
6322 			BPF_EXIT_INSN(),
6323 		},
6324 		INTERNAL,
6325 		{ },
6326 		{ { 0, 0x12345678 } }
6327 	},
6328 	{
6329 		"ALU64_RSH_K: 2 >> 1 = 1",
6330 		.u.insns_int = {
6331 			BPF_LD_IMM64(R0, 2),
6332 			BPF_ALU64_IMM(BPF_RSH, R0, 1),
6333 			BPF_EXIT_INSN(),
6334 		},
6335 		INTERNAL,
6336 		{ },
6337 		{ { 0, 1 } },
6338 	},
6339 	{
6340 		"ALU64_RSH_K: 0x80000000 >> 31 = 1",
6341 		.u.insns_int = {
6342 			BPF_LD_IMM64(R0, 0x80000000),
6343 			BPF_ALU64_IMM(BPF_RSH, R0, 31),
6344 			BPF_EXIT_INSN(),
6345 		},
6346 		INTERNAL,
6347 		{ },
6348 		{ { 0, 1 } },
6349 	},
6350 	{
6351 		"ALU64_RSH_K: Shift < 32, low word",
6352 		.u.insns_int = {
6353 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6354 			BPF_ALU64_IMM(BPF_RSH, R0, 12),
6355 			BPF_EXIT_INSN(),
6356 		},
6357 		INTERNAL,
6358 		{ },
6359 		{ { 0, 0x56789abc } }
6360 	},
6361 	{
6362 		"ALU64_RSH_K: Shift < 32, high word",
6363 		.u.insns_int = {
6364 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6365 			BPF_ALU64_IMM(BPF_RSH, R0, 12),
6366 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6367 			BPF_EXIT_INSN(),
6368 		},
6369 		INTERNAL,
6370 		{ },
6371 		{ { 0, 0x00081234 } }
6372 	},
6373 	{
6374 		"ALU64_RSH_K: Shift > 32, low word",
6375 		.u.insns_int = {
6376 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6377 			BPF_ALU64_IMM(BPF_RSH, R0, 36),
6378 			BPF_EXIT_INSN(),
6379 		},
6380 		INTERNAL,
6381 		{ },
6382 		{ { 0, 0x08123456 } }
6383 	},
6384 	{
6385 		"ALU64_RSH_K: Shift > 32, high word",
6386 		.u.insns_int = {
6387 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6388 			BPF_ALU64_IMM(BPF_RSH, R0, 36),
6389 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6390 			BPF_EXIT_INSN(),
6391 		},
6392 		INTERNAL,
6393 		{ },
6394 		{ { 0, 0 } }
6395 	},
6396 	{
6397 		"ALU64_RSH_K: Shift == 32, low word",
6398 		.u.insns_int = {
6399 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6400 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6401 			BPF_EXIT_INSN(),
6402 		},
6403 		INTERNAL,
6404 		{ },
6405 		{ { 0, 0x81234567 } }
6406 	},
6407 	{
6408 		"ALU64_RSH_K: Shift == 32, high word",
6409 		.u.insns_int = {
6410 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6411 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6412 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6413 			BPF_EXIT_INSN(),
6414 		},
6415 		INTERNAL,
6416 		{ },
6417 		{ { 0, 0 } }
6418 	},
6419 	{
6420 		"ALU64_RSH_K: Zero shift",
6421 		.u.insns_int = {
6422 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6423 			BPF_ALU64_IMM(BPF_RSH, R0, 0),
6424 			BPF_EXIT_INSN(),
6425 		},
6426 		INTERNAL,
6427 		{ },
6428 		{ { 0, 0x89abcdef } }
6429 	},
6430 	/* BPF_ALU | BPF_ARSH | BPF_X */
6431 	{
6432 		"ALU32_ARSH_X: -1234 >> 7 = -10",
6433 		.u.insns_int = {
6434 			BPF_ALU32_IMM(BPF_MOV, R0, -1234),
6435 			BPF_ALU32_IMM(BPF_MOV, R1, 7),
6436 			BPF_ALU32_REG(BPF_ARSH, R0, R1),
6437 			BPF_EXIT_INSN(),
6438 		},
6439 		INTERNAL,
6440 		{ },
6441 		{ { 0, -10 } }
6442 	},
6443 	{
6444 		"ALU64_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
6445 		.u.insns_int = {
6446 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
6447 			BPF_ALU32_IMM(BPF_MOV, R1, 40),
6448 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6449 			BPF_EXIT_INSN(),
6450 		},
6451 		INTERNAL,
6452 		{ },
6453 		{ { 0, 0xffff00ff } },
6454 	},
6455 	{
6456 		"ALU64_ARSH_X: Shift < 32, low word",
6457 		.u.insns_int = {
6458 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6459 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
6460 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6461 			BPF_EXIT_INSN(),
6462 		},
6463 		INTERNAL,
6464 		{ },
6465 		{ { 0, 0x56789abc } }
6466 	},
6467 	{
6468 		"ALU64_ARSH_X: Shift < 32, high word",
6469 		.u.insns_int = {
6470 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6471 			BPF_ALU32_IMM(BPF_MOV, R1, 12),
6472 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6473 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6474 			BPF_EXIT_INSN(),
6475 		},
6476 		INTERNAL,
6477 		{ },
6478 		{ { 0, 0xfff81234 } }
6479 	},
6480 	{
6481 		"ALU64_ARSH_X: Shift > 32, low word",
6482 		.u.insns_int = {
6483 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6484 			BPF_ALU32_IMM(BPF_MOV, R1, 36),
6485 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6486 			BPF_EXIT_INSN(),
6487 		},
6488 		INTERNAL,
6489 		{ },
6490 		{ { 0, 0xf8123456 } }
6491 	},
6492 	{
6493 		"ALU64_ARSH_X: Shift > 32, high word",
6494 		.u.insns_int = {
6495 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6496 			BPF_ALU32_IMM(BPF_MOV, R1, 36),
6497 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6498 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6499 			BPF_EXIT_INSN(),
6500 		},
6501 		INTERNAL,
6502 		{ },
6503 		{ { 0, -1 } }
6504 	},
6505 	{
6506 		"ALU64_ARSH_X: Shift == 32, low word",
6507 		.u.insns_int = {
6508 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6509 			BPF_ALU32_IMM(BPF_MOV, R1, 32),
6510 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6511 			BPF_EXIT_INSN(),
6512 		},
6513 		INTERNAL,
6514 		{ },
6515 		{ { 0, 0x81234567 } }
6516 	},
6517 	{
6518 		"ALU64_ARSH_X: Shift == 32, high word",
6519 		.u.insns_int = {
6520 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6521 			BPF_ALU32_IMM(BPF_MOV, R1, 32),
6522 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6523 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6524 			BPF_EXIT_INSN(),
6525 		},
6526 		INTERNAL,
6527 		{ },
6528 		{ { 0, -1 } }
6529 	},
6530 	{
6531 		"ALU64_ARSH_X: Zero shift, low word",
6532 		.u.insns_int = {
6533 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6534 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
6535 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6536 			BPF_EXIT_INSN(),
6537 		},
6538 		INTERNAL,
6539 		{ },
6540 		{ { 0, 0x89abcdef } }
6541 	},
6542 	{
6543 		"ALU64_ARSH_X: Zero shift, high word",
6544 		.u.insns_int = {
6545 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6546 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
6547 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
6548 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6549 			BPF_EXIT_INSN(),
6550 		},
6551 		INTERNAL,
6552 		{ },
6553 		{ { 0, 0x81234567 } }
6554 	},
6555 	/* BPF_ALU | BPF_ARSH | BPF_K */
6556 	{
6557 		"ALU32_ARSH_K: -1234 >> 7 = -10",
6558 		.u.insns_int = {
6559 			BPF_ALU32_IMM(BPF_MOV, R0, -1234),
6560 			BPF_ALU32_IMM(BPF_ARSH, R0, 7),
6561 			BPF_EXIT_INSN(),
6562 		},
6563 		INTERNAL,
6564 		{ },
6565 		{ { 0, -10 } }
6566 	},
6567 	{
6568 		"ALU32_ARSH_K: -1234 >> 0 = -1234",
6569 		.u.insns_int = {
6570 			BPF_ALU32_IMM(BPF_MOV, R0, -1234),
6571 			BPF_ALU32_IMM(BPF_ARSH, R0, 0),
6572 			BPF_EXIT_INSN(),
6573 		},
6574 		INTERNAL,
6575 		{ },
6576 		{ { 0, -1234 } }
6577 	},
6578 	{
6579 		"ALU64_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
6580 		.u.insns_int = {
6581 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
6582 			BPF_ALU64_IMM(BPF_ARSH, R0, 40),
6583 			BPF_EXIT_INSN(),
6584 		},
6585 		INTERNAL,
6586 		{ },
6587 		{ { 0, 0xffff00ff } },
6588 	},
6589 	{
6590 		"ALU64_ARSH_K: Shift < 32, low word",
6591 		.u.insns_int = {
6592 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6593 			BPF_ALU64_IMM(BPF_RSH, R0, 12),
6594 			BPF_EXIT_INSN(),
6595 		},
6596 		INTERNAL,
6597 		{ },
6598 		{ { 0, 0x56789abc } }
6599 	},
6600 	{
6601 		"ALU64_ARSH_K: Shift < 32, high word",
6602 		.u.insns_int = {
6603 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6604 			BPF_ALU64_IMM(BPF_ARSH, R0, 12),
6605 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6606 			BPF_EXIT_INSN(),
6607 		},
6608 		INTERNAL,
6609 		{ },
6610 		{ { 0, 0xfff81234 } }
6611 	},
6612 	{
6613 		"ALU64_ARSH_K: Shift > 32, low word",
6614 		.u.insns_int = {
6615 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6616 			BPF_ALU64_IMM(BPF_ARSH, R0, 36),
6617 			BPF_EXIT_INSN(),
6618 		},
6619 		INTERNAL,
6620 		{ },
6621 		{ { 0, 0xf8123456 } }
6622 	},
6623 	{
6624 		"ALU64_ARSH_K: Shift > 32, high word",
6625 		.u.insns_int = {
6626 			BPF_LD_IMM64(R0, 0xf123456789abcdefLL),
6627 			BPF_ALU64_IMM(BPF_ARSH, R0, 36),
6628 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6629 			BPF_EXIT_INSN(),
6630 		},
6631 		INTERNAL,
6632 		{ },
6633 		{ { 0, -1 } }
6634 	},
6635 	{
6636 		"ALU64_ARSH_K: Shift == 32, low word",
6637 		.u.insns_int = {
6638 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6639 			BPF_ALU64_IMM(BPF_ARSH, R0, 32),
6640 			BPF_EXIT_INSN(),
6641 		},
6642 		INTERNAL,
6643 		{ },
6644 		{ { 0, 0x81234567 } }
6645 	},
6646 	{
6647 		"ALU64_ARSH_K: Shift == 32, high word",
6648 		.u.insns_int = {
6649 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6650 			BPF_ALU64_IMM(BPF_ARSH, R0, 32),
6651 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6652 			BPF_EXIT_INSN(),
6653 		},
6654 		INTERNAL,
6655 		{ },
6656 		{ { 0, -1 } }
6657 	},
6658 	{
6659 		"ALU64_ARSH_K: Zero shift",
6660 		.u.insns_int = {
6661 			BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
6662 			BPF_ALU64_IMM(BPF_ARSH, R0, 0),
6663 			BPF_EXIT_INSN(),
6664 		},
6665 		INTERNAL,
6666 		{ },
6667 		{ { 0, 0x89abcdef } }
6668 	},
6669 	/* BPF_ALU | BPF_NEG */
6670 	{
6671 		"ALU_NEG: -(3) = -3",
6672 		.u.insns_int = {
6673 			BPF_ALU32_IMM(BPF_MOV, R0, 3),
6674 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
6675 			BPF_EXIT_INSN(),
6676 		},
6677 		INTERNAL,
6678 		{ },
6679 		{ { 0, -3 } },
6680 	},
6681 	{
6682 		"ALU_NEG: -(-3) = 3",
6683 		.u.insns_int = {
6684 			BPF_ALU32_IMM(BPF_MOV, R0, -3),
6685 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
6686 			BPF_EXIT_INSN(),
6687 		},
6688 		INTERNAL,
6689 		{ },
6690 		{ { 0, 3 } },
6691 	},
6692 	{
6693 		"ALU64_NEG: -(3) = -3",
6694 		.u.insns_int = {
6695 			BPF_LD_IMM64(R0, 3),
6696 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
6697 			BPF_EXIT_INSN(),
6698 		},
6699 		INTERNAL,
6700 		{ },
6701 		{ { 0, -3 } },
6702 	},
6703 	{
6704 		"ALU64_NEG: -(-3) = 3",
6705 		.u.insns_int = {
6706 			BPF_LD_IMM64(R0, -3),
6707 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
6708 			BPF_EXIT_INSN(),
6709 		},
6710 		INTERNAL,
6711 		{ },
6712 		{ { 0, 3 } },
6713 	},
6714 	/* BPF_ALU | BPF_END | BPF_FROM_BE */
6715 	{
6716 		"ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
6717 		.u.insns_int = {
6718 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6719 			BPF_ENDIAN(BPF_FROM_BE, R0, 16),
6720 			BPF_EXIT_INSN(),
6721 		},
6722 		INTERNAL,
6723 		{ },
6724 		{ { 0,  cpu_to_be16(0xcdef) } },
6725 	},
6726 	{
6727 		"ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
6728 		.u.insns_int = {
6729 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6730 			BPF_ENDIAN(BPF_FROM_BE, R0, 32),
6731 			BPF_ALU64_REG(BPF_MOV, R1, R0),
6732 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
6733 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
6734 			BPF_EXIT_INSN(),
6735 		},
6736 		INTERNAL,
6737 		{ },
6738 		{ { 0, cpu_to_be32(0x89abcdef) } },
6739 	},
6740 	{
6741 		"ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
6742 		.u.insns_int = {
6743 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6744 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
6745 			BPF_EXIT_INSN(),
6746 		},
6747 		INTERNAL,
6748 		{ },
6749 		{ { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
6750 	},
6751 	{
6752 		"ALU_END_FROM_BE 64: 0x0123456789abcdef >> 32 -> 0x01234567",
6753 		.u.insns_int = {
6754 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6755 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
6756 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6757 			BPF_EXIT_INSN(),
6758 		},
6759 		INTERNAL,
6760 		{ },
6761 		{ { 0, (u32) (cpu_to_be64(0x0123456789abcdefLL) >> 32) } },
6762 	},
6763 	/* BPF_ALU | BPF_END | BPF_FROM_BE, reversed */
6764 	{
6765 		"ALU_END_FROM_BE 16: 0xfedcba9876543210 -> 0x3210",
6766 		.u.insns_int = {
6767 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6768 			BPF_ENDIAN(BPF_FROM_BE, R0, 16),
6769 			BPF_EXIT_INSN(),
6770 		},
6771 		INTERNAL,
6772 		{ },
6773 		{ { 0,  cpu_to_be16(0x3210) } },
6774 	},
6775 	{
6776 		"ALU_END_FROM_BE 32: 0xfedcba9876543210 -> 0x76543210",
6777 		.u.insns_int = {
6778 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6779 			BPF_ENDIAN(BPF_FROM_BE, R0, 32),
6780 			BPF_ALU64_REG(BPF_MOV, R1, R0),
6781 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
6782 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
6783 			BPF_EXIT_INSN(),
6784 		},
6785 		INTERNAL,
6786 		{ },
6787 		{ { 0, cpu_to_be32(0x76543210) } },
6788 	},
6789 	{
6790 		"ALU_END_FROM_BE 64: 0xfedcba9876543210 -> 0x76543210",
6791 		.u.insns_int = {
6792 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6793 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
6794 			BPF_EXIT_INSN(),
6795 		},
6796 		INTERNAL,
6797 		{ },
6798 		{ { 0, (u32) cpu_to_be64(0xfedcba9876543210ULL) } },
6799 	},
6800 	{
6801 		"ALU_END_FROM_BE 64: 0xfedcba9876543210 >> 32 -> 0xfedcba98",
6802 		.u.insns_int = {
6803 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6804 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
6805 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6806 			BPF_EXIT_INSN(),
6807 		},
6808 		INTERNAL,
6809 		{ },
6810 		{ { 0, (u32) (cpu_to_be64(0xfedcba9876543210ULL) >> 32) } },
6811 	},
6812 	/* BPF_ALU | BPF_END | BPF_FROM_LE */
6813 	{
6814 		"ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
6815 		.u.insns_int = {
6816 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6817 			BPF_ENDIAN(BPF_FROM_LE, R0, 16),
6818 			BPF_EXIT_INSN(),
6819 		},
6820 		INTERNAL,
6821 		{ },
6822 		{ { 0, cpu_to_le16(0xcdef) } },
6823 	},
6824 	{
6825 		"ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
6826 		.u.insns_int = {
6827 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6828 			BPF_ENDIAN(BPF_FROM_LE, R0, 32),
6829 			BPF_ALU64_REG(BPF_MOV, R1, R0),
6830 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
6831 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
6832 			BPF_EXIT_INSN(),
6833 		},
6834 		INTERNAL,
6835 		{ },
6836 		{ { 0, cpu_to_le32(0x89abcdef) } },
6837 	},
6838 	{
6839 		"ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
6840 		.u.insns_int = {
6841 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6842 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
6843 			BPF_EXIT_INSN(),
6844 		},
6845 		INTERNAL,
6846 		{ },
6847 		{ { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
6848 	},
6849 	{
6850 		"ALU_END_FROM_LE 64: 0x0123456789abcdef >> 32 -> 0xefcdab89",
6851 		.u.insns_int = {
6852 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6853 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
6854 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6855 			BPF_EXIT_INSN(),
6856 		},
6857 		INTERNAL,
6858 		{ },
6859 		{ { 0, (u32) (cpu_to_le64(0x0123456789abcdefLL) >> 32) } },
6860 	},
6861 	/* BPF_ALU | BPF_END | BPF_FROM_LE, reversed */
6862 	{
6863 		"ALU_END_FROM_LE 16: 0xfedcba9876543210 -> 0x1032",
6864 		.u.insns_int = {
6865 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6866 			BPF_ENDIAN(BPF_FROM_LE, R0, 16),
6867 			BPF_EXIT_INSN(),
6868 		},
6869 		INTERNAL,
6870 		{ },
6871 		{ { 0,  cpu_to_le16(0x3210) } },
6872 	},
6873 	{
6874 		"ALU_END_FROM_LE 32: 0xfedcba9876543210 -> 0x10325476",
6875 		.u.insns_int = {
6876 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6877 			BPF_ENDIAN(BPF_FROM_LE, R0, 32),
6878 			BPF_ALU64_REG(BPF_MOV, R1, R0),
6879 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
6880 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
6881 			BPF_EXIT_INSN(),
6882 		},
6883 		INTERNAL,
6884 		{ },
6885 		{ { 0, cpu_to_le32(0x76543210) } },
6886 	},
6887 	{
6888 		"ALU_END_FROM_LE 64: 0xfedcba9876543210 -> 0x10325476",
6889 		.u.insns_int = {
6890 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6891 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
6892 			BPF_EXIT_INSN(),
6893 		},
6894 		INTERNAL,
6895 		{ },
6896 		{ { 0, (u32) cpu_to_le64(0xfedcba9876543210ULL) } },
6897 	},
6898 	{
6899 		"ALU_END_FROM_LE 64: 0xfedcba9876543210 >> 32 -> 0x98badcfe",
6900 		.u.insns_int = {
6901 			BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
6902 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
6903 			BPF_ALU64_IMM(BPF_RSH, R0, 32),
6904 			BPF_EXIT_INSN(),
6905 		},
6906 		INTERNAL,
6907 		{ },
6908 		{ { 0, (u32) (cpu_to_le64(0xfedcba9876543210ULL) >> 32) } },
6909 	},
6910 	/* BPF_LDX_MEM B/H/W/DW */
6911 	{
6912 		"BPF_LDX_MEM | BPF_B",
6913 		.u.insns_int = {
6914 			BPF_LD_IMM64(R1, 0x0102030405060708ULL),
6915 			BPF_LD_IMM64(R2, 0x0000000000000008ULL),
6916 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
6917 #ifdef __BIG_ENDIAN
6918 			BPF_LDX_MEM(BPF_B, R0, R10, -1),
6919 #else
6920 			BPF_LDX_MEM(BPF_B, R0, R10, -8),
6921 #endif
6922 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
6923 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
6924 			BPF_EXIT_INSN(),
6925 		},
6926 		INTERNAL,
6927 		{ },
6928 		{ { 0, 0 } },
6929 		.stack_depth = 8,
6930 	},
6931 	{
6932 		"BPF_LDX_MEM | BPF_B, MSB set",
6933 		.u.insns_int = {
6934 			BPF_LD_IMM64(R1, 0x8182838485868788ULL),
6935 			BPF_LD_IMM64(R2, 0x0000000000000088ULL),
6936 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
6937 #ifdef __BIG_ENDIAN
6938 			BPF_LDX_MEM(BPF_B, R0, R10, -1),
6939 #else
6940 			BPF_LDX_MEM(BPF_B, R0, R10, -8),
6941 #endif
6942 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
6943 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
6944 			BPF_EXIT_INSN(),
6945 		},
6946 		INTERNAL,
6947 		{ },
6948 		{ { 0, 0 } },
6949 		.stack_depth = 8,
6950 	},
6951 	{
6952 		"BPF_LDX_MEM | BPF_H",
6953 		.u.insns_int = {
6954 			BPF_LD_IMM64(R1, 0x0102030405060708ULL),
6955 			BPF_LD_IMM64(R2, 0x0000000000000708ULL),
6956 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
6957 #ifdef __BIG_ENDIAN
6958 			BPF_LDX_MEM(BPF_H, R0, R10, -2),
6959 #else
6960 			BPF_LDX_MEM(BPF_H, R0, R10, -8),
6961 #endif
6962 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
6963 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
6964 			BPF_EXIT_INSN(),
6965 		},
6966 		INTERNAL,
6967 		{ },
6968 		{ { 0, 0 } },
6969 		.stack_depth = 8,
6970 	},
6971 	{
6972 		"BPF_LDX_MEM | BPF_H, MSB set",
6973 		.u.insns_int = {
6974 			BPF_LD_IMM64(R1, 0x8182838485868788ULL),
6975 			BPF_LD_IMM64(R2, 0x0000000000008788ULL),
6976 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
6977 #ifdef __BIG_ENDIAN
6978 			BPF_LDX_MEM(BPF_H, R0, R10, -2),
6979 #else
6980 			BPF_LDX_MEM(BPF_H, R0, R10, -8),
6981 #endif
6982 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
6983 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
6984 			BPF_EXIT_INSN(),
6985 		},
6986 		INTERNAL,
6987 		{ },
6988 		{ { 0, 0 } },
6989 		.stack_depth = 8,
6990 	},
6991 	{
6992 		"BPF_LDX_MEM | BPF_W",
6993 		.u.insns_int = {
6994 			BPF_LD_IMM64(R1, 0x0102030405060708ULL),
6995 			BPF_LD_IMM64(R2, 0x0000000005060708ULL),
6996 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
6997 #ifdef __BIG_ENDIAN
6998 			BPF_LDX_MEM(BPF_W, R0, R10, -4),
6999 #else
7000 			BPF_LDX_MEM(BPF_W, R0, R10, -8),
7001 #endif
7002 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7003 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7004 			BPF_EXIT_INSN(),
7005 		},
7006 		INTERNAL,
7007 		{ },
7008 		{ { 0, 0 } },
7009 		.stack_depth = 8,
7010 	},
7011 	{
7012 		"BPF_LDX_MEM | BPF_W, MSB set",
7013 		.u.insns_int = {
7014 			BPF_LD_IMM64(R1, 0x8182838485868788ULL),
7015 			BPF_LD_IMM64(R2, 0x0000000085868788ULL),
7016 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7017 #ifdef __BIG_ENDIAN
7018 			BPF_LDX_MEM(BPF_W, R0, R10, -4),
7019 #else
7020 			BPF_LDX_MEM(BPF_W, R0, R10, -8),
7021 #endif
7022 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7023 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7024 			BPF_EXIT_INSN(),
7025 		},
7026 		INTERNAL,
7027 		{ },
7028 		{ { 0, 0 } },
7029 		.stack_depth = 8,
7030 	},
7031 	/* BPF_STX_MEM B/H/W/DW */
7032 	{
7033 		"BPF_STX_MEM | BPF_B",
7034 		.u.insns_int = {
7035 			BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7036 			BPF_LD_IMM64(R2, 0x0102030405060708ULL),
7037 			BPF_LD_IMM64(R3, 0x8090a0b0c0d0e008ULL),
7038 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7039 #ifdef __BIG_ENDIAN
7040 			BPF_STX_MEM(BPF_B, R10, R2, -1),
7041 #else
7042 			BPF_STX_MEM(BPF_B, R10, R2, -8),
7043 #endif
7044 			BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7045 			BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7046 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7047 			BPF_EXIT_INSN(),
7048 		},
7049 		INTERNAL,
7050 		{ },
7051 		{ { 0, 0 } },
7052 		.stack_depth = 8,
7053 	},
7054 	{
7055 		"BPF_STX_MEM | BPF_B, MSB set",
7056 		.u.insns_int = {
7057 			BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7058 			BPF_LD_IMM64(R2, 0x8182838485868788ULL),
7059 			BPF_LD_IMM64(R3, 0x8090a0b0c0d0e088ULL),
7060 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7061 #ifdef __BIG_ENDIAN
7062 			BPF_STX_MEM(BPF_B, R10, R2, -1),
7063 #else
7064 			BPF_STX_MEM(BPF_B, R10, R2, -8),
7065 #endif
7066 			BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7067 			BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7068 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7069 			BPF_EXIT_INSN(),
7070 		},
7071 		INTERNAL,
7072 		{ },
7073 		{ { 0, 0 } },
7074 		.stack_depth = 8,
7075 	},
7076 	{
7077 		"BPF_STX_MEM | BPF_H",
7078 		.u.insns_int = {
7079 			BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7080 			BPF_LD_IMM64(R2, 0x0102030405060708ULL),
7081 			BPF_LD_IMM64(R3, 0x8090a0b0c0d00708ULL),
7082 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7083 #ifdef __BIG_ENDIAN
7084 			BPF_STX_MEM(BPF_H, R10, R2, -2),
7085 #else
7086 			BPF_STX_MEM(BPF_H, R10, R2, -8),
7087 #endif
7088 			BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7089 			BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7090 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7091 			BPF_EXIT_INSN(),
7092 		},
7093 		INTERNAL,
7094 		{ },
7095 		{ { 0, 0 } },
7096 		.stack_depth = 8,
7097 	},
7098 	{
7099 		"BPF_STX_MEM | BPF_H, MSB set",
7100 		.u.insns_int = {
7101 			BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7102 			BPF_LD_IMM64(R2, 0x8182838485868788ULL),
7103 			BPF_LD_IMM64(R3, 0x8090a0b0c0d08788ULL),
7104 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7105 #ifdef __BIG_ENDIAN
7106 			BPF_STX_MEM(BPF_H, R10, R2, -2),
7107 #else
7108 			BPF_STX_MEM(BPF_H, R10, R2, -8),
7109 #endif
7110 			BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7111 			BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7112 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7113 			BPF_EXIT_INSN(),
7114 		},
7115 		INTERNAL,
7116 		{ },
7117 		{ { 0, 0 } },
7118 		.stack_depth = 8,
7119 	},
7120 	{
7121 		"BPF_STX_MEM | BPF_W",
7122 		.u.insns_int = {
7123 			BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7124 			BPF_LD_IMM64(R2, 0x0102030405060708ULL),
7125 			BPF_LD_IMM64(R3, 0x8090a0b005060708ULL),
7126 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7127 #ifdef __BIG_ENDIAN
7128 			BPF_STX_MEM(BPF_W, R10, R2, -4),
7129 #else
7130 			BPF_STX_MEM(BPF_W, R10, R2, -8),
7131 #endif
7132 			BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7133 			BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7134 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7135 			BPF_EXIT_INSN(),
7136 		},
7137 		INTERNAL,
7138 		{ },
7139 		{ { 0, 0 } },
7140 		.stack_depth = 8,
7141 	},
7142 	{
7143 		"BPF_STX_MEM | BPF_W, MSB set",
7144 		.u.insns_int = {
7145 			BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7146 			BPF_LD_IMM64(R2, 0x8182838485868788ULL),
7147 			BPF_LD_IMM64(R3, 0x8090a0b085868788ULL),
7148 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
7149 #ifdef __BIG_ENDIAN
7150 			BPF_STX_MEM(BPF_W, R10, R2, -4),
7151 #else
7152 			BPF_STX_MEM(BPF_W, R10, R2, -8),
7153 #endif
7154 			BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7155 			BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7156 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
7157 			BPF_EXIT_INSN(),
7158 		},
7159 		INTERNAL,
7160 		{ },
7161 		{ { 0, 0 } },
7162 		.stack_depth = 8,
7163 	},
7164 	/* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
7165 	{
7166 		"ST_MEM_B: Store/Load byte: max negative",
7167 		.u.insns_int = {
7168 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7169 			BPF_ST_MEM(BPF_B, R10, -40, 0xff),
7170 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
7171 			BPF_EXIT_INSN(),
7172 		},
7173 		INTERNAL,
7174 		{ },
7175 		{ { 0, 0xff } },
7176 		.stack_depth = 40,
7177 	},
7178 	{
7179 		"ST_MEM_B: Store/Load byte: max positive",
7180 		.u.insns_int = {
7181 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7182 			BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
7183 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
7184 			BPF_EXIT_INSN(),
7185 		},
7186 		INTERNAL,
7187 		{ },
7188 		{ { 0, 0x7f } },
7189 		.stack_depth = 40,
7190 	},
7191 	{
7192 		"STX_MEM_B: Store/Load byte: max negative",
7193 		.u.insns_int = {
7194 			BPF_LD_IMM64(R0, 0),
7195 			BPF_LD_IMM64(R1, 0xffLL),
7196 			BPF_STX_MEM(BPF_B, R10, R1, -40),
7197 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
7198 			BPF_EXIT_INSN(),
7199 		},
7200 		INTERNAL,
7201 		{ },
7202 		{ { 0, 0xff } },
7203 		.stack_depth = 40,
7204 	},
7205 	{
7206 		"ST_MEM_H: Store/Load half word: max negative",
7207 		.u.insns_int = {
7208 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7209 			BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
7210 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
7211 			BPF_EXIT_INSN(),
7212 		},
7213 		INTERNAL,
7214 		{ },
7215 		{ { 0, 0xffff } },
7216 		.stack_depth = 40,
7217 	},
7218 	{
7219 		"ST_MEM_H: Store/Load half word: max positive",
7220 		.u.insns_int = {
7221 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7222 			BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
7223 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
7224 			BPF_EXIT_INSN(),
7225 		},
7226 		INTERNAL,
7227 		{ },
7228 		{ { 0, 0x7fff } },
7229 		.stack_depth = 40,
7230 	},
7231 	{
7232 		"STX_MEM_H: Store/Load half word: max negative",
7233 		.u.insns_int = {
7234 			BPF_LD_IMM64(R0, 0),
7235 			BPF_LD_IMM64(R1, 0xffffLL),
7236 			BPF_STX_MEM(BPF_H, R10, R1, -40),
7237 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
7238 			BPF_EXIT_INSN(),
7239 		},
7240 		INTERNAL,
7241 		{ },
7242 		{ { 0, 0xffff } },
7243 		.stack_depth = 40,
7244 	},
7245 	{
7246 		"ST_MEM_W: Store/Load word: max negative",
7247 		.u.insns_int = {
7248 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7249 			BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
7250 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
7251 			BPF_EXIT_INSN(),
7252 		},
7253 		INTERNAL,
7254 		{ },
7255 		{ { 0, 0xffffffff } },
7256 		.stack_depth = 40,
7257 	},
7258 	{
7259 		"ST_MEM_W: Store/Load word: max positive",
7260 		.u.insns_int = {
7261 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7262 			BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
7263 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
7264 			BPF_EXIT_INSN(),
7265 		},
7266 		INTERNAL,
7267 		{ },
7268 		{ { 0, 0x7fffffff } },
7269 		.stack_depth = 40,
7270 	},
7271 	{
7272 		"STX_MEM_W: Store/Load word: max negative",
7273 		.u.insns_int = {
7274 			BPF_LD_IMM64(R0, 0),
7275 			BPF_LD_IMM64(R1, 0xffffffffLL),
7276 			BPF_STX_MEM(BPF_W, R10, R1, -40),
7277 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
7278 			BPF_EXIT_INSN(),
7279 		},
7280 		INTERNAL,
7281 		{ },
7282 		{ { 0, 0xffffffff } },
7283 		.stack_depth = 40,
7284 	},
7285 	{
7286 		"ST_MEM_DW: Store/Load double word: max negative",
7287 		.u.insns_int = {
7288 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7289 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
7290 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
7291 			BPF_EXIT_INSN(),
7292 		},
7293 		INTERNAL,
7294 		{ },
7295 		{ { 0, 0xffffffff } },
7296 		.stack_depth = 40,
7297 	},
7298 	{
7299 		"ST_MEM_DW: Store/Load double word: max negative 2",
7300 		.u.insns_int = {
7301 			BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
7302 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
7303 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
7304 			BPF_LDX_MEM(BPF_DW, R2, R10, -40),
7305 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
7306 			BPF_MOV32_IMM(R0, 2),
7307 			BPF_EXIT_INSN(),
7308 			BPF_MOV32_IMM(R0, 1),
7309 			BPF_EXIT_INSN(),
7310 		},
7311 		INTERNAL,
7312 		{ },
7313 		{ { 0, 0x1 } },
7314 		.stack_depth = 40,
7315 	},
7316 	{
7317 		"ST_MEM_DW: Store/Load double word: max positive",
7318 		.u.insns_int = {
7319 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7320 			BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
7321 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
7322 			BPF_EXIT_INSN(),
7323 		},
7324 		INTERNAL,
7325 		{ },
7326 		{ { 0, 0x7fffffff } },
7327 		.stack_depth = 40,
7328 	},
7329 	{
7330 		"STX_MEM_DW: Store/Load double word: max negative",
7331 		.u.insns_int = {
7332 			BPF_LD_IMM64(R0, 0),
7333 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
7334 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7335 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
7336 			BPF_EXIT_INSN(),
7337 		},
7338 		INTERNAL,
7339 		{ },
7340 		{ { 0, 0xffffffff } },
7341 		.stack_depth = 40,
7342 	},
7343 	{
7344 		"STX_MEM_DW: Store double word: first word in memory",
7345 		.u.insns_int = {
7346 			BPF_LD_IMM64(R0, 0),
7347 			BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
7348 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7349 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
7350 			BPF_EXIT_INSN(),
7351 		},
7352 		INTERNAL,
7353 		{ },
7354 #ifdef __BIG_ENDIAN
7355 		{ { 0, 0x01234567 } },
7356 #else
7357 		{ { 0, 0x89abcdef } },
7358 #endif
7359 		.stack_depth = 40,
7360 	},
7361 	{
7362 		"STX_MEM_DW: Store double word: second word in memory",
7363 		.u.insns_int = {
7364 			BPF_LD_IMM64(R0, 0),
7365 			BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
7366 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7367 			BPF_LDX_MEM(BPF_W, R0, R10, -36),
7368 			BPF_EXIT_INSN(),
7369 		},
7370 		INTERNAL,
7371 		{ },
7372 #ifdef __BIG_ENDIAN
7373 		{ { 0, 0x89abcdef } },
7374 #else
7375 		{ { 0, 0x01234567 } },
7376 #endif
7377 		.stack_depth = 40,
7378 	},
7379 	/* BPF_STX | BPF_ATOMIC | BPF_W/DW */
7380 	{
7381 		"STX_XADD_W: X + 1 + 1 + 1 + ...",
7382 		{ },
7383 		INTERNAL,
7384 		{ },
7385 		{ { 0, 4134 } },
7386 		.fill_helper = bpf_fill_stxw,
7387 	},
7388 	{
7389 		"STX_XADD_DW: X + 1 + 1 + 1 + ...",
7390 		{ },
7391 		INTERNAL,
7392 		{ },
7393 		{ { 0, 4134 } },
7394 		.fill_helper = bpf_fill_stxdw,
7395 	},
7396 	/*
7397 	 * Exhaustive tests of atomic operation variants.
7398 	 * Individual tests are expanded from template macros for all
7399 	 * combinations of ALU operation, word size and fetching.
7400 	 */
7401 #define BPF_ATOMIC_POISON(width) ((width) == BPF_W ? (0xbaadf00dULL << 32) : 0)
7402 
7403 #define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result)	\
7404 {									\
7405 	"BPF_ATOMIC | " #width ", " #op ": Test: "			\
7406 		#old " " #logic " " #update " = " #result,		\
7407 	.u.insns_int = {						\
7408 		BPF_LD_IMM64(R5, (update) | BPF_ATOMIC_POISON(width)),	\
7409 		BPF_ST_MEM(width, R10, -40, old),			\
7410 		BPF_ATOMIC_OP(width, op, R10, R5, -40),			\
7411 		BPF_LDX_MEM(width, R0, R10, -40),			\
7412 		BPF_ALU64_REG(BPF_MOV, R1, R0),				\
7413 		BPF_ALU64_IMM(BPF_RSH, R1, 32),				\
7414 		BPF_ALU64_REG(BPF_OR, R0, R1),				\
7415 		BPF_EXIT_INSN(),					\
7416 	},								\
7417 	INTERNAL,							\
7418 	{ },								\
7419 	{ { 0, result } },						\
7420 	.stack_depth = 40,						\
7421 }
7422 #define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result)	\
7423 {									\
7424 	"BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: "	\
7425 		#old " " #logic " " #update " = " #result,		\
7426 	.u.insns_int = {						\
7427 		BPF_ALU64_REG(BPF_MOV, R1, R10),			\
7428 		BPF_LD_IMM64(R0, (update) | BPF_ATOMIC_POISON(width)),	\
7429 		BPF_ST_MEM(BPF_W, R10, -40, old),			\
7430 		BPF_ATOMIC_OP(width, op, R10, R0, -40),			\
7431 		BPF_ALU64_REG(BPF_MOV, R0, R10),			\
7432 		BPF_ALU64_REG(BPF_SUB, R0, R1),				\
7433 		BPF_ALU64_REG(BPF_MOV, R1, R0),				\
7434 		BPF_ALU64_IMM(BPF_RSH, R1, 32),				\
7435 		BPF_ALU64_REG(BPF_OR, R0, R1),				\
7436 		BPF_EXIT_INSN(),					\
7437 	},								\
7438 	INTERNAL,							\
7439 	{ },								\
7440 	{ { 0, 0 } },							\
7441 	.stack_depth = 40,						\
7442 }
7443 #define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result)	\
7444 {									\
7445 	"BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: "	\
7446 		#old " " #logic " " #update " = " #result,		\
7447 	.u.insns_int = {						\
7448 		BPF_ALU64_REG(BPF_MOV, R0, R10),			\
7449 		BPF_LD_IMM64(R1, (update) | BPF_ATOMIC_POISON(width)),	\
7450 		BPF_ST_MEM(width, R10, -40, old),			\
7451 		BPF_ATOMIC_OP(width, op, R10, R1, -40),			\
7452 		BPF_ALU64_REG(BPF_SUB, R0, R10),			\
7453 		BPF_ALU64_REG(BPF_MOV, R1, R0),				\
7454 		BPF_ALU64_IMM(BPF_RSH, R1, 32),				\
7455 		BPF_ALU64_REG(BPF_OR, R0, R1),				\
7456 		BPF_EXIT_INSN(),					\
7457 	},								\
7458 	INTERNAL,                                                       \
7459 	{ },                                                            \
7460 	{ { 0, 0 } },                                                   \
7461 	.stack_depth = 40,                                              \
7462 }
7463 #define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result)	\
7464 {									\
7465 	"BPF_ATOMIC | " #width ", " #op ": Test fetch: "		\
7466 		#old " " #logic " " #update " = " #result,		\
7467 	.u.insns_int = {						\
7468 		BPF_LD_IMM64(R3, (update) | BPF_ATOMIC_POISON(width)),	\
7469 		BPF_ST_MEM(width, R10, -40, old),			\
7470 		BPF_ATOMIC_OP(width, op, R10, R3, -40),			\
7471 		BPF_ALU32_REG(BPF_MOV, R0, R3),                         \
7472 		BPF_EXIT_INSN(),					\
7473 	},								\
7474 	INTERNAL,                                                       \
7475 	{ },                                                            \
7476 	{ { 0, (op) & BPF_FETCH ? old : update } },			\
7477 	.stack_depth = 40,                                              \
7478 }
7479 	/* BPF_ATOMIC | BPF_W: BPF_ADD */
7480 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
7481 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
7482 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
7483 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
7484 	/* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
7485 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7486 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7487 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7488 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7489 	/* BPF_ATOMIC | BPF_DW: BPF_ADD */
7490 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
7491 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
7492 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
7493 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
7494 	/* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
7495 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7496 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7497 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7498 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
7499 	/* BPF_ATOMIC | BPF_W: BPF_AND */
7500 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
7501 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
7502 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
7503 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
7504 	/* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
7505 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7506 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7507 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7508 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7509 	/* BPF_ATOMIC | BPF_DW: BPF_AND */
7510 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
7511 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
7512 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
7513 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
7514 	/* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
7515 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7516 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7517 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7518 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
7519 	/* BPF_ATOMIC | BPF_W: BPF_OR */
7520 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
7521 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
7522 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
7523 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
7524 	/* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
7525 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7526 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7527 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7528 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7529 	/* BPF_ATOMIC | BPF_DW: BPF_OR */
7530 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
7531 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
7532 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
7533 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
7534 	/* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
7535 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7536 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7537 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7538 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
7539 	/* BPF_ATOMIC | BPF_W: BPF_XOR */
7540 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7541 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7542 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7543 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7544 	/* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
7545 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7546 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7547 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7548 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7549 	/* BPF_ATOMIC | BPF_DW: BPF_XOR */
7550 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7551 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7552 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7553 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
7554 	/* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
7555 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7556 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7557 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7558 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
7559 	/* BPF_ATOMIC | BPF_W: BPF_XCHG */
7560 	BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7561 	BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7562 	BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7563 	BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7564 	/* BPF_ATOMIC | BPF_DW: BPF_XCHG */
7565 	BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7566 	BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7567 	BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7568 	BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
7569 #undef BPF_ATOMIC_POISON
7570 #undef BPF_ATOMIC_OP_TEST1
7571 #undef BPF_ATOMIC_OP_TEST2
7572 #undef BPF_ATOMIC_OP_TEST3
7573 #undef BPF_ATOMIC_OP_TEST4
7574 	/* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */
7575 	{
7576 		"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return",
7577 		.u.insns_int = {
7578 			BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
7579 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
7580 			BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
7581 			BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
7582 			BPF_EXIT_INSN(),
7583 		},
7584 		INTERNAL,
7585 		{ },
7586 		{ { 0, 0x01234567 } },
7587 		.stack_depth = 40,
7588 	},
7589 	{
7590 		"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store",
7591 		.u.insns_int = {
7592 			BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
7593 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
7594 			BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
7595 			BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
7596 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
7597 			BPF_EXIT_INSN(),
7598 		},
7599 		INTERNAL,
7600 		{ },
7601 		{ { 0, 0x89abcdef } },
7602 		.stack_depth = 40,
7603 	},
7604 	{
7605 		"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return",
7606 		.u.insns_int = {
7607 			BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
7608 			BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
7609 			BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
7610 			BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
7611 			BPF_EXIT_INSN(),
7612 		},
7613 		INTERNAL,
7614 		{ },
7615 		{ { 0, 0x01234567 } },
7616 		.stack_depth = 40,
7617 	},
7618 	{
7619 		"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store",
7620 		.u.insns_int = {
7621 			BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
7622 			BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
7623 			BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
7624 			BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
7625 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
7626 			BPF_EXIT_INSN(),
7627 		},
7628 		INTERNAL,
7629 		{ },
7630 		{ { 0, 0x01234567 } },
7631 		.stack_depth = 40,
7632 	},
7633 	{
7634 		"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects",
7635 		.u.insns_int = {
7636 			BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
7637 			BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
7638 			BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
7639 			BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
7640 			BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
7641 			BPF_ALU32_REG(BPF_MOV, R0, R3),
7642 			BPF_EXIT_INSN(),
7643 		},
7644 		INTERNAL,
7645 		{ },
7646 		{ { 0, 0x89abcdef } },
7647 		.stack_depth = 40,
7648 	},
7649 	/* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */
7650 	{
7651 		"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return",
7652 		.u.insns_int = {
7653 			BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
7654 			BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
7655 			BPF_ALU64_REG(BPF_MOV, R0, R1),
7656 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7657 			BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
7658 			BPF_JMP_REG(BPF_JNE, R0, R1, 1),
7659 			BPF_ALU64_REG(BPF_SUB, R0, R1),
7660 			BPF_EXIT_INSN(),
7661 		},
7662 		INTERNAL,
7663 		{ },
7664 		{ { 0, 0 } },
7665 		.stack_depth = 40,
7666 	},
7667 	{
7668 		"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store",
7669 		.u.insns_int = {
7670 			BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
7671 			BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
7672 			BPF_ALU64_REG(BPF_MOV, R0, R1),
7673 			BPF_STX_MEM(BPF_DW, R10, R0, -40),
7674 			BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
7675 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
7676 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7677 			BPF_ALU64_REG(BPF_SUB, R0, R2),
7678 			BPF_EXIT_INSN(),
7679 		},
7680 		INTERNAL,
7681 		{ },
7682 		{ { 0, 0 } },
7683 		.stack_depth = 40,
7684 	},
7685 	{
7686 		"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return",
7687 		.u.insns_int = {
7688 			BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
7689 			BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
7690 			BPF_ALU64_REG(BPF_MOV, R0, R1),
7691 			BPF_ALU64_IMM(BPF_ADD, R0, 1),
7692 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7693 			BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
7694 			BPF_JMP_REG(BPF_JNE, R0, R1, 1),
7695 			BPF_ALU64_REG(BPF_SUB, R0, R1),
7696 			BPF_EXIT_INSN(),
7697 		},
7698 		INTERNAL,
7699 		{ },
7700 		{ { 0, 0 } },
7701 		.stack_depth = 40,
7702 	},
7703 	{
7704 		"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store",
7705 		.u.insns_int = {
7706 			BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
7707 			BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
7708 			BPF_ALU64_REG(BPF_MOV, R0, R1),
7709 			BPF_ALU64_IMM(BPF_ADD, R0, 1),
7710 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7711 			BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
7712 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
7713 			BPF_JMP_REG(BPF_JNE, R0, R1, 1),
7714 			BPF_ALU64_REG(BPF_SUB, R0, R1),
7715 			BPF_EXIT_INSN(),
7716 		},
7717 		INTERNAL,
7718 		{ },
7719 		{ { 0, 0 } },
7720 		.stack_depth = 40,
7721 	},
7722 	{
7723 		"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects",
7724 		.u.insns_int = {
7725 			BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
7726 			BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
7727 			BPF_ALU64_REG(BPF_MOV, R0, R1),
7728 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
7729 			BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
7730 			BPF_LD_IMM64(R0, 0xfecdba9876543210ULL),
7731 			BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7732 			BPF_ALU64_REG(BPF_SUB, R0, R2),
7733 			BPF_EXIT_INSN(),
7734 		},
7735 		INTERNAL,
7736 		{ },
7737 		{ { 0, 0 } },
7738 		.stack_depth = 40,
7739 	},
7740 	/* BPF_JMP32 | BPF_JEQ | BPF_K */
7741 	{
7742 		"JMP32_JEQ_K: Small immediate",
7743 		.u.insns_int = {
7744 			BPF_ALU32_IMM(BPF_MOV, R0, 123),
7745 			BPF_JMP32_IMM(BPF_JEQ, R0, 321, 1),
7746 			BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1),
7747 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7748 			BPF_EXIT_INSN(),
7749 		},
7750 		INTERNAL,
7751 		{ },
7752 		{ { 0, 123 } }
7753 	},
7754 	{
7755 		"JMP32_JEQ_K: Large immediate",
7756 		.u.insns_int = {
7757 			BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
7758 			BPF_JMP32_IMM(BPF_JEQ, R0, 12345678 & 0xffff, 1),
7759 			BPF_JMP32_IMM(BPF_JEQ, R0, 12345678, 1),
7760 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7761 			BPF_EXIT_INSN(),
7762 		},
7763 		INTERNAL,
7764 		{ },
7765 		{ { 0, 12345678 } }
7766 	},
7767 	{
7768 		"JMP32_JEQ_K: negative immediate",
7769 		.u.insns_int = {
7770 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
7771 			BPF_JMP32_IMM(BPF_JEQ, R0,  123, 1),
7772 			BPF_JMP32_IMM(BPF_JEQ, R0, -123, 1),
7773 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7774 			BPF_EXIT_INSN(),
7775 		},
7776 		INTERNAL,
7777 		{ },
7778 		{ { 0, -123 } }
7779 	},
7780 	/* BPF_JMP32 | BPF_JEQ | BPF_X */
7781 	{
7782 		"JMP32_JEQ_X",
7783 		.u.insns_int = {
7784 			BPF_ALU32_IMM(BPF_MOV, R0, 1234),
7785 			BPF_ALU32_IMM(BPF_MOV, R1, 4321),
7786 			BPF_JMP32_REG(BPF_JEQ, R0, R1, 2),
7787 			BPF_ALU32_IMM(BPF_MOV, R1, 1234),
7788 			BPF_JMP32_REG(BPF_JEQ, R0, R1, 1),
7789 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7790 			BPF_EXIT_INSN(),
7791 		},
7792 		INTERNAL,
7793 		{ },
7794 		{ { 0, 1234 } }
7795 	},
7796 	/* BPF_JMP32 | BPF_JNE | BPF_K */
7797 	{
7798 		"JMP32_JNE_K: Small immediate",
7799 		.u.insns_int = {
7800 			BPF_ALU32_IMM(BPF_MOV, R0, 123),
7801 			BPF_JMP32_IMM(BPF_JNE, R0, 123, 1),
7802 			BPF_JMP32_IMM(BPF_JNE, R0, 321, 1),
7803 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7804 			BPF_EXIT_INSN(),
7805 		},
7806 		INTERNAL,
7807 		{ },
7808 		{ { 0, 123 } }
7809 	},
7810 	{
7811 		"JMP32_JNE_K: Large immediate",
7812 		.u.insns_int = {
7813 			BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
7814 			BPF_JMP32_IMM(BPF_JNE, R0, 12345678, 1),
7815 			BPF_JMP32_IMM(BPF_JNE, R0, 12345678 & 0xffff, 1),
7816 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7817 			BPF_EXIT_INSN(),
7818 		},
7819 		INTERNAL,
7820 		{ },
7821 		{ { 0, 12345678 } }
7822 	},
7823 	{
7824 		"JMP32_JNE_K: negative immediate",
7825 		.u.insns_int = {
7826 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
7827 			BPF_JMP32_IMM(BPF_JNE, R0, -123, 1),
7828 			BPF_JMP32_IMM(BPF_JNE, R0,  123, 1),
7829 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7830 			BPF_EXIT_INSN(),
7831 		},
7832 		INTERNAL,
7833 		{ },
7834 		{ { 0, -123 } }
7835 	},
7836 	/* BPF_JMP32 | BPF_JNE | BPF_X */
7837 	{
7838 		"JMP32_JNE_X",
7839 		.u.insns_int = {
7840 			BPF_ALU32_IMM(BPF_MOV, R0, 1234),
7841 			BPF_ALU32_IMM(BPF_MOV, R1, 1234),
7842 			BPF_JMP32_REG(BPF_JNE, R0, R1, 2),
7843 			BPF_ALU32_IMM(BPF_MOV, R1, 4321),
7844 			BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
7845 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7846 			BPF_EXIT_INSN(),
7847 		},
7848 		INTERNAL,
7849 		{ },
7850 		{ { 0, 1234 } }
7851 	},
7852 	/* BPF_JMP32 | BPF_JSET | BPF_K */
7853 	{
7854 		"JMP32_JSET_K: Small immediate",
7855 		.u.insns_int = {
7856 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
7857 			BPF_JMP32_IMM(BPF_JSET, R0, 2, 1),
7858 			BPF_JMP32_IMM(BPF_JSET, R0, 3, 1),
7859 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7860 			BPF_EXIT_INSN(),
7861 		},
7862 		INTERNAL,
7863 		{ },
7864 		{ { 0, 1 } }
7865 	},
7866 	{
7867 		"JMP32_JSET_K: Large immediate",
7868 		.u.insns_int = {
7869 			BPF_ALU32_IMM(BPF_MOV, R0, 0x40000000),
7870 			BPF_JMP32_IMM(BPF_JSET, R0, 0x3fffffff, 1),
7871 			BPF_JMP32_IMM(BPF_JSET, R0, 0x60000000, 1),
7872 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7873 			BPF_EXIT_INSN(),
7874 		},
7875 		INTERNAL,
7876 		{ },
7877 		{ { 0, 0x40000000 } }
7878 	},
7879 	{
7880 		"JMP32_JSET_K: negative immediate",
7881 		.u.insns_int = {
7882 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
7883 			BPF_JMP32_IMM(BPF_JSET, R0, -1, 1),
7884 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7885 			BPF_EXIT_INSN(),
7886 		},
7887 		INTERNAL,
7888 		{ },
7889 		{ { 0, -123 } }
7890 	},
7891 	/* BPF_JMP32 | BPF_JSET | BPF_X */
7892 	{
7893 		"JMP32_JSET_X",
7894 		.u.insns_int = {
7895 			BPF_ALU32_IMM(BPF_MOV, R0, 8),
7896 			BPF_ALU32_IMM(BPF_MOV, R1, 7),
7897 			BPF_JMP32_REG(BPF_JSET, R0, R1, 2),
7898 			BPF_ALU32_IMM(BPF_MOV, R1, 8 | 2),
7899 			BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
7900 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7901 			BPF_EXIT_INSN(),
7902 		},
7903 		INTERNAL,
7904 		{ },
7905 		{ { 0, 8 } }
7906 	},
7907 	/* BPF_JMP32 | BPF_JGT | BPF_K */
7908 	{
7909 		"JMP32_JGT_K: Small immediate",
7910 		.u.insns_int = {
7911 			BPF_ALU32_IMM(BPF_MOV, R0, 123),
7912 			BPF_JMP32_IMM(BPF_JGT, R0, 123, 1),
7913 			BPF_JMP32_IMM(BPF_JGT, R0, 122, 1),
7914 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7915 			BPF_EXIT_INSN(),
7916 		},
7917 		INTERNAL,
7918 		{ },
7919 		{ { 0, 123 } }
7920 	},
7921 	{
7922 		"JMP32_JGT_K: Large immediate",
7923 		.u.insns_int = {
7924 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
7925 			BPF_JMP32_IMM(BPF_JGT, R0, 0xffffffff, 1),
7926 			BPF_JMP32_IMM(BPF_JGT, R0, 0xfffffffd, 1),
7927 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7928 			BPF_EXIT_INSN(),
7929 		},
7930 		INTERNAL,
7931 		{ },
7932 		{ { 0, 0xfffffffe } }
7933 	},
7934 	/* BPF_JMP32 | BPF_JGT | BPF_X */
7935 	{
7936 		"JMP32_JGT_X",
7937 		.u.insns_int = {
7938 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
7939 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
7940 			BPF_JMP32_REG(BPF_JGT, R0, R1, 2),
7941 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
7942 			BPF_JMP32_REG(BPF_JGT, R0, R1, 1),
7943 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7944 			BPF_EXIT_INSN(),
7945 		},
7946 		INTERNAL,
7947 		{ },
7948 		{ { 0, 0xfffffffe } }
7949 	},
7950 	/* BPF_JMP32 | BPF_JGE | BPF_K */
7951 	{
7952 		"JMP32_JGE_K: Small immediate",
7953 		.u.insns_int = {
7954 			BPF_ALU32_IMM(BPF_MOV, R0, 123),
7955 			BPF_JMP32_IMM(BPF_JGE, R0, 124, 1),
7956 			BPF_JMP32_IMM(BPF_JGE, R0, 123, 1),
7957 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7958 			BPF_EXIT_INSN(),
7959 		},
7960 		INTERNAL,
7961 		{ },
7962 		{ { 0, 123 } }
7963 	},
7964 	{
7965 		"JMP32_JGE_K: Large immediate",
7966 		.u.insns_int = {
7967 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
7968 			BPF_JMP32_IMM(BPF_JGE, R0, 0xffffffff, 1),
7969 			BPF_JMP32_IMM(BPF_JGE, R0, 0xfffffffe, 1),
7970 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7971 			BPF_EXIT_INSN(),
7972 		},
7973 		INTERNAL,
7974 		{ },
7975 		{ { 0, 0xfffffffe } }
7976 	},
7977 	/* BPF_JMP32 | BPF_JGE | BPF_X */
7978 	{
7979 		"JMP32_JGE_X",
7980 		.u.insns_int = {
7981 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
7982 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
7983 			BPF_JMP32_REG(BPF_JGE, R0, R1, 2),
7984 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
7985 			BPF_JMP32_REG(BPF_JGE, R0, R1, 1),
7986 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
7987 			BPF_EXIT_INSN(),
7988 		},
7989 		INTERNAL,
7990 		{ },
7991 		{ { 0, 0xfffffffe } }
7992 	},
7993 	/* BPF_JMP32 | BPF_JLT | BPF_K */
7994 	{
7995 		"JMP32_JLT_K: Small immediate",
7996 		.u.insns_int = {
7997 			BPF_ALU32_IMM(BPF_MOV, R0, 123),
7998 			BPF_JMP32_IMM(BPF_JLT, R0, 123, 1),
7999 			BPF_JMP32_IMM(BPF_JLT, R0, 124, 1),
8000 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8001 			BPF_EXIT_INSN(),
8002 		},
8003 		INTERNAL,
8004 		{ },
8005 		{ { 0, 123 } }
8006 	},
8007 	{
8008 		"JMP32_JLT_K: Large immediate",
8009 		.u.insns_int = {
8010 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8011 			BPF_JMP32_IMM(BPF_JLT, R0, 0xfffffffd, 1),
8012 			BPF_JMP32_IMM(BPF_JLT, R0, 0xffffffff, 1),
8013 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8014 			BPF_EXIT_INSN(),
8015 		},
8016 		INTERNAL,
8017 		{ },
8018 		{ { 0, 0xfffffffe } }
8019 	},
8020 	/* BPF_JMP32 | BPF_JLT | BPF_X */
8021 	{
8022 		"JMP32_JLT_X",
8023 		.u.insns_int = {
8024 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8025 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
8026 			BPF_JMP32_REG(BPF_JLT, R0, R1, 2),
8027 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
8028 			BPF_JMP32_REG(BPF_JLT, R0, R1, 1),
8029 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8030 			BPF_EXIT_INSN(),
8031 		},
8032 		INTERNAL,
8033 		{ },
8034 		{ { 0, 0xfffffffe } }
8035 	},
8036 	/* BPF_JMP32 | BPF_JLE | BPF_K */
8037 	{
8038 		"JMP32_JLE_K: Small immediate",
8039 		.u.insns_int = {
8040 			BPF_ALU32_IMM(BPF_MOV, R0, 123),
8041 			BPF_JMP32_IMM(BPF_JLE, R0, 122, 1),
8042 			BPF_JMP32_IMM(BPF_JLE, R0, 123, 1),
8043 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8044 			BPF_EXIT_INSN(),
8045 		},
8046 		INTERNAL,
8047 		{ },
8048 		{ { 0, 123 } }
8049 	},
8050 	{
8051 		"JMP32_JLE_K: Large immediate",
8052 		.u.insns_int = {
8053 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8054 			BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffd, 1),
8055 			BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffe, 1),
8056 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8057 			BPF_EXIT_INSN(),
8058 		},
8059 		INTERNAL,
8060 		{ },
8061 		{ { 0, 0xfffffffe } }
8062 	},
8063 	/* BPF_JMP32 | BPF_JLE | BPF_X */
8064 	{
8065 		"JMP32_JLE_X",
8066 		.u.insns_int = {
8067 			BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8068 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
8069 			BPF_JMP32_REG(BPF_JLE, R0, R1, 2),
8070 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
8071 			BPF_JMP32_REG(BPF_JLE, R0, R1, 1),
8072 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8073 			BPF_EXIT_INSN(),
8074 		},
8075 		INTERNAL,
8076 		{ },
8077 		{ { 0, 0xfffffffe } }
8078 	},
8079 	/* BPF_JMP32 | BPF_JSGT | BPF_K */
8080 	{
8081 		"JMP32_JSGT_K: Small immediate",
8082 		.u.insns_int = {
8083 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
8084 			BPF_JMP32_IMM(BPF_JSGT, R0, -123, 1),
8085 			BPF_JMP32_IMM(BPF_JSGT, R0, -124, 1),
8086 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8087 			BPF_EXIT_INSN(),
8088 		},
8089 		INTERNAL,
8090 		{ },
8091 		{ { 0, -123 } }
8092 	},
8093 	{
8094 		"JMP32_JSGT_K: Large immediate",
8095 		.u.insns_int = {
8096 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8097 			BPF_JMP32_IMM(BPF_JSGT, R0, -12345678, 1),
8098 			BPF_JMP32_IMM(BPF_JSGT, R0, -12345679, 1),
8099 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8100 			BPF_EXIT_INSN(),
8101 		},
8102 		INTERNAL,
8103 		{ },
8104 		{ { 0, -12345678 } }
8105 	},
8106 	/* BPF_JMP32 | BPF_JSGT | BPF_X */
8107 	{
8108 		"JMP32_JSGT_X",
8109 		.u.insns_int = {
8110 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8111 			BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
8112 			BPF_JMP32_REG(BPF_JSGT, R0, R1, 2),
8113 			BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
8114 			BPF_JMP32_REG(BPF_JSGT, R0, R1, 1),
8115 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8116 			BPF_EXIT_INSN(),
8117 		},
8118 		INTERNAL,
8119 		{ },
8120 		{ { 0, -12345678 } }
8121 	},
8122 	/* BPF_JMP32 | BPF_JSGE | BPF_K */
8123 	{
8124 		"JMP32_JSGE_K: Small immediate",
8125 		.u.insns_int = {
8126 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
8127 			BPF_JMP32_IMM(BPF_JSGE, R0, -122, 1),
8128 			BPF_JMP32_IMM(BPF_JSGE, R0, -123, 1),
8129 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8130 			BPF_EXIT_INSN(),
8131 		},
8132 		INTERNAL,
8133 		{ },
8134 		{ { 0, -123 } }
8135 	},
8136 	{
8137 		"JMP32_JSGE_K: Large immediate",
8138 		.u.insns_int = {
8139 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8140 			BPF_JMP32_IMM(BPF_JSGE, R0, -12345677, 1),
8141 			BPF_JMP32_IMM(BPF_JSGE, R0, -12345678, 1),
8142 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8143 			BPF_EXIT_INSN(),
8144 		},
8145 		INTERNAL,
8146 		{ },
8147 		{ { 0, -12345678 } }
8148 	},
8149 	/* BPF_JMP32 | BPF_JSGE | BPF_X */
8150 	{
8151 		"JMP32_JSGE_X",
8152 		.u.insns_int = {
8153 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8154 			BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
8155 			BPF_JMP32_REG(BPF_JSGE, R0, R1, 2),
8156 			BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
8157 			BPF_JMP32_REG(BPF_JSGE, R0, R1, 1),
8158 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8159 			BPF_EXIT_INSN(),
8160 		},
8161 		INTERNAL,
8162 		{ },
8163 		{ { 0, -12345678 } }
8164 	},
8165 	/* BPF_JMP32 | BPF_JSLT | BPF_K */
8166 	{
8167 		"JMP32_JSLT_K: Small immediate",
8168 		.u.insns_int = {
8169 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
8170 			BPF_JMP32_IMM(BPF_JSLT, R0, -123, 1),
8171 			BPF_JMP32_IMM(BPF_JSLT, R0, -122, 1),
8172 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8173 			BPF_EXIT_INSN(),
8174 		},
8175 		INTERNAL,
8176 		{ },
8177 		{ { 0, -123 } }
8178 	},
8179 	{
8180 		"JMP32_JSLT_K: Large immediate",
8181 		.u.insns_int = {
8182 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8183 			BPF_JMP32_IMM(BPF_JSLT, R0, -12345678, 1),
8184 			BPF_JMP32_IMM(BPF_JSLT, R0, -12345677, 1),
8185 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8186 			BPF_EXIT_INSN(),
8187 		},
8188 		INTERNAL,
8189 		{ },
8190 		{ { 0, -12345678 } }
8191 	},
8192 	/* BPF_JMP32 | BPF_JSLT | BPF_X */
8193 	{
8194 		"JMP32_JSLT_X",
8195 		.u.insns_int = {
8196 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8197 			BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
8198 			BPF_JMP32_REG(BPF_JSLT, R0, R1, 2),
8199 			BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
8200 			BPF_JMP32_REG(BPF_JSLT, R0, R1, 1),
8201 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8202 			BPF_EXIT_INSN(),
8203 		},
8204 		INTERNAL,
8205 		{ },
8206 		{ { 0, -12345678 } }
8207 	},
8208 	/* BPF_JMP32 | BPF_JSLE | BPF_K */
8209 	{
8210 		"JMP32_JSLE_K: Small immediate",
8211 		.u.insns_int = {
8212 			BPF_ALU32_IMM(BPF_MOV, R0, -123),
8213 			BPF_JMP32_IMM(BPF_JSLE, R0, -124, 1),
8214 			BPF_JMP32_IMM(BPF_JSLE, R0, -123, 1),
8215 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8216 			BPF_EXIT_INSN(),
8217 		},
8218 		INTERNAL,
8219 		{ },
8220 		{ { 0, -123 } }
8221 	},
8222 	{
8223 		"JMP32_JSLE_K: Large immediate",
8224 		.u.insns_int = {
8225 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8226 			BPF_JMP32_IMM(BPF_JSLE, R0, -12345679, 1),
8227 			BPF_JMP32_IMM(BPF_JSLE, R0, -12345678, 1),
8228 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8229 			BPF_EXIT_INSN(),
8230 		},
8231 		INTERNAL,
8232 		{ },
8233 		{ { 0, -12345678 } }
8234 	},
8235 	/* BPF_JMP32 | BPF_JSLE | BPF_K */
8236 	{
8237 		"JMP32_JSLE_X",
8238 		.u.insns_int = {
8239 			BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
8240 			BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
8241 			BPF_JMP32_REG(BPF_JSLE, R0, R1, 2),
8242 			BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
8243 			BPF_JMP32_REG(BPF_JSLE, R0, R1, 1),
8244 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8245 			BPF_EXIT_INSN(),
8246 		},
8247 		INTERNAL,
8248 		{ },
8249 		{ { 0, -12345678 } }
8250 	},
8251 	/* BPF_JMP | BPF_EXIT */
8252 	{
8253 		"JMP_EXIT",
8254 		.u.insns_int = {
8255 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
8256 			BPF_EXIT_INSN(),
8257 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
8258 		},
8259 		INTERNAL,
8260 		{ },
8261 		{ { 0, 0x4711 } },
8262 	},
8263 	/* BPF_JMP | BPF_JA */
8264 	{
8265 		"JMP_JA: Unconditional jump: if (true) return 1",
8266 		.u.insns_int = {
8267 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8268 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8269 			BPF_EXIT_INSN(),
8270 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8271 			BPF_EXIT_INSN(),
8272 		},
8273 		INTERNAL,
8274 		{ },
8275 		{ { 0, 1 } },
8276 	},
8277 	/* BPF_JMP | BPF_JSLT | BPF_K */
8278 	{
8279 		"JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
8280 		.u.insns_int = {
8281 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8282 			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
8283 			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
8284 			BPF_EXIT_INSN(),
8285 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8286 			BPF_EXIT_INSN(),
8287 		},
8288 		INTERNAL,
8289 		{ },
8290 		{ { 0, 1 } },
8291 	},
8292 	{
8293 		"JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
8294 		.u.insns_int = {
8295 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8296 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8297 			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
8298 			BPF_EXIT_INSN(),
8299 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8300 			BPF_EXIT_INSN(),
8301 		},
8302 		INTERNAL,
8303 		{ },
8304 		{ { 0, 1 } },
8305 	},
8306 	/* BPF_JMP | BPF_JSGT | BPF_K */
8307 	{
8308 		"JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
8309 		.u.insns_int = {
8310 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8311 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8312 			BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
8313 			BPF_EXIT_INSN(),
8314 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8315 			BPF_EXIT_INSN(),
8316 		},
8317 		INTERNAL,
8318 		{ },
8319 		{ { 0, 1 } },
8320 	},
8321 	{
8322 		"JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
8323 		.u.insns_int = {
8324 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8325 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8326 			BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
8327 			BPF_EXIT_INSN(),
8328 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8329 			BPF_EXIT_INSN(),
8330 		},
8331 		INTERNAL,
8332 		{ },
8333 		{ { 0, 1 } },
8334 	},
8335 	/* BPF_JMP | BPF_JSLE | BPF_K */
8336 	{
8337 		"JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
8338 		.u.insns_int = {
8339 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8340 			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
8341 			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
8342 			BPF_EXIT_INSN(),
8343 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8344 			BPF_EXIT_INSN(),
8345 		},
8346 		INTERNAL,
8347 		{ },
8348 		{ { 0, 1 } },
8349 	},
8350 	{
8351 		"JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
8352 		.u.insns_int = {
8353 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8354 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8355 			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
8356 			BPF_EXIT_INSN(),
8357 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8358 			BPF_EXIT_INSN(),
8359 		},
8360 		INTERNAL,
8361 		{ },
8362 		{ { 0, 1 } },
8363 	},
8364 	{
8365 		"JMP_JSLE_K: Signed jump: value walk 1",
8366 		.u.insns_int = {
8367 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8368 			BPF_LD_IMM64(R1, 3),
8369 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
8370 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
8371 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
8372 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
8373 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
8374 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
8375 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
8376 			BPF_EXIT_INSN(),		/* bad exit */
8377 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
8378 			BPF_EXIT_INSN(),
8379 		},
8380 		INTERNAL,
8381 		{ },
8382 		{ { 0, 1 } },
8383 	},
8384 	{
8385 		"JMP_JSLE_K: Signed jump: value walk 2",
8386 		.u.insns_int = {
8387 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8388 			BPF_LD_IMM64(R1, 3),
8389 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
8390 			BPF_ALU64_IMM(BPF_SUB, R1, 2),
8391 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
8392 			BPF_ALU64_IMM(BPF_SUB, R1, 2),
8393 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
8394 			BPF_EXIT_INSN(),		/* bad exit */
8395 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
8396 			BPF_EXIT_INSN(),
8397 		},
8398 		INTERNAL,
8399 		{ },
8400 		{ { 0, 1 } },
8401 	},
8402 	/* BPF_JMP | BPF_JSGE | BPF_K */
8403 	{
8404 		"JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
8405 		.u.insns_int = {
8406 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8407 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8408 			BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
8409 			BPF_EXIT_INSN(),
8410 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8411 			BPF_EXIT_INSN(),
8412 		},
8413 		INTERNAL,
8414 		{ },
8415 		{ { 0, 1 } },
8416 	},
8417 	{
8418 		"JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
8419 		.u.insns_int = {
8420 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8421 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8422 			BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
8423 			BPF_EXIT_INSN(),
8424 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8425 			BPF_EXIT_INSN(),
8426 		},
8427 		INTERNAL,
8428 		{ },
8429 		{ { 0, 1 } },
8430 	},
8431 	{
8432 		"JMP_JSGE_K: Signed jump: value walk 1",
8433 		.u.insns_int = {
8434 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8435 			BPF_LD_IMM64(R1, -3),
8436 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
8437 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
8438 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
8439 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
8440 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
8441 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
8442 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
8443 			BPF_EXIT_INSN(),		/* bad exit */
8444 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
8445 			BPF_EXIT_INSN(),
8446 		},
8447 		INTERNAL,
8448 		{ },
8449 		{ { 0, 1 } },
8450 	},
8451 	{
8452 		"JMP_JSGE_K: Signed jump: value walk 2",
8453 		.u.insns_int = {
8454 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8455 			BPF_LD_IMM64(R1, -3),
8456 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
8457 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
8458 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
8459 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
8460 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
8461 			BPF_EXIT_INSN(),		/* bad exit */
8462 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
8463 			BPF_EXIT_INSN(),
8464 		},
8465 		INTERNAL,
8466 		{ },
8467 		{ { 0, 1 } },
8468 	},
8469 	/* BPF_JMP | BPF_JGT | BPF_K */
8470 	{
8471 		"JMP_JGT_K: if (3 > 2) return 1",
8472 		.u.insns_int = {
8473 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8474 			BPF_LD_IMM64(R1, 3),
8475 			BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
8476 			BPF_EXIT_INSN(),
8477 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8478 			BPF_EXIT_INSN(),
8479 		},
8480 		INTERNAL,
8481 		{ },
8482 		{ { 0, 1 } },
8483 	},
8484 	{
8485 		"JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
8486 		.u.insns_int = {
8487 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8488 			BPF_LD_IMM64(R1, -1),
8489 			BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
8490 			BPF_EXIT_INSN(),
8491 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8492 			BPF_EXIT_INSN(),
8493 		},
8494 		INTERNAL,
8495 		{ },
8496 		{ { 0, 1 } },
8497 	},
8498 	/* BPF_JMP | BPF_JLT | BPF_K */
8499 	{
8500 		"JMP_JLT_K: if (2 < 3) return 1",
8501 		.u.insns_int = {
8502 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8503 			BPF_LD_IMM64(R1, 2),
8504 			BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
8505 			BPF_EXIT_INSN(),
8506 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8507 			BPF_EXIT_INSN(),
8508 		},
8509 		INTERNAL,
8510 		{ },
8511 		{ { 0, 1 } },
8512 	},
8513 	{
8514 		"JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
8515 		.u.insns_int = {
8516 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8517 			BPF_LD_IMM64(R1, 1),
8518 			BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
8519 			BPF_EXIT_INSN(),
8520 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8521 			BPF_EXIT_INSN(),
8522 		},
8523 		INTERNAL,
8524 		{ },
8525 		{ { 0, 1 } },
8526 	},
8527 	/* BPF_JMP | BPF_JGE | BPF_K */
8528 	{
8529 		"JMP_JGE_K: if (3 >= 2) return 1",
8530 		.u.insns_int = {
8531 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8532 			BPF_LD_IMM64(R1, 3),
8533 			BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
8534 			BPF_EXIT_INSN(),
8535 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8536 			BPF_EXIT_INSN(),
8537 		},
8538 		INTERNAL,
8539 		{ },
8540 		{ { 0, 1 } },
8541 	},
8542 	/* BPF_JMP | BPF_JLE | BPF_K */
8543 	{
8544 		"JMP_JLE_K: if (2 <= 3) return 1",
8545 		.u.insns_int = {
8546 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8547 			BPF_LD_IMM64(R1, 2),
8548 			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
8549 			BPF_EXIT_INSN(),
8550 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8551 			BPF_EXIT_INSN(),
8552 		},
8553 		INTERNAL,
8554 		{ },
8555 		{ { 0, 1 } },
8556 	},
8557 	/* BPF_JMP | BPF_JGT | BPF_K jump backwards */
8558 	{
8559 		"JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
8560 		.u.insns_int = {
8561 			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
8562 			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
8563 			BPF_EXIT_INSN(),
8564 			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
8565 			BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
8566 			BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
8567 			BPF_EXIT_INSN(),
8568 		},
8569 		INTERNAL,
8570 		{ },
8571 		{ { 0, 1 } },
8572 	},
8573 	{
8574 		"JMP_JGE_K: if (3 >= 3) return 1",
8575 		.u.insns_int = {
8576 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8577 			BPF_LD_IMM64(R1, 3),
8578 			BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
8579 			BPF_EXIT_INSN(),
8580 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8581 			BPF_EXIT_INSN(),
8582 		},
8583 		INTERNAL,
8584 		{ },
8585 		{ { 0, 1 } },
8586 	},
8587 	/* BPF_JMP | BPF_JLT | BPF_K jump backwards */
8588 	{
8589 		"JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
8590 		.u.insns_int = {
8591 			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
8592 			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
8593 			BPF_EXIT_INSN(),
8594 			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
8595 			BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
8596 			BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
8597 			BPF_EXIT_INSN(),
8598 		},
8599 		INTERNAL,
8600 		{ },
8601 		{ { 0, 1 } },
8602 	},
8603 	{
8604 		"JMP_JLE_K: if (3 <= 3) return 1",
8605 		.u.insns_int = {
8606 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8607 			BPF_LD_IMM64(R1, 3),
8608 			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
8609 			BPF_EXIT_INSN(),
8610 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8611 			BPF_EXIT_INSN(),
8612 		},
8613 		INTERNAL,
8614 		{ },
8615 		{ { 0, 1 } },
8616 	},
8617 	/* BPF_JMP | BPF_JNE | BPF_K */
8618 	{
8619 		"JMP_JNE_K: if (3 != 2) return 1",
8620 		.u.insns_int = {
8621 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8622 			BPF_LD_IMM64(R1, 3),
8623 			BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
8624 			BPF_EXIT_INSN(),
8625 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8626 			BPF_EXIT_INSN(),
8627 		},
8628 		INTERNAL,
8629 		{ },
8630 		{ { 0, 1 } },
8631 	},
8632 	/* BPF_JMP | BPF_JEQ | BPF_K */
8633 	{
8634 		"JMP_JEQ_K: if (3 == 3) return 1",
8635 		.u.insns_int = {
8636 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8637 			BPF_LD_IMM64(R1, 3),
8638 			BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
8639 			BPF_EXIT_INSN(),
8640 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8641 			BPF_EXIT_INSN(),
8642 		},
8643 		INTERNAL,
8644 		{ },
8645 		{ { 0, 1 } },
8646 	},
8647 	/* BPF_JMP | BPF_JSET | BPF_K */
8648 	{
8649 		"JMP_JSET_K: if (0x3 & 0x2) return 1",
8650 		.u.insns_int = {
8651 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8652 			BPF_LD_IMM64(R1, 3),
8653 			BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
8654 			BPF_EXIT_INSN(),
8655 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8656 			BPF_EXIT_INSN(),
8657 		},
8658 		INTERNAL,
8659 		{ },
8660 		{ { 0, 1 } },
8661 	},
8662 	{
8663 		"JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
8664 		.u.insns_int = {
8665 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8666 			BPF_LD_IMM64(R1, 3),
8667 			BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
8668 			BPF_EXIT_INSN(),
8669 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8670 			BPF_EXIT_INSN(),
8671 		},
8672 		INTERNAL,
8673 		{ },
8674 		{ { 0, 1 } },
8675 	},
8676 	/* BPF_JMP | BPF_JSGT | BPF_X */
8677 	{
8678 		"JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
8679 		.u.insns_int = {
8680 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8681 			BPF_LD_IMM64(R1, -1),
8682 			BPF_LD_IMM64(R2, -2),
8683 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
8684 			BPF_EXIT_INSN(),
8685 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8686 			BPF_EXIT_INSN(),
8687 		},
8688 		INTERNAL,
8689 		{ },
8690 		{ { 0, 1 } },
8691 	},
8692 	{
8693 		"JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
8694 		.u.insns_int = {
8695 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8696 			BPF_LD_IMM64(R1, -1),
8697 			BPF_LD_IMM64(R2, -1),
8698 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
8699 			BPF_EXIT_INSN(),
8700 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8701 			BPF_EXIT_INSN(),
8702 		},
8703 		INTERNAL,
8704 		{ },
8705 		{ { 0, 1 } },
8706 	},
8707 	/* BPF_JMP | BPF_JSLT | BPF_X */
8708 	{
8709 		"JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
8710 		.u.insns_int = {
8711 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8712 			BPF_LD_IMM64(R1, -1),
8713 			BPF_LD_IMM64(R2, -2),
8714 			BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
8715 			BPF_EXIT_INSN(),
8716 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8717 			BPF_EXIT_INSN(),
8718 		},
8719 		INTERNAL,
8720 		{ },
8721 		{ { 0, 1 } },
8722 	},
8723 	{
8724 		"JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
8725 		.u.insns_int = {
8726 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8727 			BPF_LD_IMM64(R1, -1),
8728 			BPF_LD_IMM64(R2, -1),
8729 			BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
8730 			BPF_EXIT_INSN(),
8731 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8732 			BPF_EXIT_INSN(),
8733 		},
8734 		INTERNAL,
8735 		{ },
8736 		{ { 0, 1 } },
8737 	},
8738 	/* BPF_JMP | BPF_JSGE | BPF_X */
8739 	{
8740 		"JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
8741 		.u.insns_int = {
8742 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8743 			BPF_LD_IMM64(R1, -1),
8744 			BPF_LD_IMM64(R2, -2),
8745 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
8746 			BPF_EXIT_INSN(),
8747 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8748 			BPF_EXIT_INSN(),
8749 		},
8750 		INTERNAL,
8751 		{ },
8752 		{ { 0, 1 } },
8753 	},
8754 	{
8755 		"JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
8756 		.u.insns_int = {
8757 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8758 			BPF_LD_IMM64(R1, -1),
8759 			BPF_LD_IMM64(R2, -1),
8760 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
8761 			BPF_EXIT_INSN(),
8762 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8763 			BPF_EXIT_INSN(),
8764 		},
8765 		INTERNAL,
8766 		{ },
8767 		{ { 0, 1 } },
8768 	},
8769 	/* BPF_JMP | BPF_JSLE | BPF_X */
8770 	{
8771 		"JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
8772 		.u.insns_int = {
8773 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8774 			BPF_LD_IMM64(R1, -1),
8775 			BPF_LD_IMM64(R2, -2),
8776 			BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
8777 			BPF_EXIT_INSN(),
8778 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8779 			BPF_EXIT_INSN(),
8780 		},
8781 		INTERNAL,
8782 		{ },
8783 		{ { 0, 1 } },
8784 	},
8785 	{
8786 		"JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
8787 		.u.insns_int = {
8788 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8789 			BPF_LD_IMM64(R1, -1),
8790 			BPF_LD_IMM64(R2, -1),
8791 			BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
8792 			BPF_EXIT_INSN(),
8793 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8794 			BPF_EXIT_INSN(),
8795 		},
8796 		INTERNAL,
8797 		{ },
8798 		{ { 0, 1 } },
8799 	},
8800 	/* BPF_JMP | BPF_JGT | BPF_X */
8801 	{
8802 		"JMP_JGT_X: if (3 > 2) return 1",
8803 		.u.insns_int = {
8804 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8805 			BPF_LD_IMM64(R1, 3),
8806 			BPF_LD_IMM64(R2, 2),
8807 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
8808 			BPF_EXIT_INSN(),
8809 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8810 			BPF_EXIT_INSN(),
8811 		},
8812 		INTERNAL,
8813 		{ },
8814 		{ { 0, 1 } },
8815 	},
8816 	{
8817 		"JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
8818 		.u.insns_int = {
8819 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8820 			BPF_LD_IMM64(R1, -1),
8821 			BPF_LD_IMM64(R2, 1),
8822 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
8823 			BPF_EXIT_INSN(),
8824 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8825 			BPF_EXIT_INSN(),
8826 		},
8827 		INTERNAL,
8828 		{ },
8829 		{ { 0, 1 } },
8830 	},
8831 	/* BPF_JMP | BPF_JLT | BPF_X */
8832 	{
8833 		"JMP_JLT_X: if (2 < 3) return 1",
8834 		.u.insns_int = {
8835 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8836 			BPF_LD_IMM64(R1, 3),
8837 			BPF_LD_IMM64(R2, 2),
8838 			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
8839 			BPF_EXIT_INSN(),
8840 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8841 			BPF_EXIT_INSN(),
8842 		},
8843 		INTERNAL,
8844 		{ },
8845 		{ { 0, 1 } },
8846 	},
8847 	{
8848 		"JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
8849 		.u.insns_int = {
8850 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8851 			BPF_LD_IMM64(R1, -1),
8852 			BPF_LD_IMM64(R2, 1),
8853 			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
8854 			BPF_EXIT_INSN(),
8855 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8856 			BPF_EXIT_INSN(),
8857 		},
8858 		INTERNAL,
8859 		{ },
8860 		{ { 0, 1 } },
8861 	},
8862 	/* BPF_JMP | BPF_JGE | BPF_X */
8863 	{
8864 		"JMP_JGE_X: if (3 >= 2) return 1",
8865 		.u.insns_int = {
8866 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8867 			BPF_LD_IMM64(R1, 3),
8868 			BPF_LD_IMM64(R2, 2),
8869 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
8870 			BPF_EXIT_INSN(),
8871 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8872 			BPF_EXIT_INSN(),
8873 		},
8874 		INTERNAL,
8875 		{ },
8876 		{ { 0, 1 } },
8877 	},
8878 	{
8879 		"JMP_JGE_X: if (3 >= 3) return 1",
8880 		.u.insns_int = {
8881 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8882 			BPF_LD_IMM64(R1, 3),
8883 			BPF_LD_IMM64(R2, 3),
8884 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
8885 			BPF_EXIT_INSN(),
8886 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8887 			BPF_EXIT_INSN(),
8888 		},
8889 		INTERNAL,
8890 		{ },
8891 		{ { 0, 1 } },
8892 	},
8893 	/* BPF_JMP | BPF_JLE | BPF_X */
8894 	{
8895 		"JMP_JLE_X: if (2 <= 3) return 1",
8896 		.u.insns_int = {
8897 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8898 			BPF_LD_IMM64(R1, 3),
8899 			BPF_LD_IMM64(R2, 2),
8900 			BPF_JMP_REG(BPF_JLE, R2, R1, 1),
8901 			BPF_EXIT_INSN(),
8902 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8903 			BPF_EXIT_INSN(),
8904 		},
8905 		INTERNAL,
8906 		{ },
8907 		{ { 0, 1 } },
8908 	},
8909 	{
8910 		"JMP_JLE_X: if (3 <= 3) return 1",
8911 		.u.insns_int = {
8912 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8913 			BPF_LD_IMM64(R1, 3),
8914 			BPF_LD_IMM64(R2, 3),
8915 			BPF_JMP_REG(BPF_JLE, R1, R2, 1),
8916 			BPF_EXIT_INSN(),
8917 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8918 			BPF_EXIT_INSN(),
8919 		},
8920 		INTERNAL,
8921 		{ },
8922 		{ { 0, 1 } },
8923 	},
8924 	{
8925 		/* Mainly testing JIT + imm64 here. */
8926 		"JMP_JGE_X: ldimm64 test 1",
8927 		.u.insns_int = {
8928 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8929 			BPF_LD_IMM64(R1, 3),
8930 			BPF_LD_IMM64(R2, 2),
8931 			BPF_JMP_REG(BPF_JGE, R1, R2, 2),
8932 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
8933 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
8934 			BPF_EXIT_INSN(),
8935 		},
8936 		INTERNAL,
8937 		{ },
8938 		{ { 0, 0xeeeeeeeeU } },
8939 	},
8940 	{
8941 		"JMP_JGE_X: ldimm64 test 2",
8942 		.u.insns_int = {
8943 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8944 			BPF_LD_IMM64(R1, 3),
8945 			BPF_LD_IMM64(R2, 2),
8946 			BPF_JMP_REG(BPF_JGE, R1, R2, 0),
8947 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
8948 			BPF_EXIT_INSN(),
8949 		},
8950 		INTERNAL,
8951 		{ },
8952 		{ { 0, 0xffffffffU } },
8953 	},
8954 	{
8955 		"JMP_JGE_X: ldimm64 test 3",
8956 		.u.insns_int = {
8957 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
8958 			BPF_LD_IMM64(R1, 3),
8959 			BPF_LD_IMM64(R2, 2),
8960 			BPF_JMP_REG(BPF_JGE, R1, R2, 4),
8961 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
8962 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
8963 			BPF_EXIT_INSN(),
8964 		},
8965 		INTERNAL,
8966 		{ },
8967 		{ { 0, 1 } },
8968 	},
8969 	{
8970 		"JMP_JLE_X: ldimm64 test 1",
8971 		.u.insns_int = {
8972 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8973 			BPF_LD_IMM64(R1, 3),
8974 			BPF_LD_IMM64(R2, 2),
8975 			BPF_JMP_REG(BPF_JLE, R2, R1, 2),
8976 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
8977 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
8978 			BPF_EXIT_INSN(),
8979 		},
8980 		INTERNAL,
8981 		{ },
8982 		{ { 0, 0xeeeeeeeeU } },
8983 	},
8984 	{
8985 		"JMP_JLE_X: ldimm64 test 2",
8986 		.u.insns_int = {
8987 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
8988 			BPF_LD_IMM64(R1, 3),
8989 			BPF_LD_IMM64(R2, 2),
8990 			BPF_JMP_REG(BPF_JLE, R2, R1, 0),
8991 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
8992 			BPF_EXIT_INSN(),
8993 		},
8994 		INTERNAL,
8995 		{ },
8996 		{ { 0, 0xffffffffU } },
8997 	},
8998 	{
8999 		"JMP_JLE_X: ldimm64 test 3",
9000 		.u.insns_int = {
9001 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
9002 			BPF_LD_IMM64(R1, 3),
9003 			BPF_LD_IMM64(R2, 2),
9004 			BPF_JMP_REG(BPF_JLE, R2, R1, 4),
9005 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9006 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
9007 			BPF_EXIT_INSN(),
9008 		},
9009 		INTERNAL,
9010 		{ },
9011 		{ { 0, 1 } },
9012 	},
9013 	/* BPF_JMP | BPF_JNE | BPF_X */
9014 	{
9015 		"JMP_JNE_X: if (3 != 2) return 1",
9016 		.u.insns_int = {
9017 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
9018 			BPF_LD_IMM64(R1, 3),
9019 			BPF_LD_IMM64(R2, 2),
9020 			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
9021 			BPF_EXIT_INSN(),
9022 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
9023 			BPF_EXIT_INSN(),
9024 		},
9025 		INTERNAL,
9026 		{ },
9027 		{ { 0, 1 } },
9028 	},
9029 	/* BPF_JMP | BPF_JEQ | BPF_X */
9030 	{
9031 		"JMP_JEQ_X: if (3 == 3) return 1",
9032 		.u.insns_int = {
9033 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
9034 			BPF_LD_IMM64(R1, 3),
9035 			BPF_LD_IMM64(R2, 3),
9036 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
9037 			BPF_EXIT_INSN(),
9038 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
9039 			BPF_EXIT_INSN(),
9040 		},
9041 		INTERNAL,
9042 		{ },
9043 		{ { 0, 1 } },
9044 	},
9045 	/* BPF_JMP | BPF_JSET | BPF_X */
9046 	{
9047 		"JMP_JSET_X: if (0x3 & 0x2) return 1",
9048 		.u.insns_int = {
9049 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
9050 			BPF_LD_IMM64(R1, 3),
9051 			BPF_LD_IMM64(R2, 2),
9052 			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
9053 			BPF_EXIT_INSN(),
9054 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
9055 			BPF_EXIT_INSN(),
9056 		},
9057 		INTERNAL,
9058 		{ },
9059 		{ { 0, 1 } },
9060 	},
9061 	{
9062 		"JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
9063 		.u.insns_int = {
9064 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
9065 			BPF_LD_IMM64(R1, 3),
9066 			BPF_LD_IMM64(R2, 0xffffffff),
9067 			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
9068 			BPF_EXIT_INSN(),
9069 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
9070 			BPF_EXIT_INSN(),
9071 		},
9072 		INTERNAL,
9073 		{ },
9074 		{ { 0, 1 } },
9075 	},
9076 	{
9077 		"JMP_JA: Jump, gap, jump, ...",
9078 		{ },
9079 		CLASSIC | FLAG_NO_DATA,
9080 		{ },
9081 		{ { 0, 0xababcbac } },
9082 		.fill_helper = bpf_fill_ja,
9083 	},
9084 	{	/* Mainly checking JIT here. */
9085 		"BPF_MAXINSNS: Maximum possible literals",
9086 		{ },
9087 		CLASSIC | FLAG_NO_DATA,
9088 		{ },
9089 		{ { 0, 0xffffffff } },
9090 		.fill_helper = bpf_fill_maxinsns1,
9091 	},
9092 	{	/* Mainly checking JIT here. */
9093 		"BPF_MAXINSNS: Single literal",
9094 		{ },
9095 		CLASSIC | FLAG_NO_DATA,
9096 		{ },
9097 		{ { 0, 0xfefefefe } },
9098 		.fill_helper = bpf_fill_maxinsns2,
9099 	},
9100 	{	/* Mainly checking JIT here. */
9101 		"BPF_MAXINSNS: Run/add until end",
9102 		{ },
9103 		CLASSIC | FLAG_NO_DATA,
9104 		{ },
9105 		{ { 0, 0x947bf368 } },
9106 		.fill_helper = bpf_fill_maxinsns3,
9107 	},
9108 	{
9109 		"BPF_MAXINSNS: Too many instructions",
9110 		{ },
9111 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
9112 		{ },
9113 		{ },
9114 		.fill_helper = bpf_fill_maxinsns4,
9115 		.expected_errcode = -EINVAL,
9116 	},
9117 	{	/* Mainly checking JIT here. */
9118 		"BPF_MAXINSNS: Very long jump",
9119 		{ },
9120 		CLASSIC | FLAG_NO_DATA,
9121 		{ },
9122 		{ { 0, 0xabababab } },
9123 		.fill_helper = bpf_fill_maxinsns5,
9124 	},
9125 	{	/* Mainly checking JIT here. */
9126 		"BPF_MAXINSNS: Ctx heavy transformations",
9127 		{ },
9128 		CLASSIC,
9129 		{ },
9130 		{
9131 			{  1, SKB_VLAN_PRESENT },
9132 			{ 10, SKB_VLAN_PRESENT }
9133 		},
9134 		.fill_helper = bpf_fill_maxinsns6,
9135 	},
9136 	{	/* Mainly checking JIT here. */
9137 		"BPF_MAXINSNS: Call heavy transformations",
9138 		{ },
9139 		CLASSIC | FLAG_NO_DATA,
9140 		{ },
9141 		{ { 1, 0 }, { 10, 0 } },
9142 		.fill_helper = bpf_fill_maxinsns7,
9143 	},
9144 	{	/* Mainly checking JIT here. */
9145 		"BPF_MAXINSNS: Jump heavy test",
9146 		{ },
9147 		CLASSIC | FLAG_NO_DATA,
9148 		{ },
9149 		{ { 0, 0xffffffff } },
9150 		.fill_helper = bpf_fill_maxinsns8,
9151 	},
9152 	{	/* Mainly checking JIT here. */
9153 		"BPF_MAXINSNS: Very long jump backwards",
9154 		{ },
9155 		INTERNAL | FLAG_NO_DATA,
9156 		{ },
9157 		{ { 0, 0xcbababab } },
9158 		.fill_helper = bpf_fill_maxinsns9,
9159 	},
9160 	{	/* Mainly checking JIT here. */
9161 		"BPF_MAXINSNS: Edge hopping nuthouse",
9162 		{ },
9163 		INTERNAL | FLAG_NO_DATA,
9164 		{ },
9165 		{ { 0, 0xabababac } },
9166 		.fill_helper = bpf_fill_maxinsns10,
9167 	},
9168 	{
9169 		"BPF_MAXINSNS: Jump, gap, jump, ...",
9170 		{ },
9171 		CLASSIC | FLAG_NO_DATA,
9172 		{ },
9173 		{ { 0, 0xababcbac } },
9174 		.fill_helper = bpf_fill_maxinsns11,
9175 	},
9176 	{
9177 		"BPF_MAXINSNS: jump over MSH",
9178 		{ },
9179 		CLASSIC | FLAG_EXPECTED_FAIL,
9180 		{ 0xfa, 0xfb, 0xfc, 0xfd, },
9181 		{ { 4, 0xabababab } },
9182 		.fill_helper = bpf_fill_maxinsns12,
9183 		.expected_errcode = -EINVAL,
9184 	},
9185 	{
9186 		"BPF_MAXINSNS: exec all MSH",
9187 		{ },
9188 		CLASSIC,
9189 		{ 0xfa, 0xfb, 0xfc, 0xfd, },
9190 		{ { 4, 0xababab83 } },
9191 		.fill_helper = bpf_fill_maxinsns13,
9192 	},
9193 	{
9194 		"BPF_MAXINSNS: ld_abs+get_processor_id",
9195 		{ },
9196 		CLASSIC,
9197 		{ },
9198 		{ { 1, 0xbee } },
9199 		.fill_helper = bpf_fill_ld_abs_get_processor_id,
9200 	},
9201 	/*
9202 	 * LD_IND / LD_ABS on fragmented SKBs
9203 	 */
9204 	{
9205 		"LD_IND byte frag",
9206 		.u.insns = {
9207 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
9208 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
9209 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9210 		},
9211 		CLASSIC | FLAG_SKB_FRAG,
9212 		{ },
9213 		{ {0x40, 0x42} },
9214 		.frag_data = {
9215 			0x42, 0x00, 0x00, 0x00,
9216 			0x43, 0x44, 0x00, 0x00,
9217 			0x21, 0x07, 0x19, 0x83,
9218 		},
9219 	},
9220 	{
9221 		"LD_IND halfword frag",
9222 		.u.insns = {
9223 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
9224 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
9225 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9226 		},
9227 		CLASSIC | FLAG_SKB_FRAG,
9228 		{ },
9229 		{ {0x40, 0x4344} },
9230 		.frag_data = {
9231 			0x42, 0x00, 0x00, 0x00,
9232 			0x43, 0x44, 0x00, 0x00,
9233 			0x21, 0x07, 0x19, 0x83,
9234 		},
9235 	},
9236 	{
9237 		"LD_IND word frag",
9238 		.u.insns = {
9239 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
9240 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
9241 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9242 		},
9243 		CLASSIC | FLAG_SKB_FRAG,
9244 		{ },
9245 		{ {0x40, 0x21071983} },
9246 		.frag_data = {
9247 			0x42, 0x00, 0x00, 0x00,
9248 			0x43, 0x44, 0x00, 0x00,
9249 			0x21, 0x07, 0x19, 0x83,
9250 		},
9251 	},
9252 	{
9253 		"LD_IND halfword mixed head/frag",
9254 		.u.insns = {
9255 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
9256 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
9257 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9258 		},
9259 		CLASSIC | FLAG_SKB_FRAG,
9260 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
9261 		{ {0x40, 0x0519} },
9262 		.frag_data = { 0x19, 0x82 },
9263 	},
9264 	{
9265 		"LD_IND word mixed head/frag",
9266 		.u.insns = {
9267 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
9268 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
9269 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9270 		},
9271 		CLASSIC | FLAG_SKB_FRAG,
9272 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
9273 		{ {0x40, 0x25051982} },
9274 		.frag_data = { 0x19, 0x82 },
9275 	},
9276 	{
9277 		"LD_ABS byte frag",
9278 		.u.insns = {
9279 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
9280 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9281 		},
9282 		CLASSIC | FLAG_SKB_FRAG,
9283 		{ },
9284 		{ {0x40, 0x42} },
9285 		.frag_data = {
9286 			0x42, 0x00, 0x00, 0x00,
9287 			0x43, 0x44, 0x00, 0x00,
9288 			0x21, 0x07, 0x19, 0x83,
9289 		},
9290 	},
9291 	{
9292 		"LD_ABS halfword frag",
9293 		.u.insns = {
9294 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
9295 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9296 		},
9297 		CLASSIC | FLAG_SKB_FRAG,
9298 		{ },
9299 		{ {0x40, 0x4344} },
9300 		.frag_data = {
9301 			0x42, 0x00, 0x00, 0x00,
9302 			0x43, 0x44, 0x00, 0x00,
9303 			0x21, 0x07, 0x19, 0x83,
9304 		},
9305 	},
9306 	{
9307 		"LD_ABS word frag",
9308 		.u.insns = {
9309 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
9310 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9311 		},
9312 		CLASSIC | FLAG_SKB_FRAG,
9313 		{ },
9314 		{ {0x40, 0x21071983} },
9315 		.frag_data = {
9316 			0x42, 0x00, 0x00, 0x00,
9317 			0x43, 0x44, 0x00, 0x00,
9318 			0x21, 0x07, 0x19, 0x83,
9319 		},
9320 	},
9321 	{
9322 		"LD_ABS halfword mixed head/frag",
9323 		.u.insns = {
9324 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
9325 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9326 		},
9327 		CLASSIC | FLAG_SKB_FRAG,
9328 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
9329 		{ {0x40, 0x0519} },
9330 		.frag_data = { 0x19, 0x82 },
9331 	},
9332 	{
9333 		"LD_ABS word mixed head/frag",
9334 		.u.insns = {
9335 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
9336 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9337 		},
9338 		CLASSIC | FLAG_SKB_FRAG,
9339 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
9340 		{ {0x40, 0x25051982} },
9341 		.frag_data = { 0x19, 0x82 },
9342 	},
9343 	/*
9344 	 * LD_IND / LD_ABS on non fragmented SKBs
9345 	 */
9346 	{
9347 		/*
9348 		 * this tests that the JIT/interpreter correctly resets X
9349 		 * before using it in an LD_IND instruction.
9350 		 */
9351 		"LD_IND byte default X",
9352 		.u.insns = {
9353 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
9354 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9355 		},
9356 		CLASSIC,
9357 		{ [0x1] = 0x42 },
9358 		{ {0x40, 0x42 } },
9359 	},
9360 	{
9361 		"LD_IND byte positive offset",
9362 		.u.insns = {
9363 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9364 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
9365 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9366 		},
9367 		CLASSIC,
9368 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9369 		{ {0x40, 0x82 } },
9370 	},
9371 	{
9372 		"LD_IND byte negative offset",
9373 		.u.insns = {
9374 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9375 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
9376 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9377 		},
9378 		CLASSIC,
9379 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9380 		{ {0x40, 0x05 } },
9381 	},
9382 	{
9383 		"LD_IND byte positive offset, all ff",
9384 		.u.insns = {
9385 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9386 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
9387 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9388 		},
9389 		CLASSIC,
9390 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
9391 		{ {0x40, 0xff } },
9392 	},
9393 	{
9394 		"LD_IND byte positive offset, out of bounds",
9395 		.u.insns = {
9396 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9397 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
9398 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9399 		},
9400 		CLASSIC,
9401 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9402 		{ {0x3f, 0 }, },
9403 	},
9404 	{
9405 		"LD_IND byte negative offset, out of bounds",
9406 		.u.insns = {
9407 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9408 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
9409 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9410 		},
9411 		CLASSIC,
9412 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9413 		{ {0x3f, 0 } },
9414 	},
9415 	{
9416 		"LD_IND byte negative offset, multiple calls",
9417 		.u.insns = {
9418 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
9419 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
9420 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
9421 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
9422 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
9423 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9424 		},
9425 		CLASSIC,
9426 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9427 		{ {0x40, 0x82 }, },
9428 	},
9429 	{
9430 		"LD_IND halfword positive offset",
9431 		.u.insns = {
9432 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9433 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
9434 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9435 		},
9436 		CLASSIC,
9437 		{
9438 			[0x1c] = 0xaa, [0x1d] = 0x55,
9439 			[0x1e] = 0xbb, [0x1f] = 0x66,
9440 			[0x20] = 0xcc, [0x21] = 0x77,
9441 			[0x22] = 0xdd, [0x23] = 0x88,
9442 		},
9443 		{ {0x40, 0xdd88 } },
9444 	},
9445 	{
9446 		"LD_IND halfword negative offset",
9447 		.u.insns = {
9448 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9449 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
9450 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9451 		},
9452 		CLASSIC,
9453 		{
9454 			[0x1c] = 0xaa, [0x1d] = 0x55,
9455 			[0x1e] = 0xbb, [0x1f] = 0x66,
9456 			[0x20] = 0xcc, [0x21] = 0x77,
9457 			[0x22] = 0xdd, [0x23] = 0x88,
9458 		},
9459 		{ {0x40, 0xbb66 } },
9460 	},
9461 	{
9462 		"LD_IND halfword unaligned",
9463 		.u.insns = {
9464 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9465 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
9466 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9467 		},
9468 		CLASSIC,
9469 		{
9470 			[0x1c] = 0xaa, [0x1d] = 0x55,
9471 			[0x1e] = 0xbb, [0x1f] = 0x66,
9472 			[0x20] = 0xcc, [0x21] = 0x77,
9473 			[0x22] = 0xdd, [0x23] = 0x88,
9474 		},
9475 		{ {0x40, 0x66cc } },
9476 	},
9477 	{
9478 		"LD_IND halfword positive offset, all ff",
9479 		.u.insns = {
9480 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
9481 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
9482 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9483 		},
9484 		CLASSIC,
9485 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
9486 		{ {0x40, 0xffff } },
9487 	},
9488 	{
9489 		"LD_IND halfword positive offset, out of bounds",
9490 		.u.insns = {
9491 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9492 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
9493 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9494 		},
9495 		CLASSIC,
9496 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9497 		{ {0x3f, 0 }, },
9498 	},
9499 	{
9500 		"LD_IND halfword negative offset, out of bounds",
9501 		.u.insns = {
9502 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9503 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
9504 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9505 		},
9506 		CLASSIC,
9507 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9508 		{ {0x3f, 0 } },
9509 	},
9510 	{
9511 		"LD_IND word positive offset",
9512 		.u.insns = {
9513 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9514 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
9515 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9516 		},
9517 		CLASSIC,
9518 		{
9519 			[0x1c] = 0xaa, [0x1d] = 0x55,
9520 			[0x1e] = 0xbb, [0x1f] = 0x66,
9521 			[0x20] = 0xcc, [0x21] = 0x77,
9522 			[0x22] = 0xdd, [0x23] = 0x88,
9523 			[0x24] = 0xee, [0x25] = 0x99,
9524 			[0x26] = 0xff, [0x27] = 0xaa,
9525 		},
9526 		{ {0x40, 0xee99ffaa } },
9527 	},
9528 	{
9529 		"LD_IND word negative offset",
9530 		.u.insns = {
9531 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9532 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
9533 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9534 		},
9535 		CLASSIC,
9536 		{
9537 			[0x1c] = 0xaa, [0x1d] = 0x55,
9538 			[0x1e] = 0xbb, [0x1f] = 0x66,
9539 			[0x20] = 0xcc, [0x21] = 0x77,
9540 			[0x22] = 0xdd, [0x23] = 0x88,
9541 			[0x24] = 0xee, [0x25] = 0x99,
9542 			[0x26] = 0xff, [0x27] = 0xaa,
9543 		},
9544 		{ {0x40, 0xaa55bb66 } },
9545 	},
9546 	{
9547 		"LD_IND word unaligned (addr & 3 == 2)",
9548 		.u.insns = {
9549 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9550 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
9551 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9552 		},
9553 		CLASSIC,
9554 		{
9555 			[0x1c] = 0xaa, [0x1d] = 0x55,
9556 			[0x1e] = 0xbb, [0x1f] = 0x66,
9557 			[0x20] = 0xcc, [0x21] = 0x77,
9558 			[0x22] = 0xdd, [0x23] = 0x88,
9559 			[0x24] = 0xee, [0x25] = 0x99,
9560 			[0x26] = 0xff, [0x27] = 0xaa,
9561 		},
9562 		{ {0x40, 0xbb66cc77 } },
9563 	},
9564 	{
9565 		"LD_IND word unaligned (addr & 3 == 1)",
9566 		.u.insns = {
9567 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9568 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
9569 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9570 		},
9571 		CLASSIC,
9572 		{
9573 			[0x1c] = 0xaa, [0x1d] = 0x55,
9574 			[0x1e] = 0xbb, [0x1f] = 0x66,
9575 			[0x20] = 0xcc, [0x21] = 0x77,
9576 			[0x22] = 0xdd, [0x23] = 0x88,
9577 			[0x24] = 0xee, [0x25] = 0x99,
9578 			[0x26] = 0xff, [0x27] = 0xaa,
9579 		},
9580 		{ {0x40, 0x55bb66cc } },
9581 	},
9582 	{
9583 		"LD_IND word unaligned (addr & 3 == 3)",
9584 		.u.insns = {
9585 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
9586 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
9587 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9588 		},
9589 		CLASSIC,
9590 		{
9591 			[0x1c] = 0xaa, [0x1d] = 0x55,
9592 			[0x1e] = 0xbb, [0x1f] = 0x66,
9593 			[0x20] = 0xcc, [0x21] = 0x77,
9594 			[0x22] = 0xdd, [0x23] = 0x88,
9595 			[0x24] = 0xee, [0x25] = 0x99,
9596 			[0x26] = 0xff, [0x27] = 0xaa,
9597 		},
9598 		{ {0x40, 0x66cc77dd } },
9599 	},
9600 	{
9601 		"LD_IND word positive offset, all ff",
9602 		.u.insns = {
9603 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
9604 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
9605 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9606 		},
9607 		CLASSIC,
9608 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
9609 		{ {0x40, 0xffffffff } },
9610 	},
9611 	{
9612 		"LD_IND word positive offset, out of bounds",
9613 		.u.insns = {
9614 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9615 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
9616 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9617 		},
9618 		CLASSIC,
9619 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9620 		{ {0x3f, 0 }, },
9621 	},
9622 	{
9623 		"LD_IND word negative offset, out of bounds",
9624 		.u.insns = {
9625 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
9626 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
9627 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9628 		},
9629 		CLASSIC,
9630 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9631 		{ {0x3f, 0 } },
9632 	},
9633 	{
9634 		"LD_ABS byte",
9635 		.u.insns = {
9636 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
9637 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9638 		},
9639 		CLASSIC,
9640 		{
9641 			[0x1c] = 0xaa, [0x1d] = 0x55,
9642 			[0x1e] = 0xbb, [0x1f] = 0x66,
9643 			[0x20] = 0xcc, [0x21] = 0x77,
9644 			[0x22] = 0xdd, [0x23] = 0x88,
9645 			[0x24] = 0xee, [0x25] = 0x99,
9646 			[0x26] = 0xff, [0x27] = 0xaa,
9647 		},
9648 		{ {0x40, 0xcc } },
9649 	},
9650 	{
9651 		"LD_ABS byte positive offset, all ff",
9652 		.u.insns = {
9653 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
9654 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9655 		},
9656 		CLASSIC,
9657 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
9658 		{ {0x40, 0xff } },
9659 	},
9660 	{
9661 		"LD_ABS byte positive offset, out of bounds",
9662 		.u.insns = {
9663 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
9664 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9665 		},
9666 		CLASSIC,
9667 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9668 		{ {0x3f, 0 }, },
9669 	},
9670 	{
9671 		"LD_ABS byte negative offset, out of bounds load",
9672 		.u.insns = {
9673 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
9674 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9675 		},
9676 		CLASSIC | FLAG_EXPECTED_FAIL,
9677 		.expected_errcode = -EINVAL,
9678 	},
9679 	{
9680 		"LD_ABS byte negative offset, in bounds",
9681 		.u.insns = {
9682 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
9683 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9684 		},
9685 		CLASSIC,
9686 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9687 		{ {0x40, 0x82 }, },
9688 	},
9689 	{
9690 		"LD_ABS byte negative offset, out of bounds",
9691 		.u.insns = {
9692 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
9693 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9694 		},
9695 		CLASSIC,
9696 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9697 		{ {0x3f, 0 }, },
9698 	},
9699 	{
9700 		"LD_ABS byte negative offset, multiple calls",
9701 		.u.insns = {
9702 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
9703 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
9704 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
9705 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
9706 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9707 		},
9708 		CLASSIC,
9709 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9710 		{ {0x40, 0x82 }, },
9711 	},
9712 	{
9713 		"LD_ABS halfword",
9714 		.u.insns = {
9715 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
9716 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9717 		},
9718 		CLASSIC,
9719 		{
9720 			[0x1c] = 0xaa, [0x1d] = 0x55,
9721 			[0x1e] = 0xbb, [0x1f] = 0x66,
9722 			[0x20] = 0xcc, [0x21] = 0x77,
9723 			[0x22] = 0xdd, [0x23] = 0x88,
9724 			[0x24] = 0xee, [0x25] = 0x99,
9725 			[0x26] = 0xff, [0x27] = 0xaa,
9726 		},
9727 		{ {0x40, 0xdd88 } },
9728 	},
9729 	{
9730 		"LD_ABS halfword unaligned",
9731 		.u.insns = {
9732 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
9733 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9734 		},
9735 		CLASSIC,
9736 		{
9737 			[0x1c] = 0xaa, [0x1d] = 0x55,
9738 			[0x1e] = 0xbb, [0x1f] = 0x66,
9739 			[0x20] = 0xcc, [0x21] = 0x77,
9740 			[0x22] = 0xdd, [0x23] = 0x88,
9741 			[0x24] = 0xee, [0x25] = 0x99,
9742 			[0x26] = 0xff, [0x27] = 0xaa,
9743 		},
9744 		{ {0x40, 0x99ff } },
9745 	},
9746 	{
9747 		"LD_ABS halfword positive offset, all ff",
9748 		.u.insns = {
9749 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
9750 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9751 		},
9752 		CLASSIC,
9753 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
9754 		{ {0x40, 0xffff } },
9755 	},
9756 	{
9757 		"LD_ABS halfword positive offset, out of bounds",
9758 		.u.insns = {
9759 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
9760 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9761 		},
9762 		CLASSIC,
9763 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9764 		{ {0x3f, 0 }, },
9765 	},
9766 	{
9767 		"LD_ABS halfword negative offset, out of bounds load",
9768 		.u.insns = {
9769 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
9770 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9771 		},
9772 		CLASSIC | FLAG_EXPECTED_FAIL,
9773 		.expected_errcode = -EINVAL,
9774 	},
9775 	{
9776 		"LD_ABS halfword negative offset, in bounds",
9777 		.u.insns = {
9778 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
9779 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9780 		},
9781 		CLASSIC,
9782 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9783 		{ {0x40, 0x1982 }, },
9784 	},
9785 	{
9786 		"LD_ABS halfword negative offset, out of bounds",
9787 		.u.insns = {
9788 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
9789 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9790 		},
9791 		CLASSIC,
9792 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9793 		{ {0x3f, 0 }, },
9794 	},
9795 	{
9796 		"LD_ABS word",
9797 		.u.insns = {
9798 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
9799 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9800 		},
9801 		CLASSIC,
9802 		{
9803 			[0x1c] = 0xaa, [0x1d] = 0x55,
9804 			[0x1e] = 0xbb, [0x1f] = 0x66,
9805 			[0x20] = 0xcc, [0x21] = 0x77,
9806 			[0x22] = 0xdd, [0x23] = 0x88,
9807 			[0x24] = 0xee, [0x25] = 0x99,
9808 			[0x26] = 0xff, [0x27] = 0xaa,
9809 		},
9810 		{ {0x40, 0xaa55bb66 } },
9811 	},
9812 	{
9813 		"LD_ABS word unaligned (addr & 3 == 2)",
9814 		.u.insns = {
9815 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
9816 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9817 		},
9818 		CLASSIC,
9819 		{
9820 			[0x1c] = 0xaa, [0x1d] = 0x55,
9821 			[0x1e] = 0xbb, [0x1f] = 0x66,
9822 			[0x20] = 0xcc, [0x21] = 0x77,
9823 			[0x22] = 0xdd, [0x23] = 0x88,
9824 			[0x24] = 0xee, [0x25] = 0x99,
9825 			[0x26] = 0xff, [0x27] = 0xaa,
9826 		},
9827 		{ {0x40, 0xdd88ee99 } },
9828 	},
9829 	{
9830 		"LD_ABS word unaligned (addr & 3 == 1)",
9831 		.u.insns = {
9832 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
9833 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9834 		},
9835 		CLASSIC,
9836 		{
9837 			[0x1c] = 0xaa, [0x1d] = 0x55,
9838 			[0x1e] = 0xbb, [0x1f] = 0x66,
9839 			[0x20] = 0xcc, [0x21] = 0x77,
9840 			[0x22] = 0xdd, [0x23] = 0x88,
9841 			[0x24] = 0xee, [0x25] = 0x99,
9842 			[0x26] = 0xff, [0x27] = 0xaa,
9843 		},
9844 		{ {0x40, 0x77dd88ee } },
9845 	},
9846 	{
9847 		"LD_ABS word unaligned (addr & 3 == 3)",
9848 		.u.insns = {
9849 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
9850 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9851 		},
9852 		CLASSIC,
9853 		{
9854 			[0x1c] = 0xaa, [0x1d] = 0x55,
9855 			[0x1e] = 0xbb, [0x1f] = 0x66,
9856 			[0x20] = 0xcc, [0x21] = 0x77,
9857 			[0x22] = 0xdd, [0x23] = 0x88,
9858 			[0x24] = 0xee, [0x25] = 0x99,
9859 			[0x26] = 0xff, [0x27] = 0xaa,
9860 		},
9861 		{ {0x40, 0x88ee99ff } },
9862 	},
9863 	{
9864 		"LD_ABS word positive offset, all ff",
9865 		.u.insns = {
9866 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
9867 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9868 		},
9869 		CLASSIC,
9870 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
9871 		{ {0x40, 0xffffffff } },
9872 	},
9873 	{
9874 		"LD_ABS word positive offset, out of bounds",
9875 		.u.insns = {
9876 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
9877 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9878 		},
9879 		CLASSIC,
9880 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9881 		{ {0x3f, 0 }, },
9882 	},
9883 	{
9884 		"LD_ABS word negative offset, out of bounds load",
9885 		.u.insns = {
9886 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
9887 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9888 		},
9889 		CLASSIC | FLAG_EXPECTED_FAIL,
9890 		.expected_errcode = -EINVAL,
9891 	},
9892 	{
9893 		"LD_ABS word negative offset, in bounds",
9894 		.u.insns = {
9895 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
9896 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9897 		},
9898 		CLASSIC,
9899 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9900 		{ {0x40, 0x25051982 }, },
9901 	},
9902 	{
9903 		"LD_ABS word negative offset, out of bounds",
9904 		.u.insns = {
9905 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
9906 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9907 		},
9908 		CLASSIC,
9909 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9910 		{ {0x3f, 0 }, },
9911 	},
9912 	{
9913 		"LDX_MSH standalone, preserved A",
9914 		.u.insns = {
9915 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
9916 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
9917 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9918 		},
9919 		CLASSIC,
9920 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9921 		{ {0x40, 0xffeebbaa }, },
9922 	},
9923 	{
9924 		"LDX_MSH standalone, preserved A 2",
9925 		.u.insns = {
9926 			BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
9927 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
9928 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
9929 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
9930 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
9931 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9932 		},
9933 		CLASSIC,
9934 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9935 		{ {0x40, 0x175e9d63 }, },
9936 	},
9937 	{
9938 		"LDX_MSH standalone, test result 1",
9939 		.u.insns = {
9940 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
9941 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
9942 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
9943 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9944 		},
9945 		CLASSIC,
9946 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9947 		{ {0x40, 0x14 }, },
9948 	},
9949 	{
9950 		"LDX_MSH standalone, test result 2",
9951 		.u.insns = {
9952 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
9953 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
9954 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
9955 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9956 		},
9957 		CLASSIC,
9958 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9959 		{ {0x40, 0x24 }, },
9960 	},
9961 	{
9962 		"LDX_MSH standalone, negative offset",
9963 		.u.insns = {
9964 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
9965 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
9966 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
9967 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9968 		},
9969 		CLASSIC,
9970 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9971 		{ {0x40, 0 }, },
9972 	},
9973 	{
9974 		"LDX_MSH standalone, negative offset 2",
9975 		.u.insns = {
9976 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
9977 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
9978 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
9979 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9980 		},
9981 		CLASSIC,
9982 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9983 		{ {0x40, 0x24 }, },
9984 	},
9985 	{
9986 		"LDX_MSH standalone, out of bounds",
9987 		.u.insns = {
9988 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
9989 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
9990 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
9991 			BPF_STMT(BPF_RET | BPF_A, 0x0),
9992 		},
9993 		CLASSIC,
9994 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
9995 		{ {0x40, 0 }, },
9996 	},
9997 	/*
9998 	 * verify that the interpreter or JIT correctly sets A and X
9999 	 * to 0.
10000 	 */
10001 	{
10002 		"ADD default X",
10003 		.u.insns = {
10004 			/*
10005 			 * A = 0x42
10006 			 * A = A + X
10007 			 * ret A
10008 			 */
10009 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
10010 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
10011 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10012 		},
10013 		CLASSIC | FLAG_NO_DATA,
10014 		{},
10015 		{ {0x1, 0x42 } },
10016 	},
10017 	{
10018 		"ADD default A",
10019 		.u.insns = {
10020 			/*
10021 			 * A = A + 0x42
10022 			 * ret A
10023 			 */
10024 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
10025 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10026 		},
10027 		CLASSIC | FLAG_NO_DATA,
10028 		{},
10029 		{ {0x1, 0x42 } },
10030 	},
10031 	{
10032 		"SUB default X",
10033 		.u.insns = {
10034 			/*
10035 			 * A = 0x66
10036 			 * A = A - X
10037 			 * ret A
10038 			 */
10039 			BPF_STMT(BPF_LD | BPF_IMM, 0x66),
10040 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
10041 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10042 		},
10043 		CLASSIC | FLAG_NO_DATA,
10044 		{},
10045 		{ {0x1, 0x66 } },
10046 	},
10047 	{
10048 		"SUB default A",
10049 		.u.insns = {
10050 			/*
10051 			 * A = A - -0x66
10052 			 * ret A
10053 			 */
10054 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
10055 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10056 		},
10057 		CLASSIC | FLAG_NO_DATA,
10058 		{},
10059 		{ {0x1, 0x66 } },
10060 	},
10061 	{
10062 		"MUL default X",
10063 		.u.insns = {
10064 			/*
10065 			 * A = 0x42
10066 			 * A = A * X
10067 			 * ret A
10068 			 */
10069 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
10070 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
10071 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10072 		},
10073 		CLASSIC | FLAG_NO_DATA,
10074 		{},
10075 		{ {0x1, 0x0 } },
10076 	},
10077 	{
10078 		"MUL default A",
10079 		.u.insns = {
10080 			/*
10081 			 * A = A * 0x66
10082 			 * ret A
10083 			 */
10084 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
10085 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10086 		},
10087 		CLASSIC | FLAG_NO_DATA,
10088 		{},
10089 		{ {0x1, 0x0 } },
10090 	},
10091 	{
10092 		"DIV default X",
10093 		.u.insns = {
10094 			/*
10095 			 * A = 0x42
10096 			 * A = A / X ; this halt the filter execution if X is 0
10097 			 * ret 0x42
10098 			 */
10099 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
10100 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
10101 			BPF_STMT(BPF_RET | BPF_K, 0x42),
10102 		},
10103 		CLASSIC | FLAG_NO_DATA,
10104 		{},
10105 		{ {0x1, 0x0 } },
10106 	},
10107 	{
10108 		"DIV default A",
10109 		.u.insns = {
10110 			/*
10111 			 * A = A / 1
10112 			 * ret A
10113 			 */
10114 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
10115 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10116 		},
10117 		CLASSIC | FLAG_NO_DATA,
10118 		{},
10119 		{ {0x1, 0x0 } },
10120 	},
10121 	{
10122 		"MOD default X",
10123 		.u.insns = {
10124 			/*
10125 			 * A = 0x42
10126 			 * A = A mod X ; this halt the filter execution if X is 0
10127 			 * ret 0x42
10128 			 */
10129 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
10130 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
10131 			BPF_STMT(BPF_RET | BPF_K, 0x42),
10132 		},
10133 		CLASSIC | FLAG_NO_DATA,
10134 		{},
10135 		{ {0x1, 0x0 } },
10136 	},
10137 	{
10138 		"MOD default A",
10139 		.u.insns = {
10140 			/*
10141 			 * A = A mod 1
10142 			 * ret A
10143 			 */
10144 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
10145 			BPF_STMT(BPF_RET | BPF_A, 0x0),
10146 		},
10147 		CLASSIC | FLAG_NO_DATA,
10148 		{},
10149 		{ {0x1, 0x0 } },
10150 	},
10151 	{
10152 		"JMP EQ default A",
10153 		.u.insns = {
10154 			/*
10155 			 * cmp A, 0x0, 0, 1
10156 			 * ret 0x42
10157 			 * ret 0x66
10158 			 */
10159 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
10160 			BPF_STMT(BPF_RET | BPF_K, 0x42),
10161 			BPF_STMT(BPF_RET | BPF_K, 0x66),
10162 		},
10163 		CLASSIC | FLAG_NO_DATA,
10164 		{},
10165 		{ {0x1, 0x42 } },
10166 	},
10167 	{
10168 		"JMP EQ default X",
10169 		.u.insns = {
10170 			/*
10171 			 * A = 0x0
10172 			 * cmp A, X, 0, 1
10173 			 * ret 0x42
10174 			 * ret 0x66
10175 			 */
10176 			BPF_STMT(BPF_LD | BPF_IMM, 0x0),
10177 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
10178 			BPF_STMT(BPF_RET | BPF_K, 0x42),
10179 			BPF_STMT(BPF_RET | BPF_K, 0x66),
10180 		},
10181 		CLASSIC | FLAG_NO_DATA,
10182 		{},
10183 		{ {0x1, 0x42 } },
10184 	},
10185 	/* Checking interpreter vs JIT wrt signed extended imms. */
10186 	{
10187 		"JNE signed compare, test 1",
10188 		.u.insns_int = {
10189 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
10190 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
10191 			BPF_MOV64_REG(R2, R1),
10192 			BPF_ALU64_REG(BPF_AND, R2, R3),
10193 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
10194 			BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
10195 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
10196 			BPF_EXIT_INSN(),
10197 		},
10198 		INTERNAL,
10199 		{ },
10200 		{ { 0, 1 } },
10201 	},
10202 	{
10203 		"JNE signed compare, test 2",
10204 		.u.insns_int = {
10205 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
10206 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
10207 			BPF_MOV64_REG(R2, R1),
10208 			BPF_ALU64_REG(BPF_AND, R2, R3),
10209 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
10210 			BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
10211 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
10212 			BPF_EXIT_INSN(),
10213 		},
10214 		INTERNAL,
10215 		{ },
10216 		{ { 0, 1 } },
10217 	},
10218 	{
10219 		"JNE signed compare, test 3",
10220 		.u.insns_int = {
10221 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
10222 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
10223 			BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
10224 			BPF_MOV64_REG(R2, R1),
10225 			BPF_ALU64_REG(BPF_AND, R2, R3),
10226 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
10227 			BPF_JMP_REG(BPF_JNE, R2, R4, 1),
10228 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
10229 			BPF_EXIT_INSN(),
10230 		},
10231 		INTERNAL,
10232 		{ },
10233 		{ { 0, 2 } },
10234 	},
10235 	{
10236 		"JNE signed compare, test 4",
10237 		.u.insns_int = {
10238 			BPF_LD_IMM64(R1, -17104896),
10239 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
10240 			BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
10241 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
10242 			BPF_EXIT_INSN(),
10243 		},
10244 		INTERNAL,
10245 		{ },
10246 		{ { 0, 2 } },
10247 	},
10248 	{
10249 		"JNE signed compare, test 5",
10250 		.u.insns_int = {
10251 			BPF_LD_IMM64(R1, 0xfefb0000),
10252 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
10253 			BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
10254 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
10255 			BPF_EXIT_INSN(),
10256 		},
10257 		INTERNAL,
10258 		{ },
10259 		{ { 0, 1 } },
10260 	},
10261 	{
10262 		"JNE signed compare, test 6",
10263 		.u.insns_int = {
10264 			BPF_LD_IMM64(R1, 0x7efb0000),
10265 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
10266 			BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
10267 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
10268 			BPF_EXIT_INSN(),
10269 		},
10270 		INTERNAL,
10271 		{ },
10272 		{ { 0, 2 } },
10273 	},
10274 	{
10275 		"JNE signed compare, test 7",
10276 		.u.insns = {
10277 			BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
10278 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
10279 			BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
10280 			BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
10281 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
10282 			BPF_STMT(BPF_RET | BPF_K, 1),
10283 			BPF_STMT(BPF_RET | BPF_K, 2),
10284 		},
10285 		CLASSIC | FLAG_NO_DATA,
10286 		{},
10287 		{ { 0, 2 } },
10288 	},
10289 	/* Exhaustive test of ALU64 shift operations */
10290 	{
10291 		"ALU64_LSH_K: all shift values",
10292 		{ },
10293 		INTERNAL | FLAG_NO_DATA,
10294 		{ },
10295 		{ { 0, 1 } },
10296 		.fill_helper = bpf_fill_alu_lsh_imm,
10297 	},
10298 	{
10299 		"ALU64_RSH_K: all shift values",
10300 		{ },
10301 		INTERNAL | FLAG_NO_DATA,
10302 		{ },
10303 		{ { 0, 1 } },
10304 		.fill_helper = bpf_fill_alu_rsh_imm,
10305 	},
10306 	{
10307 		"ALU64_ARSH_K: all shift values",
10308 		{ },
10309 		INTERNAL | FLAG_NO_DATA,
10310 		{ },
10311 		{ { 0, 1 } },
10312 		.fill_helper = bpf_fill_alu_arsh_imm,
10313 	},
10314 	{
10315 		"ALU64_LSH_X: all shift values",
10316 		{ },
10317 		INTERNAL | FLAG_NO_DATA,
10318 		{ },
10319 		{ { 0, 1 } },
10320 		.fill_helper = bpf_fill_alu_lsh_reg,
10321 	},
10322 	{
10323 		"ALU64_RSH_X: all shift values",
10324 		{ },
10325 		INTERNAL | FLAG_NO_DATA,
10326 		{ },
10327 		{ { 0, 1 } },
10328 		.fill_helper = bpf_fill_alu_rsh_reg,
10329 	},
10330 	{
10331 		"ALU64_ARSH_X: all shift values",
10332 		{ },
10333 		INTERNAL | FLAG_NO_DATA,
10334 		{ },
10335 		{ { 0, 1 } },
10336 		.fill_helper = bpf_fill_alu_arsh_reg,
10337 	},
10338 	/* Exhaustive test of ALU32 shift operations */
10339 	{
10340 		"ALU32_LSH_K: all shift values",
10341 		{ },
10342 		INTERNAL | FLAG_NO_DATA,
10343 		{ },
10344 		{ { 0, 1 } },
10345 		.fill_helper = bpf_fill_alu32_lsh_imm,
10346 	},
10347 	{
10348 		"ALU32_RSH_K: all shift values",
10349 		{ },
10350 		INTERNAL | FLAG_NO_DATA,
10351 		{ },
10352 		{ { 0, 1 } },
10353 		.fill_helper = bpf_fill_alu32_rsh_imm,
10354 	},
10355 	{
10356 		"ALU32_ARSH_K: all shift values",
10357 		{ },
10358 		INTERNAL | FLAG_NO_DATA,
10359 		{ },
10360 		{ { 0, 1 } },
10361 		.fill_helper = bpf_fill_alu32_arsh_imm,
10362 	},
10363 	{
10364 		"ALU32_LSH_X: all shift values",
10365 		{ },
10366 		INTERNAL | FLAG_NO_DATA,
10367 		{ },
10368 		{ { 0, 1 } },
10369 		.fill_helper = bpf_fill_alu32_lsh_reg,
10370 	},
10371 	{
10372 		"ALU32_RSH_X: all shift values",
10373 		{ },
10374 		INTERNAL | FLAG_NO_DATA,
10375 		{ },
10376 		{ { 0, 1 } },
10377 		.fill_helper = bpf_fill_alu32_rsh_reg,
10378 	},
10379 	{
10380 		"ALU32_ARSH_X: all shift values",
10381 		{ },
10382 		INTERNAL | FLAG_NO_DATA,
10383 		{ },
10384 		{ { 0, 1 } },
10385 		.fill_helper = bpf_fill_alu32_arsh_reg,
10386 	},
10387 	/* ALU64 immediate magnitudes */
10388 	{
10389 		"ALU64_MOV_K: all immediate value magnitudes",
10390 		{ },
10391 		INTERNAL | FLAG_NO_DATA,
10392 		{ },
10393 		{ { 0, 1 } },
10394 		.fill_helper = bpf_fill_alu64_mov_imm,
10395 		.nr_testruns = NR_PATTERN_RUNS,
10396 	},
10397 	{
10398 		"ALU64_AND_K: all immediate value magnitudes",
10399 		{ },
10400 		INTERNAL | FLAG_NO_DATA,
10401 		{ },
10402 		{ { 0, 1 } },
10403 		.fill_helper = bpf_fill_alu64_and_imm,
10404 		.nr_testruns = NR_PATTERN_RUNS,
10405 	},
10406 	{
10407 		"ALU64_OR_K: all immediate value magnitudes",
10408 		{ },
10409 		INTERNAL | FLAG_NO_DATA,
10410 		{ },
10411 		{ { 0, 1 } },
10412 		.fill_helper = bpf_fill_alu64_or_imm,
10413 		.nr_testruns = NR_PATTERN_RUNS,
10414 	},
10415 	{
10416 		"ALU64_XOR_K: all immediate value magnitudes",
10417 		{ },
10418 		INTERNAL | FLAG_NO_DATA,
10419 		{ },
10420 		{ { 0, 1 } },
10421 		.fill_helper = bpf_fill_alu64_xor_imm,
10422 		.nr_testruns = NR_PATTERN_RUNS,
10423 	},
10424 	{
10425 		"ALU64_ADD_K: all immediate value magnitudes",
10426 		{ },
10427 		INTERNAL | FLAG_NO_DATA,
10428 		{ },
10429 		{ { 0, 1 } },
10430 		.fill_helper = bpf_fill_alu64_add_imm,
10431 		.nr_testruns = NR_PATTERN_RUNS,
10432 	},
10433 	{
10434 		"ALU64_SUB_K: all immediate value magnitudes",
10435 		{ },
10436 		INTERNAL | FLAG_NO_DATA,
10437 		{ },
10438 		{ { 0, 1 } },
10439 		.fill_helper = bpf_fill_alu64_sub_imm,
10440 		.nr_testruns = NR_PATTERN_RUNS,
10441 	},
10442 	{
10443 		"ALU64_MUL_K: all immediate value magnitudes",
10444 		{ },
10445 		INTERNAL | FLAG_NO_DATA,
10446 		{ },
10447 		{ { 0, 1 } },
10448 		.fill_helper = bpf_fill_alu64_mul_imm,
10449 		.nr_testruns = NR_PATTERN_RUNS,
10450 	},
10451 	{
10452 		"ALU64_DIV_K: all immediate value magnitudes",
10453 		{ },
10454 		INTERNAL | FLAG_NO_DATA,
10455 		{ },
10456 		{ { 0, 1 } },
10457 		.fill_helper = bpf_fill_alu64_div_imm,
10458 		.nr_testruns = NR_PATTERN_RUNS,
10459 	},
10460 	{
10461 		"ALU64_MOD_K: all immediate value magnitudes",
10462 		{ },
10463 		INTERNAL | FLAG_NO_DATA,
10464 		{ },
10465 		{ { 0, 1 } },
10466 		.fill_helper = bpf_fill_alu64_mod_imm,
10467 		.nr_testruns = NR_PATTERN_RUNS,
10468 	},
10469 	/* ALU32 immediate magnitudes */
10470 	{
10471 		"ALU32_MOV_K: all immediate value magnitudes",
10472 		{ },
10473 		INTERNAL | FLAG_NO_DATA,
10474 		{ },
10475 		{ { 0, 1 } },
10476 		.fill_helper = bpf_fill_alu32_mov_imm,
10477 		.nr_testruns = NR_PATTERN_RUNS,
10478 	},
10479 	{
10480 		"ALU32_AND_K: all immediate value magnitudes",
10481 		{ },
10482 		INTERNAL | FLAG_NO_DATA,
10483 		{ },
10484 		{ { 0, 1 } },
10485 		.fill_helper = bpf_fill_alu32_and_imm,
10486 		.nr_testruns = NR_PATTERN_RUNS,
10487 	},
10488 	{
10489 		"ALU32_OR_K: all immediate value magnitudes",
10490 		{ },
10491 		INTERNAL | FLAG_NO_DATA,
10492 		{ },
10493 		{ { 0, 1 } },
10494 		.fill_helper = bpf_fill_alu32_or_imm,
10495 		.nr_testruns = NR_PATTERN_RUNS,
10496 	},
10497 	{
10498 		"ALU32_XOR_K: all immediate value magnitudes",
10499 		{ },
10500 		INTERNAL | FLAG_NO_DATA,
10501 		{ },
10502 		{ { 0, 1 } },
10503 		.fill_helper = bpf_fill_alu32_xor_imm,
10504 		.nr_testruns = NR_PATTERN_RUNS,
10505 	},
10506 	{
10507 		"ALU32_ADD_K: all immediate value magnitudes",
10508 		{ },
10509 		INTERNAL | FLAG_NO_DATA,
10510 		{ },
10511 		{ { 0, 1 } },
10512 		.fill_helper = bpf_fill_alu32_add_imm,
10513 		.nr_testruns = NR_PATTERN_RUNS,
10514 	},
10515 	{
10516 		"ALU32_SUB_K: all immediate value magnitudes",
10517 		{ },
10518 		INTERNAL | FLAG_NO_DATA,
10519 		{ },
10520 		{ { 0, 1 } },
10521 		.fill_helper = bpf_fill_alu32_sub_imm,
10522 		.nr_testruns = NR_PATTERN_RUNS,
10523 	},
10524 	{
10525 		"ALU32_MUL_K: all immediate value magnitudes",
10526 		{ },
10527 		INTERNAL | FLAG_NO_DATA,
10528 		{ },
10529 		{ { 0, 1 } },
10530 		.fill_helper = bpf_fill_alu32_mul_imm,
10531 		.nr_testruns = NR_PATTERN_RUNS,
10532 	},
10533 	{
10534 		"ALU32_DIV_K: all immediate value magnitudes",
10535 		{ },
10536 		INTERNAL | FLAG_NO_DATA,
10537 		{ },
10538 		{ { 0, 1 } },
10539 		.fill_helper = bpf_fill_alu32_div_imm,
10540 		.nr_testruns = NR_PATTERN_RUNS,
10541 	},
10542 	{
10543 		"ALU32_MOD_K: all immediate value magnitudes",
10544 		{ },
10545 		INTERNAL | FLAG_NO_DATA,
10546 		{ },
10547 		{ { 0, 1 } },
10548 		.fill_helper = bpf_fill_alu32_mod_imm,
10549 		.nr_testruns = NR_PATTERN_RUNS,
10550 	},
10551 	/* ALU64 register magnitudes */
10552 	{
10553 		"ALU64_MOV_X: all register value magnitudes",
10554 		{ },
10555 		INTERNAL | FLAG_NO_DATA,
10556 		{ },
10557 		{ { 0, 1 } },
10558 		.fill_helper = bpf_fill_alu64_mov_reg,
10559 		.nr_testruns = NR_PATTERN_RUNS,
10560 	},
10561 	{
10562 		"ALU64_AND_X: all register value magnitudes",
10563 		{ },
10564 		INTERNAL | FLAG_NO_DATA,
10565 		{ },
10566 		{ { 0, 1 } },
10567 		.fill_helper = bpf_fill_alu64_and_reg,
10568 		.nr_testruns = NR_PATTERN_RUNS,
10569 	},
10570 	{
10571 		"ALU64_OR_X: all register value magnitudes",
10572 		{ },
10573 		INTERNAL | FLAG_NO_DATA,
10574 		{ },
10575 		{ { 0, 1 } },
10576 		.fill_helper = bpf_fill_alu64_or_reg,
10577 		.nr_testruns = NR_PATTERN_RUNS,
10578 	},
10579 	{
10580 		"ALU64_XOR_X: all register value magnitudes",
10581 		{ },
10582 		INTERNAL | FLAG_NO_DATA,
10583 		{ },
10584 		{ { 0, 1 } },
10585 		.fill_helper = bpf_fill_alu64_xor_reg,
10586 		.nr_testruns = NR_PATTERN_RUNS,
10587 	},
10588 	{
10589 		"ALU64_ADD_X: all register value magnitudes",
10590 		{ },
10591 		INTERNAL | FLAG_NO_DATA,
10592 		{ },
10593 		{ { 0, 1 } },
10594 		.fill_helper = bpf_fill_alu64_add_reg,
10595 		.nr_testruns = NR_PATTERN_RUNS,
10596 	},
10597 	{
10598 		"ALU64_SUB_X: all register value magnitudes",
10599 		{ },
10600 		INTERNAL | FLAG_NO_DATA,
10601 		{ },
10602 		{ { 0, 1 } },
10603 		.fill_helper = bpf_fill_alu64_sub_reg,
10604 		.nr_testruns = NR_PATTERN_RUNS,
10605 	},
10606 	{
10607 		"ALU64_MUL_X: all register value magnitudes",
10608 		{ },
10609 		INTERNAL | FLAG_NO_DATA,
10610 		{ },
10611 		{ { 0, 1 } },
10612 		.fill_helper = bpf_fill_alu64_mul_reg,
10613 		.nr_testruns = NR_PATTERN_RUNS,
10614 	},
10615 	{
10616 		"ALU64_DIV_X: all register value magnitudes",
10617 		{ },
10618 		INTERNAL | FLAG_NO_DATA,
10619 		{ },
10620 		{ { 0, 1 } },
10621 		.fill_helper = bpf_fill_alu64_div_reg,
10622 		.nr_testruns = NR_PATTERN_RUNS,
10623 	},
10624 	{
10625 		"ALU64_MOD_X: all register value magnitudes",
10626 		{ },
10627 		INTERNAL | FLAG_NO_DATA,
10628 		{ },
10629 		{ { 0, 1 } },
10630 		.fill_helper = bpf_fill_alu64_mod_reg,
10631 		.nr_testruns = NR_PATTERN_RUNS,
10632 	},
10633 	/* ALU32 register magnitudes */
10634 	{
10635 		"ALU32_MOV_X: all register value magnitudes",
10636 		{ },
10637 		INTERNAL | FLAG_NO_DATA,
10638 		{ },
10639 		{ { 0, 1 } },
10640 		.fill_helper = bpf_fill_alu32_mov_reg,
10641 		.nr_testruns = NR_PATTERN_RUNS,
10642 	},
10643 	{
10644 		"ALU32_AND_X: all register value magnitudes",
10645 		{ },
10646 		INTERNAL | FLAG_NO_DATA,
10647 		{ },
10648 		{ { 0, 1 } },
10649 		.fill_helper = bpf_fill_alu32_and_reg,
10650 		.nr_testruns = NR_PATTERN_RUNS,
10651 	},
10652 	{
10653 		"ALU32_OR_X: all register value magnitudes",
10654 		{ },
10655 		INTERNAL | FLAG_NO_DATA,
10656 		{ },
10657 		{ { 0, 1 } },
10658 		.fill_helper = bpf_fill_alu32_or_reg,
10659 		.nr_testruns = NR_PATTERN_RUNS,
10660 	},
10661 	{
10662 		"ALU32_XOR_X: all register value magnitudes",
10663 		{ },
10664 		INTERNAL | FLAG_NO_DATA,
10665 		{ },
10666 		{ { 0, 1 } },
10667 		.fill_helper = bpf_fill_alu32_xor_reg,
10668 		.nr_testruns = NR_PATTERN_RUNS,
10669 	},
10670 	{
10671 		"ALU32_ADD_X: all register value magnitudes",
10672 		{ },
10673 		INTERNAL | FLAG_NO_DATA,
10674 		{ },
10675 		{ { 0, 1 } },
10676 		.fill_helper = bpf_fill_alu32_add_reg,
10677 		.nr_testruns = NR_PATTERN_RUNS,
10678 	},
10679 	{
10680 		"ALU32_SUB_X: all register value magnitudes",
10681 		{ },
10682 		INTERNAL | FLAG_NO_DATA,
10683 		{ },
10684 		{ { 0, 1 } },
10685 		.fill_helper = bpf_fill_alu32_sub_reg,
10686 		.nr_testruns = NR_PATTERN_RUNS,
10687 	},
10688 	{
10689 		"ALU32_MUL_X: all register value magnitudes",
10690 		{ },
10691 		INTERNAL | FLAG_NO_DATA,
10692 		{ },
10693 		{ { 0, 1 } },
10694 		.fill_helper = bpf_fill_alu32_mul_reg,
10695 		.nr_testruns = NR_PATTERN_RUNS,
10696 	},
10697 	{
10698 		"ALU32_DIV_X: all register value magnitudes",
10699 		{ },
10700 		INTERNAL | FLAG_NO_DATA,
10701 		{ },
10702 		{ { 0, 1 } },
10703 		.fill_helper = bpf_fill_alu32_div_reg,
10704 		.nr_testruns = NR_PATTERN_RUNS,
10705 	},
10706 	{
10707 		"ALU32_MOD_X: all register value magnitudes",
10708 		{ },
10709 		INTERNAL | FLAG_NO_DATA,
10710 		{ },
10711 		{ { 0, 1 } },
10712 		.fill_helper = bpf_fill_alu32_mod_reg,
10713 		.nr_testruns = NR_PATTERN_RUNS,
10714 	},
10715 	/* LD_IMM64 immediate magnitudes */
10716 	{
10717 		"LD_IMM64: all immediate value magnitudes",
10718 		{ },
10719 		INTERNAL | FLAG_NO_DATA,
10720 		{ },
10721 		{ { 0, 1 } },
10722 		.fill_helper = bpf_fill_ld_imm64,
10723 	},
10724 	/* JMP immediate magnitudes */
10725 	{
10726 		"JMP_JSET_K: all immediate value magnitudes",
10727 		{ },
10728 		INTERNAL | FLAG_NO_DATA,
10729 		{ },
10730 		{ { 0, 1 } },
10731 		.fill_helper = bpf_fill_jmp_jset_imm,
10732 		.nr_testruns = NR_PATTERN_RUNS,
10733 	},
10734 	{
10735 		"JMP_JEQ_K: all immediate value magnitudes",
10736 		{ },
10737 		INTERNAL | FLAG_NO_DATA,
10738 		{ },
10739 		{ { 0, 1 } },
10740 		.fill_helper = bpf_fill_jmp_jeq_imm,
10741 		.nr_testruns = NR_PATTERN_RUNS,
10742 	},
10743 	{
10744 		"JMP_JNE_K: all immediate value magnitudes",
10745 		{ },
10746 		INTERNAL | FLAG_NO_DATA,
10747 		{ },
10748 		{ { 0, 1 } },
10749 		.fill_helper = bpf_fill_jmp_jne_imm,
10750 		.nr_testruns = NR_PATTERN_RUNS,
10751 	},
10752 	{
10753 		"JMP_JGT_K: all immediate value magnitudes",
10754 		{ },
10755 		INTERNAL | FLAG_NO_DATA,
10756 		{ },
10757 		{ { 0, 1 } },
10758 		.fill_helper = bpf_fill_jmp_jgt_imm,
10759 		.nr_testruns = NR_PATTERN_RUNS,
10760 	},
10761 	{
10762 		"JMP_JGE_K: all immediate value magnitudes",
10763 		{ },
10764 		INTERNAL | FLAG_NO_DATA,
10765 		{ },
10766 		{ { 0, 1 } },
10767 		.fill_helper = bpf_fill_jmp_jge_imm,
10768 		.nr_testruns = NR_PATTERN_RUNS,
10769 	},
10770 	{
10771 		"JMP_JLT_K: all immediate value magnitudes",
10772 		{ },
10773 		INTERNAL | FLAG_NO_DATA,
10774 		{ },
10775 		{ { 0, 1 } },
10776 		.fill_helper = bpf_fill_jmp_jlt_imm,
10777 		.nr_testruns = NR_PATTERN_RUNS,
10778 	},
10779 	{
10780 		"JMP_JLE_K: all immediate value magnitudes",
10781 		{ },
10782 		INTERNAL | FLAG_NO_DATA,
10783 		{ },
10784 		{ { 0, 1 } },
10785 		.fill_helper = bpf_fill_jmp_jle_imm,
10786 		.nr_testruns = NR_PATTERN_RUNS,
10787 	},
10788 	{
10789 		"JMP_JSGT_K: all immediate value magnitudes",
10790 		{ },
10791 		INTERNAL | FLAG_NO_DATA,
10792 		{ },
10793 		{ { 0, 1 } },
10794 		.fill_helper = bpf_fill_jmp_jsgt_imm,
10795 		.nr_testruns = NR_PATTERN_RUNS,
10796 	},
10797 	{
10798 		"JMP_JSGE_K: all immediate value magnitudes",
10799 		{ },
10800 		INTERNAL | FLAG_NO_DATA,
10801 		{ },
10802 		{ { 0, 1 } },
10803 		.fill_helper = bpf_fill_jmp_jsge_imm,
10804 		.nr_testruns = NR_PATTERN_RUNS,
10805 	},
10806 	{
10807 		"JMP_JSLT_K: all immediate value magnitudes",
10808 		{ },
10809 		INTERNAL | FLAG_NO_DATA,
10810 		{ },
10811 		{ { 0, 1 } },
10812 		.fill_helper = bpf_fill_jmp_jslt_imm,
10813 		.nr_testruns = NR_PATTERN_RUNS,
10814 	},
10815 	{
10816 		"JMP_JSLE_K: all immediate value magnitudes",
10817 		{ },
10818 		INTERNAL | FLAG_NO_DATA,
10819 		{ },
10820 		{ { 0, 1 } },
10821 		.fill_helper = bpf_fill_jmp_jsle_imm,
10822 		.nr_testruns = NR_PATTERN_RUNS,
10823 	},
10824 	/* JMP register magnitudes */
10825 	{
10826 		"JMP_JSET_X: all register value magnitudes",
10827 		{ },
10828 		INTERNAL | FLAG_NO_DATA,
10829 		{ },
10830 		{ { 0, 1 } },
10831 		.fill_helper = bpf_fill_jmp_jset_reg,
10832 		.nr_testruns = NR_PATTERN_RUNS,
10833 	},
10834 	{
10835 		"JMP_JEQ_X: all register value magnitudes",
10836 		{ },
10837 		INTERNAL | FLAG_NO_DATA,
10838 		{ },
10839 		{ { 0, 1 } },
10840 		.fill_helper = bpf_fill_jmp_jeq_reg,
10841 		.nr_testruns = NR_PATTERN_RUNS,
10842 	},
10843 	{
10844 		"JMP_JNE_X: all register value magnitudes",
10845 		{ },
10846 		INTERNAL | FLAG_NO_DATA,
10847 		{ },
10848 		{ { 0, 1 } },
10849 		.fill_helper = bpf_fill_jmp_jne_reg,
10850 		.nr_testruns = NR_PATTERN_RUNS,
10851 	},
10852 	{
10853 		"JMP_JGT_X: all register value magnitudes",
10854 		{ },
10855 		INTERNAL | FLAG_NO_DATA,
10856 		{ },
10857 		{ { 0, 1 } },
10858 		.fill_helper = bpf_fill_jmp_jgt_reg,
10859 		.nr_testruns = NR_PATTERN_RUNS,
10860 	},
10861 	{
10862 		"JMP_JGE_X: all register value magnitudes",
10863 		{ },
10864 		INTERNAL | FLAG_NO_DATA,
10865 		{ },
10866 		{ { 0, 1 } },
10867 		.fill_helper = bpf_fill_jmp_jge_reg,
10868 		.nr_testruns = NR_PATTERN_RUNS,
10869 	},
10870 	{
10871 		"JMP_JLT_X: all register value magnitudes",
10872 		{ },
10873 		INTERNAL | FLAG_NO_DATA,
10874 		{ },
10875 		{ { 0, 1 } },
10876 		.fill_helper = bpf_fill_jmp_jlt_reg,
10877 		.nr_testruns = NR_PATTERN_RUNS,
10878 	},
10879 	{
10880 		"JMP_JLE_X: all register value magnitudes",
10881 		{ },
10882 		INTERNAL | FLAG_NO_DATA,
10883 		{ },
10884 		{ { 0, 1 } },
10885 		.fill_helper = bpf_fill_jmp_jle_reg,
10886 		.nr_testruns = NR_PATTERN_RUNS,
10887 	},
10888 	{
10889 		"JMP_JSGT_X: all register value magnitudes",
10890 		{ },
10891 		INTERNAL | FLAG_NO_DATA,
10892 		{ },
10893 		{ { 0, 1 } },
10894 		.fill_helper = bpf_fill_jmp_jsgt_reg,
10895 		.nr_testruns = NR_PATTERN_RUNS,
10896 	},
10897 	{
10898 		"JMP_JSGE_X: all register value magnitudes",
10899 		{ },
10900 		INTERNAL | FLAG_NO_DATA,
10901 		{ },
10902 		{ { 0, 1 } },
10903 		.fill_helper = bpf_fill_jmp_jsge_reg,
10904 		.nr_testruns = NR_PATTERN_RUNS,
10905 	},
10906 	{
10907 		"JMP_JSLT_X: all register value magnitudes",
10908 		{ },
10909 		INTERNAL | FLAG_NO_DATA,
10910 		{ },
10911 		{ { 0, 1 } },
10912 		.fill_helper = bpf_fill_jmp_jslt_reg,
10913 		.nr_testruns = NR_PATTERN_RUNS,
10914 	},
10915 	{
10916 		"JMP_JSLE_X: all register value magnitudes",
10917 		{ },
10918 		INTERNAL | FLAG_NO_DATA,
10919 		{ },
10920 		{ { 0, 1 } },
10921 		.fill_helper = bpf_fill_jmp_jsle_reg,
10922 		.nr_testruns = NR_PATTERN_RUNS,
10923 	},
10924 	/* JMP32 immediate magnitudes */
10925 	{
10926 		"JMP32_JSET_K: all immediate value magnitudes",
10927 		{ },
10928 		INTERNAL | FLAG_NO_DATA,
10929 		{ },
10930 		{ { 0, 1 } },
10931 		.fill_helper = bpf_fill_jmp32_jset_imm,
10932 		.nr_testruns = NR_PATTERN_RUNS,
10933 	},
10934 	{
10935 		"JMP32_JEQ_K: all immediate value magnitudes",
10936 		{ },
10937 		INTERNAL | FLAG_NO_DATA,
10938 		{ },
10939 		{ { 0, 1 } },
10940 		.fill_helper = bpf_fill_jmp32_jeq_imm,
10941 		.nr_testruns = NR_PATTERN_RUNS,
10942 	},
10943 	{
10944 		"JMP32_JNE_K: all immediate value magnitudes",
10945 		{ },
10946 		INTERNAL | FLAG_NO_DATA,
10947 		{ },
10948 		{ { 0, 1 } },
10949 		.fill_helper = bpf_fill_jmp32_jne_imm,
10950 		.nr_testruns = NR_PATTERN_RUNS,
10951 	},
10952 	{
10953 		"JMP32_JGT_K: all immediate value magnitudes",
10954 		{ },
10955 		INTERNAL | FLAG_NO_DATA,
10956 		{ },
10957 		{ { 0, 1 } },
10958 		.fill_helper = bpf_fill_jmp32_jgt_imm,
10959 		.nr_testruns = NR_PATTERN_RUNS,
10960 	},
10961 	{
10962 		"JMP32_JGE_K: all immediate value magnitudes",
10963 		{ },
10964 		INTERNAL | FLAG_NO_DATA,
10965 		{ },
10966 		{ { 0, 1 } },
10967 		.fill_helper = bpf_fill_jmp32_jge_imm,
10968 		.nr_testruns = NR_PATTERN_RUNS,
10969 	},
10970 	{
10971 		"JMP32_JLT_K: all immediate value magnitudes",
10972 		{ },
10973 		INTERNAL | FLAG_NO_DATA,
10974 		{ },
10975 		{ { 0, 1 } },
10976 		.fill_helper = bpf_fill_jmp32_jlt_imm,
10977 		.nr_testruns = NR_PATTERN_RUNS,
10978 	},
10979 	{
10980 		"JMP32_JLE_K: all immediate value magnitudes",
10981 		{ },
10982 		INTERNAL | FLAG_NO_DATA,
10983 		{ },
10984 		{ { 0, 1 } },
10985 		.fill_helper = bpf_fill_jmp32_jle_imm,
10986 		.nr_testruns = NR_PATTERN_RUNS,
10987 	},
10988 	{
10989 		"JMP32_JSGT_K: all immediate value magnitudes",
10990 		{ },
10991 		INTERNAL | FLAG_NO_DATA,
10992 		{ },
10993 		{ { 0, 1 } },
10994 		.fill_helper = bpf_fill_jmp32_jsgt_imm,
10995 		.nr_testruns = NR_PATTERN_RUNS,
10996 	},
10997 	{
10998 		"JMP32_JSGE_K: all immediate value magnitudes",
10999 		{ },
11000 		INTERNAL | FLAG_NO_DATA,
11001 		{ },
11002 		{ { 0, 1 } },
11003 		.fill_helper = bpf_fill_jmp32_jsge_imm,
11004 		.nr_testruns = NR_PATTERN_RUNS,
11005 	},
11006 	{
11007 		"JMP32_JSLT_K: all immediate value magnitudes",
11008 		{ },
11009 		INTERNAL | FLAG_NO_DATA,
11010 		{ },
11011 		{ { 0, 1 } },
11012 		.fill_helper = bpf_fill_jmp32_jslt_imm,
11013 		.nr_testruns = NR_PATTERN_RUNS,
11014 	},
11015 	{
11016 		"JMP32_JSLE_K: all immediate value magnitudes",
11017 		{ },
11018 		INTERNAL | FLAG_NO_DATA,
11019 		{ },
11020 		{ { 0, 1 } },
11021 		.fill_helper = bpf_fill_jmp32_jsle_imm,
11022 		.nr_testruns = NR_PATTERN_RUNS,
11023 	},
11024 	/* JMP32 register magnitudes */
11025 	{
11026 		"JMP32_JSET_X: all register value magnitudes",
11027 		{ },
11028 		INTERNAL | FLAG_NO_DATA,
11029 		{ },
11030 		{ { 0, 1 } },
11031 		.fill_helper = bpf_fill_jmp32_jset_reg,
11032 		.nr_testruns = NR_PATTERN_RUNS,
11033 	},
11034 	{
11035 		"JMP32_JEQ_X: all register value magnitudes",
11036 		{ },
11037 		INTERNAL | FLAG_NO_DATA,
11038 		{ },
11039 		{ { 0, 1 } },
11040 		.fill_helper = bpf_fill_jmp32_jeq_reg,
11041 		.nr_testruns = NR_PATTERN_RUNS,
11042 	},
11043 	{
11044 		"JMP32_JNE_X: all register value magnitudes",
11045 		{ },
11046 		INTERNAL | FLAG_NO_DATA,
11047 		{ },
11048 		{ { 0, 1 } },
11049 		.fill_helper = bpf_fill_jmp32_jne_reg,
11050 		.nr_testruns = NR_PATTERN_RUNS,
11051 	},
11052 	{
11053 		"JMP32_JGT_X: all register value magnitudes",
11054 		{ },
11055 		INTERNAL | FLAG_NO_DATA,
11056 		{ },
11057 		{ { 0, 1 } },
11058 		.fill_helper = bpf_fill_jmp32_jgt_reg,
11059 		.nr_testruns = NR_PATTERN_RUNS,
11060 	},
11061 	{
11062 		"JMP32_JGE_X: all register value magnitudes",
11063 		{ },
11064 		INTERNAL | FLAG_NO_DATA,
11065 		{ },
11066 		{ { 0, 1 } },
11067 		.fill_helper = bpf_fill_jmp32_jge_reg,
11068 		.nr_testruns = NR_PATTERN_RUNS,
11069 	},
11070 	{
11071 		"JMP32_JLT_X: all register value magnitudes",
11072 		{ },
11073 		INTERNAL | FLAG_NO_DATA,
11074 		{ },
11075 		{ { 0, 1 } },
11076 		.fill_helper = bpf_fill_jmp32_jlt_reg,
11077 		.nr_testruns = NR_PATTERN_RUNS,
11078 	},
11079 	{
11080 		"JMP32_JLE_X: all register value magnitudes",
11081 		{ },
11082 		INTERNAL | FLAG_NO_DATA,
11083 		{ },
11084 		{ { 0, 1 } },
11085 		.fill_helper = bpf_fill_jmp32_jle_reg,
11086 		.nr_testruns = NR_PATTERN_RUNS,
11087 	},
11088 	{
11089 		"JMP32_JSGT_X: all register value magnitudes",
11090 		{ },
11091 		INTERNAL | FLAG_NO_DATA,
11092 		{ },
11093 		{ { 0, 1 } },
11094 		.fill_helper = bpf_fill_jmp32_jsgt_reg,
11095 		.nr_testruns = NR_PATTERN_RUNS,
11096 	},
11097 	{
11098 		"JMP32_JSGE_X: all register value magnitudes",
11099 		{ },
11100 		INTERNAL | FLAG_NO_DATA,
11101 		{ },
11102 		{ { 0, 1 } },
11103 		.fill_helper = bpf_fill_jmp32_jsge_reg,
11104 		.nr_testruns = NR_PATTERN_RUNS,
11105 	},
11106 	{
11107 		"JMP32_JSLT_X: all register value magnitudes",
11108 		{ },
11109 		INTERNAL | FLAG_NO_DATA,
11110 		{ },
11111 		{ { 0, 1 } },
11112 		.fill_helper = bpf_fill_jmp32_jslt_reg,
11113 		.nr_testruns = NR_PATTERN_RUNS,
11114 	},
11115 	{
11116 		"JMP32_JSLE_X: all register value magnitudes",
11117 		{ },
11118 		INTERNAL | FLAG_NO_DATA,
11119 		{ },
11120 		{ { 0, 1 } },
11121 		.fill_helper = bpf_fill_jmp32_jsle_reg,
11122 		.nr_testruns = NR_PATTERN_RUNS,
11123 	},
11124 	/* Conditional jumps with constant decision */
11125 	{
11126 		"JMP_JSET_K: imm = 0 -> never taken",
11127 		.u.insns_int = {
11128 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11129 			BPF_JMP_IMM(BPF_JSET, R1, 0, 1),
11130 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11131 			BPF_EXIT_INSN(),
11132 		},
11133 		INTERNAL | FLAG_NO_DATA,
11134 		{ },
11135 		{ { 0, 0 } },
11136 	},
11137 	{
11138 		"JMP_JLT_K: imm = 0 -> never taken",
11139 		.u.insns_int = {
11140 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11141 			BPF_JMP_IMM(BPF_JLT, R1, 0, 1),
11142 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11143 			BPF_EXIT_INSN(),
11144 		},
11145 		INTERNAL | FLAG_NO_DATA,
11146 		{ },
11147 		{ { 0, 0 } },
11148 	},
11149 	{
11150 		"JMP_JGE_K: imm = 0 -> always taken",
11151 		.u.insns_int = {
11152 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11153 			BPF_JMP_IMM(BPF_JGE, R1, 0, 1),
11154 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11155 			BPF_EXIT_INSN(),
11156 		},
11157 		INTERNAL | FLAG_NO_DATA,
11158 		{ },
11159 		{ { 0, 1 } },
11160 	},
11161 	{
11162 		"JMP_JGT_K: imm = 0xffffffff -> never taken",
11163 		.u.insns_int = {
11164 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11165 			BPF_JMP_IMM(BPF_JGT, R1, U32_MAX, 1),
11166 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11167 			BPF_EXIT_INSN(),
11168 		},
11169 		INTERNAL | FLAG_NO_DATA,
11170 		{ },
11171 		{ { 0, 0 } },
11172 	},
11173 	{
11174 		"JMP_JLE_K: imm = 0xffffffff -> always taken",
11175 		.u.insns_int = {
11176 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11177 			BPF_JMP_IMM(BPF_JLE, R1, U32_MAX, 1),
11178 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11179 			BPF_EXIT_INSN(),
11180 		},
11181 		INTERNAL | FLAG_NO_DATA,
11182 		{ },
11183 		{ { 0, 1 } },
11184 	},
11185 	{
11186 		"JMP32_JSGT_K: imm = 0x7fffffff -> never taken",
11187 		.u.insns_int = {
11188 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11189 			BPF_JMP32_IMM(BPF_JSGT, R1, S32_MAX, 1),
11190 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11191 			BPF_EXIT_INSN(),
11192 		},
11193 		INTERNAL | FLAG_NO_DATA,
11194 		{ },
11195 		{ { 0, 0 } },
11196 	},
11197 	{
11198 		"JMP32_JSGE_K: imm = -0x80000000 -> always taken",
11199 		.u.insns_int = {
11200 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11201 			BPF_JMP32_IMM(BPF_JSGE, R1, S32_MIN, 1),
11202 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11203 			BPF_EXIT_INSN(),
11204 		},
11205 		INTERNAL | FLAG_NO_DATA,
11206 		{ },
11207 		{ { 0, 1 } },
11208 	},
11209 	{
11210 		"JMP32_JSLT_K: imm = -0x80000000 -> never taken",
11211 		.u.insns_int = {
11212 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11213 			BPF_JMP32_IMM(BPF_JSLT, R1, S32_MIN, 1),
11214 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11215 			BPF_EXIT_INSN(),
11216 		},
11217 		INTERNAL | FLAG_NO_DATA,
11218 		{ },
11219 		{ { 0, 0 } },
11220 	},
11221 	{
11222 		"JMP32_JSLE_K: imm = 0x7fffffff -> always taken",
11223 		.u.insns_int = {
11224 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11225 			BPF_JMP32_IMM(BPF_JSLE, R1, S32_MAX, 1),
11226 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11227 			BPF_EXIT_INSN(),
11228 		},
11229 		INTERNAL | FLAG_NO_DATA,
11230 		{ },
11231 		{ { 0, 1 } },
11232 	},
11233 	{
11234 		"JMP_JEQ_X: dst = src -> always taken",
11235 		.u.insns_int = {
11236 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11237 			BPF_JMP_REG(BPF_JEQ, R1, R1, 1),
11238 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11239 			BPF_EXIT_INSN(),
11240 		},
11241 		INTERNAL | FLAG_NO_DATA,
11242 		{ },
11243 		{ { 0, 1 } },
11244 	},
11245 	{
11246 		"JMP_JGE_X: dst = src -> always taken",
11247 		.u.insns_int = {
11248 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11249 			BPF_JMP_REG(BPF_JGE, R1, R1, 1),
11250 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11251 			BPF_EXIT_INSN(),
11252 		},
11253 		INTERNAL | FLAG_NO_DATA,
11254 		{ },
11255 		{ { 0, 1 } },
11256 	},
11257 	{
11258 		"JMP_JLE_X: dst = src -> always taken",
11259 		.u.insns_int = {
11260 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11261 			BPF_JMP_REG(BPF_JLE, R1, R1, 1),
11262 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11263 			BPF_EXIT_INSN(),
11264 		},
11265 		INTERNAL | FLAG_NO_DATA,
11266 		{ },
11267 		{ { 0, 1 } },
11268 	},
11269 	{
11270 		"JMP_JSGE_X: dst = src -> always taken",
11271 		.u.insns_int = {
11272 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11273 			BPF_JMP_REG(BPF_JSGE, R1, R1, 1),
11274 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11275 			BPF_EXIT_INSN(),
11276 		},
11277 		INTERNAL | FLAG_NO_DATA,
11278 		{ },
11279 		{ { 0, 1 } },
11280 	},
11281 	{
11282 		"JMP_JSLE_X: dst = src -> always taken",
11283 		.u.insns_int = {
11284 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11285 			BPF_JMP_REG(BPF_JSLE, R1, R1, 1),
11286 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11287 			BPF_EXIT_INSN(),
11288 		},
11289 		INTERNAL | FLAG_NO_DATA,
11290 		{ },
11291 		{ { 0, 1 } },
11292 	},
11293 	{
11294 		"JMP_JNE_X: dst = src -> never taken",
11295 		.u.insns_int = {
11296 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11297 			BPF_JMP_REG(BPF_JNE, R1, R1, 1),
11298 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11299 			BPF_EXIT_INSN(),
11300 		},
11301 		INTERNAL | FLAG_NO_DATA,
11302 		{ },
11303 		{ { 0, 0 } },
11304 	},
11305 	{
11306 		"JMP_JGT_X: dst = src -> never taken",
11307 		.u.insns_int = {
11308 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11309 			BPF_JMP_REG(BPF_JGT, R1, R1, 1),
11310 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11311 			BPF_EXIT_INSN(),
11312 		},
11313 		INTERNAL | FLAG_NO_DATA,
11314 		{ },
11315 		{ { 0, 0 } },
11316 	},
11317 	{
11318 		"JMP_JLT_X: dst = src -> never taken",
11319 		.u.insns_int = {
11320 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11321 			BPF_JMP_REG(BPF_JLT, R1, R1, 1),
11322 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11323 			BPF_EXIT_INSN(),
11324 		},
11325 		INTERNAL | FLAG_NO_DATA,
11326 		{ },
11327 		{ { 0, 0 } },
11328 	},
11329 	{
11330 		"JMP_JSGT_X: dst = src -> never taken",
11331 		.u.insns_int = {
11332 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11333 			BPF_JMP_REG(BPF_JSGT, R1, R1, 1),
11334 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11335 			BPF_EXIT_INSN(),
11336 		},
11337 		INTERNAL | FLAG_NO_DATA,
11338 		{ },
11339 		{ { 0, 0 } },
11340 	},
11341 	{
11342 		"JMP_JSLT_X: dst = src -> never taken",
11343 		.u.insns_int = {
11344 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
11345 			BPF_JMP_REG(BPF_JSLT, R1, R1, 1),
11346 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11347 			BPF_EXIT_INSN(),
11348 		},
11349 		INTERNAL | FLAG_NO_DATA,
11350 		{ },
11351 		{ { 0, 0 } },
11352 	},
11353 	/* Short relative jumps */
11354 	{
11355 		"Short relative jump: offset=0",
11356 		.u.insns_int = {
11357 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11358 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 0),
11359 			BPF_EXIT_INSN(),
11360 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
11361 		},
11362 		INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
11363 		{ },
11364 		{ { 0, 0 } },
11365 	},
11366 	{
11367 		"Short relative jump: offset=1",
11368 		.u.insns_int = {
11369 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11370 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 1),
11371 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11372 			BPF_EXIT_INSN(),
11373 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
11374 		},
11375 		INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
11376 		{ },
11377 		{ { 0, 0 } },
11378 	},
11379 	{
11380 		"Short relative jump: offset=2",
11381 		.u.insns_int = {
11382 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11383 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
11384 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11385 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11386 			BPF_EXIT_INSN(),
11387 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
11388 		},
11389 		INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
11390 		{ },
11391 		{ { 0, 0 } },
11392 	},
11393 	{
11394 		"Short relative jump: offset=3",
11395 		.u.insns_int = {
11396 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11397 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 3),
11398 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11399 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11400 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11401 			BPF_EXIT_INSN(),
11402 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
11403 		},
11404 		INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
11405 		{ },
11406 		{ { 0, 0 } },
11407 	},
11408 	{
11409 		"Short relative jump: offset=4",
11410 		.u.insns_int = {
11411 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
11412 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 4),
11413 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11414 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11415 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11416 			BPF_ALU32_IMM(BPF_ADD, R0, 1),
11417 			BPF_EXIT_INSN(),
11418 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
11419 		},
11420 		INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
11421 		{ },
11422 		{ { 0, 0 } },
11423 	},
11424 	/* Conditional branch conversions */
11425 	{
11426 		"Long conditional jump: taken at runtime",
11427 		{ },
11428 		INTERNAL | FLAG_NO_DATA,
11429 		{ },
11430 		{ { 0, 1 } },
11431 		.fill_helper = bpf_fill_max_jmp_taken,
11432 	},
11433 	{
11434 		"Long conditional jump: not taken at runtime",
11435 		{ },
11436 		INTERNAL | FLAG_NO_DATA,
11437 		{ },
11438 		{ { 0, 2 } },
11439 		.fill_helper = bpf_fill_max_jmp_not_taken,
11440 	},
11441 	{
11442 		"Long conditional jump: always taken, known at JIT time",
11443 		{ },
11444 		INTERNAL | FLAG_NO_DATA,
11445 		{ },
11446 		{ { 0, 1 } },
11447 		.fill_helper = bpf_fill_max_jmp_always_taken,
11448 	},
11449 	{
11450 		"Long conditional jump: never taken, known at JIT time",
11451 		{ },
11452 		INTERNAL | FLAG_NO_DATA,
11453 		{ },
11454 		{ { 0, 2 } },
11455 		.fill_helper = bpf_fill_max_jmp_never_taken,
11456 	},
11457 	/* Staggered jump sequences, immediate */
11458 	{
11459 		"Staggered jumps: JMP_JA",
11460 		{ },
11461 		INTERNAL | FLAG_NO_DATA,
11462 		{ },
11463 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11464 		.fill_helper = bpf_fill_staggered_ja,
11465 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11466 	},
11467 	{
11468 		"Staggered jumps: JMP_JEQ_K",
11469 		{ },
11470 		INTERNAL | FLAG_NO_DATA,
11471 		{ },
11472 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11473 		.fill_helper = bpf_fill_staggered_jeq_imm,
11474 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11475 	},
11476 	{
11477 		"Staggered jumps: JMP_JNE_K",
11478 		{ },
11479 		INTERNAL | FLAG_NO_DATA,
11480 		{ },
11481 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11482 		.fill_helper = bpf_fill_staggered_jne_imm,
11483 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11484 	},
11485 	{
11486 		"Staggered jumps: JMP_JSET_K",
11487 		{ },
11488 		INTERNAL | FLAG_NO_DATA,
11489 		{ },
11490 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11491 		.fill_helper = bpf_fill_staggered_jset_imm,
11492 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11493 	},
11494 	{
11495 		"Staggered jumps: JMP_JGT_K",
11496 		{ },
11497 		INTERNAL | FLAG_NO_DATA,
11498 		{ },
11499 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11500 		.fill_helper = bpf_fill_staggered_jgt_imm,
11501 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11502 	},
11503 	{
11504 		"Staggered jumps: JMP_JGE_K",
11505 		{ },
11506 		INTERNAL | FLAG_NO_DATA,
11507 		{ },
11508 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11509 		.fill_helper = bpf_fill_staggered_jge_imm,
11510 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11511 	},
11512 	{
11513 		"Staggered jumps: JMP_JLT_K",
11514 		{ },
11515 		INTERNAL | FLAG_NO_DATA,
11516 		{ },
11517 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11518 		.fill_helper = bpf_fill_staggered_jlt_imm,
11519 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11520 	},
11521 	{
11522 		"Staggered jumps: JMP_JLE_K",
11523 		{ },
11524 		INTERNAL | FLAG_NO_DATA,
11525 		{ },
11526 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11527 		.fill_helper = bpf_fill_staggered_jle_imm,
11528 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11529 	},
11530 	{
11531 		"Staggered jumps: JMP_JSGT_K",
11532 		{ },
11533 		INTERNAL | FLAG_NO_DATA,
11534 		{ },
11535 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11536 		.fill_helper = bpf_fill_staggered_jsgt_imm,
11537 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11538 	},
11539 	{
11540 		"Staggered jumps: JMP_JSGE_K",
11541 		{ },
11542 		INTERNAL | FLAG_NO_DATA,
11543 		{ },
11544 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11545 		.fill_helper = bpf_fill_staggered_jsge_imm,
11546 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11547 	},
11548 	{
11549 		"Staggered jumps: JMP_JSLT_K",
11550 		{ },
11551 		INTERNAL | FLAG_NO_DATA,
11552 		{ },
11553 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11554 		.fill_helper = bpf_fill_staggered_jslt_imm,
11555 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11556 	},
11557 	{
11558 		"Staggered jumps: JMP_JSLE_K",
11559 		{ },
11560 		INTERNAL | FLAG_NO_DATA,
11561 		{ },
11562 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11563 		.fill_helper = bpf_fill_staggered_jsle_imm,
11564 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11565 	},
11566 	/* Staggered jump sequences, register */
11567 	{
11568 		"Staggered jumps: JMP_JEQ_X",
11569 		{ },
11570 		INTERNAL | FLAG_NO_DATA,
11571 		{ },
11572 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11573 		.fill_helper = bpf_fill_staggered_jeq_reg,
11574 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11575 	},
11576 	{
11577 		"Staggered jumps: JMP_JNE_X",
11578 		{ },
11579 		INTERNAL | FLAG_NO_DATA,
11580 		{ },
11581 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11582 		.fill_helper = bpf_fill_staggered_jne_reg,
11583 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11584 	},
11585 	{
11586 		"Staggered jumps: JMP_JSET_X",
11587 		{ },
11588 		INTERNAL | FLAG_NO_DATA,
11589 		{ },
11590 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11591 		.fill_helper = bpf_fill_staggered_jset_reg,
11592 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11593 	},
11594 	{
11595 		"Staggered jumps: JMP_JGT_X",
11596 		{ },
11597 		INTERNAL | FLAG_NO_DATA,
11598 		{ },
11599 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11600 		.fill_helper = bpf_fill_staggered_jgt_reg,
11601 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11602 	},
11603 	{
11604 		"Staggered jumps: JMP_JGE_X",
11605 		{ },
11606 		INTERNAL | FLAG_NO_DATA,
11607 		{ },
11608 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11609 		.fill_helper = bpf_fill_staggered_jge_reg,
11610 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11611 	},
11612 	{
11613 		"Staggered jumps: JMP_JLT_X",
11614 		{ },
11615 		INTERNAL | FLAG_NO_DATA,
11616 		{ },
11617 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11618 		.fill_helper = bpf_fill_staggered_jlt_reg,
11619 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11620 	},
11621 	{
11622 		"Staggered jumps: JMP_JLE_X",
11623 		{ },
11624 		INTERNAL | FLAG_NO_DATA,
11625 		{ },
11626 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11627 		.fill_helper = bpf_fill_staggered_jle_reg,
11628 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11629 	},
11630 	{
11631 		"Staggered jumps: JMP_JSGT_X",
11632 		{ },
11633 		INTERNAL | FLAG_NO_DATA,
11634 		{ },
11635 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11636 		.fill_helper = bpf_fill_staggered_jsgt_reg,
11637 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11638 	},
11639 	{
11640 		"Staggered jumps: JMP_JSGE_X",
11641 		{ },
11642 		INTERNAL | FLAG_NO_DATA,
11643 		{ },
11644 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11645 		.fill_helper = bpf_fill_staggered_jsge_reg,
11646 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11647 	},
11648 	{
11649 		"Staggered jumps: JMP_JSLT_X",
11650 		{ },
11651 		INTERNAL | FLAG_NO_DATA,
11652 		{ },
11653 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11654 		.fill_helper = bpf_fill_staggered_jslt_reg,
11655 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11656 	},
11657 	{
11658 		"Staggered jumps: JMP_JSLE_X",
11659 		{ },
11660 		INTERNAL | FLAG_NO_DATA,
11661 		{ },
11662 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11663 		.fill_helper = bpf_fill_staggered_jsle_reg,
11664 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11665 	},
11666 	/* Staggered jump sequences, JMP32 immediate */
11667 	{
11668 		"Staggered jumps: JMP32_JEQ_K",
11669 		{ },
11670 		INTERNAL | FLAG_NO_DATA,
11671 		{ },
11672 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11673 		.fill_helper = bpf_fill_staggered_jeq32_imm,
11674 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11675 	},
11676 	{
11677 		"Staggered jumps: JMP32_JNE_K",
11678 		{ },
11679 		INTERNAL | FLAG_NO_DATA,
11680 		{ },
11681 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11682 		.fill_helper = bpf_fill_staggered_jne32_imm,
11683 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11684 	},
11685 	{
11686 		"Staggered jumps: JMP32_JSET_K",
11687 		{ },
11688 		INTERNAL | FLAG_NO_DATA,
11689 		{ },
11690 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11691 		.fill_helper = bpf_fill_staggered_jset32_imm,
11692 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11693 	},
11694 	{
11695 		"Staggered jumps: JMP32_JGT_K",
11696 		{ },
11697 		INTERNAL | FLAG_NO_DATA,
11698 		{ },
11699 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11700 		.fill_helper = bpf_fill_staggered_jgt32_imm,
11701 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11702 	},
11703 	{
11704 		"Staggered jumps: JMP32_JGE_K",
11705 		{ },
11706 		INTERNAL | FLAG_NO_DATA,
11707 		{ },
11708 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11709 		.fill_helper = bpf_fill_staggered_jge32_imm,
11710 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11711 	},
11712 	{
11713 		"Staggered jumps: JMP32_JLT_K",
11714 		{ },
11715 		INTERNAL | FLAG_NO_DATA,
11716 		{ },
11717 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11718 		.fill_helper = bpf_fill_staggered_jlt32_imm,
11719 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11720 	},
11721 	{
11722 		"Staggered jumps: JMP32_JLE_K",
11723 		{ },
11724 		INTERNAL | FLAG_NO_DATA,
11725 		{ },
11726 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11727 		.fill_helper = bpf_fill_staggered_jle32_imm,
11728 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11729 	},
11730 	{
11731 		"Staggered jumps: JMP32_JSGT_K",
11732 		{ },
11733 		INTERNAL | FLAG_NO_DATA,
11734 		{ },
11735 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11736 		.fill_helper = bpf_fill_staggered_jsgt32_imm,
11737 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11738 	},
11739 	{
11740 		"Staggered jumps: JMP32_JSGE_K",
11741 		{ },
11742 		INTERNAL | FLAG_NO_DATA,
11743 		{ },
11744 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11745 		.fill_helper = bpf_fill_staggered_jsge32_imm,
11746 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11747 	},
11748 	{
11749 		"Staggered jumps: JMP32_JSLT_K",
11750 		{ },
11751 		INTERNAL | FLAG_NO_DATA,
11752 		{ },
11753 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11754 		.fill_helper = bpf_fill_staggered_jslt32_imm,
11755 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11756 	},
11757 	{
11758 		"Staggered jumps: JMP32_JSLE_K",
11759 		{ },
11760 		INTERNAL | FLAG_NO_DATA,
11761 		{ },
11762 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11763 		.fill_helper = bpf_fill_staggered_jsle32_imm,
11764 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11765 	},
11766 	/* Staggered jump sequences, JMP32 register */
11767 	{
11768 		"Staggered jumps: JMP32_JEQ_X",
11769 		{ },
11770 		INTERNAL | FLAG_NO_DATA,
11771 		{ },
11772 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11773 		.fill_helper = bpf_fill_staggered_jeq32_reg,
11774 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11775 	},
11776 	{
11777 		"Staggered jumps: JMP32_JNE_X",
11778 		{ },
11779 		INTERNAL | FLAG_NO_DATA,
11780 		{ },
11781 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11782 		.fill_helper = bpf_fill_staggered_jne32_reg,
11783 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11784 	},
11785 	{
11786 		"Staggered jumps: JMP32_JSET_X",
11787 		{ },
11788 		INTERNAL | FLAG_NO_DATA,
11789 		{ },
11790 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11791 		.fill_helper = bpf_fill_staggered_jset32_reg,
11792 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11793 	},
11794 	{
11795 		"Staggered jumps: JMP32_JGT_X",
11796 		{ },
11797 		INTERNAL | FLAG_NO_DATA,
11798 		{ },
11799 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11800 		.fill_helper = bpf_fill_staggered_jgt32_reg,
11801 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11802 	},
11803 	{
11804 		"Staggered jumps: JMP32_JGE_X",
11805 		{ },
11806 		INTERNAL | FLAG_NO_DATA,
11807 		{ },
11808 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11809 		.fill_helper = bpf_fill_staggered_jge32_reg,
11810 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11811 	},
11812 	{
11813 		"Staggered jumps: JMP32_JLT_X",
11814 		{ },
11815 		INTERNAL | FLAG_NO_DATA,
11816 		{ },
11817 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11818 		.fill_helper = bpf_fill_staggered_jlt32_reg,
11819 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11820 	},
11821 	{
11822 		"Staggered jumps: JMP32_JLE_X",
11823 		{ },
11824 		INTERNAL | FLAG_NO_DATA,
11825 		{ },
11826 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11827 		.fill_helper = bpf_fill_staggered_jle32_reg,
11828 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11829 	},
11830 	{
11831 		"Staggered jumps: JMP32_JSGT_X",
11832 		{ },
11833 		INTERNAL | FLAG_NO_DATA,
11834 		{ },
11835 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11836 		.fill_helper = bpf_fill_staggered_jsgt32_reg,
11837 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11838 	},
11839 	{
11840 		"Staggered jumps: JMP32_JSGE_X",
11841 		{ },
11842 		INTERNAL | FLAG_NO_DATA,
11843 		{ },
11844 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11845 		.fill_helper = bpf_fill_staggered_jsge32_reg,
11846 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11847 	},
11848 	{
11849 		"Staggered jumps: JMP32_JSLT_X",
11850 		{ },
11851 		INTERNAL | FLAG_NO_DATA,
11852 		{ },
11853 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11854 		.fill_helper = bpf_fill_staggered_jslt32_reg,
11855 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11856 	},
11857 	{
11858 		"Staggered jumps: JMP32_JSLE_X",
11859 		{ },
11860 		INTERNAL | FLAG_NO_DATA,
11861 		{ },
11862 		{ { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
11863 		.fill_helper = bpf_fill_staggered_jsle32_reg,
11864 		.nr_testruns = NR_STAGGERED_JMP_RUNS,
11865 	},
11866 };
11867 
11868 static struct net_device dev;
11869 
11870 static struct sk_buff *populate_skb(char *buf, int size)
11871 {
11872 	struct sk_buff *skb;
11873 
11874 	if (size >= MAX_DATA)
11875 		return NULL;
11876 
11877 	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
11878 	if (!skb)
11879 		return NULL;
11880 
11881 	__skb_put_data(skb, buf, size);
11882 
11883 	/* Initialize a fake skb with test pattern. */
11884 	skb_reset_mac_header(skb);
11885 	skb->protocol = htons(ETH_P_IP);
11886 	skb->pkt_type = SKB_TYPE;
11887 	skb->mark = SKB_MARK;
11888 	skb->hash = SKB_HASH;
11889 	skb->queue_mapping = SKB_QUEUE_MAP;
11890 	skb->vlan_tci = SKB_VLAN_TCI;
11891 	skb->vlan_present = SKB_VLAN_PRESENT;
11892 	skb->vlan_proto = htons(ETH_P_IP);
11893 	dev_net_set(&dev, &init_net);
11894 	skb->dev = &dev;
11895 	skb->dev->ifindex = SKB_DEV_IFINDEX;
11896 	skb->dev->type = SKB_DEV_TYPE;
11897 	skb_set_network_header(skb, min(size, ETH_HLEN));
11898 
11899 	return skb;
11900 }
11901 
11902 static void *generate_test_data(struct bpf_test *test, int sub)
11903 {
11904 	struct sk_buff *skb;
11905 	struct page *page;
11906 
11907 	if (test->aux & FLAG_NO_DATA)
11908 		return NULL;
11909 
11910 	/* Test case expects an skb, so populate one. Various
11911 	 * subtests generate skbs of different sizes based on
11912 	 * the same data.
11913 	 */
11914 	skb = populate_skb(test->data, test->test[sub].data_size);
11915 	if (!skb)
11916 		return NULL;
11917 
11918 	if (test->aux & FLAG_SKB_FRAG) {
11919 		/*
11920 		 * when the test requires a fragmented skb, add a
11921 		 * single fragment to the skb, filled with
11922 		 * test->frag_data.
11923 		 */
11924 		void *ptr;
11925 
11926 		page = alloc_page(GFP_KERNEL);
11927 
11928 		if (!page)
11929 			goto err_kfree_skb;
11930 
11931 		ptr = kmap(page);
11932 		if (!ptr)
11933 			goto err_free_page;
11934 		memcpy(ptr, test->frag_data, MAX_DATA);
11935 		kunmap(page);
11936 		skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
11937 	}
11938 
11939 	return skb;
11940 
11941 err_free_page:
11942 	__free_page(page);
11943 err_kfree_skb:
11944 	kfree_skb(skb);
11945 	return NULL;
11946 }
11947 
11948 static void release_test_data(const struct bpf_test *test, void *data)
11949 {
11950 	if (test->aux & FLAG_NO_DATA)
11951 		return;
11952 
11953 	kfree_skb(data);
11954 }
11955 
11956 static int filter_length(int which)
11957 {
11958 	struct sock_filter *fp;
11959 	int len;
11960 
11961 	if (tests[which].fill_helper)
11962 		return tests[which].u.ptr.len;
11963 
11964 	fp = tests[which].u.insns;
11965 	for (len = MAX_INSNS - 1; len > 0; --len)
11966 		if (fp[len].code != 0 || fp[len].k != 0)
11967 			break;
11968 
11969 	return len + 1;
11970 }
11971 
11972 static void *filter_pointer(int which)
11973 {
11974 	if (tests[which].fill_helper)
11975 		return tests[which].u.ptr.insns;
11976 	else
11977 		return tests[which].u.insns;
11978 }
11979 
11980 static struct bpf_prog *generate_filter(int which, int *err)
11981 {
11982 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
11983 	unsigned int flen = filter_length(which);
11984 	void *fptr = filter_pointer(which);
11985 	struct sock_fprog_kern fprog;
11986 	struct bpf_prog *fp;
11987 
11988 	switch (test_type) {
11989 	case CLASSIC:
11990 		fprog.filter = fptr;
11991 		fprog.len = flen;
11992 
11993 		*err = bpf_prog_create(&fp, &fprog);
11994 		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
11995 			if (*err == tests[which].expected_errcode) {
11996 				pr_cont("PASS\n");
11997 				/* Verifier rejected filter as expected. */
11998 				*err = 0;
11999 				return NULL;
12000 			} else {
12001 				pr_cont("UNEXPECTED_PASS\n");
12002 				/* Verifier didn't reject the test that's
12003 				 * bad enough, just return!
12004 				 */
12005 				*err = -EINVAL;
12006 				return NULL;
12007 			}
12008 		}
12009 		if (*err) {
12010 			pr_cont("FAIL to prog_create err=%d len=%d\n",
12011 				*err, fprog.len);
12012 			return NULL;
12013 		}
12014 		break;
12015 
12016 	case INTERNAL:
12017 		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
12018 		if (fp == NULL) {
12019 			pr_cont("UNEXPECTED_FAIL no memory left\n");
12020 			*err = -ENOMEM;
12021 			return NULL;
12022 		}
12023 
12024 		fp->len = flen;
12025 		/* Type doesn't really matter here as long as it's not unspec. */
12026 		fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
12027 		memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
12028 		fp->aux->stack_depth = tests[which].stack_depth;
12029 		fp->aux->verifier_zext = !!(tests[which].aux &
12030 					    FLAG_VERIFIER_ZEXT);
12031 
12032 		/* We cannot error here as we don't need type compatibility
12033 		 * checks.
12034 		 */
12035 		fp = bpf_prog_select_runtime(fp, err);
12036 		if (*err) {
12037 			pr_cont("FAIL to select_runtime err=%d\n", *err);
12038 			return NULL;
12039 		}
12040 		break;
12041 	}
12042 
12043 	*err = 0;
12044 	return fp;
12045 }
12046 
12047 static void release_filter(struct bpf_prog *fp, int which)
12048 {
12049 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
12050 
12051 	switch (test_type) {
12052 	case CLASSIC:
12053 		bpf_prog_destroy(fp);
12054 		break;
12055 	case INTERNAL:
12056 		bpf_prog_free(fp);
12057 		break;
12058 	}
12059 }
12060 
12061 static int __run_one(const struct bpf_prog *fp, const void *data,
12062 		     int runs, u64 *duration)
12063 {
12064 	u64 start, finish;
12065 	int ret = 0, i;
12066 
12067 	migrate_disable();
12068 	start = ktime_get_ns();
12069 
12070 	for (i = 0; i < runs; i++)
12071 		ret = bpf_prog_run(fp, data);
12072 
12073 	finish = ktime_get_ns();
12074 	migrate_enable();
12075 
12076 	*duration = finish - start;
12077 	do_div(*duration, runs);
12078 
12079 	return ret;
12080 }
12081 
12082 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
12083 {
12084 	int err_cnt = 0, i, runs = MAX_TESTRUNS;
12085 
12086 	if (test->nr_testruns)
12087 		runs = min(test->nr_testruns, MAX_TESTRUNS);
12088 
12089 	for (i = 0; i < MAX_SUBTESTS; i++) {
12090 		void *data;
12091 		u64 duration;
12092 		u32 ret;
12093 
12094 		/*
12095 		 * NOTE: Several sub-tests may be present, in which case
12096 		 * a zero {data_size, result} tuple indicates the end of
12097 		 * the sub-test array. The first test is always run,
12098 		 * even if both data_size and result happen to be zero.
12099 		 */
12100 		if (i > 0 &&
12101 		    test->test[i].data_size == 0 &&
12102 		    test->test[i].result == 0)
12103 			break;
12104 
12105 		data = generate_test_data(test, i);
12106 		if (!data && !(test->aux & FLAG_NO_DATA)) {
12107 			pr_cont("data generation failed ");
12108 			err_cnt++;
12109 			break;
12110 		}
12111 		ret = __run_one(fp, data, runs, &duration);
12112 		release_test_data(test, data);
12113 
12114 		if (ret == test->test[i].result) {
12115 			pr_cont("%lld ", duration);
12116 		} else {
12117 			pr_cont("ret %d != %d ", ret,
12118 				test->test[i].result);
12119 			err_cnt++;
12120 		}
12121 	}
12122 
12123 	return err_cnt;
12124 }
12125 
12126 static char test_name[64];
12127 module_param_string(test_name, test_name, sizeof(test_name), 0);
12128 
12129 static int test_id = -1;
12130 module_param(test_id, int, 0);
12131 
12132 static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
12133 module_param_array(test_range, int, NULL, 0);
12134 
12135 static __init int find_test_index(const char *test_name)
12136 {
12137 	int i;
12138 
12139 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
12140 		if (!strcmp(tests[i].descr, test_name))
12141 			return i;
12142 	}
12143 	return -1;
12144 }
12145 
12146 static __init int prepare_bpf_tests(void)
12147 {
12148 	if (test_id >= 0) {
12149 		/*
12150 		 * if a test_id was specified, use test_range to
12151 		 * cover only that test.
12152 		 */
12153 		if (test_id >= ARRAY_SIZE(tests)) {
12154 			pr_err("test_bpf: invalid test_id specified.\n");
12155 			return -EINVAL;
12156 		}
12157 
12158 		test_range[0] = test_id;
12159 		test_range[1] = test_id;
12160 	} else if (*test_name) {
12161 		/*
12162 		 * if a test_name was specified, find it and setup
12163 		 * test_range to cover only that test.
12164 		 */
12165 		int idx = find_test_index(test_name);
12166 
12167 		if (idx < 0) {
12168 			pr_err("test_bpf: no test named '%s' found.\n",
12169 			       test_name);
12170 			return -EINVAL;
12171 		}
12172 		test_range[0] = idx;
12173 		test_range[1] = idx;
12174 	} else {
12175 		/*
12176 		 * check that the supplied test_range is valid.
12177 		 */
12178 		if (test_range[0] >= ARRAY_SIZE(tests) ||
12179 		    test_range[1] >= ARRAY_SIZE(tests) ||
12180 		    test_range[0] < 0 || test_range[1] < 0) {
12181 			pr_err("test_bpf: test_range is out of bound.\n");
12182 			return -EINVAL;
12183 		}
12184 
12185 		if (test_range[1] < test_range[0]) {
12186 			pr_err("test_bpf: test_range is ending before it starts.\n");
12187 			return -EINVAL;
12188 		}
12189 	}
12190 
12191 	return 0;
12192 }
12193 
12194 static __init void destroy_bpf_tests(void)
12195 {
12196 }
12197 
12198 static bool exclude_test(int test_id)
12199 {
12200 	return test_id < test_range[0] || test_id > test_range[1];
12201 }
12202 
12203 static __init struct sk_buff *build_test_skb(void)
12204 {
12205 	u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
12206 	struct sk_buff *skb[2];
12207 	struct page *page[2];
12208 	int i, data_size = 8;
12209 
12210 	for (i = 0; i < 2; i++) {
12211 		page[i] = alloc_page(GFP_KERNEL);
12212 		if (!page[i]) {
12213 			if (i == 0)
12214 				goto err_page0;
12215 			else
12216 				goto err_page1;
12217 		}
12218 
12219 		/* this will set skb[i]->head_frag */
12220 		skb[i] = dev_alloc_skb(headroom + data_size);
12221 		if (!skb[i]) {
12222 			if (i == 0)
12223 				goto err_skb0;
12224 			else
12225 				goto err_skb1;
12226 		}
12227 
12228 		skb_reserve(skb[i], headroom);
12229 		skb_put(skb[i], data_size);
12230 		skb[i]->protocol = htons(ETH_P_IP);
12231 		skb_reset_network_header(skb[i]);
12232 		skb_set_mac_header(skb[i], -ETH_HLEN);
12233 
12234 		skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
12235 		// skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
12236 	}
12237 
12238 	/* setup shinfo */
12239 	skb_shinfo(skb[0])->gso_size = 1448;
12240 	skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
12241 	skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
12242 	skb_shinfo(skb[0])->gso_segs = 0;
12243 	skb_shinfo(skb[0])->frag_list = skb[1];
12244 	skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000;
12245 
12246 	/* adjust skb[0]'s len */
12247 	skb[0]->len += skb[1]->len;
12248 	skb[0]->data_len += skb[1]->data_len;
12249 	skb[0]->truesize += skb[1]->truesize;
12250 
12251 	return skb[0];
12252 
12253 err_skb1:
12254 	__free_page(page[1]);
12255 err_page1:
12256 	kfree_skb(skb[0]);
12257 err_skb0:
12258 	__free_page(page[0]);
12259 err_page0:
12260 	return NULL;
12261 }
12262 
12263 static __init struct sk_buff *build_test_skb_linear_no_head_frag(void)
12264 {
12265 	unsigned int alloc_size = 2000;
12266 	unsigned int headroom = 102, doffset = 72, data_size = 1308;
12267 	struct sk_buff *skb[2];
12268 	int i;
12269 
12270 	/* skbs linked in a frag_list, both with linear data, with head_frag=0
12271 	 * (data allocated by kmalloc), both have tcp data of 1308 bytes
12272 	 * (total payload is 2616 bytes).
12273 	 * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom.
12274 	 */
12275 	for (i = 0; i < 2; i++) {
12276 		skb[i] = alloc_skb(alloc_size, GFP_KERNEL);
12277 		if (!skb[i]) {
12278 			if (i == 0)
12279 				goto err_skb0;
12280 			else
12281 				goto err_skb1;
12282 		}
12283 
12284 		skb[i]->protocol = htons(ETH_P_IPV6);
12285 		skb_reserve(skb[i], headroom);
12286 		skb_put(skb[i], doffset + data_size);
12287 		skb_reset_network_header(skb[i]);
12288 		if (i == 0)
12289 			skb_reset_mac_header(skb[i]);
12290 		else
12291 			skb_set_mac_header(skb[i], -ETH_HLEN);
12292 		__skb_pull(skb[i], doffset);
12293 	}
12294 
12295 	/* setup shinfo.
12296 	 * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a
12297 	 * reduced gso_size.
12298 	 */
12299 	skb_shinfo(skb[0])->gso_size = 1288;
12300 	skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY;
12301 	skb_shinfo(skb[0])->gso_segs = 0;
12302 	skb_shinfo(skb[0])->frag_list = skb[1];
12303 
12304 	/* adjust skb[0]'s len */
12305 	skb[0]->len += skb[1]->len;
12306 	skb[0]->data_len += skb[1]->len;
12307 	skb[0]->truesize += skb[1]->truesize;
12308 
12309 	return skb[0];
12310 
12311 err_skb1:
12312 	kfree_skb(skb[0]);
12313 err_skb0:
12314 	return NULL;
12315 }
12316 
12317 struct skb_segment_test {
12318 	const char *descr;
12319 	struct sk_buff *(*build_skb)(void);
12320 	netdev_features_t features;
12321 };
12322 
12323 static struct skb_segment_test skb_segment_tests[] __initconst = {
12324 	{
12325 		.descr = "gso_with_rx_frags",
12326 		.build_skb = build_test_skb,
12327 		.features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
12328 			    NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM
12329 	},
12330 	{
12331 		.descr = "gso_linear_no_head_frag",
12332 		.build_skb = build_test_skb_linear_no_head_frag,
12333 		.features = NETIF_F_SG | NETIF_F_FRAGLIST |
12334 			    NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
12335 			    NETIF_F_LLTX_BIT | NETIF_F_GRO |
12336 			    NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
12337 			    NETIF_F_HW_VLAN_STAG_TX_BIT
12338 	}
12339 };
12340 
12341 static __init int test_skb_segment_single(const struct skb_segment_test *test)
12342 {
12343 	struct sk_buff *skb, *segs;
12344 	int ret = -1;
12345 
12346 	skb = test->build_skb();
12347 	if (!skb) {
12348 		pr_info("%s: failed to build_test_skb", __func__);
12349 		goto done;
12350 	}
12351 
12352 	segs = skb_segment(skb, test->features);
12353 	if (!IS_ERR(segs)) {
12354 		kfree_skb_list(segs);
12355 		ret = 0;
12356 	}
12357 	kfree_skb(skb);
12358 done:
12359 	return ret;
12360 }
12361 
12362 static __init int test_skb_segment(void)
12363 {
12364 	int i, err_cnt = 0, pass_cnt = 0;
12365 
12366 	for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
12367 		const struct skb_segment_test *test = &skb_segment_tests[i];
12368 
12369 		pr_info("#%d %s ", i, test->descr);
12370 
12371 		if (test_skb_segment_single(test)) {
12372 			pr_cont("FAIL\n");
12373 			err_cnt++;
12374 		} else {
12375 			pr_cont("PASS\n");
12376 			pass_cnt++;
12377 		}
12378 	}
12379 
12380 	pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__,
12381 		pass_cnt, err_cnt);
12382 	return err_cnt ? -EINVAL : 0;
12383 }
12384 
12385 static __init int test_bpf(void)
12386 {
12387 	int i, err_cnt = 0, pass_cnt = 0;
12388 	int jit_cnt = 0, run_cnt = 0;
12389 
12390 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
12391 		struct bpf_prog *fp;
12392 		int err;
12393 
12394 		cond_resched();
12395 		if (exclude_test(i))
12396 			continue;
12397 
12398 		pr_info("#%d %s ", i, tests[i].descr);
12399 
12400 		if (tests[i].fill_helper &&
12401 		    tests[i].fill_helper(&tests[i]) < 0) {
12402 			pr_cont("FAIL to prog_fill\n");
12403 			continue;
12404 		}
12405 
12406 		fp = generate_filter(i, &err);
12407 
12408 		if (tests[i].fill_helper) {
12409 			kfree(tests[i].u.ptr.insns);
12410 			tests[i].u.ptr.insns = NULL;
12411 		}
12412 
12413 		if (fp == NULL) {
12414 			if (err == 0) {
12415 				pass_cnt++;
12416 				continue;
12417 			}
12418 			err_cnt++;
12419 			continue;
12420 		}
12421 
12422 		pr_cont("jited:%u ", fp->jited);
12423 
12424 		run_cnt++;
12425 		if (fp->jited)
12426 			jit_cnt++;
12427 
12428 		err = run_one(fp, &tests[i]);
12429 		release_filter(fp, i);
12430 
12431 		if (err) {
12432 			pr_cont("FAIL (%d times)\n", err);
12433 			err_cnt++;
12434 		} else {
12435 			pr_cont("PASS\n");
12436 			pass_cnt++;
12437 		}
12438 	}
12439 
12440 	pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
12441 		pass_cnt, err_cnt, jit_cnt, run_cnt);
12442 
12443 	return err_cnt ? -EINVAL : 0;
12444 }
12445 
12446 struct tail_call_test {
12447 	const char *descr;
12448 	struct bpf_insn insns[MAX_INSNS];
12449 	int flags;
12450 	int result;
12451 	int stack_depth;
12452 };
12453 
12454 /* Flags that can be passed to tail call test cases */
12455 #define FLAG_NEED_STATE		BIT(0)
12456 #define FLAG_RESULT_IN_STATE	BIT(1)
12457 
12458 /*
12459  * Magic marker used in test snippets for tail calls below.
12460  * BPF_LD/MOV to R2 and R2 with this immediate value is replaced
12461  * with the proper values by the test runner.
12462  */
12463 #define TAIL_CALL_MARKER 0x7a11ca11
12464 
12465 /* Special offset to indicate a NULL call target */
12466 #define TAIL_CALL_NULL 0x7fff
12467 
12468 /* Special offset to indicate an out-of-range index */
12469 #define TAIL_CALL_INVALID 0x7ffe
12470 
12471 #define TAIL_CALL(offset)			       \
12472 	BPF_LD_IMM64(R2, TAIL_CALL_MARKER),	       \
12473 	BPF_RAW_INSN(BPF_ALU | BPF_MOV | BPF_K, R3, 0, \
12474 		     offset, TAIL_CALL_MARKER),	       \
12475 	BPF_JMP_IMM(BPF_TAIL_CALL, 0, 0, 0)
12476 
12477 /*
12478  * A test function to be called from a BPF program, clobbering a lot of
12479  * CPU registers in the process. A JITed BPF program calling this function
12480  * must save and restore any caller-saved registers it uses for internal
12481  * state, for example the current tail call count.
12482  */
12483 BPF_CALL_1(bpf_test_func, u64, arg)
12484 {
12485 	char buf[64];
12486 	long a = 0;
12487 	long b = 1;
12488 	long c = 2;
12489 	long d = 3;
12490 	long e = 4;
12491 	long f = 5;
12492 	long g = 6;
12493 	long h = 7;
12494 
12495 	return snprintf(buf, sizeof(buf),
12496 			"%ld %lu %lx %ld %lu %lx %ld %lu %x",
12497 			a, b, c, d, e, f, g, h, (int)arg);
12498 }
12499 #define BPF_FUNC_test_func __BPF_FUNC_MAX_ID
12500 
12501 /*
12502  * Tail call tests. Each test case may call any other test in the table,
12503  * including itself, specified as a relative index offset from the calling
12504  * test. The index TAIL_CALL_NULL can be used to specify a NULL target
12505  * function to test the JIT error path. Similarly, the index TAIL_CALL_INVALID
12506  * results in a target index that is out of range.
12507  */
12508 static struct tail_call_test tail_call_tests[] = {
12509 	{
12510 		"Tail call leaf",
12511 		.insns = {
12512 			BPF_ALU64_REG(BPF_MOV, R0, R1),
12513 			BPF_ALU64_IMM(BPF_ADD, R0, 1),
12514 			BPF_EXIT_INSN(),
12515 		},
12516 		.result = 1,
12517 	},
12518 	{
12519 		"Tail call 2",
12520 		.insns = {
12521 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
12522 			TAIL_CALL(-1),
12523 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
12524 			BPF_EXIT_INSN(),
12525 		},
12526 		.result = 3,
12527 	},
12528 	{
12529 		"Tail call 3",
12530 		.insns = {
12531 			BPF_ALU64_IMM(BPF_ADD, R1, 3),
12532 			TAIL_CALL(-1),
12533 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
12534 			BPF_EXIT_INSN(),
12535 		},
12536 		.result = 6,
12537 	},
12538 	{
12539 		"Tail call 4",
12540 		.insns = {
12541 			BPF_ALU64_IMM(BPF_ADD, R1, 4),
12542 			TAIL_CALL(-1),
12543 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
12544 			BPF_EXIT_INSN(),
12545 		},
12546 		.result = 10,
12547 	},
12548 	{
12549 		"Tail call error path, max count reached",
12550 		.insns = {
12551 			BPF_LDX_MEM(BPF_W, R2, R1, 0),
12552 			BPF_ALU64_IMM(BPF_ADD, R2, 1),
12553 			BPF_STX_MEM(BPF_W, R1, R2, 0),
12554 			TAIL_CALL(0),
12555 			BPF_EXIT_INSN(),
12556 		},
12557 		.flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
12558 		.result = (MAX_TAIL_CALL_CNT + 1 + 1) * MAX_TESTRUNS,
12559 	},
12560 	{
12561 		"Tail call count preserved across function calls",
12562 		.insns = {
12563 			BPF_LDX_MEM(BPF_W, R2, R1, 0),
12564 			BPF_ALU64_IMM(BPF_ADD, R2, 1),
12565 			BPF_STX_MEM(BPF_W, R1, R2, 0),
12566 			BPF_STX_MEM(BPF_DW, R10, R1, -8),
12567 			BPF_CALL_REL(BPF_FUNC_get_numa_node_id),
12568 			BPF_CALL_REL(BPF_FUNC_ktime_get_ns),
12569 			BPF_CALL_REL(BPF_FUNC_ktime_get_boot_ns),
12570 			BPF_CALL_REL(BPF_FUNC_ktime_get_coarse_ns),
12571 			BPF_CALL_REL(BPF_FUNC_jiffies64),
12572 			BPF_CALL_REL(BPF_FUNC_test_func),
12573 			BPF_LDX_MEM(BPF_DW, R1, R10, -8),
12574 			BPF_ALU32_REG(BPF_MOV, R0, R1),
12575 			TAIL_CALL(0),
12576 			BPF_EXIT_INSN(),
12577 		},
12578 		.stack_depth = 8,
12579 		.flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
12580 		.result = (MAX_TAIL_CALL_CNT + 1 + 1) * MAX_TESTRUNS,
12581 	},
12582 	{
12583 		"Tail call error path, NULL target",
12584 		.insns = {
12585 			BPF_LDX_MEM(BPF_W, R2, R1, 0),
12586 			BPF_ALU64_IMM(BPF_ADD, R2, 1),
12587 			BPF_STX_MEM(BPF_W, R1, R2, 0),
12588 			TAIL_CALL(TAIL_CALL_NULL),
12589 			BPF_EXIT_INSN(),
12590 		},
12591 		.flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
12592 		.result = MAX_TESTRUNS,
12593 	},
12594 	{
12595 		"Tail call error path, index out of range",
12596 		.insns = {
12597 			BPF_LDX_MEM(BPF_W, R2, R1, 0),
12598 			BPF_ALU64_IMM(BPF_ADD, R2, 1),
12599 			BPF_STX_MEM(BPF_W, R1, R2, 0),
12600 			TAIL_CALL(TAIL_CALL_INVALID),
12601 			BPF_EXIT_INSN(),
12602 		},
12603 		.flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
12604 		.result = MAX_TESTRUNS,
12605 	},
12606 };
12607 
12608 static void __init destroy_tail_call_tests(struct bpf_array *progs)
12609 {
12610 	int i;
12611 
12612 	for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++)
12613 		if (progs->ptrs[i])
12614 			bpf_prog_free(progs->ptrs[i]);
12615 	kfree(progs);
12616 }
12617 
12618 static __init int prepare_tail_call_tests(struct bpf_array **pprogs)
12619 {
12620 	int ntests = ARRAY_SIZE(tail_call_tests);
12621 	struct bpf_array *progs;
12622 	int which, err;
12623 
12624 	/* Allocate the table of programs to be used for tall calls */
12625 	progs = kzalloc(sizeof(*progs) + (ntests + 1) * sizeof(progs->ptrs[0]),
12626 			GFP_KERNEL);
12627 	if (!progs)
12628 		goto out_nomem;
12629 
12630 	/* Create all eBPF programs and populate the table */
12631 	for (which = 0; which < ntests; which++) {
12632 		struct tail_call_test *test = &tail_call_tests[which];
12633 		struct bpf_prog *fp;
12634 		int len, i;
12635 
12636 		/* Compute the number of program instructions */
12637 		for (len = 0; len < MAX_INSNS; len++) {
12638 			struct bpf_insn *insn = &test->insns[len];
12639 
12640 			if (len < MAX_INSNS - 1 &&
12641 			    insn->code == (BPF_LD | BPF_DW | BPF_IMM))
12642 				len++;
12643 			if (insn->code == 0)
12644 				break;
12645 		}
12646 
12647 		/* Allocate and initialize the program */
12648 		fp = bpf_prog_alloc(bpf_prog_size(len), 0);
12649 		if (!fp)
12650 			goto out_nomem;
12651 
12652 		fp->len = len;
12653 		fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
12654 		fp->aux->stack_depth = test->stack_depth;
12655 		memcpy(fp->insnsi, test->insns, len * sizeof(struct bpf_insn));
12656 
12657 		/* Relocate runtime tail call offsets and addresses */
12658 		for (i = 0; i < len; i++) {
12659 			struct bpf_insn *insn = &fp->insnsi[i];
12660 			long addr = 0;
12661 
12662 			switch (insn->code) {
12663 			case BPF_LD | BPF_DW | BPF_IMM:
12664 				if (insn->imm != TAIL_CALL_MARKER)
12665 					break;
12666 				insn[0].imm = (u32)(long)progs;
12667 				insn[1].imm = ((u64)(long)progs) >> 32;
12668 				break;
12669 
12670 			case BPF_ALU | BPF_MOV | BPF_K:
12671 				if (insn->imm != TAIL_CALL_MARKER)
12672 					break;
12673 				if (insn->off == TAIL_CALL_NULL)
12674 					insn->imm = ntests;
12675 				else if (insn->off == TAIL_CALL_INVALID)
12676 					insn->imm = ntests + 1;
12677 				else
12678 					insn->imm = which + insn->off;
12679 				insn->off = 0;
12680 				break;
12681 
12682 			case BPF_JMP | BPF_CALL:
12683 				if (insn->src_reg != BPF_PSEUDO_CALL)
12684 					break;
12685 				switch (insn->imm) {
12686 				case BPF_FUNC_get_numa_node_id:
12687 					addr = (long)&numa_node_id;
12688 					break;
12689 				case BPF_FUNC_ktime_get_ns:
12690 					addr = (long)&ktime_get_ns;
12691 					break;
12692 				case BPF_FUNC_ktime_get_boot_ns:
12693 					addr = (long)&ktime_get_boot_fast_ns;
12694 					break;
12695 				case BPF_FUNC_ktime_get_coarse_ns:
12696 					addr = (long)&ktime_get_coarse_ns;
12697 					break;
12698 				case BPF_FUNC_jiffies64:
12699 					addr = (long)&get_jiffies_64;
12700 					break;
12701 				case BPF_FUNC_test_func:
12702 					addr = (long)&bpf_test_func;
12703 					break;
12704 				default:
12705 					err = -EFAULT;
12706 					goto out_err;
12707 				}
12708 				*insn = BPF_EMIT_CALL(addr);
12709 				if ((long)__bpf_call_base + insn->imm != addr)
12710 					*insn = BPF_JMP_A(0); /* Skip: NOP */
12711 				break;
12712 			}
12713 		}
12714 
12715 		fp = bpf_prog_select_runtime(fp, &err);
12716 		if (err)
12717 			goto out_err;
12718 
12719 		progs->ptrs[which] = fp;
12720 	}
12721 
12722 	/* The last entry contains a NULL program pointer */
12723 	progs->map.max_entries = ntests + 1;
12724 	*pprogs = progs;
12725 	return 0;
12726 
12727 out_nomem:
12728 	err = -ENOMEM;
12729 
12730 out_err:
12731 	if (progs)
12732 		destroy_tail_call_tests(progs);
12733 	return err;
12734 }
12735 
12736 static __init int test_tail_calls(struct bpf_array *progs)
12737 {
12738 	int i, err_cnt = 0, pass_cnt = 0;
12739 	int jit_cnt = 0, run_cnt = 0;
12740 
12741 	for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
12742 		struct tail_call_test *test = &tail_call_tests[i];
12743 		struct bpf_prog *fp = progs->ptrs[i];
12744 		int *data = NULL;
12745 		int state = 0;
12746 		u64 duration;
12747 		int ret;
12748 
12749 		cond_resched();
12750 
12751 		pr_info("#%d %s ", i, test->descr);
12752 		if (!fp) {
12753 			err_cnt++;
12754 			continue;
12755 		}
12756 		pr_cont("jited:%u ", fp->jited);
12757 
12758 		run_cnt++;
12759 		if (fp->jited)
12760 			jit_cnt++;
12761 
12762 		if (test->flags & FLAG_NEED_STATE)
12763 			data = &state;
12764 		ret = __run_one(fp, data, MAX_TESTRUNS, &duration);
12765 		if (test->flags & FLAG_RESULT_IN_STATE)
12766 			ret = state;
12767 		if (ret == test->result) {
12768 			pr_cont("%lld PASS", duration);
12769 			pass_cnt++;
12770 		} else {
12771 			pr_cont("ret %d != %d FAIL", ret, test->result);
12772 			err_cnt++;
12773 		}
12774 	}
12775 
12776 	pr_info("%s: Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
12777 		__func__, pass_cnt, err_cnt, jit_cnt, run_cnt);
12778 
12779 	return err_cnt ? -EINVAL : 0;
12780 }
12781 
12782 static int __init test_bpf_init(void)
12783 {
12784 	struct bpf_array *progs = NULL;
12785 	int ret;
12786 
12787 	ret = prepare_bpf_tests();
12788 	if (ret < 0)
12789 		return ret;
12790 
12791 	ret = test_bpf();
12792 	destroy_bpf_tests();
12793 	if (ret)
12794 		return ret;
12795 
12796 	ret = prepare_tail_call_tests(&progs);
12797 	if (ret)
12798 		return ret;
12799 	ret = test_tail_calls(progs);
12800 	destroy_tail_call_tests(progs);
12801 	if (ret)
12802 		return ret;
12803 
12804 	return test_skb_segment();
12805 }
12806 
12807 static void __exit test_bpf_exit(void)
12808 {
12809 }
12810 
12811 module_init(test_bpf_init);
12812 module_exit(test_bpf_exit);
12813 
12814 MODULE_LICENSE("GPL");
12815