smb: client: Fix minor whitespace errors and warnings
[linux-modified.git] / lib / test_bpf.c
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 #define FLAG_LARGE_MEM          BIT(4)
57
58 enum {
59         CLASSIC  = BIT(6),      /* Old BPF instructions only. */
60         INTERNAL = BIT(7),      /* Extended instruction set.  */
61 };
62
63 #define TEST_TYPE_MASK          (CLASSIC | INTERNAL)
64
65 struct bpf_test {
66         const char *descr;
67         union {
68                 struct sock_filter insns[MAX_INSNS];
69                 struct bpf_insn insns_int[MAX_INSNS];
70                 struct {
71                         void *insns;
72                         unsigned int len;
73                 } ptr;
74         } u;
75         __u8 aux;
76         __u8 data[MAX_DATA];
77         struct {
78                 int data_size;
79                 __u32 result;
80         } test[MAX_SUBTESTS];
81         int (*fill_helper)(struct bpf_test *self);
82         int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
83         __u8 frag_data[MAX_DATA];
84         int stack_depth; /* for eBPF only, since tests don't call verifier */
85         int nr_testruns; /* Custom run count, defaults to MAX_TESTRUNS if 0 */
86 };
87
88 /* Large test cases need separate allocation and fill handler. */
89
90 static int bpf_fill_maxinsns1(struct bpf_test *self)
91 {
92         unsigned int len = BPF_MAXINSNS;
93         struct sock_filter *insn;
94         __u32 k = ~0;
95         int i;
96
97         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
98         if (!insn)
99                 return -ENOMEM;
100
101         for (i = 0; i < len; i++, k--)
102                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
103
104         self->u.ptr.insns = insn;
105         self->u.ptr.len = len;
106
107         return 0;
108 }
109
110 static int bpf_fill_maxinsns2(struct bpf_test *self)
111 {
112         unsigned int len = BPF_MAXINSNS;
113         struct sock_filter *insn;
114         int i;
115
116         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
117         if (!insn)
118                 return -ENOMEM;
119
120         for (i = 0; i < len; i++)
121                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
122
123         self->u.ptr.insns = insn;
124         self->u.ptr.len = len;
125
126         return 0;
127 }
128
129 static int bpf_fill_maxinsns3(struct bpf_test *self)
130 {
131         unsigned int len = BPF_MAXINSNS;
132         struct sock_filter *insn;
133         struct rnd_state rnd;
134         int i;
135
136         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
137         if (!insn)
138                 return -ENOMEM;
139
140         prandom_seed_state(&rnd, 3141592653589793238ULL);
141
142         for (i = 0; i < len - 1; i++) {
143                 __u32 k = prandom_u32_state(&rnd);
144
145                 insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
146         }
147
148         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
149
150         self->u.ptr.insns = insn;
151         self->u.ptr.len = len;
152
153         return 0;
154 }
155
156 static int bpf_fill_maxinsns4(struct bpf_test *self)
157 {
158         unsigned int len = BPF_MAXINSNS + 1;
159         struct sock_filter *insn;
160         int i;
161
162         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
163         if (!insn)
164                 return -ENOMEM;
165
166         for (i = 0; i < len; i++)
167                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
168
169         self->u.ptr.insns = insn;
170         self->u.ptr.len = len;
171
172         return 0;
173 }
174
175 static int bpf_fill_maxinsns5(struct bpf_test *self)
176 {
177         unsigned int len = BPF_MAXINSNS;
178         struct sock_filter *insn;
179         int i;
180
181         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
182         if (!insn)
183                 return -ENOMEM;
184
185         insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
186
187         for (i = 1; i < len - 1; i++)
188                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
189
190         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
191
192         self->u.ptr.insns = insn;
193         self->u.ptr.len = len;
194
195         return 0;
196 }
197
198 static int bpf_fill_maxinsns6(struct bpf_test *self)
199 {
200         unsigned int len = BPF_MAXINSNS;
201         struct sock_filter *insn;
202         int i;
203
204         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
205         if (!insn)
206                 return -ENOMEM;
207
208         for (i = 0; i < len - 1; i++)
209                 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
210                                      SKF_AD_VLAN_TAG_PRESENT);
211
212         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
213
214         self->u.ptr.insns = insn;
215         self->u.ptr.len = len;
216
217         return 0;
218 }
219
220 static int bpf_fill_maxinsns7(struct bpf_test *self)
221 {
222         unsigned int len = BPF_MAXINSNS;
223         struct sock_filter *insn;
224         int i;
225
226         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
227         if (!insn)
228                 return -ENOMEM;
229
230         for (i = 0; i < len - 4; i++)
231                 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
232                                      SKF_AD_CPU);
233
234         insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
235         insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
236                                    SKF_AD_CPU);
237         insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
238         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
239
240         self->u.ptr.insns = insn;
241         self->u.ptr.len = len;
242
243         return 0;
244 }
245
246 static int bpf_fill_maxinsns8(struct bpf_test *self)
247 {
248         unsigned int len = BPF_MAXINSNS;
249         struct sock_filter *insn;
250         int i, jmp_off = len - 3;
251
252         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
253         if (!insn)
254                 return -ENOMEM;
255
256         insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
257
258         for (i = 1; i < len - 1; i++)
259                 insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
260
261         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
262
263         self->u.ptr.insns = insn;
264         self->u.ptr.len = len;
265
266         return 0;
267 }
268
269 static int bpf_fill_maxinsns9(struct bpf_test *self)
270 {
271         unsigned int len = BPF_MAXINSNS;
272         struct bpf_insn *insn;
273         int i;
274
275         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
276         if (!insn)
277                 return -ENOMEM;
278
279         insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
280         insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
281         insn[2] = BPF_EXIT_INSN();
282
283         for (i = 3; i < len - 2; i++)
284                 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
285
286         insn[len - 2] = BPF_EXIT_INSN();
287         insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
288
289         self->u.ptr.insns = insn;
290         self->u.ptr.len = len;
291
292         return 0;
293 }
294
295 static int bpf_fill_maxinsns10(struct bpf_test *self)
296 {
297         unsigned int len = BPF_MAXINSNS, hlen = len - 2;
298         struct bpf_insn *insn;
299         int i;
300
301         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
302         if (!insn)
303                 return -ENOMEM;
304
305         for (i = 0; i < hlen / 2; i++)
306                 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
307         for (i = hlen - 1; i > hlen / 2; i--)
308                 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
309
310         insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
311         insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
312         insn[hlen + 1] = BPF_EXIT_INSN();
313
314         self->u.ptr.insns = insn;
315         self->u.ptr.len = len;
316
317         return 0;
318 }
319
320 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
321                          unsigned int plen)
322 {
323         struct sock_filter *insn;
324         unsigned int rlen;
325         int i, j;
326
327         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
328         if (!insn)
329                 return -ENOMEM;
330
331         rlen = (len % plen) - 1;
332
333         for (i = 0; i + plen < len; i += plen)
334                 for (j = 0; j < plen; j++)
335                         insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
336                                                  plen - 1 - j, 0, 0);
337         for (j = 0; j < rlen; j++)
338                 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
339                                          0, 0);
340
341         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
342
343         self->u.ptr.insns = insn;
344         self->u.ptr.len = len;
345
346         return 0;
347 }
348
349 static int bpf_fill_maxinsns11(struct bpf_test *self)
350 {
351         /* Hits 70 passes on x86_64 and triggers NOPs padding. */
352         return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
353 }
354
355 static int bpf_fill_maxinsns12(struct bpf_test *self)
356 {
357         unsigned int len = BPF_MAXINSNS;
358         struct sock_filter *insn;
359         int i = 0;
360
361         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
362         if (!insn)
363                 return -ENOMEM;
364
365         insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
366
367         for (i = 1; i < len - 1; i++)
368                 insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
369
370         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
371
372         self->u.ptr.insns = insn;
373         self->u.ptr.len = len;
374
375         return 0;
376 }
377
378 static int bpf_fill_maxinsns13(struct bpf_test *self)
379 {
380         unsigned int len = BPF_MAXINSNS;
381         struct sock_filter *insn;
382         int i = 0;
383
384         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
385         if (!insn)
386                 return -ENOMEM;
387
388         for (i = 0; i < len - 3; i++)
389                 insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
390
391         insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
392         insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
393         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
394
395         self->u.ptr.insns = insn;
396         self->u.ptr.len = len;
397
398         return 0;
399 }
400
401 static int bpf_fill_ja(struct bpf_test *self)
402 {
403         /* Hits exactly 11 passes on x86_64 JIT. */
404         return __bpf_fill_ja(self, 12, 9);
405 }
406
407 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
408 {
409         unsigned int len = BPF_MAXINSNS;
410         struct sock_filter *insn;
411         int i;
412
413         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
414         if (!insn)
415                 return -ENOMEM;
416
417         for (i = 0; i < len - 1; i += 2) {
418                 insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
419                 insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
420                                          SKF_AD_OFF + SKF_AD_CPU);
421         }
422
423         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
424
425         self->u.ptr.insns = insn;
426         self->u.ptr.len = len;
427
428         return 0;
429 }
430
431 static int __bpf_fill_stxdw(struct bpf_test *self, int size)
432 {
433         unsigned int len = BPF_MAXINSNS;
434         struct bpf_insn *insn;
435         int i;
436
437         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
438         if (!insn)
439                 return -ENOMEM;
440
441         insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
442         insn[1] = BPF_ST_MEM(size, R10, -40, 42);
443
444         for (i = 2; i < len - 2; i++)
445                 insn[i] = BPF_STX_XADD(size, R10, R0, -40);
446
447         insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
448         insn[len - 1] = BPF_EXIT_INSN();
449
450         self->u.ptr.insns = insn;
451         self->u.ptr.len = len;
452         self->stack_depth = 40;
453
454         return 0;
455 }
456
457 static int bpf_fill_stxw(struct bpf_test *self)
458 {
459         return __bpf_fill_stxdw(self, BPF_W);
460 }
461
462 static int bpf_fill_stxdw(struct bpf_test *self)
463 {
464         return __bpf_fill_stxdw(self, BPF_DW);
465 }
466
467 static int __bpf_ld_imm64(struct bpf_insn insns[2], u8 reg, s64 imm64)
468 {
469         struct bpf_insn tmp[] = {BPF_LD_IMM64(reg, imm64)};
470
471         memcpy(insns, tmp, sizeof(tmp));
472         return 2;
473 }
474
475 /*
476  * Branch conversion tests. Complex operations can expand to a lot
477  * of instructions when JITed. This in turn may cause jump offsets
478  * to overflow the field size of the native instruction, triggering
479  * a branch conversion mechanism in some JITs.
480  */
481 static int __bpf_fill_max_jmp(struct bpf_test *self, int jmp, int imm)
482 {
483         struct bpf_insn *insns;
484         int len = S16_MAX + 5;
485         int i;
486
487         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
488         if (!insns)
489                 return -ENOMEM;
490
491         i = __bpf_ld_imm64(insns, R1, 0x0123456789abcdefULL);
492         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
493         insns[i++] = BPF_JMP_IMM(jmp, R0, imm, S16_MAX);
494         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 2);
495         insns[i++] = BPF_EXIT_INSN();
496
497         while (i < len - 1) {
498                 static const int ops[] = {
499                         BPF_LSH, BPF_RSH, BPF_ARSH, BPF_ADD,
500                         BPF_SUB, BPF_MUL, BPF_DIV, BPF_MOD,
501                 };
502                 int op = ops[(i >> 1) % ARRAY_SIZE(ops)];
503
504                 if (i & 1)
505                         insns[i++] = BPF_ALU32_REG(op, R0, R1);
506                 else
507                         insns[i++] = BPF_ALU64_REG(op, R0, R1);
508         }
509
510         insns[i++] = BPF_EXIT_INSN();
511         self->u.ptr.insns = insns;
512         self->u.ptr.len = len;
513         BUG_ON(i != len);
514
515         return 0;
516 }
517
518 /* Branch taken by runtime decision */
519 static int bpf_fill_max_jmp_taken(struct bpf_test *self)
520 {
521         return __bpf_fill_max_jmp(self, BPF_JEQ, 1);
522 }
523
524 /* Branch not taken by runtime decision */
525 static int bpf_fill_max_jmp_not_taken(struct bpf_test *self)
526 {
527         return __bpf_fill_max_jmp(self, BPF_JEQ, 0);
528 }
529
530 /* Branch always taken, known at JIT time */
531 static int bpf_fill_max_jmp_always_taken(struct bpf_test *self)
532 {
533         return __bpf_fill_max_jmp(self, BPF_JGE, 0);
534 }
535
536 /* Branch never taken, known at JIT time */
537 static int bpf_fill_max_jmp_never_taken(struct bpf_test *self)
538 {
539         return __bpf_fill_max_jmp(self, BPF_JLT, 0);
540 }
541
542 /* ALU result computation used in tests */
543 static bool __bpf_alu_result(u64 *res, u64 v1, u64 v2, u8 op)
544 {
545         *res = 0;
546         switch (op) {
547         case BPF_MOV:
548                 *res = v2;
549                 break;
550         case BPF_AND:
551                 *res = v1 & v2;
552                 break;
553         case BPF_OR:
554                 *res = v1 | v2;
555                 break;
556         case BPF_XOR:
557                 *res = v1 ^ v2;
558                 break;
559         case BPF_LSH:
560                 *res = v1 << v2;
561                 break;
562         case BPF_RSH:
563                 *res = v1 >> v2;
564                 break;
565         case BPF_ARSH:
566                 *res = v1 >> v2;
567                 if (v2 > 0 && v1 > S64_MAX)
568                         *res |= ~0ULL << (64 - v2);
569                 break;
570         case BPF_ADD:
571                 *res = v1 + v2;
572                 break;
573         case BPF_SUB:
574                 *res = v1 - v2;
575                 break;
576         case BPF_MUL:
577                 *res = v1 * v2;
578                 break;
579         case BPF_DIV:
580                 if (v2 == 0)
581                         return false;
582                 *res = div64_u64(v1, v2);
583                 break;
584         case BPF_MOD:
585                 if (v2 == 0)
586                         return false;
587                 div64_u64_rem(v1, v2, res);
588                 break;
589         }
590         return true;
591 }
592
593 /* Test an ALU shift operation for all valid shift values */
594 static int __bpf_fill_alu_shift(struct bpf_test *self, u8 op,
595                                 u8 mode, bool alu32)
596 {
597         static const s64 regs[] = {
598                 0x0123456789abcdefLL, /* dword > 0, word < 0 */
599                 0xfedcba9876543210LL, /* dword < 0, word > 0 */
600                 0xfedcba0198765432LL, /* dword < 0, word < 0 */
601                 0x0123458967abcdefLL, /* dword > 0, word > 0 */
602         };
603         int bits = alu32 ? 32 : 64;
604         int len = (2 + 7 * bits) * ARRAY_SIZE(regs) + 3;
605         struct bpf_insn *insn;
606         int imm, k;
607         int i = 0;
608
609         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
610         if (!insn)
611                 return -ENOMEM;
612
613         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
614
615         for (k = 0; k < ARRAY_SIZE(regs); k++) {
616                 s64 reg = regs[k];
617
618                 i += __bpf_ld_imm64(&insn[i], R3, reg);
619
620                 for (imm = 0; imm < bits; imm++) {
621                         u64 val;
622
623                         /* Perform operation */
624                         insn[i++] = BPF_ALU64_REG(BPF_MOV, R1, R3);
625                         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R2, imm);
626                         if (alu32) {
627                                 if (mode == BPF_K)
628                                         insn[i++] = BPF_ALU32_IMM(op, R1, imm);
629                                 else
630                                         insn[i++] = BPF_ALU32_REG(op, R1, R2);
631
632                                 if (op == BPF_ARSH)
633                                         reg = (s32)reg;
634                                 else
635                                         reg = (u32)reg;
636                                 __bpf_alu_result(&val, reg, imm, op);
637                                 val = (u32)val;
638                         } else {
639                                 if (mode == BPF_K)
640                                         insn[i++] = BPF_ALU64_IMM(op, R1, imm);
641                                 else
642                                         insn[i++] = BPF_ALU64_REG(op, R1, R2);
643                                 __bpf_alu_result(&val, reg, imm, op);
644                         }
645
646                         /*
647                          * When debugging a JIT that fails this test, one
648                          * can write the immediate value to R0 here to find
649                          * out which operand values that fail.
650                          */
651
652                         /* Load reference and check the result */
653                         i += __bpf_ld_imm64(&insn[i], R4, val);
654                         insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R4, 1);
655                         insn[i++] = BPF_EXIT_INSN();
656                 }
657         }
658
659         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
660         insn[i++] = BPF_EXIT_INSN();
661
662         self->u.ptr.insns = insn;
663         self->u.ptr.len = len;
664         BUG_ON(i != len);
665
666         return 0;
667 }
668
669 static int bpf_fill_alu64_lsh_imm(struct bpf_test *self)
670 {
671         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, false);
672 }
673
674 static int bpf_fill_alu64_rsh_imm(struct bpf_test *self)
675 {
676         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, false);
677 }
678
679 static int bpf_fill_alu64_arsh_imm(struct bpf_test *self)
680 {
681         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, false);
682 }
683
684 static int bpf_fill_alu64_lsh_reg(struct bpf_test *self)
685 {
686         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, false);
687 }
688
689 static int bpf_fill_alu64_rsh_reg(struct bpf_test *self)
690 {
691         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, false);
692 }
693
694 static int bpf_fill_alu64_arsh_reg(struct bpf_test *self)
695 {
696         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, false);
697 }
698
699 static int bpf_fill_alu32_lsh_imm(struct bpf_test *self)
700 {
701         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, true);
702 }
703
704 static int bpf_fill_alu32_rsh_imm(struct bpf_test *self)
705 {
706         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, true);
707 }
708
709 static int bpf_fill_alu32_arsh_imm(struct bpf_test *self)
710 {
711         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, true);
712 }
713
714 static int bpf_fill_alu32_lsh_reg(struct bpf_test *self)
715 {
716         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, true);
717 }
718
719 static int bpf_fill_alu32_rsh_reg(struct bpf_test *self)
720 {
721         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, true);
722 }
723
724 static int bpf_fill_alu32_arsh_reg(struct bpf_test *self)
725 {
726         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, true);
727 }
728
729 /*
730  * Test an ALU register shift operation for all valid shift values
731  * for the case when the source and destination are the same.
732  */
733 static int __bpf_fill_alu_shift_same_reg(struct bpf_test *self, u8 op,
734                                          bool alu32)
735 {
736         int bits = alu32 ? 32 : 64;
737         int len = 3 + 6 * bits;
738         struct bpf_insn *insn;
739         int i = 0;
740         u64 val;
741
742         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
743         if (!insn)
744                 return -ENOMEM;
745
746         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
747
748         for (val = 0; val < bits; val++) {
749                 u64 res;
750
751                 /* Perform operation */
752                 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R1, val);
753                 if (alu32)
754                         insn[i++] = BPF_ALU32_REG(op, R1, R1);
755                 else
756                         insn[i++] = BPF_ALU64_REG(op, R1, R1);
757
758                 /* Compute the reference result */
759                 __bpf_alu_result(&res, val, val, op);
760                 if (alu32)
761                         res = (u32)res;
762                 i += __bpf_ld_imm64(&insn[i], R2, res);
763
764                 /* Check the actual result */
765                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
766                 insn[i++] = BPF_EXIT_INSN();
767         }
768
769         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
770         insn[i++] = BPF_EXIT_INSN();
771
772         self->u.ptr.insns = insn;
773         self->u.ptr.len = len;
774         BUG_ON(i != len);
775
776         return 0;
777 }
778
779 static int bpf_fill_alu64_lsh_same_reg(struct bpf_test *self)
780 {
781         return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, false);
782 }
783
784 static int bpf_fill_alu64_rsh_same_reg(struct bpf_test *self)
785 {
786         return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, false);
787 }
788
789 static int bpf_fill_alu64_arsh_same_reg(struct bpf_test *self)
790 {
791         return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, false);
792 }
793
794 static int bpf_fill_alu32_lsh_same_reg(struct bpf_test *self)
795 {
796         return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, true);
797 }
798
799 static int bpf_fill_alu32_rsh_same_reg(struct bpf_test *self)
800 {
801         return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, true);
802 }
803
804 static int bpf_fill_alu32_arsh_same_reg(struct bpf_test *self)
805 {
806         return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, true);
807 }
808
809 /*
810  * Common operand pattern generator for exhaustive power-of-two magnitudes
811  * tests. The block size parameters can be adjusted to increase/reduce the
812  * number of combinatons tested and thereby execution speed and memory
813  * footprint.
814  */
815
816 static inline s64 value(int msb, int delta, int sign)
817 {
818         return sign * (1LL << msb) + delta;
819 }
820
821 static int __bpf_fill_pattern(struct bpf_test *self, void *arg,
822                               int dbits, int sbits, int block1, int block2,
823                               int (*emit)(struct bpf_test*, void*,
824                                           struct bpf_insn*, s64, s64))
825 {
826         static const int sgn[][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
827         struct bpf_insn *insns;
828         int di, si, bt, db, sb;
829         int count, len, k;
830         int extra = 1 + 2;
831         int i = 0;
832
833         /* Total number of iterations for the two pattern */
834         count = (dbits - 1) * (sbits - 1) * block1 * block1 * ARRAY_SIZE(sgn);
835         count += (max(dbits, sbits) - 1) * block2 * block2 * ARRAY_SIZE(sgn);
836
837         /* Compute the maximum number of insns and allocate the buffer */
838         len = extra + count * (*emit)(self, arg, NULL, 0, 0);
839         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
840         if (!insns)
841                 return -ENOMEM;
842
843         /* Add head instruction(s) */
844         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
845
846         /*
847          * Pattern 1: all combinations of power-of-two magnitudes and sign,
848          * and with a block of contiguous values around each magnitude.
849          */
850         for (di = 0; di < dbits - 1; di++)                 /* Dst magnitudes */
851                 for (si = 0; si < sbits - 1; si++)         /* Src magnitudes */
852                         for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */
853                                 for (db = -(block1 / 2);
854                                      db < (block1 + 1) / 2; db++)
855                                         for (sb = -(block1 / 2);
856                                              sb < (block1 + 1) / 2; sb++) {
857                                                 s64 dst, src;
858
859                                                 dst = value(di, db, sgn[k][0]);
860                                                 src = value(si, sb, sgn[k][1]);
861                                                 i += (*emit)(self, arg,
862                                                              &insns[i],
863                                                              dst, src);
864                                         }
865         /*
866          * Pattern 2: all combinations for a larger block of values
867          * for each power-of-two magnitude and sign, where the magnitude is
868          * the same for both operands.
869          */
870         for (bt = 0; bt < max(dbits, sbits) - 1; bt++)        /* Magnitude   */
871                 for (k = 0; k < ARRAY_SIZE(sgn); k++)         /* Sign combos */
872                         for (db = -(block2 / 2); db < (block2 + 1) / 2; db++)
873                                 for (sb = -(block2 / 2);
874                                      sb < (block2 + 1) / 2; sb++) {
875                                         s64 dst, src;
876
877                                         dst = value(bt % dbits, db, sgn[k][0]);
878                                         src = value(bt % sbits, sb, sgn[k][1]);
879                                         i += (*emit)(self, arg, &insns[i],
880                                                      dst, src);
881                                 }
882
883         /* Append tail instructions */
884         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
885         insns[i++] = BPF_EXIT_INSN();
886         BUG_ON(i > len);
887
888         self->u.ptr.insns = insns;
889         self->u.ptr.len = i;
890
891         return 0;
892 }
893
894 /*
895  * Block size parameters used in pattern tests below. une as needed to
896  * increase/reduce the number combinations tested, see following examples.
897  *        block   values per operand MSB
898  * ----------------------------------------
899  *           0     none
900  *           1     (1 << MSB)
901  *           2     (1 << MSB) + [-1, 0]
902  *           3     (1 << MSB) + [-1, 0, 1]
903  */
904 #define PATTERN_BLOCK1 1
905 #define PATTERN_BLOCK2 5
906
907 /* Number of test runs for a pattern test */
908 #define NR_PATTERN_RUNS 1
909
910 /*
911  * Exhaustive tests of ALU operations for all combinations of power-of-two
912  * magnitudes of the operands, both for positive and negative values. The
913  * test is designed to verify e.g. the ALU and ALU64 operations for JITs that
914  * emit different code depending on the magnitude of the immediate value.
915  */
916 static int __bpf_emit_alu64_imm(struct bpf_test *self, void *arg,
917                                 struct bpf_insn *insns, s64 dst, s64 imm)
918 {
919         int op = *(int *)arg;
920         int i = 0;
921         u64 res;
922
923         if (!insns)
924                 return 7;
925
926         if (__bpf_alu_result(&res, dst, (s32)imm, op)) {
927                 i += __bpf_ld_imm64(&insns[i], R1, dst);
928                 i += __bpf_ld_imm64(&insns[i], R3, res);
929                 insns[i++] = BPF_ALU64_IMM(op, R1, imm);
930                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
931                 insns[i++] = BPF_EXIT_INSN();
932         }
933
934         return i;
935 }
936
937 static int __bpf_emit_alu32_imm(struct bpf_test *self, void *arg,
938                                 struct bpf_insn *insns, s64 dst, s64 imm)
939 {
940         int op = *(int *)arg;
941         int i = 0;
942         u64 res;
943
944         if (!insns)
945                 return 7;
946
947         if (__bpf_alu_result(&res, (u32)dst, (u32)imm, op)) {
948                 i += __bpf_ld_imm64(&insns[i], R1, dst);
949                 i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
950                 insns[i++] = BPF_ALU32_IMM(op, R1, imm);
951                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
952                 insns[i++] = BPF_EXIT_INSN();
953         }
954
955         return i;
956 }
957
958 static int __bpf_emit_alu64_reg(struct bpf_test *self, void *arg,
959                                 struct bpf_insn *insns, s64 dst, s64 src)
960 {
961         int op = *(int *)arg;
962         int i = 0;
963         u64 res;
964
965         if (!insns)
966                 return 9;
967
968         if (__bpf_alu_result(&res, dst, src, op)) {
969                 i += __bpf_ld_imm64(&insns[i], R1, dst);
970                 i += __bpf_ld_imm64(&insns[i], R2, src);
971                 i += __bpf_ld_imm64(&insns[i], R3, res);
972                 insns[i++] = BPF_ALU64_REG(op, R1, R2);
973                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
974                 insns[i++] = BPF_EXIT_INSN();
975         }
976
977         return i;
978 }
979
980 static int __bpf_emit_alu32_reg(struct bpf_test *self, void *arg,
981                                 struct bpf_insn *insns, s64 dst, s64 src)
982 {
983         int op = *(int *)arg;
984         int i = 0;
985         u64 res;
986
987         if (!insns)
988                 return 9;
989
990         if (__bpf_alu_result(&res, (u32)dst, (u32)src, op)) {
991                 i += __bpf_ld_imm64(&insns[i], R1, dst);
992                 i += __bpf_ld_imm64(&insns[i], R2, src);
993                 i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
994                 insns[i++] = BPF_ALU32_REG(op, R1, R2);
995                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
996                 insns[i++] = BPF_EXIT_INSN();
997         }
998
999         return i;
1000 }
1001
1002 static int __bpf_fill_alu64_imm(struct bpf_test *self, int op)
1003 {
1004         return __bpf_fill_pattern(self, &op, 64, 32,
1005                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1006                                   &__bpf_emit_alu64_imm);
1007 }
1008
1009 static int __bpf_fill_alu32_imm(struct bpf_test *self, int op)
1010 {
1011         return __bpf_fill_pattern(self, &op, 64, 32,
1012                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1013                                   &__bpf_emit_alu32_imm);
1014 }
1015
1016 static int __bpf_fill_alu64_reg(struct bpf_test *self, int op)
1017 {
1018         return __bpf_fill_pattern(self, &op, 64, 64,
1019                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1020                                   &__bpf_emit_alu64_reg);
1021 }
1022
1023 static int __bpf_fill_alu32_reg(struct bpf_test *self, int op)
1024 {
1025         return __bpf_fill_pattern(self, &op, 64, 64,
1026                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1027                                   &__bpf_emit_alu32_reg);
1028 }
1029
1030 /* ALU64 immediate operations */
1031 static int bpf_fill_alu64_mov_imm(struct bpf_test *self)
1032 {
1033         return __bpf_fill_alu64_imm(self, BPF_MOV);
1034 }
1035
1036 static int bpf_fill_alu64_and_imm(struct bpf_test *self)
1037 {
1038         return __bpf_fill_alu64_imm(self, BPF_AND);
1039 }
1040
1041 static int bpf_fill_alu64_or_imm(struct bpf_test *self)
1042 {
1043         return __bpf_fill_alu64_imm(self, BPF_OR);
1044 }
1045
1046 static int bpf_fill_alu64_xor_imm(struct bpf_test *self)
1047 {
1048         return __bpf_fill_alu64_imm(self, BPF_XOR);
1049 }
1050
1051 static int bpf_fill_alu64_add_imm(struct bpf_test *self)
1052 {
1053         return __bpf_fill_alu64_imm(self, BPF_ADD);
1054 }
1055
1056 static int bpf_fill_alu64_sub_imm(struct bpf_test *self)
1057 {
1058         return __bpf_fill_alu64_imm(self, BPF_SUB);
1059 }
1060
1061 static int bpf_fill_alu64_mul_imm(struct bpf_test *self)
1062 {
1063         return __bpf_fill_alu64_imm(self, BPF_MUL);
1064 }
1065
1066 static int bpf_fill_alu64_div_imm(struct bpf_test *self)
1067 {
1068         return __bpf_fill_alu64_imm(self, BPF_DIV);
1069 }
1070
1071 static int bpf_fill_alu64_mod_imm(struct bpf_test *self)
1072 {
1073         return __bpf_fill_alu64_imm(self, BPF_MOD);
1074 }
1075
1076 /* ALU32 immediate operations */
1077 static int bpf_fill_alu32_mov_imm(struct bpf_test *self)
1078 {
1079         return __bpf_fill_alu32_imm(self, BPF_MOV);
1080 }
1081
1082 static int bpf_fill_alu32_and_imm(struct bpf_test *self)
1083 {
1084         return __bpf_fill_alu32_imm(self, BPF_AND);
1085 }
1086
1087 static int bpf_fill_alu32_or_imm(struct bpf_test *self)
1088 {
1089         return __bpf_fill_alu32_imm(self, BPF_OR);
1090 }
1091
1092 static int bpf_fill_alu32_xor_imm(struct bpf_test *self)
1093 {
1094         return __bpf_fill_alu32_imm(self, BPF_XOR);
1095 }
1096
1097 static int bpf_fill_alu32_add_imm(struct bpf_test *self)
1098 {
1099         return __bpf_fill_alu32_imm(self, BPF_ADD);
1100 }
1101
1102 static int bpf_fill_alu32_sub_imm(struct bpf_test *self)
1103 {
1104         return __bpf_fill_alu32_imm(self, BPF_SUB);
1105 }
1106
1107 static int bpf_fill_alu32_mul_imm(struct bpf_test *self)
1108 {
1109         return __bpf_fill_alu32_imm(self, BPF_MUL);
1110 }
1111
1112 static int bpf_fill_alu32_div_imm(struct bpf_test *self)
1113 {
1114         return __bpf_fill_alu32_imm(self, BPF_DIV);
1115 }
1116
1117 static int bpf_fill_alu32_mod_imm(struct bpf_test *self)
1118 {
1119         return __bpf_fill_alu32_imm(self, BPF_MOD);
1120 }
1121
1122 /* ALU64 register operations */
1123 static int bpf_fill_alu64_mov_reg(struct bpf_test *self)
1124 {
1125         return __bpf_fill_alu64_reg(self, BPF_MOV);
1126 }
1127
1128 static int bpf_fill_alu64_and_reg(struct bpf_test *self)
1129 {
1130         return __bpf_fill_alu64_reg(self, BPF_AND);
1131 }
1132
1133 static int bpf_fill_alu64_or_reg(struct bpf_test *self)
1134 {
1135         return __bpf_fill_alu64_reg(self, BPF_OR);
1136 }
1137
1138 static int bpf_fill_alu64_xor_reg(struct bpf_test *self)
1139 {
1140         return __bpf_fill_alu64_reg(self, BPF_XOR);
1141 }
1142
1143 static int bpf_fill_alu64_add_reg(struct bpf_test *self)
1144 {
1145         return __bpf_fill_alu64_reg(self, BPF_ADD);
1146 }
1147
1148 static int bpf_fill_alu64_sub_reg(struct bpf_test *self)
1149 {
1150         return __bpf_fill_alu64_reg(self, BPF_SUB);
1151 }
1152
1153 static int bpf_fill_alu64_mul_reg(struct bpf_test *self)
1154 {
1155         return __bpf_fill_alu64_reg(self, BPF_MUL);
1156 }
1157
1158 static int bpf_fill_alu64_div_reg(struct bpf_test *self)
1159 {
1160         return __bpf_fill_alu64_reg(self, BPF_DIV);
1161 }
1162
1163 static int bpf_fill_alu64_mod_reg(struct bpf_test *self)
1164 {
1165         return __bpf_fill_alu64_reg(self, BPF_MOD);
1166 }
1167
1168 /* ALU32 register operations */
1169 static int bpf_fill_alu32_mov_reg(struct bpf_test *self)
1170 {
1171         return __bpf_fill_alu32_reg(self, BPF_MOV);
1172 }
1173
1174 static int bpf_fill_alu32_and_reg(struct bpf_test *self)
1175 {
1176         return __bpf_fill_alu32_reg(self, BPF_AND);
1177 }
1178
1179 static int bpf_fill_alu32_or_reg(struct bpf_test *self)
1180 {
1181         return __bpf_fill_alu32_reg(self, BPF_OR);
1182 }
1183
1184 static int bpf_fill_alu32_xor_reg(struct bpf_test *self)
1185 {
1186         return __bpf_fill_alu32_reg(self, BPF_XOR);
1187 }
1188
1189 static int bpf_fill_alu32_add_reg(struct bpf_test *self)
1190 {
1191         return __bpf_fill_alu32_reg(self, BPF_ADD);
1192 }
1193
1194 static int bpf_fill_alu32_sub_reg(struct bpf_test *self)
1195 {
1196         return __bpf_fill_alu32_reg(self, BPF_SUB);
1197 }
1198
1199 static int bpf_fill_alu32_mul_reg(struct bpf_test *self)
1200 {
1201         return __bpf_fill_alu32_reg(self, BPF_MUL);
1202 }
1203
1204 static int bpf_fill_alu32_div_reg(struct bpf_test *self)
1205 {
1206         return __bpf_fill_alu32_reg(self, BPF_DIV);
1207 }
1208
1209 static int bpf_fill_alu32_mod_reg(struct bpf_test *self)
1210 {
1211         return __bpf_fill_alu32_reg(self, BPF_MOD);
1212 }
1213
1214 /*
1215  * Test JITs that implement complex ALU operations as function
1216  * calls, and must re-arrange operands for argument passing.
1217  */
1218 static int __bpf_fill_alu_imm_regs(struct bpf_test *self, u8 op, bool alu32)
1219 {
1220         int len = 2 + 10 * 10;
1221         struct bpf_insn *insns;
1222         u64 dst, res;
1223         int i = 0;
1224         u32 imm;
1225         int rd;
1226
1227         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
1228         if (!insns)
1229                 return -ENOMEM;
1230
1231         /* Operand and result values according to operation */
1232         if (alu32)
1233                 dst = 0x76543210U;
1234         else
1235                 dst = 0x7edcba9876543210ULL;
1236         imm = 0x01234567U;
1237
1238         if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH)
1239                 imm &= 31;
1240
1241         __bpf_alu_result(&res, dst, imm, op);
1242
1243         if (alu32)
1244                 res = (u32)res;
1245
1246         /* Check all operand registers */
1247         for (rd = R0; rd <= R9; rd++) {
1248                 i += __bpf_ld_imm64(&insns[i], rd, dst);
1249
1250                 if (alu32)
1251                         insns[i++] = BPF_ALU32_IMM(op, rd, imm);
1252                 else
1253                         insns[i++] = BPF_ALU64_IMM(op, rd, imm);
1254
1255                 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res, 2);
1256                 insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1257                 insns[i++] = BPF_EXIT_INSN();
1258
1259                 insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32);
1260                 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res >> 32, 2);
1261                 insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1262                 insns[i++] = BPF_EXIT_INSN();
1263         }
1264
1265         insns[i++] = BPF_MOV64_IMM(R0, 1);
1266         insns[i++] = BPF_EXIT_INSN();
1267
1268         self->u.ptr.insns = insns;
1269         self->u.ptr.len = len;
1270         BUG_ON(i != len);
1271
1272         return 0;
1273 }
1274
1275 /* ALU64 K registers */
1276 static int bpf_fill_alu64_mov_imm_regs(struct bpf_test *self)
1277 {
1278         return __bpf_fill_alu_imm_regs(self, BPF_MOV, false);
1279 }
1280
1281 static int bpf_fill_alu64_and_imm_regs(struct bpf_test *self)
1282 {
1283         return __bpf_fill_alu_imm_regs(self, BPF_AND, false);
1284 }
1285
1286 static int bpf_fill_alu64_or_imm_regs(struct bpf_test *self)
1287 {
1288         return __bpf_fill_alu_imm_regs(self, BPF_OR, false);
1289 }
1290
1291 static int bpf_fill_alu64_xor_imm_regs(struct bpf_test *self)
1292 {
1293         return __bpf_fill_alu_imm_regs(self, BPF_XOR, false);
1294 }
1295
1296 static int bpf_fill_alu64_lsh_imm_regs(struct bpf_test *self)
1297 {
1298         return __bpf_fill_alu_imm_regs(self, BPF_LSH, false);
1299 }
1300
1301 static int bpf_fill_alu64_rsh_imm_regs(struct bpf_test *self)
1302 {
1303         return __bpf_fill_alu_imm_regs(self, BPF_RSH, false);
1304 }
1305
1306 static int bpf_fill_alu64_arsh_imm_regs(struct bpf_test *self)
1307 {
1308         return __bpf_fill_alu_imm_regs(self, BPF_ARSH, false);
1309 }
1310
1311 static int bpf_fill_alu64_add_imm_regs(struct bpf_test *self)
1312 {
1313         return __bpf_fill_alu_imm_regs(self, BPF_ADD, false);
1314 }
1315
1316 static int bpf_fill_alu64_sub_imm_regs(struct bpf_test *self)
1317 {
1318         return __bpf_fill_alu_imm_regs(self, BPF_SUB, false);
1319 }
1320
1321 static int bpf_fill_alu64_mul_imm_regs(struct bpf_test *self)
1322 {
1323         return __bpf_fill_alu_imm_regs(self, BPF_MUL, false);
1324 }
1325
1326 static int bpf_fill_alu64_div_imm_regs(struct bpf_test *self)
1327 {
1328         return __bpf_fill_alu_imm_regs(self, BPF_DIV, false);
1329 }
1330
1331 static int bpf_fill_alu64_mod_imm_regs(struct bpf_test *self)
1332 {
1333         return __bpf_fill_alu_imm_regs(self, BPF_MOD, false);
1334 }
1335
1336 /* ALU32 K registers */
1337 static int bpf_fill_alu32_mov_imm_regs(struct bpf_test *self)
1338 {
1339         return __bpf_fill_alu_imm_regs(self, BPF_MOV, true);
1340 }
1341
1342 static int bpf_fill_alu32_and_imm_regs(struct bpf_test *self)
1343 {
1344         return __bpf_fill_alu_imm_regs(self, BPF_AND, true);
1345 }
1346
1347 static int bpf_fill_alu32_or_imm_regs(struct bpf_test *self)
1348 {
1349         return __bpf_fill_alu_imm_regs(self, BPF_OR, true);
1350 }
1351
1352 static int bpf_fill_alu32_xor_imm_regs(struct bpf_test *self)
1353 {
1354         return __bpf_fill_alu_imm_regs(self, BPF_XOR, true);
1355 }
1356
1357 static int bpf_fill_alu32_lsh_imm_regs(struct bpf_test *self)
1358 {
1359         return __bpf_fill_alu_imm_regs(self, BPF_LSH, true);
1360 }
1361
1362 static int bpf_fill_alu32_rsh_imm_regs(struct bpf_test *self)
1363 {
1364         return __bpf_fill_alu_imm_regs(self, BPF_RSH, true);
1365 }
1366
1367 static int bpf_fill_alu32_arsh_imm_regs(struct bpf_test *self)
1368 {
1369         return __bpf_fill_alu_imm_regs(self, BPF_ARSH, true);
1370 }
1371
1372 static int bpf_fill_alu32_add_imm_regs(struct bpf_test *self)
1373 {
1374         return __bpf_fill_alu_imm_regs(self, BPF_ADD, true);
1375 }
1376
1377 static int bpf_fill_alu32_sub_imm_regs(struct bpf_test *self)
1378 {
1379         return __bpf_fill_alu_imm_regs(self, BPF_SUB, true);
1380 }
1381
1382 static int bpf_fill_alu32_mul_imm_regs(struct bpf_test *self)
1383 {
1384         return __bpf_fill_alu_imm_regs(self, BPF_MUL, true);
1385 }
1386
1387 static int bpf_fill_alu32_div_imm_regs(struct bpf_test *self)
1388 {
1389         return __bpf_fill_alu_imm_regs(self, BPF_DIV, true);
1390 }
1391
1392 static int bpf_fill_alu32_mod_imm_regs(struct bpf_test *self)
1393 {
1394         return __bpf_fill_alu_imm_regs(self, BPF_MOD, true);
1395 }
1396
1397 /*
1398  * Test JITs that implement complex ALU operations as function
1399  * calls, and must re-arrange operands for argument passing.
1400  */
1401 static int __bpf_fill_alu_reg_pairs(struct bpf_test *self, u8 op, bool alu32)
1402 {
1403         int len = 2 + 10 * 10 * 12;
1404         u64 dst, src, res, same;
1405         struct bpf_insn *insns;
1406         int rd, rs;
1407         int i = 0;
1408
1409         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
1410         if (!insns)
1411                 return -ENOMEM;
1412
1413         /* Operand and result values according to operation */
1414         if (alu32) {
1415                 dst = 0x76543210U;
1416                 src = 0x01234567U;
1417         } else {
1418                 dst = 0x7edcba9876543210ULL;
1419                 src = 0x0123456789abcdefULL;
1420         }
1421
1422         if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH)
1423                 src &= 31;
1424
1425         __bpf_alu_result(&res, dst, src, op);
1426         __bpf_alu_result(&same, src, src, op);
1427
1428         if (alu32) {
1429                 res = (u32)res;
1430                 same = (u32)same;
1431         }
1432
1433         /* Check all combinations of operand registers */
1434         for (rd = R0; rd <= R9; rd++) {
1435                 for (rs = R0; rs <= R9; rs++) {
1436                         u64 val = rd == rs ? same : res;
1437
1438                         i += __bpf_ld_imm64(&insns[i], rd, dst);
1439                         i += __bpf_ld_imm64(&insns[i], rs, src);
1440
1441                         if (alu32)
1442                                 insns[i++] = BPF_ALU32_REG(op, rd, rs);
1443                         else
1444                                 insns[i++] = BPF_ALU64_REG(op, rd, rs);
1445
1446                         insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val, 2);
1447                         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1448                         insns[i++] = BPF_EXIT_INSN();
1449
1450                         insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32);
1451                         insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val >> 32, 2);
1452                         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1453                         insns[i++] = BPF_EXIT_INSN();
1454                 }
1455         }
1456
1457         insns[i++] = BPF_MOV64_IMM(R0, 1);
1458         insns[i++] = BPF_EXIT_INSN();
1459
1460         self->u.ptr.insns = insns;
1461         self->u.ptr.len = len;
1462         BUG_ON(i != len);
1463
1464         return 0;
1465 }
1466
1467 /* ALU64 X register combinations */
1468 static int bpf_fill_alu64_mov_reg_pairs(struct bpf_test *self)
1469 {
1470         return __bpf_fill_alu_reg_pairs(self, BPF_MOV, false);
1471 }
1472
1473 static int bpf_fill_alu64_and_reg_pairs(struct bpf_test *self)
1474 {
1475         return __bpf_fill_alu_reg_pairs(self, BPF_AND, false);
1476 }
1477
1478 static int bpf_fill_alu64_or_reg_pairs(struct bpf_test *self)
1479 {
1480         return __bpf_fill_alu_reg_pairs(self, BPF_OR, false);
1481 }
1482
1483 static int bpf_fill_alu64_xor_reg_pairs(struct bpf_test *self)
1484 {
1485         return __bpf_fill_alu_reg_pairs(self, BPF_XOR, false);
1486 }
1487
1488 static int bpf_fill_alu64_lsh_reg_pairs(struct bpf_test *self)
1489 {
1490         return __bpf_fill_alu_reg_pairs(self, BPF_LSH, false);
1491 }
1492
1493 static int bpf_fill_alu64_rsh_reg_pairs(struct bpf_test *self)
1494 {
1495         return __bpf_fill_alu_reg_pairs(self, BPF_RSH, false);
1496 }
1497
1498 static int bpf_fill_alu64_arsh_reg_pairs(struct bpf_test *self)
1499 {
1500         return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, false);
1501 }
1502
1503 static int bpf_fill_alu64_add_reg_pairs(struct bpf_test *self)
1504 {
1505         return __bpf_fill_alu_reg_pairs(self, BPF_ADD, false);
1506 }
1507
1508 static int bpf_fill_alu64_sub_reg_pairs(struct bpf_test *self)
1509 {
1510         return __bpf_fill_alu_reg_pairs(self, BPF_SUB, false);
1511 }
1512
1513 static int bpf_fill_alu64_mul_reg_pairs(struct bpf_test *self)
1514 {
1515         return __bpf_fill_alu_reg_pairs(self, BPF_MUL, false);
1516 }
1517
1518 static int bpf_fill_alu64_div_reg_pairs(struct bpf_test *self)
1519 {
1520         return __bpf_fill_alu_reg_pairs(self, BPF_DIV, false);
1521 }
1522
1523 static int bpf_fill_alu64_mod_reg_pairs(struct bpf_test *self)
1524 {
1525         return __bpf_fill_alu_reg_pairs(self, BPF_MOD, false);
1526 }
1527
1528 /* ALU32 X register combinations */
1529 static int bpf_fill_alu32_mov_reg_pairs(struct bpf_test *self)
1530 {
1531         return __bpf_fill_alu_reg_pairs(self, BPF_MOV, true);
1532 }
1533
1534 static int bpf_fill_alu32_and_reg_pairs(struct bpf_test *self)
1535 {
1536         return __bpf_fill_alu_reg_pairs(self, BPF_AND, true);
1537 }
1538
1539 static int bpf_fill_alu32_or_reg_pairs(struct bpf_test *self)
1540 {
1541         return __bpf_fill_alu_reg_pairs(self, BPF_OR, true);
1542 }
1543
1544 static int bpf_fill_alu32_xor_reg_pairs(struct bpf_test *self)
1545 {
1546         return __bpf_fill_alu_reg_pairs(self, BPF_XOR, true);
1547 }
1548
1549 static int bpf_fill_alu32_lsh_reg_pairs(struct bpf_test *self)
1550 {
1551         return __bpf_fill_alu_reg_pairs(self, BPF_LSH, true);
1552 }
1553
1554 static int bpf_fill_alu32_rsh_reg_pairs(struct bpf_test *self)
1555 {
1556         return __bpf_fill_alu_reg_pairs(self, BPF_RSH, true);
1557 }
1558
1559 static int bpf_fill_alu32_arsh_reg_pairs(struct bpf_test *self)
1560 {
1561         return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, true);
1562 }
1563
1564 static int bpf_fill_alu32_add_reg_pairs(struct bpf_test *self)
1565 {
1566         return __bpf_fill_alu_reg_pairs(self, BPF_ADD, true);
1567 }
1568
1569 static int bpf_fill_alu32_sub_reg_pairs(struct bpf_test *self)
1570 {
1571         return __bpf_fill_alu_reg_pairs(self, BPF_SUB, true);
1572 }
1573
1574 static int bpf_fill_alu32_mul_reg_pairs(struct bpf_test *self)
1575 {
1576         return __bpf_fill_alu_reg_pairs(self, BPF_MUL, true);
1577 }
1578
1579 static int bpf_fill_alu32_div_reg_pairs(struct bpf_test *self)
1580 {
1581         return __bpf_fill_alu_reg_pairs(self, BPF_DIV, true);
1582 }
1583
1584 static int bpf_fill_alu32_mod_reg_pairs(struct bpf_test *self)
1585 {
1586         return __bpf_fill_alu_reg_pairs(self, BPF_MOD, true);
1587 }
1588
1589 /*
1590  * Exhaustive tests of atomic operations for all power-of-two operand
1591  * magnitudes, both for positive and negative values.
1592  */
1593
1594 static int __bpf_emit_atomic64(struct bpf_test *self, void *arg,
1595                                struct bpf_insn *insns, s64 dst, s64 src)
1596 {
1597         int op = *(int *)arg;
1598         u64 keep, fetch, res;
1599         int i = 0;
1600
1601         if (!insns)
1602                 return 21;
1603
1604         switch (op) {
1605         case BPF_XCHG:
1606                 res = src;
1607                 break;
1608         default:
1609                 __bpf_alu_result(&res, dst, src, BPF_OP(op));
1610         }
1611
1612         keep = 0x0123456789abcdefULL;
1613         if (op & BPF_FETCH)
1614                 fetch = dst;
1615         else
1616                 fetch = src;
1617
1618         i += __bpf_ld_imm64(&insns[i], R0, keep);
1619         i += __bpf_ld_imm64(&insns[i], R1, dst);
1620         i += __bpf_ld_imm64(&insns[i], R2, src);
1621         i += __bpf_ld_imm64(&insns[i], R3, res);
1622         i += __bpf_ld_imm64(&insns[i], R4, fetch);
1623         i += __bpf_ld_imm64(&insns[i], R5, keep);
1624
1625         insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8);
1626         insns[i++] = BPF_ATOMIC_OP(BPF_DW, op, R10, R2, -8);
1627         insns[i++] = BPF_LDX_MEM(BPF_DW, R1, R10, -8);
1628
1629         insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
1630         insns[i++] = BPF_EXIT_INSN();
1631
1632         insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1);
1633         insns[i++] = BPF_EXIT_INSN();
1634
1635         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1);
1636         insns[i++] = BPF_EXIT_INSN();
1637
1638         return i;
1639 }
1640
1641 static int __bpf_emit_atomic32(struct bpf_test *self, void *arg,
1642                                struct bpf_insn *insns, s64 dst, s64 src)
1643 {
1644         int op = *(int *)arg;
1645         u64 keep, fetch, res;
1646         int i = 0;
1647
1648         if (!insns)
1649                 return 21;
1650
1651         switch (op) {
1652         case BPF_XCHG:
1653                 res = src;
1654                 break;
1655         default:
1656                 __bpf_alu_result(&res, (u32)dst, (u32)src, BPF_OP(op));
1657         }
1658
1659         keep = 0x0123456789abcdefULL;
1660         if (op & BPF_FETCH)
1661                 fetch = (u32)dst;
1662         else
1663                 fetch = src;
1664
1665         i += __bpf_ld_imm64(&insns[i], R0, keep);
1666         i += __bpf_ld_imm64(&insns[i], R1, (u32)dst);
1667         i += __bpf_ld_imm64(&insns[i], R2, src);
1668         i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
1669         i += __bpf_ld_imm64(&insns[i], R4, fetch);
1670         i += __bpf_ld_imm64(&insns[i], R5, keep);
1671
1672         insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4);
1673         insns[i++] = BPF_ATOMIC_OP(BPF_W, op, R10, R2, -4);
1674         insns[i++] = BPF_LDX_MEM(BPF_W, R1, R10, -4);
1675
1676         insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
1677         insns[i++] = BPF_EXIT_INSN();
1678
1679         insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1);
1680         insns[i++] = BPF_EXIT_INSN();
1681
1682         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1);
1683         insns[i++] = BPF_EXIT_INSN();
1684
1685         return i;
1686 }
1687
1688 static int __bpf_emit_cmpxchg64(struct bpf_test *self, void *arg,
1689                                 struct bpf_insn *insns, s64 dst, s64 src)
1690 {
1691         int i = 0;
1692
1693         if (!insns)
1694                 return 23;
1695
1696         i += __bpf_ld_imm64(&insns[i], R0, ~dst);
1697         i += __bpf_ld_imm64(&insns[i], R1, dst);
1698         i += __bpf_ld_imm64(&insns[i], R2, src);
1699
1700         /* Result unsuccessful */
1701         insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8);
1702         insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8);
1703         insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8);
1704
1705         insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 2);
1706         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1707         insns[i++] = BPF_EXIT_INSN();
1708
1709         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2);
1710         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1711         insns[i++] = BPF_EXIT_INSN();
1712
1713         /* Result successful */
1714         insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8);
1715         insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8);
1716
1717         insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R3, 2);
1718         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1719         insns[i++] = BPF_EXIT_INSN();
1720
1721         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
1722         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1723         insns[i++] = BPF_EXIT_INSN();
1724
1725         return i;
1726 }
1727
1728 static int __bpf_emit_cmpxchg32(struct bpf_test *self, void *arg,
1729                                 struct bpf_insn *insns, s64 dst, s64 src)
1730 {
1731         int i = 0;
1732
1733         if (!insns)
1734                 return 27;
1735
1736         i += __bpf_ld_imm64(&insns[i], R0, ~dst);
1737         i += __bpf_ld_imm64(&insns[i], R1, (u32)dst);
1738         i += __bpf_ld_imm64(&insns[i], R2, src);
1739
1740         /* Result unsuccessful */
1741         insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4);
1742         insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4);
1743         insns[i++] = BPF_ZEXT_REG(R0), /* Zext always inserted by verifier */
1744         insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4);
1745
1746         insns[i++] = BPF_JMP32_REG(BPF_JEQ, R1, R3, 2);
1747         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1748         insns[i++] = BPF_EXIT_INSN();
1749
1750         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2);
1751         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1752         insns[i++] = BPF_EXIT_INSN();
1753
1754         /* Result successful */
1755         i += __bpf_ld_imm64(&insns[i], R0, dst);
1756         insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4);
1757         insns[i++] = BPF_ZEXT_REG(R0), /* Zext always inserted by verifier */
1758         insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4);
1759
1760         insns[i++] = BPF_JMP32_REG(BPF_JEQ, R2, R3, 2);
1761         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1762         insns[i++] = BPF_EXIT_INSN();
1763
1764         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
1765         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1766         insns[i++] = BPF_EXIT_INSN();
1767
1768         return i;
1769 }
1770
1771 static int __bpf_fill_atomic64(struct bpf_test *self, int op)
1772 {
1773         return __bpf_fill_pattern(self, &op, 64, 64,
1774                                   0, PATTERN_BLOCK2,
1775                                   &__bpf_emit_atomic64);
1776 }
1777
1778 static int __bpf_fill_atomic32(struct bpf_test *self, int op)
1779 {
1780         return __bpf_fill_pattern(self, &op, 64, 64,
1781                                   0, PATTERN_BLOCK2,
1782                                   &__bpf_emit_atomic32);
1783 }
1784
1785 /* 64-bit atomic operations */
1786 static int bpf_fill_atomic64_add(struct bpf_test *self)
1787 {
1788         return __bpf_fill_atomic64(self, BPF_ADD);
1789 }
1790
1791 static int bpf_fill_atomic64_and(struct bpf_test *self)
1792 {
1793         return __bpf_fill_atomic64(self, BPF_AND);
1794 }
1795
1796 static int bpf_fill_atomic64_or(struct bpf_test *self)
1797 {
1798         return __bpf_fill_atomic64(self, BPF_OR);
1799 }
1800
1801 static int bpf_fill_atomic64_xor(struct bpf_test *self)
1802 {
1803         return __bpf_fill_atomic64(self, BPF_XOR);
1804 }
1805
1806 static int bpf_fill_atomic64_add_fetch(struct bpf_test *self)
1807 {
1808         return __bpf_fill_atomic64(self, BPF_ADD | BPF_FETCH);
1809 }
1810
1811 static int bpf_fill_atomic64_and_fetch(struct bpf_test *self)
1812 {
1813         return __bpf_fill_atomic64(self, BPF_AND | BPF_FETCH);
1814 }
1815
1816 static int bpf_fill_atomic64_or_fetch(struct bpf_test *self)
1817 {
1818         return __bpf_fill_atomic64(self, BPF_OR | BPF_FETCH);
1819 }
1820
1821 static int bpf_fill_atomic64_xor_fetch(struct bpf_test *self)
1822 {
1823         return __bpf_fill_atomic64(self, BPF_XOR | BPF_FETCH);
1824 }
1825
1826 static int bpf_fill_atomic64_xchg(struct bpf_test *self)
1827 {
1828         return __bpf_fill_atomic64(self, BPF_XCHG);
1829 }
1830
1831 static int bpf_fill_cmpxchg64(struct bpf_test *self)
1832 {
1833         return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2,
1834                                   &__bpf_emit_cmpxchg64);
1835 }
1836
1837 /* 32-bit atomic operations */
1838 static int bpf_fill_atomic32_add(struct bpf_test *self)
1839 {
1840         return __bpf_fill_atomic32(self, BPF_ADD);
1841 }
1842
1843 static int bpf_fill_atomic32_and(struct bpf_test *self)
1844 {
1845         return __bpf_fill_atomic32(self, BPF_AND);
1846 }
1847
1848 static int bpf_fill_atomic32_or(struct bpf_test *self)
1849 {
1850         return __bpf_fill_atomic32(self, BPF_OR);
1851 }
1852
1853 static int bpf_fill_atomic32_xor(struct bpf_test *self)
1854 {
1855         return __bpf_fill_atomic32(self, BPF_XOR);
1856 }
1857
1858 static int bpf_fill_atomic32_add_fetch(struct bpf_test *self)
1859 {
1860         return __bpf_fill_atomic32(self, BPF_ADD | BPF_FETCH);
1861 }
1862
1863 static int bpf_fill_atomic32_and_fetch(struct bpf_test *self)
1864 {
1865         return __bpf_fill_atomic32(self, BPF_AND | BPF_FETCH);
1866 }
1867
1868 static int bpf_fill_atomic32_or_fetch(struct bpf_test *self)
1869 {
1870         return __bpf_fill_atomic32(self, BPF_OR | BPF_FETCH);
1871 }
1872
1873 static int bpf_fill_atomic32_xor_fetch(struct bpf_test *self)
1874 {
1875         return __bpf_fill_atomic32(self, BPF_XOR | BPF_FETCH);
1876 }
1877
1878 static int bpf_fill_atomic32_xchg(struct bpf_test *self)
1879 {
1880         return __bpf_fill_atomic32(self, BPF_XCHG);
1881 }
1882
1883 static int bpf_fill_cmpxchg32(struct bpf_test *self)
1884 {
1885         return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2,
1886                                   &__bpf_emit_cmpxchg32);
1887 }
1888
1889 /*
1890  * Test JITs that implement ATOMIC operations as function calls or
1891  * other primitives, and must re-arrange operands for argument passing.
1892  */
1893 static int __bpf_fill_atomic_reg_pairs(struct bpf_test *self, u8 width, u8 op)
1894 {
1895         struct bpf_insn *insn;
1896         int len = 2 + 34 * 10 * 10;
1897         u64 mem, upd, res;
1898         int rd, rs, i = 0;
1899
1900         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
1901         if (!insn)
1902                 return -ENOMEM;
1903
1904         /* Operand and memory values */
1905         if (width == BPF_DW) {
1906                 mem = 0x0123456789abcdefULL;
1907                 upd = 0xfedcba9876543210ULL;
1908         } else { /* BPF_W */
1909                 mem = 0x01234567U;
1910                 upd = 0x76543210U;
1911         }
1912
1913         /* Memory updated according to operation */
1914         switch (op) {
1915         case BPF_XCHG:
1916                 res = upd;
1917                 break;
1918         case BPF_CMPXCHG:
1919                 res = mem;
1920                 break;
1921         default:
1922                 __bpf_alu_result(&res, mem, upd, BPF_OP(op));
1923         }
1924
1925         /* Test all operand registers */
1926         for (rd = R0; rd <= R9; rd++) {
1927                 for (rs = R0; rs <= R9; rs++) {
1928                         u64 cmp, src;
1929
1930                         /* Initialize value in memory */
1931                         i += __bpf_ld_imm64(&insn[i], R0, mem);
1932                         insn[i++] = BPF_STX_MEM(width, R10, R0, -8);
1933
1934                         /* Initialize registers in order */
1935                         i += __bpf_ld_imm64(&insn[i], R0, ~mem);
1936                         i += __bpf_ld_imm64(&insn[i], rs, upd);
1937                         insn[i++] = BPF_MOV64_REG(rd, R10);
1938
1939                         /* Perform atomic operation */
1940                         insn[i++] = BPF_ATOMIC_OP(width, op, rd, rs, -8);
1941                         if (op == BPF_CMPXCHG && width == BPF_W)
1942                                 insn[i++] = BPF_ZEXT_REG(R0);
1943
1944                         /* Check R0 register value */
1945                         if (op == BPF_CMPXCHG)
1946                                 cmp = mem;  /* Expect value from memory */
1947                         else if (R0 == rd || R0 == rs)
1948                                 cmp = 0;    /* Aliased, checked below */
1949                         else
1950                                 cmp = ~mem; /* Expect value to be preserved */
1951                         if (cmp) {
1952                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0,
1953                                                            (u32)cmp, 2);
1954                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1955                                 insn[i++] = BPF_EXIT_INSN();
1956                                 insn[i++] = BPF_ALU64_IMM(BPF_RSH, R0, 32);
1957                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0,
1958                                                            cmp >> 32, 2);
1959                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1960                                 insn[i++] = BPF_EXIT_INSN();
1961                         }
1962
1963                         /* Check source register value */
1964                         if (rs == R0 && op == BPF_CMPXCHG)
1965                                 src = 0;   /* Aliased with R0, checked above */
1966                         else if (rs == rd && (op == BPF_CMPXCHG ||
1967                                               !(op & BPF_FETCH)))
1968                                 src = 0;   /* Aliased with rd, checked below */
1969                         else if (op == BPF_CMPXCHG)
1970                                 src = upd; /* Expect value to be preserved */
1971                         else if (op & BPF_FETCH)
1972                                 src = mem; /* Expect fetched value from mem */
1973                         else /* no fetch */
1974                                 src = upd; /* Expect value to be preserved */
1975                         if (src) {
1976                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs,
1977                                                            (u32)src, 2);
1978                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1979                                 insn[i++] = BPF_EXIT_INSN();
1980                                 insn[i++] = BPF_ALU64_IMM(BPF_RSH, rs, 32);
1981                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs,
1982                                                            src >> 32, 2);
1983                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1984                                 insn[i++] = BPF_EXIT_INSN();
1985                         }
1986
1987                         /* Check destination register value */
1988                         if (!(rd == R0 && op == BPF_CMPXCHG) &&
1989                             !(rd == rs && (op & BPF_FETCH))) {
1990                                 insn[i++] = BPF_JMP_REG(BPF_JEQ, rd, R10, 2);
1991                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1992                                 insn[i++] = BPF_EXIT_INSN();
1993                         }
1994
1995                         /* Check value in memory */
1996                         if (rs != rd) {                  /* No aliasing */
1997                                 i += __bpf_ld_imm64(&insn[i], R1, res);
1998                         } else if (op == BPF_XCHG) {     /* Aliased, XCHG */
1999                                 insn[i++] = BPF_MOV64_REG(R1, R10);
2000                         } else if (op == BPF_CMPXCHG) {  /* Aliased, CMPXCHG */
2001                                 i += __bpf_ld_imm64(&insn[i], R1, mem);
2002                         } else {                        /* Aliased, ALU oper */
2003                                 i += __bpf_ld_imm64(&insn[i], R1, mem);
2004                                 insn[i++] = BPF_ALU64_REG(BPF_OP(op), R1, R10);
2005                         }
2006
2007                         insn[i++] = BPF_LDX_MEM(width, R0, R10, -8);
2008                         if (width == BPF_DW)
2009                                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
2010                         else /* width == BPF_W */
2011                                 insn[i++] = BPF_JMP32_REG(BPF_JEQ, R0, R1, 2);
2012                         insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
2013                         insn[i++] = BPF_EXIT_INSN();
2014                 }
2015         }
2016
2017         insn[i++] = BPF_MOV64_IMM(R0, 1);
2018         insn[i++] = BPF_EXIT_INSN();
2019
2020         self->u.ptr.insns = insn;
2021         self->u.ptr.len = i;
2022         BUG_ON(i > len);
2023
2024         return 0;
2025 }
2026
2027 /* 64-bit atomic register tests */
2028 static int bpf_fill_atomic64_add_reg_pairs(struct bpf_test *self)
2029 {
2030         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD);
2031 }
2032
2033 static int bpf_fill_atomic64_and_reg_pairs(struct bpf_test *self)
2034 {
2035         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND);
2036 }
2037
2038 static int bpf_fill_atomic64_or_reg_pairs(struct bpf_test *self)
2039 {
2040         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR);
2041 }
2042
2043 static int bpf_fill_atomic64_xor_reg_pairs(struct bpf_test *self)
2044 {
2045         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR);
2046 }
2047
2048 static int bpf_fill_atomic64_add_fetch_reg_pairs(struct bpf_test *self)
2049 {
2050         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD | BPF_FETCH);
2051 }
2052
2053 static int bpf_fill_atomic64_and_fetch_reg_pairs(struct bpf_test *self)
2054 {
2055         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND | BPF_FETCH);
2056 }
2057
2058 static int bpf_fill_atomic64_or_fetch_reg_pairs(struct bpf_test *self)
2059 {
2060         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR | BPF_FETCH);
2061 }
2062
2063 static int bpf_fill_atomic64_xor_fetch_reg_pairs(struct bpf_test *self)
2064 {
2065         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR | BPF_FETCH);
2066 }
2067
2068 static int bpf_fill_atomic64_xchg_reg_pairs(struct bpf_test *self)
2069 {
2070         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XCHG);
2071 }
2072
2073 static int bpf_fill_atomic64_cmpxchg_reg_pairs(struct bpf_test *self)
2074 {
2075         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_CMPXCHG);
2076 }
2077
2078 /* 32-bit atomic register tests */
2079 static int bpf_fill_atomic32_add_reg_pairs(struct bpf_test *self)
2080 {
2081         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD);
2082 }
2083
2084 static int bpf_fill_atomic32_and_reg_pairs(struct bpf_test *self)
2085 {
2086         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND);
2087 }
2088
2089 static int bpf_fill_atomic32_or_reg_pairs(struct bpf_test *self)
2090 {
2091         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR);
2092 }
2093
2094 static int bpf_fill_atomic32_xor_reg_pairs(struct bpf_test *self)
2095 {
2096         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR);
2097 }
2098
2099 static int bpf_fill_atomic32_add_fetch_reg_pairs(struct bpf_test *self)
2100 {
2101         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD | BPF_FETCH);
2102 }
2103
2104 static int bpf_fill_atomic32_and_fetch_reg_pairs(struct bpf_test *self)
2105 {
2106         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND | BPF_FETCH);
2107 }
2108
2109 static int bpf_fill_atomic32_or_fetch_reg_pairs(struct bpf_test *self)
2110 {
2111         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR | BPF_FETCH);
2112 }
2113
2114 static int bpf_fill_atomic32_xor_fetch_reg_pairs(struct bpf_test *self)
2115 {
2116         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR | BPF_FETCH);
2117 }
2118
2119 static int bpf_fill_atomic32_xchg_reg_pairs(struct bpf_test *self)
2120 {
2121         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XCHG);
2122 }
2123
2124 static int bpf_fill_atomic32_cmpxchg_reg_pairs(struct bpf_test *self)
2125 {
2126         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_CMPXCHG);
2127 }
2128
2129 /*
2130  * Test the two-instruction 64-bit immediate load operation for all
2131  * power-of-two magnitudes of the immediate operand. For each MSB, a block
2132  * of immediate values centered around the power-of-two MSB are tested,
2133  * both for positive and negative values. The test is designed to verify
2134  * the operation for JITs that emit different code depending on the magnitude
2135  * of the immediate value. This is often the case if the native instruction
2136  * immediate field width is narrower than 32 bits.
2137  */
2138 static int bpf_fill_ld_imm64_magn(struct bpf_test *self)
2139 {
2140         int block = 64; /* Increase for more tests per MSB position */
2141         int len = 3 + 8 * 63 * block * 2;
2142         struct bpf_insn *insn;
2143         int bit, adj, sign;
2144         int i = 0;
2145
2146         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
2147         if (!insn)
2148                 return -ENOMEM;
2149
2150         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
2151
2152         for (bit = 0; bit <= 62; bit++) {
2153                 for (adj = -block / 2; adj < block / 2; adj++) {
2154                         for (sign = -1; sign <= 1; sign += 2) {
2155                                 s64 imm = sign * ((1LL << bit) + adj);
2156
2157                                 /* Perform operation */
2158                                 i += __bpf_ld_imm64(&insn[i], R1, imm);
2159
2160                                 /* Load reference */
2161                                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
2162                                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3,
2163                                                           (u32)(imm >> 32));
2164                                 insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
2165                                 insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
2166
2167                                 /* Check result */
2168                                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
2169                                 insn[i++] = BPF_EXIT_INSN();
2170                         }
2171                 }
2172         }
2173
2174         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
2175         insn[i++] = BPF_EXIT_INSN();
2176
2177         self->u.ptr.insns = insn;
2178         self->u.ptr.len = len;
2179         BUG_ON(i != len);
2180
2181         return 0;
2182 }
2183
2184 /*
2185  * Test the two-instruction 64-bit immediate load operation for different
2186  * combinations of bytes. Each byte in the 64-bit word is constructed as
2187  * (base & mask) | (rand() & ~mask), where rand() is a deterministic LCG.
2188  * All patterns (base1, mask1) and (base2, mask2) bytes are tested.
2189  */
2190 static int __bpf_fill_ld_imm64_bytes(struct bpf_test *self,
2191                                      u8 base1, u8 mask1,
2192                                      u8 base2, u8 mask2)
2193 {
2194         struct bpf_insn *insn;
2195         int len = 3 + 8 * BIT(8);
2196         int pattern, index;
2197         u32 rand = 1;
2198         int i = 0;
2199
2200         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
2201         if (!insn)
2202                 return -ENOMEM;
2203
2204         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
2205
2206         for (pattern = 0; pattern < BIT(8); pattern++) {
2207                 u64 imm = 0;
2208
2209                 for (index = 0; index < 8; index++) {
2210                         int byte;
2211
2212                         if (pattern & BIT(index))
2213                                 byte = (base1 & mask1) | (rand & ~mask1);
2214                         else
2215                                 byte = (base2 & mask2) | (rand & ~mask2);
2216                         imm = (imm << 8) | byte;
2217                 }
2218
2219                 /* Update our LCG */
2220                 rand = rand * 1664525 + 1013904223;
2221
2222                 /* Perform operation */
2223                 i += __bpf_ld_imm64(&insn[i], R1, imm);
2224
2225                 /* Load reference */
2226                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
2227                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3, (u32)(imm >> 32));
2228                 insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
2229                 insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
2230
2231                 /* Check result */
2232                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
2233                 insn[i++] = BPF_EXIT_INSN();
2234         }
2235
2236         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
2237         insn[i++] = BPF_EXIT_INSN();
2238
2239         self->u.ptr.insns = insn;
2240         self->u.ptr.len = len;
2241         BUG_ON(i != len);
2242
2243         return 0;
2244 }
2245
2246 static int bpf_fill_ld_imm64_checker(struct bpf_test *self)
2247 {
2248         return __bpf_fill_ld_imm64_bytes(self, 0, 0xff, 0xff, 0xff);
2249 }
2250
2251 static int bpf_fill_ld_imm64_pos_neg(struct bpf_test *self)
2252 {
2253         return __bpf_fill_ld_imm64_bytes(self, 1, 0x81, 0x80, 0x80);
2254 }
2255
2256 static int bpf_fill_ld_imm64_pos_zero(struct bpf_test *self)
2257 {
2258         return __bpf_fill_ld_imm64_bytes(self, 1, 0x81, 0, 0xff);
2259 }
2260
2261 static int bpf_fill_ld_imm64_neg_zero(struct bpf_test *self)
2262 {
2263         return __bpf_fill_ld_imm64_bytes(self, 0x80, 0x80, 0, 0xff);
2264 }
2265
2266 /*
2267  * Exhaustive tests of JMP operations for all combinations of power-of-two
2268  * magnitudes of the operands, both for positive and negative values. The
2269  * test is designed to verify e.g. the JMP and JMP32 operations for JITs that
2270  * emit different code depending on the magnitude of the immediate value.
2271  */
2272
2273 static bool __bpf_match_jmp_cond(s64 v1, s64 v2, u8 op)
2274 {
2275         switch (op) {
2276         case BPF_JSET:
2277                 return !!(v1 & v2);
2278         case BPF_JEQ:
2279                 return v1 == v2;
2280         case BPF_JNE:
2281                 return v1 != v2;
2282         case BPF_JGT:
2283                 return (u64)v1 > (u64)v2;
2284         case BPF_JGE:
2285                 return (u64)v1 >= (u64)v2;
2286         case BPF_JLT:
2287                 return (u64)v1 < (u64)v2;
2288         case BPF_JLE:
2289                 return (u64)v1 <= (u64)v2;
2290         case BPF_JSGT:
2291                 return v1 > v2;
2292         case BPF_JSGE:
2293                 return v1 >= v2;
2294         case BPF_JSLT:
2295                 return v1 < v2;
2296         case BPF_JSLE:
2297                 return v1 <= v2;
2298         }
2299         return false;
2300 }
2301
2302 static int __bpf_emit_jmp_imm(struct bpf_test *self, void *arg,
2303                               struct bpf_insn *insns, s64 dst, s64 imm)
2304 {
2305         int op = *(int *)arg;
2306
2307         if (insns) {
2308                 bool match = __bpf_match_jmp_cond(dst, (s32)imm, op);
2309                 int i = 0;
2310
2311                 insns[i++] = BPF_ALU32_IMM(BPF_MOV, R0, match);
2312
2313                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2314                 insns[i++] = BPF_JMP_IMM(op, R1, imm, 1);
2315                 if (!match)
2316                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2317                 insns[i++] = BPF_EXIT_INSN();
2318
2319                 return i;
2320         }
2321
2322         return 5 + 1;
2323 }
2324
2325 static int __bpf_emit_jmp32_imm(struct bpf_test *self, void *arg,
2326                                 struct bpf_insn *insns, s64 dst, s64 imm)
2327 {
2328         int op = *(int *)arg;
2329
2330         if (insns) {
2331                 bool match = __bpf_match_jmp_cond((s32)dst, (s32)imm, op);
2332                 int i = 0;
2333
2334                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2335                 insns[i++] = BPF_JMP32_IMM(op, R1, imm, 1);
2336                 if (!match)
2337                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2338                 insns[i++] = BPF_EXIT_INSN();
2339
2340                 return i;
2341         }
2342
2343         return 5;
2344 }
2345
2346 static int __bpf_emit_jmp_reg(struct bpf_test *self, void *arg,
2347                               struct bpf_insn *insns, s64 dst, s64 src)
2348 {
2349         int op = *(int *)arg;
2350
2351         if (insns) {
2352                 bool match = __bpf_match_jmp_cond(dst, src, op);
2353                 int i = 0;
2354
2355                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2356                 i += __bpf_ld_imm64(&insns[i], R2, src);
2357                 insns[i++] = BPF_JMP_REG(op, R1, R2, 1);
2358                 if (!match)
2359                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2360                 insns[i++] = BPF_EXIT_INSN();
2361
2362                 return i;
2363         }
2364
2365         return 7;
2366 }
2367
2368 static int __bpf_emit_jmp32_reg(struct bpf_test *self, void *arg,
2369                                 struct bpf_insn *insns, s64 dst, s64 src)
2370 {
2371         int op = *(int *)arg;
2372
2373         if (insns) {
2374                 bool match = __bpf_match_jmp_cond((s32)dst, (s32)src, op);
2375                 int i = 0;
2376
2377                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2378                 i += __bpf_ld_imm64(&insns[i], R2, src);
2379                 insns[i++] = BPF_JMP32_REG(op, R1, R2, 1);
2380                 if (!match)
2381                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2382                 insns[i++] = BPF_EXIT_INSN();
2383
2384                 return i;
2385         }
2386
2387         return 7;
2388 }
2389
2390 static int __bpf_fill_jmp_imm(struct bpf_test *self, int op)
2391 {
2392         return __bpf_fill_pattern(self, &op, 64, 32,
2393                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2394                                   &__bpf_emit_jmp_imm);
2395 }
2396
2397 static int __bpf_fill_jmp32_imm(struct bpf_test *self, int op)
2398 {
2399         return __bpf_fill_pattern(self, &op, 64, 32,
2400                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2401                                   &__bpf_emit_jmp32_imm);
2402 }
2403
2404 static int __bpf_fill_jmp_reg(struct bpf_test *self, int op)
2405 {
2406         return __bpf_fill_pattern(self, &op, 64, 64,
2407                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2408                                   &__bpf_emit_jmp_reg);
2409 }
2410
2411 static int __bpf_fill_jmp32_reg(struct bpf_test *self, int op)
2412 {
2413         return __bpf_fill_pattern(self, &op, 64, 64,
2414                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2415                                   &__bpf_emit_jmp32_reg);
2416 }
2417
2418 /* JMP immediate tests */
2419 static int bpf_fill_jmp_jset_imm(struct bpf_test *self)
2420 {
2421         return __bpf_fill_jmp_imm(self, BPF_JSET);
2422 }
2423
2424 static int bpf_fill_jmp_jeq_imm(struct bpf_test *self)
2425 {
2426         return __bpf_fill_jmp_imm(self, BPF_JEQ);
2427 }
2428
2429 static int bpf_fill_jmp_jne_imm(struct bpf_test *self)
2430 {
2431         return __bpf_fill_jmp_imm(self, BPF_JNE);
2432 }
2433
2434 static int bpf_fill_jmp_jgt_imm(struct bpf_test *self)
2435 {
2436         return __bpf_fill_jmp_imm(self, BPF_JGT);
2437 }
2438
2439 static int bpf_fill_jmp_jge_imm(struct bpf_test *self)
2440 {
2441         return __bpf_fill_jmp_imm(self, BPF_JGE);
2442 }
2443
2444 static int bpf_fill_jmp_jlt_imm(struct bpf_test *self)
2445 {
2446         return __bpf_fill_jmp_imm(self, BPF_JLT);
2447 }
2448
2449 static int bpf_fill_jmp_jle_imm(struct bpf_test *self)
2450 {
2451         return __bpf_fill_jmp_imm(self, BPF_JLE);
2452 }
2453
2454 static int bpf_fill_jmp_jsgt_imm(struct bpf_test *self)
2455 {
2456         return __bpf_fill_jmp_imm(self, BPF_JSGT);
2457 }
2458
2459 static int bpf_fill_jmp_jsge_imm(struct bpf_test *self)
2460 {
2461         return __bpf_fill_jmp_imm(self, BPF_JSGE);
2462 }
2463
2464 static int bpf_fill_jmp_jslt_imm(struct bpf_test *self)
2465 {
2466         return __bpf_fill_jmp_imm(self, BPF_JSLT);
2467 }
2468
2469 static int bpf_fill_jmp_jsle_imm(struct bpf_test *self)
2470 {
2471         return __bpf_fill_jmp_imm(self, BPF_JSLE);
2472 }
2473
2474 /* JMP32 immediate tests */
2475 static int bpf_fill_jmp32_jset_imm(struct bpf_test *self)
2476 {
2477         return __bpf_fill_jmp32_imm(self, BPF_JSET);
2478 }
2479
2480 static int bpf_fill_jmp32_jeq_imm(struct bpf_test *self)
2481 {
2482         return __bpf_fill_jmp32_imm(self, BPF_JEQ);
2483 }
2484
2485 static int bpf_fill_jmp32_jne_imm(struct bpf_test *self)
2486 {
2487         return __bpf_fill_jmp32_imm(self, BPF_JNE);
2488 }
2489
2490 static int bpf_fill_jmp32_jgt_imm(struct bpf_test *self)
2491 {
2492         return __bpf_fill_jmp32_imm(self, BPF_JGT);
2493 }
2494
2495 static int bpf_fill_jmp32_jge_imm(struct bpf_test *self)
2496 {
2497         return __bpf_fill_jmp32_imm(self, BPF_JGE);
2498 }
2499
2500 static int bpf_fill_jmp32_jlt_imm(struct bpf_test *self)
2501 {
2502         return __bpf_fill_jmp32_imm(self, BPF_JLT);
2503 }
2504
2505 static int bpf_fill_jmp32_jle_imm(struct bpf_test *self)
2506 {
2507         return __bpf_fill_jmp32_imm(self, BPF_JLE);
2508 }
2509
2510 static int bpf_fill_jmp32_jsgt_imm(struct bpf_test *self)
2511 {
2512         return __bpf_fill_jmp32_imm(self, BPF_JSGT);
2513 }
2514
2515 static int bpf_fill_jmp32_jsge_imm(struct bpf_test *self)
2516 {
2517         return __bpf_fill_jmp32_imm(self, BPF_JSGE);
2518 }
2519
2520 static int bpf_fill_jmp32_jslt_imm(struct bpf_test *self)
2521 {
2522         return __bpf_fill_jmp32_imm(self, BPF_JSLT);
2523 }
2524
2525 static int bpf_fill_jmp32_jsle_imm(struct bpf_test *self)
2526 {
2527         return __bpf_fill_jmp32_imm(self, BPF_JSLE);
2528 }
2529
2530 /* JMP register tests */
2531 static int bpf_fill_jmp_jset_reg(struct bpf_test *self)
2532 {
2533         return __bpf_fill_jmp_reg(self, BPF_JSET);
2534 }
2535
2536 static int bpf_fill_jmp_jeq_reg(struct bpf_test *self)
2537 {
2538         return __bpf_fill_jmp_reg(self, BPF_JEQ);
2539 }
2540
2541 static int bpf_fill_jmp_jne_reg(struct bpf_test *self)
2542 {
2543         return __bpf_fill_jmp_reg(self, BPF_JNE);
2544 }
2545
2546 static int bpf_fill_jmp_jgt_reg(struct bpf_test *self)
2547 {
2548         return __bpf_fill_jmp_reg(self, BPF_JGT);
2549 }
2550
2551 static int bpf_fill_jmp_jge_reg(struct bpf_test *self)
2552 {
2553         return __bpf_fill_jmp_reg(self, BPF_JGE);
2554 }
2555
2556 static int bpf_fill_jmp_jlt_reg(struct bpf_test *self)
2557 {
2558         return __bpf_fill_jmp_reg(self, BPF_JLT);
2559 }
2560
2561 static int bpf_fill_jmp_jle_reg(struct bpf_test *self)
2562 {
2563         return __bpf_fill_jmp_reg(self, BPF_JLE);
2564 }
2565
2566 static int bpf_fill_jmp_jsgt_reg(struct bpf_test *self)
2567 {
2568         return __bpf_fill_jmp_reg(self, BPF_JSGT);
2569 }
2570
2571 static int bpf_fill_jmp_jsge_reg(struct bpf_test *self)
2572 {
2573         return __bpf_fill_jmp_reg(self, BPF_JSGE);
2574 }
2575
2576 static int bpf_fill_jmp_jslt_reg(struct bpf_test *self)
2577 {
2578         return __bpf_fill_jmp_reg(self, BPF_JSLT);
2579 }
2580
2581 static int bpf_fill_jmp_jsle_reg(struct bpf_test *self)
2582 {
2583         return __bpf_fill_jmp_reg(self, BPF_JSLE);
2584 }
2585
2586 /* JMP32 register tests */
2587 static int bpf_fill_jmp32_jset_reg(struct bpf_test *self)
2588 {
2589         return __bpf_fill_jmp32_reg(self, BPF_JSET);
2590 }
2591
2592 static int bpf_fill_jmp32_jeq_reg(struct bpf_test *self)
2593 {
2594         return __bpf_fill_jmp32_reg(self, BPF_JEQ);
2595 }
2596
2597 static int bpf_fill_jmp32_jne_reg(struct bpf_test *self)
2598 {
2599         return __bpf_fill_jmp32_reg(self, BPF_JNE);
2600 }
2601
2602 static int bpf_fill_jmp32_jgt_reg(struct bpf_test *self)
2603 {
2604         return __bpf_fill_jmp32_reg(self, BPF_JGT);
2605 }
2606
2607 static int bpf_fill_jmp32_jge_reg(struct bpf_test *self)
2608 {
2609         return __bpf_fill_jmp32_reg(self, BPF_JGE);
2610 }
2611
2612 static int bpf_fill_jmp32_jlt_reg(struct bpf_test *self)
2613 {
2614         return __bpf_fill_jmp32_reg(self, BPF_JLT);
2615 }
2616
2617 static int bpf_fill_jmp32_jle_reg(struct bpf_test *self)
2618 {
2619         return __bpf_fill_jmp32_reg(self, BPF_JLE);
2620 }
2621
2622 static int bpf_fill_jmp32_jsgt_reg(struct bpf_test *self)
2623 {
2624         return __bpf_fill_jmp32_reg(self, BPF_JSGT);
2625 }
2626
2627 static int bpf_fill_jmp32_jsge_reg(struct bpf_test *self)
2628 {
2629         return __bpf_fill_jmp32_reg(self, BPF_JSGE);
2630 }
2631
2632 static int bpf_fill_jmp32_jslt_reg(struct bpf_test *self)
2633 {
2634         return __bpf_fill_jmp32_reg(self, BPF_JSLT);
2635 }
2636
2637 static int bpf_fill_jmp32_jsle_reg(struct bpf_test *self)
2638 {
2639         return __bpf_fill_jmp32_reg(self, BPF_JSLE);
2640 }
2641
2642 /*
2643  * Set up a sequence of staggered jumps, forwards and backwards with
2644  * increasing offset. This tests the conversion of relative jumps to
2645  * JITed native jumps. On some architectures, for example MIPS, a large
2646  * PC-relative jump offset may overflow the immediate field of the native
2647  * conditional branch instruction, triggering a conversion to use an
2648  * absolute jump instead. Since this changes the jump offsets, another
2649  * offset computation pass is necessary, and that may in turn trigger
2650  * another branch conversion. This jump sequence is particularly nasty
2651  * in that regard.
2652  *
2653  * The sequence generation is parameterized by size and jump type.
2654  * The size must be even, and the expected result is always size + 1.
2655  * Below is an example with size=8 and result=9.
2656  *
2657  *                     ________________________Start
2658  *                     R0 = 0
2659  *                     R1 = r1
2660  *                     R2 = r2
2661  *            ,------- JMP +4 * 3______________Preamble: 4 insns
2662  * ,----------|-ind 0- if R0 != 7 JMP 8 * 3 + 1 <--------------------.
2663  * |          |        R0 = 8                                        |
2664  * |          |        JMP +7 * 3               ------------------------.
2665  * | ,--------|-----1- if R0 != 5 JMP 7 * 3 + 1 <--------------.     |  |
2666  * | |        |        R0 = 6                                  |     |  |
2667  * | |        |        JMP +5 * 3               ------------------.  |  |
2668  * | | ,------|-----2- if R0 != 3 JMP 6 * 3 + 1 <--------.     |  |  |  |
2669  * | | |      |        R0 = 4                            |     |  |  |  |
2670  * | | |      |        JMP +3 * 3               ------------.  |  |  |  |
2671  * | | | ,----|-----3- if R0 != 1 JMP 5 * 3 + 1 <--.     |  |  |  |  |  |
2672  * | | | |    |        R0 = 2                      |     |  |  |  |  |  |
2673  * | | | |    |        JMP +1 * 3               ------.  |  |  |  |  |  |
2674  * | | | | ,--t=====4> if R0 != 0 JMP 4 * 3 + 1    1  2  3  4  5  6  7  8 loc
2675  * | | | | |           R0 = 1                     -1 +2 -3 +4 -5 +6 -7 +8 off
2676  * | | | | |           JMP -2 * 3               ---'  |  |  |  |  |  |  |
2677  * | | | | | ,------5- if R0 != 2 JMP 3 * 3 + 1 <-----'  |  |  |  |  |  |
2678  * | | | | | |         R0 = 3                            |  |  |  |  |  |
2679  * | | | | | |         JMP -4 * 3               ---------'  |  |  |  |  |
2680  * | | | | | | ,----6- if R0 != 4 JMP 2 * 3 + 1 <-----------'  |  |  |  |
2681  * | | | | | | |       R0 = 5                                  |  |  |  |
2682  * | | | | | | |       JMP -6 * 3               ---------------'  |  |  |
2683  * | | | | | | | ,--7- if R0 != 6 JMP 1 * 3 + 1 <-----------------'  |  |
2684  * | | | | | | | |     R0 = 7                                        |  |
2685  * | | Error | | |     JMP -8 * 3               ---------------------'  |
2686  * | | paths | | | ,8- if R0 != 8 JMP 0 * 3 + 1 <-----------------------'
2687  * | | | | | | | | |   R0 = 9__________________Sequence: 3 * size - 1 insns
2688  * `-+-+-+-+-+-+-+-+-> EXIT____________________Return: 1 insn
2689  *
2690  */
2691
2692 /* The maximum size parameter */
2693 #define MAX_STAGGERED_JMP_SIZE ((0x7fff / 3) & ~1)
2694
2695 /* We use a reduced number of iterations to get a reasonable execution time */
2696 #define NR_STAGGERED_JMP_RUNS 10
2697
2698 static int __bpf_fill_staggered_jumps(struct bpf_test *self,
2699                                       const struct bpf_insn *jmp,
2700                                       u64 r1, u64 r2)
2701 {
2702         int size = self->test[0].result - 1;
2703         int len = 4 + 3 * (size + 1);
2704         struct bpf_insn *insns;
2705         int off, ind;
2706
2707         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
2708         if (!insns)
2709                 return -ENOMEM;
2710
2711         /* Preamble */
2712         insns[0] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
2713         insns[1] = BPF_ALU64_IMM(BPF_MOV, R1, r1);
2714         insns[2] = BPF_ALU64_IMM(BPF_MOV, R2, r2);
2715         insns[3] = BPF_JMP_IMM(BPF_JA, 0, 0, 3 * size / 2);
2716
2717         /* Sequence */
2718         for (ind = 0, off = size; ind <= size; ind++, off -= 2) {
2719                 struct bpf_insn *ins = &insns[4 + 3 * ind];
2720                 int loc;
2721
2722                 if (off == 0)
2723                         off--;
2724
2725                 loc = abs(off);
2726                 ins[0] = BPF_JMP_IMM(BPF_JNE, R0, loc - 1,
2727                                      3 * (size - ind) + 1);
2728                 ins[1] = BPF_ALU64_IMM(BPF_MOV, R0, loc);
2729                 ins[2] = *jmp;
2730                 ins[2].off = 3 * (off - 1);
2731         }
2732
2733         /* Return */
2734         insns[len - 1] = BPF_EXIT_INSN();
2735
2736         self->u.ptr.insns = insns;
2737         self->u.ptr.len = len;
2738
2739         return 0;
2740 }
2741
2742 /* 64-bit unconditional jump */
2743 static int bpf_fill_staggered_ja(struct bpf_test *self)
2744 {
2745         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JA, 0, 0, 0);
2746
2747         return __bpf_fill_staggered_jumps(self, &jmp, 0, 0);
2748 }
2749
2750 /* 64-bit immediate jumps */
2751 static int bpf_fill_staggered_jeq_imm(struct bpf_test *self)
2752 {
2753         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JEQ, R1, 1234, 0);
2754
2755         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2756 }
2757
2758 static int bpf_fill_staggered_jne_imm(struct bpf_test *self)
2759 {
2760         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JNE, R1, 1234, 0);
2761
2762         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
2763 }
2764
2765 static int bpf_fill_staggered_jset_imm(struct bpf_test *self)
2766 {
2767         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSET, R1, 0x82, 0);
2768
2769         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
2770 }
2771
2772 static int bpf_fill_staggered_jgt_imm(struct bpf_test *self)
2773 {
2774         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGT, R1, 1234, 0);
2775
2776         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
2777 }
2778
2779 static int bpf_fill_staggered_jge_imm(struct bpf_test *self)
2780 {
2781         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGE, R1, 1234, 0);
2782
2783         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2784 }
2785
2786 static int bpf_fill_staggered_jlt_imm(struct bpf_test *self)
2787 {
2788         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLT, R1, 0x80000000, 0);
2789
2790         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2791 }
2792
2793 static int bpf_fill_staggered_jle_imm(struct bpf_test *self)
2794 {
2795         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLE, R1, 1234, 0);
2796
2797         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2798 }
2799
2800 static int bpf_fill_staggered_jsgt_imm(struct bpf_test *self)
2801 {
2802         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGT, R1, -2, 0);
2803
2804         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2805 }
2806
2807 static int bpf_fill_staggered_jsge_imm(struct bpf_test *self)
2808 {
2809         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGE, R1, -2, 0);
2810
2811         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2812 }
2813
2814 static int bpf_fill_staggered_jslt_imm(struct bpf_test *self)
2815 {
2816         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLT, R1, -1, 0);
2817
2818         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2819 }
2820
2821 static int bpf_fill_staggered_jsle_imm(struct bpf_test *self)
2822 {
2823         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLE, R1, -1, 0);
2824
2825         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2826 }
2827
2828 /* 64-bit register jumps */
2829 static int bpf_fill_staggered_jeq_reg(struct bpf_test *self)
2830 {
2831         struct bpf_insn jmp = BPF_JMP_REG(BPF_JEQ, R1, R2, 0);
2832
2833         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2834 }
2835
2836 static int bpf_fill_staggered_jne_reg(struct bpf_test *self)
2837 {
2838         struct bpf_insn jmp = BPF_JMP_REG(BPF_JNE, R1, R2, 0);
2839
2840         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
2841 }
2842
2843 static int bpf_fill_staggered_jset_reg(struct bpf_test *self)
2844 {
2845         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSET, R1, R2, 0);
2846
2847         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
2848 }
2849
2850 static int bpf_fill_staggered_jgt_reg(struct bpf_test *self)
2851 {
2852         struct bpf_insn jmp = BPF_JMP_REG(BPF_JGT, R1, R2, 0);
2853
2854         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
2855 }
2856
2857 static int bpf_fill_staggered_jge_reg(struct bpf_test *self)
2858 {
2859         struct bpf_insn jmp = BPF_JMP_REG(BPF_JGE, R1, R2, 0);
2860
2861         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2862 }
2863
2864 static int bpf_fill_staggered_jlt_reg(struct bpf_test *self)
2865 {
2866         struct bpf_insn jmp = BPF_JMP_REG(BPF_JLT, R1, R2, 0);
2867
2868         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
2869 }
2870
2871 static int bpf_fill_staggered_jle_reg(struct bpf_test *self)
2872 {
2873         struct bpf_insn jmp = BPF_JMP_REG(BPF_JLE, R1, R2, 0);
2874
2875         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2876 }
2877
2878 static int bpf_fill_staggered_jsgt_reg(struct bpf_test *self)
2879 {
2880         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGT, R1, R2, 0);
2881
2882         return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
2883 }
2884
2885 static int bpf_fill_staggered_jsge_reg(struct bpf_test *self)
2886 {
2887         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGE, R1, R2, 0);
2888
2889         return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
2890 }
2891
2892 static int bpf_fill_staggered_jslt_reg(struct bpf_test *self)
2893 {
2894         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLT, R1, R2, 0);
2895
2896         return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
2897 }
2898
2899 static int bpf_fill_staggered_jsle_reg(struct bpf_test *self)
2900 {
2901         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLE, R1, R2, 0);
2902
2903         return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
2904 }
2905
2906 /* 32-bit immediate jumps */
2907 static int bpf_fill_staggered_jeq32_imm(struct bpf_test *self)
2908 {
2909         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JEQ, R1, 1234, 0);
2910
2911         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2912 }
2913
2914 static int bpf_fill_staggered_jne32_imm(struct bpf_test *self)
2915 {
2916         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JNE, R1, 1234, 0);
2917
2918         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
2919 }
2920
2921 static int bpf_fill_staggered_jset32_imm(struct bpf_test *self)
2922 {
2923         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSET, R1, 0x82, 0);
2924
2925         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
2926 }
2927
2928 static int bpf_fill_staggered_jgt32_imm(struct bpf_test *self)
2929 {
2930         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGT, R1, 1234, 0);
2931
2932         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
2933 }
2934
2935 static int bpf_fill_staggered_jge32_imm(struct bpf_test *self)
2936 {
2937         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGE, R1, 1234, 0);
2938
2939         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2940 }
2941
2942 static int bpf_fill_staggered_jlt32_imm(struct bpf_test *self)
2943 {
2944         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLT, R1, 0x80000000, 0);
2945
2946         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2947 }
2948
2949 static int bpf_fill_staggered_jle32_imm(struct bpf_test *self)
2950 {
2951         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLE, R1, 1234, 0);
2952
2953         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2954 }
2955
2956 static int bpf_fill_staggered_jsgt32_imm(struct bpf_test *self)
2957 {
2958         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGT, R1, -2, 0);
2959
2960         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2961 }
2962
2963 static int bpf_fill_staggered_jsge32_imm(struct bpf_test *self)
2964 {
2965         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGE, R1, -2, 0);
2966
2967         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2968 }
2969
2970 static int bpf_fill_staggered_jslt32_imm(struct bpf_test *self)
2971 {
2972         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLT, R1, -1, 0);
2973
2974         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2975 }
2976
2977 static int bpf_fill_staggered_jsle32_imm(struct bpf_test *self)
2978 {
2979         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLE, R1, -1, 0);
2980
2981         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2982 }
2983
2984 /* 32-bit register jumps */
2985 static int bpf_fill_staggered_jeq32_reg(struct bpf_test *self)
2986 {
2987         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JEQ, R1, R2, 0);
2988
2989         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2990 }
2991
2992 static int bpf_fill_staggered_jne32_reg(struct bpf_test *self)
2993 {
2994         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JNE, R1, R2, 0);
2995
2996         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
2997 }
2998
2999 static int bpf_fill_staggered_jset32_reg(struct bpf_test *self)
3000 {
3001         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSET, R1, R2, 0);
3002
3003         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
3004 }
3005
3006 static int bpf_fill_staggered_jgt32_reg(struct bpf_test *self)
3007 {
3008         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGT, R1, R2, 0);
3009
3010         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
3011 }
3012
3013 static int bpf_fill_staggered_jge32_reg(struct bpf_test *self)
3014 {
3015         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGE, R1, R2, 0);
3016
3017         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
3018 }
3019
3020 static int bpf_fill_staggered_jlt32_reg(struct bpf_test *self)
3021 {
3022         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLT, R1, R2, 0);
3023
3024         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
3025 }
3026
3027 static int bpf_fill_staggered_jle32_reg(struct bpf_test *self)
3028 {
3029         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLE, R1, R2, 0);
3030
3031         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
3032 }
3033
3034 static int bpf_fill_staggered_jsgt32_reg(struct bpf_test *self)
3035 {
3036         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGT, R1, R2, 0);
3037
3038         return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
3039 }
3040
3041 static int bpf_fill_staggered_jsge32_reg(struct bpf_test *self)
3042 {
3043         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGE, R1, R2, 0);
3044
3045         return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
3046 }
3047
3048 static int bpf_fill_staggered_jslt32_reg(struct bpf_test *self)
3049 {
3050         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLT, R1, R2, 0);
3051
3052         return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
3053 }
3054
3055 static int bpf_fill_staggered_jsle32_reg(struct bpf_test *self)
3056 {
3057         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLE, R1, R2, 0);
3058
3059         return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
3060 }
3061
3062
3063 static struct bpf_test tests[] = {
3064         {
3065                 "TAX",
3066                 .u.insns = {
3067                         BPF_STMT(BPF_LD | BPF_IMM, 1),
3068                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3069                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3070                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3071                         BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
3072                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3073                         BPF_STMT(BPF_LD | BPF_LEN, 0),
3074                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3075                         BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
3076                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
3077                         BPF_STMT(BPF_RET | BPF_A, 0)
3078                 },
3079                 CLASSIC,
3080                 { 10, 20, 30, 40, 50 },
3081                 { { 2, 10 }, { 3, 20 }, { 4, 30 } },
3082         },
3083         {
3084                 "TXA",
3085                 .u.insns = {
3086                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3087                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3088                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3089                         BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
3090                 },
3091                 CLASSIC,
3092                 { 10, 20, 30, 40, 50 },
3093                 { { 1, 2 }, { 3, 6 }, { 4, 8 } },
3094         },
3095         {
3096                 "ADD_SUB_MUL_K",
3097                 .u.insns = {
3098                         BPF_STMT(BPF_LD | BPF_IMM, 1),
3099                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
3100                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
3101                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
3102                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
3103                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
3104                         BPF_STMT(BPF_RET | BPF_A, 0)
3105                 },
3106                 CLASSIC | FLAG_NO_DATA,
3107                 { },
3108                 { { 0, 0xfffffffd } }
3109         },
3110         {
3111                 "DIV_MOD_KX",
3112                 .u.insns = {
3113                         BPF_STMT(BPF_LD | BPF_IMM, 8),
3114                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
3115                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3116                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3117                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
3118                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3119                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3120                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
3121                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3122                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3123                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
3124                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3125                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3126                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
3127                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3128                         BPF_STMT(BPF_RET | BPF_A, 0)
3129                 },
3130                 CLASSIC | FLAG_NO_DATA,
3131                 { },
3132                 { { 0, 0x20000000 } }
3133         },
3134         {
3135                 "AND_OR_LSH_K",
3136                 .u.insns = {
3137                         BPF_STMT(BPF_LD | BPF_IMM, 0xff),
3138                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
3139                         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
3140                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3141                         BPF_STMT(BPF_LD | BPF_IMM, 0xf),
3142                         BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
3143                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3144                         BPF_STMT(BPF_RET | BPF_A, 0)
3145                 },
3146                 CLASSIC | FLAG_NO_DATA,
3147                 { },
3148                 { { 0, 0x800000ff }, { 1, 0x800000ff } },
3149         },
3150         {
3151                 "LD_IMM_0",
3152                 .u.insns = {
3153                         BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
3154                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
3155                         BPF_STMT(BPF_RET | BPF_K, 0),
3156                         BPF_STMT(BPF_RET | BPF_K, 1),
3157                 },
3158                 CLASSIC,
3159                 { },
3160                 { { 1, 1 } },
3161         },
3162         {
3163                 "LD_IND",
3164                 .u.insns = {
3165                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3166                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
3167                         BPF_STMT(BPF_RET | BPF_K, 1)
3168                 },
3169                 CLASSIC,
3170                 { },
3171                 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
3172         },
3173         {
3174                 "LD_ABS",
3175                 .u.insns = {
3176                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
3177                         BPF_STMT(BPF_RET | BPF_K, 1)
3178                 },
3179                 CLASSIC,
3180                 { },
3181                 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
3182         },
3183         {
3184                 "LD_ABS_LL",
3185                 .u.insns = {
3186                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
3187                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3188                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
3189                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3190                         BPF_STMT(BPF_RET | BPF_A, 0)
3191                 },
3192                 CLASSIC,
3193                 { 1, 2, 3 },
3194                 { { 1, 0 }, { 2, 3 } },
3195         },
3196         {
3197                 "LD_IND_LL",
3198                 .u.insns = {
3199                         BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
3200                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3201                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3202                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3203                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
3204                         BPF_STMT(BPF_RET | BPF_A, 0)
3205                 },
3206                 CLASSIC,
3207                 { 1, 2, 3, 0xff },
3208                 { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
3209         },
3210         {
3211                 "LD_ABS_NET",
3212                 .u.insns = {
3213                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
3214                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3215                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
3216                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3217                         BPF_STMT(BPF_RET | BPF_A, 0)
3218                 },
3219                 CLASSIC,
3220                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
3221                 { { 15, 0 }, { 16, 3 } },
3222         },
3223         {
3224                 "LD_IND_NET",
3225                 .u.insns = {
3226                         BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
3227                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3228                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3229                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3230                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
3231                         BPF_STMT(BPF_RET | BPF_A, 0)
3232                 },
3233                 CLASSIC,
3234                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
3235                 { { 14, 0 }, { 15, 1 }, { 17, 3 } },
3236         },
3237         {
3238                 "LD_PKTTYPE",
3239                 .u.insns = {
3240                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3241                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
3242                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
3243                         BPF_STMT(BPF_RET | BPF_K, 1),
3244                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3245                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
3246                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
3247                         BPF_STMT(BPF_RET | BPF_K, 1),
3248                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3249                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
3250                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
3251                         BPF_STMT(BPF_RET | BPF_K, 1),
3252                         BPF_STMT(BPF_RET | BPF_A, 0)
3253                 },
3254                 CLASSIC,
3255                 { },
3256                 { { 1, 3 }, { 10, 3 } },
3257         },
3258         {
3259                 "LD_MARK",
3260                 .u.insns = {
3261                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3262                                  SKF_AD_OFF + SKF_AD_MARK),
3263                         BPF_STMT(BPF_RET | BPF_A, 0)
3264                 },
3265                 CLASSIC,
3266                 { },
3267                 { { 1, SKB_MARK}, { 10, SKB_MARK} },
3268         },
3269         {
3270                 "LD_RXHASH",
3271                 .u.insns = {
3272                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3273                                  SKF_AD_OFF + SKF_AD_RXHASH),
3274                         BPF_STMT(BPF_RET | BPF_A, 0)
3275                 },
3276                 CLASSIC,
3277                 { },
3278                 { { 1, SKB_HASH}, { 10, SKB_HASH} },
3279         },
3280         {
3281                 "LD_QUEUE",
3282                 .u.insns = {
3283                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3284                                  SKF_AD_OFF + SKF_AD_QUEUE),
3285                         BPF_STMT(BPF_RET | BPF_A, 0)
3286                 },
3287                 CLASSIC,
3288                 { },
3289                 { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
3290         },
3291         {
3292                 "LD_PROTOCOL",
3293                 .u.insns = {
3294                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
3295                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
3296                         BPF_STMT(BPF_RET | BPF_K, 0),
3297                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3298                                  SKF_AD_OFF + SKF_AD_PROTOCOL),
3299                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3300                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3301                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
3302                         BPF_STMT(BPF_RET | BPF_K, 0),
3303                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3304                         BPF_STMT(BPF_RET | BPF_A, 0)
3305                 },
3306                 CLASSIC,
3307                 { 10, 20, 30 },
3308                 { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
3309         },
3310         {
3311                 "LD_VLAN_TAG",
3312                 .u.insns = {
3313                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3314                                  SKF_AD_OFF + SKF_AD_VLAN_TAG),
3315                         BPF_STMT(BPF_RET | BPF_A, 0)
3316                 },
3317                 CLASSIC,
3318                 { },
3319                 {
3320                         { 1, SKB_VLAN_TCI },
3321                         { 10, SKB_VLAN_TCI }
3322                 },
3323         },
3324         {
3325                 "LD_VLAN_TAG_PRESENT",
3326                 .u.insns = {
3327                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3328                                  SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
3329                         BPF_STMT(BPF_RET | BPF_A, 0)
3330                 },
3331                 CLASSIC,
3332                 { },
3333                 {
3334                         { 1, SKB_VLAN_PRESENT },
3335                         { 10, SKB_VLAN_PRESENT }
3336                 },
3337         },
3338         {
3339                 "LD_IFINDEX",
3340                 .u.insns = {
3341                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3342                                  SKF_AD_OFF + SKF_AD_IFINDEX),
3343                         BPF_STMT(BPF_RET | BPF_A, 0)
3344                 },
3345                 CLASSIC,
3346                 { },
3347                 { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
3348         },
3349         {
3350                 "LD_HATYPE",
3351                 .u.insns = {
3352                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3353                                  SKF_AD_OFF + SKF_AD_HATYPE),
3354                         BPF_STMT(BPF_RET | BPF_A, 0)
3355                 },
3356                 CLASSIC,
3357                 { },
3358                 { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
3359         },
3360         {
3361                 "LD_CPU",
3362                 .u.insns = {
3363                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3364                                  SKF_AD_OFF + SKF_AD_CPU),
3365                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3366                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3367                                  SKF_AD_OFF + SKF_AD_CPU),
3368                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
3369                         BPF_STMT(BPF_RET | BPF_A, 0)
3370                 },
3371                 CLASSIC,
3372                 { },
3373                 { { 1, 0 }, { 10, 0 } },
3374         },
3375         {
3376                 "LD_NLATTR",
3377                 .u.insns = {
3378                         BPF_STMT(BPF_LDX | BPF_IMM, 2),
3379                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3380                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
3381                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3382                                  SKF_AD_OFF + SKF_AD_NLATTR),
3383                         BPF_STMT(BPF_RET | BPF_A, 0)
3384                 },
3385                 CLASSIC,
3386 #ifdef __BIG_ENDIAN
3387                 { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
3388 #else
3389                 { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
3390 #endif
3391                 { { 4, 0 }, { 20, 6 } },
3392         },
3393         {
3394                 "LD_NLATTR_NEST",
3395                 .u.insns = {
3396                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3397                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
3398                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3399                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3400                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3401                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3402                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3403                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3404                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3405                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3406                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3407                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3408                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3409                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3410                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3411                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3412                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3413                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3414                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3415                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3416                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3417                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3418                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3419                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3420                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3421                         BPF_STMT(BPF_RET | BPF_A, 0)
3422                 },
3423                 CLASSIC,
3424 #ifdef __BIG_ENDIAN
3425                 { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
3426 #else
3427                 { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
3428 #endif
3429                 { { 4, 0 }, { 20, 10 } },
3430         },
3431         {
3432                 "LD_PAYLOAD_OFF",
3433                 .u.insns = {
3434                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3435                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3436                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3437                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3438                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3439                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3440                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3441                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3442                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3443                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3444                         BPF_STMT(BPF_RET | BPF_A, 0)
3445                 },
3446                 CLASSIC,
3447                 /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
3448                  * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
3449                  * id 9737, seq 1, length 64
3450                  */
3451                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3452                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3453                   0x08, 0x00,
3454                   0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
3455                   0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
3456                 { { 30, 0 }, { 100, 42 } },
3457         },
3458         {
3459                 "LD_ANC_XOR",
3460                 .u.insns = {
3461                         BPF_STMT(BPF_LD | BPF_IMM, 10),
3462                         BPF_STMT(BPF_LDX | BPF_IMM, 300),
3463                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3464                                  SKF_AD_OFF + SKF_AD_ALU_XOR_X),
3465                         BPF_STMT(BPF_RET | BPF_A, 0)
3466                 },
3467                 CLASSIC,
3468                 { },
3469                 { { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } },
3470         },
3471         {
3472                 "SPILL_FILL",
3473                 .u.insns = {
3474                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3475                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3476                         BPF_STMT(BPF_ALU | BPF_RSH, 1),
3477                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
3478                         BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
3479                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
3480                         BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
3481                         BPF_STMT(BPF_STX, 15), /* M3 = len */
3482                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
3483                         BPF_STMT(BPF_LD | BPF_MEM, 2),
3484                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
3485                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
3486                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
3487                         BPF_STMT(BPF_RET | BPF_A, 0)
3488                 },
3489                 CLASSIC,
3490                 { },
3491                 { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
3492         },
3493         {
3494                 "JEQ",
3495                 .u.insns = {
3496                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3497                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3498                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
3499                         BPF_STMT(BPF_RET | BPF_K, 1),
3500                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3501                 },
3502                 CLASSIC,
3503                 { 3, 3, 3, 3, 3 },
3504                 { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
3505         },
3506         {
3507                 "JGT",
3508                 .u.insns = {
3509                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3510                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3511                         BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
3512                         BPF_STMT(BPF_RET | BPF_K, 1),
3513                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3514                 },
3515                 CLASSIC,
3516                 { 4, 4, 4, 3, 3 },
3517                 { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
3518         },
3519         {
3520                 "JGE (jt 0), test 1",
3521                 .u.insns = {
3522                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3523                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3524                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
3525                         BPF_STMT(BPF_RET | BPF_K, 1),
3526                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3527                 },
3528                 CLASSIC,
3529                 { 4, 4, 4, 3, 3 },
3530                 { { 2, 0 }, { 3, 1 }, { 4, 1 } },
3531         },
3532         {
3533                 "JGE (jt 0), test 2",
3534                 .u.insns = {
3535                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3536                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3537                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
3538                         BPF_STMT(BPF_RET | BPF_K, 1),
3539                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3540                 },
3541                 CLASSIC,
3542                 { 4, 4, 5, 3, 3 },
3543                 { { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
3544         },
3545         {
3546                 "JGE",
3547                 .u.insns = {
3548                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3549                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
3550                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
3551                         BPF_STMT(BPF_RET | BPF_K, 10),
3552                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
3553                         BPF_STMT(BPF_RET | BPF_K, 20),
3554                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
3555                         BPF_STMT(BPF_RET | BPF_K, 30),
3556                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
3557                         BPF_STMT(BPF_RET | BPF_K, 40),
3558                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3559                 },
3560                 CLASSIC,
3561                 { 1, 2, 3, 4, 5 },
3562                 { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
3563         },
3564         {
3565                 "JSET",
3566                 .u.insns = {
3567                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
3568                         BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
3569                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
3570                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
3571                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3572                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3573                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
3574                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3575                         BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
3576                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
3577                         BPF_STMT(BPF_RET | BPF_K, 10),
3578                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
3579                         BPF_STMT(BPF_RET | BPF_K, 20),
3580                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3581                         BPF_STMT(BPF_RET | BPF_K, 30),
3582                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3583                         BPF_STMT(BPF_RET | BPF_K, 30),
3584                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3585                         BPF_STMT(BPF_RET | BPF_K, 30),
3586                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3587                         BPF_STMT(BPF_RET | BPF_K, 30),
3588                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3589                         BPF_STMT(BPF_RET | BPF_K, 30),
3590                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3591                 },
3592                 CLASSIC,
3593                 { 0, 0xAA, 0x55, 1 },
3594                 { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
3595         },
3596         {
3597                 "tcpdump port 22",
3598                 .u.insns = {
3599                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
3600                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
3601                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
3602                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
3603                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
3604                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
3605                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
3606                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
3607                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
3608                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
3609                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
3610                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
3611                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
3612                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
3613                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
3614                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
3615                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
3616                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
3617                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
3618                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
3619                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
3620                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
3621                         BPF_STMT(BPF_RET | BPF_K, 0xffff),
3622                         BPF_STMT(BPF_RET | BPF_K, 0),
3623                 },
3624                 CLASSIC,
3625                 /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
3626                  * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
3627                  * seq 1305692979:1305693027, ack 3650467037, win 65535,
3628                  * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
3629                  */
3630                 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
3631                   0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
3632                   0x08, 0x00,
3633                   0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
3634                   0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
3635                   0x0a, 0x01, 0x01, 0x95, /* ip src */
3636                   0x0a, 0x01, 0x02, 0x0a, /* ip dst */
3637                   0xc2, 0x24,
3638                   0x00, 0x16 /* dst port */ },
3639                 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
3640         },
3641         {
3642                 "tcpdump complex",
3643                 .u.insns = {
3644                         /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
3645                          * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
3646                          * (len > 115 or len < 30000000000)' -d
3647                          */
3648                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
3649                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
3650                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
3651                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
3652                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
3653                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
3654                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
3655                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
3656                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
3657                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
3658                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
3659                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
3660                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
3661                         BPF_STMT(BPF_ST, 1),
3662                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
3663                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
3664                         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
3665                         BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
3666                         BPF_STMT(BPF_LD | BPF_MEM, 1),
3667                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
3668                         BPF_STMT(BPF_ST, 5),
3669                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
3670                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
3671                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
3672                         BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
3673                         BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
3674                         BPF_STMT(BPF_LD | BPF_MEM, 5),
3675                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
3676                         BPF_STMT(BPF_LD | BPF_LEN, 0),
3677                         BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
3678                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
3679                         BPF_STMT(BPF_RET | BPF_K, 0xffff),
3680                         BPF_STMT(BPF_RET | BPF_K, 0),
3681                 },
3682                 CLASSIC,
3683                 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
3684                   0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
3685                   0x08, 0x00,
3686                   0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
3687                   0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
3688                   0x0a, 0x01, 0x01, 0x95, /* ip src */
3689                   0x0a, 0x01, 0x02, 0x0a, /* ip dst */
3690                   0xc2, 0x24,
3691                   0x00, 0x16 /* dst port */ },
3692                 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
3693         },
3694         {
3695                 "RET_A",
3696                 .u.insns = {
3697                         /* check that uninitialized X and A contain zeros */
3698                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3699                         BPF_STMT(BPF_RET | BPF_A, 0)
3700                 },
3701                 CLASSIC,
3702                 { },
3703                 { {1, 0}, {2, 0} },
3704         },
3705         {
3706                 "INT: ADD trivial",
3707                 .u.insns_int = {
3708                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
3709                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
3710                         BPF_ALU64_IMM(BPF_MOV, R2, 3),
3711                         BPF_ALU64_REG(BPF_SUB, R1, R2),
3712                         BPF_ALU64_IMM(BPF_ADD, R1, -1),
3713                         BPF_ALU64_IMM(BPF_MUL, R1, 3),
3714                         BPF_ALU64_REG(BPF_MOV, R0, R1),
3715                         BPF_EXIT_INSN(),
3716                 },
3717                 INTERNAL,
3718                 { },
3719                 { { 0, 0xfffffffd } }
3720         },
3721         {
3722                 "INT: MUL_X",
3723                 .u.insns_int = {
3724                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
3725                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
3726                         BPF_ALU64_IMM(BPF_MOV, R2, 3),
3727                         BPF_ALU64_REG(BPF_MUL, R1, R2),
3728                         BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
3729                         BPF_EXIT_INSN(),
3730                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
3731                         BPF_EXIT_INSN(),
3732                 },
3733                 INTERNAL,
3734                 { },
3735                 { { 0, 1 } }
3736         },
3737         {
3738                 "INT: MUL_X2",
3739                 .u.insns_int = {
3740                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
3741                         BPF_ALU32_IMM(BPF_MOV, R1, -1),
3742                         BPF_ALU32_IMM(BPF_MOV, R2, 3),
3743                         BPF_ALU64_REG(BPF_MUL, R1, R2),
3744                         BPF_ALU64_IMM(BPF_RSH, R1, 8),
3745                         BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
3746                         BPF_EXIT_INSN(),
3747                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3748                         BPF_EXIT_INSN(),
3749                 },
3750                 INTERNAL,
3751                 { },
3752                 { { 0, 1 } }
3753         },
3754         {
3755                 "INT: MUL32_X",
3756                 .u.insns_int = {
3757                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
3758                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
3759                         BPF_ALU32_IMM(BPF_MOV, R2, 3),
3760                         BPF_ALU32_REG(BPF_MUL, R1, R2),
3761                         BPF_ALU64_IMM(BPF_RSH, R1, 8),
3762                         BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
3763                         BPF_EXIT_INSN(),
3764                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3765                         BPF_EXIT_INSN(),
3766                 },
3767                 INTERNAL,
3768                 { },
3769                 { { 0, 1 } }
3770         },
3771         {
3772                 /* Have to test all register combinations, since
3773                  * JITing of different registers will produce
3774                  * different asm code.
3775                  */
3776                 "INT: ADD 64-bit",
3777                 .u.insns_int = {
3778                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
3779                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
3780                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
3781                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
3782                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
3783                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
3784                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
3785                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
3786                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
3787                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
3788                         BPF_ALU64_IMM(BPF_ADD, R0, 20),
3789                         BPF_ALU64_IMM(BPF_ADD, R1, 20),
3790                         BPF_ALU64_IMM(BPF_ADD, R2, 20),
3791                         BPF_ALU64_IMM(BPF_ADD, R3, 20),
3792                         BPF_ALU64_IMM(BPF_ADD, R4, 20),
3793                         BPF_ALU64_IMM(BPF_ADD, R5, 20),
3794                         BPF_ALU64_IMM(BPF_ADD, R6, 20),
3795                         BPF_ALU64_IMM(BPF_ADD, R7, 20),
3796                         BPF_ALU64_IMM(BPF_ADD, R8, 20),
3797                         BPF_ALU64_IMM(BPF_ADD, R9, 20),
3798                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
3799                         BPF_ALU64_IMM(BPF_SUB, R1, 10),
3800                         BPF_ALU64_IMM(BPF_SUB, R2, 10),
3801                         BPF_ALU64_IMM(BPF_SUB, R3, 10),
3802                         BPF_ALU64_IMM(BPF_SUB, R4, 10),
3803                         BPF_ALU64_IMM(BPF_SUB, R5, 10),
3804                         BPF_ALU64_IMM(BPF_SUB, R6, 10),
3805                         BPF_ALU64_IMM(BPF_SUB, R7, 10),
3806                         BPF_ALU64_IMM(BPF_SUB, R8, 10),
3807                         BPF_ALU64_IMM(BPF_SUB, R9, 10),
3808                         BPF_ALU64_REG(BPF_ADD, R0, R0),
3809                         BPF_ALU64_REG(BPF_ADD, R0, R1),
3810                         BPF_ALU64_REG(BPF_ADD, R0, R2),
3811                         BPF_ALU64_REG(BPF_ADD, R0, R3),
3812                         BPF_ALU64_REG(BPF_ADD, R0, R4),
3813                         BPF_ALU64_REG(BPF_ADD, R0, R5),
3814                         BPF_ALU64_REG(BPF_ADD, R0, R6),
3815                         BPF_ALU64_REG(BPF_ADD, R0, R7),
3816                         BPF_ALU64_REG(BPF_ADD, R0, R8),
3817                         BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
3818                         BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
3819                         BPF_EXIT_INSN(),
3820                         BPF_ALU64_REG(BPF_ADD, R1, R0),
3821                         BPF_ALU64_REG(BPF_ADD, R1, R1),
3822                         BPF_ALU64_REG(BPF_ADD, R1, R2),
3823                         BPF_ALU64_REG(BPF_ADD, R1, R3),
3824                         BPF_ALU64_REG(BPF_ADD, R1, R4),
3825                         BPF_ALU64_REG(BPF_ADD, R1, R5),
3826                         BPF_ALU64_REG(BPF_ADD, R1, R6),
3827                         BPF_ALU64_REG(BPF_ADD, R1, R7),
3828                         BPF_ALU64_REG(BPF_ADD, R1, R8),
3829                         BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
3830                         BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
3831                         BPF_EXIT_INSN(),
3832                         BPF_ALU64_REG(BPF_ADD, R2, R0),
3833                         BPF_ALU64_REG(BPF_ADD, R2, R1),
3834                         BPF_ALU64_REG(BPF_ADD, R2, R2),
3835                         BPF_ALU64_REG(BPF_ADD, R2, R3),
3836                         BPF_ALU64_REG(BPF_ADD, R2, R4),
3837                         BPF_ALU64_REG(BPF_ADD, R2, R5),
3838                         BPF_ALU64_REG(BPF_ADD, R2, R6),
3839                         BPF_ALU64_REG(BPF_ADD, R2, R7),
3840                         BPF_ALU64_REG(BPF_ADD, R2, R8),
3841                         BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
3842                         BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
3843                         BPF_EXIT_INSN(),
3844                         BPF_ALU64_REG(BPF_ADD, R3, R0),
3845                         BPF_ALU64_REG(BPF_ADD, R3, R1),
3846                         BPF_ALU64_REG(BPF_ADD, R3, R2),
3847                         BPF_ALU64_REG(BPF_ADD, R3, R3),
3848                         BPF_ALU64_REG(BPF_ADD, R3, R4),
3849                         BPF_ALU64_REG(BPF_ADD, R3, R5),
3850                         BPF_ALU64_REG(BPF_ADD, R3, R6),
3851                         BPF_ALU64_REG(BPF_ADD, R3, R7),
3852                         BPF_ALU64_REG(BPF_ADD, R3, R8),
3853                         BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
3854                         BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
3855                         BPF_EXIT_INSN(),
3856                         BPF_ALU64_REG(BPF_ADD, R4, R0),
3857                         BPF_ALU64_REG(BPF_ADD, R4, R1),
3858                         BPF_ALU64_REG(BPF_ADD, R4, R2),
3859                         BPF_ALU64_REG(BPF_ADD, R4, R3),
3860                         BPF_ALU64_REG(BPF_ADD, R4, R4),
3861                         BPF_ALU64_REG(BPF_ADD, R4, R5),
3862                         BPF_ALU64_REG(BPF_ADD, R4, R6),
3863                         BPF_ALU64_REG(BPF_ADD, R4, R7),
3864                         BPF_ALU64_REG(BPF_ADD, R4, R8),
3865                         BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
3866                         BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
3867                         BPF_EXIT_INSN(),
3868                         BPF_ALU64_REG(BPF_ADD, R5, R0),
3869                         BPF_ALU64_REG(BPF_ADD, R5, R1),
3870                         BPF_ALU64_REG(BPF_ADD, R5, R2),
3871                         BPF_ALU64_REG(BPF_ADD, R5, R3),
3872                         BPF_ALU64_REG(BPF_ADD, R5, R4),
3873                         BPF_ALU64_REG(BPF_ADD, R5, R5),
3874                         BPF_ALU64_REG(BPF_ADD, R5, R6),
3875                         BPF_ALU64_REG(BPF_ADD, R5, R7),
3876                         BPF_ALU64_REG(BPF_ADD, R5, R8),
3877                         BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
3878                         BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
3879                         BPF_EXIT_INSN(),
3880                         BPF_ALU64_REG(BPF_ADD, R6, R0),
3881                         BPF_ALU64_REG(BPF_ADD, R6, R1),
3882                         BPF_ALU64_REG(BPF_ADD, R6, R2),
3883                         BPF_ALU64_REG(BPF_ADD, R6, R3),
3884                         BPF_ALU64_REG(BPF_ADD, R6, R4),
3885                         BPF_ALU64_REG(BPF_ADD, R6, R5),
3886                         BPF_ALU64_REG(BPF_ADD, R6, R6),
3887                         BPF_ALU64_REG(BPF_ADD, R6, R7),
3888                         BPF_ALU64_REG(BPF_ADD, R6, R8),
3889                         BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
3890                         BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
3891                         BPF_EXIT_INSN(),
3892                         BPF_ALU64_REG(BPF_ADD, R7, R0),
3893                         BPF_ALU64_REG(BPF_ADD, R7, R1),
3894                         BPF_ALU64_REG(BPF_ADD, R7, R2),
3895                         BPF_ALU64_REG(BPF_ADD, R7, R3),
3896                         BPF_ALU64_REG(BPF_ADD, R7, R4),
3897                         BPF_ALU64_REG(BPF_ADD, R7, R5),
3898                         BPF_ALU64_REG(BPF_ADD, R7, R6),
3899                         BPF_ALU64_REG(BPF_ADD, R7, R7),
3900                         BPF_ALU64_REG(BPF_ADD, R7, R8),
3901                         BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
3902                         BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
3903                         BPF_EXIT_INSN(),
3904                         BPF_ALU64_REG(BPF_ADD, R8, R0),
3905                         BPF_ALU64_REG(BPF_ADD, R8, R1),
3906                         BPF_ALU64_REG(BPF_ADD, R8, R2),
3907                         BPF_ALU64_REG(BPF_ADD, R8, R3),
3908                         BPF_ALU64_REG(BPF_ADD, R8, R4),
3909                         BPF_ALU64_REG(BPF_ADD, R8, R5),
3910                         BPF_ALU64_REG(BPF_ADD, R8, R6),
3911                         BPF_ALU64_REG(BPF_ADD, R8, R7),
3912                         BPF_ALU64_REG(BPF_ADD, R8, R8),
3913                         BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
3914                         BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
3915                         BPF_EXIT_INSN(),
3916                         BPF_ALU64_REG(BPF_ADD, R9, R0),
3917                         BPF_ALU64_REG(BPF_ADD, R9, R1),
3918                         BPF_ALU64_REG(BPF_ADD, R9, R2),
3919                         BPF_ALU64_REG(BPF_ADD, R9, R3),
3920                         BPF_ALU64_REG(BPF_ADD, R9, R4),
3921                         BPF_ALU64_REG(BPF_ADD, R9, R5),
3922                         BPF_ALU64_REG(BPF_ADD, R9, R6),
3923                         BPF_ALU64_REG(BPF_ADD, R9, R7),
3924                         BPF_ALU64_REG(BPF_ADD, R9, R8),
3925                         BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
3926                         BPF_ALU64_REG(BPF_MOV, R0, R9),
3927                         BPF_EXIT_INSN(),
3928                 },
3929                 INTERNAL,
3930                 { },
3931                 { { 0, 2957380 } }
3932         },
3933         {
3934                 "INT: ADD 32-bit",
3935                 .u.insns_int = {
3936                         BPF_ALU32_IMM(BPF_MOV, R0, 20),
3937                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
3938                         BPF_ALU32_IMM(BPF_MOV, R2, 2),
3939                         BPF_ALU32_IMM(BPF_MOV, R3, 3),
3940                         BPF_ALU32_IMM(BPF_MOV, R4, 4),
3941                         BPF_ALU32_IMM(BPF_MOV, R5, 5),
3942                         BPF_ALU32_IMM(BPF_MOV, R6, 6),
3943                         BPF_ALU32_IMM(BPF_MOV, R7, 7),
3944                         BPF_ALU32_IMM(BPF_MOV, R8, 8),
3945                         BPF_ALU32_IMM(BPF_MOV, R9, 9),
3946                         BPF_ALU64_IMM(BPF_ADD, R1, 10),
3947                         BPF_ALU64_IMM(BPF_ADD, R2, 10),
3948                         BPF_ALU64_IMM(BPF_ADD, R3, 10),
3949                         BPF_ALU64_IMM(BPF_ADD, R4, 10),
3950                         BPF_ALU64_IMM(BPF_ADD, R5, 10),
3951                         BPF_ALU64_IMM(BPF_ADD, R6, 10),
3952                         BPF_ALU64_IMM(BPF_ADD, R7, 10),
3953                         BPF_ALU64_IMM(BPF_ADD, R8, 10),
3954                         BPF_ALU64_IMM(BPF_ADD, R9, 10),
3955                         BPF_ALU32_REG(BPF_ADD, R0, R1),
3956                         BPF_ALU32_REG(BPF_ADD, R0, R2),
3957                         BPF_ALU32_REG(BPF_ADD, R0, R3),
3958                         BPF_ALU32_REG(BPF_ADD, R0, R4),
3959                         BPF_ALU32_REG(BPF_ADD, R0, R5),
3960                         BPF_ALU32_REG(BPF_ADD, R0, R6),
3961                         BPF_ALU32_REG(BPF_ADD, R0, R7),
3962                         BPF_ALU32_REG(BPF_ADD, R0, R8),
3963                         BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
3964                         BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
3965                         BPF_EXIT_INSN(),
3966                         BPF_ALU32_REG(BPF_ADD, R1, R0),
3967                         BPF_ALU32_REG(BPF_ADD, R1, R1),
3968                         BPF_ALU32_REG(BPF_ADD, R1, R2),
3969                         BPF_ALU32_REG(BPF_ADD, R1, R3),
3970                         BPF_ALU32_REG(BPF_ADD, R1, R4),
3971                         BPF_ALU32_REG(BPF_ADD, R1, R5),
3972                         BPF_ALU32_REG(BPF_ADD, R1, R6),
3973                         BPF_ALU32_REG(BPF_ADD, R1, R7),
3974                         BPF_ALU32_REG(BPF_ADD, R1, R8),
3975                         BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
3976                         BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
3977                         BPF_EXIT_INSN(),
3978                         BPF_ALU32_REG(BPF_ADD, R2, R0),
3979                         BPF_ALU32_REG(BPF_ADD, R2, R1),
3980                         BPF_ALU32_REG(BPF_ADD, R2, R2),
3981                         BPF_ALU32_REG(BPF_ADD, R2, R3),
3982                         BPF_ALU32_REG(BPF_ADD, R2, R4),
3983                         BPF_ALU32_REG(BPF_ADD, R2, R5),
3984                         BPF_ALU32_REG(BPF_ADD, R2, R6),
3985                         BPF_ALU32_REG(BPF_ADD, R2, R7),
3986                         BPF_ALU32_REG(BPF_ADD, R2, R8),
3987                         BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
3988                         BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
3989                         BPF_EXIT_INSN(),
3990                         BPF_ALU32_REG(BPF_ADD, R3, R0),
3991                         BPF_ALU32_REG(BPF_ADD, R3, R1),
3992                         BPF_ALU32_REG(BPF_ADD, R3, R2),
3993                         BPF_ALU32_REG(BPF_ADD, R3, R3),
3994                         BPF_ALU32_REG(BPF_ADD, R3, R4),
3995                         BPF_ALU32_REG(BPF_ADD, R3, R5),
3996                         BPF_ALU32_REG(BPF_ADD, R3, R6),
3997                         BPF_ALU32_REG(BPF_ADD, R3, R7),
3998                         BPF_ALU32_REG(BPF_ADD, R3, R8),
3999                         BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
4000                         BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
4001                         BPF_EXIT_INSN(),
4002                         BPF_ALU32_REG(BPF_ADD, R4, R0),
4003                         BPF_ALU32_REG(BPF_ADD, R4, R1),
4004                         BPF_ALU32_REG(BPF_ADD, R4, R2),
4005                         BPF_ALU32_REG(BPF_ADD, R4, R3),
4006                         BPF_ALU32_REG(BPF_ADD, R4, R4),
4007                         BPF_ALU32_REG(BPF_ADD, R4, R5),
4008                         BPF_ALU32_REG(BPF_ADD, R4, R6),
4009                         BPF_ALU32_REG(BPF_ADD, R4, R7),
4010                         BPF_ALU32_REG(BPF_ADD, R4, R8),
4011                         BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
4012                         BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
4013                         BPF_EXIT_INSN(),
4014                         BPF_ALU32_REG(BPF_ADD, R5, R0),
4015                         BPF_ALU32_REG(BPF_ADD, R5, R1),
4016                         BPF_ALU32_REG(BPF_ADD, R5, R2),
4017                         BPF_ALU32_REG(BPF_ADD, R5, R3),
4018                         BPF_ALU32_REG(BPF_ADD, R5, R4),
4019                         BPF_ALU32_REG(BPF_ADD, R5, R5),
4020                         BPF_ALU32_REG(BPF_ADD, R5, R6),
4021                         BPF_ALU32_REG(BPF_ADD, R5, R7),
4022                         BPF_ALU32_REG(BPF_ADD, R5, R8),
4023                         BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
4024                         BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
4025                         BPF_EXIT_INSN(),
4026                         BPF_ALU32_REG(BPF_ADD, R6, R0),
4027                         BPF_ALU32_REG(BPF_ADD, R6, R1),
4028                         BPF_ALU32_REG(BPF_ADD, R6, R2),
4029                         BPF_ALU32_REG(BPF_ADD, R6, R3),
4030                         BPF_ALU32_REG(BPF_ADD, R6, R4),
4031                         BPF_ALU32_REG(BPF_ADD, R6, R5),
4032                         BPF_ALU32_REG(BPF_ADD, R6, R6),
4033                         BPF_ALU32_REG(BPF_ADD, R6, R7),
4034                         BPF_ALU32_REG(BPF_ADD, R6, R8),
4035                         BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
4036                         BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
4037                         BPF_EXIT_INSN(),
4038                         BPF_ALU32_REG(BPF_ADD, R7, R0),
4039                         BPF_ALU32_REG(BPF_ADD, R7, R1),
4040                         BPF_ALU32_REG(BPF_ADD, R7, R2),
4041                         BPF_ALU32_REG(BPF_ADD, R7, R3),
4042                         BPF_ALU32_REG(BPF_ADD, R7, R4),
4043                         BPF_ALU32_REG(BPF_ADD, R7, R5),
4044                         BPF_ALU32_REG(BPF_ADD, R7, R6),
4045                         BPF_ALU32_REG(BPF_ADD, R7, R7),
4046                         BPF_ALU32_REG(BPF_ADD, R7, R8),
4047                         BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
4048                         BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
4049                         BPF_EXIT_INSN(),
4050                         BPF_ALU32_REG(BPF_ADD, R8, R0),
4051                         BPF_ALU32_REG(BPF_ADD, R8, R1),
4052                         BPF_ALU32_REG(BPF_ADD, R8, R2),
4053                         BPF_ALU32_REG(BPF_ADD, R8, R3),
4054                         BPF_ALU32_REG(BPF_ADD, R8, R4),
4055                         BPF_ALU32_REG(BPF_ADD, R8, R5),
4056                         BPF_ALU32_REG(BPF_ADD, R8, R6),
4057                         BPF_ALU32_REG(BPF_ADD, R8, R7),
4058                         BPF_ALU32_REG(BPF_ADD, R8, R8),
4059                         BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
4060                         BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
4061                         BPF_EXIT_INSN(),
4062                         BPF_ALU32_REG(BPF_ADD, R9, R0),
4063                         BPF_ALU32_REG(BPF_ADD, R9, R1),
4064                         BPF_ALU32_REG(BPF_ADD, R9, R2),
4065                         BPF_ALU32_REG(BPF_ADD, R9, R3),
4066                         BPF_ALU32_REG(BPF_ADD, R9, R4),
4067                         BPF_ALU32_REG(BPF_ADD, R9, R5),
4068                         BPF_ALU32_REG(BPF_ADD, R9, R6),
4069                         BPF_ALU32_REG(BPF_ADD, R9, R7),
4070                         BPF_ALU32_REG(BPF_ADD, R9, R8),
4071                         BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
4072                         BPF_ALU32_REG(BPF_MOV, R0, R9),
4073                         BPF_EXIT_INSN(),
4074                 },
4075                 INTERNAL,
4076                 { },
4077                 { { 0, 2957380 } }
4078         },
4079         {       /* Mainly checking JIT here. */
4080                 "INT: SUB",
4081                 .u.insns_int = {
4082                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4083                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
4084                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
4085                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
4086                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
4087                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
4088                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
4089                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
4090                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
4091                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
4092                         BPF_ALU64_REG(BPF_SUB, R0, R0),
4093                         BPF_ALU64_REG(BPF_SUB, R0, R1),
4094                         BPF_ALU64_REG(BPF_SUB, R0, R2),
4095                         BPF_ALU64_REG(BPF_SUB, R0, R3),
4096                         BPF_ALU64_REG(BPF_SUB, R0, R4),
4097                         BPF_ALU64_REG(BPF_SUB, R0, R5),
4098                         BPF_ALU64_REG(BPF_SUB, R0, R6),
4099                         BPF_ALU64_REG(BPF_SUB, R0, R7),
4100                         BPF_ALU64_REG(BPF_SUB, R0, R8),
4101                         BPF_ALU64_REG(BPF_SUB, R0, R9),
4102                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
4103                         BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
4104                         BPF_EXIT_INSN(),
4105                         BPF_ALU64_REG(BPF_SUB, R1, R0),
4106                         BPF_ALU64_REG(BPF_SUB, R1, R2),
4107                         BPF_ALU64_REG(BPF_SUB, R1, R3),
4108                         BPF_ALU64_REG(BPF_SUB, R1, R4),
4109                         BPF_ALU64_REG(BPF_SUB, R1, R5),
4110                         BPF_ALU64_REG(BPF_SUB, R1, R6),
4111                         BPF_ALU64_REG(BPF_SUB, R1, R7),
4112                         BPF_ALU64_REG(BPF_SUB, R1, R8),
4113                         BPF_ALU64_REG(BPF_SUB, R1, R9),
4114                         BPF_ALU64_IMM(BPF_SUB, R1, 10),
4115                         BPF_ALU64_REG(BPF_SUB, R2, R0),
4116                         BPF_ALU64_REG(BPF_SUB, R2, R1),
4117                         BPF_ALU64_REG(BPF_SUB, R2, R3),
4118                         BPF_ALU64_REG(BPF_SUB, R2, R4),
4119                         BPF_ALU64_REG(BPF_SUB, R2, R5),
4120                         BPF_ALU64_REG(BPF_SUB, R2, R6),
4121                         BPF_ALU64_REG(BPF_SUB, R2, R7),
4122                         BPF_ALU64_REG(BPF_SUB, R2, R8),
4123                         BPF_ALU64_REG(BPF_SUB, R2, R9),
4124                         BPF_ALU64_IMM(BPF_SUB, R2, 10),
4125                         BPF_ALU64_REG(BPF_SUB, R3, R0),
4126                         BPF_ALU64_REG(BPF_SUB, R3, R1),
4127                         BPF_ALU64_REG(BPF_SUB, R3, R2),
4128                         BPF_ALU64_REG(BPF_SUB, R3, R4),
4129                         BPF_ALU64_REG(BPF_SUB, R3, R5),
4130                         BPF_ALU64_REG(BPF_SUB, R3, R6),
4131                         BPF_ALU64_REG(BPF_SUB, R3, R7),
4132                         BPF_ALU64_REG(BPF_SUB, R3, R8),
4133                         BPF_ALU64_REG(BPF_SUB, R3, R9),
4134                         BPF_ALU64_IMM(BPF_SUB, R3, 10),
4135                         BPF_ALU64_REG(BPF_SUB, R4, R0),
4136                         BPF_ALU64_REG(BPF_SUB, R4, R1),
4137                         BPF_ALU64_REG(BPF_SUB, R4, R2),
4138                         BPF_ALU64_REG(BPF_SUB, R4, R3),
4139                         BPF_ALU64_REG(BPF_SUB, R4, R5),
4140                         BPF_ALU64_REG(BPF_SUB, R4, R6),
4141                         BPF_ALU64_REG(BPF_SUB, R4, R7),
4142                         BPF_ALU64_REG(BPF_SUB, R4, R8),
4143                         BPF_ALU64_REG(BPF_SUB, R4, R9),
4144                         BPF_ALU64_IMM(BPF_SUB, R4, 10),
4145                         BPF_ALU64_REG(BPF_SUB, R5, R0),
4146                         BPF_ALU64_REG(BPF_SUB, R5, R1),
4147                         BPF_ALU64_REG(BPF_SUB, R5, R2),
4148                         BPF_ALU64_REG(BPF_SUB, R5, R3),
4149                         BPF_ALU64_REG(BPF_SUB, R5, R4),
4150                         BPF_ALU64_REG(BPF_SUB, R5, R6),
4151                         BPF_ALU64_REG(BPF_SUB, R5, R7),
4152                         BPF_ALU64_REG(BPF_SUB, R5, R8),
4153                         BPF_ALU64_REG(BPF_SUB, R5, R9),
4154                         BPF_ALU64_IMM(BPF_SUB, R5, 10),
4155                         BPF_ALU64_REG(BPF_SUB, R6, R0),
4156                         BPF_ALU64_REG(BPF_SUB, R6, R1),
4157                         BPF_ALU64_REG(BPF_SUB, R6, R2),
4158                         BPF_ALU64_REG(BPF_SUB, R6, R3),
4159                         BPF_ALU64_REG(BPF_SUB, R6, R4),
4160                         BPF_ALU64_REG(BPF_SUB, R6, R5),
4161                         BPF_ALU64_REG(BPF_SUB, R6, R7),
4162                         BPF_ALU64_REG(BPF_SUB, R6, R8),
4163                         BPF_ALU64_REG(BPF_SUB, R6, R9),
4164                         BPF_ALU64_IMM(BPF_SUB, R6, 10),
4165                         BPF_ALU64_REG(BPF_SUB, R7, R0),
4166                         BPF_ALU64_REG(BPF_SUB, R7, R1),
4167                         BPF_ALU64_REG(BPF_SUB, R7, R2),
4168                         BPF_ALU64_REG(BPF_SUB, R7, R3),
4169                         BPF_ALU64_REG(BPF_SUB, R7, R4),
4170                         BPF_ALU64_REG(BPF_SUB, R7, R5),
4171                         BPF_ALU64_REG(BPF_SUB, R7, R6),
4172                         BPF_ALU64_REG(BPF_SUB, R7, R8),
4173                         BPF_ALU64_REG(BPF_SUB, R7, R9),
4174                         BPF_ALU64_IMM(BPF_SUB, R7, 10),
4175                         BPF_ALU64_REG(BPF_SUB, R8, R0),
4176                         BPF_ALU64_REG(BPF_SUB, R8, R1),
4177                         BPF_ALU64_REG(BPF_SUB, R8, R2),
4178                         BPF_ALU64_REG(BPF_SUB, R8, R3),
4179                         BPF_ALU64_REG(BPF_SUB, R8, R4),
4180                         BPF_ALU64_REG(BPF_SUB, R8, R5),
4181                         BPF_ALU64_REG(BPF_SUB, R8, R6),
4182                         BPF_ALU64_REG(BPF_SUB, R8, R7),
4183                         BPF_ALU64_REG(BPF_SUB, R8, R9),
4184                         BPF_ALU64_IMM(BPF_SUB, R8, 10),
4185                         BPF_ALU64_REG(BPF_SUB, R9, R0),
4186                         BPF_ALU64_REG(BPF_SUB, R9, R1),
4187                         BPF_ALU64_REG(BPF_SUB, R9, R2),
4188                         BPF_ALU64_REG(BPF_SUB, R9, R3),
4189                         BPF_ALU64_REG(BPF_SUB, R9, R4),
4190                         BPF_ALU64_REG(BPF_SUB, R9, R5),
4191                         BPF_ALU64_REG(BPF_SUB, R9, R6),
4192                         BPF_ALU64_REG(BPF_SUB, R9, R7),
4193                         BPF_ALU64_REG(BPF_SUB, R9, R8),
4194                         BPF_ALU64_IMM(BPF_SUB, R9, 10),
4195                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
4196                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
4197                         BPF_ALU64_REG(BPF_SUB, R0, R1),
4198                         BPF_ALU64_REG(BPF_SUB, R0, R2),
4199                         BPF_ALU64_REG(BPF_SUB, R0, R3),
4200                         BPF_ALU64_REG(BPF_SUB, R0, R4),
4201                         BPF_ALU64_REG(BPF_SUB, R0, R5),
4202                         BPF_ALU64_REG(BPF_SUB, R0, R6),
4203                         BPF_ALU64_REG(BPF_SUB, R0, R7),
4204                         BPF_ALU64_REG(BPF_SUB, R0, R8),
4205                         BPF_ALU64_REG(BPF_SUB, R0, R9),
4206                         BPF_EXIT_INSN(),
4207                 },
4208                 INTERNAL,
4209                 { },
4210                 { { 0, 11 } }
4211         },
4212         {       /* Mainly checking JIT here. */
4213                 "INT: XOR",
4214                 .u.insns_int = {
4215                         BPF_ALU64_REG(BPF_SUB, R0, R0),
4216                         BPF_ALU64_REG(BPF_XOR, R1, R1),
4217                         BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
4218                         BPF_EXIT_INSN(),
4219                         BPF_ALU64_IMM(BPF_MOV, R0, 10),
4220                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
4221                         BPF_ALU64_REG(BPF_SUB, R1, R1),
4222                         BPF_ALU64_REG(BPF_XOR, R2, R2),
4223                         BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
4224                         BPF_EXIT_INSN(),
4225                         BPF_ALU64_REG(BPF_SUB, R2, R2),
4226                         BPF_ALU64_REG(BPF_XOR, R3, R3),
4227                         BPF_ALU64_IMM(BPF_MOV, R0, 10),
4228                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
4229                         BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
4230                         BPF_EXIT_INSN(),
4231                         BPF_ALU64_REG(BPF_SUB, R3, R3),
4232                         BPF_ALU64_REG(BPF_XOR, R4, R4),
4233                         BPF_ALU64_IMM(BPF_MOV, R2, 1),
4234                         BPF_ALU64_IMM(BPF_MOV, R5, -1),
4235                         BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
4236                         BPF_EXIT_INSN(),
4237                         BPF_ALU64_REG(BPF_SUB, R4, R4),
4238                         BPF_ALU64_REG(BPF_XOR, R5, R5),
4239                         BPF_ALU64_IMM(BPF_MOV, R3, 1),
4240                         BPF_ALU64_IMM(BPF_MOV, R7, -1),
4241                         BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
4242                         BPF_EXIT_INSN(),
4243                         BPF_ALU64_IMM(BPF_MOV, R5, 1),
4244                         BPF_ALU64_REG(BPF_SUB, R5, R5),
4245                         BPF_ALU64_REG(BPF_XOR, R6, R6),
4246                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
4247                         BPF_ALU64_IMM(BPF_MOV, R8, -1),
4248                         BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
4249                         BPF_EXIT_INSN(),
4250                         BPF_ALU64_REG(BPF_SUB, R6, R6),
4251                         BPF_ALU64_REG(BPF_XOR, R7, R7),
4252                         BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
4253                         BPF_EXIT_INSN(),
4254                         BPF_ALU64_REG(BPF_SUB, R7, R7),
4255                         BPF_ALU64_REG(BPF_XOR, R8, R8),
4256                         BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
4257                         BPF_EXIT_INSN(),
4258                         BPF_ALU64_REG(BPF_SUB, R8, R8),
4259                         BPF_ALU64_REG(BPF_XOR, R9, R9),
4260                         BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
4261                         BPF_EXIT_INSN(),
4262                         BPF_ALU64_REG(BPF_SUB, R9, R9),
4263                         BPF_ALU64_REG(BPF_XOR, R0, R0),
4264                         BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
4265                         BPF_EXIT_INSN(),
4266                         BPF_ALU64_REG(BPF_SUB, R1, R1),
4267                         BPF_ALU64_REG(BPF_XOR, R0, R0),
4268                         BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
4269                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4270                         BPF_EXIT_INSN(),
4271                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
4272                         BPF_EXIT_INSN(),
4273                 },
4274                 INTERNAL,
4275                 { },
4276                 { { 0, 1 } }
4277         },
4278         {       /* Mainly checking JIT here. */
4279                 "INT: MUL",
4280                 .u.insns_int = {
4281                         BPF_ALU64_IMM(BPF_MOV, R0, 11),
4282                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
4283                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
4284                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
4285                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
4286                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
4287                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
4288                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
4289                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
4290                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
4291                         BPF_ALU64_REG(BPF_MUL, R0, R0),
4292                         BPF_ALU64_REG(BPF_MUL, R0, R1),
4293                         BPF_ALU64_REG(BPF_MUL, R0, R2),
4294                         BPF_ALU64_REG(BPF_MUL, R0, R3),
4295                         BPF_ALU64_REG(BPF_MUL, R0, R4),
4296                         BPF_ALU64_REG(BPF_MUL, R0, R5),
4297                         BPF_ALU64_REG(BPF_MUL, R0, R6),
4298                         BPF_ALU64_REG(BPF_MUL, R0, R7),
4299                         BPF_ALU64_REG(BPF_MUL, R0, R8),
4300                         BPF_ALU64_REG(BPF_MUL, R0, R9),
4301                         BPF_ALU64_IMM(BPF_MUL, R0, 10),
4302                         BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
4303                         BPF_EXIT_INSN(),
4304                         BPF_ALU64_REG(BPF_MUL, R1, R0),
4305                         BPF_ALU64_REG(BPF_MUL, R1, R2),
4306                         BPF_ALU64_REG(BPF_MUL, R1, R3),
4307                         BPF_ALU64_REG(BPF_MUL, R1, R4),
4308                         BPF_ALU64_REG(BPF_MUL, R1, R5),
4309                         BPF_ALU64_REG(BPF_MUL, R1, R6),
4310                         BPF_ALU64_REG(BPF_MUL, R1, R7),
4311                         BPF_ALU64_REG(BPF_MUL, R1, R8),
4312                         BPF_ALU64_REG(BPF_MUL, R1, R9),
4313                         BPF_ALU64_IMM(BPF_MUL, R1, 10),
4314                         BPF_ALU64_REG(BPF_MOV, R2, R1),
4315                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
4316                         BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
4317                         BPF_EXIT_INSN(),
4318                         BPF_ALU64_IMM(BPF_LSH, R1, 32),
4319                         BPF_ALU64_IMM(BPF_ARSH, R1, 32),
4320                         BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
4321                         BPF_EXIT_INSN(),
4322                         BPF_ALU64_REG(BPF_MUL, R2, R0),
4323                         BPF_ALU64_REG(BPF_MUL, R2, R1),
4324                         BPF_ALU64_REG(BPF_MUL, R2, R3),
4325                         BPF_ALU64_REG(BPF_MUL, R2, R4),
4326                         BPF_ALU64_REG(BPF_MUL, R2, R5),
4327                         BPF_ALU64_REG(BPF_MUL, R2, R6),
4328                         BPF_ALU64_REG(BPF_MUL, R2, R7),
4329                         BPF_ALU64_REG(BPF_MUL, R2, R8),
4330                         BPF_ALU64_REG(BPF_MUL, R2, R9),
4331                         BPF_ALU64_IMM(BPF_MUL, R2, 10),
4332                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
4333                         BPF_ALU64_REG(BPF_MOV, R0, R2),
4334                         BPF_EXIT_INSN(),
4335                 },
4336                 INTERNAL,
4337                 { },
4338                 { { 0, 0x35d97ef2 } }
4339         },
4340         {       /* Mainly checking JIT here. */
4341                 "MOV REG64",
4342                 .u.insns_int = {
4343                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
4344                         BPF_MOV64_REG(R1, R0),
4345                         BPF_MOV64_REG(R2, R1),
4346                         BPF_MOV64_REG(R3, R2),
4347                         BPF_MOV64_REG(R4, R3),
4348                         BPF_MOV64_REG(R5, R4),
4349                         BPF_MOV64_REG(R6, R5),
4350                         BPF_MOV64_REG(R7, R6),
4351                         BPF_MOV64_REG(R8, R7),
4352                         BPF_MOV64_REG(R9, R8),
4353                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4354                         BPF_ALU64_IMM(BPF_MOV, R1, 0),
4355                         BPF_ALU64_IMM(BPF_MOV, R2, 0),
4356                         BPF_ALU64_IMM(BPF_MOV, R3, 0),
4357                         BPF_ALU64_IMM(BPF_MOV, R4, 0),
4358                         BPF_ALU64_IMM(BPF_MOV, R5, 0),
4359                         BPF_ALU64_IMM(BPF_MOV, R6, 0),
4360                         BPF_ALU64_IMM(BPF_MOV, R7, 0),
4361                         BPF_ALU64_IMM(BPF_MOV, R8, 0),
4362                         BPF_ALU64_IMM(BPF_MOV, R9, 0),
4363                         BPF_ALU64_REG(BPF_ADD, R0, R0),
4364                         BPF_ALU64_REG(BPF_ADD, R0, R1),
4365                         BPF_ALU64_REG(BPF_ADD, R0, R2),
4366                         BPF_ALU64_REG(BPF_ADD, R0, R3),
4367                         BPF_ALU64_REG(BPF_ADD, R0, R4),
4368                         BPF_ALU64_REG(BPF_ADD, R0, R5),
4369                         BPF_ALU64_REG(BPF_ADD, R0, R6),
4370                         BPF_ALU64_REG(BPF_ADD, R0, R7),
4371                         BPF_ALU64_REG(BPF_ADD, R0, R8),
4372                         BPF_ALU64_REG(BPF_ADD, R0, R9),
4373                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
4374                         BPF_EXIT_INSN(),
4375                 },
4376                 INTERNAL,
4377                 { },
4378                 { { 0, 0xfefe } }
4379         },
4380         {       /* Mainly checking JIT here. */
4381                 "MOV REG32",
4382                 .u.insns_int = {
4383                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
4384                         BPF_MOV64_REG(R1, R0),
4385                         BPF_MOV64_REG(R2, R1),
4386                         BPF_MOV64_REG(R3, R2),
4387                         BPF_MOV64_REG(R4, R3),
4388                         BPF_MOV64_REG(R5, R4),
4389                         BPF_MOV64_REG(R6, R5),
4390                         BPF_MOV64_REG(R7, R6),
4391                         BPF_MOV64_REG(R8, R7),
4392                         BPF_MOV64_REG(R9, R8),
4393                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4394                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
4395                         BPF_ALU32_IMM(BPF_MOV, R2, 0),
4396                         BPF_ALU32_IMM(BPF_MOV, R3, 0),
4397                         BPF_ALU32_IMM(BPF_MOV, R4, 0),
4398                         BPF_ALU32_IMM(BPF_MOV, R5, 0),
4399                         BPF_ALU32_IMM(BPF_MOV, R6, 0),
4400                         BPF_ALU32_IMM(BPF_MOV, R7, 0),
4401                         BPF_ALU32_IMM(BPF_MOV, R8, 0),
4402                         BPF_ALU32_IMM(BPF_MOV, R9, 0),
4403                         BPF_ALU64_REG(BPF_ADD, R0, R0),
4404                         BPF_ALU64_REG(BPF_ADD, R0, R1),
4405                         BPF_ALU64_REG(BPF_ADD, R0, R2),
4406                         BPF_ALU64_REG(BPF_ADD, R0, R3),
4407                         BPF_ALU64_REG(BPF_ADD, R0, R4),
4408                         BPF_ALU64_REG(BPF_ADD, R0, R5),
4409                         BPF_ALU64_REG(BPF_ADD, R0, R6),
4410                         BPF_ALU64_REG(BPF_ADD, R0, R7),
4411                         BPF_ALU64_REG(BPF_ADD, R0, R8),
4412                         BPF_ALU64_REG(BPF_ADD, R0, R9),
4413                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
4414                         BPF_EXIT_INSN(),
4415                 },
4416                 INTERNAL,
4417                 { },
4418                 { { 0, 0xfefe } }
4419         },
4420         {       /* Mainly checking JIT here. */
4421                 "LD IMM64",
4422                 .u.insns_int = {
4423                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
4424                         BPF_MOV64_REG(R1, R0),
4425                         BPF_MOV64_REG(R2, R1),
4426                         BPF_MOV64_REG(R3, R2),
4427                         BPF_MOV64_REG(R4, R3),
4428                         BPF_MOV64_REG(R5, R4),
4429                         BPF_MOV64_REG(R6, R5),
4430                         BPF_MOV64_REG(R7, R6),
4431                         BPF_MOV64_REG(R8, R7),
4432                         BPF_MOV64_REG(R9, R8),
4433                         BPF_LD_IMM64(R0, 0x0LL),
4434                         BPF_LD_IMM64(R1, 0x0LL),
4435                         BPF_LD_IMM64(R2, 0x0LL),
4436                         BPF_LD_IMM64(R3, 0x0LL),
4437                         BPF_LD_IMM64(R4, 0x0LL),
4438                         BPF_LD_IMM64(R5, 0x0LL),
4439                         BPF_LD_IMM64(R6, 0x0LL),
4440                         BPF_LD_IMM64(R7, 0x0LL),
4441                         BPF_LD_IMM64(R8, 0x0LL),
4442                         BPF_LD_IMM64(R9, 0x0LL),
4443                         BPF_ALU64_REG(BPF_ADD, R0, R0),
4444                         BPF_ALU64_REG(BPF_ADD, R0, R1),
4445                         BPF_ALU64_REG(BPF_ADD, R0, R2),
4446                         BPF_ALU64_REG(BPF_ADD, R0, R3),
4447                         BPF_ALU64_REG(BPF_ADD, R0, R4),
4448                         BPF_ALU64_REG(BPF_ADD, R0, R5),
4449                         BPF_ALU64_REG(BPF_ADD, R0, R6),
4450                         BPF_ALU64_REG(BPF_ADD, R0, R7),
4451                         BPF_ALU64_REG(BPF_ADD, R0, R8),
4452                         BPF_ALU64_REG(BPF_ADD, R0, R9),
4453                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
4454                         BPF_EXIT_INSN(),
4455                 },
4456                 INTERNAL,
4457                 { },
4458                 { { 0, 0xfefe } }
4459         },
4460         {
4461                 "INT: ALU MIX",
4462                 .u.insns_int = {
4463                         BPF_ALU64_IMM(BPF_MOV, R0, 11),
4464                         BPF_ALU64_IMM(BPF_ADD, R0, -1),
4465                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
4466                         BPF_ALU64_IMM(BPF_XOR, R2, 3),
4467                         BPF_ALU64_REG(BPF_DIV, R0, R2),
4468                         BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
4469                         BPF_EXIT_INSN(),
4470                         BPF_ALU64_IMM(BPF_MOD, R0, 3),
4471                         BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
4472                         BPF_EXIT_INSN(),
4473                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
4474                         BPF_EXIT_INSN(),
4475                 },
4476                 INTERNAL,
4477                 { },
4478                 { { 0, -1 } }
4479         },
4480         {
4481                 "INT: shifts by register",
4482                 .u.insns_int = {
4483                         BPF_MOV64_IMM(R0, -1234),
4484                         BPF_MOV64_IMM(R1, 1),
4485                         BPF_ALU32_REG(BPF_RSH, R0, R1),
4486                         BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
4487                         BPF_EXIT_INSN(),
4488                         BPF_MOV64_IMM(R2, 1),
4489                         BPF_ALU64_REG(BPF_LSH, R0, R2),
4490                         BPF_MOV32_IMM(R4, -1234),
4491                         BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
4492                         BPF_EXIT_INSN(),
4493                         BPF_ALU64_IMM(BPF_AND, R4, 63),
4494                         BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
4495                         BPF_MOV64_IMM(R3, 47),
4496                         BPF_ALU64_REG(BPF_ARSH, R0, R3),
4497                         BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
4498                         BPF_EXIT_INSN(),
4499                         BPF_MOV64_IMM(R2, 1),
4500                         BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
4501                         BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
4502                         BPF_EXIT_INSN(),
4503                         BPF_MOV64_IMM(R4, 4),
4504                         BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
4505                         BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
4506                         BPF_EXIT_INSN(),
4507                         BPF_MOV64_IMM(R4, 5),
4508                         BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
4509                         BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
4510                         BPF_EXIT_INSN(),
4511                         BPF_MOV64_IMM(R0, -1),
4512                         BPF_EXIT_INSN(),
4513                 },
4514                 INTERNAL,
4515                 { },
4516                 { { 0, -1 } }
4517         },
4518 #ifdef CONFIG_32BIT
4519         {
4520                 "INT: 32-bit context pointer word order and zero-extension",
4521                 .u.insns_int = {
4522                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4523                         BPF_JMP32_IMM(BPF_JEQ, R1, 0, 3),
4524                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
4525                         BPF_JMP32_IMM(BPF_JNE, R1, 0, 1),
4526                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4527                         BPF_EXIT_INSN(),
4528                 },
4529                 INTERNAL,
4530                 { },
4531                 { { 0, 1 } }
4532         },
4533 #endif
4534         {
4535                 "check: missing ret",
4536                 .u.insns = {
4537                         BPF_STMT(BPF_LD | BPF_IMM, 1),
4538                 },
4539                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4540                 { },
4541                 { },
4542                 .fill_helper = NULL,
4543                 .expected_errcode = -EINVAL,
4544         },
4545         {
4546                 "check: div_k_0",
4547                 .u.insns = {
4548                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
4549                         BPF_STMT(BPF_RET | BPF_K, 0)
4550                 },
4551                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4552                 { },
4553                 { },
4554                 .fill_helper = NULL,
4555                 .expected_errcode = -EINVAL,
4556         },
4557         {
4558                 "check: unknown insn",
4559                 .u.insns = {
4560                         /* seccomp insn, rejected in socket filter */
4561                         BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
4562                         BPF_STMT(BPF_RET | BPF_K, 0)
4563                 },
4564                 CLASSIC | FLAG_EXPECTED_FAIL,
4565                 { },
4566                 { },
4567                 .fill_helper = NULL,
4568                 .expected_errcode = -EINVAL,
4569         },
4570         {
4571                 "check: out of range spill/fill",
4572                 .u.insns = {
4573                         BPF_STMT(BPF_STX, 16),
4574                         BPF_STMT(BPF_RET | BPF_K, 0)
4575                 },
4576                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4577                 { },
4578                 { },
4579                 .fill_helper = NULL,
4580                 .expected_errcode = -EINVAL,
4581         },
4582         {
4583                 "JUMPS + HOLES",
4584                 .u.insns = {
4585                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4586                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
4587                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4588                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4589                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4590                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4591                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4592                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4593                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4594                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4595                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4596                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4597                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4598                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4599                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4600                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
4601                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4602                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
4603                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4604                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
4605                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
4606                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4607                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4608                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4609                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4610                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4611                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4612                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4613                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4614                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4615                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4616                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4617                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4618                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4619                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
4620                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
4621                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4622                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
4623                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
4624                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4625                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4626                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4627                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4628                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4629                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4630                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4631                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4632                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4633                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4634                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4635                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4636                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4637                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
4638                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
4639                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4640                         BPF_STMT(BPF_RET | BPF_A, 0),
4641                         BPF_STMT(BPF_RET | BPF_A, 0),
4642                 },
4643                 CLASSIC,
4644                 { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
4645                   0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
4646                   0x08, 0x00,
4647                   0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
4648                   0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
4649                   0xc0, 0xa8, 0x33, 0x01,
4650                   0xc0, 0xa8, 0x33, 0x02,
4651                   0xbb, 0xb6,
4652                   0xa9, 0xfa,
4653                   0x00, 0x14, 0x00, 0x00,
4654                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4655                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4656                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4657                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4658                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4659                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4660                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
4661                   0xcc, 0xcc, 0xcc, 0xcc },
4662                 { { 88, 0x001b } }
4663         },
4664         {
4665                 "check: RET X",
4666                 .u.insns = {
4667                         BPF_STMT(BPF_RET | BPF_X, 0),
4668                 },
4669                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4670                 { },
4671                 { },
4672                 .fill_helper = NULL,
4673                 .expected_errcode = -EINVAL,
4674         },
4675         {
4676                 "check: LDX + RET X",
4677                 .u.insns = {
4678                         BPF_STMT(BPF_LDX | BPF_IMM, 42),
4679                         BPF_STMT(BPF_RET | BPF_X, 0),
4680                 },
4681                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4682                 { },
4683                 { },
4684                 .fill_helper = NULL,
4685                 .expected_errcode = -EINVAL,
4686         },
4687         {       /* Mainly checking JIT here. */
4688                 "M[]: alt STX + LDX",
4689                 .u.insns = {
4690                         BPF_STMT(BPF_LDX | BPF_IMM, 100),
4691                         BPF_STMT(BPF_STX, 0),
4692                         BPF_STMT(BPF_LDX | BPF_MEM, 0),
4693                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4694                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4695                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4696                         BPF_STMT(BPF_STX, 1),
4697                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
4698                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4699                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4700                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4701                         BPF_STMT(BPF_STX, 2),
4702                         BPF_STMT(BPF_LDX | BPF_MEM, 2),
4703                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4704                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4705                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4706                         BPF_STMT(BPF_STX, 3),
4707                         BPF_STMT(BPF_LDX | BPF_MEM, 3),
4708                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4709                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4710                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4711                         BPF_STMT(BPF_STX, 4),
4712                         BPF_STMT(BPF_LDX | BPF_MEM, 4),
4713                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4714                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4715                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4716                         BPF_STMT(BPF_STX, 5),
4717                         BPF_STMT(BPF_LDX | BPF_MEM, 5),
4718                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4719                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4720                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4721                         BPF_STMT(BPF_STX, 6),
4722                         BPF_STMT(BPF_LDX | BPF_MEM, 6),
4723                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4724                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4725                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4726                         BPF_STMT(BPF_STX, 7),
4727                         BPF_STMT(BPF_LDX | BPF_MEM, 7),
4728                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4729                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4730                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4731                         BPF_STMT(BPF_STX, 8),
4732                         BPF_STMT(BPF_LDX | BPF_MEM, 8),
4733                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4734                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4735                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4736                         BPF_STMT(BPF_STX, 9),
4737                         BPF_STMT(BPF_LDX | BPF_MEM, 9),
4738                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4739                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4740                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4741                         BPF_STMT(BPF_STX, 10),
4742                         BPF_STMT(BPF_LDX | BPF_MEM, 10),
4743                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4744                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4745                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4746                         BPF_STMT(BPF_STX, 11),
4747                         BPF_STMT(BPF_LDX | BPF_MEM, 11),
4748                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4749                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4750                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4751                         BPF_STMT(BPF_STX, 12),
4752                         BPF_STMT(BPF_LDX | BPF_MEM, 12),
4753                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4754                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4755                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4756                         BPF_STMT(BPF_STX, 13),
4757                         BPF_STMT(BPF_LDX | BPF_MEM, 13),
4758                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4759                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4760                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4761                         BPF_STMT(BPF_STX, 14),
4762                         BPF_STMT(BPF_LDX | BPF_MEM, 14),
4763                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4764                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4765                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4766                         BPF_STMT(BPF_STX, 15),
4767                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
4768                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4769                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4770                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4771                         BPF_STMT(BPF_RET | BPF_A, 0),
4772                 },
4773                 CLASSIC | FLAG_NO_DATA,
4774                 { },
4775                 { { 0, 116 } },
4776         },
4777         {       /* Mainly checking JIT here. */
4778                 "M[]: full STX + full LDX",
4779                 .u.insns = {
4780                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
4781                         BPF_STMT(BPF_STX, 0),
4782                         BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
4783                         BPF_STMT(BPF_STX, 1),
4784                         BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
4785                         BPF_STMT(BPF_STX, 2),
4786                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
4787                         BPF_STMT(BPF_STX, 3),
4788                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
4789                         BPF_STMT(BPF_STX, 4),
4790                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
4791                         BPF_STMT(BPF_STX, 5),
4792                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
4793                         BPF_STMT(BPF_STX, 6),
4794                         BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
4795                         BPF_STMT(BPF_STX, 7),
4796                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
4797                         BPF_STMT(BPF_STX, 8),
4798                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
4799                         BPF_STMT(BPF_STX, 9),
4800                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
4801                         BPF_STMT(BPF_STX, 10),
4802                         BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
4803                         BPF_STMT(BPF_STX, 11),
4804                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
4805                         BPF_STMT(BPF_STX, 12),
4806                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
4807                         BPF_STMT(BPF_STX, 13),
4808                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
4809                         BPF_STMT(BPF_STX, 14),
4810                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
4811                         BPF_STMT(BPF_STX, 15),
4812                         BPF_STMT(BPF_LDX | BPF_MEM, 0),
4813                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4814                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
4815                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4816                         BPF_STMT(BPF_LDX | BPF_MEM, 2),
4817                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4818                         BPF_STMT(BPF_LDX | BPF_MEM, 3),
4819                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4820                         BPF_STMT(BPF_LDX | BPF_MEM, 4),
4821                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4822                         BPF_STMT(BPF_LDX | BPF_MEM, 5),
4823                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4824                         BPF_STMT(BPF_LDX | BPF_MEM, 6),
4825                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4826                         BPF_STMT(BPF_LDX | BPF_MEM, 7),
4827                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4828                         BPF_STMT(BPF_LDX | BPF_MEM, 8),
4829                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4830                         BPF_STMT(BPF_LDX | BPF_MEM, 9),
4831                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4832                         BPF_STMT(BPF_LDX | BPF_MEM, 10),
4833                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4834                         BPF_STMT(BPF_LDX | BPF_MEM, 11),
4835                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4836                         BPF_STMT(BPF_LDX | BPF_MEM, 12),
4837                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4838                         BPF_STMT(BPF_LDX | BPF_MEM, 13),
4839                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4840                         BPF_STMT(BPF_LDX | BPF_MEM, 14),
4841                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4842                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
4843                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4844                         BPF_STMT(BPF_RET | BPF_A, 0),
4845                 },
4846                 CLASSIC | FLAG_NO_DATA,
4847                 { },
4848                 { { 0, 0x2a5a5e5 } },
4849         },
4850         {
4851                 "check: SKF_AD_MAX",
4852                 .u.insns = {
4853                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
4854                                  SKF_AD_OFF + SKF_AD_MAX),
4855                         BPF_STMT(BPF_RET | BPF_A, 0),
4856                 },
4857                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4858                 { },
4859                 { },
4860                 .fill_helper = NULL,
4861                 .expected_errcode = -EINVAL,
4862         },
4863         {       /* Passes checker but fails during runtime. */
4864                 "LD [SKF_AD_OFF-1]",
4865                 .u.insns = {
4866                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
4867                                  SKF_AD_OFF - 1),
4868                         BPF_STMT(BPF_RET | BPF_K, 1),
4869                 },
4870                 CLASSIC,
4871                 { },
4872                 { { 1, 0 } },
4873         },
4874         {
4875                 "load 64-bit immediate",
4876                 .u.insns_int = {
4877                         BPF_LD_IMM64(R1, 0x567800001234LL),
4878                         BPF_MOV64_REG(R2, R1),
4879                         BPF_MOV64_REG(R3, R2),
4880                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
4881                         BPF_ALU64_IMM(BPF_LSH, R3, 32),
4882                         BPF_ALU64_IMM(BPF_RSH, R3, 32),
4883                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4884                         BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
4885                         BPF_EXIT_INSN(),
4886                         BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
4887                         BPF_EXIT_INSN(),
4888                         BPF_LD_IMM64(R0, 0x1ffffffffLL),
4889                         BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
4890                         BPF_EXIT_INSN(),
4891                 },
4892                 INTERNAL,
4893                 { },
4894                 { { 0, 1 } }
4895         },
4896         /* BPF_ALU | BPF_MOV | BPF_X */
4897         {
4898                 "ALU_MOV_X: dst = 2",
4899                 .u.insns_int = {
4900                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
4901                         BPF_ALU32_REG(BPF_MOV, R0, R1),
4902                         BPF_EXIT_INSN(),
4903                 },
4904                 INTERNAL,
4905                 { },
4906                 { { 0, 2 } },
4907         },
4908         {
4909                 "ALU_MOV_X: dst = 4294967295",
4910                 .u.insns_int = {
4911                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
4912                         BPF_ALU32_REG(BPF_MOV, R0, R1),
4913                         BPF_EXIT_INSN(),
4914                 },
4915                 INTERNAL,
4916                 { },
4917                 { { 0, 4294967295U } },
4918         },
4919         {
4920                 "ALU64_MOV_X: dst = 2",
4921                 .u.insns_int = {
4922                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
4923                         BPF_ALU64_REG(BPF_MOV, R0, R1),
4924                         BPF_EXIT_INSN(),
4925                 },
4926                 INTERNAL,
4927                 { },
4928                 { { 0, 2 } },
4929         },
4930         {
4931                 "ALU64_MOV_X: dst = 4294967295",
4932                 .u.insns_int = {
4933                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
4934                         BPF_ALU64_REG(BPF_MOV, R0, R1),
4935                         BPF_EXIT_INSN(),
4936                 },
4937                 INTERNAL,
4938                 { },
4939                 { { 0, 4294967295U } },
4940         },
4941         /* BPF_ALU | BPF_MOV | BPF_K */
4942         {
4943                 "ALU_MOV_K: dst = 2",
4944                 .u.insns_int = {
4945                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
4946                         BPF_EXIT_INSN(),
4947                 },
4948                 INTERNAL,
4949                 { },
4950                 { { 0, 2 } },
4951         },
4952         {
4953                 "ALU_MOV_K: dst = 4294967295",
4954                 .u.insns_int = {
4955                         BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
4956                         BPF_EXIT_INSN(),
4957                 },
4958                 INTERNAL,
4959                 { },
4960                 { { 0, 4294967295U } },
4961         },
4962         {
4963                 "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
4964                 .u.insns_int = {
4965                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4966                         BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
4967                         BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
4968                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4969                         BPF_MOV32_IMM(R0, 2),
4970                         BPF_EXIT_INSN(),
4971                         BPF_MOV32_IMM(R0, 1),
4972                         BPF_EXIT_INSN(),
4973                 },
4974                 INTERNAL,
4975                 { },
4976                 { { 0, 0x1 } },
4977         },
4978         {
4979                 "ALU_MOV_K: small negative",
4980                 .u.insns_int = {
4981                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
4982                         BPF_EXIT_INSN(),
4983                 },
4984                 INTERNAL,
4985                 { },
4986                 { { 0, -123 } }
4987         },
4988         {
4989                 "ALU_MOV_K: small negative zero extension",
4990                 .u.insns_int = {
4991                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
4992                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
4993                         BPF_EXIT_INSN(),
4994                 },
4995                 INTERNAL,
4996                 { },
4997                 { { 0, 0 } }
4998         },
4999         {
5000                 "ALU_MOV_K: large negative",
5001                 .u.insns_int = {
5002                         BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
5003                         BPF_EXIT_INSN(),
5004                 },
5005                 INTERNAL,
5006                 { },
5007                 { { 0, -123456789 } }
5008         },
5009         {
5010                 "ALU_MOV_K: large negative zero extension",
5011                 .u.insns_int = {
5012                         BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
5013                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5014                         BPF_EXIT_INSN(),
5015                 },
5016                 INTERNAL,
5017                 { },
5018                 { { 0, 0 } }
5019         },
5020         {
5021                 "ALU64_MOV_K: dst = 2",
5022                 .u.insns_int = {
5023                         BPF_ALU64_IMM(BPF_MOV, R0, 2),
5024                         BPF_EXIT_INSN(),
5025                 },
5026                 INTERNAL,
5027                 { },
5028                 { { 0, 2 } },
5029         },
5030         {
5031                 "ALU64_MOV_K: dst = 2147483647",
5032                 .u.insns_int = {
5033                         BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
5034                         BPF_EXIT_INSN(),
5035                 },
5036                 INTERNAL,
5037                 { },
5038                 { { 0, 2147483647 } },
5039         },
5040         {
5041                 "ALU64_OR_K: dst = 0x0",
5042                 .u.insns_int = {
5043                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5044                         BPF_LD_IMM64(R3, 0x0),
5045                         BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
5046                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5047                         BPF_MOV32_IMM(R0, 2),
5048                         BPF_EXIT_INSN(),
5049                         BPF_MOV32_IMM(R0, 1),
5050                         BPF_EXIT_INSN(),
5051                 },
5052                 INTERNAL,
5053                 { },
5054                 { { 0, 0x1 } },
5055         },
5056         {
5057                 "ALU64_MOV_K: dst = -1",
5058                 .u.insns_int = {
5059                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5060                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5061                         BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
5062                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5063                         BPF_MOV32_IMM(R0, 2),
5064                         BPF_EXIT_INSN(),
5065                         BPF_MOV32_IMM(R0, 1),
5066                         BPF_EXIT_INSN(),
5067                 },
5068                 INTERNAL,
5069                 { },
5070                 { { 0, 0x1 } },
5071         },
5072         {
5073                 "ALU64_MOV_K: small negative",
5074                 .u.insns_int = {
5075                         BPF_ALU64_IMM(BPF_MOV, R0, -123),
5076                         BPF_EXIT_INSN(),
5077                 },
5078                 INTERNAL,
5079                 { },
5080                 { { 0, -123 } }
5081         },
5082         {
5083                 "ALU64_MOV_K: small negative sign extension",
5084                 .u.insns_int = {
5085                         BPF_ALU64_IMM(BPF_MOV, R0, -123),
5086                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5087                         BPF_EXIT_INSN(),
5088                 },
5089                 INTERNAL,
5090                 { },
5091                 { { 0, 0xffffffff } }
5092         },
5093         {
5094                 "ALU64_MOV_K: large negative",
5095                 .u.insns_int = {
5096                         BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
5097                         BPF_EXIT_INSN(),
5098                 },
5099                 INTERNAL,
5100                 { },
5101                 { { 0, -123456789 } }
5102         },
5103         {
5104                 "ALU64_MOV_K: large negative sign extension",
5105                 .u.insns_int = {
5106                         BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
5107                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5108                         BPF_EXIT_INSN(),
5109                 },
5110                 INTERNAL,
5111                 { },
5112                 { { 0, 0xffffffff } }
5113         },
5114         /* MOVSX32 */
5115         {
5116                 "ALU_MOVSX | BPF_B",
5117                 .u.insns_int = {
5118                         BPF_LD_IMM64(R2, 0x00000000ffffffefLL),
5119                         BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
5120                         BPF_MOVSX32_REG(R1, R3, 8),
5121                         BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
5122                         BPF_MOV32_IMM(R0, 2),
5123                         BPF_EXIT_INSN(),
5124                         BPF_MOV32_IMM(R0, 1),
5125                         BPF_EXIT_INSN(),
5126                 },
5127                 INTERNAL,
5128                 { },
5129                 { { 0, 0x1 } },
5130         },
5131         {
5132                 "ALU_MOVSX | BPF_H",
5133                 .u.insns_int = {
5134                         BPF_LD_IMM64(R2, 0x00000000ffffbeefLL),
5135                         BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
5136                         BPF_MOVSX32_REG(R1, R3, 16),
5137                         BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
5138                         BPF_MOV32_IMM(R0, 2),
5139                         BPF_EXIT_INSN(),
5140                         BPF_MOV32_IMM(R0, 1),
5141                         BPF_EXIT_INSN(),
5142                 },
5143                 INTERNAL,
5144                 { },
5145                 { { 0, 0x1 } },
5146         },
5147         {
5148                 "ALU_MOVSX | BPF_W",
5149                 .u.insns_int = {
5150                         BPF_LD_IMM64(R2, 0x00000000deadbeefLL),
5151                         BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
5152                         BPF_MOVSX32_REG(R1, R3, 32),
5153                         BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
5154                         BPF_MOV32_IMM(R0, 2),
5155                         BPF_EXIT_INSN(),
5156                         BPF_MOV32_IMM(R0, 1),
5157                         BPF_EXIT_INSN(),
5158                 },
5159                 INTERNAL,
5160                 { },
5161                 { { 0, 0x1 } },
5162         },
5163         /* MOVSX64 REG */
5164         {
5165                 "ALU64_MOVSX | BPF_B",
5166                 .u.insns_int = {
5167                         BPF_LD_IMM64(R2, 0xffffffffffffffefLL),
5168                         BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
5169                         BPF_MOVSX64_REG(R1, R3, 8),
5170                         BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
5171                         BPF_MOV32_IMM(R0, 2),
5172                         BPF_EXIT_INSN(),
5173                         BPF_MOV32_IMM(R0, 1),
5174                         BPF_EXIT_INSN(),
5175                 },
5176                 INTERNAL,
5177                 { },
5178                 { { 0, 0x1 } },
5179         },
5180         {
5181                 "ALU64_MOVSX | BPF_H",
5182                 .u.insns_int = {
5183                         BPF_LD_IMM64(R2, 0xffffffffffffbeefLL),
5184                         BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
5185                         BPF_MOVSX64_REG(R1, R3, 16),
5186                         BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
5187                         BPF_MOV32_IMM(R0, 2),
5188                         BPF_EXIT_INSN(),
5189                         BPF_MOV32_IMM(R0, 1),
5190                         BPF_EXIT_INSN(),
5191                 },
5192                 INTERNAL,
5193                 { },
5194                 { { 0, 0x1 } },
5195         },
5196         {
5197                 "ALU64_MOVSX | BPF_W",
5198                 .u.insns_int = {
5199                         BPF_LD_IMM64(R2, 0xffffffffdeadbeefLL),
5200                         BPF_LD_IMM64(R3, 0xdeadbeefdeadbeefLL),
5201                         BPF_MOVSX64_REG(R1, R3, 32),
5202                         BPF_JMP_REG(BPF_JEQ, R2, R1, 2),
5203                         BPF_MOV32_IMM(R0, 2),
5204                         BPF_EXIT_INSN(),
5205                         BPF_MOV32_IMM(R0, 1),
5206                         BPF_EXIT_INSN(),
5207                 },
5208                 INTERNAL,
5209                 { },
5210                 { { 0, 0x1 } },
5211         },
5212         /* BPF_ALU | BPF_ADD | BPF_X */
5213         {
5214                 "ALU_ADD_X: 1 + 2 = 3",
5215                 .u.insns_int = {
5216                         BPF_LD_IMM64(R0, 1),
5217                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5218                         BPF_ALU32_REG(BPF_ADD, R0, R1),
5219                         BPF_EXIT_INSN(),
5220                 },
5221                 INTERNAL,
5222                 { },
5223                 { { 0, 3 } },
5224         },
5225         {
5226                 "ALU_ADD_X: 1 + 4294967294 = 4294967295",
5227                 .u.insns_int = {
5228                         BPF_LD_IMM64(R0, 1),
5229                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5230                         BPF_ALU32_REG(BPF_ADD, R0, R1),
5231                         BPF_EXIT_INSN(),
5232                 },
5233                 INTERNAL,
5234                 { },
5235                 { { 0, 4294967295U } },
5236         },
5237         {
5238                 "ALU_ADD_X: 2 + 4294967294 = 0",
5239                 .u.insns_int = {
5240                         BPF_LD_IMM64(R0, 2),
5241                         BPF_LD_IMM64(R1, 4294967294U),
5242                         BPF_ALU32_REG(BPF_ADD, R0, R1),
5243                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
5244                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
5245                         BPF_EXIT_INSN(),
5246                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
5247                         BPF_EXIT_INSN(),
5248                 },
5249                 INTERNAL,
5250                 { },
5251                 { { 0, 1 } },
5252         },
5253         {
5254                 "ALU64_ADD_X: 1 + 2 = 3",
5255                 .u.insns_int = {
5256                         BPF_LD_IMM64(R0, 1),
5257                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5258                         BPF_ALU64_REG(BPF_ADD, R0, R1),
5259                         BPF_EXIT_INSN(),
5260                 },
5261                 INTERNAL,
5262                 { },
5263                 { { 0, 3 } },
5264         },
5265         {
5266                 "ALU64_ADD_X: 1 + 4294967294 = 4294967295",
5267                 .u.insns_int = {
5268                         BPF_LD_IMM64(R0, 1),
5269                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5270                         BPF_ALU64_REG(BPF_ADD, R0, R1),
5271                         BPF_EXIT_INSN(),
5272                 },
5273                 INTERNAL,
5274                 { },
5275                 { { 0, 4294967295U } },
5276         },
5277         {
5278                 "ALU64_ADD_X: 2 + 4294967294 = 4294967296",
5279                 .u.insns_int = {
5280                         BPF_LD_IMM64(R0, 2),
5281                         BPF_LD_IMM64(R1, 4294967294U),
5282                         BPF_LD_IMM64(R2, 4294967296ULL),
5283                         BPF_ALU64_REG(BPF_ADD, R0, R1),
5284                         BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
5285                         BPF_MOV32_IMM(R0, 0),
5286                         BPF_EXIT_INSN(),
5287                         BPF_MOV32_IMM(R0, 1),
5288                         BPF_EXIT_INSN(),
5289                 },
5290                 INTERNAL,
5291                 { },
5292                 { { 0, 1 } },
5293         },
5294         /* BPF_ALU | BPF_ADD | BPF_K */
5295         {
5296                 "ALU_ADD_K: 1 + 2 = 3",
5297                 .u.insns_int = {
5298                         BPF_LD_IMM64(R0, 1),
5299                         BPF_ALU32_IMM(BPF_ADD, R0, 2),
5300                         BPF_EXIT_INSN(),
5301                 },
5302                 INTERNAL,
5303                 { },
5304                 { { 0, 3 } },
5305         },
5306         {
5307                 "ALU_ADD_K: 3 + 0 = 3",
5308                 .u.insns_int = {
5309                         BPF_LD_IMM64(R0, 3),
5310                         BPF_ALU32_IMM(BPF_ADD, R0, 0),
5311                         BPF_EXIT_INSN(),
5312                 },
5313                 INTERNAL,
5314                 { },
5315                 { { 0, 3 } },
5316         },
5317         {
5318                 "ALU_ADD_K: 1 + 4294967294 = 4294967295",
5319                 .u.insns_int = {
5320                         BPF_LD_IMM64(R0, 1),
5321                         BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
5322                         BPF_EXIT_INSN(),
5323                 },
5324                 INTERNAL,
5325                 { },
5326                 { { 0, 4294967295U } },
5327         },
5328         {
5329                 "ALU_ADD_K: 4294967294 + 2 = 0",
5330                 .u.insns_int = {
5331                         BPF_LD_IMM64(R0, 4294967294U),
5332                         BPF_ALU32_IMM(BPF_ADD, R0, 2),
5333                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
5334                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
5335                         BPF_EXIT_INSN(),
5336                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
5337                         BPF_EXIT_INSN(),
5338                 },
5339                 INTERNAL,
5340                 { },
5341                 { { 0, 1 } },
5342         },
5343         {
5344                 "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
5345                 .u.insns_int = {
5346                         BPF_LD_IMM64(R2, 0x0),
5347                         BPF_LD_IMM64(R3, 0x00000000ffffffff),
5348                         BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
5349                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5350                         BPF_MOV32_IMM(R0, 2),
5351                         BPF_EXIT_INSN(),
5352                         BPF_MOV32_IMM(R0, 1),
5353                         BPF_EXIT_INSN(),
5354                 },
5355                 INTERNAL,
5356                 { },
5357                 { { 0, 0x1 } },
5358         },
5359         {
5360                 "ALU_ADD_K: 0 + 0xffff = 0xffff",
5361                 .u.insns_int = {
5362                         BPF_LD_IMM64(R2, 0x0),
5363                         BPF_LD_IMM64(R3, 0xffff),
5364                         BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
5365                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5366                         BPF_MOV32_IMM(R0, 2),
5367                         BPF_EXIT_INSN(),
5368                         BPF_MOV32_IMM(R0, 1),
5369                         BPF_EXIT_INSN(),
5370                 },
5371                 INTERNAL,
5372                 { },
5373                 { { 0, 0x1 } },
5374         },
5375         {
5376                 "ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
5377                 .u.insns_int = {
5378                         BPF_LD_IMM64(R2, 0x0),
5379                         BPF_LD_IMM64(R3, 0x7fffffff),
5380                         BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
5381                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5382                         BPF_MOV32_IMM(R0, 2),
5383                         BPF_EXIT_INSN(),
5384                         BPF_MOV32_IMM(R0, 1),
5385                         BPF_EXIT_INSN(),
5386                 },
5387                 INTERNAL,
5388                 { },
5389                 { { 0, 0x1 } },
5390         },
5391         {
5392                 "ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
5393                 .u.insns_int = {
5394                         BPF_LD_IMM64(R2, 0x0),
5395                         BPF_LD_IMM64(R3, 0x80000000),
5396                         BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
5397                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5398                         BPF_MOV32_IMM(R0, 2),
5399                         BPF_EXIT_INSN(),
5400                         BPF_MOV32_IMM(R0, 1),
5401                         BPF_EXIT_INSN(),
5402                 },
5403                 INTERNAL,
5404                 { },
5405                 { { 0, 0x1 } },
5406         },
5407         {
5408                 "ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
5409                 .u.insns_int = {
5410                         BPF_LD_IMM64(R2, 0x0),
5411                         BPF_LD_IMM64(R3, 0x80008000),
5412                         BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
5413                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5414                         BPF_MOV32_IMM(R0, 2),
5415                         BPF_EXIT_INSN(),
5416                         BPF_MOV32_IMM(R0, 1),
5417                         BPF_EXIT_INSN(),
5418                 },
5419                 INTERNAL,
5420                 { },
5421                 { { 0, 0x1 } },
5422         },
5423         {
5424                 "ALU64_ADD_K: 1 + 2 = 3",
5425                 .u.insns_int = {
5426                         BPF_LD_IMM64(R0, 1),
5427                         BPF_ALU64_IMM(BPF_ADD, R0, 2),
5428                         BPF_EXIT_INSN(),
5429                 },
5430                 INTERNAL,
5431                 { },
5432                 { { 0, 3 } },
5433         },
5434         {
5435                 "ALU64_ADD_K: 3 + 0 = 3",
5436                 .u.insns_int = {
5437                         BPF_LD_IMM64(R0, 3),
5438                         BPF_ALU64_IMM(BPF_ADD, R0, 0),
5439                         BPF_EXIT_INSN(),
5440                 },
5441                 INTERNAL,
5442                 { },
5443                 { { 0, 3 } },
5444         },
5445         {
5446                 "ALU64_ADD_K: 1 + 2147483646 = 2147483647",
5447                 .u.insns_int = {
5448                         BPF_LD_IMM64(R0, 1),
5449                         BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
5450                         BPF_EXIT_INSN(),
5451                 },
5452                 INTERNAL,
5453                 { },
5454                 { { 0, 2147483647 } },
5455         },
5456         {
5457                 "ALU64_ADD_K: 4294967294 + 2 = 4294967296",
5458                 .u.insns_int = {
5459                         BPF_LD_IMM64(R0, 4294967294U),
5460                         BPF_LD_IMM64(R1, 4294967296ULL),
5461                         BPF_ALU64_IMM(BPF_ADD, R0, 2),
5462                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5463                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
5464                         BPF_EXIT_INSN(),
5465                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
5466                         BPF_EXIT_INSN(),
5467                 },
5468                 INTERNAL,
5469                 { },
5470                 { { 0, 1 } },
5471         },
5472         {
5473                 "ALU64_ADD_K: 2147483646 + -2147483647 = -1",
5474                 .u.insns_int = {
5475                         BPF_LD_IMM64(R0, 2147483646),
5476                         BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
5477                         BPF_EXIT_INSN(),
5478                 },
5479                 INTERNAL,
5480                 { },
5481                 { { 0, -1 } },
5482         },
5483         {
5484                 "ALU64_ADD_K: 1 + 0 = 1",
5485                 .u.insns_int = {
5486                         BPF_LD_IMM64(R2, 0x1),
5487                         BPF_LD_IMM64(R3, 0x1),
5488                         BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
5489                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5490                         BPF_MOV32_IMM(R0, 2),
5491                         BPF_EXIT_INSN(),
5492                         BPF_MOV32_IMM(R0, 1),
5493                         BPF_EXIT_INSN(),
5494                 },
5495                 INTERNAL,
5496                 { },
5497                 { { 0, 0x1 } },
5498         },
5499         {
5500                 "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
5501                 .u.insns_int = {
5502                         BPF_LD_IMM64(R2, 0x0),
5503                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5504                         BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
5505                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5506                         BPF_MOV32_IMM(R0, 2),
5507                         BPF_EXIT_INSN(),
5508                         BPF_MOV32_IMM(R0, 1),
5509                         BPF_EXIT_INSN(),
5510                 },
5511                 INTERNAL,
5512                 { },
5513                 { { 0, 0x1 } },
5514         },
5515         {
5516                 "ALU64_ADD_K: 0 + 0xffff = 0xffff",
5517                 .u.insns_int = {
5518                         BPF_LD_IMM64(R2, 0x0),
5519                         BPF_LD_IMM64(R3, 0xffff),
5520                         BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
5521                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5522                         BPF_MOV32_IMM(R0, 2),
5523                         BPF_EXIT_INSN(),
5524                         BPF_MOV32_IMM(R0, 1),
5525                         BPF_EXIT_INSN(),
5526                 },
5527                 INTERNAL,
5528                 { },
5529                 { { 0, 0x1 } },
5530         },
5531         {
5532                 "ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
5533                 .u.insns_int = {
5534                         BPF_LD_IMM64(R2, 0x0),
5535                         BPF_LD_IMM64(R3, 0x7fffffff),
5536                         BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
5537                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5538                         BPF_MOV32_IMM(R0, 2),
5539                         BPF_EXIT_INSN(),
5540                         BPF_MOV32_IMM(R0, 1),
5541                         BPF_EXIT_INSN(),
5542                 },
5543                 INTERNAL,
5544                 { },
5545                 { { 0, 0x1 } },
5546         },
5547         {
5548                 "ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
5549                 .u.insns_int = {
5550                         BPF_LD_IMM64(R2, 0x0),
5551                         BPF_LD_IMM64(R3, 0xffffffff80000000LL),
5552                         BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
5553                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5554                         BPF_MOV32_IMM(R0, 2),
5555                         BPF_EXIT_INSN(),
5556                         BPF_MOV32_IMM(R0, 1),
5557                         BPF_EXIT_INSN(),
5558                 },
5559                 INTERNAL,
5560                 { },
5561                 { { 0, 0x1 } },
5562         },
5563         {
5564                 "ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
5565                 .u.insns_int = {
5566                         BPF_LD_IMM64(R2, 0x0),
5567                         BPF_LD_IMM64(R3, 0xffffffff80008000LL),
5568                         BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
5569                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5570                         BPF_MOV32_IMM(R0, 2),
5571                         BPF_EXIT_INSN(),
5572                         BPF_MOV32_IMM(R0, 1),
5573                         BPF_EXIT_INSN(),
5574                 },
5575                 INTERNAL,
5576                 { },
5577                 { { 0, 0x1 } },
5578         },
5579         /* BPF_ALU | BPF_SUB | BPF_X */
5580         {
5581                 "ALU_SUB_X: 3 - 1 = 2",
5582                 .u.insns_int = {
5583                         BPF_LD_IMM64(R0, 3),
5584                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
5585                         BPF_ALU32_REG(BPF_SUB, R0, R1),
5586                         BPF_EXIT_INSN(),
5587                 },
5588                 INTERNAL,
5589                 { },
5590                 { { 0, 2 } },
5591         },
5592         {
5593                 "ALU_SUB_X: 4294967295 - 4294967294 = 1",
5594                 .u.insns_int = {
5595                         BPF_LD_IMM64(R0, 4294967295U),
5596                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5597                         BPF_ALU32_REG(BPF_SUB, R0, R1),
5598                         BPF_EXIT_INSN(),
5599                 },
5600                 INTERNAL,
5601                 { },
5602                 { { 0, 1 } },
5603         },
5604         {
5605                 "ALU64_SUB_X: 3 - 1 = 2",
5606                 .u.insns_int = {
5607                         BPF_LD_IMM64(R0, 3),
5608                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
5609                         BPF_ALU64_REG(BPF_SUB, R0, R1),
5610                         BPF_EXIT_INSN(),
5611                 },
5612                 INTERNAL,
5613                 { },
5614                 { { 0, 2 } },
5615         },
5616         {
5617                 "ALU64_SUB_X: 4294967295 - 4294967294 = 1",
5618                 .u.insns_int = {
5619                         BPF_LD_IMM64(R0, 4294967295U),
5620                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5621                         BPF_ALU64_REG(BPF_SUB, R0, R1),
5622                         BPF_EXIT_INSN(),
5623                 },
5624                 INTERNAL,
5625                 { },
5626                 { { 0, 1 } },
5627         },
5628         /* BPF_ALU | BPF_SUB | BPF_K */
5629         {
5630                 "ALU_SUB_K: 3 - 1 = 2",
5631                 .u.insns_int = {
5632                         BPF_LD_IMM64(R0, 3),
5633                         BPF_ALU32_IMM(BPF_SUB, R0, 1),
5634                         BPF_EXIT_INSN(),
5635                 },
5636                 INTERNAL,
5637                 { },
5638                 { { 0, 2 } },
5639         },
5640         {
5641                 "ALU_SUB_K: 3 - 0 = 3",
5642                 .u.insns_int = {
5643                         BPF_LD_IMM64(R0, 3),
5644                         BPF_ALU32_IMM(BPF_SUB, R0, 0),
5645                         BPF_EXIT_INSN(),
5646                 },
5647                 INTERNAL,
5648                 { },
5649                 { { 0, 3 } },
5650         },
5651         {
5652                 "ALU_SUB_K: 4294967295 - 4294967294 = 1",
5653                 .u.insns_int = {
5654                         BPF_LD_IMM64(R0, 4294967295U),
5655                         BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
5656                         BPF_EXIT_INSN(),
5657                 },
5658                 INTERNAL,
5659                 { },
5660                 { { 0, 1 } },
5661         },
5662         {
5663                 "ALU64_SUB_K: 3 - 1 = 2",
5664                 .u.insns_int = {
5665                         BPF_LD_IMM64(R0, 3),
5666                         BPF_ALU64_IMM(BPF_SUB, R0, 1),
5667                         BPF_EXIT_INSN(),
5668                 },
5669                 INTERNAL,
5670                 { },
5671                 { { 0, 2 } },
5672         },
5673         {
5674                 "ALU64_SUB_K: 3 - 0 = 3",
5675                 .u.insns_int = {
5676                         BPF_LD_IMM64(R0, 3),
5677                         BPF_ALU64_IMM(BPF_SUB, R0, 0),
5678                         BPF_EXIT_INSN(),
5679                 },
5680                 INTERNAL,
5681                 { },
5682                 { { 0, 3 } },
5683         },
5684         {
5685                 "ALU64_SUB_K: 4294967294 - 4294967295 = -1",
5686                 .u.insns_int = {
5687                         BPF_LD_IMM64(R0, 4294967294U),
5688                         BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
5689                         BPF_EXIT_INSN(),
5690                 },
5691                 INTERNAL,
5692                 { },
5693                 { { 0, -1 } },
5694         },
5695         {
5696                 "ALU64_ADD_K: 2147483646 - 2147483647 = -1",
5697                 .u.insns_int = {
5698                         BPF_LD_IMM64(R0, 2147483646),
5699                         BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
5700                         BPF_EXIT_INSN(),
5701                 },
5702                 INTERNAL,
5703                 { },
5704                 { { 0, -1 } },
5705         },
5706         /* BPF_ALU | BPF_MUL | BPF_X */
5707         {
5708                 "ALU_MUL_X: 2 * 3 = 6",
5709                 .u.insns_int = {
5710                         BPF_LD_IMM64(R0, 2),
5711                         BPF_ALU32_IMM(BPF_MOV, R1, 3),
5712                         BPF_ALU32_REG(BPF_MUL, R0, R1),
5713                         BPF_EXIT_INSN(),
5714                 },
5715                 INTERNAL,
5716                 { },
5717                 { { 0, 6 } },
5718         },
5719         {
5720                 "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
5721                 .u.insns_int = {
5722                         BPF_LD_IMM64(R0, 2),
5723                         BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
5724                         BPF_ALU32_REG(BPF_MUL, R0, R1),
5725                         BPF_EXIT_INSN(),
5726                 },
5727                 INTERNAL,
5728                 { },
5729                 { { 0, 0xFFFFFFF0 } },
5730         },
5731         {
5732                 "ALU_MUL_X: -1 * -1 = 1",
5733                 .u.insns_int = {
5734                         BPF_LD_IMM64(R0, -1),
5735                         BPF_ALU32_IMM(BPF_MOV, R1, -1),
5736                         BPF_ALU32_REG(BPF_MUL, R0, R1),
5737                         BPF_EXIT_INSN(),
5738                 },
5739                 INTERNAL,
5740                 { },
5741                 { { 0, 1 } },
5742         },
5743         {
5744                 "ALU64_MUL_X: 2 * 3 = 6",
5745                 .u.insns_int = {
5746                         BPF_LD_IMM64(R0, 2),
5747                         BPF_ALU32_IMM(BPF_MOV, R1, 3),
5748                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5749                         BPF_EXIT_INSN(),
5750                 },
5751                 INTERNAL,
5752                 { },
5753                 { { 0, 6 } },
5754         },
5755         {
5756                 "ALU64_MUL_X: 1 * 2147483647 = 2147483647",
5757                 .u.insns_int = {
5758                         BPF_LD_IMM64(R0, 1),
5759                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
5760                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5761                         BPF_EXIT_INSN(),
5762                 },
5763                 INTERNAL,
5764                 { },
5765                 { { 0, 2147483647 } },
5766         },
5767         {
5768                 "ALU64_MUL_X: 64x64 multiply, low word",
5769                 .u.insns_int = {
5770                         BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
5771                         BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
5772                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5773                         BPF_EXIT_INSN(),
5774                 },
5775                 INTERNAL,
5776                 { },
5777                 { { 0, 0xe5618cf0 } }
5778         },
5779         {
5780                 "ALU64_MUL_X: 64x64 multiply, high word",
5781                 .u.insns_int = {
5782                         BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
5783                         BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
5784                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5785                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5786                         BPF_EXIT_INSN(),
5787                 },
5788                 INTERNAL,
5789                 { },
5790                 { { 0, 0x2236d88f } }
5791         },
5792         /* BPF_ALU | BPF_MUL | BPF_K */
5793         {
5794                 "ALU_MUL_K: 2 * 3 = 6",
5795                 .u.insns_int = {
5796                         BPF_LD_IMM64(R0, 2),
5797                         BPF_ALU32_IMM(BPF_MUL, R0, 3),
5798                         BPF_EXIT_INSN(),
5799                 },
5800                 INTERNAL,
5801                 { },
5802                 { { 0, 6 } },
5803         },
5804         {
5805                 "ALU_MUL_K: 3 * 1 = 3",
5806                 .u.insns_int = {
5807                         BPF_LD_IMM64(R0, 3),
5808                         BPF_ALU32_IMM(BPF_MUL, R0, 1),
5809                         BPF_EXIT_INSN(),
5810                 },
5811                 INTERNAL,
5812                 { },
5813                 { { 0, 3 } },
5814         },
5815         {
5816                 "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
5817                 .u.insns_int = {
5818                         BPF_LD_IMM64(R0, 2),
5819                         BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
5820                         BPF_EXIT_INSN(),
5821                 },
5822                 INTERNAL,
5823                 { },
5824                 { { 0, 0xFFFFFFF0 } },
5825         },
5826         {
5827                 "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
5828                 .u.insns_int = {
5829                         BPF_LD_IMM64(R2, 0x1),
5830                         BPF_LD_IMM64(R3, 0x00000000ffffffff),
5831                         BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
5832                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5833                         BPF_MOV32_IMM(R0, 2),
5834                         BPF_EXIT_INSN(),
5835                         BPF_MOV32_IMM(R0, 1),
5836                         BPF_EXIT_INSN(),
5837                 },
5838                 INTERNAL,
5839                 { },
5840                 { { 0, 0x1 } },
5841         },
5842         {
5843                 "ALU64_MUL_K: 2 * 3 = 6",
5844                 .u.insns_int = {
5845                         BPF_LD_IMM64(R0, 2),
5846                         BPF_ALU64_IMM(BPF_MUL, R0, 3),
5847                         BPF_EXIT_INSN(),
5848                 },
5849                 INTERNAL,
5850                 { },
5851                 { { 0, 6 } },
5852         },
5853         {
5854                 "ALU64_MUL_K: 3 * 1 = 3",
5855                 .u.insns_int = {
5856                         BPF_LD_IMM64(R0, 3),
5857                         BPF_ALU64_IMM(BPF_MUL, R0, 1),
5858                         BPF_EXIT_INSN(),
5859                 },
5860                 INTERNAL,
5861                 { },
5862                 { { 0, 3 } },
5863         },
5864         {
5865                 "ALU64_MUL_K: 1 * 2147483647 = 2147483647",
5866                 .u.insns_int = {
5867                         BPF_LD_IMM64(R0, 1),
5868                         BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
5869                         BPF_EXIT_INSN(),
5870                 },
5871                 INTERNAL,
5872                 { },
5873                 { { 0, 2147483647 } },
5874         },
5875         {
5876                 "ALU64_MUL_K: 1 * -2147483647 = -2147483647",
5877                 .u.insns_int = {
5878                         BPF_LD_IMM64(R0, 1),
5879                         BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
5880                         BPF_EXIT_INSN(),
5881                 },
5882                 INTERNAL,
5883                 { },
5884                 { { 0, -2147483647 } },
5885         },
5886         {
5887                 "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
5888                 .u.insns_int = {
5889                         BPF_LD_IMM64(R2, 0x1),
5890                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5891                         BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
5892                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5893                         BPF_MOV32_IMM(R0, 2),
5894                         BPF_EXIT_INSN(),
5895                         BPF_MOV32_IMM(R0, 1),
5896                         BPF_EXIT_INSN(),
5897                 },
5898                 INTERNAL,
5899                 { },
5900                 { { 0, 0x1 } },
5901         },
5902         {
5903                 "ALU64_MUL_K: 64x32 multiply, low word",
5904                 .u.insns_int = {
5905                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5906                         BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
5907                         BPF_EXIT_INSN(),
5908                 },
5909                 INTERNAL,
5910                 { },
5911                 { { 0, 0xe242d208 } }
5912         },
5913         {
5914                 "ALU64_MUL_K: 64x32 multiply, high word",
5915                 .u.insns_int = {
5916                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5917                         BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
5918                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5919                         BPF_EXIT_INSN(),
5920                 },
5921                 INTERNAL,
5922                 { },
5923                 { { 0, 0xc28f5c28 } }
5924         },
5925         /* BPF_ALU | BPF_DIV | BPF_X */
5926         {
5927                 "ALU_DIV_X: 6 / 2 = 3",
5928                 .u.insns_int = {
5929                         BPF_LD_IMM64(R0, 6),
5930                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5931                         BPF_ALU32_REG(BPF_DIV, R0, R1),
5932                         BPF_EXIT_INSN(),
5933                 },
5934                 INTERNAL,
5935                 { },
5936                 { { 0, 3 } },
5937         },
5938         {
5939                 "ALU_DIV_X: 4294967295 / 4294967295 = 1",
5940                 .u.insns_int = {
5941                         BPF_LD_IMM64(R0, 4294967295U),
5942                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
5943                         BPF_ALU32_REG(BPF_DIV, R0, R1),
5944                         BPF_EXIT_INSN(),
5945                 },
5946                 INTERNAL,
5947                 { },
5948                 { { 0, 1 } },
5949         },
5950         {
5951                 "ALU64_DIV_X: 6 / 2 = 3",
5952                 .u.insns_int = {
5953                         BPF_LD_IMM64(R0, 6),
5954                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5955                         BPF_ALU64_REG(BPF_DIV, R0, R1),
5956                         BPF_EXIT_INSN(),
5957                 },
5958                 INTERNAL,
5959                 { },
5960                 { { 0, 3 } },
5961         },
5962         {
5963                 "ALU64_DIV_X: 2147483647 / 2147483647 = 1",
5964                 .u.insns_int = {
5965                         BPF_LD_IMM64(R0, 2147483647),
5966                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
5967                         BPF_ALU64_REG(BPF_DIV, R0, R1),
5968                         BPF_EXIT_INSN(),
5969                 },
5970                 INTERNAL,
5971                 { },
5972                 { { 0, 1 } },
5973         },
5974         {
5975                 "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
5976                 .u.insns_int = {
5977                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5978                         BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
5979                         BPF_LD_IMM64(R3, 0x0000000000000001LL),
5980                         BPF_ALU64_REG(BPF_DIV, R2, R4),
5981                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5982                         BPF_MOV32_IMM(R0, 2),
5983                         BPF_EXIT_INSN(),
5984                         BPF_MOV32_IMM(R0, 1),
5985                         BPF_EXIT_INSN(),
5986                 },
5987                 INTERNAL,
5988                 { },
5989                 { { 0, 0x1 } },
5990         },
5991         /* BPF_ALU | BPF_DIV | BPF_K */
5992         {
5993                 "ALU_DIV_K: 6 / 2 = 3",
5994                 .u.insns_int = {
5995                         BPF_LD_IMM64(R0, 6),
5996                         BPF_ALU32_IMM(BPF_DIV, R0, 2),
5997                         BPF_EXIT_INSN(),
5998                 },
5999                 INTERNAL,
6000                 { },
6001                 { { 0, 3 } },
6002         },
6003         {
6004                 "ALU_DIV_K: 3 / 1 = 3",
6005                 .u.insns_int = {
6006                         BPF_LD_IMM64(R0, 3),
6007                         BPF_ALU32_IMM(BPF_DIV, R0, 1),
6008                         BPF_EXIT_INSN(),
6009                 },
6010                 INTERNAL,
6011                 { },
6012                 { { 0, 3 } },
6013         },
6014         {
6015                 "ALU_DIV_K: 4294967295 / 4294967295 = 1",
6016                 .u.insns_int = {
6017                         BPF_LD_IMM64(R0, 4294967295U),
6018                         BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
6019                         BPF_EXIT_INSN(),
6020                 },
6021                 INTERNAL,
6022                 { },
6023                 { { 0, 1 } },
6024         },
6025         {
6026                 "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
6027                 .u.insns_int = {
6028                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
6029                         BPF_LD_IMM64(R3, 0x1UL),
6030                         BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
6031                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6032                         BPF_MOV32_IMM(R0, 2),
6033                         BPF_EXIT_INSN(),
6034                         BPF_MOV32_IMM(R0, 1),
6035                         BPF_EXIT_INSN(),
6036                 },
6037                 INTERNAL,
6038                 { },
6039                 { { 0, 0x1 } },
6040         },
6041         {
6042                 "ALU64_DIV_K: 6 / 2 = 3",
6043                 .u.insns_int = {
6044                         BPF_LD_IMM64(R0, 6),
6045                         BPF_ALU64_IMM(BPF_DIV, R0, 2),
6046                         BPF_EXIT_INSN(),
6047                 },
6048                 INTERNAL,
6049                 { },
6050                 { { 0, 3 } },
6051         },
6052         {
6053                 "ALU64_DIV_K: 3 / 1 = 3",
6054                 .u.insns_int = {
6055                         BPF_LD_IMM64(R0, 3),
6056                         BPF_ALU64_IMM(BPF_DIV, R0, 1),
6057                         BPF_EXIT_INSN(),
6058                 },
6059                 INTERNAL,
6060                 { },
6061                 { { 0, 3 } },
6062         },
6063         {
6064                 "ALU64_DIV_K: 2147483647 / 2147483647 = 1",
6065                 .u.insns_int = {
6066                         BPF_LD_IMM64(R0, 2147483647),
6067                         BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
6068                         BPF_EXIT_INSN(),
6069                 },
6070                 INTERNAL,
6071                 { },
6072                 { { 0, 1 } },
6073         },
6074         {
6075                 "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
6076                 .u.insns_int = {
6077                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
6078                         BPF_LD_IMM64(R3, 0x0000000000000001LL),
6079                         BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
6080                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6081                         BPF_MOV32_IMM(R0, 2),
6082                         BPF_EXIT_INSN(),
6083                         BPF_MOV32_IMM(R0, 1),
6084                         BPF_EXIT_INSN(),
6085                 },
6086                 INTERNAL,
6087                 { },
6088                 { { 0, 0x1 } },
6089         },
6090         /* BPF_ALU | BPF_MOD | BPF_X */
6091         {
6092                 "ALU_MOD_X: 3 % 2 = 1",
6093                 .u.insns_int = {
6094                         BPF_LD_IMM64(R0, 3),
6095                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6096                         BPF_ALU32_REG(BPF_MOD, R0, R1),
6097                         BPF_EXIT_INSN(),
6098                 },
6099                 INTERNAL,
6100                 { },
6101                 { { 0, 1 } },
6102         },
6103         {
6104                 "ALU_MOD_X: 4294967295 % 4294967293 = 2",
6105                 .u.insns_int = {
6106                         BPF_LD_IMM64(R0, 4294967295U),
6107                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
6108                         BPF_ALU32_REG(BPF_MOD, R0, R1),
6109                         BPF_EXIT_INSN(),
6110                 },
6111                 INTERNAL,
6112                 { },
6113                 { { 0, 2 } },
6114         },
6115         {
6116                 "ALU64_MOD_X: 3 % 2 = 1",
6117                 .u.insns_int = {
6118                         BPF_LD_IMM64(R0, 3),
6119                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6120                         BPF_ALU64_REG(BPF_MOD, R0, R1),
6121                         BPF_EXIT_INSN(),
6122                 },
6123                 INTERNAL,
6124                 { },
6125                 { { 0, 1 } },
6126         },
6127         {
6128                 "ALU64_MOD_X: 2147483647 % 2147483645 = 2",
6129                 .u.insns_int = {
6130                         BPF_LD_IMM64(R0, 2147483647),
6131                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
6132                         BPF_ALU64_REG(BPF_MOD, R0, R1),
6133                         BPF_EXIT_INSN(),
6134                 },
6135                 INTERNAL,
6136                 { },
6137                 { { 0, 2 } },
6138         },
6139         /* BPF_ALU | BPF_MOD | BPF_K */
6140         {
6141                 "ALU_MOD_K: 3 % 2 = 1",
6142                 .u.insns_int = {
6143                         BPF_LD_IMM64(R0, 3),
6144                         BPF_ALU32_IMM(BPF_MOD, R0, 2),
6145                         BPF_EXIT_INSN(),
6146                 },
6147                 INTERNAL,
6148                 { },
6149                 { { 0, 1 } },
6150         },
6151         {
6152                 "ALU_MOD_K: 3 % 1 = 0",
6153                 .u.insns_int = {
6154                         BPF_LD_IMM64(R0, 3),
6155                         BPF_ALU32_IMM(BPF_MOD, R0, 1),
6156                         BPF_EXIT_INSN(),
6157                 },
6158                 INTERNAL,
6159                 { },
6160                 { { 0, 0 } },
6161         },
6162         {
6163                 "ALU_MOD_K: 4294967295 % 4294967293 = 2",
6164                 .u.insns_int = {
6165                         BPF_LD_IMM64(R0, 4294967295U),
6166                         BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
6167                         BPF_EXIT_INSN(),
6168                 },
6169                 INTERNAL,
6170                 { },
6171                 { { 0, 2 } },
6172         },
6173         {
6174                 "ALU64_MOD_K: 3 % 2 = 1",
6175                 .u.insns_int = {
6176                         BPF_LD_IMM64(R0, 3),
6177                         BPF_ALU64_IMM(BPF_MOD, R0, 2),
6178                         BPF_EXIT_INSN(),
6179                 },
6180                 INTERNAL,
6181                 { },
6182                 { { 0, 1 } },
6183         },
6184         {
6185                 "ALU64_MOD_K: 3 % 1 = 0",
6186                 .u.insns_int = {
6187                         BPF_LD_IMM64(R0, 3),
6188                         BPF_ALU64_IMM(BPF_MOD, R0, 1),
6189                         BPF_EXIT_INSN(),
6190                 },
6191                 INTERNAL,
6192                 { },
6193                 { { 0, 0 } },
6194         },
6195         {
6196                 "ALU64_MOD_K: 2147483647 % 2147483645 = 2",
6197                 .u.insns_int = {
6198                         BPF_LD_IMM64(R0, 2147483647),
6199                         BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
6200                         BPF_EXIT_INSN(),
6201                 },
6202                 INTERNAL,
6203                 { },
6204                 { { 0, 2 } },
6205         },
6206         /* BPF_ALU | BPF_DIV | BPF_X off=1 (SDIV) */
6207         {
6208                 "ALU_SDIV_X: -6 / 2 = -3",
6209                 .u.insns_int = {
6210                         BPF_LD_IMM64(R0, -6),
6211                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6212                         BPF_ALU32_REG_OFF(BPF_DIV, R0, R1, 1),
6213                         BPF_EXIT_INSN(),
6214                 },
6215                 INTERNAL,
6216                 { },
6217                 { { 0, -3 } },
6218         },
6219         /* BPF_ALU | BPF_DIV | BPF_K off=1 (SDIV) */
6220         {
6221                 "ALU_SDIV_K: -6 / 2 = -3",
6222                 .u.insns_int = {
6223                         BPF_LD_IMM64(R0, -6),
6224                         BPF_ALU32_IMM_OFF(BPF_DIV, R0, 2, 1),
6225                         BPF_EXIT_INSN(),
6226                 },
6227                 INTERNAL,
6228                 { },
6229                 { { 0, -3 } },
6230         },
6231         /* BPF_ALU64 | BPF_DIV | BPF_X off=1 (SDIV64) */
6232         {
6233                 "ALU64_SDIV_X: -6 / 2 = -3",
6234                 .u.insns_int = {
6235                         BPF_LD_IMM64(R0, -6),
6236                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6237                         BPF_ALU64_REG_OFF(BPF_DIV, R0, R1, 1),
6238                         BPF_EXIT_INSN(),
6239                 },
6240                 INTERNAL,
6241                 { },
6242                 { { 0, -3 } },
6243         },
6244         /* BPF_ALU64 | BPF_DIV | BPF_K off=1 (SDIV64) */
6245         {
6246                 "ALU64_SDIV_K: -6 / 2 = -3",
6247                 .u.insns_int = {
6248                         BPF_LD_IMM64(R0, -6),
6249                         BPF_ALU64_IMM_OFF(BPF_DIV, R0, 2, 1),
6250                         BPF_EXIT_INSN(),
6251                 },
6252                 INTERNAL,
6253                 { },
6254                 { { 0, -3 } },
6255         },
6256         /* BPF_ALU | BPF_MOD | BPF_X off=1 (SMOD) */
6257         {
6258                 "ALU_SMOD_X: -7 % 2 = -1",
6259                 .u.insns_int = {
6260                         BPF_LD_IMM64(R0, -7),
6261                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6262                         BPF_ALU32_REG_OFF(BPF_MOD, R0, R1, 1),
6263                         BPF_EXIT_INSN(),
6264                 },
6265                 INTERNAL,
6266                 { },
6267                 { { 0, -1 } },
6268         },
6269         /* BPF_ALU | BPF_MOD | BPF_K off=1 (SMOD) */
6270         {
6271                 "ALU_SMOD_K: -7 % 2 = -1",
6272                 .u.insns_int = {
6273                         BPF_LD_IMM64(R0, -7),
6274                         BPF_ALU32_IMM_OFF(BPF_MOD, R0, 2, 1),
6275                         BPF_EXIT_INSN(),
6276                 },
6277                 INTERNAL,
6278                 { },
6279                 { { 0, -1 } },
6280         },
6281         /* BPF_ALU64 | BPF_MOD | BPF_X off=1 (SMOD64) */
6282         {
6283                 "ALU64_SMOD_X: -7 % 2 = -1",
6284                 .u.insns_int = {
6285                         BPF_LD_IMM64(R0, -7),
6286                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6287                         BPF_ALU64_REG_OFF(BPF_MOD, R0, R1, 1),
6288                         BPF_EXIT_INSN(),
6289                 },
6290                 INTERNAL,
6291                 { },
6292                 { { 0, -1 } },
6293         },
6294         /* BPF_ALU64 | BPF_MOD | BPF_K off=1 (SMOD64) */
6295         {
6296                 "ALU64_SMOD_X: -7 % 2 = -1",
6297                 .u.insns_int = {
6298                         BPF_LD_IMM64(R0, -7),
6299                         BPF_ALU64_IMM_OFF(BPF_MOD, R0, 2, 1),
6300                         BPF_EXIT_INSN(),
6301                 },
6302                 INTERNAL,
6303                 { },
6304                 { { 0, -1 } },
6305         },
6306         /* BPF_ALU | BPF_AND | BPF_X */
6307         {
6308                 "ALU_AND_X: 3 & 2 = 2",
6309                 .u.insns_int = {
6310                         BPF_LD_IMM64(R0, 3),
6311                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6312                         BPF_ALU32_REG(BPF_AND, R0, R1),
6313                         BPF_EXIT_INSN(),
6314                 },
6315                 INTERNAL,
6316                 { },
6317                 { { 0, 2 } },
6318         },
6319         {
6320                 "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
6321                 .u.insns_int = {
6322                         BPF_LD_IMM64(R0, 0xffffffff),
6323                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6324                         BPF_ALU32_REG(BPF_AND, R0, R1),
6325                         BPF_EXIT_INSN(),
6326                 },
6327                 INTERNAL,
6328                 { },
6329                 { { 0, 0xffffffff } },
6330         },
6331         {
6332                 "ALU64_AND_X: 3 & 2 = 2",
6333                 .u.insns_int = {
6334                         BPF_LD_IMM64(R0, 3),
6335                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6336                         BPF_ALU64_REG(BPF_AND, R0, R1),
6337                         BPF_EXIT_INSN(),
6338                 },
6339                 INTERNAL,
6340                 { },
6341                 { { 0, 2 } },
6342         },
6343         {
6344                 "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
6345                 .u.insns_int = {
6346                         BPF_LD_IMM64(R0, 0xffffffff),
6347                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6348                         BPF_ALU64_REG(BPF_AND, R0, R1),
6349                         BPF_EXIT_INSN(),
6350                 },
6351                 INTERNAL,
6352                 { },
6353                 { { 0, 0xffffffff } },
6354         },
6355         /* BPF_ALU | BPF_AND | BPF_K */
6356         {
6357                 "ALU_AND_K: 3 & 2 = 2",
6358                 .u.insns_int = {
6359                         BPF_LD_IMM64(R0, 3),
6360                         BPF_ALU32_IMM(BPF_AND, R0, 2),
6361                         BPF_EXIT_INSN(),
6362                 },
6363                 INTERNAL,
6364                 { },
6365                 { { 0, 2 } },
6366         },
6367         {
6368                 "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
6369                 .u.insns_int = {
6370                         BPF_LD_IMM64(R0, 0xffffffff),
6371                         BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
6372                         BPF_EXIT_INSN(),
6373                 },
6374                 INTERNAL,
6375                 { },
6376                 { { 0, 0xffffffff } },
6377         },
6378         {
6379                 "ALU_AND_K: Small immediate",
6380                 .u.insns_int = {
6381                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6382                         BPF_ALU32_IMM(BPF_AND, R0, 15),
6383                         BPF_EXIT_INSN(),
6384                 },
6385                 INTERNAL,
6386                 { },
6387                 { { 0, 4 } }
6388         },
6389         {
6390                 "ALU_AND_K: Large immediate",
6391                 .u.insns_int = {
6392                         BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
6393                         BPF_ALU32_IMM(BPF_AND, R0, 0xafbfcfdf),
6394                         BPF_EXIT_INSN(),
6395                 },
6396                 INTERNAL,
6397                 { },
6398                 { { 0, 0xa1b2c3d4 } }
6399         },
6400         {
6401                 "ALU_AND_K: Zero extension",
6402                 .u.insns_int = {
6403                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6404                         BPF_LD_IMM64(R1, 0x0000000080a0c0e0LL),
6405                         BPF_ALU32_IMM(BPF_AND, R0, 0xf0f0f0f0),
6406                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6407                         BPF_MOV32_IMM(R0, 2),
6408                         BPF_EXIT_INSN(),
6409                         BPF_MOV32_IMM(R0, 1),
6410                         BPF_EXIT_INSN(),
6411                 },
6412                 INTERNAL,
6413                 { },
6414                 { { 0, 1 } }
6415         },
6416         {
6417                 "ALU64_AND_K: 3 & 2 = 2",
6418                 .u.insns_int = {
6419                         BPF_LD_IMM64(R0, 3),
6420                         BPF_ALU64_IMM(BPF_AND, R0, 2),
6421                         BPF_EXIT_INSN(),
6422                 },
6423                 INTERNAL,
6424                 { },
6425                 { { 0, 2 } },
6426         },
6427         {
6428                 "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
6429                 .u.insns_int = {
6430                         BPF_LD_IMM64(R0, 0xffffffff),
6431                         BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
6432                         BPF_EXIT_INSN(),
6433                 },
6434                 INTERNAL,
6435                 { },
6436                 { { 0, 0xffffffff } },
6437         },
6438         {
6439                 "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000000000000000",
6440                 .u.insns_int = {
6441                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6442                         BPF_LD_IMM64(R3, 0x0000000000000000LL),
6443                         BPF_ALU64_IMM(BPF_AND, R2, 0x0),
6444                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6445                         BPF_MOV32_IMM(R0, 2),
6446                         BPF_EXIT_INSN(),
6447                         BPF_MOV32_IMM(R0, 1),
6448                         BPF_EXIT_INSN(),
6449                 },
6450                 INTERNAL,
6451                 { },
6452                 { { 0, 0x1 } },
6453         },
6454         {
6455                 "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffff0000",
6456                 .u.insns_int = {
6457                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6458                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
6459                         BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
6460                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6461                         BPF_MOV32_IMM(R0, 2),
6462                         BPF_EXIT_INSN(),
6463                         BPF_MOV32_IMM(R0, 1),
6464                         BPF_EXIT_INSN(),
6465                 },
6466                 INTERNAL,
6467                 { },
6468                 { { 0, 0x1 } },
6469         },
6470         {
6471                 "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
6472                 .u.insns_int = {
6473                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
6474                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6475                         BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
6476                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6477                         BPF_MOV32_IMM(R0, 2),
6478                         BPF_EXIT_INSN(),
6479                         BPF_MOV32_IMM(R0, 1),
6480                         BPF_EXIT_INSN(),
6481                 },
6482                 INTERNAL,
6483                 { },
6484                 { { 0, 0x1 } },
6485         },
6486         {
6487                 "ALU64_AND_K: Sign extension 1",
6488                 .u.insns_int = {
6489                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6490                         BPF_LD_IMM64(R1, 0x00000000090b0d0fLL),
6491                         BPF_ALU64_IMM(BPF_AND, R0, 0x0f0f0f0f),
6492                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6493                         BPF_MOV32_IMM(R0, 2),
6494                         BPF_EXIT_INSN(),
6495                         BPF_MOV32_IMM(R0, 1),
6496                         BPF_EXIT_INSN(),
6497                 },
6498                 INTERNAL,
6499                 { },
6500                 { { 0, 1 } }
6501         },
6502         {
6503                 "ALU64_AND_K: Sign extension 2",
6504                 .u.insns_int = {
6505                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6506                         BPF_LD_IMM64(R1, 0x0123456780a0c0e0LL),
6507                         BPF_ALU64_IMM(BPF_AND, R0, 0xf0f0f0f0),
6508                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6509                         BPF_MOV32_IMM(R0, 2),
6510                         BPF_EXIT_INSN(),
6511                         BPF_MOV32_IMM(R0, 1),
6512                         BPF_EXIT_INSN(),
6513                 },
6514                 INTERNAL,
6515                 { },
6516                 { { 0, 1 } }
6517         },
6518         /* BPF_ALU | BPF_OR | BPF_X */
6519         {
6520                 "ALU_OR_X: 1 | 2 = 3",
6521                 .u.insns_int = {
6522                         BPF_LD_IMM64(R0, 1),
6523                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6524                         BPF_ALU32_REG(BPF_OR, R0, R1),
6525                         BPF_EXIT_INSN(),
6526                 },
6527                 INTERNAL,
6528                 { },
6529                 { { 0, 3 } },
6530         },
6531         {
6532                 "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
6533                 .u.insns_int = {
6534                         BPF_LD_IMM64(R0, 0),
6535                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6536                         BPF_ALU32_REG(BPF_OR, R0, R1),
6537                         BPF_EXIT_INSN(),
6538                 },
6539                 INTERNAL,
6540                 { },
6541                 { { 0, 0xffffffff } },
6542         },
6543         {
6544                 "ALU64_OR_X: 1 | 2 = 3",
6545                 .u.insns_int = {
6546                         BPF_LD_IMM64(R0, 1),
6547                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6548                         BPF_ALU64_REG(BPF_OR, R0, R1),
6549                         BPF_EXIT_INSN(),
6550                 },
6551                 INTERNAL,
6552                 { },
6553                 { { 0, 3 } },
6554         },
6555         {
6556                 "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
6557                 .u.insns_int = {
6558                         BPF_LD_IMM64(R0, 0),
6559                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6560                         BPF_ALU64_REG(BPF_OR, R0, R1),
6561                         BPF_EXIT_INSN(),
6562                 },
6563                 INTERNAL,
6564                 { },
6565                 { { 0, 0xffffffff } },
6566         },
6567         /* BPF_ALU | BPF_OR | BPF_K */
6568         {
6569                 "ALU_OR_K: 1 | 2 = 3",
6570                 .u.insns_int = {
6571                         BPF_LD_IMM64(R0, 1),
6572                         BPF_ALU32_IMM(BPF_OR, R0, 2),
6573                         BPF_EXIT_INSN(),
6574                 },
6575                 INTERNAL,
6576                 { },
6577                 { { 0, 3 } },
6578         },
6579         {
6580                 "ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
6581                 .u.insns_int = {
6582                         BPF_LD_IMM64(R0, 0),
6583                         BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
6584                         BPF_EXIT_INSN(),
6585                 },
6586                 INTERNAL,
6587                 { },
6588                 { { 0, 0xffffffff } },
6589         },
6590         {
6591                 "ALU_OR_K: Small immediate",
6592                 .u.insns_int = {
6593                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6594                         BPF_ALU32_IMM(BPF_OR, R0, 1),
6595                         BPF_EXIT_INSN(),
6596                 },
6597                 INTERNAL,
6598                 { },
6599                 { { 0, 0x01020305 } }
6600         },
6601         {
6602                 "ALU_OR_K: Large immediate",
6603                 .u.insns_int = {
6604                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6605                         BPF_ALU32_IMM(BPF_OR, R0, 0xa0b0c0d0),
6606                         BPF_EXIT_INSN(),
6607                 },
6608                 INTERNAL,
6609                 { },
6610                 { { 0, 0xa1b2c3d4 } }
6611         },
6612         {
6613                 "ALU_OR_K: Zero extension",
6614                 .u.insns_int = {
6615                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6616                         BPF_LD_IMM64(R1, 0x00000000f9fbfdffLL),
6617                         BPF_ALU32_IMM(BPF_OR, R0, 0xf0f0f0f0),
6618                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6619                         BPF_MOV32_IMM(R0, 2),
6620                         BPF_EXIT_INSN(),
6621                         BPF_MOV32_IMM(R0, 1),
6622                         BPF_EXIT_INSN(),
6623                 },
6624                 INTERNAL,
6625                 { },
6626                 { { 0, 1 } }
6627         },
6628         {
6629                 "ALU64_OR_K: 1 | 2 = 3",
6630                 .u.insns_int = {
6631                         BPF_LD_IMM64(R0, 1),
6632                         BPF_ALU64_IMM(BPF_OR, R0, 2),
6633                         BPF_EXIT_INSN(),
6634                 },
6635                 INTERNAL,
6636                 { },
6637                 { { 0, 3 } },
6638         },
6639         {
6640                 "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
6641                 .u.insns_int = {
6642                         BPF_LD_IMM64(R0, 0),
6643                         BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
6644                         BPF_EXIT_INSN(),
6645                 },
6646                 INTERNAL,
6647                 { },
6648                 { { 0, 0xffffffff } },
6649         },
6650         {
6651                 "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffffffff0000",
6652                 .u.insns_int = {
6653                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6654                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
6655                         BPF_ALU64_IMM(BPF_OR, R2, 0x0),
6656                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6657                         BPF_MOV32_IMM(R0, 2),
6658                         BPF_EXIT_INSN(),
6659                         BPF_MOV32_IMM(R0, 1),
6660                         BPF_EXIT_INSN(),
6661                 },
6662                 INTERNAL,
6663                 { },
6664                 { { 0, 0x1 } },
6665         },
6666         {
6667                 "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
6668                 .u.insns_int = {
6669                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6670                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6671                         BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
6672                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6673                         BPF_MOV32_IMM(R0, 2),
6674                         BPF_EXIT_INSN(),
6675                         BPF_MOV32_IMM(R0, 1),
6676                         BPF_EXIT_INSN(),
6677                 },
6678                 INTERNAL,
6679                 { },
6680                 { { 0, 0x1 } },
6681         },
6682         {
6683                 "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
6684                 .u.insns_int = {
6685                         BPF_LD_IMM64(R2, 0x0000000000000000LL),
6686                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6687                         BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
6688                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6689                         BPF_MOV32_IMM(R0, 2),
6690                         BPF_EXIT_INSN(),
6691                         BPF_MOV32_IMM(R0, 1),
6692                         BPF_EXIT_INSN(),
6693                 },
6694                 INTERNAL,
6695                 { },
6696                 { { 0, 0x1 } },
6697         },
6698         {
6699                 "ALU64_OR_K: Sign extension 1",
6700                 .u.insns_int = {
6701                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6702                         BPF_LD_IMM64(R1, 0x012345678fafcfefLL),
6703                         BPF_ALU64_IMM(BPF_OR, R0, 0x0f0f0f0f),
6704                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6705                         BPF_MOV32_IMM(R0, 2),
6706                         BPF_EXIT_INSN(),
6707                         BPF_MOV32_IMM(R0, 1),
6708                         BPF_EXIT_INSN(),
6709                 },
6710                 INTERNAL,
6711                 { },
6712                 { { 0, 1 } }
6713         },
6714         {
6715                 "ALU64_OR_K: Sign extension 2",
6716                 .u.insns_int = {
6717                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6718                         BPF_LD_IMM64(R1, 0xfffffffff9fbfdffLL),
6719                         BPF_ALU64_IMM(BPF_OR, R0, 0xf0f0f0f0),
6720                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6721                         BPF_MOV32_IMM(R0, 2),
6722                         BPF_EXIT_INSN(),
6723                         BPF_MOV32_IMM(R0, 1),
6724                         BPF_EXIT_INSN(),
6725                 },
6726                 INTERNAL,
6727                 { },
6728                 { { 0, 1 } }
6729         },
6730         /* BPF_ALU | BPF_XOR | BPF_X */
6731         {
6732                 "ALU_XOR_X: 5 ^ 6 = 3",
6733                 .u.insns_int = {
6734                         BPF_LD_IMM64(R0, 5),
6735                         BPF_ALU32_IMM(BPF_MOV, R1, 6),
6736                         BPF_ALU32_REG(BPF_XOR, R0, R1),
6737                         BPF_EXIT_INSN(),
6738                 },
6739                 INTERNAL,
6740                 { },
6741                 { { 0, 3 } },
6742         },
6743         {
6744                 "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
6745                 .u.insns_int = {
6746                         BPF_LD_IMM64(R0, 1),
6747                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6748                         BPF_ALU32_REG(BPF_XOR, R0, R1),
6749                         BPF_EXIT_INSN(),
6750                 },
6751                 INTERNAL,
6752                 { },
6753                 { { 0, 0xfffffffe } },
6754         },
6755         {
6756                 "ALU64_XOR_X: 5 ^ 6 = 3",
6757                 .u.insns_int = {
6758                         BPF_LD_IMM64(R0, 5),
6759                         BPF_ALU32_IMM(BPF_MOV, R1, 6),
6760                         BPF_ALU64_REG(BPF_XOR, R0, R1),
6761                         BPF_EXIT_INSN(),
6762                 },
6763                 INTERNAL,
6764                 { },
6765                 { { 0, 3 } },
6766         },
6767         {
6768                 "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
6769                 .u.insns_int = {
6770                         BPF_LD_IMM64(R0, 1),
6771                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6772                         BPF_ALU64_REG(BPF_XOR, R0, R1),
6773                         BPF_EXIT_INSN(),
6774                 },
6775                 INTERNAL,
6776                 { },
6777                 { { 0, 0xfffffffe } },
6778         },
6779         /* BPF_ALU | BPF_XOR | BPF_K */
6780         {
6781                 "ALU_XOR_K: 5 ^ 6 = 3",
6782                 .u.insns_int = {
6783                         BPF_LD_IMM64(R0, 5),
6784                         BPF_ALU32_IMM(BPF_XOR, R0, 6),
6785                         BPF_EXIT_INSN(),
6786                 },
6787                 INTERNAL,
6788                 { },
6789                 { { 0, 3 } },
6790         },
6791         {
6792                 "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
6793                 .u.insns_int = {
6794                         BPF_LD_IMM64(R0, 1),
6795                         BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
6796                         BPF_EXIT_INSN(),
6797                 },
6798                 INTERNAL,
6799                 { },
6800                 { { 0, 0xfffffffe } },
6801         },
6802         {
6803                 "ALU_XOR_K: Small immediate",
6804                 .u.insns_int = {
6805                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6806                         BPF_ALU32_IMM(BPF_XOR, R0, 15),
6807                         BPF_EXIT_INSN(),
6808                 },
6809                 INTERNAL,
6810                 { },
6811                 { { 0, 0x0102030b } }
6812         },
6813         {
6814                 "ALU_XOR_K: Large immediate",
6815                 .u.insns_int = {
6816                         BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
6817                         BPF_ALU32_IMM(BPF_XOR, R0, 0xafbfcfdf),
6818                         BPF_EXIT_INSN(),
6819                 },
6820                 INTERNAL,
6821                 { },
6822                 { { 0, 0x5e4d3c2b } }
6823         },
6824         {
6825                 "ALU_XOR_K: Zero extension",
6826                 .u.insns_int = {
6827                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6828                         BPF_LD_IMM64(R1, 0x00000000795b3d1fLL),
6829                         BPF_ALU32_IMM(BPF_XOR, R0, 0xf0f0f0f0),
6830                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6831                         BPF_MOV32_IMM(R0, 2),
6832                         BPF_EXIT_INSN(),
6833                         BPF_MOV32_IMM(R0, 1),
6834                         BPF_EXIT_INSN(),
6835                 },
6836                 INTERNAL,
6837                 { },
6838                 { { 0, 1 } }
6839         },
6840         {
6841                 "ALU64_XOR_K: 5 ^ 6 = 3",
6842                 .u.insns_int = {
6843                         BPF_LD_IMM64(R0, 5),
6844                         BPF_ALU64_IMM(BPF_XOR, R0, 6),
6845                         BPF_EXIT_INSN(),
6846                 },
6847                 INTERNAL,
6848                 { },
6849                 { { 0, 3 } },
6850         },
6851         {
6852                 "ALU64_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
6853                 .u.insns_int = {
6854                         BPF_LD_IMM64(R0, 1),
6855                         BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
6856                         BPF_EXIT_INSN(),
6857                 },
6858                 INTERNAL,
6859                 { },
6860                 { { 0, 0xfffffffe } },
6861         },
6862         {
6863                 "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
6864                 .u.insns_int = {
6865                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6866                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
6867                         BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
6868                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6869                         BPF_MOV32_IMM(R0, 2),
6870                         BPF_EXIT_INSN(),
6871                         BPF_MOV32_IMM(R0, 1),
6872                         BPF_EXIT_INSN(),
6873                 },
6874                 INTERNAL,
6875                 { },
6876                 { { 0, 0x1 } },
6877         },
6878         {
6879                 "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
6880                 .u.insns_int = {
6881                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6882                         BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
6883                         BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
6884                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6885                         BPF_MOV32_IMM(R0, 2),
6886                         BPF_EXIT_INSN(),
6887                         BPF_MOV32_IMM(R0, 1),
6888                         BPF_EXIT_INSN(),
6889                 },
6890                 INTERNAL,
6891                 { },
6892                 { { 0, 0x1 } },
6893         },
6894         {
6895                 "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
6896                 .u.insns_int = {
6897                         BPF_LD_IMM64(R2, 0x0000000000000000LL),
6898                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6899                         BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
6900                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6901                         BPF_MOV32_IMM(R0, 2),
6902                         BPF_EXIT_INSN(),
6903                         BPF_MOV32_IMM(R0, 1),
6904                         BPF_EXIT_INSN(),
6905                 },
6906                 INTERNAL,
6907                 { },
6908                 { { 0, 0x1 } },
6909         },
6910         {
6911                 "ALU64_XOR_K: Sign extension 1",
6912                 .u.insns_int = {
6913                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6914                         BPF_LD_IMM64(R1, 0x0123456786a4c2e0LL),
6915                         BPF_ALU64_IMM(BPF_XOR, R0, 0x0f0f0f0f),
6916                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6917                         BPF_MOV32_IMM(R0, 2),
6918                         BPF_EXIT_INSN(),
6919                         BPF_MOV32_IMM(R0, 1),
6920                         BPF_EXIT_INSN(),
6921                 },
6922                 INTERNAL,
6923                 { },
6924                 { { 0, 1 } }
6925         },
6926         {
6927                 "ALU64_XOR_K: Sign extension 2",
6928                 .u.insns_int = {
6929                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6930                         BPF_LD_IMM64(R1, 0xfedcba98795b3d1fLL),
6931                         BPF_ALU64_IMM(BPF_XOR, R0, 0xf0f0f0f0),
6932                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6933                         BPF_MOV32_IMM(R0, 2),
6934                         BPF_EXIT_INSN(),
6935                         BPF_MOV32_IMM(R0, 1),
6936                         BPF_EXIT_INSN(),
6937                 },
6938                 INTERNAL,
6939                 { },
6940                 { { 0, 1 } }
6941         },
6942         /* BPF_ALU | BPF_LSH | BPF_X */
6943         {
6944                 "ALU_LSH_X: 1 << 1 = 2",
6945                 .u.insns_int = {
6946                         BPF_LD_IMM64(R0, 1),
6947                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
6948                         BPF_ALU32_REG(BPF_LSH, R0, R1),
6949                         BPF_EXIT_INSN(),
6950                 },
6951                 INTERNAL,
6952                 { },
6953                 { { 0, 2 } },
6954         },
6955         {
6956                 "ALU_LSH_X: 1 << 31 = 0x80000000",
6957                 .u.insns_int = {
6958                         BPF_LD_IMM64(R0, 1),
6959                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
6960                         BPF_ALU32_REG(BPF_LSH, R0, R1),
6961                         BPF_EXIT_INSN(),
6962                 },
6963                 INTERNAL,
6964                 { },
6965                 { { 0, 0x80000000 } },
6966         },
6967         {
6968                 "ALU_LSH_X: 0x12345678 << 12 = 0x45678000",
6969                 .u.insns_int = {
6970                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6971                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
6972                         BPF_ALU32_REG(BPF_LSH, R0, R1),
6973                         BPF_EXIT_INSN(),
6974                 },
6975                 INTERNAL,
6976                 { },
6977                 { { 0, 0x45678000 } }
6978         },
6979         {
6980                 "ALU64_LSH_X: 1 << 1 = 2",
6981                 .u.insns_int = {
6982                         BPF_LD_IMM64(R0, 1),
6983                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
6984                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6985                         BPF_EXIT_INSN(),
6986                 },
6987                 INTERNAL,
6988                 { },
6989                 { { 0, 2 } },
6990         },
6991         {
6992                 "ALU64_LSH_X: 1 << 31 = 0x80000000",
6993                 .u.insns_int = {
6994                         BPF_LD_IMM64(R0, 1),
6995                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
6996                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6997                         BPF_EXIT_INSN(),
6998                 },
6999                 INTERNAL,
7000                 { },
7001                 { { 0, 0x80000000 } },
7002         },
7003         {
7004                 "ALU64_LSH_X: Shift < 32, low word",
7005                 .u.insns_int = {
7006                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7007                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7008                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7009                         BPF_EXIT_INSN(),
7010                 },
7011                 INTERNAL,
7012                 { },
7013                 { { 0, 0xbcdef000 } }
7014         },
7015         {
7016                 "ALU64_LSH_X: Shift < 32, high word",
7017                 .u.insns_int = {
7018                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7019                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7020                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7021                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7022                         BPF_EXIT_INSN(),
7023                 },
7024                 INTERNAL,
7025                 { },
7026                 { { 0, 0x3456789a } }
7027         },
7028         {
7029                 "ALU64_LSH_X: Shift > 32, low word",
7030                 .u.insns_int = {
7031                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7032                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7033                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7034                         BPF_EXIT_INSN(),
7035                 },
7036                 INTERNAL,
7037                 { },
7038                 { { 0, 0 } }
7039         },
7040         {
7041                 "ALU64_LSH_X: Shift > 32, high word",
7042                 .u.insns_int = {
7043                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7044                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7045                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7046                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7047                         BPF_EXIT_INSN(),
7048                 },
7049                 INTERNAL,
7050                 { },
7051                 { { 0, 0x9abcdef0 } }
7052         },
7053         {
7054                 "ALU64_LSH_X: Shift == 32, low word",
7055                 .u.insns_int = {
7056                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7057                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7058                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7059                         BPF_EXIT_INSN(),
7060                 },
7061                 INTERNAL,
7062                 { },
7063                 { { 0, 0 } }
7064         },
7065         {
7066                 "ALU64_LSH_X: Shift == 32, high word",
7067                 .u.insns_int = {
7068                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7069                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7070                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7071                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7072                         BPF_EXIT_INSN(),
7073                 },
7074                 INTERNAL,
7075                 { },
7076                 { { 0, 0x89abcdef } }
7077         },
7078         {
7079                 "ALU64_LSH_X: Zero shift, low word",
7080                 .u.insns_int = {
7081                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7082                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7083                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7084                         BPF_EXIT_INSN(),
7085                 },
7086                 INTERNAL,
7087                 { },
7088                 { { 0, 0x89abcdef } }
7089         },
7090         {
7091                 "ALU64_LSH_X: Zero shift, high word",
7092                 .u.insns_int = {
7093                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7094                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7095                         BPF_ALU64_REG(BPF_LSH, R0, R1),
7096                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7097                         BPF_EXIT_INSN(),
7098                 },
7099                 INTERNAL,
7100                 { },
7101                 { { 0, 0x01234567 } }
7102         },
7103         /* BPF_ALU | BPF_LSH | BPF_K */
7104         {
7105                 "ALU_LSH_K: 1 << 1 = 2",
7106                 .u.insns_int = {
7107                         BPF_LD_IMM64(R0, 1),
7108                         BPF_ALU32_IMM(BPF_LSH, R0, 1),
7109                         BPF_EXIT_INSN(),
7110                 },
7111                 INTERNAL,
7112                 { },
7113                 { { 0, 2 } },
7114         },
7115         {
7116                 "ALU_LSH_K: 1 << 31 = 0x80000000",
7117                 .u.insns_int = {
7118                         BPF_LD_IMM64(R0, 1),
7119                         BPF_ALU32_IMM(BPF_LSH, R0, 31),
7120                         BPF_EXIT_INSN(),
7121                 },
7122                 INTERNAL,
7123                 { },
7124                 { { 0, 0x80000000 } },
7125         },
7126         {
7127                 "ALU_LSH_K: 0x12345678 << 12 = 0x45678000",
7128                 .u.insns_int = {
7129                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7130                         BPF_ALU32_IMM(BPF_LSH, R0, 12),
7131                         BPF_EXIT_INSN(),
7132                 },
7133                 INTERNAL,
7134                 { },
7135                 { { 0, 0x45678000 } }
7136         },
7137         {
7138                 "ALU_LSH_K: 0x12345678 << 0 = 0x12345678",
7139                 .u.insns_int = {
7140                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7141                         BPF_ALU32_IMM(BPF_LSH, R0, 0),
7142                         BPF_EXIT_INSN(),
7143                 },
7144                 INTERNAL,
7145                 { },
7146                 { { 0, 0x12345678 } }
7147         },
7148         {
7149                 "ALU64_LSH_K: 1 << 1 = 2",
7150                 .u.insns_int = {
7151                         BPF_LD_IMM64(R0, 1),
7152                         BPF_ALU64_IMM(BPF_LSH, R0, 1),
7153                         BPF_EXIT_INSN(),
7154                 },
7155                 INTERNAL,
7156                 { },
7157                 { { 0, 2 } },
7158         },
7159         {
7160                 "ALU64_LSH_K: 1 << 31 = 0x80000000",
7161                 .u.insns_int = {
7162                         BPF_LD_IMM64(R0, 1),
7163                         BPF_ALU64_IMM(BPF_LSH, R0, 31),
7164                         BPF_EXIT_INSN(),
7165                 },
7166                 INTERNAL,
7167                 { },
7168                 { { 0, 0x80000000 } },
7169         },
7170         {
7171                 "ALU64_LSH_K: Shift < 32, low word",
7172                 .u.insns_int = {
7173                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7174                         BPF_ALU64_IMM(BPF_LSH, R0, 12),
7175                         BPF_EXIT_INSN(),
7176                 },
7177                 INTERNAL,
7178                 { },
7179                 { { 0, 0xbcdef000 } }
7180         },
7181         {
7182                 "ALU64_LSH_K: Shift < 32, high word",
7183                 .u.insns_int = {
7184                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7185                         BPF_ALU64_IMM(BPF_LSH, R0, 12),
7186                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7187                         BPF_EXIT_INSN(),
7188                 },
7189                 INTERNAL,
7190                 { },
7191                 { { 0, 0x3456789a } }
7192         },
7193         {
7194                 "ALU64_LSH_K: Shift > 32, low word",
7195                 .u.insns_int = {
7196                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7197                         BPF_ALU64_IMM(BPF_LSH, R0, 36),
7198                         BPF_EXIT_INSN(),
7199                 },
7200                 INTERNAL,
7201                 { },
7202                 { { 0, 0 } }
7203         },
7204         {
7205                 "ALU64_LSH_K: Shift > 32, high word",
7206                 .u.insns_int = {
7207                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7208                         BPF_ALU64_IMM(BPF_LSH, R0, 36),
7209                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7210                         BPF_EXIT_INSN(),
7211                 },
7212                 INTERNAL,
7213                 { },
7214                 { { 0, 0x9abcdef0 } }
7215         },
7216         {
7217                 "ALU64_LSH_K: Shift == 32, low word",
7218                 .u.insns_int = {
7219                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7220                         BPF_ALU64_IMM(BPF_LSH, R0, 32),
7221                         BPF_EXIT_INSN(),
7222                 },
7223                 INTERNAL,
7224                 { },
7225                 { { 0, 0 } }
7226         },
7227         {
7228                 "ALU64_LSH_K: Shift == 32, high word",
7229                 .u.insns_int = {
7230                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7231                         BPF_ALU64_IMM(BPF_LSH, R0, 32),
7232                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7233                         BPF_EXIT_INSN(),
7234                 },
7235                 INTERNAL,
7236                 { },
7237                 { { 0, 0x89abcdef } }
7238         },
7239         {
7240                 "ALU64_LSH_K: Zero shift",
7241                 .u.insns_int = {
7242                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7243                         BPF_ALU64_IMM(BPF_LSH, R0, 0),
7244                         BPF_EXIT_INSN(),
7245                 },
7246                 INTERNAL,
7247                 { },
7248                 { { 0, 0x89abcdef } }
7249         },
7250         /* BPF_ALU | BPF_RSH | BPF_X */
7251         {
7252                 "ALU_RSH_X: 2 >> 1 = 1",
7253                 .u.insns_int = {
7254                         BPF_LD_IMM64(R0, 2),
7255                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
7256                         BPF_ALU32_REG(BPF_RSH, R0, R1),
7257                         BPF_EXIT_INSN(),
7258                 },
7259                 INTERNAL,
7260                 { },
7261                 { { 0, 1 } },
7262         },
7263         {
7264                 "ALU_RSH_X: 0x80000000 >> 31 = 1",
7265                 .u.insns_int = {
7266                         BPF_LD_IMM64(R0, 0x80000000),
7267                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
7268                         BPF_ALU32_REG(BPF_RSH, R0, R1),
7269                         BPF_EXIT_INSN(),
7270                 },
7271                 INTERNAL,
7272                 { },
7273                 { { 0, 1 } },
7274         },
7275         {
7276                 "ALU_RSH_X: 0x12345678 >> 20 = 0x123",
7277                 .u.insns_int = {
7278                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7279                         BPF_ALU32_IMM(BPF_MOV, R1, 20),
7280                         BPF_ALU32_REG(BPF_RSH, R0, R1),
7281                         BPF_EXIT_INSN(),
7282                 },
7283                 INTERNAL,
7284                 { },
7285                 { { 0, 0x123 } }
7286         },
7287         {
7288                 "ALU64_RSH_X: 2 >> 1 = 1",
7289                 .u.insns_int = {
7290                         BPF_LD_IMM64(R0, 2),
7291                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
7292                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7293                         BPF_EXIT_INSN(),
7294                 },
7295                 INTERNAL,
7296                 { },
7297                 { { 0, 1 } },
7298         },
7299         {
7300                 "ALU64_RSH_X: 0x80000000 >> 31 = 1",
7301                 .u.insns_int = {
7302                         BPF_LD_IMM64(R0, 0x80000000),
7303                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
7304                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7305                         BPF_EXIT_INSN(),
7306                 },
7307                 INTERNAL,
7308                 { },
7309                 { { 0, 1 } },
7310         },
7311         {
7312                 "ALU64_RSH_X: Shift < 32, low word",
7313                 .u.insns_int = {
7314                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7315                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7316                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7317                         BPF_EXIT_INSN(),
7318                 },
7319                 INTERNAL,
7320                 { },
7321                 { { 0, 0x56789abc } }
7322         },
7323         {
7324                 "ALU64_RSH_X: Shift < 32, high word",
7325                 .u.insns_int = {
7326                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7327                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7328                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7329                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7330                         BPF_EXIT_INSN(),
7331                 },
7332                 INTERNAL,
7333                 { },
7334                 { { 0, 0x00081234 } }
7335         },
7336         {
7337                 "ALU64_RSH_X: Shift > 32, low word",
7338                 .u.insns_int = {
7339                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7340                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7341                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7342                         BPF_EXIT_INSN(),
7343                 },
7344                 INTERNAL,
7345                 { },
7346                 { { 0, 0x08123456 } }
7347         },
7348         {
7349                 "ALU64_RSH_X: Shift > 32, high word",
7350                 .u.insns_int = {
7351                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7352                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7353                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7354                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7355                         BPF_EXIT_INSN(),
7356                 },
7357                 INTERNAL,
7358                 { },
7359                 { { 0, 0 } }
7360         },
7361         {
7362                 "ALU64_RSH_X: Shift == 32, low word",
7363                 .u.insns_int = {
7364                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7365                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7366                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7367                         BPF_EXIT_INSN(),
7368                 },
7369                 INTERNAL,
7370                 { },
7371                 { { 0, 0x81234567 } }
7372         },
7373         {
7374                 "ALU64_RSH_X: Shift == 32, high word",
7375                 .u.insns_int = {
7376                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7377                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7378                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7379                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7380                         BPF_EXIT_INSN(),
7381                 },
7382                 INTERNAL,
7383                 { },
7384                 { { 0, 0 } }
7385         },
7386         {
7387                 "ALU64_RSH_X: Zero shift, low word",
7388                 .u.insns_int = {
7389                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7390                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7391                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7392                         BPF_EXIT_INSN(),
7393                 },
7394                 INTERNAL,
7395                 { },
7396                 { { 0, 0x89abcdef } }
7397         },
7398         {
7399                 "ALU64_RSH_X: Zero shift, high word",
7400                 .u.insns_int = {
7401                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7402                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7403                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7404                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7405                         BPF_EXIT_INSN(),
7406                 },
7407                 INTERNAL,
7408                 { },
7409                 { { 0, 0x81234567 } }
7410         },
7411         /* BPF_ALU | BPF_RSH | BPF_K */
7412         {
7413                 "ALU_RSH_K: 2 >> 1 = 1",
7414                 .u.insns_int = {
7415                         BPF_LD_IMM64(R0, 2),
7416                         BPF_ALU32_IMM(BPF_RSH, R0, 1),
7417                         BPF_EXIT_INSN(),
7418                 },
7419                 INTERNAL,
7420                 { },
7421                 { { 0, 1 } },
7422         },
7423         {
7424                 "ALU_RSH_K: 0x80000000 >> 31 = 1",
7425                 .u.insns_int = {
7426                         BPF_LD_IMM64(R0, 0x80000000),
7427                         BPF_ALU32_IMM(BPF_RSH, R0, 31),
7428                         BPF_EXIT_INSN(),
7429                 },
7430                 INTERNAL,
7431                 { },
7432                 { { 0, 1 } },
7433         },
7434         {
7435                 "ALU_RSH_K: 0x12345678 >> 20 = 0x123",
7436                 .u.insns_int = {
7437                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7438                         BPF_ALU32_IMM(BPF_RSH, R0, 20),
7439                         BPF_EXIT_INSN(),
7440                 },
7441                 INTERNAL,
7442                 { },
7443                 { { 0, 0x123 } }
7444         },
7445         {
7446                 "ALU_RSH_K: 0x12345678 >> 0 = 0x12345678",
7447                 .u.insns_int = {
7448                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7449                         BPF_ALU32_IMM(BPF_RSH, R0, 0),
7450                         BPF_EXIT_INSN(),
7451                 },
7452                 INTERNAL,
7453                 { },
7454                 { { 0, 0x12345678 } }
7455         },
7456         {
7457                 "ALU64_RSH_K: 2 >> 1 = 1",
7458                 .u.insns_int = {
7459                         BPF_LD_IMM64(R0, 2),
7460                         BPF_ALU64_IMM(BPF_RSH, R0, 1),
7461                         BPF_EXIT_INSN(),
7462                 },
7463                 INTERNAL,
7464                 { },
7465                 { { 0, 1 } },
7466         },
7467         {
7468                 "ALU64_RSH_K: 0x80000000 >> 31 = 1",
7469                 .u.insns_int = {
7470                         BPF_LD_IMM64(R0, 0x80000000),
7471                         BPF_ALU64_IMM(BPF_RSH, R0, 31),
7472                         BPF_EXIT_INSN(),
7473                 },
7474                 INTERNAL,
7475                 { },
7476                 { { 0, 1 } },
7477         },
7478         {
7479                 "ALU64_RSH_K: Shift < 32, low word",
7480                 .u.insns_int = {
7481                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7482                         BPF_ALU64_IMM(BPF_RSH, R0, 12),
7483                         BPF_EXIT_INSN(),
7484                 },
7485                 INTERNAL,
7486                 { },
7487                 { { 0, 0x56789abc } }
7488         },
7489         {
7490                 "ALU64_RSH_K: Shift < 32, high word",
7491                 .u.insns_int = {
7492                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7493                         BPF_ALU64_IMM(BPF_RSH, R0, 12),
7494                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7495                         BPF_EXIT_INSN(),
7496                 },
7497                 INTERNAL,
7498                 { },
7499                 { { 0, 0x00081234 } }
7500         },
7501         {
7502                 "ALU64_RSH_K: Shift > 32, low word",
7503                 .u.insns_int = {
7504                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7505                         BPF_ALU64_IMM(BPF_RSH, R0, 36),
7506                         BPF_EXIT_INSN(),
7507                 },
7508                 INTERNAL,
7509                 { },
7510                 { { 0, 0x08123456 } }
7511         },
7512         {
7513                 "ALU64_RSH_K: Shift > 32, high word",
7514                 .u.insns_int = {
7515                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7516                         BPF_ALU64_IMM(BPF_RSH, R0, 36),
7517                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7518                         BPF_EXIT_INSN(),
7519                 },
7520                 INTERNAL,
7521                 { },
7522                 { { 0, 0 } }
7523         },
7524         {
7525                 "ALU64_RSH_K: Shift == 32, low word",
7526                 .u.insns_int = {
7527                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7528                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7529                         BPF_EXIT_INSN(),
7530                 },
7531                 INTERNAL,
7532                 { },
7533                 { { 0, 0x81234567 } }
7534         },
7535         {
7536                 "ALU64_RSH_K: Shift == 32, high word",
7537                 .u.insns_int = {
7538                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7539                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7540                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7541                         BPF_EXIT_INSN(),
7542                 },
7543                 INTERNAL,
7544                 { },
7545                 { { 0, 0 } }
7546         },
7547         {
7548                 "ALU64_RSH_K: Zero shift",
7549                 .u.insns_int = {
7550                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7551                         BPF_ALU64_IMM(BPF_RSH, R0, 0),
7552                         BPF_EXIT_INSN(),
7553                 },
7554                 INTERNAL,
7555                 { },
7556                 { { 0, 0x89abcdef } }
7557         },
7558         /* BPF_ALU | BPF_ARSH | BPF_X */
7559         {
7560                 "ALU32_ARSH_X: -1234 >> 7 = -10",
7561                 .u.insns_int = {
7562                         BPF_ALU32_IMM(BPF_MOV, R0, -1234),
7563                         BPF_ALU32_IMM(BPF_MOV, R1, 7),
7564                         BPF_ALU32_REG(BPF_ARSH, R0, R1),
7565                         BPF_EXIT_INSN(),
7566                 },
7567                 INTERNAL,
7568                 { },
7569                 { { 0, -10 } }
7570         },
7571         {
7572                 "ALU64_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
7573                 .u.insns_int = {
7574                         BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
7575                         BPF_ALU32_IMM(BPF_MOV, R1, 40),
7576                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7577                         BPF_EXIT_INSN(),
7578                 },
7579                 INTERNAL,
7580                 { },
7581                 { { 0, 0xffff00ff } },
7582         },
7583         {
7584                 "ALU64_ARSH_X: Shift < 32, low word",
7585                 .u.insns_int = {
7586                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7587                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7588                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7589                         BPF_EXIT_INSN(),
7590                 },
7591                 INTERNAL,
7592                 { },
7593                 { { 0, 0x56789abc } }
7594         },
7595         {
7596                 "ALU64_ARSH_X: Shift < 32, high word",
7597                 .u.insns_int = {
7598                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7599                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7600                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7601                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7602                         BPF_EXIT_INSN(),
7603                 },
7604                 INTERNAL,
7605                 { },
7606                 { { 0, 0xfff81234 } }
7607         },
7608         {
7609                 "ALU64_ARSH_X: Shift > 32, low word",
7610                 .u.insns_int = {
7611                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7612                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7613                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7614                         BPF_EXIT_INSN(),
7615                 },
7616                 INTERNAL,
7617                 { },
7618                 { { 0, 0xf8123456 } }
7619         },
7620         {
7621                 "ALU64_ARSH_X: Shift > 32, high word",
7622                 .u.insns_int = {
7623                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7624                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7625                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7626                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7627                         BPF_EXIT_INSN(),
7628                 },
7629                 INTERNAL,
7630                 { },
7631                 { { 0, -1 } }
7632         },
7633         {
7634                 "ALU64_ARSH_X: Shift == 32, low word",
7635                 .u.insns_int = {
7636                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7637                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7638                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7639                         BPF_EXIT_INSN(),
7640                 },
7641                 INTERNAL,
7642                 { },
7643                 { { 0, 0x81234567 } }
7644         },
7645         {
7646                 "ALU64_ARSH_X: Shift == 32, high word",
7647                 .u.insns_int = {
7648                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7649                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7650                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7651                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7652                         BPF_EXIT_INSN(),
7653                 },
7654                 INTERNAL,
7655                 { },
7656                 { { 0, -1 } }
7657         },
7658         {
7659                 "ALU64_ARSH_X: Zero shift, low word",
7660                 .u.insns_int = {
7661                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7662                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7663                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7664                         BPF_EXIT_INSN(),
7665                 },
7666                 INTERNAL,
7667                 { },
7668                 { { 0, 0x89abcdef } }
7669         },
7670         {
7671                 "ALU64_ARSH_X: Zero shift, high word",
7672                 .u.insns_int = {
7673                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7674                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7675                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7676                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7677                         BPF_EXIT_INSN(),
7678                 },
7679                 INTERNAL,
7680                 { },
7681                 { { 0, 0x81234567 } }
7682         },
7683         /* BPF_ALU | BPF_ARSH | BPF_K */
7684         {
7685                 "ALU32_ARSH_K: -1234 >> 7 = -10",
7686                 .u.insns_int = {
7687                         BPF_ALU32_IMM(BPF_MOV, R0, -1234),
7688                         BPF_ALU32_IMM(BPF_ARSH, R0, 7),
7689                         BPF_EXIT_INSN(),
7690                 },
7691                 INTERNAL,
7692                 { },
7693                 { { 0, -10 } }
7694         },
7695         {
7696                 "ALU32_ARSH_K: -1234 >> 0 = -1234",
7697                 .u.insns_int = {
7698                         BPF_ALU32_IMM(BPF_MOV, R0, -1234),
7699                         BPF_ALU32_IMM(BPF_ARSH, R0, 0),
7700                         BPF_EXIT_INSN(),
7701                 },
7702                 INTERNAL,
7703                 { },
7704                 { { 0, -1234 } }
7705         },
7706         {
7707                 "ALU64_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
7708                 .u.insns_int = {
7709                         BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
7710                         BPF_ALU64_IMM(BPF_ARSH, R0, 40),
7711                         BPF_EXIT_INSN(),
7712                 },
7713                 INTERNAL,
7714                 { },
7715                 { { 0, 0xffff00ff } },
7716         },
7717         {
7718                 "ALU64_ARSH_K: Shift < 32, low word",
7719                 .u.insns_int = {
7720                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7721                         BPF_ALU64_IMM(BPF_RSH, R0, 12),
7722                         BPF_EXIT_INSN(),
7723                 },
7724                 INTERNAL,
7725                 { },
7726                 { { 0, 0x56789abc } }
7727         },
7728         {
7729                 "ALU64_ARSH_K: Shift < 32, high word",
7730                 .u.insns_int = {
7731                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7732                         BPF_ALU64_IMM(BPF_ARSH, R0, 12),
7733                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7734                         BPF_EXIT_INSN(),
7735                 },
7736                 INTERNAL,
7737                 { },
7738                 { { 0, 0xfff81234 } }
7739         },
7740         {
7741                 "ALU64_ARSH_K: Shift > 32, low word",
7742                 .u.insns_int = {
7743                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7744                         BPF_ALU64_IMM(BPF_ARSH, R0, 36),
7745                         BPF_EXIT_INSN(),
7746                 },
7747                 INTERNAL,
7748                 { },
7749                 { { 0, 0xf8123456 } }
7750         },
7751         {
7752                 "ALU64_ARSH_K: Shift > 32, high word",
7753                 .u.insns_int = {
7754                         BPF_LD_IMM64(R0, 0xf123456789abcdefLL),
7755                         BPF_ALU64_IMM(BPF_ARSH, R0, 36),
7756                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7757                         BPF_EXIT_INSN(),
7758                 },
7759                 INTERNAL,
7760                 { },
7761                 { { 0, -1 } }
7762         },
7763         {
7764                 "ALU64_ARSH_K: Shift == 32, low word",
7765                 .u.insns_int = {
7766                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7767                         BPF_ALU64_IMM(BPF_ARSH, R0, 32),
7768                         BPF_EXIT_INSN(),
7769                 },
7770                 INTERNAL,
7771                 { },
7772                 { { 0, 0x81234567 } }
7773         },
7774         {
7775                 "ALU64_ARSH_K: Shift == 32, high word",
7776                 .u.insns_int = {
7777                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7778                         BPF_ALU64_IMM(BPF_ARSH, R0, 32),
7779                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7780                         BPF_EXIT_INSN(),
7781                 },
7782                 INTERNAL,
7783                 { },
7784                 { { 0, -1 } }
7785         },
7786         {
7787                 "ALU64_ARSH_K: Zero shift",
7788                 .u.insns_int = {
7789                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7790                         BPF_ALU64_IMM(BPF_ARSH, R0, 0),
7791                         BPF_EXIT_INSN(),
7792                 },
7793                 INTERNAL,
7794                 { },
7795                 { { 0, 0x89abcdef } }
7796         },
7797         /* BPF_ALU | BPF_NEG */
7798         {
7799                 "ALU_NEG: -(3) = -3",
7800                 .u.insns_int = {
7801                         BPF_ALU32_IMM(BPF_MOV, R0, 3),
7802                         BPF_ALU32_IMM(BPF_NEG, R0, 0),
7803                         BPF_EXIT_INSN(),
7804                 },
7805                 INTERNAL,
7806                 { },
7807                 { { 0, -3 } },
7808         },
7809         {
7810                 "ALU_NEG: -(-3) = 3",
7811                 .u.insns_int = {
7812                         BPF_ALU32_IMM(BPF_MOV, R0, -3),
7813                         BPF_ALU32_IMM(BPF_NEG, R0, 0),
7814                         BPF_EXIT_INSN(),
7815                 },
7816                 INTERNAL,
7817                 { },
7818                 { { 0, 3 } },
7819         },
7820         {
7821                 "ALU64_NEG: -(3) = -3",
7822                 .u.insns_int = {
7823                         BPF_LD_IMM64(R0, 3),
7824                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
7825                         BPF_EXIT_INSN(),
7826                 },
7827                 INTERNAL,
7828                 { },
7829                 { { 0, -3 } },
7830         },
7831         {
7832                 "ALU64_NEG: -(-3) = 3",
7833                 .u.insns_int = {
7834                         BPF_LD_IMM64(R0, -3),
7835                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
7836                         BPF_EXIT_INSN(),
7837                 },
7838                 INTERNAL,
7839                 { },
7840                 { { 0, 3 } },
7841         },
7842         /* BPF_ALU | BPF_END | BPF_FROM_BE */
7843         {
7844                 "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
7845                 .u.insns_int = {
7846                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7847                         BPF_ENDIAN(BPF_FROM_BE, R0, 16),
7848                         BPF_EXIT_INSN(),
7849                 },
7850                 INTERNAL,
7851                 { },
7852                 { { 0,  cpu_to_be16(0xcdef) } },
7853         },
7854         {
7855                 "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
7856                 .u.insns_int = {
7857                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7858                         BPF_ENDIAN(BPF_FROM_BE, R0, 32),
7859                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7860                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7861                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7862                         BPF_EXIT_INSN(),
7863                 },
7864                 INTERNAL,
7865                 { },
7866                 { { 0, cpu_to_be32(0x89abcdef) } },
7867         },
7868         {
7869                 "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
7870                 .u.insns_int = {
7871                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7872                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7873                         BPF_EXIT_INSN(),
7874                 },
7875                 INTERNAL,
7876                 { },
7877                 { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
7878         },
7879         {
7880                 "ALU_END_FROM_BE 64: 0x0123456789abcdef >> 32 -> 0x01234567",
7881                 .u.insns_int = {
7882                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7883                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7884                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7885                         BPF_EXIT_INSN(),
7886                 },
7887                 INTERNAL,
7888                 { },
7889                 { { 0, (u32) (cpu_to_be64(0x0123456789abcdefLL) >> 32) } },
7890         },
7891         /* BPF_ALU | BPF_END | BPF_FROM_BE, reversed */
7892         {
7893                 "ALU_END_FROM_BE 16: 0xfedcba9876543210 -> 0x3210",
7894                 .u.insns_int = {
7895                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7896                         BPF_ENDIAN(BPF_FROM_BE, R0, 16),
7897                         BPF_EXIT_INSN(),
7898                 },
7899                 INTERNAL,
7900                 { },
7901                 { { 0,  cpu_to_be16(0x3210) } },
7902         },
7903         {
7904                 "ALU_END_FROM_BE 32: 0xfedcba9876543210 -> 0x76543210",
7905                 .u.insns_int = {
7906                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7907                         BPF_ENDIAN(BPF_FROM_BE, R0, 32),
7908                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7909                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7910                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7911                         BPF_EXIT_INSN(),
7912                 },
7913                 INTERNAL,
7914                 { },
7915                 { { 0, cpu_to_be32(0x76543210) } },
7916         },
7917         {
7918                 "ALU_END_FROM_BE 64: 0xfedcba9876543210 -> 0x76543210",
7919                 .u.insns_int = {
7920                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7921                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7922                         BPF_EXIT_INSN(),
7923                 },
7924                 INTERNAL,
7925                 { },
7926                 { { 0, (u32) cpu_to_be64(0xfedcba9876543210ULL) } },
7927         },
7928         {
7929                 "ALU_END_FROM_BE 64: 0xfedcba9876543210 >> 32 -> 0xfedcba98",
7930                 .u.insns_int = {
7931                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7932                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7933                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7934                         BPF_EXIT_INSN(),
7935                 },
7936                 INTERNAL,
7937                 { },
7938                 { { 0, (u32) (cpu_to_be64(0xfedcba9876543210ULL) >> 32) } },
7939         },
7940         /* BPF_ALU | BPF_END | BPF_FROM_LE */
7941         {
7942                 "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
7943                 .u.insns_int = {
7944                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7945                         BPF_ENDIAN(BPF_FROM_LE, R0, 16),
7946                         BPF_EXIT_INSN(),
7947                 },
7948                 INTERNAL,
7949                 { },
7950                 { { 0, cpu_to_le16(0xcdef) } },
7951         },
7952         {
7953                 "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
7954                 .u.insns_int = {
7955                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7956                         BPF_ENDIAN(BPF_FROM_LE, R0, 32),
7957                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7958                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7959                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7960                         BPF_EXIT_INSN(),
7961                 },
7962                 INTERNAL,
7963                 { },
7964                 { { 0, cpu_to_le32(0x89abcdef) } },
7965         },
7966         {
7967                 "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
7968                 .u.insns_int = {
7969                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7970                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
7971                         BPF_EXIT_INSN(),
7972                 },
7973                 INTERNAL,
7974                 { },
7975                 { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
7976         },
7977         {
7978                 "ALU_END_FROM_LE 64: 0x0123456789abcdef >> 32 -> 0xefcdab89",
7979                 .u.insns_int = {
7980                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7981                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
7982                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7983                         BPF_EXIT_INSN(),
7984                 },
7985                 INTERNAL,
7986                 { },
7987                 { { 0, (u32) (cpu_to_le64(0x0123456789abcdefLL) >> 32) } },
7988         },
7989         /* BPF_ALU | BPF_END | BPF_FROM_LE, reversed */
7990         {
7991                 "ALU_END_FROM_LE 16: 0xfedcba9876543210 -> 0x1032",
7992                 .u.insns_int = {
7993                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7994                         BPF_ENDIAN(BPF_FROM_LE, R0, 16),
7995                         BPF_EXIT_INSN(),
7996                 },
7997                 INTERNAL,
7998                 { },
7999                 { { 0,  cpu_to_le16(0x3210) } },
8000         },
8001         {
8002                 "ALU_END_FROM_LE 32: 0xfedcba9876543210 -> 0x10325476",
8003                 .u.insns_int = {
8004                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8005                         BPF_ENDIAN(BPF_FROM_LE, R0, 32),
8006                         BPF_ALU64_REG(BPF_MOV, R1, R0),
8007                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
8008                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
8009                         BPF_EXIT_INSN(),
8010                 },
8011                 INTERNAL,
8012                 { },
8013                 { { 0, cpu_to_le32(0x76543210) } },
8014         },
8015         {
8016                 "ALU_END_FROM_LE 64: 0xfedcba9876543210 -> 0x10325476",
8017                 .u.insns_int = {
8018                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8019                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
8020                         BPF_EXIT_INSN(),
8021                 },
8022                 INTERNAL,
8023                 { },
8024                 { { 0, (u32) cpu_to_le64(0xfedcba9876543210ULL) } },
8025         },
8026         {
8027                 "ALU_END_FROM_LE 64: 0xfedcba9876543210 >> 32 -> 0x98badcfe",
8028                 .u.insns_int = {
8029                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8030                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
8031                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
8032                         BPF_EXIT_INSN(),
8033                 },
8034                 INTERNAL,
8035                 { },
8036                 { { 0, (u32) (cpu_to_le64(0xfedcba9876543210ULL) >> 32) } },
8037         },
8038         /* BSWAP */
8039         {
8040                 "BSWAP 16: 0x0123456789abcdef -> 0xefcd",
8041                 .u.insns_int = {
8042                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
8043                         BPF_BSWAP(R0, 16),
8044                         BPF_EXIT_INSN(),
8045                 },
8046                 INTERNAL,
8047                 { },
8048                 { { 0, 0xefcd } },
8049         },
8050         {
8051                 "BSWAP 32: 0x0123456789abcdef -> 0xefcdab89",
8052                 .u.insns_int = {
8053                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
8054                         BPF_BSWAP(R0, 32),
8055                         BPF_ALU64_REG(BPF_MOV, R1, R0),
8056                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
8057                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
8058                         BPF_EXIT_INSN(),
8059                 },
8060                 INTERNAL,
8061                 { },
8062                 { { 0, 0xefcdab89 } },
8063         },
8064         {
8065                 "BSWAP 64: 0x0123456789abcdef -> 0x67452301",
8066                 .u.insns_int = {
8067                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
8068                         BPF_BSWAP(R0, 64),
8069                         BPF_EXIT_INSN(),
8070                 },
8071                 INTERNAL,
8072                 { },
8073                 { { 0, 0x67452301 } },
8074         },
8075         {
8076                 "BSWAP 64: 0x0123456789abcdef >> 32 -> 0xefcdab89",
8077                 .u.insns_int = {
8078                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
8079                         BPF_BSWAP(R0, 64),
8080                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
8081                         BPF_EXIT_INSN(),
8082                 },
8083                 INTERNAL,
8084                 { },
8085                 { { 0, 0xefcdab89 } },
8086         },
8087         /* BSWAP, reversed */
8088         {
8089                 "BSWAP 16: 0xfedcba9876543210 -> 0x1032",
8090                 .u.insns_int = {
8091                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8092                         BPF_BSWAP(R0, 16),
8093                         BPF_EXIT_INSN(),
8094                 },
8095                 INTERNAL,
8096                 { },
8097                 { { 0, 0x1032 } },
8098         },
8099         {
8100                 "BSWAP 32: 0xfedcba9876543210 -> 0x10325476",
8101                 .u.insns_int = {
8102                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8103                         BPF_BSWAP(R0, 32),
8104                         BPF_ALU64_REG(BPF_MOV, R1, R0),
8105                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
8106                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
8107                         BPF_EXIT_INSN(),
8108                 },
8109                 INTERNAL,
8110                 { },
8111                 { { 0, 0x10325476 } },
8112         },
8113         {
8114                 "BSWAP 64: 0xfedcba9876543210 -> 0x98badcfe",
8115                 .u.insns_int = {
8116                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8117                         BPF_BSWAP(R0, 64),
8118                         BPF_EXIT_INSN(),
8119                 },
8120                 INTERNAL,
8121                 { },
8122                 { { 0, 0x98badcfe } },
8123         },
8124         {
8125                 "BSWAP 64: 0xfedcba9876543210 >> 32 -> 0x10325476",
8126                 .u.insns_int = {
8127                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8128                         BPF_BSWAP(R0, 64),
8129                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
8130                         BPF_EXIT_INSN(),
8131                 },
8132                 INTERNAL,
8133                 { },
8134                 { { 0, 0x10325476 } },
8135         },
8136         /* BPF_LDX_MEM B/H/W/DW */
8137         {
8138                 "BPF_LDX_MEM | BPF_B, base",
8139                 .u.insns_int = {
8140                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
8141                         BPF_LD_IMM64(R2, 0x0000000000000008ULL),
8142                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8143 #ifdef __BIG_ENDIAN
8144                         BPF_LDX_MEM(BPF_B, R0, R10, -1),
8145 #else
8146                         BPF_LDX_MEM(BPF_B, R0, R10, -8),
8147 #endif
8148                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8149                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8150                         BPF_EXIT_INSN(),
8151                 },
8152                 INTERNAL,
8153                 { },
8154                 { { 0, 0 } },
8155                 .stack_depth = 8,
8156         },
8157         {
8158                 "BPF_LDX_MEM | BPF_B, MSB set",
8159                 .u.insns_int = {
8160                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
8161                         BPF_LD_IMM64(R2, 0x0000000000000088ULL),
8162                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8163 #ifdef __BIG_ENDIAN
8164                         BPF_LDX_MEM(BPF_B, R0, R10, -1),
8165 #else
8166                         BPF_LDX_MEM(BPF_B, R0, R10, -8),
8167 #endif
8168                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8169                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8170                         BPF_EXIT_INSN(),
8171                 },
8172                 INTERNAL,
8173                 { },
8174                 { { 0, 0 } },
8175                 .stack_depth = 8,
8176         },
8177         {
8178                 "BPF_LDX_MEM | BPF_B, negative offset",
8179                 .u.insns_int = {
8180                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8181                         BPF_LD_IMM64(R3, 0x0000000000000088ULL),
8182                         BPF_ALU64_IMM(BPF_ADD, R1, 512),
8183                         BPF_STX_MEM(BPF_B, R1, R2, -256),
8184                         BPF_LDX_MEM(BPF_B, R0, R1, -256),
8185                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8186                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8187                         BPF_EXIT_INSN(),
8188                 },
8189                 INTERNAL | FLAG_LARGE_MEM,
8190                 { },
8191                 { { 512, 0 } },
8192                 .stack_depth = 0,
8193         },
8194         {
8195                 "BPF_LDX_MEM | BPF_B, small positive offset",
8196                 .u.insns_int = {
8197                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8198                         BPF_LD_IMM64(R3, 0x0000000000000088ULL),
8199                         BPF_STX_MEM(BPF_B, R1, R2, 256),
8200                         BPF_LDX_MEM(BPF_B, R0, R1, 256),
8201                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8202                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8203                         BPF_EXIT_INSN(),
8204                 },
8205                 INTERNAL | FLAG_LARGE_MEM,
8206                 { },
8207                 { { 512, 0 } },
8208                 .stack_depth = 0,
8209         },
8210         {
8211                 "BPF_LDX_MEM | BPF_B, large positive offset",
8212                 .u.insns_int = {
8213                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8214                         BPF_LD_IMM64(R3, 0x0000000000000088ULL),
8215                         BPF_STX_MEM(BPF_B, R1, R2, 4096),
8216                         BPF_LDX_MEM(BPF_B, R0, R1, 4096),
8217                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8218                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8219                         BPF_EXIT_INSN(),
8220                 },
8221                 INTERNAL | FLAG_LARGE_MEM,
8222                 { },
8223                 { { 4096 + 16, 0 } },
8224                 .stack_depth = 0,
8225         },
8226         {
8227                 "BPF_LDX_MEM | BPF_H, base",
8228                 .u.insns_int = {
8229                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
8230                         BPF_LD_IMM64(R2, 0x0000000000000708ULL),
8231                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8232 #ifdef __BIG_ENDIAN
8233                         BPF_LDX_MEM(BPF_H, R0, R10, -2),
8234 #else
8235                         BPF_LDX_MEM(BPF_H, R0, R10, -8),
8236 #endif
8237                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8238                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8239                         BPF_EXIT_INSN(),
8240                 },
8241                 INTERNAL,
8242                 { },
8243                 { { 0, 0 } },
8244                 .stack_depth = 8,
8245         },
8246         {
8247                 "BPF_LDX_MEM | BPF_H, MSB set",
8248                 .u.insns_int = {
8249                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
8250                         BPF_LD_IMM64(R2, 0x0000000000008788ULL),
8251                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8252 #ifdef __BIG_ENDIAN
8253                         BPF_LDX_MEM(BPF_H, R0, R10, -2),
8254 #else
8255                         BPF_LDX_MEM(BPF_H, R0, R10, -8),
8256 #endif
8257                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8258                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8259                         BPF_EXIT_INSN(),
8260                 },
8261                 INTERNAL,
8262                 { },
8263                 { { 0, 0 } },
8264                 .stack_depth = 8,
8265         },
8266         {
8267                 "BPF_LDX_MEM | BPF_H, negative offset",
8268                 .u.insns_int = {
8269                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8270                         BPF_LD_IMM64(R3, 0x0000000000008788ULL),
8271                         BPF_ALU64_IMM(BPF_ADD, R1, 512),
8272                         BPF_STX_MEM(BPF_H, R1, R2, -256),
8273                         BPF_LDX_MEM(BPF_H, R0, R1, -256),
8274                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8275                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8276                         BPF_EXIT_INSN(),
8277                 },
8278                 INTERNAL | FLAG_LARGE_MEM,
8279                 { },
8280                 { { 512, 0 } },
8281                 .stack_depth = 0,
8282         },
8283         {
8284                 "BPF_LDX_MEM | BPF_H, small positive offset",
8285                 .u.insns_int = {
8286                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8287                         BPF_LD_IMM64(R3, 0x0000000000008788ULL),
8288                         BPF_STX_MEM(BPF_H, R1, R2, 256),
8289                         BPF_LDX_MEM(BPF_H, R0, R1, 256),
8290                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8291                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8292                         BPF_EXIT_INSN(),
8293                 },
8294                 INTERNAL | FLAG_LARGE_MEM,
8295                 { },
8296                 { { 512, 0 } },
8297                 .stack_depth = 0,
8298         },
8299         {
8300                 "BPF_LDX_MEM | BPF_H, large positive offset",
8301                 .u.insns_int = {
8302                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8303                         BPF_LD_IMM64(R3, 0x0000000000008788ULL),
8304                         BPF_STX_MEM(BPF_H, R1, R2, 8192),
8305                         BPF_LDX_MEM(BPF_H, R0, R1, 8192),
8306                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8307                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8308                         BPF_EXIT_INSN(),
8309                 },
8310                 INTERNAL | FLAG_LARGE_MEM,
8311                 { },
8312                 { { 8192 + 16, 0 } },
8313                 .stack_depth = 0,
8314         },
8315         {
8316                 "BPF_LDX_MEM | BPF_H, unaligned positive offset",
8317                 .u.insns_int = {
8318                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8319                         BPF_LD_IMM64(R3, 0x0000000000008788ULL),
8320                         BPF_STX_MEM(BPF_H, R1, R2, 13),
8321                         BPF_LDX_MEM(BPF_H, R0, R1, 13),
8322                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8323                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8324                         BPF_EXIT_INSN(),
8325                 },
8326                 INTERNAL | FLAG_LARGE_MEM,
8327                 { },
8328                 { { 32, 0 } },
8329                 .stack_depth = 0,
8330         },
8331         {
8332                 "BPF_LDX_MEM | BPF_W, base",
8333                 .u.insns_int = {
8334                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
8335                         BPF_LD_IMM64(R2, 0x0000000005060708ULL),
8336                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8337 #ifdef __BIG_ENDIAN
8338                         BPF_LDX_MEM(BPF_W, R0, R10, -4),
8339 #else
8340                         BPF_LDX_MEM(BPF_W, R0, R10, -8),
8341 #endif
8342                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8343                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8344                         BPF_EXIT_INSN(),
8345                 },
8346                 INTERNAL,
8347                 { },
8348                 { { 0, 0 } },
8349                 .stack_depth = 8,
8350         },
8351         {
8352                 "BPF_LDX_MEM | BPF_W, MSB set",
8353                 .u.insns_int = {
8354                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
8355                         BPF_LD_IMM64(R2, 0x0000000085868788ULL),
8356                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8357 #ifdef __BIG_ENDIAN
8358                         BPF_LDX_MEM(BPF_W, R0, R10, -4),
8359 #else
8360                         BPF_LDX_MEM(BPF_W, R0, R10, -8),
8361 #endif
8362                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8363                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8364                         BPF_EXIT_INSN(),
8365                 },
8366                 INTERNAL,
8367                 { },
8368                 { { 0, 0 } },
8369                 .stack_depth = 8,
8370         },
8371         {
8372                 "BPF_LDX_MEM | BPF_W, negative offset",
8373                 .u.insns_int = {
8374                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8375                         BPF_LD_IMM64(R3, 0x0000000085868788ULL),
8376                         BPF_ALU64_IMM(BPF_ADD, R1, 512),
8377                         BPF_STX_MEM(BPF_W, R1, R2, -256),
8378                         BPF_LDX_MEM(BPF_W, R0, R1, -256),
8379                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8380                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8381                         BPF_EXIT_INSN(),
8382                 },
8383                 INTERNAL | FLAG_LARGE_MEM,
8384                 { },
8385                 { { 512, 0 } },
8386                 .stack_depth = 0,
8387         },
8388         {
8389                 "BPF_LDX_MEM | BPF_W, small positive offset",
8390                 .u.insns_int = {
8391                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8392                         BPF_LD_IMM64(R3, 0x0000000085868788ULL),
8393                         BPF_STX_MEM(BPF_W, R1, R2, 256),
8394                         BPF_LDX_MEM(BPF_W, R0, R1, 256),
8395                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8396                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8397                         BPF_EXIT_INSN(),
8398                 },
8399                 INTERNAL | FLAG_LARGE_MEM,
8400                 { },
8401                 { { 512, 0 } },
8402                 .stack_depth = 0,
8403         },
8404         {
8405                 "BPF_LDX_MEM | BPF_W, large positive offset",
8406                 .u.insns_int = {
8407                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8408                         BPF_LD_IMM64(R3, 0x0000000085868788ULL),
8409                         BPF_STX_MEM(BPF_W, R1, R2, 16384),
8410                         BPF_LDX_MEM(BPF_W, R0, R1, 16384),
8411                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8412                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8413                         BPF_EXIT_INSN(),
8414                 },
8415                 INTERNAL | FLAG_LARGE_MEM,
8416                 { },
8417                 { { 16384 + 16, 0 } },
8418                 .stack_depth = 0,
8419         },
8420         {
8421                 "BPF_LDX_MEM | BPF_W, unaligned positive offset",
8422                 .u.insns_int = {
8423                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8424                         BPF_LD_IMM64(R3, 0x0000000085868788ULL),
8425                         BPF_STX_MEM(BPF_W, R1, R2, 13),
8426                         BPF_LDX_MEM(BPF_W, R0, R1, 13),
8427                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8428                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8429                         BPF_EXIT_INSN(),
8430                 },
8431                 INTERNAL | FLAG_LARGE_MEM,
8432                 { },
8433                 { { 32, 0 } },
8434                 .stack_depth = 0,
8435         },
8436         {
8437                 "BPF_LDX_MEM | BPF_DW, base",
8438                 .u.insns_int = {
8439                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
8440                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8441                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8442                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
8443                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8444                         BPF_EXIT_INSN(),
8445                 },
8446                 INTERNAL,
8447                 { },
8448                 { { 0, 0 } },
8449                 .stack_depth = 8,
8450         },
8451         {
8452                 "BPF_LDX_MEM | BPF_DW, MSB set",
8453                 .u.insns_int = {
8454                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
8455                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8456                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8457                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
8458                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8459                         BPF_EXIT_INSN(),
8460                 },
8461                 INTERNAL,
8462                 { },
8463                 { { 0, 0 } },
8464                 .stack_depth = 8,
8465         },
8466         {
8467                 "BPF_LDX_MEM | BPF_DW, negative offset",
8468                 .u.insns_int = {
8469                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8470                         BPF_ALU64_IMM(BPF_ADD, R1, 512),
8471                         BPF_STX_MEM(BPF_DW, R1, R2, -256),
8472                         BPF_LDX_MEM(BPF_DW, R0, R1, -256),
8473                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8474                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8475                         BPF_EXIT_INSN(),
8476                 },
8477                 INTERNAL | FLAG_LARGE_MEM,
8478                 { },
8479                 { { 512, 0 } },
8480                 .stack_depth = 0,
8481         },
8482         {
8483                 "BPF_LDX_MEM | BPF_DW, small positive offset",
8484                 .u.insns_int = {
8485                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8486                         BPF_STX_MEM(BPF_DW, R1, R2, 256),
8487                         BPF_LDX_MEM(BPF_DW, R0, R1, 256),
8488                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8489                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8490                         BPF_EXIT_INSN(),
8491                 },
8492                 INTERNAL | FLAG_LARGE_MEM,
8493                 { },
8494                 { { 512, 0 } },
8495                 .stack_depth = 8,
8496         },
8497         {
8498                 "BPF_LDX_MEM | BPF_DW, large positive offset",
8499                 .u.insns_int = {
8500                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8501                         BPF_STX_MEM(BPF_DW, R1, R2, 32760),
8502                         BPF_LDX_MEM(BPF_DW, R0, R1, 32760),
8503                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8504                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8505                         BPF_EXIT_INSN(),
8506                 },
8507                 INTERNAL | FLAG_LARGE_MEM,
8508                 { },
8509                 { { 32768, 0 } },
8510                 .stack_depth = 0,
8511         },
8512         {
8513                 "BPF_LDX_MEM | BPF_DW, unaligned positive offset",
8514                 .u.insns_int = {
8515                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8516                         BPF_STX_MEM(BPF_DW, R1, R2, 13),
8517                         BPF_LDX_MEM(BPF_DW, R0, R1, 13),
8518                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8519                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8520                         BPF_EXIT_INSN(),
8521                 },
8522                 INTERNAL | FLAG_LARGE_MEM,
8523                 { },
8524                 { { 32, 0 } },
8525                 .stack_depth = 0,
8526         },
8527         /* BPF_LDX_MEMSX B/H/W */
8528         {
8529                 "BPF_LDX_MEMSX | BPF_B",
8530                 .u.insns_int = {
8531                         BPF_LD_IMM64(R1, 0xdead0000000000f0ULL),
8532                         BPF_LD_IMM64(R2, 0xfffffffffffffff0ULL),
8533                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8534 #ifdef __BIG_ENDIAN
8535                         BPF_LDX_MEMSX(BPF_B, R0, R10, -1),
8536 #else
8537                         BPF_LDX_MEMSX(BPF_B, R0, R10, -8),
8538 #endif
8539                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8540                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8541                         BPF_EXIT_INSN(),
8542                 },
8543                 INTERNAL,
8544                 { },
8545                 { { 0, 0 } },
8546                 .stack_depth = 8,
8547         },
8548         {
8549                 "BPF_LDX_MEMSX | BPF_H",
8550                 .u.insns_int = {
8551                         BPF_LD_IMM64(R1, 0xdead00000000f123ULL),
8552                         BPF_LD_IMM64(R2, 0xfffffffffffff123ULL),
8553                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8554 #ifdef __BIG_ENDIAN
8555                         BPF_LDX_MEMSX(BPF_H, R0, R10, -2),
8556 #else
8557                         BPF_LDX_MEMSX(BPF_H, R0, R10, -8),
8558 #endif
8559                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8560                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8561                         BPF_EXIT_INSN(),
8562                 },
8563                 INTERNAL,
8564                 { },
8565                 { { 0, 0 } },
8566                 .stack_depth = 8,
8567         },
8568         {
8569                 "BPF_LDX_MEMSX | BPF_W",
8570                 .u.insns_int = {
8571                         BPF_LD_IMM64(R1, 0x00000000deadbeefULL),
8572                         BPF_LD_IMM64(R2, 0xffffffffdeadbeefULL),
8573                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8574 #ifdef __BIG_ENDIAN
8575                         BPF_LDX_MEMSX(BPF_W, R0, R10, -4),
8576 #else
8577                         BPF_LDX_MEMSX(BPF_W, R0, R10, -8),
8578 #endif
8579                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8580                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8581                         BPF_EXIT_INSN(),
8582                 },
8583                 INTERNAL,
8584                 { },
8585                 { { 0, 0 } },
8586                 .stack_depth = 8,
8587         },
8588         /* BPF_STX_MEM B/H/W/DW */
8589         {
8590                 "BPF_STX_MEM | BPF_B",
8591                 .u.insns_int = {
8592                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8593                         BPF_LD_IMM64(R2, 0x0102030405060708ULL),
8594                         BPF_LD_IMM64(R3, 0x8090a0b0c0d0e008ULL),
8595                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8596 #ifdef __BIG_ENDIAN
8597                         BPF_STX_MEM(BPF_B, R10, R2, -1),
8598 #else
8599                         BPF_STX_MEM(BPF_B, R10, R2, -8),
8600 #endif
8601                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8602                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8603                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8604                         BPF_EXIT_INSN(),
8605                 },
8606                 INTERNAL,
8607                 { },
8608                 { { 0, 0 } },
8609                 .stack_depth = 8,
8610         },
8611         {
8612                 "BPF_STX_MEM | BPF_B, MSB set",
8613                 .u.insns_int = {
8614                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8615                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8616                         BPF_LD_IMM64(R3, 0x8090a0b0c0d0e088ULL),
8617                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8618 #ifdef __BIG_ENDIAN
8619                         BPF_STX_MEM(BPF_B, R10, R2, -1),
8620 #else
8621                         BPF_STX_MEM(BPF_B, R10, R2, -8),
8622 #endif
8623                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8624                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8625                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8626                         BPF_EXIT_INSN(),
8627                 },
8628                 INTERNAL,
8629                 { },
8630                 { { 0, 0 } },
8631                 .stack_depth = 8,
8632         },
8633         {
8634                 "BPF_STX_MEM | BPF_H",
8635                 .u.insns_int = {
8636                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8637                         BPF_LD_IMM64(R2, 0x0102030405060708ULL),
8638                         BPF_LD_IMM64(R3, 0x8090a0b0c0d00708ULL),
8639                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8640 #ifdef __BIG_ENDIAN
8641                         BPF_STX_MEM(BPF_H, R10, R2, -2),
8642 #else
8643                         BPF_STX_MEM(BPF_H, R10, R2, -8),
8644 #endif
8645                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8646                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8647                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8648                         BPF_EXIT_INSN(),
8649                 },
8650                 INTERNAL,
8651                 { },
8652                 { { 0, 0 } },
8653                 .stack_depth = 8,
8654         },
8655         {
8656                 "BPF_STX_MEM | BPF_H, MSB set",
8657                 .u.insns_int = {
8658                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8659                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8660                         BPF_LD_IMM64(R3, 0x8090a0b0c0d08788ULL),
8661                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8662 #ifdef __BIG_ENDIAN
8663                         BPF_STX_MEM(BPF_H, R10, R2, -2),
8664 #else
8665                         BPF_STX_MEM(BPF_H, R10, R2, -8),
8666 #endif
8667                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8668                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8669                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8670                         BPF_EXIT_INSN(),
8671                 },
8672                 INTERNAL,
8673                 { },
8674                 { { 0, 0 } },
8675                 .stack_depth = 8,
8676         },
8677         {
8678                 "BPF_STX_MEM | BPF_W",
8679                 .u.insns_int = {
8680                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8681                         BPF_LD_IMM64(R2, 0x0102030405060708ULL),
8682                         BPF_LD_IMM64(R3, 0x8090a0b005060708ULL),
8683                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8684 #ifdef __BIG_ENDIAN
8685                         BPF_STX_MEM(BPF_W, R10, R2, -4),
8686 #else
8687                         BPF_STX_MEM(BPF_W, R10, R2, -8),
8688 #endif
8689                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8690                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8691                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8692                         BPF_EXIT_INSN(),
8693                 },
8694                 INTERNAL,
8695                 { },
8696                 { { 0, 0 } },
8697                 .stack_depth = 8,
8698         },
8699         {
8700                 "BPF_STX_MEM | BPF_W, MSB set",
8701                 .u.insns_int = {
8702                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8703                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8704                         BPF_LD_IMM64(R3, 0x8090a0b085868788ULL),
8705                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8706 #ifdef __BIG_ENDIAN
8707                         BPF_STX_MEM(BPF_W, R10, R2, -4),
8708 #else
8709                         BPF_STX_MEM(BPF_W, R10, R2, -8),
8710 #endif
8711                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8712                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8713                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8714                         BPF_EXIT_INSN(),
8715                 },
8716                 INTERNAL,
8717                 { },
8718                 { { 0, 0 } },
8719                 .stack_depth = 8,
8720         },
8721         /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
8722         {
8723                 "ST_MEM_B: Store/Load byte: max negative",
8724                 .u.insns_int = {
8725                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8726                         BPF_ST_MEM(BPF_B, R10, -40, 0xff),
8727                         BPF_LDX_MEM(BPF_B, R0, R10, -40),
8728                         BPF_EXIT_INSN(),
8729                 },
8730                 INTERNAL,
8731                 { },
8732                 { { 0, 0xff } },
8733                 .stack_depth = 40,
8734         },
8735         {
8736                 "ST_MEM_B: Store/Load byte: max positive",
8737                 .u.insns_int = {
8738                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8739                         BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
8740                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8741                         BPF_EXIT_INSN(),
8742                 },
8743                 INTERNAL,
8744                 { },
8745                 { { 0, 0x7f } },
8746                 .stack_depth = 40,
8747         },
8748         {
8749                 "STX_MEM_B: Store/Load byte: max negative",
8750                 .u.insns_int = {
8751                         BPF_LD_IMM64(R0, 0),
8752                         BPF_LD_IMM64(R1, 0xffLL),
8753                         BPF_STX_MEM(BPF_B, R10, R1, -40),
8754                         BPF_LDX_MEM(BPF_B, R0, R10, -40),
8755                         BPF_EXIT_INSN(),
8756                 },
8757                 INTERNAL,
8758                 { },
8759                 { { 0, 0xff } },
8760                 .stack_depth = 40,
8761         },
8762         {
8763                 "ST_MEM_H: Store/Load half word: max negative",
8764                 .u.insns_int = {
8765                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8766                         BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
8767                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8768                         BPF_EXIT_INSN(),
8769                 },
8770                 INTERNAL,
8771                 { },
8772                 { { 0, 0xffff } },
8773                 .stack_depth = 40,
8774         },
8775         {
8776                 "ST_MEM_H: Store/Load half word: max positive",
8777                 .u.insns_int = {
8778                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8779                         BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
8780                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8781                         BPF_EXIT_INSN(),
8782                 },
8783                 INTERNAL,
8784                 { },
8785                 { { 0, 0x7fff } },
8786                 .stack_depth = 40,
8787         },
8788         {
8789                 "STX_MEM_H: Store/Load half word: max negative",
8790                 .u.insns_int = {
8791                         BPF_LD_IMM64(R0, 0),
8792                         BPF_LD_IMM64(R1, 0xffffLL),
8793                         BPF_STX_MEM(BPF_H, R10, R1, -40),
8794                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8795                         BPF_EXIT_INSN(),
8796                 },
8797                 INTERNAL,
8798                 { },
8799                 { { 0, 0xffff } },
8800                 .stack_depth = 40,
8801         },
8802         {
8803                 "ST_MEM_W: Store/Load word: max negative",
8804                 .u.insns_int = {
8805                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8806                         BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
8807                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8808                         BPF_EXIT_INSN(),
8809                 },
8810                 INTERNAL,
8811                 { },
8812                 { { 0, 0xffffffff } },
8813                 .stack_depth = 40,
8814         },
8815         {
8816                 "ST_MEM_W: Store/Load word: max positive",
8817                 .u.insns_int = {
8818                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8819                         BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
8820                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8821                         BPF_EXIT_INSN(),
8822                 },
8823                 INTERNAL,
8824                 { },
8825                 { { 0, 0x7fffffff } },
8826                 .stack_depth = 40,
8827         },
8828         {
8829                 "STX_MEM_W: Store/Load word: max negative",
8830                 .u.insns_int = {
8831                         BPF_LD_IMM64(R0, 0),
8832                         BPF_LD_IMM64(R1, 0xffffffffLL),
8833                         BPF_STX_MEM(BPF_W, R10, R1, -40),
8834                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8835                         BPF_EXIT_INSN(),
8836                 },
8837                 INTERNAL,
8838                 { },
8839                 { { 0, 0xffffffff } },
8840                 .stack_depth = 40,
8841         },
8842         {
8843                 "ST_MEM_DW: Store/Load double word: max negative",
8844                 .u.insns_int = {
8845                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8846                         BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
8847                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8848                         BPF_EXIT_INSN(),
8849                 },
8850                 INTERNAL,
8851                 { },
8852                 { { 0, 0xffffffff } },
8853                 .stack_depth = 40,
8854         },
8855         {
8856                 "ST_MEM_DW: Store/Load double word: max negative 2",
8857                 .u.insns_int = {
8858                         BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
8859                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
8860                         BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
8861                         BPF_LDX_MEM(BPF_DW, R2, R10, -40),
8862                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
8863                         BPF_MOV32_IMM(R0, 2),
8864                         BPF_EXIT_INSN(),
8865                         BPF_MOV32_IMM(R0, 1),
8866                         BPF_EXIT_INSN(),
8867                 },
8868                 INTERNAL,
8869                 { },
8870                 { { 0, 0x1 } },
8871                 .stack_depth = 40,
8872         },
8873         {
8874                 "ST_MEM_DW: Store/Load double word: max positive",
8875                 .u.insns_int = {
8876                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8877                         BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
8878                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8879                         BPF_EXIT_INSN(),
8880                 },
8881                 INTERNAL,
8882                 { },
8883                 { { 0, 0x7fffffff } },
8884                 .stack_depth = 40,
8885         },
8886         {
8887                 "STX_MEM_DW: Store/Load double word: max negative",
8888                 .u.insns_int = {
8889                         BPF_LD_IMM64(R0, 0),
8890                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8891                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8892                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8893                         BPF_EXIT_INSN(),
8894                 },
8895                 INTERNAL,
8896                 { },
8897                 { { 0, 0xffffffff } },
8898                 .stack_depth = 40,
8899         },
8900         {
8901                 "STX_MEM_DW: Store double word: first word in memory",
8902                 .u.insns_int = {
8903                         BPF_LD_IMM64(R0, 0),
8904                         BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
8905                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8906                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8907                         BPF_EXIT_INSN(),
8908                 },
8909                 INTERNAL,
8910                 { },
8911 #ifdef __BIG_ENDIAN
8912                 { { 0, 0x01234567 } },
8913 #else
8914                 { { 0, 0x89abcdef } },
8915 #endif
8916                 .stack_depth = 40,
8917         },
8918         {
8919                 "STX_MEM_DW: Store double word: second word in memory",
8920                 .u.insns_int = {
8921                         BPF_LD_IMM64(R0, 0),
8922                         BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
8923                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8924                         BPF_LDX_MEM(BPF_W, R0, R10, -36),
8925                         BPF_EXIT_INSN(),
8926                 },
8927                 INTERNAL,
8928                 { },
8929 #ifdef __BIG_ENDIAN
8930                 { { 0, 0x89abcdef } },
8931 #else
8932                 { { 0, 0x01234567 } },
8933 #endif
8934                 .stack_depth = 40,
8935         },
8936         /* BPF_STX | BPF_ATOMIC | BPF_W/DW */
8937         {
8938                 "STX_XADD_W: X + 1 + 1 + 1 + ...",
8939                 { },
8940                 INTERNAL,
8941                 { },
8942                 { { 0, 4134 } },
8943                 .fill_helper = bpf_fill_stxw,
8944         },
8945         {
8946                 "STX_XADD_DW: X + 1 + 1 + 1 + ...",
8947                 { },
8948                 INTERNAL,
8949                 { },
8950                 { { 0, 4134 } },
8951                 .fill_helper = bpf_fill_stxdw,
8952         },
8953         /*
8954          * Exhaustive tests of atomic operation variants.
8955          * Individual tests are expanded from template macros for all
8956          * combinations of ALU operation, word size and fetching.
8957          */
8958 #define BPF_ATOMIC_POISON(width) ((width) == BPF_W ? (0xbaadf00dULL << 32) : 0)
8959
8960 #define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result)      \
8961 {                                                                       \
8962         "BPF_ATOMIC | " #width ", " #op ": Test: "                      \
8963                 #old " " #logic " " #update " = " #result,              \
8964         .u.insns_int = {                                                \
8965                 BPF_LD_IMM64(R5, (update) | BPF_ATOMIC_POISON(width)),  \
8966                 BPF_ST_MEM(width, R10, -40, old),                       \
8967                 BPF_ATOMIC_OP(width, op, R10, R5, -40),                 \
8968                 BPF_LDX_MEM(width, R0, R10, -40),                       \
8969                 BPF_ALU64_REG(BPF_MOV, R1, R0),                         \
8970                 BPF_ALU64_IMM(BPF_RSH, R1, 32),                         \
8971                 BPF_ALU64_REG(BPF_OR, R0, R1),                          \
8972                 BPF_EXIT_INSN(),                                        \
8973         },                                                              \
8974         INTERNAL,                                                       \
8975         { },                                                            \
8976         { { 0, result } },                                              \
8977         .stack_depth = 40,                                              \
8978 }
8979 #define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result)      \
8980 {                                                                       \
8981         "BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: "    \
8982                 #old " " #logic " " #update " = " #result,              \
8983         .u.insns_int = {                                                \
8984                 BPF_ALU64_REG(BPF_MOV, R1, R10),                        \
8985                 BPF_LD_IMM64(R0, (update) | BPF_ATOMIC_POISON(width)),  \
8986                 BPF_ST_MEM(BPF_W, R10, -40, old),                       \
8987                 BPF_ATOMIC_OP(width, op, R10, R0, -40),                 \
8988                 BPF_ALU64_REG(BPF_MOV, R0, R10),                        \
8989                 BPF_ALU64_REG(BPF_SUB, R0, R1),                         \
8990                 BPF_ALU64_REG(BPF_MOV, R1, R0),                         \
8991                 BPF_ALU64_IMM(BPF_RSH, R1, 32),                         \
8992                 BPF_ALU64_REG(BPF_OR, R0, R1),                          \
8993                 BPF_EXIT_INSN(),                                        \
8994         },                                                              \
8995         INTERNAL,                                                       \
8996         { },                                                            \
8997         { { 0, 0 } },                                                   \
8998         .stack_depth = 40,                                              \
8999 }
9000 #define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result)      \
9001 {                                                                       \
9002         "BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: "     \
9003                 #old " " #logic " " #update " = " #result,              \
9004         .u.insns_int = {                                                \
9005                 BPF_ALU64_REG(BPF_MOV, R0, R10),                        \
9006                 BPF_LD_IMM64(R1, (update) | BPF_ATOMIC_POISON(width)),  \
9007                 BPF_ST_MEM(width, R10, -40, old),                       \
9008                 BPF_ATOMIC_OP(width, op, R10, R1, -40),                 \
9009                 BPF_ALU64_REG(BPF_SUB, R0, R10),                        \
9010                 BPF_ALU64_REG(BPF_MOV, R1, R0),                         \
9011                 BPF_ALU64_IMM(BPF_RSH, R1, 32),                         \
9012                 BPF_ALU64_REG(BPF_OR, R0, R1),                          \
9013                 BPF_EXIT_INSN(),                                        \
9014         },                                                              \
9015         INTERNAL,                                                       \
9016         { },                                                            \
9017         { { 0, 0 } },                                                   \
9018         .stack_depth = 40,                                              \
9019 }
9020 #define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result)      \
9021 {                                                                       \
9022         "BPF_ATOMIC | " #width ", " #op ": Test fetch: "                \
9023                 #old " " #logic " " #update " = " #result,              \
9024         .u.insns_int = {                                                \
9025                 BPF_LD_IMM64(R3, (update) | BPF_ATOMIC_POISON(width)),  \
9026                 BPF_ST_MEM(width, R10, -40, old),                       \
9027                 BPF_ATOMIC_OP(width, op, R10, R3, -40),                 \
9028                 BPF_ALU32_REG(BPF_MOV, R0, R3),                         \
9029                 BPF_EXIT_INSN(),                                        \
9030         },                                                              \
9031         INTERNAL,                                                       \
9032         { },                                                            \
9033         { { 0, (op) & BPF_FETCH ? old : update } },                     \
9034         .stack_depth = 40,                                              \
9035 }
9036         /* BPF_ATOMIC | BPF_W: BPF_ADD */
9037         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
9038         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
9039         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
9040         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
9041         /* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
9042         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9043         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9044         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9045         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9046         /* BPF_ATOMIC | BPF_DW: BPF_ADD */
9047         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
9048         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
9049         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
9050         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
9051         /* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
9052         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9053         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9054         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9055         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
9056         /* BPF_ATOMIC | BPF_W: BPF_AND */
9057         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
9058         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
9059         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
9060         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
9061         /* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
9062         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9063         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9064         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9065         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9066         /* BPF_ATOMIC | BPF_DW: BPF_AND */
9067         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
9068         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
9069         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
9070         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
9071         /* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
9072         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9073         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9074         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9075         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
9076         /* BPF_ATOMIC | BPF_W: BPF_OR */
9077         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
9078         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
9079         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
9080         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
9081         /* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
9082         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9083         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9084         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9085         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9086         /* BPF_ATOMIC | BPF_DW: BPF_OR */
9087         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
9088         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
9089         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
9090         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
9091         /* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
9092         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9093         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9094         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9095         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
9096         /* BPF_ATOMIC | BPF_W: BPF_XOR */
9097         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9098         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9099         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9100         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9101         /* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
9102         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9103         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9104         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9105         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9106         /* BPF_ATOMIC | BPF_DW: BPF_XOR */
9107         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9108         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9109         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9110         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
9111         /* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
9112         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9113         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9114         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9115         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
9116         /* BPF_ATOMIC | BPF_W: BPF_XCHG */
9117         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9118         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9119         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9120         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9121         /* BPF_ATOMIC | BPF_DW: BPF_XCHG */
9122         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9123         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9124         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9125         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
9126 #undef BPF_ATOMIC_POISON
9127 #undef BPF_ATOMIC_OP_TEST1
9128 #undef BPF_ATOMIC_OP_TEST2
9129 #undef BPF_ATOMIC_OP_TEST3
9130 #undef BPF_ATOMIC_OP_TEST4
9131         /* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */
9132         {
9133                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return",
9134                 .u.insns_int = {
9135                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
9136                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
9137                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
9138                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
9139                         BPF_EXIT_INSN(),
9140                 },
9141                 INTERNAL,
9142                 { },
9143                 { { 0, 0x01234567 } },
9144                 .stack_depth = 40,
9145         },
9146         {
9147                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store",
9148                 .u.insns_int = {
9149                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
9150                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
9151                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
9152                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
9153                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
9154                         BPF_EXIT_INSN(),
9155                 },
9156                 INTERNAL,
9157                 { },
9158                 { { 0, 0x89abcdef } },
9159                 .stack_depth = 40,
9160         },
9161         {
9162                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return",
9163                 .u.insns_int = {
9164                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
9165                         BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
9166                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
9167                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
9168                         BPF_EXIT_INSN(),
9169                 },
9170                 INTERNAL,
9171                 { },
9172                 { { 0, 0x01234567 } },
9173                 .stack_depth = 40,
9174         },
9175         {
9176                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store",
9177                 .u.insns_int = {
9178                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
9179                         BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
9180                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
9181                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
9182                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
9183                         BPF_EXIT_INSN(),
9184                 },
9185                 INTERNAL,
9186                 { },
9187                 { { 0, 0x01234567 } },
9188                 .stack_depth = 40,
9189         },
9190         {
9191                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects",
9192                 .u.insns_int = {
9193                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
9194                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
9195                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
9196                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
9197                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
9198                         BPF_ALU32_REG(BPF_MOV, R0, R3),
9199                         BPF_EXIT_INSN(),
9200                 },
9201                 INTERNAL,
9202                 { },
9203                 { { 0, 0x89abcdef } },
9204                 .stack_depth = 40,
9205         },
9206         /* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */
9207         {
9208                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return",
9209                 .u.insns_int = {
9210                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
9211                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
9212                         BPF_ALU64_REG(BPF_MOV, R0, R1),
9213                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
9214                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
9215                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
9216                         BPF_ALU64_REG(BPF_SUB, R0, R1),
9217                         BPF_EXIT_INSN(),
9218                 },
9219                 INTERNAL,
9220                 { },
9221                 { { 0, 0 } },
9222                 .stack_depth = 40,
9223         },
9224         {
9225                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store",
9226                 .u.insns_int = {
9227                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
9228                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
9229                         BPF_ALU64_REG(BPF_MOV, R0, R1),
9230                         BPF_STX_MEM(BPF_DW, R10, R0, -40),
9231                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
9232                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
9233                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
9234                         BPF_ALU64_REG(BPF_SUB, R0, R2),
9235                         BPF_EXIT_INSN(),
9236                 },
9237                 INTERNAL,
9238                 { },
9239                 { { 0, 0 } },
9240                 .stack_depth = 40,
9241         },
9242         {
9243                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return",
9244                 .u.insns_int = {
9245                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
9246                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
9247                         BPF_ALU64_REG(BPF_MOV, R0, R1),
9248                         BPF_ALU64_IMM(BPF_ADD, R0, 1),
9249                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
9250                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
9251                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
9252                         BPF_ALU64_REG(BPF_SUB, R0, R1),
9253                         BPF_EXIT_INSN(),
9254                 },
9255                 INTERNAL,
9256                 { },
9257                 { { 0, 0 } },
9258                 .stack_depth = 40,
9259         },
9260         {
9261                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store",
9262                 .u.insns_int = {
9263                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
9264                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
9265                         BPF_ALU64_REG(BPF_MOV, R0, R1),
9266                         BPF_ALU64_IMM(BPF_ADD, R0, 1),
9267                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
9268                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
9269                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
9270                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
9271                         BPF_ALU64_REG(BPF_SUB, R0, R1),
9272                         BPF_EXIT_INSN(),
9273                 },
9274                 INTERNAL,
9275                 { },
9276                 { { 0, 0 } },
9277                 .stack_depth = 40,
9278         },
9279         {
9280                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects",
9281                 .u.insns_int = {
9282                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
9283                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
9284                         BPF_ALU64_REG(BPF_MOV, R0, R1),
9285                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
9286                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
9287                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
9288                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
9289                         BPF_ALU64_REG(BPF_SUB, R0, R2),
9290                         BPF_EXIT_INSN(),
9291                 },
9292                 INTERNAL,
9293                 { },
9294                 { { 0, 0 } },
9295                 .stack_depth = 40,
9296         },
9297         /* BPF_JMP32 | BPF_JEQ | BPF_K */
9298         {
9299                 "JMP32_JEQ_K: Small immediate",
9300                 .u.insns_int = {
9301                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
9302                         BPF_JMP32_IMM(BPF_JEQ, R0, 321, 1),
9303                         BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1),
9304                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9305                         BPF_EXIT_INSN(),
9306                 },
9307                 INTERNAL,
9308                 { },
9309                 { { 0, 123 } }
9310         },
9311         {
9312                 "JMP32_JEQ_K: Large immediate",
9313                 .u.insns_int = {
9314                         BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
9315                         BPF_JMP32_IMM(BPF_JEQ, R0, 12345678 & 0xffff, 1),
9316                         BPF_JMP32_IMM(BPF_JEQ, R0, 12345678, 1),
9317                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9318                         BPF_EXIT_INSN(),
9319                 },
9320                 INTERNAL,
9321                 { },
9322                 { { 0, 12345678 } }
9323         },
9324         {
9325                 "JMP32_JEQ_K: negative immediate",
9326                 .u.insns_int = {
9327                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9328                         BPF_JMP32_IMM(BPF_JEQ, R0,  123, 1),
9329                         BPF_JMP32_IMM(BPF_JEQ, R0, -123, 1),
9330                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9331                         BPF_EXIT_INSN(),
9332                 },
9333                 INTERNAL,
9334                 { },
9335                 { { 0, -123 } }
9336         },
9337         /* BPF_JMP32 | BPF_JEQ | BPF_X */
9338         {
9339                 "JMP32_JEQ_X",
9340                 .u.insns_int = {
9341                         BPF_ALU32_IMM(BPF_MOV, R0, 1234),
9342                         BPF_ALU32_IMM(BPF_MOV, R1, 4321),
9343                         BPF_JMP32_REG(BPF_JEQ, R0, R1, 2),
9344                         BPF_ALU32_IMM(BPF_MOV, R1, 1234),
9345                         BPF_JMP32_REG(BPF_JEQ, R0, R1, 1),
9346                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9347                         BPF_EXIT_INSN(),
9348                 },
9349                 INTERNAL,
9350                 { },
9351                 { { 0, 1234 } }
9352         },
9353         /* BPF_JMP32 | BPF_JNE | BPF_K */
9354         {
9355                 "JMP32_JNE_K: Small immediate",
9356                 .u.insns_int = {
9357                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
9358                         BPF_JMP32_IMM(BPF_JNE, R0, 123, 1),
9359                         BPF_JMP32_IMM(BPF_JNE, R0, 321, 1),
9360                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9361                         BPF_EXIT_INSN(),
9362                 },
9363                 INTERNAL,
9364                 { },
9365                 { { 0, 123 } }
9366         },
9367         {
9368                 "JMP32_JNE_K: Large immediate",
9369                 .u.insns_int = {
9370                         BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
9371                         BPF_JMP32_IMM(BPF_JNE, R0, 12345678, 1),
9372                         BPF_JMP32_IMM(BPF_JNE, R0, 12345678 & 0xffff, 1),
9373                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9374                         BPF_EXIT_INSN(),
9375                 },
9376                 INTERNAL,
9377                 { },
9378                 { { 0, 12345678 } }
9379         },
9380         {
9381                 "JMP32_JNE_K: negative immediate",
9382                 .u.insns_int = {
9383                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9384                         BPF_JMP32_IMM(BPF_JNE, R0, -123, 1),
9385                         BPF_JMP32_IMM(BPF_JNE, R0,  123, 1),
9386                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9387                         BPF_EXIT_INSN(),
9388                 },
9389                 INTERNAL,
9390                 { },
9391                 { { 0, -123 } }
9392         },
9393         /* BPF_JMP32 | BPF_JNE | BPF_X */
9394         {
9395                 "JMP32_JNE_X",
9396                 .u.insns_int = {
9397                         BPF_ALU32_IMM(BPF_MOV, R0, 1234),
9398                         BPF_ALU32_IMM(BPF_MOV, R1, 1234),
9399                         BPF_JMP32_REG(BPF_JNE, R0, R1, 2),
9400                         BPF_ALU32_IMM(BPF_MOV, R1, 4321),
9401                         BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
9402                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9403                         BPF_EXIT_INSN(),
9404                 },
9405                 INTERNAL,
9406                 { },
9407                 { { 0, 1234 } }
9408         },
9409         /* BPF_JMP32 | BPF_JSET | BPF_K */
9410         {
9411                 "JMP32_JSET_K: Small immediate",
9412                 .u.insns_int = {
9413                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9414                         BPF_JMP32_IMM(BPF_JSET, R0, 2, 1),
9415                         BPF_JMP32_IMM(BPF_JSET, R0, 3, 1),
9416                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9417                         BPF_EXIT_INSN(),
9418                 },
9419                 INTERNAL,
9420                 { },
9421                 { { 0, 1 } }
9422         },
9423         {
9424                 "JMP32_JSET_K: Large immediate",
9425                 .u.insns_int = {
9426                         BPF_ALU32_IMM(BPF_MOV, R0, 0x40000000),
9427                         BPF_JMP32_IMM(BPF_JSET, R0, 0x3fffffff, 1),
9428                         BPF_JMP32_IMM(BPF_JSET, R0, 0x60000000, 1),
9429                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9430                         BPF_EXIT_INSN(),
9431                 },
9432                 INTERNAL,
9433                 { },
9434                 { { 0, 0x40000000 } }
9435         },
9436         {
9437                 "JMP32_JSET_K: negative immediate",
9438                 .u.insns_int = {
9439                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9440                         BPF_JMP32_IMM(BPF_JSET, R0, -1, 1),
9441                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9442                         BPF_EXIT_INSN(),
9443                 },
9444                 INTERNAL,
9445                 { },
9446                 { { 0, -123 } }
9447         },
9448         /* BPF_JMP32 | BPF_JSET | BPF_X */
9449         {
9450                 "JMP32_JSET_X",
9451                 .u.insns_int = {
9452                         BPF_ALU32_IMM(BPF_MOV, R0, 8),
9453                         BPF_ALU32_IMM(BPF_MOV, R1, 7),
9454                         BPF_JMP32_REG(BPF_JSET, R0, R1, 2),
9455                         BPF_ALU32_IMM(BPF_MOV, R1, 8 | 2),
9456                         BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
9457                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9458                         BPF_EXIT_INSN(),
9459                 },
9460                 INTERNAL,
9461                 { },
9462                 { { 0, 8 } }
9463         },
9464         /* BPF_JMP32 | BPF_JGT | BPF_K */
9465         {
9466                 "JMP32_JGT_K: Small immediate",
9467                 .u.insns_int = {
9468                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
9469                         BPF_JMP32_IMM(BPF_JGT, R0, 123, 1),
9470                         BPF_JMP32_IMM(BPF_JGT, R0, 122, 1),
9471                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9472                         BPF_EXIT_INSN(),
9473                 },
9474                 INTERNAL,
9475                 { },
9476                 { { 0, 123 } }
9477         },
9478         {
9479                 "JMP32_JGT_K: Large immediate",
9480                 .u.insns_int = {
9481                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9482                         BPF_JMP32_IMM(BPF_JGT, R0, 0xffffffff, 1),
9483                         BPF_JMP32_IMM(BPF_JGT, R0, 0xfffffffd, 1),
9484                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9485                         BPF_EXIT_INSN(),
9486                 },
9487                 INTERNAL,
9488                 { },
9489                 { { 0, 0xfffffffe } }
9490         },
9491         /* BPF_JMP32 | BPF_JGT | BPF_X */
9492         {
9493                 "JMP32_JGT_X",
9494                 .u.insns_int = {
9495                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9496                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
9497                         BPF_JMP32_REG(BPF_JGT, R0, R1, 2),
9498                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
9499                         BPF_JMP32_REG(BPF_JGT, R0, R1, 1),
9500                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9501                         BPF_EXIT_INSN(),
9502                 },
9503                 INTERNAL,
9504                 { },
9505                 { { 0, 0xfffffffe } }
9506         },
9507         /* BPF_JMP32 | BPF_JGE | BPF_K */
9508         {
9509                 "JMP32_JGE_K: Small immediate",
9510                 .u.insns_int = {
9511                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
9512                         BPF_JMP32_IMM(BPF_JGE, R0, 124, 1),
9513                         BPF_JMP32_IMM(BPF_JGE, R0, 123, 1),
9514                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9515                         BPF_EXIT_INSN(),
9516                 },
9517                 INTERNAL,
9518                 { },
9519                 { { 0, 123 } }
9520         },
9521         {
9522                 "JMP32_JGE_K: Large immediate",
9523                 .u.insns_int = {
9524                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9525                         BPF_JMP32_IMM(BPF_JGE, R0, 0xffffffff, 1),
9526                         BPF_JMP32_IMM(BPF_JGE, R0, 0xfffffffe, 1),
9527                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9528                         BPF_EXIT_INSN(),
9529                 },
9530                 INTERNAL,
9531                 { },
9532                 { { 0, 0xfffffffe } }
9533         },
9534         /* BPF_JMP32 | BPF_JGE | BPF_X */
9535         {
9536                 "JMP32_JGE_X",
9537                 .u.insns_int = {
9538                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9539                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
9540                         BPF_JMP32_REG(BPF_JGE, R0, R1, 2),
9541                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
9542                         BPF_JMP32_REG(BPF_JGE, R0, R1, 1),
9543                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9544                         BPF_EXIT_INSN(),
9545                 },
9546                 INTERNAL,
9547                 { },
9548                 { { 0, 0xfffffffe } }
9549         },
9550         /* BPF_JMP32 | BPF_JLT | BPF_K */
9551         {
9552                 "JMP32_JLT_K: Small immediate",
9553                 .u.insns_int = {
9554                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
9555                         BPF_JMP32_IMM(BPF_JLT, R0, 123, 1),
9556                         BPF_JMP32_IMM(BPF_JLT, R0, 124, 1),
9557                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9558                         BPF_EXIT_INSN(),
9559                 },
9560                 INTERNAL,
9561                 { },
9562                 { { 0, 123 } }
9563         },
9564         {
9565                 "JMP32_JLT_K: Large immediate",
9566                 .u.insns_int = {
9567                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9568                         BPF_JMP32_IMM(BPF_JLT, R0, 0xfffffffd, 1),
9569                         BPF_JMP32_IMM(BPF_JLT, R0, 0xffffffff, 1),
9570                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9571                         BPF_EXIT_INSN(),
9572                 },
9573                 INTERNAL,
9574                 { },
9575                 { { 0, 0xfffffffe } }
9576         },
9577         /* BPF_JMP32 | BPF_JLT | BPF_X */
9578         {
9579                 "JMP32_JLT_X",
9580                 .u.insns_int = {
9581                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9582                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
9583                         BPF_JMP32_REG(BPF_JLT, R0, R1, 2),
9584                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
9585                         BPF_JMP32_REG(BPF_JLT, R0, R1, 1),
9586                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9587                         BPF_EXIT_INSN(),
9588                 },
9589                 INTERNAL,
9590                 { },
9591                 { { 0, 0xfffffffe } }
9592         },
9593         /* BPF_JMP32 | BPF_JLE | BPF_K */
9594         {
9595                 "JMP32_JLE_K: Small immediate",
9596                 .u.insns_int = {
9597                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
9598                         BPF_JMP32_IMM(BPF_JLE, R0, 122, 1),
9599                         BPF_JMP32_IMM(BPF_JLE, R0, 123, 1),
9600                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9601                         BPF_EXIT_INSN(),
9602                 },
9603                 INTERNAL,
9604                 { },
9605                 { { 0, 123 } }
9606         },
9607         {
9608                 "JMP32_JLE_K: Large immediate",
9609                 .u.insns_int = {
9610                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9611                         BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffd, 1),
9612                         BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffe, 1),
9613                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9614                         BPF_EXIT_INSN(),
9615                 },
9616                 INTERNAL,
9617                 { },
9618                 { { 0, 0xfffffffe } }
9619         },
9620         /* BPF_JMP32 | BPF_JLE | BPF_X */
9621         {
9622                 "JMP32_JLE_X",
9623                 .u.insns_int = {
9624                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
9625                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
9626                         BPF_JMP32_REG(BPF_JLE, R0, R1, 2),
9627                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
9628                         BPF_JMP32_REG(BPF_JLE, R0, R1, 1),
9629                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9630                         BPF_EXIT_INSN(),
9631                 },
9632                 INTERNAL,
9633                 { },
9634                 { { 0, 0xfffffffe } }
9635         },
9636         /* BPF_JMP32 | BPF_JSGT | BPF_K */
9637         {
9638                 "JMP32_JSGT_K: Small immediate",
9639                 .u.insns_int = {
9640                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9641                         BPF_JMP32_IMM(BPF_JSGT, R0, -123, 1),
9642                         BPF_JMP32_IMM(BPF_JSGT, R0, -124, 1),
9643                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9644                         BPF_EXIT_INSN(),
9645                 },
9646                 INTERNAL,
9647                 { },
9648                 { { 0, -123 } }
9649         },
9650         {
9651                 "JMP32_JSGT_K: Large immediate",
9652                 .u.insns_int = {
9653                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9654                         BPF_JMP32_IMM(BPF_JSGT, R0, -12345678, 1),
9655                         BPF_JMP32_IMM(BPF_JSGT, R0, -12345679, 1),
9656                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9657                         BPF_EXIT_INSN(),
9658                 },
9659                 INTERNAL,
9660                 { },
9661                 { { 0, -12345678 } }
9662         },
9663         /* BPF_JMP32 | BPF_JSGT | BPF_X */
9664         {
9665                 "JMP32_JSGT_X",
9666                 .u.insns_int = {
9667                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9668                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9669                         BPF_JMP32_REG(BPF_JSGT, R0, R1, 2),
9670                         BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
9671                         BPF_JMP32_REG(BPF_JSGT, R0, R1, 1),
9672                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9673                         BPF_EXIT_INSN(),
9674                 },
9675                 INTERNAL,
9676                 { },
9677                 { { 0, -12345678 } }
9678         },
9679         /* BPF_JMP32 | BPF_JSGE | BPF_K */
9680         {
9681                 "JMP32_JSGE_K: Small immediate",
9682                 .u.insns_int = {
9683                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9684                         BPF_JMP32_IMM(BPF_JSGE, R0, -122, 1),
9685                         BPF_JMP32_IMM(BPF_JSGE, R0, -123, 1),
9686                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9687                         BPF_EXIT_INSN(),
9688                 },
9689                 INTERNAL,
9690                 { },
9691                 { { 0, -123 } }
9692         },
9693         {
9694                 "JMP32_JSGE_K: Large immediate",
9695                 .u.insns_int = {
9696                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9697                         BPF_JMP32_IMM(BPF_JSGE, R0, -12345677, 1),
9698                         BPF_JMP32_IMM(BPF_JSGE, R0, -12345678, 1),
9699                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9700                         BPF_EXIT_INSN(),
9701                 },
9702                 INTERNAL,
9703                 { },
9704                 { { 0, -12345678 } }
9705         },
9706         /* BPF_JMP32 | BPF_JSGE | BPF_X */
9707         {
9708                 "JMP32_JSGE_X",
9709                 .u.insns_int = {
9710                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9711                         BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
9712                         BPF_JMP32_REG(BPF_JSGE, R0, R1, 2),
9713                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9714                         BPF_JMP32_REG(BPF_JSGE, R0, R1, 1),
9715                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9716                         BPF_EXIT_INSN(),
9717                 },
9718                 INTERNAL,
9719                 { },
9720                 { { 0, -12345678 } }
9721         },
9722         /* BPF_JMP32 | BPF_JSLT | BPF_K */
9723         {
9724                 "JMP32_JSLT_K: Small immediate",
9725                 .u.insns_int = {
9726                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9727                         BPF_JMP32_IMM(BPF_JSLT, R0, -123, 1),
9728                         BPF_JMP32_IMM(BPF_JSLT, R0, -122, 1),
9729                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9730                         BPF_EXIT_INSN(),
9731                 },
9732                 INTERNAL,
9733                 { },
9734                 { { 0, -123 } }
9735         },
9736         {
9737                 "JMP32_JSLT_K: Large immediate",
9738                 .u.insns_int = {
9739                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9740                         BPF_JMP32_IMM(BPF_JSLT, R0, -12345678, 1),
9741                         BPF_JMP32_IMM(BPF_JSLT, R0, -12345677, 1),
9742                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9743                         BPF_EXIT_INSN(),
9744                 },
9745                 INTERNAL,
9746                 { },
9747                 { { 0, -12345678 } }
9748         },
9749         /* BPF_JMP32 | BPF_JSLT | BPF_X */
9750         {
9751                 "JMP32_JSLT_X",
9752                 .u.insns_int = {
9753                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9754                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9755                         BPF_JMP32_REG(BPF_JSLT, R0, R1, 2),
9756                         BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
9757                         BPF_JMP32_REG(BPF_JSLT, R0, R1, 1),
9758                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9759                         BPF_EXIT_INSN(),
9760                 },
9761                 INTERNAL,
9762                 { },
9763                 { { 0, -12345678 } }
9764         },
9765         /* BPF_JMP32 | BPF_JSLE | BPF_K */
9766         {
9767                 "JMP32_JSLE_K: Small immediate",
9768                 .u.insns_int = {
9769                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9770                         BPF_JMP32_IMM(BPF_JSLE, R0, -124, 1),
9771                         BPF_JMP32_IMM(BPF_JSLE, R0, -123, 1),
9772                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9773                         BPF_EXIT_INSN(),
9774                 },
9775                 INTERNAL,
9776                 { },
9777                 { { 0, -123 } }
9778         },
9779         {
9780                 "JMP32_JSLE_K: Large immediate",
9781                 .u.insns_int = {
9782                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9783                         BPF_JMP32_IMM(BPF_JSLE, R0, -12345679, 1),
9784                         BPF_JMP32_IMM(BPF_JSLE, R0, -12345678, 1),
9785                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9786                         BPF_EXIT_INSN(),
9787                 },
9788                 INTERNAL,
9789                 { },
9790                 { { 0, -12345678 } }
9791         },
9792         /* BPF_JMP32 | BPF_JSLE | BPF_K */
9793         {
9794                 "JMP32_JSLE_X",
9795                 .u.insns_int = {
9796                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9797                         BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
9798                         BPF_JMP32_REG(BPF_JSLE, R0, R1, 2),
9799                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9800                         BPF_JMP32_REG(BPF_JSLE, R0, R1, 1),
9801                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9802                         BPF_EXIT_INSN(),
9803                 },
9804                 INTERNAL,
9805                 { },
9806                 { { 0, -12345678 } }
9807         },
9808         /* BPF_JMP | BPF_EXIT */
9809         {
9810                 "JMP_EXIT",
9811                 .u.insns_int = {
9812                         BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
9813                         BPF_EXIT_INSN(),
9814                         BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
9815                 },
9816                 INTERNAL,
9817                 { },
9818                 { { 0, 0x4711 } },
9819         },
9820         /* BPF_JMP | BPF_JA */
9821         {
9822                 "JMP_JA: Unconditional jump: if (true) return 1",
9823                 .u.insns_int = {
9824                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9825                         BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9826                         BPF_EXIT_INSN(),
9827                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9828                         BPF_EXIT_INSN(),
9829                 },
9830                 INTERNAL,
9831                 { },
9832                 { { 0, 1 } },
9833         },
9834         /* BPF_JMP32 | BPF_JA */
9835         {
9836                 "JMP32_JA: Unconditional jump: if (true) return 1",
9837                 .u.insns_int = {
9838                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9839                         BPF_JMP32_IMM(BPF_JA, 0, 1, 0),
9840                         BPF_EXIT_INSN(),
9841                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9842                         BPF_EXIT_INSN(),
9843                 },
9844                 INTERNAL,
9845                 { },
9846                 { { 0, 1 } },
9847         },
9848         /* BPF_JMP | BPF_JSLT | BPF_K */
9849         {
9850                 "JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
9851                 .u.insns_int = {
9852                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9853                         BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
9854                         BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
9855                         BPF_EXIT_INSN(),
9856                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9857                         BPF_EXIT_INSN(),
9858                 },
9859                 INTERNAL,
9860                 { },
9861                 { { 0, 1 } },
9862         },
9863         {
9864                 "JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
9865                 .u.insns_int = {
9866                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9867                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9868                         BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
9869                         BPF_EXIT_INSN(),
9870                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9871                         BPF_EXIT_INSN(),
9872                 },
9873                 INTERNAL,
9874                 { },
9875                 { { 0, 1 } },
9876         },
9877         /* BPF_JMP | BPF_JSGT | BPF_K */
9878         {
9879                 "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
9880                 .u.insns_int = {
9881                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9882                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9883                         BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
9884                         BPF_EXIT_INSN(),
9885                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9886                         BPF_EXIT_INSN(),
9887                 },
9888                 INTERNAL,
9889                 { },
9890                 { { 0, 1 } },
9891         },
9892         {
9893                 "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
9894                 .u.insns_int = {
9895                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9896                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9897                         BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
9898                         BPF_EXIT_INSN(),
9899                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9900                         BPF_EXIT_INSN(),
9901                 },
9902                 INTERNAL,
9903                 { },
9904                 { { 0, 1 } },
9905         },
9906         /* BPF_JMP | BPF_JSLE | BPF_K */
9907         {
9908                 "JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
9909                 .u.insns_int = {
9910                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9911                         BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
9912                         BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
9913                         BPF_EXIT_INSN(),
9914                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9915                         BPF_EXIT_INSN(),
9916                 },
9917                 INTERNAL,
9918                 { },
9919                 { { 0, 1 } },
9920         },
9921         {
9922                 "JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
9923                 .u.insns_int = {
9924                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9925                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9926                         BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
9927                         BPF_EXIT_INSN(),
9928                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9929                         BPF_EXIT_INSN(),
9930                 },
9931                 INTERNAL,
9932                 { },
9933                 { { 0, 1 } },
9934         },
9935         {
9936                 "JMP_JSLE_K: Signed jump: value walk 1",
9937                 .u.insns_int = {
9938                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9939                         BPF_LD_IMM64(R1, 3),
9940                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
9941                         BPF_ALU64_IMM(BPF_SUB, R1, 1),
9942                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
9943                         BPF_ALU64_IMM(BPF_SUB, R1, 1),
9944                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
9945                         BPF_ALU64_IMM(BPF_SUB, R1, 1),
9946                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
9947                         BPF_EXIT_INSN(),                /* bad exit */
9948                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
9949                         BPF_EXIT_INSN(),
9950                 },
9951                 INTERNAL,
9952                 { },
9953                 { { 0, 1 } },
9954         },
9955         {
9956                 "JMP_JSLE_K: Signed jump: value walk 2",
9957                 .u.insns_int = {
9958                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9959                         BPF_LD_IMM64(R1, 3),
9960                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
9961                         BPF_ALU64_IMM(BPF_SUB, R1, 2),
9962                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
9963                         BPF_ALU64_IMM(BPF_SUB, R1, 2),
9964                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
9965                         BPF_EXIT_INSN(),                /* bad exit */
9966                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
9967                         BPF_EXIT_INSN(),
9968                 },
9969                 INTERNAL,
9970                 { },
9971                 { { 0, 1 } },
9972         },
9973         /* BPF_JMP | BPF_JSGE | BPF_K */
9974         {
9975                 "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
9976                 .u.insns_int = {
9977                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9978                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9979                         BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
9980                         BPF_EXIT_INSN(),
9981                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9982                         BPF_EXIT_INSN(),
9983                 },
9984                 INTERNAL,
9985                 { },
9986                 { { 0, 1 } },
9987         },
9988         {
9989                 "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
9990                 .u.insns_int = {
9991                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9992                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9993                         BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
9994                         BPF_EXIT_INSN(),
9995                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9996                         BPF_EXIT_INSN(),
9997                 },
9998                 INTERNAL,
9999                 { },
10000                 { { 0, 1 } },
10001         },
10002         {
10003                 "JMP_JSGE_K: Signed jump: value walk 1",
10004                 .u.insns_int = {
10005                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10006                         BPF_LD_IMM64(R1, -3),
10007                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
10008                         BPF_ALU64_IMM(BPF_ADD, R1, 1),
10009                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
10010                         BPF_ALU64_IMM(BPF_ADD, R1, 1),
10011                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
10012                         BPF_ALU64_IMM(BPF_ADD, R1, 1),
10013                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
10014                         BPF_EXIT_INSN(),                /* bad exit */
10015                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
10016                         BPF_EXIT_INSN(),
10017                 },
10018                 INTERNAL,
10019                 { },
10020                 { { 0, 1 } },
10021         },
10022         {
10023                 "JMP_JSGE_K: Signed jump: value walk 2",
10024                 .u.insns_int = {
10025                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10026                         BPF_LD_IMM64(R1, -3),
10027                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
10028                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
10029                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
10030                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
10031                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
10032                         BPF_EXIT_INSN(),                /* bad exit */
10033                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
10034                         BPF_EXIT_INSN(),
10035                 },
10036                 INTERNAL,
10037                 { },
10038                 { { 0, 1 } },
10039         },
10040         /* BPF_JMP | BPF_JGT | BPF_K */
10041         {
10042                 "JMP_JGT_K: if (3 > 2) return 1",
10043                 .u.insns_int = {
10044                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10045                         BPF_LD_IMM64(R1, 3),
10046                         BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
10047                         BPF_EXIT_INSN(),
10048                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10049                         BPF_EXIT_INSN(),
10050                 },
10051                 INTERNAL,
10052                 { },
10053                 { { 0, 1 } },
10054         },
10055         {
10056                 "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
10057                 .u.insns_int = {
10058                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10059                         BPF_LD_IMM64(R1, -1),
10060                         BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
10061                         BPF_EXIT_INSN(),
10062                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10063                         BPF_EXIT_INSN(),
10064                 },
10065                 INTERNAL,
10066                 { },
10067                 { { 0, 1 } },
10068         },
10069         /* BPF_JMP | BPF_JLT | BPF_K */
10070         {
10071                 "JMP_JLT_K: if (2 < 3) return 1",
10072                 .u.insns_int = {
10073                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10074                         BPF_LD_IMM64(R1, 2),
10075                         BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
10076                         BPF_EXIT_INSN(),
10077                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10078                         BPF_EXIT_INSN(),
10079                 },
10080                 INTERNAL,
10081                 { },
10082                 { { 0, 1 } },
10083         },
10084         {
10085                 "JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
10086                 .u.insns_int = {
10087                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10088                         BPF_LD_IMM64(R1, 1),
10089                         BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
10090                         BPF_EXIT_INSN(),
10091                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10092                         BPF_EXIT_INSN(),
10093                 },
10094                 INTERNAL,
10095                 { },
10096                 { { 0, 1 } },
10097         },
10098         /* BPF_JMP | BPF_JGE | BPF_K */
10099         {
10100                 "JMP_JGE_K: if (3 >= 2) return 1",
10101                 .u.insns_int = {
10102                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10103                         BPF_LD_IMM64(R1, 3),
10104                         BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
10105                         BPF_EXIT_INSN(),
10106                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10107                         BPF_EXIT_INSN(),
10108                 },
10109                 INTERNAL,
10110                 { },
10111                 { { 0, 1 } },
10112         },
10113         /* BPF_JMP | BPF_JLE | BPF_K */
10114         {
10115                 "JMP_JLE_K: if (2 <= 3) return 1",
10116                 .u.insns_int = {
10117                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10118                         BPF_LD_IMM64(R1, 2),
10119                         BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
10120                         BPF_EXIT_INSN(),
10121                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10122                         BPF_EXIT_INSN(),
10123                 },
10124                 INTERNAL,
10125                 { },
10126                 { { 0, 1 } },
10127         },
10128         /* BPF_JMP | BPF_JGT | BPF_K jump backwards */
10129         {
10130                 "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
10131                 .u.insns_int = {
10132                         BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
10133                         BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
10134                         BPF_EXIT_INSN(),
10135                         BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
10136                         BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
10137                         BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
10138                         BPF_EXIT_INSN(),
10139                 },
10140                 INTERNAL,
10141                 { },
10142                 { { 0, 1 } },
10143         },
10144         {
10145                 "JMP_JGE_K: if (3 >= 3) return 1",
10146                 .u.insns_int = {
10147                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10148                         BPF_LD_IMM64(R1, 3),
10149                         BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
10150                         BPF_EXIT_INSN(),
10151                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10152                         BPF_EXIT_INSN(),
10153                 },
10154                 INTERNAL,
10155                 { },
10156                 { { 0, 1 } },
10157         },
10158         /* BPF_JMP | BPF_JLT | BPF_K jump backwards */
10159         {
10160                 "JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
10161                 .u.insns_int = {
10162                         BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
10163                         BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
10164                         BPF_EXIT_INSN(),
10165                         BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
10166                         BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
10167                         BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
10168                         BPF_EXIT_INSN(),
10169                 },
10170                 INTERNAL,
10171                 { },
10172                 { { 0, 1 } },
10173         },
10174         {
10175                 "JMP_JLE_K: if (3 <= 3) return 1",
10176                 .u.insns_int = {
10177                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10178                         BPF_LD_IMM64(R1, 3),
10179                         BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
10180                         BPF_EXIT_INSN(),
10181                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10182                         BPF_EXIT_INSN(),
10183                 },
10184                 INTERNAL,
10185                 { },
10186                 { { 0, 1 } },
10187         },
10188         /* BPF_JMP | BPF_JNE | BPF_K */
10189         {
10190                 "JMP_JNE_K: if (3 != 2) return 1",
10191                 .u.insns_int = {
10192                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10193                         BPF_LD_IMM64(R1, 3),
10194                         BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
10195                         BPF_EXIT_INSN(),
10196                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10197                         BPF_EXIT_INSN(),
10198                 },
10199                 INTERNAL,
10200                 { },
10201                 { { 0, 1 } },
10202         },
10203         /* BPF_JMP | BPF_JEQ | BPF_K */
10204         {
10205                 "JMP_JEQ_K: if (3 == 3) return 1",
10206                 .u.insns_int = {
10207                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10208                         BPF_LD_IMM64(R1, 3),
10209                         BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
10210                         BPF_EXIT_INSN(),
10211                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10212                         BPF_EXIT_INSN(),
10213                 },
10214                 INTERNAL,
10215                 { },
10216                 { { 0, 1 } },
10217         },
10218         /* BPF_JMP | BPF_JSET | BPF_K */
10219         {
10220                 "JMP_JSET_K: if (0x3 & 0x2) return 1",
10221                 .u.insns_int = {
10222                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10223                         BPF_LD_IMM64(R1, 3),
10224                         BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
10225                         BPF_EXIT_INSN(),
10226                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10227                         BPF_EXIT_INSN(),
10228                 },
10229                 INTERNAL,
10230                 { },
10231                 { { 0, 1 } },
10232         },
10233         {
10234                 "JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
10235                 .u.insns_int = {
10236                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10237                         BPF_LD_IMM64(R1, 3),
10238                         BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
10239                         BPF_EXIT_INSN(),
10240                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10241                         BPF_EXIT_INSN(),
10242                 },
10243                 INTERNAL,
10244                 { },
10245                 { { 0, 1 } },
10246         },
10247         /* BPF_JMP | BPF_JSGT | BPF_X */
10248         {
10249                 "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
10250                 .u.insns_int = {
10251                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10252                         BPF_LD_IMM64(R1, -1),
10253                         BPF_LD_IMM64(R2, -2),
10254                         BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
10255                         BPF_EXIT_INSN(),
10256                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10257                         BPF_EXIT_INSN(),
10258                 },
10259                 INTERNAL,
10260                 { },
10261                 { { 0, 1 } },
10262         },
10263         {
10264                 "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
10265                 .u.insns_int = {
10266                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10267                         BPF_LD_IMM64(R1, -1),
10268                         BPF_LD_IMM64(R2, -1),
10269                         BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
10270                         BPF_EXIT_INSN(),
10271                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10272                         BPF_EXIT_INSN(),
10273                 },
10274                 INTERNAL,
10275                 { },
10276                 { { 0, 1 } },
10277         },
10278         /* BPF_JMP | BPF_JSLT | BPF_X */
10279         {
10280                 "JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
10281                 .u.insns_int = {
10282                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10283                         BPF_LD_IMM64(R1, -1),
10284                         BPF_LD_IMM64(R2, -2),
10285                         BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
10286                         BPF_EXIT_INSN(),
10287                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10288                         BPF_EXIT_INSN(),
10289                 },
10290                 INTERNAL,
10291                 { },
10292                 { { 0, 1 } },
10293         },
10294         {
10295                 "JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
10296                 .u.insns_int = {
10297                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10298                         BPF_LD_IMM64(R1, -1),
10299                         BPF_LD_IMM64(R2, -1),
10300                         BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
10301                         BPF_EXIT_INSN(),
10302                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10303                         BPF_EXIT_INSN(),
10304                 },
10305                 INTERNAL,
10306                 { },
10307                 { { 0, 1 } },
10308         },
10309         /* BPF_JMP | BPF_JSGE | BPF_X */
10310         {
10311                 "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
10312                 .u.insns_int = {
10313                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10314                         BPF_LD_IMM64(R1, -1),
10315                         BPF_LD_IMM64(R2, -2),
10316                         BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
10317                         BPF_EXIT_INSN(),
10318                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10319                         BPF_EXIT_INSN(),
10320                 },
10321                 INTERNAL,
10322                 { },
10323                 { { 0, 1 } },
10324         },
10325         {
10326                 "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
10327                 .u.insns_int = {
10328                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10329                         BPF_LD_IMM64(R1, -1),
10330                         BPF_LD_IMM64(R2, -1),
10331                         BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
10332                         BPF_EXIT_INSN(),
10333                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10334                         BPF_EXIT_INSN(),
10335                 },
10336                 INTERNAL,
10337                 { },
10338                 { { 0, 1 } },
10339         },
10340         /* BPF_JMP | BPF_JSLE | BPF_X */
10341         {
10342                 "JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
10343                 .u.insns_int = {
10344                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10345                         BPF_LD_IMM64(R1, -1),
10346                         BPF_LD_IMM64(R2, -2),
10347                         BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
10348                         BPF_EXIT_INSN(),
10349                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10350                         BPF_EXIT_INSN(),
10351                 },
10352                 INTERNAL,
10353                 { },
10354                 { { 0, 1 } },
10355         },
10356         {
10357                 "JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
10358                 .u.insns_int = {
10359                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10360                         BPF_LD_IMM64(R1, -1),
10361                         BPF_LD_IMM64(R2, -1),
10362                         BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
10363                         BPF_EXIT_INSN(),
10364                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10365                         BPF_EXIT_INSN(),
10366                 },
10367                 INTERNAL,
10368                 { },
10369                 { { 0, 1 } },
10370         },
10371         /* BPF_JMP | BPF_JGT | BPF_X */
10372         {
10373                 "JMP_JGT_X: if (3 > 2) return 1",
10374                 .u.insns_int = {
10375                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10376                         BPF_LD_IMM64(R1, 3),
10377                         BPF_LD_IMM64(R2, 2),
10378                         BPF_JMP_REG(BPF_JGT, R1, R2, 1),
10379                         BPF_EXIT_INSN(),
10380                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10381                         BPF_EXIT_INSN(),
10382                 },
10383                 INTERNAL,
10384                 { },
10385                 { { 0, 1 } },
10386         },
10387         {
10388                 "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
10389                 .u.insns_int = {
10390                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10391                         BPF_LD_IMM64(R1, -1),
10392                         BPF_LD_IMM64(R2, 1),
10393                         BPF_JMP_REG(BPF_JGT, R1, R2, 1),
10394                         BPF_EXIT_INSN(),
10395                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10396                         BPF_EXIT_INSN(),
10397                 },
10398                 INTERNAL,
10399                 { },
10400                 { { 0, 1 } },
10401         },
10402         /* BPF_JMP | BPF_JLT | BPF_X */
10403         {
10404                 "JMP_JLT_X: if (2 < 3) return 1",
10405                 .u.insns_int = {
10406                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10407                         BPF_LD_IMM64(R1, 3),
10408                         BPF_LD_IMM64(R2, 2),
10409                         BPF_JMP_REG(BPF_JLT, R2, R1, 1),
10410                         BPF_EXIT_INSN(),
10411                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10412                         BPF_EXIT_INSN(),
10413                 },
10414                 INTERNAL,
10415                 { },
10416                 { { 0, 1 } },
10417         },
10418         {
10419                 "JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
10420                 .u.insns_int = {
10421                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10422                         BPF_LD_IMM64(R1, -1),
10423                         BPF_LD_IMM64(R2, 1),
10424                         BPF_JMP_REG(BPF_JLT, R2, R1, 1),
10425                         BPF_EXIT_INSN(),
10426                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10427                         BPF_EXIT_INSN(),
10428                 },
10429                 INTERNAL,
10430                 { },
10431                 { { 0, 1 } },
10432         },
10433         /* BPF_JMP | BPF_JGE | BPF_X */
10434         {
10435                 "JMP_JGE_X: if (3 >= 2) return 1",
10436                 .u.insns_int = {
10437                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10438                         BPF_LD_IMM64(R1, 3),
10439                         BPF_LD_IMM64(R2, 2),
10440                         BPF_JMP_REG(BPF_JGE, R1, R2, 1),
10441                         BPF_EXIT_INSN(),
10442                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10443                         BPF_EXIT_INSN(),
10444                 },
10445                 INTERNAL,
10446                 { },
10447                 { { 0, 1 } },
10448         },
10449         {
10450                 "JMP_JGE_X: if (3 >= 3) return 1",
10451                 .u.insns_int = {
10452                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10453                         BPF_LD_IMM64(R1, 3),
10454                         BPF_LD_IMM64(R2, 3),
10455                         BPF_JMP_REG(BPF_JGE, R1, R2, 1),
10456                         BPF_EXIT_INSN(),
10457                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10458                         BPF_EXIT_INSN(),
10459                 },
10460                 INTERNAL,
10461                 { },
10462                 { { 0, 1 } },
10463         },
10464         /* BPF_JMP | BPF_JLE | BPF_X */
10465         {
10466                 "JMP_JLE_X: if (2 <= 3) return 1",
10467                 .u.insns_int = {
10468                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10469                         BPF_LD_IMM64(R1, 3),
10470                         BPF_LD_IMM64(R2, 2),
10471                         BPF_JMP_REG(BPF_JLE, R2, R1, 1),
10472                         BPF_EXIT_INSN(),
10473                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10474                         BPF_EXIT_INSN(),
10475                 },
10476                 INTERNAL,
10477                 { },
10478                 { { 0, 1 } },
10479         },
10480         {
10481                 "JMP_JLE_X: if (3 <= 3) return 1",
10482                 .u.insns_int = {
10483                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10484                         BPF_LD_IMM64(R1, 3),
10485                         BPF_LD_IMM64(R2, 3),
10486                         BPF_JMP_REG(BPF_JLE, R1, R2, 1),
10487                         BPF_EXIT_INSN(),
10488                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10489                         BPF_EXIT_INSN(),
10490                 },
10491                 INTERNAL,
10492                 { },
10493                 { { 0, 1 } },
10494         },
10495         {
10496                 /* Mainly testing JIT + imm64 here. */
10497                 "JMP_JGE_X: ldimm64 test 1",
10498                 .u.insns_int = {
10499                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10500                         BPF_LD_IMM64(R1, 3),
10501                         BPF_LD_IMM64(R2, 2),
10502                         BPF_JMP_REG(BPF_JGE, R1, R2, 2),
10503                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
10504                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
10505                         BPF_EXIT_INSN(),
10506                 },
10507                 INTERNAL,
10508                 { },
10509                 { { 0, 0xeeeeeeeeU } },
10510         },
10511         {
10512                 "JMP_JGE_X: ldimm64 test 2",
10513                 .u.insns_int = {
10514                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10515                         BPF_LD_IMM64(R1, 3),
10516                         BPF_LD_IMM64(R2, 2),
10517                         BPF_JMP_REG(BPF_JGE, R1, R2, 0),
10518                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
10519                         BPF_EXIT_INSN(),
10520                 },
10521                 INTERNAL,
10522                 { },
10523                 { { 0, 0xffffffffU } },
10524         },
10525         {
10526                 "JMP_JGE_X: ldimm64 test 3",
10527                 .u.insns_int = {
10528                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10529                         BPF_LD_IMM64(R1, 3),
10530                         BPF_LD_IMM64(R2, 2),
10531                         BPF_JMP_REG(BPF_JGE, R1, R2, 4),
10532                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
10533                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
10534                         BPF_EXIT_INSN(),
10535                 },
10536                 INTERNAL,
10537                 { },
10538                 { { 0, 1 } },
10539         },
10540         {
10541                 "JMP_JLE_X: ldimm64 test 1",
10542                 .u.insns_int = {
10543                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10544                         BPF_LD_IMM64(R1, 3),
10545                         BPF_LD_IMM64(R2, 2),
10546                         BPF_JMP_REG(BPF_JLE, R2, R1, 2),
10547                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
10548                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
10549                         BPF_EXIT_INSN(),
10550                 },
10551                 INTERNAL,
10552                 { },
10553                 { { 0, 0xeeeeeeeeU } },
10554         },
10555         {
10556                 "JMP_JLE_X: ldimm64 test 2",
10557                 .u.insns_int = {
10558                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10559                         BPF_LD_IMM64(R1, 3),
10560                         BPF_LD_IMM64(R2, 2),
10561                         BPF_JMP_REG(BPF_JLE, R2, R1, 0),
10562                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
10563                         BPF_EXIT_INSN(),
10564                 },
10565                 INTERNAL,
10566                 { },
10567                 { { 0, 0xffffffffU } },
10568         },
10569         {
10570                 "JMP_JLE_X: ldimm64 test 3",
10571                 .u.insns_int = {
10572                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10573                         BPF_LD_IMM64(R1, 3),
10574                         BPF_LD_IMM64(R2, 2),
10575                         BPF_JMP_REG(BPF_JLE, R2, R1, 4),
10576                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
10577                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
10578                         BPF_EXIT_INSN(),
10579                 },
10580                 INTERNAL,
10581                 { },
10582                 { { 0, 1 } },
10583         },
10584         /* BPF_JMP | BPF_JNE | BPF_X */
10585         {
10586                 "JMP_JNE_X: if (3 != 2) return 1",
10587                 .u.insns_int = {
10588                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10589                         BPF_LD_IMM64(R1, 3),
10590                         BPF_LD_IMM64(R2, 2),
10591                         BPF_JMP_REG(BPF_JNE, R1, R2, 1),
10592                         BPF_EXIT_INSN(),
10593                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10594                         BPF_EXIT_INSN(),
10595                 },
10596                 INTERNAL,
10597                 { },
10598                 { { 0, 1 } },
10599         },
10600         /* BPF_JMP | BPF_JEQ | BPF_X */
10601         {
10602                 "JMP_JEQ_X: if (3 == 3) return 1",
10603                 .u.insns_int = {
10604                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10605                         BPF_LD_IMM64(R1, 3),
10606                         BPF_LD_IMM64(R2, 3),
10607                         BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
10608                         BPF_EXIT_INSN(),
10609                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10610                         BPF_EXIT_INSN(),
10611                 },
10612                 INTERNAL,
10613                 { },
10614                 { { 0, 1 } },
10615         },
10616         /* BPF_JMP | BPF_JSET | BPF_X */
10617         {
10618                 "JMP_JSET_X: if (0x3 & 0x2) return 1",
10619                 .u.insns_int = {
10620                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10621                         BPF_LD_IMM64(R1, 3),
10622                         BPF_LD_IMM64(R2, 2),
10623                         BPF_JMP_REG(BPF_JSET, R1, R2, 1),
10624                         BPF_EXIT_INSN(),
10625                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10626                         BPF_EXIT_INSN(),
10627                 },
10628                 INTERNAL,
10629                 { },
10630                 { { 0, 1 } },
10631         },
10632         {
10633                 "JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
10634                 .u.insns_int = {
10635                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
10636                         BPF_LD_IMM64(R1, 3),
10637                         BPF_LD_IMM64(R2, 0xffffffff),
10638                         BPF_JMP_REG(BPF_JSET, R1, R2, 1),
10639                         BPF_EXIT_INSN(),
10640                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
10641                         BPF_EXIT_INSN(),
10642                 },
10643                 INTERNAL,
10644                 { },
10645                 { { 0, 1 } },
10646         },
10647         {
10648                 "JMP_JA: Jump, gap, jump, ...",
10649                 { },
10650                 CLASSIC | FLAG_NO_DATA,
10651                 { },
10652                 { { 0, 0xababcbac } },
10653                 .fill_helper = bpf_fill_ja,
10654         },
10655         {       /* Mainly checking JIT here. */
10656                 "BPF_MAXINSNS: Maximum possible literals",
10657                 { },
10658                 CLASSIC | FLAG_NO_DATA,
10659                 { },
10660                 { { 0, 0xffffffff } },
10661                 .fill_helper = bpf_fill_maxinsns1,
10662         },
10663         {       /* Mainly checking JIT here. */
10664                 "BPF_MAXINSNS: Single literal",
10665                 { },
10666                 CLASSIC | FLAG_NO_DATA,
10667                 { },
10668                 { { 0, 0xfefefefe } },
10669                 .fill_helper = bpf_fill_maxinsns2,
10670         },
10671         {       /* Mainly checking JIT here. */
10672                 "BPF_MAXINSNS: Run/add until end",
10673                 { },
10674                 CLASSIC | FLAG_NO_DATA,
10675                 { },
10676                 { { 0, 0x947bf368 } },
10677                 .fill_helper = bpf_fill_maxinsns3,
10678         },
10679         {
10680                 "BPF_MAXINSNS: Too many instructions",
10681                 { },
10682                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
10683                 { },
10684                 { },
10685                 .fill_helper = bpf_fill_maxinsns4,
10686                 .expected_errcode = -EINVAL,
10687         },
10688         {       /* Mainly checking JIT here. */
10689                 "BPF_MAXINSNS: Very long jump",
10690                 { },
10691                 CLASSIC | FLAG_NO_DATA,
10692                 { },
10693                 { { 0, 0xabababab } },
10694                 .fill_helper = bpf_fill_maxinsns5,
10695         },
10696         {       /* Mainly checking JIT here. */
10697                 "BPF_MAXINSNS: Ctx heavy transformations",
10698                 { },
10699                 CLASSIC,
10700                 { },
10701                 {
10702                         {  1, SKB_VLAN_PRESENT },
10703                         { 10, SKB_VLAN_PRESENT }
10704                 },
10705                 .fill_helper = bpf_fill_maxinsns6,
10706         },
10707         {       /* Mainly checking JIT here. */
10708                 "BPF_MAXINSNS: Call heavy transformations",
10709                 { },
10710                 CLASSIC | FLAG_NO_DATA,
10711                 { },
10712                 { { 1, 0 }, { 10, 0 } },
10713                 .fill_helper = bpf_fill_maxinsns7,
10714         },
10715         {       /* Mainly checking JIT here. */
10716                 "BPF_MAXINSNS: Jump heavy test",
10717                 { },
10718                 CLASSIC | FLAG_NO_DATA,
10719                 { },
10720                 { { 0, 0xffffffff } },
10721                 .fill_helper = bpf_fill_maxinsns8,
10722         },
10723         {       /* Mainly checking JIT here. */
10724                 "BPF_MAXINSNS: Very long jump backwards",
10725                 { },
10726                 INTERNAL | FLAG_NO_DATA,
10727                 { },
10728                 { { 0, 0xcbababab } },
10729                 .fill_helper = bpf_fill_maxinsns9,
10730         },
10731         {       /* Mainly checking JIT here. */
10732                 "BPF_MAXINSNS: Edge hopping nuthouse",
10733                 { },
10734                 INTERNAL | FLAG_NO_DATA,
10735                 { },
10736                 { { 0, 0xabababac } },
10737                 .fill_helper = bpf_fill_maxinsns10,
10738         },
10739         {
10740                 "BPF_MAXINSNS: Jump, gap, jump, ...",
10741                 { },
10742                 CLASSIC | FLAG_NO_DATA,
10743                 { },
10744                 { { 0, 0xababcbac } },
10745                 .fill_helper = bpf_fill_maxinsns11,
10746         },
10747         {
10748                 "BPF_MAXINSNS: jump over MSH",
10749                 { },
10750                 CLASSIC | FLAG_EXPECTED_FAIL,
10751                 { 0xfa, 0xfb, 0xfc, 0xfd, },
10752                 { { 4, 0xabababab } },
10753                 .fill_helper = bpf_fill_maxinsns12,
10754                 .expected_errcode = -EINVAL,
10755         },
10756         {
10757                 "BPF_MAXINSNS: exec all MSH",
10758                 { },
10759                 CLASSIC,
10760                 { 0xfa, 0xfb, 0xfc, 0xfd, },
10761                 { { 4, 0xababab83 } },
10762                 .fill_helper = bpf_fill_maxinsns13,
10763         },
10764         {
10765                 "BPF_MAXINSNS: ld_abs+get_processor_id",
10766                 { },
10767                 CLASSIC,
10768                 { },
10769                 { { 1, 0xbee } },
10770                 .fill_helper = bpf_fill_ld_abs_get_processor_id,
10771         },
10772         /*
10773          * LD_IND / LD_ABS on fragmented SKBs
10774          */
10775         {
10776                 "LD_IND byte frag",
10777                 .u.insns = {
10778                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10779                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
10780                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10781                 },
10782                 CLASSIC | FLAG_SKB_FRAG,
10783                 { },
10784                 { {0x40, 0x42} },
10785                 .frag_data = {
10786                         0x42, 0x00, 0x00, 0x00,
10787                         0x43, 0x44, 0x00, 0x00,
10788                         0x21, 0x07, 0x19, 0x83,
10789                 },
10790         },
10791         {
10792                 "LD_IND halfword frag",
10793                 .u.insns = {
10794                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10795                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
10796                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10797                 },
10798                 CLASSIC | FLAG_SKB_FRAG,
10799                 { },
10800                 { {0x40, 0x4344} },
10801                 .frag_data = {
10802                         0x42, 0x00, 0x00, 0x00,
10803                         0x43, 0x44, 0x00, 0x00,
10804                         0x21, 0x07, 0x19, 0x83,
10805                 },
10806         },
10807         {
10808                 "LD_IND word frag",
10809                 .u.insns = {
10810                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10811                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
10812                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10813                 },
10814                 CLASSIC | FLAG_SKB_FRAG,
10815                 { },
10816                 { {0x40, 0x21071983} },
10817                 .frag_data = {
10818                         0x42, 0x00, 0x00, 0x00,
10819                         0x43, 0x44, 0x00, 0x00,
10820                         0x21, 0x07, 0x19, 0x83,
10821                 },
10822         },
10823         {
10824                 "LD_IND halfword mixed head/frag",
10825                 .u.insns = {
10826                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10827                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
10828                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10829                 },
10830                 CLASSIC | FLAG_SKB_FRAG,
10831                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10832                 { {0x40, 0x0519} },
10833                 .frag_data = { 0x19, 0x82 },
10834         },
10835         {
10836                 "LD_IND word mixed head/frag",
10837                 .u.insns = {
10838                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10839                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
10840                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10841                 },
10842                 CLASSIC | FLAG_SKB_FRAG,
10843                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10844                 { {0x40, 0x25051982} },
10845                 .frag_data = { 0x19, 0x82 },
10846         },
10847         {
10848                 "LD_ABS byte frag",
10849                 .u.insns = {
10850                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
10851                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10852                 },
10853                 CLASSIC | FLAG_SKB_FRAG,
10854                 { },
10855                 { {0x40, 0x42} },
10856                 .frag_data = {
10857                         0x42, 0x00, 0x00, 0x00,
10858                         0x43, 0x44, 0x00, 0x00,
10859                         0x21, 0x07, 0x19, 0x83,
10860                 },
10861         },
10862         {
10863                 "LD_ABS halfword frag",
10864                 .u.insns = {
10865                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
10866                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10867                 },
10868                 CLASSIC | FLAG_SKB_FRAG,
10869                 { },
10870                 { {0x40, 0x4344} },
10871                 .frag_data = {
10872                         0x42, 0x00, 0x00, 0x00,
10873                         0x43, 0x44, 0x00, 0x00,
10874                         0x21, 0x07, 0x19, 0x83,
10875                 },
10876         },
10877         {
10878                 "LD_ABS word frag",
10879                 .u.insns = {
10880                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
10881                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10882                 },
10883                 CLASSIC | FLAG_SKB_FRAG,
10884                 { },
10885                 { {0x40, 0x21071983} },
10886                 .frag_data = {
10887                         0x42, 0x00, 0x00, 0x00,
10888                         0x43, 0x44, 0x00, 0x00,
10889                         0x21, 0x07, 0x19, 0x83,
10890                 },
10891         },
10892         {
10893                 "LD_ABS halfword mixed head/frag",
10894                 .u.insns = {
10895                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
10896                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10897                 },
10898                 CLASSIC | FLAG_SKB_FRAG,
10899                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10900                 { {0x40, 0x0519} },
10901                 .frag_data = { 0x19, 0x82 },
10902         },
10903         {
10904                 "LD_ABS word mixed head/frag",
10905                 .u.insns = {
10906                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
10907                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10908                 },
10909                 CLASSIC | FLAG_SKB_FRAG,
10910                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10911                 { {0x40, 0x25051982} },
10912                 .frag_data = { 0x19, 0x82 },
10913         },
10914         /*
10915          * LD_IND / LD_ABS on non fragmented SKBs
10916          */
10917         {
10918                 /*
10919                  * this tests that the JIT/interpreter correctly resets X
10920                  * before using it in an LD_IND instruction.
10921                  */
10922                 "LD_IND byte default X",
10923                 .u.insns = {
10924                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10925                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10926                 },
10927                 CLASSIC,
10928                 { [0x1] = 0x42 },
10929                 { {0x40, 0x42 } },
10930         },
10931         {
10932                 "LD_IND byte positive offset",
10933                 .u.insns = {
10934                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10935                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10936                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10937                 },
10938                 CLASSIC,
10939                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10940                 { {0x40, 0x82 } },
10941         },
10942         {
10943                 "LD_IND byte negative offset",
10944                 .u.insns = {
10945                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10946                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
10947                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10948                 },
10949                 CLASSIC,
10950                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10951                 { {0x40, 0x05 } },
10952         },
10953         {
10954                 "LD_IND byte positive offset, all ff",
10955                 .u.insns = {
10956                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10957                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10958                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10959                 },
10960                 CLASSIC,
10961                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10962                 { {0x40, 0xff } },
10963         },
10964         {
10965                 "LD_IND byte positive offset, out of bounds",
10966                 .u.insns = {
10967                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10968                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10969                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10970                 },
10971                 CLASSIC,
10972                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10973                 { {0x3f, 0 }, },
10974         },
10975         {
10976                 "LD_IND byte negative offset, out of bounds",
10977                 .u.insns = {
10978                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10979                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
10980                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10981                 },
10982                 CLASSIC,
10983                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10984                 { {0x3f, 0 } },
10985         },
10986         {
10987                 "LD_IND byte negative offset, multiple calls",
10988                 .u.insns = {
10989                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
10990                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
10991                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
10992                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
10993                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
10994                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10995                 },
10996                 CLASSIC,
10997                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10998                 { {0x40, 0x82 }, },
10999         },
11000         {
11001                 "LD_IND halfword positive offset",
11002                 .u.insns = {
11003                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11004                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
11005                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11006                 },
11007                 CLASSIC,
11008                 {
11009                         [0x1c] = 0xaa, [0x1d] = 0x55,
11010                         [0x1e] = 0xbb, [0x1f] = 0x66,
11011                         [0x20] = 0xcc, [0x21] = 0x77,
11012                         [0x22] = 0xdd, [0x23] = 0x88,
11013                 },
11014                 { {0x40, 0xdd88 } },
11015         },
11016         {
11017                 "LD_IND halfword negative offset",
11018                 .u.insns = {
11019                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11020                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
11021                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11022                 },
11023                 CLASSIC,
11024                 {
11025                         [0x1c] = 0xaa, [0x1d] = 0x55,
11026                         [0x1e] = 0xbb, [0x1f] = 0x66,
11027                         [0x20] = 0xcc, [0x21] = 0x77,
11028                         [0x22] = 0xdd, [0x23] = 0x88,
11029                 },
11030                 { {0x40, 0xbb66 } },
11031         },
11032         {
11033                 "LD_IND halfword unaligned",
11034                 .u.insns = {
11035                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11036                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
11037                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11038                 },
11039                 CLASSIC,
11040                 {
11041                         [0x1c] = 0xaa, [0x1d] = 0x55,
11042                         [0x1e] = 0xbb, [0x1f] = 0x66,
11043                         [0x20] = 0xcc, [0x21] = 0x77,
11044                         [0x22] = 0xdd, [0x23] = 0x88,
11045                 },
11046                 { {0x40, 0x66cc } },
11047         },
11048         {
11049                 "LD_IND halfword positive offset, all ff",
11050                 .u.insns = {
11051                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
11052                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
11053                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11054                 },
11055                 CLASSIC,
11056                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
11057                 { {0x40, 0xffff } },
11058         },
11059         {
11060                 "LD_IND halfword positive offset, out of bounds",
11061                 .u.insns = {
11062                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
11063                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
11064                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11065                 },
11066                 CLASSIC,
11067                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11068                 { {0x3f, 0 }, },
11069         },
11070         {
11071                 "LD_IND halfword negative offset, out of bounds",
11072                 .u.insns = {
11073                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
11074                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
11075                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11076                 },
11077                 CLASSIC,
11078                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11079                 { {0x3f, 0 } },
11080         },
11081         {
11082                 "LD_IND word positive offset",
11083                 .u.insns = {
11084                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11085                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
11086                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11087                 },
11088                 CLASSIC,
11089                 {
11090                         [0x1c] = 0xaa, [0x1d] = 0x55,
11091                         [0x1e] = 0xbb, [0x1f] = 0x66,
11092                         [0x20] = 0xcc, [0x21] = 0x77,
11093                         [0x22] = 0xdd, [0x23] = 0x88,
11094                         [0x24] = 0xee, [0x25] = 0x99,
11095                         [0x26] = 0xff, [0x27] = 0xaa,
11096                 },
11097                 { {0x40, 0xee99ffaa } },
11098         },
11099         {
11100                 "LD_IND word negative offset",
11101                 .u.insns = {
11102                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11103                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
11104                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11105                 },
11106                 CLASSIC,
11107                 {
11108                         [0x1c] = 0xaa, [0x1d] = 0x55,
11109                         [0x1e] = 0xbb, [0x1f] = 0x66,
11110                         [0x20] = 0xcc, [0x21] = 0x77,
11111                         [0x22] = 0xdd, [0x23] = 0x88,
11112                         [0x24] = 0xee, [0x25] = 0x99,
11113                         [0x26] = 0xff, [0x27] = 0xaa,
11114                 },
11115                 { {0x40, 0xaa55bb66 } },
11116         },
11117         {
11118                 "LD_IND word unaligned (addr & 3 == 2)",
11119                 .u.insns = {
11120                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11121                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
11122                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11123                 },
11124                 CLASSIC,
11125                 {
11126                         [0x1c] = 0xaa, [0x1d] = 0x55,
11127                         [0x1e] = 0xbb, [0x1f] = 0x66,
11128                         [0x20] = 0xcc, [0x21] = 0x77,
11129                         [0x22] = 0xdd, [0x23] = 0x88,
11130                         [0x24] = 0xee, [0x25] = 0x99,
11131                         [0x26] = 0xff, [0x27] = 0xaa,
11132                 },
11133                 { {0x40, 0xbb66cc77 } },
11134         },
11135         {
11136                 "LD_IND word unaligned (addr & 3 == 1)",
11137                 .u.insns = {
11138                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11139                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
11140                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11141                 },
11142                 CLASSIC,
11143                 {
11144                         [0x1c] = 0xaa, [0x1d] = 0x55,
11145                         [0x1e] = 0xbb, [0x1f] = 0x66,
11146                         [0x20] = 0xcc, [0x21] = 0x77,
11147                         [0x22] = 0xdd, [0x23] = 0x88,
11148                         [0x24] = 0xee, [0x25] = 0x99,
11149                         [0x26] = 0xff, [0x27] = 0xaa,
11150                 },
11151                 { {0x40, 0x55bb66cc } },
11152         },
11153         {
11154                 "LD_IND word unaligned (addr & 3 == 3)",
11155                 .u.insns = {
11156                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
11157                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
11158                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11159                 },
11160                 CLASSIC,
11161                 {
11162                         [0x1c] = 0xaa, [0x1d] = 0x55,
11163                         [0x1e] = 0xbb, [0x1f] = 0x66,
11164                         [0x20] = 0xcc, [0x21] = 0x77,
11165                         [0x22] = 0xdd, [0x23] = 0x88,
11166                         [0x24] = 0xee, [0x25] = 0x99,
11167                         [0x26] = 0xff, [0x27] = 0xaa,
11168                 },
11169                 { {0x40, 0x66cc77dd } },
11170         },
11171         {
11172                 "LD_IND word positive offset, all ff",
11173                 .u.insns = {
11174                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
11175                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
11176                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11177                 },
11178                 CLASSIC,
11179                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
11180                 { {0x40, 0xffffffff } },
11181         },
11182         {
11183                 "LD_IND word positive offset, out of bounds",
11184                 .u.insns = {
11185                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
11186                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
11187                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11188                 },
11189                 CLASSIC,
11190                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11191                 { {0x3f, 0 }, },
11192         },
11193         {
11194                 "LD_IND word negative offset, out of bounds",
11195                 .u.insns = {
11196                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
11197                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
11198                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11199                 },
11200                 CLASSIC,
11201                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11202                 { {0x3f, 0 } },
11203         },
11204         {
11205                 "LD_ABS byte",
11206                 .u.insns = {
11207                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
11208                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11209                 },
11210                 CLASSIC,
11211                 {
11212                         [0x1c] = 0xaa, [0x1d] = 0x55,
11213                         [0x1e] = 0xbb, [0x1f] = 0x66,
11214                         [0x20] = 0xcc, [0x21] = 0x77,
11215                         [0x22] = 0xdd, [0x23] = 0x88,
11216                         [0x24] = 0xee, [0x25] = 0x99,
11217                         [0x26] = 0xff, [0x27] = 0xaa,
11218                 },
11219                 { {0x40, 0xcc } },
11220         },
11221         {
11222                 "LD_ABS byte positive offset, all ff",
11223                 .u.insns = {
11224                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
11225                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11226                 },
11227                 CLASSIC,
11228                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
11229                 { {0x40, 0xff } },
11230         },
11231         {
11232                 "LD_ABS byte positive offset, out of bounds",
11233                 .u.insns = {
11234                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
11235                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11236                 },
11237                 CLASSIC,
11238                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11239                 { {0x3f, 0 }, },
11240         },
11241         {
11242                 "LD_ABS byte negative offset, out of bounds load",
11243                 .u.insns = {
11244                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
11245                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11246                 },
11247                 CLASSIC | FLAG_EXPECTED_FAIL,
11248                 .expected_errcode = -EINVAL,
11249         },
11250         {
11251                 "LD_ABS byte negative offset, in bounds",
11252                 .u.insns = {
11253                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
11254                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11255                 },
11256                 CLASSIC,
11257                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11258                 { {0x40, 0x82 }, },
11259         },
11260         {
11261                 "LD_ABS byte negative offset, out of bounds",
11262                 .u.insns = {
11263                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
11264                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11265                 },
11266                 CLASSIC,
11267                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11268                 { {0x3f, 0 }, },
11269         },
11270         {
11271                 "LD_ABS byte negative offset, multiple calls",
11272                 .u.insns = {
11273                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
11274                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
11275                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
11276                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
11277                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11278                 },
11279                 CLASSIC,
11280                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11281                 { {0x40, 0x82 }, },
11282         },
11283         {
11284                 "LD_ABS halfword",
11285                 .u.insns = {
11286                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
11287                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11288                 },
11289                 CLASSIC,
11290                 {
11291                         [0x1c] = 0xaa, [0x1d] = 0x55,
11292                         [0x1e] = 0xbb, [0x1f] = 0x66,
11293                         [0x20] = 0xcc, [0x21] = 0x77,
11294                         [0x22] = 0xdd, [0x23] = 0x88,
11295                         [0x24] = 0xee, [0x25] = 0x99,
11296                         [0x26] = 0xff, [0x27] = 0xaa,
11297                 },
11298                 { {0x40, 0xdd88 } },
11299         },
11300         {
11301                 "LD_ABS halfword unaligned",
11302                 .u.insns = {
11303                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
11304                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11305                 },
11306                 CLASSIC,
11307                 {
11308                         [0x1c] = 0xaa, [0x1d] = 0x55,
11309                         [0x1e] = 0xbb, [0x1f] = 0x66,
11310                         [0x20] = 0xcc, [0x21] = 0x77,
11311                         [0x22] = 0xdd, [0x23] = 0x88,
11312                         [0x24] = 0xee, [0x25] = 0x99,
11313                         [0x26] = 0xff, [0x27] = 0xaa,
11314                 },
11315                 { {0x40, 0x99ff } },
11316         },
11317         {
11318                 "LD_ABS halfword positive offset, all ff",
11319                 .u.insns = {
11320                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
11321                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11322                 },
11323                 CLASSIC,
11324                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
11325                 { {0x40, 0xffff } },
11326         },
11327         {
11328                 "LD_ABS halfword positive offset, out of bounds",
11329                 .u.insns = {
11330                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
11331                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11332                 },
11333                 CLASSIC,
11334                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11335                 { {0x3f, 0 }, },
11336         },
11337         {
11338                 "LD_ABS halfword negative offset, out of bounds load",
11339                 .u.insns = {
11340                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
11341                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11342                 },
11343                 CLASSIC | FLAG_EXPECTED_FAIL,
11344                 .expected_errcode = -EINVAL,
11345         },
11346         {
11347                 "LD_ABS halfword negative offset, in bounds",
11348                 .u.insns = {
11349                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
11350                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11351                 },
11352                 CLASSIC,
11353                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11354                 { {0x40, 0x1982 }, },
11355         },
11356         {
11357                 "LD_ABS halfword negative offset, out of bounds",
11358                 .u.insns = {
11359                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
11360                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11361                 },
11362                 CLASSIC,
11363                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11364                 { {0x3f, 0 }, },
11365         },
11366         {
11367                 "LD_ABS word",
11368                 .u.insns = {
11369                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
11370                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11371                 },
11372                 CLASSIC,
11373                 {
11374                         [0x1c] = 0xaa, [0x1d] = 0x55,
11375                         [0x1e] = 0xbb, [0x1f] = 0x66,
11376                         [0x20] = 0xcc, [0x21] = 0x77,
11377                         [0x22] = 0xdd, [0x23] = 0x88,
11378                         [0x24] = 0xee, [0x25] = 0x99,
11379                         [0x26] = 0xff, [0x27] = 0xaa,
11380                 },
11381                 { {0x40, 0xaa55bb66 } },
11382         },
11383         {
11384                 "LD_ABS word unaligned (addr & 3 == 2)",
11385                 .u.insns = {
11386                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
11387                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11388                 },
11389                 CLASSIC,
11390                 {
11391                         [0x1c] = 0xaa, [0x1d] = 0x55,
11392                         [0x1e] = 0xbb, [0x1f] = 0x66,
11393                         [0x20] = 0xcc, [0x21] = 0x77,
11394                         [0x22] = 0xdd, [0x23] = 0x88,
11395                         [0x24] = 0xee, [0x25] = 0x99,
11396                         [0x26] = 0xff, [0x27] = 0xaa,
11397                 },
11398                 { {0x40, 0xdd88ee99 } },
11399         },
11400         {
11401                 "LD_ABS word unaligned (addr & 3 == 1)",
11402                 .u.insns = {
11403                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
11404                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11405                 },
11406                 CLASSIC,
11407                 {
11408                         [0x1c] = 0xaa, [0x1d] = 0x55,
11409                         [0x1e] = 0xbb, [0x1f] = 0x66,
11410                         [0x20] = 0xcc, [0x21] = 0x77,
11411                         [0x22] = 0xdd, [0x23] = 0x88,
11412                         [0x24] = 0xee, [0x25] = 0x99,
11413                         [0x26] = 0xff, [0x27] = 0xaa,
11414                 },
11415                 { {0x40, 0x77dd88ee } },
11416         },
11417         {
11418                 "LD_ABS word unaligned (addr & 3 == 3)",
11419                 .u.insns = {
11420                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
11421                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11422                 },
11423                 CLASSIC,
11424                 {
11425                         [0x1c] = 0xaa, [0x1d] = 0x55,
11426                         [0x1e] = 0xbb, [0x1f] = 0x66,
11427                         [0x20] = 0xcc, [0x21] = 0x77,
11428                         [0x22] = 0xdd, [0x23] = 0x88,
11429                         [0x24] = 0xee, [0x25] = 0x99,
11430                         [0x26] = 0xff, [0x27] = 0xaa,
11431                 },
11432                 { {0x40, 0x88ee99ff } },
11433         },
11434         {
11435                 "LD_ABS word positive offset, all ff",
11436                 .u.insns = {
11437                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
11438                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11439                 },
11440                 CLASSIC,
11441                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
11442                 { {0x40, 0xffffffff } },
11443         },
11444         {
11445                 "LD_ABS word positive offset, out of bounds",
11446                 .u.insns = {
11447                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
11448                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11449                 },
11450                 CLASSIC,
11451                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11452                 { {0x3f, 0 }, },
11453         },
11454         {
11455                 "LD_ABS word negative offset, out of bounds load",
11456                 .u.insns = {
11457                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
11458                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11459                 },
11460                 CLASSIC | FLAG_EXPECTED_FAIL,
11461                 .expected_errcode = -EINVAL,
11462         },
11463         {
11464                 "LD_ABS word negative offset, in bounds",
11465                 .u.insns = {
11466                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
11467                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11468                 },
11469                 CLASSIC,
11470                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11471                 { {0x40, 0x25051982 }, },
11472         },
11473         {
11474                 "LD_ABS word negative offset, out of bounds",
11475                 .u.insns = {
11476                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
11477                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11478                 },
11479                 CLASSIC,
11480                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11481                 { {0x3f, 0 }, },
11482         },
11483         {
11484                 "LDX_MSH standalone, preserved A",
11485                 .u.insns = {
11486                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
11487                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
11488                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11489                 },
11490                 CLASSIC,
11491                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11492                 { {0x40, 0xffeebbaa }, },
11493         },
11494         {
11495                 "LDX_MSH standalone, preserved A 2",
11496                 .u.insns = {
11497                         BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
11498                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
11499                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
11500                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
11501                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
11502                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11503                 },
11504                 CLASSIC,
11505                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11506                 { {0x40, 0x175e9d63 }, },
11507         },
11508         {
11509                 "LDX_MSH standalone, test result 1",
11510                 .u.insns = {
11511                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
11512                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
11513                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
11514                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11515                 },
11516                 CLASSIC,
11517                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11518                 { {0x40, 0x14 }, },
11519         },
11520         {
11521                 "LDX_MSH standalone, test result 2",
11522                 .u.insns = {
11523                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
11524                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
11525                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
11526                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11527                 },
11528                 CLASSIC,
11529                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11530                 { {0x40, 0x24 }, },
11531         },
11532         {
11533                 "LDX_MSH standalone, negative offset",
11534                 .u.insns = {
11535                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
11536                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
11537                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
11538                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11539                 },
11540                 CLASSIC,
11541                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11542                 { {0x40, 0 }, },
11543         },
11544         {
11545                 "LDX_MSH standalone, negative offset 2",
11546                 .u.insns = {
11547                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
11548                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
11549                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
11550                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11551                 },
11552                 CLASSIC,
11553                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11554                 { {0x40, 0x24 }, },
11555         },
11556         {
11557                 "LDX_MSH standalone, out of bounds",
11558                 .u.insns = {
11559                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
11560                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
11561                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
11562                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11563                 },
11564                 CLASSIC,
11565                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
11566                 { {0x40, 0 }, },
11567         },
11568         /*
11569          * verify that the interpreter or JIT correctly sets A and X
11570          * to 0.
11571          */
11572         {
11573                 "ADD default X",
11574                 .u.insns = {
11575                         /*
11576                          * A = 0x42
11577                          * A = A + X
11578                          * ret A
11579                          */
11580                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
11581                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
11582                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11583                 },
11584                 CLASSIC | FLAG_NO_DATA,
11585                 {},
11586                 { {0x1, 0x42 } },
11587         },
11588         {
11589                 "ADD default A",
11590                 .u.insns = {
11591                         /*
11592                          * A = A + 0x42
11593                          * ret A
11594                          */
11595                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
11596                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11597                 },
11598                 CLASSIC | FLAG_NO_DATA,
11599                 {},
11600                 { {0x1, 0x42 } },
11601         },
11602         {
11603                 "SUB default X",
11604                 .u.insns = {
11605                         /*
11606                          * A = 0x66
11607                          * A = A - X
11608                          * ret A
11609                          */
11610                         BPF_STMT(BPF_LD | BPF_IMM, 0x66),
11611                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
11612                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11613                 },
11614                 CLASSIC | FLAG_NO_DATA,
11615                 {},
11616                 { {0x1, 0x66 } },
11617         },
11618         {
11619                 "SUB default A",
11620                 .u.insns = {
11621                         /*
11622                          * A = A - -0x66
11623                          * ret A
11624                          */
11625                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
11626                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11627                 },
11628                 CLASSIC | FLAG_NO_DATA,
11629                 {},
11630                 { {0x1, 0x66 } },
11631         },
11632         {
11633                 "MUL default X",
11634                 .u.insns = {
11635                         /*
11636                          * A = 0x42
11637                          * A = A * X
11638                          * ret A
11639                          */
11640                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
11641                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
11642                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11643                 },
11644                 CLASSIC | FLAG_NO_DATA,
11645                 {},
11646                 { {0x1, 0x0 } },
11647         },
11648         {
11649                 "MUL default A",
11650                 .u.insns = {
11651                         /*
11652                          * A = A * 0x66
11653                          * ret A
11654                          */
11655                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
11656                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11657                 },
11658                 CLASSIC | FLAG_NO_DATA,
11659                 {},
11660                 { {0x1, 0x0 } },
11661         },
11662         {
11663                 "DIV default X",
11664                 .u.insns = {
11665                         /*
11666                          * A = 0x42
11667                          * A = A / X ; this halt the filter execution if X is 0
11668                          * ret 0x42
11669                          */
11670                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
11671                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
11672                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11673                 },
11674                 CLASSIC | FLAG_NO_DATA,
11675                 {},
11676                 { {0x1, 0x0 } },
11677         },
11678         {
11679                 "DIV default A",
11680                 .u.insns = {
11681                         /*
11682                          * A = A / 1
11683                          * ret A
11684                          */
11685                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
11686                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11687                 },
11688                 CLASSIC | FLAG_NO_DATA,
11689                 {},
11690                 { {0x1, 0x0 } },
11691         },
11692         {
11693                 "MOD default X",
11694                 .u.insns = {
11695                         /*
11696                          * A = 0x42
11697                          * A = A mod X ; this halt the filter execution if X is 0
11698                          * ret 0x42
11699                          */
11700                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
11701                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
11702                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11703                 },
11704                 CLASSIC | FLAG_NO_DATA,
11705                 {},
11706                 { {0x1, 0x0 } },
11707         },
11708         {
11709                 "MOD default A",
11710                 .u.insns = {
11711                         /*
11712                          * A = A mod 1
11713                          * ret A
11714                          */
11715                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
11716                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11717                 },
11718                 CLASSIC | FLAG_NO_DATA,
11719                 {},
11720                 { {0x1, 0x0 } },
11721         },
11722         {
11723                 "JMP EQ default A",
11724                 .u.insns = {
11725                         /*
11726                          * cmp A, 0x0, 0, 1
11727                          * ret 0x42
11728                          * ret 0x66
11729                          */
11730                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
11731                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11732                         BPF_STMT(BPF_RET | BPF_K, 0x66),
11733                 },
11734                 CLASSIC | FLAG_NO_DATA,
11735                 {},
11736                 { {0x1, 0x42 } },
11737         },
11738         {
11739                 "JMP EQ default X",
11740                 .u.insns = {
11741                         /*
11742                          * A = 0x0
11743                          * cmp A, X, 0, 1
11744                          * ret 0x42
11745                          * ret 0x66
11746                          */
11747                         BPF_STMT(BPF_LD | BPF_IMM, 0x0),
11748                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
11749                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11750                         BPF_STMT(BPF_RET | BPF_K, 0x66),
11751                 },
11752                 CLASSIC | FLAG_NO_DATA,
11753                 {},
11754                 { {0x1, 0x42 } },
11755         },
11756         /* Checking interpreter vs JIT wrt signed extended imms. */
11757         {
11758                 "JNE signed compare, test 1",
11759                 .u.insns_int = {
11760                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
11761                         BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
11762                         BPF_MOV64_REG(R2, R1),
11763                         BPF_ALU64_REG(BPF_AND, R2, R3),
11764                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11765                         BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
11766                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11767                         BPF_EXIT_INSN(),
11768                 },
11769                 INTERNAL,
11770                 { },
11771                 { { 0, 1 } },
11772         },
11773         {
11774                 "JNE signed compare, test 2",
11775                 .u.insns_int = {
11776                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
11777                         BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
11778                         BPF_MOV64_REG(R2, R1),
11779                         BPF_ALU64_REG(BPF_AND, R2, R3),
11780                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11781                         BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
11782                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11783                         BPF_EXIT_INSN(),
11784                 },
11785                 INTERNAL,
11786                 { },
11787                 { { 0, 1 } },
11788         },
11789         {
11790                 "JNE signed compare, test 3",
11791                 .u.insns_int = {
11792                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
11793                         BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
11794                         BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
11795                         BPF_MOV64_REG(R2, R1),
11796                         BPF_ALU64_REG(BPF_AND, R2, R3),
11797                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11798                         BPF_JMP_REG(BPF_JNE, R2, R4, 1),
11799                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11800                         BPF_EXIT_INSN(),
11801                 },
11802                 INTERNAL,
11803                 { },
11804                 { { 0, 2 } },
11805         },
11806         {
11807                 "JNE signed compare, test 4",
11808                 .u.insns_int = {
11809                         BPF_LD_IMM64(R1, -17104896),
11810                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11811                         BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
11812                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11813                         BPF_EXIT_INSN(),
11814                 },
11815                 INTERNAL,
11816                 { },
11817                 { { 0, 2 } },
11818         },
11819         {
11820                 "JNE signed compare, test 5",
11821                 .u.insns_int = {
11822                         BPF_LD_IMM64(R1, 0xfefb0000),
11823                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11824                         BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
11825                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11826                         BPF_EXIT_INSN(),
11827                 },
11828                 INTERNAL,
11829                 { },
11830                 { { 0, 1 } },
11831         },
11832         {
11833                 "JNE signed compare, test 6",
11834                 .u.insns_int = {
11835                         BPF_LD_IMM64(R1, 0x7efb0000),
11836                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11837                         BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
11838                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11839                         BPF_EXIT_INSN(),
11840                 },
11841                 INTERNAL,
11842                 { },
11843                 { { 0, 2 } },
11844         },
11845         {
11846                 "JNE signed compare, test 7",
11847                 .u.insns = {
11848                         BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
11849                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
11850                         BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
11851                         BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
11852                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
11853                         BPF_STMT(BPF_RET | BPF_K, 1),
11854                         BPF_STMT(BPF_RET | BPF_K, 2),
11855                 },
11856                 CLASSIC | FLAG_NO_DATA,
11857                 {},
11858                 { { 0, 2 } },
11859         },
11860         /* BPF_LDX_MEM with operand aliasing */
11861         {
11862                 "LDX_MEM_B: operand register aliasing",
11863                 .u.insns_int = {
11864                         BPF_ST_MEM(BPF_B, R10, -8, 123),
11865                         BPF_MOV64_REG(R0, R10),
11866                         BPF_LDX_MEM(BPF_B, R0, R0, -8),
11867                         BPF_EXIT_INSN(),
11868                 },
11869                 INTERNAL,
11870                 { },
11871                 { { 0, 123 } },
11872                 .stack_depth = 8,
11873         },
11874         {
11875                 "LDX_MEM_H: operand register aliasing",
11876                 .u.insns_int = {
11877                         BPF_ST_MEM(BPF_H, R10, -8, 12345),
11878                         BPF_MOV64_REG(R0, R10),
11879                         BPF_LDX_MEM(BPF_H, R0, R0, -8),
11880                         BPF_EXIT_INSN(),
11881                 },
11882                 INTERNAL,
11883                 { },
11884                 { { 0, 12345 } },
11885                 .stack_depth = 8,
11886         },
11887         {
11888                 "LDX_MEM_W: operand register aliasing",
11889                 .u.insns_int = {
11890                         BPF_ST_MEM(BPF_W, R10, -8, 123456789),
11891                         BPF_MOV64_REG(R0, R10),
11892                         BPF_LDX_MEM(BPF_W, R0, R0, -8),
11893                         BPF_EXIT_INSN(),
11894                 },
11895                 INTERNAL,
11896                 { },
11897                 { { 0, 123456789 } },
11898                 .stack_depth = 8,
11899         },
11900         {
11901                 "LDX_MEM_DW: operand register aliasing",
11902                 .u.insns_int = {
11903                         BPF_LD_IMM64(R1, 0x123456789abcdefULL),
11904                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
11905                         BPF_MOV64_REG(R0, R10),
11906                         BPF_LDX_MEM(BPF_DW, R0, R0, -8),
11907                         BPF_ALU64_REG(BPF_SUB, R0, R1),
11908                         BPF_MOV64_REG(R1, R0),
11909                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
11910                         BPF_ALU64_REG(BPF_OR, R0, R1),
11911                         BPF_EXIT_INSN(),
11912                 },
11913                 INTERNAL,
11914                 { },
11915                 { { 0, 0 } },
11916                 .stack_depth = 8,
11917         },
11918         /*
11919          * Register (non-)clobbering tests for the case where a JIT implements
11920          * complex ALU or ATOMIC operations via function calls. If so, the
11921          * function call must be transparent to the eBPF registers. The JIT
11922          * must therefore save and restore relevant registers across the call.
11923          * The following tests check that the eBPF registers retain their
11924          * values after such an operation. Mainly intended for complex ALU
11925          * and atomic operation, but we run it for all. You never know...
11926          *
11927          * Note that each operations should be tested twice with different
11928          * destinations, to check preservation for all registers.
11929          */
11930 #define BPF_TEST_CLOBBER_ALU(alu, op, dst, src)                 \
11931         {                                                       \
11932                 #alu "_" #op " to " #dst ": no clobbering",     \
11933                 .u.insns_int = {                                \
11934                         BPF_ALU64_IMM(BPF_MOV, R0, R0),         \
11935                         BPF_ALU64_IMM(BPF_MOV, R1, R1),         \
11936                         BPF_ALU64_IMM(BPF_MOV, R2, R2),         \
11937                         BPF_ALU64_IMM(BPF_MOV, R3, R3),         \
11938                         BPF_ALU64_IMM(BPF_MOV, R4, R4),         \
11939                         BPF_ALU64_IMM(BPF_MOV, R5, R5),         \
11940                         BPF_ALU64_IMM(BPF_MOV, R6, R6),         \
11941                         BPF_ALU64_IMM(BPF_MOV, R7, R7),         \
11942                         BPF_ALU64_IMM(BPF_MOV, R8, R8),         \
11943                         BPF_ALU64_IMM(BPF_MOV, R9, R9),         \
11944                         BPF_##alu(BPF_ ##op, dst, src),         \
11945                         BPF_ALU32_IMM(BPF_MOV, dst, dst),       \
11946                         BPF_JMP_IMM(BPF_JNE, R0, R0, 10),       \
11947                         BPF_JMP_IMM(BPF_JNE, R1, R1, 9),        \
11948                         BPF_JMP_IMM(BPF_JNE, R2, R2, 8),        \
11949                         BPF_JMP_IMM(BPF_JNE, R3, R3, 7),        \
11950                         BPF_JMP_IMM(BPF_JNE, R4, R4, 6),        \
11951                         BPF_JMP_IMM(BPF_JNE, R5, R5, 5),        \
11952                         BPF_JMP_IMM(BPF_JNE, R6, R6, 4),        \
11953                         BPF_JMP_IMM(BPF_JNE, R7, R7, 3),        \
11954                         BPF_JMP_IMM(BPF_JNE, R8, R8, 2),        \
11955                         BPF_JMP_IMM(BPF_JNE, R9, R9, 1),        \
11956                         BPF_ALU64_IMM(BPF_MOV, R0, 1),          \
11957                         BPF_EXIT_INSN(),                        \
11958                 },                                              \
11959                 INTERNAL,                                       \
11960                 { },                                            \
11961                 { { 0, 1 } }                                    \
11962         }
11963         /* ALU64 operations, register clobbering */
11964         BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R8, 123456789),
11965         BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R9, 123456789),
11966         BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R8, 123456789),
11967         BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R9, 123456789),
11968         BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R8, 123456789),
11969         BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R9, 123456789),
11970         BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R8, 12),
11971         BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R9, 12),
11972         BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R8, 12),
11973         BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R9, 12),
11974         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R8, 12),
11975         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R9, 12),
11976         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R8, 123456789),
11977         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R9, 123456789),
11978         BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R8, 123456789),
11979         BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R9, 123456789),
11980         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R8, 123456789),
11981         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R9, 123456789),
11982         BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R8, 123456789),
11983         BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R9, 123456789),
11984         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R8, 123456789),
11985         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R9, 123456789),
11986         /* ALU32 immediate operations, register clobbering */
11987         BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R8, 123456789),
11988         BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R9, 123456789),
11989         BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R8, 123456789),
11990         BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R9, 123456789),
11991         BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R8, 123456789),
11992         BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R9, 123456789),
11993         BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R8, 12),
11994         BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R9, 12),
11995         BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R8, 12),
11996         BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R9, 12),
11997         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R8, 12),
11998         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R9, 12),
11999         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R8, 123456789),
12000         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R9, 123456789),
12001         BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R8, 123456789),
12002         BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R9, 123456789),
12003         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R8, 123456789),
12004         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R9, 123456789),
12005         BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R8, 123456789),
12006         BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R9, 123456789),
12007         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R8, 123456789),
12008         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R9, 123456789),
12009         /* ALU64 register operations, register clobbering */
12010         BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R8, R1),
12011         BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R9, R1),
12012         BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R8, R1),
12013         BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R9, R1),
12014         BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R8, R1),
12015         BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R9, R1),
12016         BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R8, R1),
12017         BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R9, R1),
12018         BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R8, R1),
12019         BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R9, R1),
12020         BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R8, R1),
12021         BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R9, R1),
12022         BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R8, R1),
12023         BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R9, R1),
12024         BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R8, R1),
12025         BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R9, R1),
12026         BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R8, R1),
12027         BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R9, R1),
12028         BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R8, R1),
12029         BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R9, R1),
12030         BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R8, R1),
12031         BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R9, R1),
12032         /* ALU32 register operations, register clobbering */
12033         BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R8, R1),
12034         BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R9, R1),
12035         BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R8, R1),
12036         BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R9, R1),
12037         BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R8, R1),
12038         BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R9, R1),
12039         BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R8, R1),
12040         BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R9, R1),
12041         BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R8, R1),
12042         BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R9, R1),
12043         BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R8, R1),
12044         BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R9, R1),
12045         BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R8, R1),
12046         BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R9, R1),
12047         BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R8, R1),
12048         BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R9, R1),
12049         BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R8, R1),
12050         BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R9, R1),
12051         BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R8, R1),
12052         BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R9, R1),
12053         BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R8, R1),
12054         BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R9, R1),
12055 #undef BPF_TEST_CLOBBER_ALU
12056 #define BPF_TEST_CLOBBER_ATOMIC(width, op)                      \
12057         {                                                       \
12058                 "Atomic_" #width " " #op ": no clobbering",     \
12059                 .u.insns_int = {                                \
12060                         BPF_ALU64_IMM(BPF_MOV, R0, 0),          \
12061                         BPF_ALU64_IMM(BPF_MOV, R1, 1),          \
12062                         BPF_ALU64_IMM(BPF_MOV, R2, 2),          \
12063                         BPF_ALU64_IMM(BPF_MOV, R3, 3),          \
12064                         BPF_ALU64_IMM(BPF_MOV, R4, 4),          \
12065                         BPF_ALU64_IMM(BPF_MOV, R5, 5),          \
12066                         BPF_ALU64_IMM(BPF_MOV, R6, 6),          \
12067                         BPF_ALU64_IMM(BPF_MOV, R7, 7),          \
12068                         BPF_ALU64_IMM(BPF_MOV, R8, 8),          \
12069                         BPF_ALU64_IMM(BPF_MOV, R9, 9),          \
12070                         BPF_ST_MEM(width, R10, -8,              \
12071                                    (op) == BPF_CMPXCHG ? 0 :    \
12072                                    (op) & BPF_FETCH ? 1 : 0),   \
12073                         BPF_ATOMIC_OP(width, op, R10, R1, -8),  \
12074                         BPF_JMP_IMM(BPF_JNE, R0, 0, 10),        \
12075                         BPF_JMP_IMM(BPF_JNE, R1, 1, 9),         \
12076                         BPF_JMP_IMM(BPF_JNE, R2, 2, 8),         \
12077                         BPF_JMP_IMM(BPF_JNE, R3, 3, 7),         \
12078                         BPF_JMP_IMM(BPF_JNE, R4, 4, 6),         \
12079                         BPF_JMP_IMM(BPF_JNE, R5, 5, 5),         \
12080                         BPF_JMP_IMM(BPF_JNE, R6, 6, 4),         \
12081                         BPF_JMP_IMM(BPF_JNE, R7, 7, 3),         \
12082                         BPF_JMP_IMM(BPF_JNE, R8, 8, 2),         \
12083                         BPF_JMP_IMM(BPF_JNE, R9, 9, 1),         \
12084                         BPF_ALU64_IMM(BPF_MOV, R0, 1),          \
12085                         BPF_EXIT_INSN(),                        \
12086                 },                                              \
12087                 INTERNAL,                                       \
12088                 { },                                            \
12089                 { { 0, 1 } },                                   \
12090                 .stack_depth = 8,                               \
12091         }
12092         /* 64-bit atomic operations, register clobbering */
12093         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD),
12094         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND),
12095         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR),
12096         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR),
12097         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD | BPF_FETCH),
12098         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND | BPF_FETCH),
12099         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR | BPF_FETCH),
12100         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR | BPF_FETCH),
12101         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XCHG),
12102         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_CMPXCHG),
12103         /* 32-bit atomic operations, register clobbering */
12104         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD),
12105         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND),
12106         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR),
12107         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR),
12108         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD | BPF_FETCH),
12109         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND | BPF_FETCH),
12110         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR | BPF_FETCH),
12111         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR | BPF_FETCH),
12112         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XCHG),
12113         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_CMPXCHG),
12114 #undef BPF_TEST_CLOBBER_ATOMIC
12115         /* Checking that ALU32 src is not zero extended in place */
12116 #define BPF_ALU32_SRC_ZEXT(op)                                  \
12117         {                                                       \
12118                 "ALU32_" #op "_X: src preserved in zext",       \
12119                 .u.insns_int = {                                \
12120                         BPF_LD_IMM64(R1, 0x0123456789acbdefULL),\
12121                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),\
12122                         BPF_ALU64_REG(BPF_MOV, R0, R1),         \
12123                         BPF_ALU32_REG(BPF_##op, R2, R1),        \
12124                         BPF_ALU64_REG(BPF_SUB, R0, R1),         \
12125                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
12126                         BPF_ALU64_IMM(BPF_RSH, R1, 32),         \
12127                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
12128                         BPF_EXIT_INSN(),                        \
12129                 },                                              \
12130                 INTERNAL,                                       \
12131                 { },                                            \
12132                 { { 0, 0 } },                                   \
12133         }
12134         BPF_ALU32_SRC_ZEXT(MOV),
12135         BPF_ALU32_SRC_ZEXT(AND),
12136         BPF_ALU32_SRC_ZEXT(OR),
12137         BPF_ALU32_SRC_ZEXT(XOR),
12138         BPF_ALU32_SRC_ZEXT(ADD),
12139         BPF_ALU32_SRC_ZEXT(SUB),
12140         BPF_ALU32_SRC_ZEXT(MUL),
12141         BPF_ALU32_SRC_ZEXT(DIV),
12142         BPF_ALU32_SRC_ZEXT(MOD),
12143 #undef BPF_ALU32_SRC_ZEXT
12144         /* Checking that ATOMIC32 src is not zero extended in place */
12145 #define BPF_ATOMIC32_SRC_ZEXT(op)                                       \
12146         {                                                               \
12147                 "ATOMIC_W_" #op ": src preserved in zext",              \
12148                 .u.insns_int = {                                        \
12149                         BPF_LD_IMM64(R0, 0x0123456789acbdefULL),        \
12150                         BPF_ALU64_REG(BPF_MOV, R1, R0),                 \
12151                         BPF_ST_MEM(BPF_W, R10, -4, 0),                  \
12152                         BPF_ATOMIC_OP(BPF_W, BPF_##op, R10, R1, -4),    \
12153                         BPF_ALU64_REG(BPF_SUB, R0, R1),                 \
12154                         BPF_ALU64_REG(BPF_MOV, R1, R0),                 \
12155                         BPF_ALU64_IMM(BPF_RSH, R1, 32),                 \
12156                         BPF_ALU64_REG(BPF_OR, R0, R1),                  \
12157                         BPF_EXIT_INSN(),                                \
12158                 },                                                      \
12159                 INTERNAL,                                               \
12160                 { },                                                    \
12161                 { { 0, 0 } },                                           \
12162                 .stack_depth = 8,                                       \
12163         }
12164         BPF_ATOMIC32_SRC_ZEXT(ADD),
12165         BPF_ATOMIC32_SRC_ZEXT(AND),
12166         BPF_ATOMIC32_SRC_ZEXT(OR),
12167         BPF_ATOMIC32_SRC_ZEXT(XOR),
12168 #undef BPF_ATOMIC32_SRC_ZEXT
12169         /* Checking that CMPXCHG32 src is not zero extended in place */
12170         {
12171                 "ATOMIC_W_CMPXCHG: src preserved in zext",
12172                 .u.insns_int = {
12173                         BPF_LD_IMM64(R1, 0x0123456789acbdefULL),
12174                         BPF_ALU64_REG(BPF_MOV, R2, R1),
12175                         BPF_ALU64_REG(BPF_MOV, R0, 0),
12176                         BPF_ST_MEM(BPF_W, R10, -4, 0),
12177                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R1, -4),
12178                         BPF_ALU64_REG(BPF_SUB, R1, R2),
12179                         BPF_ALU64_REG(BPF_MOV, R2, R1),
12180                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
12181                         BPF_ALU64_REG(BPF_OR, R1, R2),
12182                         BPF_ALU64_REG(BPF_MOV, R0, R1),
12183                         BPF_EXIT_INSN(),
12184                 },
12185                 INTERNAL,
12186                 { },
12187                 { { 0, 0 } },
12188                 .stack_depth = 8,
12189         },
12190         /* Checking that JMP32 immediate src is not zero extended in place */
12191 #define BPF_JMP32_IMM_ZEXT(op)                                  \
12192         {                                                       \
12193                 "JMP32_" #op "_K: operand preserved in zext",   \
12194                 .u.insns_int = {                                \
12195                         BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\
12196                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
12197                         BPF_JMP32_IMM(BPF_##op, R0, 1234, 1),   \
12198                         BPF_JMP_A(0), /* Nop */                 \
12199                         BPF_ALU64_REG(BPF_SUB, R0, R1),         \
12200                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
12201                         BPF_ALU64_IMM(BPF_RSH, R1, 32),         \
12202                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
12203                         BPF_EXIT_INSN(),                        \
12204                 },                                              \
12205                 INTERNAL,                                       \
12206                 { },                                            \
12207                 { { 0, 0 } },                                   \
12208         }
12209         BPF_JMP32_IMM_ZEXT(JEQ),
12210         BPF_JMP32_IMM_ZEXT(JNE),
12211         BPF_JMP32_IMM_ZEXT(JSET),
12212         BPF_JMP32_IMM_ZEXT(JGT),
12213         BPF_JMP32_IMM_ZEXT(JGE),
12214         BPF_JMP32_IMM_ZEXT(JLT),
12215         BPF_JMP32_IMM_ZEXT(JLE),
12216         BPF_JMP32_IMM_ZEXT(JSGT),
12217         BPF_JMP32_IMM_ZEXT(JSGE),
12218         BPF_JMP32_IMM_ZEXT(JSGT),
12219         BPF_JMP32_IMM_ZEXT(JSLT),
12220         BPF_JMP32_IMM_ZEXT(JSLE),
12221 #undef BPF_JMP2_IMM_ZEXT
12222         /* Checking that JMP32 dst & src are not zero extended in place */
12223 #define BPF_JMP32_REG_ZEXT(op)                                  \
12224         {                                                       \
12225                 "JMP32_" #op "_X: operands preserved in zext",  \
12226                 .u.insns_int = {                                \
12227                         BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\
12228                         BPF_LD_IMM64(R1, 0xfedcba9876543210ULL),\
12229                         BPF_ALU64_REG(BPF_MOV, R2, R0),         \
12230                         BPF_ALU64_REG(BPF_MOV, R3, R1),         \
12231                         BPF_JMP32_IMM(BPF_##op, R0, R1, 1),     \
12232                         BPF_JMP_A(0), /* Nop */                 \
12233                         BPF_ALU64_REG(BPF_SUB, R0, R2),         \
12234                         BPF_ALU64_REG(BPF_SUB, R1, R3),         \
12235                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
12236                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
12237                         BPF_ALU64_IMM(BPF_RSH, R1, 32),         \
12238                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
12239                         BPF_EXIT_INSN(),                        \
12240                 },                                              \
12241                 INTERNAL,                                       \
12242                 { },                                            \
12243                 { { 0, 0 } },                                   \
12244         }
12245         BPF_JMP32_REG_ZEXT(JEQ),
12246         BPF_JMP32_REG_ZEXT(JNE),
12247         BPF_JMP32_REG_ZEXT(JSET),
12248         BPF_JMP32_REG_ZEXT(JGT),
12249         BPF_JMP32_REG_ZEXT(JGE),
12250         BPF_JMP32_REG_ZEXT(JLT),
12251         BPF_JMP32_REG_ZEXT(JLE),
12252         BPF_JMP32_REG_ZEXT(JSGT),
12253         BPF_JMP32_REG_ZEXT(JSGE),
12254         BPF_JMP32_REG_ZEXT(JSGT),
12255         BPF_JMP32_REG_ZEXT(JSLT),
12256         BPF_JMP32_REG_ZEXT(JSLE),
12257 #undef BPF_JMP2_REG_ZEXT
12258         /* ALU64 K register combinations */
12259         {
12260                 "ALU64_MOV_K: registers",
12261                 { },
12262                 INTERNAL,
12263                 { },
12264                 { { 0, 1 } },
12265                 .fill_helper = bpf_fill_alu64_mov_imm_regs,
12266         },
12267         {
12268                 "ALU64_AND_K: registers",
12269                 { },
12270                 INTERNAL,
12271                 { },
12272                 { { 0, 1 } },
12273                 .fill_helper = bpf_fill_alu64_and_imm_regs,
12274         },
12275         {
12276                 "ALU64_OR_K: registers",
12277                 { },
12278                 INTERNAL,
12279                 { },
12280                 { { 0, 1 } },
12281                 .fill_helper = bpf_fill_alu64_or_imm_regs,
12282         },
12283         {
12284                 "ALU64_XOR_K: registers",
12285                 { },
12286                 INTERNAL,
12287                 { },
12288                 { { 0, 1 } },
12289                 .fill_helper = bpf_fill_alu64_xor_imm_regs,
12290         },
12291         {
12292                 "ALU64_LSH_K: registers",
12293                 { },
12294                 INTERNAL,
12295                 { },
12296                 { { 0, 1 } },
12297                 .fill_helper = bpf_fill_alu64_lsh_imm_regs,
12298         },
12299         {
12300                 "ALU64_RSH_K: registers",
12301                 { },
12302                 INTERNAL,
12303                 { },
12304                 { { 0, 1 } },
12305                 .fill_helper = bpf_fill_alu64_rsh_imm_regs,
12306         },
12307         {
12308                 "ALU64_ARSH_K: registers",
12309                 { },
12310                 INTERNAL,
12311                 { },
12312                 { { 0, 1 } },
12313                 .fill_helper = bpf_fill_alu64_arsh_imm_regs,
12314         },
12315         {
12316                 "ALU64_ADD_K: registers",
12317                 { },
12318                 INTERNAL,
12319                 { },
12320                 { { 0, 1 } },
12321                 .fill_helper = bpf_fill_alu64_add_imm_regs,
12322         },
12323         {
12324                 "ALU64_SUB_K: registers",
12325                 { },
12326                 INTERNAL,
12327                 { },
12328                 { { 0, 1 } },
12329                 .fill_helper = bpf_fill_alu64_sub_imm_regs,
12330         },
12331         {
12332                 "ALU64_MUL_K: registers",
12333                 { },
12334                 INTERNAL,
12335                 { },
12336                 { { 0, 1 } },
12337                 .fill_helper = bpf_fill_alu64_mul_imm_regs,
12338         },
12339         {
12340                 "ALU64_DIV_K: registers",
12341                 { },
12342                 INTERNAL,
12343                 { },
12344                 { { 0, 1 } },
12345                 .fill_helper = bpf_fill_alu64_div_imm_regs,
12346         },
12347         {
12348                 "ALU64_MOD_K: registers",
12349                 { },
12350                 INTERNAL,
12351                 { },
12352                 { { 0, 1 } },
12353                 .fill_helper = bpf_fill_alu64_mod_imm_regs,
12354         },
12355         /* ALU32 K registers */
12356         {
12357                 "ALU32_MOV_K: registers",
12358                 { },
12359                 INTERNAL,
12360                 { },
12361                 { { 0, 1 } },
12362                 .fill_helper = bpf_fill_alu32_mov_imm_regs,
12363         },
12364         {
12365                 "ALU32_AND_K: registers",
12366                 { },
12367                 INTERNAL,
12368                 { },
12369                 { { 0, 1 } },
12370                 .fill_helper = bpf_fill_alu32_and_imm_regs,
12371         },
12372         {
12373                 "ALU32_OR_K: registers",
12374                 { },
12375                 INTERNAL,
12376                 { },
12377                 { { 0, 1 } },
12378                 .fill_helper = bpf_fill_alu32_or_imm_regs,
12379         },
12380         {
12381                 "ALU32_XOR_K: registers",
12382                 { },
12383                 INTERNAL,
12384                 { },
12385                 { { 0, 1 } },
12386                 .fill_helper = bpf_fill_alu32_xor_imm_regs,
12387         },
12388         {
12389                 "ALU32_LSH_K: registers",
12390                 { },
12391                 INTERNAL,
12392                 { },
12393                 { { 0, 1 } },
12394                 .fill_helper = bpf_fill_alu32_lsh_imm_regs,
12395         },
12396         {
12397                 "ALU32_RSH_K: registers",
12398                 { },
12399                 INTERNAL,
12400                 { },
12401                 { { 0, 1 } },
12402                 .fill_helper = bpf_fill_alu32_rsh_imm_regs,
12403         },
12404         {
12405                 "ALU32_ARSH_K: registers",
12406                 { },
12407                 INTERNAL,
12408                 { },
12409                 { { 0, 1 } },
12410                 .fill_helper = bpf_fill_alu32_arsh_imm_regs,
12411         },
12412         {
12413                 "ALU32_ADD_K: registers",
12414                 { },
12415                 INTERNAL,
12416                 { },
12417                 { { 0, 1 } },
12418                 .fill_helper = bpf_fill_alu32_add_imm_regs,
12419         },
12420         {
12421                 "ALU32_SUB_K: registers",
12422                 { },
12423                 INTERNAL,
12424                 { },
12425                 { { 0, 1 } },
12426                 .fill_helper = bpf_fill_alu32_sub_imm_regs,
12427         },
12428         {
12429                 "ALU32_MUL_K: registers",
12430                 { },
12431                 INTERNAL,
12432                 { },
12433                 { { 0, 1 } },
12434                 .fill_helper = bpf_fill_alu32_mul_imm_regs,
12435         },
12436         {
12437                 "ALU32_DIV_K: registers",
12438                 { },
12439                 INTERNAL,
12440                 { },
12441                 { { 0, 1 } },
12442                 .fill_helper = bpf_fill_alu32_div_imm_regs,
12443         },
12444         {
12445                 "ALU32_MOD_K: registers",
12446                 { },
12447                 INTERNAL,
12448                 { },
12449                 { { 0, 1 } },
12450                 .fill_helper = bpf_fill_alu32_mod_imm_regs,
12451         },
12452         /* ALU64 X register combinations */
12453         {
12454                 "ALU64_MOV_X: register combinations",
12455                 { },
12456                 INTERNAL,
12457                 { },
12458                 { { 0, 1 } },
12459                 .fill_helper = bpf_fill_alu64_mov_reg_pairs,
12460         },
12461         {
12462                 "ALU64_AND_X: register combinations",
12463                 { },
12464                 INTERNAL,
12465                 { },
12466                 { { 0, 1 } },
12467                 .fill_helper = bpf_fill_alu64_and_reg_pairs,
12468         },
12469         {
12470                 "ALU64_OR_X: register combinations",
12471                 { },
12472                 INTERNAL,
12473                 { },
12474                 { { 0, 1 } },
12475                 .fill_helper = bpf_fill_alu64_or_reg_pairs,
12476         },
12477         {
12478                 "ALU64_XOR_X: register combinations",
12479                 { },
12480                 INTERNAL,
12481                 { },
12482                 { { 0, 1 } },
12483                 .fill_helper = bpf_fill_alu64_xor_reg_pairs,
12484         },
12485         {
12486                 "ALU64_LSH_X: register combinations",
12487                 { },
12488                 INTERNAL,
12489                 { },
12490                 { { 0, 1 } },
12491                 .fill_helper = bpf_fill_alu64_lsh_reg_pairs,
12492         },
12493         {
12494                 "ALU64_RSH_X: register combinations",
12495                 { },
12496                 INTERNAL,
12497                 { },
12498                 { { 0, 1 } },
12499                 .fill_helper = bpf_fill_alu64_rsh_reg_pairs,
12500         },
12501         {
12502                 "ALU64_ARSH_X: register combinations",
12503                 { },
12504                 INTERNAL,
12505                 { },
12506                 { { 0, 1 } },
12507                 .fill_helper = bpf_fill_alu64_arsh_reg_pairs,
12508         },
12509         {
12510                 "ALU64_ADD_X: register combinations",
12511                 { },
12512                 INTERNAL,
12513                 { },
12514                 { { 0, 1 } },
12515                 .fill_helper = bpf_fill_alu64_add_reg_pairs,
12516         },
12517         {
12518                 "ALU64_SUB_X: register combinations",
12519                 { },
12520                 INTERNAL,
12521                 { },
12522                 { { 0, 1 } },
12523                 .fill_helper = bpf_fill_alu64_sub_reg_pairs,
12524         },
12525         {
12526                 "ALU64_MUL_X: register combinations",
12527                 { },
12528                 INTERNAL,
12529                 { },
12530                 { { 0, 1 } },
12531                 .fill_helper = bpf_fill_alu64_mul_reg_pairs,
12532         },
12533         {
12534                 "ALU64_DIV_X: register combinations",
12535                 { },
12536                 INTERNAL,
12537                 { },
12538                 { { 0, 1 } },
12539                 .fill_helper = bpf_fill_alu64_div_reg_pairs,
12540         },
12541         {
12542                 "ALU64_MOD_X: register combinations",
12543                 { },
12544                 INTERNAL,
12545                 { },
12546                 { { 0, 1 } },
12547                 .fill_helper = bpf_fill_alu64_mod_reg_pairs,
12548         },
12549         /* ALU32 X register combinations */
12550         {
12551                 "ALU32_MOV_X: register combinations",
12552                 { },
12553                 INTERNAL,
12554                 { },
12555                 { { 0, 1 } },
12556                 .fill_helper = bpf_fill_alu32_mov_reg_pairs,
12557         },
12558         {
12559                 "ALU32_AND_X: register combinations",
12560                 { },
12561                 INTERNAL,
12562                 { },
12563                 { { 0, 1 } },
12564                 .fill_helper = bpf_fill_alu32_and_reg_pairs,
12565         },
12566         {
12567                 "ALU32_OR_X: register combinations",
12568                 { },
12569                 INTERNAL,
12570                 { },
12571                 { { 0, 1 } },
12572                 .fill_helper = bpf_fill_alu32_or_reg_pairs,
12573         },
12574         {
12575                 "ALU32_XOR_X: register combinations",
12576                 { },
12577                 INTERNAL,
12578                 { },
12579                 { { 0, 1 } },
12580                 .fill_helper = bpf_fill_alu32_xor_reg_pairs,
12581         },
12582         {
12583                 "ALU32_LSH_X: register combinations",
12584                 { },
12585                 INTERNAL,
12586                 { },
12587                 { { 0, 1 } },
12588                 .fill_helper = bpf_fill_alu32_lsh_reg_pairs,
12589         },
12590         {
12591                 "ALU32_RSH_X: register combinations",
12592                 { },
12593                 INTERNAL,
12594                 { },
12595                 { { 0, 1 } },
12596                 .fill_helper = bpf_fill_alu32_rsh_reg_pairs,
12597         },
12598         {
12599                 "ALU32_ARSH_X: register combinations",
12600                 { },
12601                 INTERNAL,
12602                 { },
12603                 { { 0, 1 } },
12604                 .fill_helper = bpf_fill_alu32_arsh_reg_pairs,
12605         },
12606         {
12607                 "ALU32_ADD_X: register combinations",
12608                 { },
12609                 INTERNAL,
12610                 { },
12611                 { { 0, 1 } },
12612                 .fill_helper = bpf_fill_alu32_add_reg_pairs,
12613         },
12614         {
12615                 "ALU32_SUB_X: register combinations",
12616                 { },
12617                 INTERNAL,
12618                 { },
12619                 { { 0, 1 } },
12620                 .fill_helper = bpf_fill_alu32_sub_reg_pairs,
12621         },
12622         {
12623                 "ALU32_MUL_X: register combinations",
12624                 { },
12625                 INTERNAL,
12626                 { },
12627                 { { 0, 1 } },
12628                 .fill_helper = bpf_fill_alu32_mul_reg_pairs,
12629         },
12630         {
12631                 "ALU32_DIV_X: register combinations",
12632                 { },
12633                 INTERNAL,
12634                 { },
12635                 { { 0, 1 } },
12636                 .fill_helper = bpf_fill_alu32_div_reg_pairs,
12637         },
12638         {
12639                 "ALU32_MOD_X register combinations",
12640                 { },
12641                 INTERNAL,
12642                 { },
12643                 { { 0, 1 } },
12644                 .fill_helper = bpf_fill_alu32_mod_reg_pairs,
12645         },
12646         /* Exhaustive test of ALU64 shift operations */
12647         {
12648                 "ALU64_LSH_K: all shift values",
12649                 { },
12650                 INTERNAL | FLAG_NO_DATA,
12651                 { },
12652                 { { 0, 1 } },
12653                 .fill_helper = bpf_fill_alu64_lsh_imm,
12654         },
12655         {
12656                 "ALU64_RSH_K: all shift values",
12657                 { },
12658                 INTERNAL | FLAG_NO_DATA,
12659                 { },
12660                 { { 0, 1 } },
12661                 .fill_helper = bpf_fill_alu64_rsh_imm,
12662         },
12663         {
12664                 "ALU64_ARSH_K: all shift values",
12665                 { },
12666                 INTERNAL | FLAG_NO_DATA,
12667                 { },
12668                 { { 0, 1 } },
12669                 .fill_helper = bpf_fill_alu64_arsh_imm,
12670         },
12671         {
12672                 "ALU64_LSH_X: all shift values",
12673                 { },
12674                 INTERNAL | FLAG_NO_DATA,
12675                 { },
12676                 { { 0, 1 } },
12677                 .fill_helper = bpf_fill_alu64_lsh_reg,
12678         },
12679         {
12680                 "ALU64_RSH_X: all shift values",
12681                 { },
12682                 INTERNAL | FLAG_NO_DATA,
12683                 { },
12684                 { { 0, 1 } },
12685                 .fill_helper = bpf_fill_alu64_rsh_reg,
12686         },
12687         {
12688                 "ALU64_ARSH_X: all shift values",
12689                 { },
12690                 INTERNAL | FLAG_NO_DATA,
12691                 { },
12692                 { { 0, 1 } },
12693                 .fill_helper = bpf_fill_alu64_arsh_reg,
12694         },
12695         /* Exhaustive test of ALU32 shift operations */
12696         {
12697                 "ALU32_LSH_K: all shift values",
12698                 { },
12699                 INTERNAL | FLAG_NO_DATA,
12700                 { },
12701                 { { 0, 1 } },
12702                 .fill_helper = bpf_fill_alu32_lsh_imm,
12703         },
12704         {
12705                 "ALU32_RSH_K: all shift values",
12706                 { },
12707                 INTERNAL | FLAG_NO_DATA,
12708                 { },
12709                 { { 0, 1 } },
12710                 .fill_helper = bpf_fill_alu32_rsh_imm,
12711         },
12712         {
12713                 "ALU32_ARSH_K: all shift values",
12714                 { },
12715                 INTERNAL | FLAG_NO_DATA,
12716                 { },
12717                 { { 0, 1 } },
12718                 .fill_helper = bpf_fill_alu32_arsh_imm,
12719         },
12720         {
12721                 "ALU32_LSH_X: all shift values",
12722                 { },
12723                 INTERNAL | FLAG_NO_DATA,
12724                 { },
12725                 { { 0, 1 } },
12726                 .fill_helper = bpf_fill_alu32_lsh_reg,
12727         },
12728         {
12729                 "ALU32_RSH_X: all shift values",
12730                 { },
12731                 INTERNAL | FLAG_NO_DATA,
12732                 { },
12733                 { { 0, 1 } },
12734                 .fill_helper = bpf_fill_alu32_rsh_reg,
12735         },
12736         {
12737                 "ALU32_ARSH_X: all shift values",
12738                 { },
12739                 INTERNAL | FLAG_NO_DATA,
12740                 { },
12741                 { { 0, 1 } },
12742                 .fill_helper = bpf_fill_alu32_arsh_reg,
12743         },
12744         /*
12745          * Exhaustive test of ALU64 shift operations when
12746          * source and destination register are the same.
12747          */
12748         {
12749                 "ALU64_LSH_X: all shift values with the same register",
12750                 { },
12751                 INTERNAL | FLAG_NO_DATA,
12752                 { },
12753                 { { 0, 1 } },
12754                 .fill_helper = bpf_fill_alu64_lsh_same_reg,
12755         },
12756         {
12757                 "ALU64_RSH_X: all shift values with the same register",
12758                 { },
12759                 INTERNAL | FLAG_NO_DATA,
12760                 { },
12761                 { { 0, 1 } },
12762                 .fill_helper = bpf_fill_alu64_rsh_same_reg,
12763         },
12764         {
12765                 "ALU64_ARSH_X: all shift values with the same register",
12766                 { },
12767                 INTERNAL | FLAG_NO_DATA,
12768                 { },
12769                 { { 0, 1 } },
12770                 .fill_helper = bpf_fill_alu64_arsh_same_reg,
12771         },
12772         /*
12773          * Exhaustive test of ALU32 shift operations when
12774          * source and destination register are the same.
12775          */
12776         {
12777                 "ALU32_LSH_X: all shift values with the same register",
12778                 { },
12779                 INTERNAL | FLAG_NO_DATA,
12780                 { },
12781                 { { 0, 1 } },
12782                 .fill_helper = bpf_fill_alu32_lsh_same_reg,
12783         },
12784         {
12785                 "ALU32_RSH_X: all shift values with the same register",
12786                 { },
12787                 INTERNAL | FLAG_NO_DATA,
12788                 { },
12789                 { { 0, 1 } },
12790                 .fill_helper = bpf_fill_alu32_rsh_same_reg,
12791         },
12792         {
12793                 "ALU32_ARSH_X: all shift values with the same register",
12794                 { },
12795                 INTERNAL | FLAG_NO_DATA,
12796                 { },
12797                 { { 0, 1 } },
12798                 .fill_helper = bpf_fill_alu32_arsh_same_reg,
12799         },
12800         /* ALU64 immediate magnitudes */
12801         {
12802                 "ALU64_MOV_K: all immediate value magnitudes",
12803                 { },
12804                 INTERNAL | FLAG_NO_DATA,
12805                 { },
12806                 { { 0, 1 } },
12807                 .fill_helper = bpf_fill_alu64_mov_imm,
12808                 .nr_testruns = NR_PATTERN_RUNS,
12809         },
12810         {
12811                 "ALU64_AND_K: all immediate value magnitudes",
12812                 { },
12813                 INTERNAL | FLAG_NO_DATA,
12814                 { },
12815                 { { 0, 1 } },
12816                 .fill_helper = bpf_fill_alu64_and_imm,
12817                 .nr_testruns = NR_PATTERN_RUNS,
12818         },
12819         {
12820                 "ALU64_OR_K: all immediate value magnitudes",
12821                 { },
12822                 INTERNAL | FLAG_NO_DATA,
12823                 { },
12824                 { { 0, 1 } },
12825                 .fill_helper = bpf_fill_alu64_or_imm,
12826                 .nr_testruns = NR_PATTERN_RUNS,
12827         },
12828         {
12829                 "ALU64_XOR_K: all immediate value magnitudes",
12830                 { },
12831                 INTERNAL | FLAG_NO_DATA,
12832                 { },
12833                 { { 0, 1 } },
12834                 .fill_helper = bpf_fill_alu64_xor_imm,
12835                 .nr_testruns = NR_PATTERN_RUNS,
12836         },
12837         {
12838                 "ALU64_ADD_K: all immediate value magnitudes",
12839                 { },
12840                 INTERNAL | FLAG_NO_DATA,
12841                 { },
12842                 { { 0, 1 } },
12843                 .fill_helper = bpf_fill_alu64_add_imm,
12844                 .nr_testruns = NR_PATTERN_RUNS,
12845         },
12846         {
12847                 "ALU64_SUB_K: all immediate value magnitudes",
12848                 { },
12849                 INTERNAL | FLAG_NO_DATA,
12850                 { },
12851                 { { 0, 1 } },
12852                 .fill_helper = bpf_fill_alu64_sub_imm,
12853                 .nr_testruns = NR_PATTERN_RUNS,
12854         },
12855         {
12856                 "ALU64_MUL_K: all immediate value magnitudes",
12857                 { },
12858                 INTERNAL | FLAG_NO_DATA,
12859                 { },
12860                 { { 0, 1 } },
12861                 .fill_helper = bpf_fill_alu64_mul_imm,
12862                 .nr_testruns = NR_PATTERN_RUNS,
12863         },
12864         {
12865                 "ALU64_DIV_K: all immediate value magnitudes",
12866                 { },
12867                 INTERNAL | FLAG_NO_DATA,
12868                 { },
12869                 { { 0, 1 } },
12870                 .fill_helper = bpf_fill_alu64_div_imm,
12871                 .nr_testruns = NR_PATTERN_RUNS,
12872         },
12873         {
12874                 "ALU64_MOD_K: all immediate value magnitudes",
12875                 { },
12876                 INTERNAL | FLAG_NO_DATA,
12877                 { },
12878                 { { 0, 1 } },
12879                 .fill_helper = bpf_fill_alu64_mod_imm,
12880                 .nr_testruns = NR_PATTERN_RUNS,
12881         },
12882         /* ALU32 immediate magnitudes */
12883         {
12884                 "ALU32_MOV_K: all immediate value magnitudes",
12885                 { },
12886                 INTERNAL | FLAG_NO_DATA,
12887                 { },
12888                 { { 0, 1 } },
12889                 .fill_helper = bpf_fill_alu32_mov_imm,
12890                 .nr_testruns = NR_PATTERN_RUNS,
12891         },
12892         {
12893                 "ALU32_AND_K: all immediate value magnitudes",
12894                 { },
12895                 INTERNAL | FLAG_NO_DATA,
12896                 { },
12897                 { { 0, 1 } },
12898                 .fill_helper = bpf_fill_alu32_and_imm,
12899                 .nr_testruns = NR_PATTERN_RUNS,
12900         },
12901         {
12902                 "ALU32_OR_K: all immediate value magnitudes",
12903                 { },
12904                 INTERNAL | FLAG_NO_DATA,
12905                 { },
12906                 { { 0, 1 } },
12907                 .fill_helper = bpf_fill_alu32_or_imm,
12908                 .nr_testruns = NR_PATTERN_RUNS,
12909         },
12910         {
12911                 "ALU32_XOR_K: all immediate value magnitudes",
12912                 { },
12913                 INTERNAL | FLAG_NO_DATA,
12914                 { },
12915                 { { 0, 1 } },
12916                 .fill_helper = bpf_fill_alu32_xor_imm,
12917                 .nr_testruns = NR_PATTERN_RUNS,
12918         },
12919         {
12920                 "ALU32_ADD_K: all immediate value magnitudes",
12921                 { },
12922                 INTERNAL | FLAG_NO_DATA,
12923                 { },
12924                 { { 0, 1 } },
12925                 .fill_helper = bpf_fill_alu32_add_imm,
12926                 .nr_testruns = NR_PATTERN_RUNS,
12927         },
12928         {
12929                 "ALU32_SUB_K: all immediate value magnitudes",
12930                 { },
12931                 INTERNAL | FLAG_NO_DATA,
12932                 { },
12933                 { { 0, 1 } },
12934                 .fill_helper = bpf_fill_alu32_sub_imm,
12935                 .nr_testruns = NR_PATTERN_RUNS,
12936         },
12937         {
12938                 "ALU32_MUL_K: all immediate value magnitudes",
12939                 { },
12940                 INTERNAL | FLAG_NO_DATA,
12941                 { },
12942                 { { 0, 1 } },
12943                 .fill_helper = bpf_fill_alu32_mul_imm,
12944                 .nr_testruns = NR_PATTERN_RUNS,
12945         },
12946         {
12947                 "ALU32_DIV_K: all immediate value magnitudes",
12948                 { },
12949                 INTERNAL | FLAG_NO_DATA,
12950                 { },
12951                 { { 0, 1 } },
12952                 .fill_helper = bpf_fill_alu32_div_imm,
12953                 .nr_testruns = NR_PATTERN_RUNS,
12954         },
12955         {
12956                 "ALU32_MOD_K: all immediate value magnitudes",
12957                 { },
12958                 INTERNAL | FLAG_NO_DATA,
12959                 { },
12960                 { { 0, 1 } },
12961                 .fill_helper = bpf_fill_alu32_mod_imm,
12962                 .nr_testruns = NR_PATTERN_RUNS,
12963         },
12964         /* ALU64 register magnitudes */
12965         {
12966                 "ALU64_MOV_X: all register value magnitudes",
12967                 { },
12968                 INTERNAL | FLAG_NO_DATA,
12969                 { },
12970                 { { 0, 1 } },
12971                 .fill_helper = bpf_fill_alu64_mov_reg,
12972                 .nr_testruns = NR_PATTERN_RUNS,
12973         },
12974         {
12975                 "ALU64_AND_X: all register value magnitudes",
12976                 { },
12977                 INTERNAL | FLAG_NO_DATA,
12978                 { },
12979                 { { 0, 1 } },
12980                 .fill_helper = bpf_fill_alu64_and_reg,
12981                 .nr_testruns = NR_PATTERN_RUNS,
12982         },
12983         {
12984                 "ALU64_OR_X: all register value magnitudes",
12985                 { },
12986                 INTERNAL | FLAG_NO_DATA,
12987                 { },
12988                 { { 0, 1 } },
12989                 .fill_helper = bpf_fill_alu64_or_reg,
12990                 .nr_testruns = NR_PATTERN_RUNS,
12991         },
12992         {
12993                 "ALU64_XOR_X: all register value magnitudes",
12994                 { },
12995                 INTERNAL | FLAG_NO_DATA,
12996                 { },
12997                 { { 0, 1 } },
12998                 .fill_helper = bpf_fill_alu64_xor_reg,
12999                 .nr_testruns = NR_PATTERN_RUNS,
13000         },
13001         {
13002                 "ALU64_ADD_X: all register value magnitudes",
13003                 { },
13004                 INTERNAL | FLAG_NO_DATA,
13005                 { },
13006                 { { 0, 1 } },
13007                 .fill_helper = bpf_fill_alu64_add_reg,
13008                 .nr_testruns = NR_PATTERN_RUNS,
13009         },
13010         {
13011                 "ALU64_SUB_X: all register value magnitudes",
13012                 { },
13013                 INTERNAL | FLAG_NO_DATA,
13014                 { },
13015                 { { 0, 1 } },
13016                 .fill_helper = bpf_fill_alu64_sub_reg,
13017                 .nr_testruns = NR_PATTERN_RUNS,
13018         },
13019         {
13020                 "ALU64_MUL_X: all register value magnitudes",
13021                 { },
13022                 INTERNAL | FLAG_NO_DATA,
13023                 { },
13024                 { { 0, 1 } },
13025                 .fill_helper = bpf_fill_alu64_mul_reg,
13026                 .nr_testruns = NR_PATTERN_RUNS,
13027         },
13028         {
13029                 "ALU64_DIV_X: all register value magnitudes",
13030                 { },
13031                 INTERNAL | FLAG_NO_DATA,
13032                 { },
13033                 { { 0, 1 } },
13034                 .fill_helper = bpf_fill_alu64_div_reg,
13035                 .nr_testruns = NR_PATTERN_RUNS,
13036         },
13037         {
13038                 "ALU64_MOD_X: all register value magnitudes",
13039                 { },
13040                 INTERNAL | FLAG_NO_DATA,
13041                 { },
13042                 { { 0, 1 } },
13043                 .fill_helper = bpf_fill_alu64_mod_reg,
13044                 .nr_testruns = NR_PATTERN_RUNS,
13045         },
13046         /* ALU32 register magnitudes */
13047         {
13048                 "ALU32_MOV_X: all register value magnitudes",
13049                 { },
13050                 INTERNAL | FLAG_NO_DATA,
13051                 { },
13052                 { { 0, 1 } },
13053                 .fill_helper = bpf_fill_alu32_mov_reg,
13054                 .nr_testruns = NR_PATTERN_RUNS,
13055         },
13056         {
13057                 "ALU32_AND_X: all register value magnitudes",
13058                 { },
13059                 INTERNAL | FLAG_NO_DATA,
13060                 { },
13061                 { { 0, 1 } },
13062                 .fill_helper = bpf_fill_alu32_and_reg,
13063                 .nr_testruns = NR_PATTERN_RUNS,
13064         },
13065         {
13066                 "ALU32_OR_X: all register value magnitudes",
13067                 { },
13068                 INTERNAL | FLAG_NO_DATA,
13069                 { },
13070                 { { 0, 1 } },
13071                 .fill_helper = bpf_fill_alu32_or_reg,
13072                 .nr_testruns = NR_PATTERN_RUNS,
13073         },
13074         {
13075                 "ALU32_XOR_X: all register value magnitudes",
13076                 { },
13077                 INTERNAL | FLAG_NO_DATA,
13078                 { },
13079                 { { 0, 1 } },
13080                 .fill_helper = bpf_fill_alu32_xor_reg,
13081                 .nr_testruns = NR_PATTERN_RUNS,
13082         },
13083         {
13084                 "ALU32_ADD_X: all register value magnitudes",
13085                 { },
13086                 INTERNAL | FLAG_NO_DATA,
13087                 { },
13088                 { { 0, 1 } },
13089                 .fill_helper = bpf_fill_alu32_add_reg,
13090                 .nr_testruns = NR_PATTERN_RUNS,
13091         },
13092         {
13093                 "ALU32_SUB_X: all register value magnitudes",
13094                 { },
13095                 INTERNAL | FLAG_NO_DATA,
13096                 { },
13097                 { { 0, 1 } },
13098                 .fill_helper = bpf_fill_alu32_sub_reg,
13099                 .nr_testruns = NR_PATTERN_RUNS,
13100         },
13101         {
13102                 "ALU32_MUL_X: all register value magnitudes",
13103                 { },
13104                 INTERNAL | FLAG_NO_DATA,
13105                 { },
13106                 { { 0, 1 } },
13107                 .fill_helper = bpf_fill_alu32_mul_reg,
13108                 .nr_testruns = NR_PATTERN_RUNS,
13109         },
13110         {
13111                 "ALU32_DIV_X: all register value magnitudes",
13112                 { },
13113                 INTERNAL | FLAG_NO_DATA,
13114                 { },
13115                 { { 0, 1 } },
13116                 .fill_helper = bpf_fill_alu32_div_reg,
13117                 .nr_testruns = NR_PATTERN_RUNS,
13118         },
13119         {
13120                 "ALU32_MOD_X: all register value magnitudes",
13121                 { },
13122                 INTERNAL | FLAG_NO_DATA,
13123                 { },
13124                 { { 0, 1 } },
13125                 .fill_helper = bpf_fill_alu32_mod_reg,
13126                 .nr_testruns = NR_PATTERN_RUNS,
13127         },
13128         /* LD_IMM64 immediate magnitudes and byte patterns */
13129         {
13130                 "LD_IMM64: all immediate value magnitudes",
13131                 { },
13132                 INTERNAL | FLAG_NO_DATA,
13133                 { },
13134                 { { 0, 1 } },
13135                 .fill_helper = bpf_fill_ld_imm64_magn,
13136         },
13137         {
13138                 "LD_IMM64: checker byte patterns",
13139                 { },
13140                 INTERNAL | FLAG_NO_DATA,
13141                 { },
13142                 { { 0, 1 } },
13143                 .fill_helper = bpf_fill_ld_imm64_checker,
13144         },
13145         {
13146                 "LD_IMM64: random positive and zero byte patterns",
13147                 { },
13148                 INTERNAL | FLAG_NO_DATA,
13149                 { },
13150                 { { 0, 1 } },
13151                 .fill_helper = bpf_fill_ld_imm64_pos_zero,
13152         },
13153         {
13154                 "LD_IMM64: random negative and zero byte patterns",
13155                 { },
13156                 INTERNAL | FLAG_NO_DATA,
13157                 { },
13158                 { { 0, 1 } },
13159                 .fill_helper = bpf_fill_ld_imm64_neg_zero,
13160         },
13161         {
13162                 "LD_IMM64: random positive and negative byte patterns",
13163                 { },
13164                 INTERNAL | FLAG_NO_DATA,
13165                 { },
13166                 { { 0, 1 } },
13167                 .fill_helper = bpf_fill_ld_imm64_pos_neg,
13168         },
13169         /* 64-bit ATOMIC register combinations */
13170         {
13171                 "ATOMIC_DW_ADD: register combinations",
13172                 { },
13173                 INTERNAL,
13174                 { },
13175                 { { 0, 1 } },
13176                 .fill_helper = bpf_fill_atomic64_add_reg_pairs,
13177                 .stack_depth = 8,
13178         },
13179         {
13180                 "ATOMIC_DW_AND: register combinations",
13181                 { },
13182                 INTERNAL,
13183                 { },
13184                 { { 0, 1 } },
13185                 .fill_helper = bpf_fill_atomic64_and_reg_pairs,
13186                 .stack_depth = 8,
13187         },
13188         {
13189                 "ATOMIC_DW_OR: register combinations",
13190                 { },
13191                 INTERNAL,
13192                 { },
13193                 { { 0, 1 } },
13194                 .fill_helper = bpf_fill_atomic64_or_reg_pairs,
13195                 .stack_depth = 8,
13196         },
13197         {
13198                 "ATOMIC_DW_XOR: register combinations",
13199                 { },
13200                 INTERNAL,
13201                 { },
13202                 { { 0, 1 } },
13203                 .fill_helper = bpf_fill_atomic64_xor_reg_pairs,
13204                 .stack_depth = 8,
13205         },
13206         {
13207                 "ATOMIC_DW_ADD_FETCH: register combinations",
13208                 { },
13209                 INTERNAL,
13210                 { },
13211                 { { 0, 1 } },
13212                 .fill_helper = bpf_fill_atomic64_add_fetch_reg_pairs,
13213                 .stack_depth = 8,
13214         },
13215         {
13216                 "ATOMIC_DW_AND_FETCH: register combinations",
13217                 { },
13218                 INTERNAL,
13219                 { },
13220                 { { 0, 1 } },
13221                 .fill_helper = bpf_fill_atomic64_and_fetch_reg_pairs,
13222                 .stack_depth = 8,
13223         },
13224         {
13225                 "ATOMIC_DW_OR_FETCH: register combinations",
13226                 { },
13227                 INTERNAL,
13228                 { },
13229                 { { 0, 1 } },
13230                 .fill_helper = bpf_fill_atomic64_or_fetch_reg_pairs,
13231                 .stack_depth = 8,
13232         },
13233         {
13234                 "ATOMIC_DW_XOR_FETCH: register combinations",
13235                 { },
13236                 INTERNAL,
13237                 { },
13238                 { { 0, 1 } },
13239                 .fill_helper = bpf_fill_atomic64_xor_fetch_reg_pairs,
13240                 .stack_depth = 8,
13241         },
13242         {
13243                 "ATOMIC_DW_XCHG: register combinations",
13244                 { },
13245                 INTERNAL,
13246                 { },
13247                 { { 0, 1 } },
13248                 .fill_helper = bpf_fill_atomic64_xchg_reg_pairs,
13249                 .stack_depth = 8,
13250         },
13251         {
13252                 "ATOMIC_DW_CMPXCHG: register combinations",
13253                 { },
13254                 INTERNAL,
13255                 { },
13256                 { { 0, 1 } },
13257                 .fill_helper = bpf_fill_atomic64_cmpxchg_reg_pairs,
13258                 .stack_depth = 8,
13259         },
13260         /* 32-bit ATOMIC register combinations */
13261         {
13262                 "ATOMIC_W_ADD: register combinations",
13263                 { },
13264                 INTERNAL,
13265                 { },
13266                 { { 0, 1 } },
13267                 .fill_helper = bpf_fill_atomic32_add_reg_pairs,
13268                 .stack_depth = 8,
13269         },
13270         {
13271                 "ATOMIC_W_AND: register combinations",
13272                 { },
13273                 INTERNAL,
13274                 { },
13275                 { { 0, 1 } },
13276                 .fill_helper = bpf_fill_atomic32_and_reg_pairs,
13277                 .stack_depth = 8,
13278         },
13279         {
13280                 "ATOMIC_W_OR: register combinations",
13281                 { },
13282                 INTERNAL,
13283                 { },
13284                 { { 0, 1 } },
13285                 .fill_helper = bpf_fill_atomic32_or_reg_pairs,
13286                 .stack_depth = 8,
13287         },
13288         {
13289                 "ATOMIC_W_XOR: register combinations",
13290                 { },
13291                 INTERNAL,
13292                 { },
13293                 { { 0, 1 } },
13294                 .fill_helper = bpf_fill_atomic32_xor_reg_pairs,
13295                 .stack_depth = 8,
13296         },
13297         {
13298                 "ATOMIC_W_ADD_FETCH: register combinations",
13299                 { },
13300                 INTERNAL,
13301                 { },
13302                 { { 0, 1 } },
13303                 .fill_helper = bpf_fill_atomic32_add_fetch_reg_pairs,
13304                 .stack_depth = 8,
13305         },
13306         {
13307                 "ATOMIC_W_AND_FETCH: register combinations",
13308                 { },
13309                 INTERNAL,
13310                 { },
13311                 { { 0, 1 } },
13312                 .fill_helper = bpf_fill_atomic32_and_fetch_reg_pairs,
13313                 .stack_depth = 8,
13314         },
13315         {
13316                 "ATOMIC_W_OR_FETCH: register combinations",
13317                 { },
13318                 INTERNAL,
13319                 { },
13320                 { { 0, 1 } },
13321                 .fill_helper = bpf_fill_atomic32_or_fetch_reg_pairs,
13322                 .stack_depth = 8,
13323         },
13324         {
13325                 "ATOMIC_W_XOR_FETCH: register combinations",
13326                 { },
13327                 INTERNAL,
13328                 { },
13329                 { { 0, 1 } },
13330                 .fill_helper = bpf_fill_atomic32_xor_fetch_reg_pairs,
13331                 .stack_depth = 8,
13332         },
13333         {
13334                 "ATOMIC_W_XCHG: register combinations",
13335                 { },
13336                 INTERNAL,
13337                 { },
13338                 { { 0, 1 } },
13339                 .fill_helper = bpf_fill_atomic32_xchg_reg_pairs,
13340                 .stack_depth = 8,
13341         },
13342         {
13343                 "ATOMIC_W_CMPXCHG: register combinations",
13344                 { },
13345                 INTERNAL,
13346                 { },
13347                 { { 0, 1 } },
13348                 .fill_helper = bpf_fill_atomic32_cmpxchg_reg_pairs,
13349                 .stack_depth = 8,
13350         },
13351         /* 64-bit ATOMIC magnitudes */
13352         {
13353                 "ATOMIC_DW_ADD: all operand magnitudes",
13354                 { },
13355                 INTERNAL | FLAG_NO_DATA,
13356                 { },
13357                 { { 0, 1 } },
13358                 .fill_helper = bpf_fill_atomic64_add,
13359                 .stack_depth = 8,
13360                 .nr_testruns = NR_PATTERN_RUNS,
13361         },
13362         {
13363                 "ATOMIC_DW_AND: all operand magnitudes",
13364                 { },
13365                 INTERNAL | FLAG_NO_DATA,
13366                 { },
13367                 { { 0, 1 } },
13368                 .fill_helper = bpf_fill_atomic64_and,
13369                 .stack_depth = 8,
13370                 .nr_testruns = NR_PATTERN_RUNS,
13371         },
13372         {
13373                 "ATOMIC_DW_OR: all operand magnitudes",
13374                 { },
13375                 INTERNAL | FLAG_NO_DATA,
13376                 { },
13377                 { { 0, 1 } },
13378                 .fill_helper = bpf_fill_atomic64_or,
13379                 .stack_depth = 8,
13380                 .nr_testruns = NR_PATTERN_RUNS,
13381         },
13382         {
13383                 "ATOMIC_DW_XOR: all operand magnitudes",
13384                 { },
13385                 INTERNAL | FLAG_NO_DATA,
13386                 { },
13387                 { { 0, 1 } },
13388                 .fill_helper = bpf_fill_atomic64_xor,
13389                 .stack_depth = 8,
13390                 .nr_testruns = NR_PATTERN_RUNS,
13391         },
13392         {
13393                 "ATOMIC_DW_ADD_FETCH: all operand magnitudes",
13394                 { },
13395                 INTERNAL | FLAG_NO_DATA,
13396                 { },
13397                 { { 0, 1 } },
13398                 .fill_helper = bpf_fill_atomic64_add_fetch,
13399                 .stack_depth = 8,
13400                 .nr_testruns = NR_PATTERN_RUNS,
13401         },
13402         {
13403                 "ATOMIC_DW_AND_FETCH: all operand magnitudes",
13404                 { },
13405                 INTERNAL | FLAG_NO_DATA,
13406                 { },
13407                 { { 0, 1 } },
13408                 .fill_helper = bpf_fill_atomic64_and_fetch,
13409                 .stack_depth = 8,
13410                 .nr_testruns = NR_PATTERN_RUNS,
13411         },
13412         {
13413                 "ATOMIC_DW_OR_FETCH: all operand magnitudes",
13414                 { },
13415                 INTERNAL | FLAG_NO_DATA,
13416                 { },
13417                 { { 0, 1 } },
13418                 .fill_helper = bpf_fill_atomic64_or_fetch,
13419                 .stack_depth = 8,
13420                 .nr_testruns = NR_PATTERN_RUNS,
13421         },
13422         {
13423                 "ATOMIC_DW_XOR_FETCH: all operand magnitudes",
13424                 { },
13425                 INTERNAL | FLAG_NO_DATA,
13426                 { },
13427                 { { 0, 1 } },
13428                 .fill_helper = bpf_fill_atomic64_xor_fetch,
13429                 .stack_depth = 8,
13430                 .nr_testruns = NR_PATTERN_RUNS,
13431         },
13432         {
13433                 "ATOMIC_DW_XCHG: all operand magnitudes",
13434                 { },
13435                 INTERNAL | FLAG_NO_DATA,
13436                 { },
13437                 { { 0, 1 } },
13438                 .fill_helper = bpf_fill_atomic64_xchg,
13439                 .stack_depth = 8,
13440                 .nr_testruns = NR_PATTERN_RUNS,
13441         },
13442         {
13443                 "ATOMIC_DW_CMPXCHG: all operand magnitudes",
13444                 { },
13445                 INTERNAL | FLAG_NO_DATA,
13446                 { },
13447                 { { 0, 1 } },
13448                 .fill_helper = bpf_fill_cmpxchg64,
13449                 .stack_depth = 8,
13450                 .nr_testruns = NR_PATTERN_RUNS,
13451         },
13452         /* 64-bit atomic magnitudes */
13453         {
13454                 "ATOMIC_W_ADD: all operand magnitudes",
13455                 { },
13456                 INTERNAL | FLAG_NO_DATA,
13457                 { },
13458                 { { 0, 1 } },
13459                 .fill_helper = bpf_fill_atomic32_add,
13460                 .stack_depth = 8,
13461                 .nr_testruns = NR_PATTERN_RUNS,
13462         },
13463         {
13464                 "ATOMIC_W_AND: all operand magnitudes",
13465                 { },
13466                 INTERNAL | FLAG_NO_DATA,
13467                 { },
13468                 { { 0, 1 } },
13469                 .fill_helper = bpf_fill_atomic32_and,
13470                 .stack_depth = 8,
13471                 .nr_testruns = NR_PATTERN_RUNS,
13472         },
13473         {
13474                 "ATOMIC_W_OR: all operand magnitudes",
13475                 { },
13476                 INTERNAL | FLAG_NO_DATA,
13477                 { },
13478                 { { 0, 1 } },
13479                 .fill_helper = bpf_fill_atomic32_or,
13480                 .stack_depth = 8,
13481                 .nr_testruns = NR_PATTERN_RUNS,
13482         },
13483         {
13484                 "ATOMIC_W_XOR: all operand magnitudes",
13485                 { },
13486                 INTERNAL | FLAG_NO_DATA,
13487                 { },
13488                 { { 0, 1 } },
13489                 .fill_helper = bpf_fill_atomic32_xor,
13490                 .stack_depth = 8,
13491                 .nr_testruns = NR_PATTERN_RUNS,
13492         },
13493         {
13494                 "ATOMIC_W_ADD_FETCH: all operand magnitudes",
13495                 { },
13496                 INTERNAL | FLAG_NO_DATA,
13497                 { },
13498                 { { 0, 1 } },
13499                 .fill_helper = bpf_fill_atomic32_add_fetch,
13500                 .stack_depth = 8,
13501                 .nr_testruns = NR_PATTERN_RUNS,
13502         },
13503         {
13504                 "ATOMIC_W_AND_FETCH: all operand magnitudes",
13505                 { },
13506                 INTERNAL | FLAG_NO_DATA,
13507                 { },
13508                 { { 0, 1 } },
13509                 .fill_helper = bpf_fill_atomic32_and_fetch,
13510                 .stack_depth = 8,
13511                 .nr_testruns = NR_PATTERN_RUNS,
13512         },
13513         {
13514                 "ATOMIC_W_OR_FETCH: all operand magnitudes",
13515                 { },
13516                 INTERNAL | FLAG_NO_DATA,
13517                 { },
13518                 { { 0, 1 } },
13519                 .fill_helper = bpf_fill_atomic32_or_fetch,
13520                 .stack_depth = 8,
13521                 .nr_testruns = NR_PATTERN_RUNS,
13522         },
13523         {
13524                 "ATOMIC_W_XOR_FETCH: all operand magnitudes",
13525                 { },
13526                 INTERNAL | FLAG_NO_DATA,
13527                 { },
13528                 { { 0, 1 } },
13529                 .fill_helper = bpf_fill_atomic32_xor_fetch,
13530                 .stack_depth = 8,
13531                 .nr_testruns = NR_PATTERN_RUNS,
13532         },
13533         {
13534                 "ATOMIC_W_XCHG: all operand magnitudes",
13535                 { },
13536                 INTERNAL | FLAG_NO_DATA,
13537                 { },
13538                 { { 0, 1 } },
13539                 .fill_helper = bpf_fill_atomic32_xchg,
13540                 .stack_depth = 8,
13541                 .nr_testruns = NR_PATTERN_RUNS,
13542         },
13543         {
13544                 "ATOMIC_W_CMPXCHG: all operand magnitudes",
13545                 { },
13546                 INTERNAL | FLAG_NO_DATA,
13547                 { },
13548                 { { 0, 1 } },
13549                 .fill_helper = bpf_fill_cmpxchg32,
13550                 .stack_depth = 8,
13551                 .nr_testruns = NR_PATTERN_RUNS,
13552         },
13553         /* JMP immediate magnitudes */
13554         {
13555                 "JMP_JSET_K: all immediate value magnitudes",
13556                 { },
13557                 INTERNAL | FLAG_NO_DATA,
13558                 { },
13559                 { { 0, 1 } },
13560                 .fill_helper = bpf_fill_jmp_jset_imm,
13561                 .nr_testruns = NR_PATTERN_RUNS,
13562         },
13563         {
13564                 "JMP_JEQ_K: all immediate value magnitudes",
13565                 { },
13566                 INTERNAL | FLAG_NO_DATA,
13567                 { },
13568                 { { 0, 1 } },
13569                 .fill_helper = bpf_fill_jmp_jeq_imm,
13570                 .nr_testruns = NR_PATTERN_RUNS,
13571         },
13572         {
13573                 "JMP_JNE_K: all immediate value magnitudes",
13574                 { },
13575                 INTERNAL | FLAG_NO_DATA,
13576                 { },
13577                 { { 0, 1 } },
13578                 .fill_helper = bpf_fill_jmp_jne_imm,
13579                 .nr_testruns = NR_PATTERN_RUNS,
13580         },
13581         {
13582                 "JMP_JGT_K: all immediate value magnitudes",
13583                 { },
13584                 INTERNAL | FLAG_NO_DATA,
13585                 { },
13586                 { { 0, 1 } },
13587                 .fill_helper = bpf_fill_jmp_jgt_imm,
13588                 .nr_testruns = NR_PATTERN_RUNS,
13589         },
13590         {
13591                 "JMP_JGE_K: all immediate value magnitudes",
13592                 { },
13593                 INTERNAL | FLAG_NO_DATA,
13594                 { },
13595                 { { 0, 1 } },
13596                 .fill_helper = bpf_fill_jmp_jge_imm,
13597                 .nr_testruns = NR_PATTERN_RUNS,
13598         },
13599         {
13600                 "JMP_JLT_K: all immediate value magnitudes",
13601                 { },
13602                 INTERNAL | FLAG_NO_DATA,
13603                 { },
13604                 { { 0, 1 } },
13605                 .fill_helper = bpf_fill_jmp_jlt_imm,
13606                 .nr_testruns = NR_PATTERN_RUNS,
13607         },
13608         {
13609                 "JMP_JLE_K: all immediate value magnitudes",
13610                 { },
13611                 INTERNAL | FLAG_NO_DATA,
13612                 { },
13613                 { { 0, 1 } },
13614                 .fill_helper = bpf_fill_jmp_jle_imm,
13615                 .nr_testruns = NR_PATTERN_RUNS,
13616         },
13617         {
13618                 "JMP_JSGT_K: all immediate value magnitudes",
13619                 { },
13620                 INTERNAL | FLAG_NO_DATA,
13621                 { },
13622                 { { 0, 1 } },
13623                 .fill_helper = bpf_fill_jmp_jsgt_imm,
13624                 .nr_testruns = NR_PATTERN_RUNS,
13625         },
13626         {
13627                 "JMP_JSGE_K: all immediate value magnitudes",
13628                 { },
13629                 INTERNAL | FLAG_NO_DATA,
13630                 { },
13631                 { { 0, 1 } },
13632                 .fill_helper = bpf_fill_jmp_jsge_imm,
13633                 .nr_testruns = NR_PATTERN_RUNS,
13634         },
13635         {
13636                 "JMP_JSLT_K: all immediate value magnitudes",
13637                 { },
13638                 INTERNAL | FLAG_NO_DATA,
13639                 { },
13640                 { { 0, 1 } },
13641                 .fill_helper = bpf_fill_jmp_jslt_imm,
13642                 .nr_testruns = NR_PATTERN_RUNS,
13643         },
13644         {
13645                 "JMP_JSLE_K: all immediate value magnitudes",
13646                 { },
13647                 INTERNAL | FLAG_NO_DATA,
13648                 { },
13649                 { { 0, 1 } },
13650                 .fill_helper = bpf_fill_jmp_jsle_imm,
13651                 .nr_testruns = NR_PATTERN_RUNS,
13652         },
13653         /* JMP register magnitudes */
13654         {
13655                 "JMP_JSET_X: all register value magnitudes",
13656                 { },
13657                 INTERNAL | FLAG_NO_DATA,
13658                 { },
13659                 { { 0, 1 } },
13660                 .fill_helper = bpf_fill_jmp_jset_reg,
13661                 .nr_testruns = NR_PATTERN_RUNS,
13662         },
13663         {
13664                 "JMP_JEQ_X: all register value magnitudes",
13665                 { },
13666                 INTERNAL | FLAG_NO_DATA,
13667                 { },
13668                 { { 0, 1 } },
13669                 .fill_helper = bpf_fill_jmp_jeq_reg,
13670                 .nr_testruns = NR_PATTERN_RUNS,
13671         },
13672         {
13673                 "JMP_JNE_X: all register value magnitudes",
13674                 { },
13675                 INTERNAL | FLAG_NO_DATA,
13676                 { },
13677                 { { 0, 1 } },
13678                 .fill_helper = bpf_fill_jmp_jne_reg,
13679                 .nr_testruns = NR_PATTERN_RUNS,
13680         },
13681         {
13682                 "JMP_JGT_X: all register value magnitudes",
13683                 { },
13684                 INTERNAL | FLAG_NO_DATA,
13685                 { },
13686                 { { 0, 1 } },
13687                 .fill_helper = bpf_fill_jmp_jgt_reg,
13688                 .nr_testruns = NR_PATTERN_RUNS,
13689         },
13690         {
13691                 "JMP_JGE_X: all register value magnitudes",
13692                 { },
13693                 INTERNAL | FLAG_NO_DATA,
13694                 { },
13695                 { { 0, 1 } },
13696                 .fill_helper = bpf_fill_jmp_jge_reg,
13697                 .nr_testruns = NR_PATTERN_RUNS,
13698         },
13699         {
13700                 "JMP_JLT_X: all register value magnitudes",
13701                 { },
13702                 INTERNAL | FLAG_NO_DATA,
13703                 { },
13704                 { { 0, 1 } },
13705                 .fill_helper = bpf_fill_jmp_jlt_reg,
13706                 .nr_testruns = NR_PATTERN_RUNS,
13707         },
13708         {
13709                 "JMP_JLE_X: all register value magnitudes",
13710                 { },
13711                 INTERNAL | FLAG_NO_DATA,
13712                 { },
13713                 { { 0, 1 } },
13714                 .fill_helper = bpf_fill_jmp_jle_reg,
13715                 .nr_testruns = NR_PATTERN_RUNS,
13716         },
13717         {
13718                 "JMP_JSGT_X: all register value magnitudes",
13719                 { },
13720                 INTERNAL | FLAG_NO_DATA,
13721                 { },
13722                 { { 0, 1 } },
13723                 .fill_helper = bpf_fill_jmp_jsgt_reg,
13724                 .nr_testruns = NR_PATTERN_RUNS,
13725         },
13726         {
13727                 "JMP_JSGE_X: all register value magnitudes",
13728                 { },
13729                 INTERNAL | FLAG_NO_DATA,
13730                 { },
13731                 { { 0, 1 } },
13732                 .fill_helper = bpf_fill_jmp_jsge_reg,
13733                 .nr_testruns = NR_PATTERN_RUNS,
13734         },
13735         {
13736                 "JMP_JSLT_X: all register value magnitudes",
13737                 { },
13738                 INTERNAL | FLAG_NO_DATA,
13739                 { },
13740                 { { 0, 1 } },
13741                 .fill_helper = bpf_fill_jmp_jslt_reg,
13742                 .nr_testruns = NR_PATTERN_RUNS,
13743         },
13744         {
13745                 "JMP_JSLE_X: all register value magnitudes",
13746                 { },
13747                 INTERNAL | FLAG_NO_DATA,
13748                 { },
13749                 { { 0, 1 } },
13750                 .fill_helper = bpf_fill_jmp_jsle_reg,
13751                 .nr_testruns = NR_PATTERN_RUNS,
13752         },
13753         /* JMP32 immediate magnitudes */
13754         {
13755                 "JMP32_JSET_K: all immediate value magnitudes",
13756                 { },
13757                 INTERNAL | FLAG_NO_DATA,
13758                 { },
13759                 { { 0, 1 } },
13760                 .fill_helper = bpf_fill_jmp32_jset_imm,
13761                 .nr_testruns = NR_PATTERN_RUNS,
13762         },
13763         {
13764                 "JMP32_JEQ_K: all immediate value magnitudes",
13765                 { },
13766                 INTERNAL | FLAG_NO_DATA,
13767                 { },
13768                 { { 0, 1 } },
13769                 .fill_helper = bpf_fill_jmp32_jeq_imm,
13770                 .nr_testruns = NR_PATTERN_RUNS,
13771         },
13772         {
13773                 "JMP32_JNE_K: all immediate value magnitudes",
13774                 { },
13775                 INTERNAL | FLAG_NO_DATA,
13776                 { },
13777                 { { 0, 1 } },
13778                 .fill_helper = bpf_fill_jmp32_jne_imm,
13779                 .nr_testruns = NR_PATTERN_RUNS,
13780         },
13781         {
13782                 "JMP32_JGT_K: all immediate value magnitudes",
13783                 { },
13784                 INTERNAL | FLAG_NO_DATA,
13785                 { },
13786                 { { 0, 1 } },
13787                 .fill_helper = bpf_fill_jmp32_jgt_imm,
13788                 .nr_testruns = NR_PATTERN_RUNS,
13789         },
13790         {
13791                 "JMP32_JGE_K: all immediate value magnitudes",
13792                 { },
13793                 INTERNAL | FLAG_NO_DATA,
13794                 { },
13795                 { { 0, 1 } },
13796                 .fill_helper = bpf_fill_jmp32_jge_imm,
13797                 .nr_testruns = NR_PATTERN_RUNS,
13798         },
13799         {
13800                 "JMP32_JLT_K: all immediate value magnitudes",
13801                 { },
13802                 INTERNAL | FLAG_NO_DATA,
13803                 { },
13804                 { { 0, 1 } },
13805                 .fill_helper = bpf_fill_jmp32_jlt_imm,
13806                 .nr_testruns = NR_PATTERN_RUNS,
13807         },
13808         {
13809                 "JMP32_JLE_K: all immediate value magnitudes",
13810                 { },
13811                 INTERNAL | FLAG_NO_DATA,
13812                 { },
13813                 { { 0, 1 } },
13814                 .fill_helper = bpf_fill_jmp32_jle_imm,
13815                 .nr_testruns = NR_PATTERN_RUNS,
13816         },
13817         {
13818                 "JMP32_JSGT_K: all immediate value magnitudes",
13819                 { },
13820                 INTERNAL | FLAG_NO_DATA,
13821                 { },
13822                 { { 0, 1 } },
13823                 .fill_helper = bpf_fill_jmp32_jsgt_imm,
13824                 .nr_testruns = NR_PATTERN_RUNS,
13825         },
13826         {
13827                 "JMP32_JSGE_K: all immediate value magnitudes",
13828                 { },
13829                 INTERNAL | FLAG_NO_DATA,
13830                 { },
13831                 { { 0, 1 } },
13832                 .fill_helper = bpf_fill_jmp32_jsge_imm,
13833                 .nr_testruns = NR_PATTERN_RUNS,
13834         },
13835         {
13836                 "JMP32_JSLT_K: all immediate value magnitudes",
13837                 { },
13838                 INTERNAL | FLAG_NO_DATA,
13839                 { },
13840                 { { 0, 1 } },
13841                 .fill_helper = bpf_fill_jmp32_jslt_imm,
13842                 .nr_testruns = NR_PATTERN_RUNS,
13843         },
13844         {
13845                 "JMP32_JSLE_K: all immediate value magnitudes",
13846                 { },
13847                 INTERNAL | FLAG_NO_DATA,
13848                 { },
13849                 { { 0, 1 } },
13850                 .fill_helper = bpf_fill_jmp32_jsle_imm,
13851                 .nr_testruns = NR_PATTERN_RUNS,
13852         },
13853         /* JMP32 register magnitudes */
13854         {
13855                 "JMP32_JSET_X: all register value magnitudes",
13856                 { },
13857                 INTERNAL | FLAG_NO_DATA,
13858                 { },
13859                 { { 0, 1 } },
13860                 .fill_helper = bpf_fill_jmp32_jset_reg,
13861                 .nr_testruns = NR_PATTERN_RUNS,
13862         },
13863         {
13864                 "JMP32_JEQ_X: all register value magnitudes",
13865                 { },
13866                 INTERNAL | FLAG_NO_DATA,
13867                 { },
13868                 { { 0, 1 } },
13869                 .fill_helper = bpf_fill_jmp32_jeq_reg,
13870                 .nr_testruns = NR_PATTERN_RUNS,
13871         },
13872         {
13873                 "JMP32_JNE_X: all register value magnitudes",
13874                 { },
13875                 INTERNAL | FLAG_NO_DATA,
13876                 { },
13877                 { { 0, 1 } },
13878                 .fill_helper = bpf_fill_jmp32_jne_reg,
13879                 .nr_testruns = NR_PATTERN_RUNS,
13880         },
13881         {
13882                 "JMP32_JGT_X: all register value magnitudes",
13883                 { },
13884                 INTERNAL | FLAG_NO_DATA,
13885                 { },
13886                 { { 0, 1 } },
13887                 .fill_helper = bpf_fill_jmp32_jgt_reg,
13888                 .nr_testruns = NR_PATTERN_RUNS,
13889         },
13890         {
13891                 "JMP32_JGE_X: all register value magnitudes",
13892                 { },
13893                 INTERNAL | FLAG_NO_DATA,
13894                 { },
13895                 { { 0, 1 } },
13896                 .fill_helper = bpf_fill_jmp32_jge_reg,
13897                 .nr_testruns = NR_PATTERN_RUNS,
13898         },
13899         {
13900                 "JMP32_JLT_X: all register value magnitudes",
13901                 { },
13902                 INTERNAL | FLAG_NO_DATA,
13903                 { },
13904                 { { 0, 1 } },
13905                 .fill_helper = bpf_fill_jmp32_jlt_reg,
13906                 .nr_testruns = NR_PATTERN_RUNS,
13907         },
13908         {
13909                 "JMP32_JLE_X: all register value magnitudes",
13910                 { },
13911                 INTERNAL | FLAG_NO_DATA,
13912                 { },
13913                 { { 0, 1 } },
13914                 .fill_helper = bpf_fill_jmp32_jle_reg,
13915                 .nr_testruns = NR_PATTERN_RUNS,
13916         },
13917         {
13918                 "JMP32_JSGT_X: all register value magnitudes",
13919                 { },
13920                 INTERNAL | FLAG_NO_DATA,
13921                 { },
13922                 { { 0, 1 } },
13923                 .fill_helper = bpf_fill_jmp32_jsgt_reg,
13924                 .nr_testruns = NR_PATTERN_RUNS,
13925         },
13926         {
13927                 "JMP32_JSGE_X: all register value magnitudes",
13928                 { },
13929                 INTERNAL | FLAG_NO_DATA,
13930                 { },
13931                 { { 0, 1 } },
13932                 .fill_helper = bpf_fill_jmp32_jsge_reg,
13933                 .nr_testruns = NR_PATTERN_RUNS,
13934         },
13935         {
13936                 "JMP32_JSLT_X: all register value magnitudes",
13937                 { },
13938                 INTERNAL | FLAG_NO_DATA,
13939                 { },
13940                 { { 0, 1 } },
13941                 .fill_helper = bpf_fill_jmp32_jslt_reg,
13942                 .nr_testruns = NR_PATTERN_RUNS,
13943         },
13944         {
13945                 "JMP32_JSLE_X: all register value magnitudes",
13946                 { },
13947                 INTERNAL | FLAG_NO_DATA,
13948                 { },
13949                 { { 0, 1 } },
13950                 .fill_helper = bpf_fill_jmp32_jsle_reg,
13951                 .nr_testruns = NR_PATTERN_RUNS,
13952         },
13953         /* Conditional jumps with constant decision */
13954         {
13955                 "JMP_JSET_K: imm = 0 -> never taken",
13956                 .u.insns_int = {
13957                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13958                         BPF_JMP_IMM(BPF_JSET, R1, 0, 1),
13959                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13960                         BPF_EXIT_INSN(),
13961                 },
13962                 INTERNAL | FLAG_NO_DATA,
13963                 { },
13964                 { { 0, 0 } },
13965         },
13966         {
13967                 "JMP_JLT_K: imm = 0 -> never taken",
13968                 .u.insns_int = {
13969                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13970                         BPF_JMP_IMM(BPF_JLT, R1, 0, 1),
13971                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13972                         BPF_EXIT_INSN(),
13973                 },
13974                 INTERNAL | FLAG_NO_DATA,
13975                 { },
13976                 { { 0, 0 } },
13977         },
13978         {
13979                 "JMP_JGE_K: imm = 0 -> always taken",
13980                 .u.insns_int = {
13981                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13982                         BPF_JMP_IMM(BPF_JGE, R1, 0, 1),
13983                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13984                         BPF_EXIT_INSN(),
13985                 },
13986                 INTERNAL | FLAG_NO_DATA,
13987                 { },
13988                 { { 0, 1 } },
13989         },
13990         {
13991                 "JMP_JGT_K: imm = 0xffffffff -> never taken",
13992                 .u.insns_int = {
13993                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13994                         BPF_JMP_IMM(BPF_JGT, R1, U32_MAX, 1),
13995                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13996                         BPF_EXIT_INSN(),
13997                 },
13998                 INTERNAL | FLAG_NO_DATA,
13999                 { },
14000                 { { 0, 0 } },
14001         },
14002         {
14003                 "JMP_JLE_K: imm = 0xffffffff -> always taken",
14004                 .u.insns_int = {
14005                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14006                         BPF_JMP_IMM(BPF_JLE, R1, U32_MAX, 1),
14007                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14008                         BPF_EXIT_INSN(),
14009                 },
14010                 INTERNAL | FLAG_NO_DATA,
14011                 { },
14012                 { { 0, 1 } },
14013         },
14014         {
14015                 "JMP32_JSGT_K: imm = 0x7fffffff -> never taken",
14016                 .u.insns_int = {
14017                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14018                         BPF_JMP32_IMM(BPF_JSGT, R1, S32_MAX, 1),
14019                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14020                         BPF_EXIT_INSN(),
14021                 },
14022                 INTERNAL | FLAG_NO_DATA,
14023                 { },
14024                 { { 0, 0 } },
14025         },
14026         {
14027                 "JMP32_JSGE_K: imm = -0x80000000 -> always taken",
14028                 .u.insns_int = {
14029                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14030                         BPF_JMP32_IMM(BPF_JSGE, R1, S32_MIN, 1),
14031                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14032                         BPF_EXIT_INSN(),
14033                 },
14034                 INTERNAL | FLAG_NO_DATA,
14035                 { },
14036                 { { 0, 1 } },
14037         },
14038         {
14039                 "JMP32_JSLT_K: imm = -0x80000000 -> never taken",
14040                 .u.insns_int = {
14041                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14042                         BPF_JMP32_IMM(BPF_JSLT, R1, S32_MIN, 1),
14043                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14044                         BPF_EXIT_INSN(),
14045                 },
14046                 INTERNAL | FLAG_NO_DATA,
14047                 { },
14048                 { { 0, 0 } },
14049         },
14050         {
14051                 "JMP32_JSLE_K: imm = 0x7fffffff -> always taken",
14052                 .u.insns_int = {
14053                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14054                         BPF_JMP32_IMM(BPF_JSLE, R1, S32_MAX, 1),
14055                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14056                         BPF_EXIT_INSN(),
14057                 },
14058                 INTERNAL | FLAG_NO_DATA,
14059                 { },
14060                 { { 0, 1 } },
14061         },
14062         {
14063                 "JMP_JEQ_X: dst = src -> always taken",
14064                 .u.insns_int = {
14065                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14066                         BPF_JMP_REG(BPF_JEQ, R1, R1, 1),
14067                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14068                         BPF_EXIT_INSN(),
14069                 },
14070                 INTERNAL | FLAG_NO_DATA,
14071                 { },
14072                 { { 0, 1 } },
14073         },
14074         {
14075                 "JMP_JGE_X: dst = src -> always taken",
14076                 .u.insns_int = {
14077                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14078                         BPF_JMP_REG(BPF_JGE, R1, R1, 1),
14079                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14080                         BPF_EXIT_INSN(),
14081                 },
14082                 INTERNAL | FLAG_NO_DATA,
14083                 { },
14084                 { { 0, 1 } },
14085         },
14086         {
14087                 "JMP_JLE_X: dst = src -> always taken",
14088                 .u.insns_int = {
14089                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14090                         BPF_JMP_REG(BPF_JLE, R1, R1, 1),
14091                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14092                         BPF_EXIT_INSN(),
14093                 },
14094                 INTERNAL | FLAG_NO_DATA,
14095                 { },
14096                 { { 0, 1 } },
14097         },
14098         {
14099                 "JMP_JSGE_X: dst = src -> always taken",
14100                 .u.insns_int = {
14101                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14102                         BPF_JMP_REG(BPF_JSGE, R1, R1, 1),
14103                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14104                         BPF_EXIT_INSN(),
14105                 },
14106                 INTERNAL | FLAG_NO_DATA,
14107                 { },
14108                 { { 0, 1 } },
14109         },
14110         {
14111                 "JMP_JSLE_X: dst = src -> always taken",
14112                 .u.insns_int = {
14113                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14114                         BPF_JMP_REG(BPF_JSLE, R1, R1, 1),
14115                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14116                         BPF_EXIT_INSN(),
14117                 },
14118                 INTERNAL | FLAG_NO_DATA,
14119                 { },
14120                 { { 0, 1 } },
14121         },
14122         {
14123                 "JMP_JNE_X: dst = src -> never taken",
14124                 .u.insns_int = {
14125                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14126                         BPF_JMP_REG(BPF_JNE, R1, R1, 1),
14127                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14128                         BPF_EXIT_INSN(),
14129                 },
14130                 INTERNAL | FLAG_NO_DATA,
14131                 { },
14132                 { { 0, 0 } },
14133         },
14134         {
14135                 "JMP_JGT_X: dst = src -> never taken",
14136                 .u.insns_int = {
14137                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14138                         BPF_JMP_REG(BPF_JGT, R1, R1, 1),
14139                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14140                         BPF_EXIT_INSN(),
14141                 },
14142                 INTERNAL | FLAG_NO_DATA,
14143                 { },
14144                 { { 0, 0 } },
14145         },
14146         {
14147                 "JMP_JLT_X: dst = src -> never taken",
14148                 .u.insns_int = {
14149                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14150                         BPF_JMP_REG(BPF_JLT, R1, R1, 1),
14151                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14152                         BPF_EXIT_INSN(),
14153                 },
14154                 INTERNAL | FLAG_NO_DATA,
14155                 { },
14156                 { { 0, 0 } },
14157         },
14158         {
14159                 "JMP_JSGT_X: dst = src -> never taken",
14160                 .u.insns_int = {
14161                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14162                         BPF_JMP_REG(BPF_JSGT, R1, R1, 1),
14163                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14164                         BPF_EXIT_INSN(),
14165                 },
14166                 INTERNAL | FLAG_NO_DATA,
14167                 { },
14168                 { { 0, 0 } },
14169         },
14170         {
14171                 "JMP_JSLT_X: dst = src -> never taken",
14172                 .u.insns_int = {
14173                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
14174                         BPF_JMP_REG(BPF_JSLT, R1, R1, 1),
14175                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14176                         BPF_EXIT_INSN(),
14177                 },
14178                 INTERNAL | FLAG_NO_DATA,
14179                 { },
14180                 { { 0, 0 } },
14181         },
14182         /* Short relative jumps */
14183         {
14184                 "Short relative jump: offset=0",
14185                 .u.insns_int = {
14186                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14187                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 0),
14188                         BPF_EXIT_INSN(),
14189                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
14190                 },
14191                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
14192                 { },
14193                 { { 0, 0 } },
14194         },
14195         {
14196                 "Short relative jump: offset=1",
14197                 .u.insns_int = {
14198                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14199                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 1),
14200                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14201                         BPF_EXIT_INSN(),
14202                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
14203                 },
14204                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
14205                 { },
14206                 { { 0, 0 } },
14207         },
14208         {
14209                 "Short relative jump: offset=2",
14210                 .u.insns_int = {
14211                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14212                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
14213                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14214                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14215                         BPF_EXIT_INSN(),
14216                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
14217                 },
14218                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
14219                 { },
14220                 { { 0, 0 } },
14221         },
14222         {
14223                 "Short relative jump: offset=3",
14224                 .u.insns_int = {
14225                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14226                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 3),
14227                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14228                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14229                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14230                         BPF_EXIT_INSN(),
14231                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
14232                 },
14233                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
14234                 { },
14235                 { { 0, 0 } },
14236         },
14237         {
14238                 "Short relative jump: offset=4",
14239                 .u.insns_int = {
14240                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
14241                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 4),
14242                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14243                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14244                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14245                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
14246                         BPF_EXIT_INSN(),
14247                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
14248                 },
14249                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
14250                 { },
14251                 { { 0, 0 } },
14252         },
14253         /* Conditional branch conversions */
14254         {
14255                 "Long conditional jump: taken at runtime",
14256                 { },
14257                 INTERNAL | FLAG_NO_DATA,
14258                 { },
14259                 { { 0, 1 } },
14260                 .fill_helper = bpf_fill_max_jmp_taken,
14261         },
14262         {
14263                 "Long conditional jump: not taken at runtime",
14264                 { },
14265                 INTERNAL | FLAG_NO_DATA,
14266                 { },
14267                 { { 0, 2 } },
14268                 .fill_helper = bpf_fill_max_jmp_not_taken,
14269         },
14270         {
14271                 "Long conditional jump: always taken, known at JIT time",
14272                 { },
14273                 INTERNAL | FLAG_NO_DATA,
14274                 { },
14275                 { { 0, 1 } },
14276                 .fill_helper = bpf_fill_max_jmp_always_taken,
14277         },
14278         {
14279                 "Long conditional jump: never taken, known at JIT time",
14280                 { },
14281                 INTERNAL | FLAG_NO_DATA,
14282                 { },
14283                 { { 0, 2 } },
14284                 .fill_helper = bpf_fill_max_jmp_never_taken,
14285         },
14286         /* Staggered jump sequences, immediate */
14287         {
14288                 "Staggered jumps: JMP_JA",
14289                 { },
14290                 INTERNAL | FLAG_NO_DATA,
14291                 { },
14292                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14293                 .fill_helper = bpf_fill_staggered_ja,
14294                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14295         },
14296         {
14297                 "Staggered jumps: JMP_JEQ_K",
14298                 { },
14299                 INTERNAL | FLAG_NO_DATA,
14300                 { },
14301                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14302                 .fill_helper = bpf_fill_staggered_jeq_imm,
14303                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14304         },
14305         {
14306                 "Staggered jumps: JMP_JNE_K",
14307                 { },
14308                 INTERNAL | FLAG_NO_DATA,
14309                 { },
14310                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14311                 .fill_helper = bpf_fill_staggered_jne_imm,
14312                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14313         },
14314         {
14315                 "Staggered jumps: JMP_JSET_K",
14316                 { },
14317                 INTERNAL | FLAG_NO_DATA,
14318                 { },
14319                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14320                 .fill_helper = bpf_fill_staggered_jset_imm,
14321                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14322         },
14323         {
14324                 "Staggered jumps: JMP_JGT_K",
14325                 { },
14326                 INTERNAL | FLAG_NO_DATA,
14327                 { },
14328                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14329                 .fill_helper = bpf_fill_staggered_jgt_imm,
14330                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14331         },
14332         {
14333                 "Staggered jumps: JMP_JGE_K",
14334                 { },
14335                 INTERNAL | FLAG_NO_DATA,
14336                 { },
14337                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14338                 .fill_helper = bpf_fill_staggered_jge_imm,
14339                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14340         },
14341         {
14342                 "Staggered jumps: JMP_JLT_K",
14343                 { },
14344                 INTERNAL | FLAG_NO_DATA,
14345                 { },
14346                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14347                 .fill_helper = bpf_fill_staggered_jlt_imm,
14348                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14349         },
14350         {
14351                 "Staggered jumps: JMP_JLE_K",
14352                 { },
14353                 INTERNAL | FLAG_NO_DATA,
14354                 { },
14355                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14356                 .fill_helper = bpf_fill_staggered_jle_imm,
14357                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14358         },
14359         {
14360                 "Staggered jumps: JMP_JSGT_K",
14361                 { },
14362                 INTERNAL | FLAG_NO_DATA,
14363                 { },
14364                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14365                 .fill_helper = bpf_fill_staggered_jsgt_imm,
14366                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14367         },
14368         {
14369                 "Staggered jumps: JMP_JSGE_K",
14370                 { },
14371                 INTERNAL | FLAG_NO_DATA,
14372                 { },
14373                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14374                 .fill_helper = bpf_fill_staggered_jsge_imm,
14375                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14376         },
14377         {
14378                 "Staggered jumps: JMP_JSLT_K",
14379                 { },
14380                 INTERNAL | FLAG_NO_DATA,
14381                 { },
14382                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14383                 .fill_helper = bpf_fill_staggered_jslt_imm,
14384                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14385         },
14386         {
14387                 "Staggered jumps: JMP_JSLE_K",
14388                 { },
14389                 INTERNAL | FLAG_NO_DATA,
14390                 { },
14391                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14392                 .fill_helper = bpf_fill_staggered_jsle_imm,
14393                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14394         },
14395         /* Staggered jump sequences, register */
14396         {
14397                 "Staggered jumps: JMP_JEQ_X",
14398                 { },
14399                 INTERNAL | FLAG_NO_DATA,
14400                 { },
14401                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14402                 .fill_helper = bpf_fill_staggered_jeq_reg,
14403                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14404         },
14405         {
14406                 "Staggered jumps: JMP_JNE_X",
14407                 { },
14408                 INTERNAL | FLAG_NO_DATA,
14409                 { },
14410                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14411                 .fill_helper = bpf_fill_staggered_jne_reg,
14412                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14413         },
14414         {
14415                 "Staggered jumps: JMP_JSET_X",
14416                 { },
14417                 INTERNAL | FLAG_NO_DATA,
14418                 { },
14419                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14420                 .fill_helper = bpf_fill_staggered_jset_reg,
14421                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14422         },
14423         {
14424                 "Staggered jumps: JMP_JGT_X",
14425                 { },
14426                 INTERNAL | FLAG_NO_DATA,
14427                 { },
14428                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14429                 .fill_helper = bpf_fill_staggered_jgt_reg,
14430                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14431         },
14432         {
14433                 "Staggered jumps: JMP_JGE_X",
14434                 { },
14435                 INTERNAL | FLAG_NO_DATA,
14436                 { },
14437                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14438                 .fill_helper = bpf_fill_staggered_jge_reg,
14439                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14440         },
14441         {
14442                 "Staggered jumps: JMP_JLT_X",
14443                 { },
14444                 INTERNAL | FLAG_NO_DATA,
14445                 { },
14446                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14447                 .fill_helper = bpf_fill_staggered_jlt_reg,
14448                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14449         },
14450         {
14451                 "Staggered jumps: JMP_JLE_X",
14452                 { },
14453                 INTERNAL | FLAG_NO_DATA,
14454                 { },
14455                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14456                 .fill_helper = bpf_fill_staggered_jle_reg,
14457                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14458         },
14459         {
14460                 "Staggered jumps: JMP_JSGT_X",
14461                 { },
14462                 INTERNAL | FLAG_NO_DATA,
14463                 { },
14464                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14465                 .fill_helper = bpf_fill_staggered_jsgt_reg,
14466                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14467         },
14468         {
14469                 "Staggered jumps: JMP_JSGE_X",
14470                 { },
14471                 INTERNAL | FLAG_NO_DATA,
14472                 { },
14473                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14474                 .fill_helper = bpf_fill_staggered_jsge_reg,
14475                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14476         },
14477         {
14478                 "Staggered jumps: JMP_JSLT_X",
14479                 { },
14480                 INTERNAL | FLAG_NO_DATA,
14481                 { },
14482                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14483                 .fill_helper = bpf_fill_staggered_jslt_reg,
14484                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14485         },
14486         {
14487                 "Staggered jumps: JMP_JSLE_X",
14488                 { },
14489                 INTERNAL | FLAG_NO_DATA,
14490                 { },
14491                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14492                 .fill_helper = bpf_fill_staggered_jsle_reg,
14493                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14494         },
14495         /* Staggered jump sequences, JMP32 immediate */
14496         {
14497                 "Staggered jumps: JMP32_JEQ_K",
14498                 { },
14499                 INTERNAL | FLAG_NO_DATA,
14500                 { },
14501                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14502                 .fill_helper = bpf_fill_staggered_jeq32_imm,
14503                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14504         },
14505         {
14506                 "Staggered jumps: JMP32_JNE_K",
14507                 { },
14508                 INTERNAL | FLAG_NO_DATA,
14509                 { },
14510                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14511                 .fill_helper = bpf_fill_staggered_jne32_imm,
14512                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14513         },
14514         {
14515                 "Staggered jumps: JMP32_JSET_K",
14516                 { },
14517                 INTERNAL | FLAG_NO_DATA,
14518                 { },
14519                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14520                 .fill_helper = bpf_fill_staggered_jset32_imm,
14521                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14522         },
14523         {
14524                 "Staggered jumps: JMP32_JGT_K",
14525                 { },
14526                 INTERNAL | FLAG_NO_DATA,
14527                 { },
14528                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14529                 .fill_helper = bpf_fill_staggered_jgt32_imm,
14530                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14531         },
14532         {
14533                 "Staggered jumps: JMP32_JGE_K",
14534                 { },
14535                 INTERNAL | FLAG_NO_DATA,
14536                 { },
14537                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14538                 .fill_helper = bpf_fill_staggered_jge32_imm,
14539                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14540         },
14541         {
14542                 "Staggered jumps: JMP32_JLT_K",
14543                 { },
14544                 INTERNAL | FLAG_NO_DATA,
14545                 { },
14546                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14547                 .fill_helper = bpf_fill_staggered_jlt32_imm,
14548                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14549         },
14550         {
14551                 "Staggered jumps: JMP32_JLE_K",
14552                 { },
14553                 INTERNAL | FLAG_NO_DATA,
14554                 { },
14555                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14556                 .fill_helper = bpf_fill_staggered_jle32_imm,
14557                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14558         },
14559         {
14560                 "Staggered jumps: JMP32_JSGT_K",
14561                 { },
14562                 INTERNAL | FLAG_NO_DATA,
14563                 { },
14564                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14565                 .fill_helper = bpf_fill_staggered_jsgt32_imm,
14566                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14567         },
14568         {
14569                 "Staggered jumps: JMP32_JSGE_K",
14570                 { },
14571                 INTERNAL | FLAG_NO_DATA,
14572                 { },
14573                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14574                 .fill_helper = bpf_fill_staggered_jsge32_imm,
14575                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14576         },
14577         {
14578                 "Staggered jumps: JMP32_JSLT_K",
14579                 { },
14580                 INTERNAL | FLAG_NO_DATA,
14581                 { },
14582                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14583                 .fill_helper = bpf_fill_staggered_jslt32_imm,
14584                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14585         },
14586         {
14587                 "Staggered jumps: JMP32_JSLE_K",
14588                 { },
14589                 INTERNAL | FLAG_NO_DATA,
14590                 { },
14591                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14592                 .fill_helper = bpf_fill_staggered_jsle32_imm,
14593                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14594         },
14595         /* Staggered jump sequences, JMP32 register */
14596         {
14597                 "Staggered jumps: JMP32_JEQ_X",
14598                 { },
14599                 INTERNAL | FLAG_NO_DATA,
14600                 { },
14601                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14602                 .fill_helper = bpf_fill_staggered_jeq32_reg,
14603                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14604         },
14605         {
14606                 "Staggered jumps: JMP32_JNE_X",
14607                 { },
14608                 INTERNAL | FLAG_NO_DATA,
14609                 { },
14610                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14611                 .fill_helper = bpf_fill_staggered_jne32_reg,
14612                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14613         },
14614         {
14615                 "Staggered jumps: JMP32_JSET_X",
14616                 { },
14617                 INTERNAL | FLAG_NO_DATA,
14618                 { },
14619                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14620                 .fill_helper = bpf_fill_staggered_jset32_reg,
14621                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14622         },
14623         {
14624                 "Staggered jumps: JMP32_JGT_X",
14625                 { },
14626                 INTERNAL | FLAG_NO_DATA,
14627                 { },
14628                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14629                 .fill_helper = bpf_fill_staggered_jgt32_reg,
14630                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14631         },
14632         {
14633                 "Staggered jumps: JMP32_JGE_X",
14634                 { },
14635                 INTERNAL | FLAG_NO_DATA,
14636                 { },
14637                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14638                 .fill_helper = bpf_fill_staggered_jge32_reg,
14639                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14640         },
14641         {
14642                 "Staggered jumps: JMP32_JLT_X",
14643                 { },
14644                 INTERNAL | FLAG_NO_DATA,
14645                 { },
14646                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14647                 .fill_helper = bpf_fill_staggered_jlt32_reg,
14648                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14649         },
14650         {
14651                 "Staggered jumps: JMP32_JLE_X",
14652                 { },
14653                 INTERNAL | FLAG_NO_DATA,
14654                 { },
14655                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14656                 .fill_helper = bpf_fill_staggered_jle32_reg,
14657                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14658         },
14659         {
14660                 "Staggered jumps: JMP32_JSGT_X",
14661                 { },
14662                 INTERNAL | FLAG_NO_DATA,
14663                 { },
14664                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14665                 .fill_helper = bpf_fill_staggered_jsgt32_reg,
14666                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14667         },
14668         {
14669                 "Staggered jumps: JMP32_JSGE_X",
14670                 { },
14671                 INTERNAL | FLAG_NO_DATA,
14672                 { },
14673                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14674                 .fill_helper = bpf_fill_staggered_jsge32_reg,
14675                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14676         },
14677         {
14678                 "Staggered jumps: JMP32_JSLT_X",
14679                 { },
14680                 INTERNAL | FLAG_NO_DATA,
14681                 { },
14682                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14683                 .fill_helper = bpf_fill_staggered_jslt32_reg,
14684                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14685         },
14686         {
14687                 "Staggered jumps: JMP32_JSLE_X",
14688                 { },
14689                 INTERNAL | FLAG_NO_DATA,
14690                 { },
14691                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14692                 .fill_helper = bpf_fill_staggered_jsle32_reg,
14693                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14694         },
14695 };
14696
14697 static struct net_device dev;
14698
14699 static struct sk_buff *populate_skb(char *buf, int size)
14700 {
14701         struct sk_buff *skb;
14702
14703         if (size >= MAX_DATA)
14704                 return NULL;
14705
14706         skb = alloc_skb(MAX_DATA, GFP_KERNEL);
14707         if (!skb)
14708                 return NULL;
14709
14710         __skb_put_data(skb, buf, size);
14711
14712         /* Initialize a fake skb with test pattern. */
14713         skb_reset_mac_header(skb);
14714         skb->protocol = htons(ETH_P_IP);
14715         skb->pkt_type = SKB_TYPE;
14716         skb->mark = SKB_MARK;
14717         skb->hash = SKB_HASH;
14718         skb->queue_mapping = SKB_QUEUE_MAP;
14719         skb->vlan_tci = SKB_VLAN_TCI;
14720         skb->vlan_proto = htons(ETH_P_IP);
14721         dev_net_set(&dev, &init_net);
14722         skb->dev = &dev;
14723         skb->dev->ifindex = SKB_DEV_IFINDEX;
14724         skb->dev->type = SKB_DEV_TYPE;
14725         skb_set_network_header(skb, min(size, ETH_HLEN));
14726
14727         return skb;
14728 }
14729
14730 static void *generate_test_data(struct bpf_test *test, int sub)
14731 {
14732         struct sk_buff *skb;
14733         struct page *page;
14734
14735         if (test->aux & FLAG_NO_DATA)
14736                 return NULL;
14737
14738         if (test->aux & FLAG_LARGE_MEM)
14739                 return kmalloc(test->test[sub].data_size, GFP_KERNEL);
14740
14741         /* Test case expects an skb, so populate one. Various
14742          * subtests generate skbs of different sizes based on
14743          * the same data.
14744          */
14745         skb = populate_skb(test->data, test->test[sub].data_size);
14746         if (!skb)
14747                 return NULL;
14748
14749         if (test->aux & FLAG_SKB_FRAG) {
14750                 /*
14751                  * when the test requires a fragmented skb, add a
14752                  * single fragment to the skb, filled with
14753                  * test->frag_data.
14754                  */
14755                 page = alloc_page(GFP_KERNEL);
14756                 if (!page)
14757                         goto err_kfree_skb;
14758
14759                 memcpy(page_address(page), test->frag_data, MAX_DATA);
14760                 skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
14761         }
14762
14763         return skb;
14764 err_kfree_skb:
14765         kfree_skb(skb);
14766         return NULL;
14767 }
14768
14769 static void release_test_data(const struct bpf_test *test, void *data)
14770 {
14771         if (test->aux & FLAG_NO_DATA)
14772                 return;
14773
14774         if (test->aux & FLAG_LARGE_MEM)
14775                 kfree(data);
14776         else
14777                 kfree_skb(data);
14778 }
14779
14780 static int filter_length(int which)
14781 {
14782         struct sock_filter *fp;
14783         int len;
14784
14785         if (tests[which].fill_helper)
14786                 return tests[which].u.ptr.len;
14787
14788         fp = tests[which].u.insns;
14789         for (len = MAX_INSNS - 1; len > 0; --len)
14790                 if (fp[len].code != 0 || fp[len].k != 0)
14791                         break;
14792
14793         return len + 1;
14794 }
14795
14796 static void *filter_pointer(int which)
14797 {
14798         if (tests[which].fill_helper)
14799                 return tests[which].u.ptr.insns;
14800         else
14801                 return tests[which].u.insns;
14802 }
14803
14804 static struct bpf_prog *generate_filter(int which, int *err)
14805 {
14806         __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
14807         unsigned int flen = filter_length(which);
14808         void *fptr = filter_pointer(which);
14809         struct sock_fprog_kern fprog;
14810         struct bpf_prog *fp;
14811
14812         switch (test_type) {
14813         case CLASSIC:
14814                 fprog.filter = fptr;
14815                 fprog.len = flen;
14816
14817                 *err = bpf_prog_create(&fp, &fprog);
14818                 if (tests[which].aux & FLAG_EXPECTED_FAIL) {
14819                         if (*err == tests[which].expected_errcode) {
14820                                 pr_cont("PASS\n");
14821                                 /* Verifier rejected filter as expected. */
14822                                 *err = 0;
14823                                 return NULL;
14824                         } else {
14825                                 pr_cont("UNEXPECTED_PASS\n");
14826                                 /* Verifier didn't reject the test that's
14827                                  * bad enough, just return!
14828                                  */
14829                                 *err = -EINVAL;
14830                                 return NULL;
14831                         }
14832                 }
14833                 if (*err) {
14834                         pr_cont("FAIL to prog_create err=%d len=%d\n",
14835                                 *err, fprog.len);
14836                         return NULL;
14837                 }
14838                 break;
14839
14840         case INTERNAL:
14841                 fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
14842                 if (fp == NULL) {
14843                         pr_cont("UNEXPECTED_FAIL no memory left\n");
14844                         *err = -ENOMEM;
14845                         return NULL;
14846                 }
14847
14848                 fp->len = flen;
14849                 /* Type doesn't really matter here as long as it's not unspec. */
14850                 fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
14851                 memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
14852                 fp->aux->stack_depth = tests[which].stack_depth;
14853                 fp->aux->verifier_zext = !!(tests[which].aux &
14854                                             FLAG_VERIFIER_ZEXT);
14855
14856                 /* We cannot error here as we don't need type compatibility
14857                  * checks.
14858                  */
14859                 fp = bpf_prog_select_runtime(fp, err);
14860                 if (*err) {
14861                         pr_cont("FAIL to select_runtime err=%d\n", *err);
14862                         return NULL;
14863                 }
14864                 break;
14865         }
14866
14867         *err = 0;
14868         return fp;
14869 }
14870
14871 static void release_filter(struct bpf_prog *fp, int which)
14872 {
14873         __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
14874
14875         switch (test_type) {
14876         case CLASSIC:
14877                 bpf_prog_destroy(fp);
14878                 break;
14879         case INTERNAL:
14880                 bpf_prog_free(fp);
14881                 break;
14882         }
14883 }
14884
14885 static int __run_one(const struct bpf_prog *fp, const void *data,
14886                      int runs, u64 *duration)
14887 {
14888         u64 start, finish;
14889         int ret = 0, i;
14890
14891         migrate_disable();
14892         start = ktime_get_ns();
14893
14894         for (i = 0; i < runs; i++)
14895                 ret = bpf_prog_run(fp, data);
14896
14897         finish = ktime_get_ns();
14898         migrate_enable();
14899
14900         *duration = finish - start;
14901         do_div(*duration, runs);
14902
14903         return ret;
14904 }
14905
14906 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
14907 {
14908         int err_cnt = 0, i, runs = MAX_TESTRUNS;
14909
14910         if (test->nr_testruns)
14911                 runs = min(test->nr_testruns, MAX_TESTRUNS);
14912
14913         for (i = 0; i < MAX_SUBTESTS; i++) {
14914                 void *data;
14915                 u64 duration;
14916                 u32 ret;
14917
14918                 /*
14919                  * NOTE: Several sub-tests may be present, in which case
14920                  * a zero {data_size, result} tuple indicates the end of
14921                  * the sub-test array. The first test is always run,
14922                  * even if both data_size and result happen to be zero.
14923                  */
14924                 if (i > 0 &&
14925                     test->test[i].data_size == 0 &&
14926                     test->test[i].result == 0)
14927                         break;
14928
14929                 data = generate_test_data(test, i);
14930                 if (!data && !(test->aux & FLAG_NO_DATA)) {
14931                         pr_cont("data generation failed ");
14932                         err_cnt++;
14933                         break;
14934                 }
14935                 ret = __run_one(fp, data, runs, &duration);
14936                 release_test_data(test, data);
14937
14938                 if (ret == test->test[i].result) {
14939                         pr_cont("%lld ", duration);
14940                 } else {
14941                         s32 res = test->test[i].result;
14942
14943                         pr_cont("ret %d != %d (%#x != %#x)",
14944                                 ret, res, ret, res);
14945                         err_cnt++;
14946                 }
14947         }
14948
14949         return err_cnt;
14950 }
14951
14952 static char test_name[64];
14953 module_param_string(test_name, test_name, sizeof(test_name), 0);
14954
14955 static int test_id = -1;
14956 module_param(test_id, int, 0);
14957
14958 static int test_range[2] = { 0, INT_MAX };
14959 module_param_array(test_range, int, NULL, 0);
14960
14961 static bool exclude_test(int test_id)
14962 {
14963         return test_id < test_range[0] || test_id > test_range[1];
14964 }
14965
14966 static __init struct sk_buff *build_test_skb(void)
14967 {
14968         u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
14969         struct sk_buff *skb[2];
14970         struct page *page[2];
14971         int i, data_size = 8;
14972
14973         for (i = 0; i < 2; i++) {
14974                 page[i] = alloc_page(GFP_KERNEL);
14975                 if (!page[i]) {
14976                         if (i == 0)
14977                                 goto err_page0;
14978                         else
14979                                 goto err_page1;
14980                 }
14981
14982                 /* this will set skb[i]->head_frag */
14983                 skb[i] = dev_alloc_skb(headroom + data_size);
14984                 if (!skb[i]) {
14985                         if (i == 0)
14986                                 goto err_skb0;
14987                         else
14988                                 goto err_skb1;
14989                 }
14990
14991                 skb_reserve(skb[i], headroom);
14992                 skb_put(skb[i], data_size);
14993                 skb[i]->protocol = htons(ETH_P_IP);
14994                 skb_reset_network_header(skb[i]);
14995                 skb_set_mac_header(skb[i], -ETH_HLEN);
14996
14997                 skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
14998                 // skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
14999         }
15000
15001         /* setup shinfo */
15002         skb_shinfo(skb[0])->gso_size = 1448;
15003         skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
15004         skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
15005         skb_shinfo(skb[0])->gso_segs = 0;
15006         skb_shinfo(skb[0])->frag_list = skb[1];
15007         skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000;
15008
15009         /* adjust skb[0]'s len */
15010         skb[0]->len += skb[1]->len;
15011         skb[0]->data_len += skb[1]->data_len;
15012         skb[0]->truesize += skb[1]->truesize;
15013
15014         return skb[0];
15015
15016 err_skb1:
15017         __free_page(page[1]);
15018 err_page1:
15019         kfree_skb(skb[0]);
15020 err_skb0:
15021         __free_page(page[0]);
15022 err_page0:
15023         return NULL;
15024 }
15025
15026 static __init struct sk_buff *build_test_skb_linear_no_head_frag(void)
15027 {
15028         unsigned int alloc_size = 2000;
15029         unsigned int headroom = 102, doffset = 72, data_size = 1308;
15030         struct sk_buff *skb[2];
15031         int i;
15032
15033         /* skbs linked in a frag_list, both with linear data, with head_frag=0
15034          * (data allocated by kmalloc), both have tcp data of 1308 bytes
15035          * (total payload is 2616 bytes).
15036          * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom.
15037          */
15038         for (i = 0; i < 2; i++) {
15039                 skb[i] = alloc_skb(alloc_size, GFP_KERNEL);
15040                 if (!skb[i]) {
15041                         if (i == 0)
15042                                 goto err_skb0;
15043                         else
15044                                 goto err_skb1;
15045                 }
15046
15047                 skb[i]->protocol = htons(ETH_P_IPV6);
15048                 skb_reserve(skb[i], headroom);
15049                 skb_put(skb[i], doffset + data_size);
15050                 skb_reset_network_header(skb[i]);
15051                 if (i == 0)
15052                         skb_reset_mac_header(skb[i]);
15053                 else
15054                         skb_set_mac_header(skb[i], -ETH_HLEN);
15055                 __skb_pull(skb[i], doffset);
15056         }
15057
15058         /* setup shinfo.
15059          * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a
15060          * reduced gso_size.
15061          */
15062         skb_shinfo(skb[0])->gso_size = 1288;
15063         skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY;
15064         skb_shinfo(skb[0])->gso_segs = 0;
15065         skb_shinfo(skb[0])->frag_list = skb[1];
15066
15067         /* adjust skb[0]'s len */
15068         skb[0]->len += skb[1]->len;
15069         skb[0]->data_len += skb[1]->len;
15070         skb[0]->truesize += skb[1]->truesize;
15071
15072         return skb[0];
15073
15074 err_skb1:
15075         kfree_skb(skb[0]);
15076 err_skb0:
15077         return NULL;
15078 }
15079
15080 struct skb_segment_test {
15081         const char *descr;
15082         struct sk_buff *(*build_skb)(void);
15083         netdev_features_t features;
15084 };
15085
15086 static struct skb_segment_test skb_segment_tests[] __initconst = {
15087         {
15088                 .descr = "gso_with_rx_frags",
15089                 .build_skb = build_test_skb,
15090                 .features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
15091                             NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM
15092         },
15093         {
15094                 .descr = "gso_linear_no_head_frag",
15095                 .build_skb = build_test_skb_linear_no_head_frag,
15096                 .features = NETIF_F_SG | NETIF_F_FRAGLIST |
15097                             NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
15098                             NETIF_F_LLTX | NETIF_F_GRO |
15099                             NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
15100                             NETIF_F_HW_VLAN_STAG_TX
15101         }
15102 };
15103
15104 static __init int test_skb_segment_single(const struct skb_segment_test *test)
15105 {
15106         struct sk_buff *skb, *segs;
15107         int ret = -1;
15108
15109         skb = test->build_skb();
15110         if (!skb) {
15111                 pr_info("%s: failed to build_test_skb", __func__);
15112                 goto done;
15113         }
15114
15115         segs = skb_segment(skb, test->features);
15116         if (!IS_ERR(segs)) {
15117                 kfree_skb_list(segs);
15118                 ret = 0;
15119         }
15120         kfree_skb(skb);
15121 done:
15122         return ret;
15123 }
15124
15125 static __init int test_skb_segment(void)
15126 {
15127         int i, err_cnt = 0, pass_cnt = 0;
15128
15129         for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
15130                 const struct skb_segment_test *test = &skb_segment_tests[i];
15131
15132                 cond_resched();
15133                 if (exclude_test(i))
15134                         continue;
15135
15136                 pr_info("#%d %s ", i, test->descr);
15137
15138                 if (test_skb_segment_single(test)) {
15139                         pr_cont("FAIL\n");
15140                         err_cnt++;
15141                 } else {
15142                         pr_cont("PASS\n");
15143                         pass_cnt++;
15144                 }
15145         }
15146
15147         pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__,
15148                 pass_cnt, err_cnt);
15149         return err_cnt ? -EINVAL : 0;
15150 }
15151
15152 static __init int test_bpf(void)
15153 {
15154         int i, err_cnt = 0, pass_cnt = 0;
15155         int jit_cnt = 0, run_cnt = 0;
15156
15157         for (i = 0; i < ARRAY_SIZE(tests); i++) {
15158                 struct bpf_prog *fp;
15159                 int err;
15160
15161                 cond_resched();
15162                 if (exclude_test(i))
15163                         continue;
15164
15165                 pr_info("#%d %s ", i, tests[i].descr);
15166
15167                 if (tests[i].fill_helper &&
15168                     tests[i].fill_helper(&tests[i]) < 0) {
15169                         pr_cont("FAIL to prog_fill\n");
15170                         continue;
15171                 }
15172
15173                 fp = generate_filter(i, &err);
15174
15175                 if (tests[i].fill_helper) {
15176                         kfree(tests[i].u.ptr.insns);
15177                         tests[i].u.ptr.insns = NULL;
15178                 }
15179
15180                 if (fp == NULL) {
15181                         if (err == 0) {
15182                                 pass_cnt++;
15183                                 continue;
15184                         }
15185                         err_cnt++;
15186                         continue;
15187                 }
15188
15189                 pr_cont("jited:%u ", fp->jited);
15190
15191                 run_cnt++;
15192                 if (fp->jited)
15193                         jit_cnt++;
15194
15195                 err = run_one(fp, &tests[i]);
15196                 release_filter(fp, i);
15197
15198                 if (err) {
15199                         pr_cont("FAIL (%d times)\n", err);
15200                         err_cnt++;
15201                 } else {
15202                         pr_cont("PASS\n");
15203                         pass_cnt++;
15204                 }
15205         }
15206
15207         pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
15208                 pass_cnt, err_cnt, jit_cnt, run_cnt);
15209
15210         return err_cnt ? -EINVAL : 0;
15211 }
15212
15213 struct tail_call_test {
15214         const char *descr;
15215         struct bpf_insn insns[MAX_INSNS];
15216         int flags;
15217         int result;
15218         int stack_depth;
15219 };
15220
15221 /* Flags that can be passed to tail call test cases */
15222 #define FLAG_NEED_STATE         BIT(0)
15223 #define FLAG_RESULT_IN_STATE    BIT(1)
15224
15225 /*
15226  * Magic marker used in test snippets for tail calls below.
15227  * BPF_LD/MOV to R2 and R2 with this immediate value is replaced
15228  * with the proper values by the test runner.
15229  */
15230 #define TAIL_CALL_MARKER 0x7a11ca11
15231
15232 /* Special offset to indicate a NULL call target */
15233 #define TAIL_CALL_NULL 0x7fff
15234
15235 /* Special offset to indicate an out-of-range index */
15236 #define TAIL_CALL_INVALID 0x7ffe
15237
15238 #define TAIL_CALL(offset)                              \
15239         BPF_LD_IMM64(R2, TAIL_CALL_MARKER),            \
15240         BPF_RAW_INSN(BPF_ALU | BPF_MOV | BPF_K, R3, 0, \
15241                      offset, TAIL_CALL_MARKER),        \
15242         BPF_JMP_IMM(BPF_TAIL_CALL, 0, 0, 0)
15243
15244 /*
15245  * A test function to be called from a BPF program, clobbering a lot of
15246  * CPU registers in the process. A JITed BPF program calling this function
15247  * must save and restore any caller-saved registers it uses for internal
15248  * state, for example the current tail call count.
15249  */
15250 BPF_CALL_1(bpf_test_func, u64, arg)
15251 {
15252         char buf[64];
15253         long a = 0;
15254         long b = 1;
15255         long c = 2;
15256         long d = 3;
15257         long e = 4;
15258         long f = 5;
15259         long g = 6;
15260         long h = 7;
15261
15262         return snprintf(buf, sizeof(buf),
15263                         "%ld %lu %lx %ld %lu %lx %ld %lu %x",
15264                         a, b, c, d, e, f, g, h, (int)arg);
15265 }
15266 #define BPF_FUNC_test_func __BPF_FUNC_MAX_ID
15267
15268 /*
15269  * Tail call tests. Each test case may call any other test in the table,
15270  * including itself, specified as a relative index offset from the calling
15271  * test. The index TAIL_CALL_NULL can be used to specify a NULL target
15272  * function to test the JIT error path. Similarly, the index TAIL_CALL_INVALID
15273  * results in a target index that is out of range.
15274  */
15275 static struct tail_call_test tail_call_tests[] = {
15276         {
15277                 "Tail call leaf",
15278                 .insns = {
15279                         BPF_ALU64_REG(BPF_MOV, R0, R1),
15280                         BPF_ALU64_IMM(BPF_ADD, R0, 1),
15281                         BPF_EXIT_INSN(),
15282                 },
15283                 .result = 1,
15284         },
15285         {
15286                 "Tail call 2",
15287                 .insns = {
15288                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
15289                         TAIL_CALL(-1),
15290                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
15291                         BPF_EXIT_INSN(),
15292                 },
15293                 .result = 3,
15294         },
15295         {
15296                 "Tail call 3",
15297                 .insns = {
15298                         BPF_ALU64_IMM(BPF_ADD, R1, 3),
15299                         TAIL_CALL(-1),
15300                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
15301                         BPF_EXIT_INSN(),
15302                 },
15303                 .result = 6,
15304         },
15305         {
15306                 "Tail call 4",
15307                 .insns = {
15308                         BPF_ALU64_IMM(BPF_ADD, R1, 4),
15309                         TAIL_CALL(-1),
15310                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
15311                         BPF_EXIT_INSN(),
15312                 },
15313                 .result = 10,
15314         },
15315         {
15316                 "Tail call load/store leaf",
15317                 .insns = {
15318                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
15319                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
15320                         BPF_ALU64_REG(BPF_MOV, R3, BPF_REG_FP),
15321                         BPF_STX_MEM(BPF_DW, R3, R1, -8),
15322                         BPF_STX_MEM(BPF_DW, R3, R2, -16),
15323                         BPF_LDX_MEM(BPF_DW, R0, BPF_REG_FP, -8),
15324                         BPF_JMP_REG(BPF_JNE, R0, R1, 3),
15325                         BPF_LDX_MEM(BPF_DW, R0, BPF_REG_FP, -16),
15326                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
15327                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
15328                         BPF_EXIT_INSN(),
15329                 },
15330                 .result = 0,
15331                 .stack_depth = 32,
15332         },
15333         {
15334                 "Tail call load/store",
15335                 .insns = {
15336                         BPF_ALU64_IMM(BPF_MOV, R0, 3),
15337                         BPF_STX_MEM(BPF_DW, BPF_REG_FP, R0, -8),
15338                         TAIL_CALL(-1),
15339                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
15340                         BPF_EXIT_INSN(),
15341                 },
15342                 .result = 0,
15343                 .stack_depth = 16,
15344         },
15345         {
15346                 "Tail call error path, max count reached",
15347                 .insns = {
15348                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
15349                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
15350                         BPF_STX_MEM(BPF_W, R1, R2, 0),
15351                         TAIL_CALL(0),
15352                         BPF_EXIT_INSN(),
15353                 },
15354                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
15355                 .result = (MAX_TAIL_CALL_CNT + 1) * MAX_TESTRUNS,
15356         },
15357         {
15358                 "Tail call count preserved across function calls",
15359                 .insns = {
15360                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
15361                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
15362                         BPF_STX_MEM(BPF_W, R1, R2, 0),
15363                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
15364                         BPF_CALL_REL(BPF_FUNC_get_numa_node_id),
15365                         BPF_CALL_REL(BPF_FUNC_ktime_get_ns),
15366                         BPF_CALL_REL(BPF_FUNC_ktime_get_boot_ns),
15367                         BPF_CALL_REL(BPF_FUNC_ktime_get_coarse_ns),
15368                         BPF_CALL_REL(BPF_FUNC_jiffies64),
15369                         BPF_CALL_REL(BPF_FUNC_test_func),
15370                         BPF_LDX_MEM(BPF_DW, R1, R10, -8),
15371                         BPF_ALU32_REG(BPF_MOV, R0, R1),
15372                         TAIL_CALL(0),
15373                         BPF_EXIT_INSN(),
15374                 },
15375                 .stack_depth = 8,
15376                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
15377                 .result = (MAX_TAIL_CALL_CNT + 1) * MAX_TESTRUNS,
15378         },
15379         {
15380                 "Tail call error path, NULL target",
15381                 .insns = {
15382                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
15383                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
15384                         BPF_STX_MEM(BPF_W, R1, R2, 0),
15385                         TAIL_CALL(TAIL_CALL_NULL),
15386                         BPF_EXIT_INSN(),
15387                 },
15388                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
15389                 .result = MAX_TESTRUNS,
15390         },
15391         {
15392                 "Tail call error path, index out of range",
15393                 .insns = {
15394                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
15395                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
15396                         BPF_STX_MEM(BPF_W, R1, R2, 0),
15397                         TAIL_CALL(TAIL_CALL_INVALID),
15398                         BPF_EXIT_INSN(),
15399                 },
15400                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
15401                 .result = MAX_TESTRUNS,
15402         },
15403 };
15404
15405 static void __init destroy_tail_call_tests(struct bpf_array *progs)
15406 {
15407         int i;
15408
15409         for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++)
15410                 if (progs->ptrs[i])
15411                         bpf_prog_free(progs->ptrs[i]);
15412         kfree(progs);
15413 }
15414
15415 static __init int prepare_tail_call_tests(struct bpf_array **pprogs)
15416 {
15417         int ntests = ARRAY_SIZE(tail_call_tests);
15418         struct bpf_array *progs;
15419         int which, err;
15420
15421         /* Allocate the table of programs to be used for tail calls */
15422         progs = kzalloc(struct_size(progs, ptrs, ntests + 1), GFP_KERNEL);
15423         if (!progs)
15424                 goto out_nomem;
15425
15426         /* Create all eBPF programs and populate the table */
15427         for (which = 0; which < ntests; which++) {
15428                 struct tail_call_test *test = &tail_call_tests[which];
15429                 struct bpf_prog *fp;
15430                 int len, i;
15431
15432                 /* Compute the number of program instructions */
15433                 for (len = 0; len < MAX_INSNS; len++) {
15434                         struct bpf_insn *insn = &test->insns[len];
15435
15436                         if (len < MAX_INSNS - 1 &&
15437                             insn->code == (BPF_LD | BPF_DW | BPF_IMM))
15438                                 len++;
15439                         if (insn->code == 0)
15440                                 break;
15441                 }
15442
15443                 /* Allocate and initialize the program */
15444                 fp = bpf_prog_alloc(bpf_prog_size(len), 0);
15445                 if (!fp)
15446                         goto out_nomem;
15447
15448                 fp->len = len;
15449                 fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
15450                 fp->aux->stack_depth = test->stack_depth;
15451                 memcpy(fp->insnsi, test->insns, len * sizeof(struct bpf_insn));
15452
15453                 /* Relocate runtime tail call offsets and addresses */
15454                 for (i = 0; i < len; i++) {
15455                         struct bpf_insn *insn = &fp->insnsi[i];
15456                         long addr = 0;
15457
15458                         switch (insn->code) {
15459                         case BPF_LD | BPF_DW | BPF_IMM:
15460                                 if (insn->imm != TAIL_CALL_MARKER)
15461                                         break;
15462                                 insn[0].imm = (u32)(long)progs;
15463                                 insn[1].imm = ((u64)(long)progs) >> 32;
15464                                 break;
15465
15466                         case BPF_ALU | BPF_MOV | BPF_K:
15467                                 if (insn->imm != TAIL_CALL_MARKER)
15468                                         break;
15469                                 if (insn->off == TAIL_CALL_NULL)
15470                                         insn->imm = ntests;
15471                                 else if (insn->off == TAIL_CALL_INVALID)
15472                                         insn->imm = ntests + 1;
15473                                 else
15474                                         insn->imm = which + insn->off;
15475                                 insn->off = 0;
15476                                 break;
15477
15478                         case BPF_JMP | BPF_CALL:
15479                                 if (insn->src_reg != BPF_PSEUDO_CALL)
15480                                         break;
15481                                 switch (insn->imm) {
15482                                 case BPF_FUNC_get_numa_node_id:
15483                                         addr = (long)&numa_node_id;
15484                                         break;
15485                                 case BPF_FUNC_ktime_get_ns:
15486                                         addr = (long)&ktime_get_ns;
15487                                         break;
15488                                 case BPF_FUNC_ktime_get_boot_ns:
15489                                         addr = (long)&ktime_get_boot_fast_ns;
15490                                         break;
15491                                 case BPF_FUNC_ktime_get_coarse_ns:
15492                                         addr = (long)&ktime_get_coarse_ns;
15493                                         break;
15494                                 case BPF_FUNC_jiffies64:
15495                                         addr = (long)&get_jiffies_64;
15496                                         break;
15497                                 case BPF_FUNC_test_func:
15498                                         addr = (long)&bpf_test_func;
15499                                         break;
15500                                 default:
15501                                         err = -EFAULT;
15502                                         goto out_err;
15503                                 }
15504                                 *insn = BPF_EMIT_CALL(addr);
15505                                 if ((long)__bpf_call_base + insn->imm != addr)
15506                                         *insn = BPF_JMP_A(0); /* Skip: NOP */
15507                                 break;
15508                         }
15509                 }
15510
15511                 fp = bpf_prog_select_runtime(fp, &err);
15512                 if (err)
15513                         goto out_err;
15514
15515                 progs->ptrs[which] = fp;
15516         }
15517
15518         /* The last entry contains a NULL program pointer */
15519         progs->map.max_entries = ntests + 1;
15520         *pprogs = progs;
15521         return 0;
15522
15523 out_nomem:
15524         err = -ENOMEM;
15525
15526 out_err:
15527         if (progs)
15528                 destroy_tail_call_tests(progs);
15529         return err;
15530 }
15531
15532 static __init int test_tail_calls(struct bpf_array *progs)
15533 {
15534         int i, err_cnt = 0, pass_cnt = 0;
15535         int jit_cnt = 0, run_cnt = 0;
15536
15537         for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
15538                 struct tail_call_test *test = &tail_call_tests[i];
15539                 struct bpf_prog *fp = progs->ptrs[i];
15540                 int *data = NULL;
15541                 int state = 0;
15542                 u64 duration;
15543                 int ret;
15544
15545                 cond_resched();
15546                 if (exclude_test(i))
15547                         continue;
15548
15549                 pr_info("#%d %s ", i, test->descr);
15550                 if (!fp) {
15551                         err_cnt++;
15552                         continue;
15553                 }
15554                 pr_cont("jited:%u ", fp->jited);
15555
15556                 run_cnt++;
15557                 if (fp->jited)
15558                         jit_cnt++;
15559
15560                 if (test->flags & FLAG_NEED_STATE)
15561                         data = &state;
15562                 ret = __run_one(fp, data, MAX_TESTRUNS, &duration);
15563                 if (test->flags & FLAG_RESULT_IN_STATE)
15564                         ret = state;
15565                 if (ret == test->result) {
15566                         pr_cont("%lld PASS", duration);
15567                         pass_cnt++;
15568                 } else {
15569                         pr_cont("ret %d != %d FAIL", ret, test->result);
15570                         err_cnt++;
15571                 }
15572         }
15573
15574         pr_info("%s: Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
15575                 __func__, pass_cnt, err_cnt, jit_cnt, run_cnt);
15576
15577         return err_cnt ? -EINVAL : 0;
15578 }
15579
15580 static char test_suite[32];
15581 module_param_string(test_suite, test_suite, sizeof(test_suite), 0);
15582
15583 static __init int find_test_index(const char *test_name)
15584 {
15585         int i;
15586
15587         if (!strcmp(test_suite, "test_bpf")) {
15588                 for (i = 0; i < ARRAY_SIZE(tests); i++) {
15589                         if (!strcmp(tests[i].descr, test_name))
15590                                 return i;
15591                 }
15592         }
15593
15594         if (!strcmp(test_suite, "test_tail_calls")) {
15595                 for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
15596                         if (!strcmp(tail_call_tests[i].descr, test_name))
15597                                 return i;
15598                 }
15599         }
15600
15601         if (!strcmp(test_suite, "test_skb_segment")) {
15602                 for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
15603                         if (!strcmp(skb_segment_tests[i].descr, test_name))
15604                                 return i;
15605                 }
15606         }
15607
15608         return -1;
15609 }
15610
15611 static __init int prepare_test_range(void)
15612 {
15613         int valid_range;
15614
15615         if (!strcmp(test_suite, "test_bpf"))
15616                 valid_range = ARRAY_SIZE(tests);
15617         else if (!strcmp(test_suite, "test_tail_calls"))
15618                 valid_range = ARRAY_SIZE(tail_call_tests);
15619         else if (!strcmp(test_suite, "test_skb_segment"))
15620                 valid_range = ARRAY_SIZE(skb_segment_tests);
15621         else
15622                 return 0;
15623
15624         if (test_id >= 0) {
15625                 /*
15626                  * if a test_id was specified, use test_range to
15627                  * cover only that test.
15628                  */
15629                 if (test_id >= valid_range) {
15630                         pr_err("test_bpf: invalid test_id specified for '%s' suite.\n",
15631                                test_suite);
15632                         return -EINVAL;
15633                 }
15634
15635                 test_range[0] = test_id;
15636                 test_range[1] = test_id;
15637         } else if (*test_name) {
15638                 /*
15639                  * if a test_name was specified, find it and setup
15640                  * test_range to cover only that test.
15641                  */
15642                 int idx = find_test_index(test_name);
15643
15644                 if (idx < 0) {
15645                         pr_err("test_bpf: no test named '%s' found for '%s' suite.\n",
15646                                test_name, test_suite);
15647                         return -EINVAL;
15648                 }
15649                 test_range[0] = idx;
15650                 test_range[1] = idx;
15651         } else if (test_range[0] != 0 || test_range[1] != INT_MAX) {
15652                 /*
15653                  * check that the supplied test_range is valid.
15654                  */
15655                 if (test_range[0] < 0 || test_range[1] >= valid_range) {
15656                         pr_err("test_bpf: test_range is out of bound for '%s' suite.\n",
15657                                test_suite);
15658                         return -EINVAL;
15659                 }
15660
15661                 if (test_range[1] < test_range[0]) {
15662                         pr_err("test_bpf: test_range is ending before it starts.\n");
15663                         return -EINVAL;
15664                 }
15665         }
15666
15667         return 0;
15668 }
15669
15670 static int __init test_bpf_init(void)
15671 {
15672         struct bpf_array *progs = NULL;
15673         int ret;
15674
15675         if (strlen(test_suite) &&
15676             strcmp(test_suite, "test_bpf") &&
15677             strcmp(test_suite, "test_tail_calls") &&
15678             strcmp(test_suite, "test_skb_segment")) {
15679                 pr_err("test_bpf: invalid test_suite '%s' specified.\n", test_suite);
15680                 return -EINVAL;
15681         }
15682
15683         /*
15684          * if test_suite is not specified, but test_id, test_name or test_range
15685          * is specified, set 'test_bpf' as the default test suite.
15686          */
15687         if (!strlen(test_suite) &&
15688             (test_id != -1 || strlen(test_name) ||
15689             (test_range[0] != 0 || test_range[1] != INT_MAX))) {
15690                 pr_info("test_bpf: set 'test_bpf' as the default test_suite.\n");
15691                 strscpy(test_suite, "test_bpf", sizeof(test_suite));
15692         }
15693
15694         ret = prepare_test_range();
15695         if (ret < 0)
15696                 return ret;
15697
15698         if (!strlen(test_suite) || !strcmp(test_suite, "test_bpf")) {
15699                 ret = test_bpf();
15700                 if (ret)
15701                         return ret;
15702         }
15703
15704         if (!strlen(test_suite) || !strcmp(test_suite, "test_tail_calls")) {
15705                 ret = prepare_tail_call_tests(&progs);
15706                 if (ret)
15707                         return ret;
15708                 ret = test_tail_calls(progs);
15709                 destroy_tail_call_tests(progs);
15710                 if (ret)
15711                         return ret;
15712         }
15713
15714         if (!strlen(test_suite) || !strcmp(test_suite, "test_skb_segment"))
15715                 return test_skb_segment();
15716
15717         return 0;
15718 }
15719
15720 static void __exit test_bpf_exit(void)
15721 {
15722 }
15723
15724 module_init(test_bpf_init);
15725 module_exit(test_bpf_exit);
15726
15727 MODULE_LICENSE("GPL");