Merge tag 'usb-5.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[linux-2.6-microblaze.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
57 enum {
58         CLASSIC  = BIT(6),      /* Old BPF instructions only. */
59         INTERNAL = BIT(7),      /* Extended instruction set.  */
60 };
61
62 #define TEST_TYPE_MASK          (CLASSIC | INTERNAL)
63
64 struct bpf_test {
65         const char *descr;
66         union {
67                 struct sock_filter insns[MAX_INSNS];
68                 struct bpf_insn insns_int[MAX_INSNS];
69                 struct {
70                         void *insns;
71                         unsigned int len;
72                 } ptr;
73         } u;
74         __u8 aux;
75         __u8 data[MAX_DATA];
76         struct {
77                 int data_size;
78                 __u32 result;
79         } test[MAX_SUBTESTS];
80         int (*fill_helper)(struct bpf_test *self);
81         int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
82         __u8 frag_data[MAX_DATA];
83         int stack_depth; /* for eBPF only, since tests don't call verifier */
84         int nr_testruns; /* Custom run count, defaults to MAX_TESTRUNS if 0 */
85 };
86
87 /* Large test cases need separate allocation and fill handler. */
88
89 static int bpf_fill_maxinsns1(struct bpf_test *self)
90 {
91         unsigned int len = BPF_MAXINSNS;
92         struct sock_filter *insn;
93         __u32 k = ~0;
94         int i;
95
96         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
97         if (!insn)
98                 return -ENOMEM;
99
100         for (i = 0; i < len; i++, k--)
101                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
102
103         self->u.ptr.insns = insn;
104         self->u.ptr.len = len;
105
106         return 0;
107 }
108
109 static int bpf_fill_maxinsns2(struct bpf_test *self)
110 {
111         unsigned int len = BPF_MAXINSNS;
112         struct sock_filter *insn;
113         int i;
114
115         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
116         if (!insn)
117                 return -ENOMEM;
118
119         for (i = 0; i < len; i++)
120                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
121
122         self->u.ptr.insns = insn;
123         self->u.ptr.len = len;
124
125         return 0;
126 }
127
128 static int bpf_fill_maxinsns3(struct bpf_test *self)
129 {
130         unsigned int len = BPF_MAXINSNS;
131         struct sock_filter *insn;
132         struct rnd_state rnd;
133         int i;
134
135         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
136         if (!insn)
137                 return -ENOMEM;
138
139         prandom_seed_state(&rnd, 3141592653589793238ULL);
140
141         for (i = 0; i < len - 1; i++) {
142                 __u32 k = prandom_u32_state(&rnd);
143
144                 insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
145         }
146
147         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
148
149         self->u.ptr.insns = insn;
150         self->u.ptr.len = len;
151
152         return 0;
153 }
154
155 static int bpf_fill_maxinsns4(struct bpf_test *self)
156 {
157         unsigned int len = BPF_MAXINSNS + 1;
158         struct sock_filter *insn;
159         int i;
160
161         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
162         if (!insn)
163                 return -ENOMEM;
164
165         for (i = 0; i < len; i++)
166                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
167
168         self->u.ptr.insns = insn;
169         self->u.ptr.len = len;
170
171         return 0;
172 }
173
174 static int bpf_fill_maxinsns5(struct bpf_test *self)
175 {
176         unsigned int len = BPF_MAXINSNS;
177         struct sock_filter *insn;
178         int i;
179
180         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
181         if (!insn)
182                 return -ENOMEM;
183
184         insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
185
186         for (i = 1; i < len - 1; i++)
187                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
188
189         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
190
191         self->u.ptr.insns = insn;
192         self->u.ptr.len = len;
193
194         return 0;
195 }
196
197 static int bpf_fill_maxinsns6(struct bpf_test *self)
198 {
199         unsigned int len = BPF_MAXINSNS;
200         struct sock_filter *insn;
201         int i;
202
203         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
204         if (!insn)
205                 return -ENOMEM;
206
207         for (i = 0; i < len - 1; i++)
208                 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
209                                      SKF_AD_VLAN_TAG_PRESENT);
210
211         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
212
213         self->u.ptr.insns = insn;
214         self->u.ptr.len = len;
215
216         return 0;
217 }
218
219 static int bpf_fill_maxinsns7(struct bpf_test *self)
220 {
221         unsigned int len = BPF_MAXINSNS;
222         struct sock_filter *insn;
223         int i;
224
225         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
226         if (!insn)
227                 return -ENOMEM;
228
229         for (i = 0; i < len - 4; i++)
230                 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
231                                      SKF_AD_CPU);
232
233         insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
234         insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
235                                    SKF_AD_CPU);
236         insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
237         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
238
239         self->u.ptr.insns = insn;
240         self->u.ptr.len = len;
241
242         return 0;
243 }
244
245 static int bpf_fill_maxinsns8(struct bpf_test *self)
246 {
247         unsigned int len = BPF_MAXINSNS;
248         struct sock_filter *insn;
249         int i, jmp_off = len - 3;
250
251         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
252         if (!insn)
253                 return -ENOMEM;
254
255         insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
256
257         for (i = 1; i < len - 1; i++)
258                 insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
259
260         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
261
262         self->u.ptr.insns = insn;
263         self->u.ptr.len = len;
264
265         return 0;
266 }
267
268 static int bpf_fill_maxinsns9(struct bpf_test *self)
269 {
270         unsigned int len = BPF_MAXINSNS;
271         struct bpf_insn *insn;
272         int i;
273
274         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
275         if (!insn)
276                 return -ENOMEM;
277
278         insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
279         insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
280         insn[2] = BPF_EXIT_INSN();
281
282         for (i = 3; i < len - 2; i++)
283                 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
284
285         insn[len - 2] = BPF_EXIT_INSN();
286         insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
287
288         self->u.ptr.insns = insn;
289         self->u.ptr.len = len;
290
291         return 0;
292 }
293
294 static int bpf_fill_maxinsns10(struct bpf_test *self)
295 {
296         unsigned int len = BPF_MAXINSNS, hlen = len - 2;
297         struct bpf_insn *insn;
298         int i;
299
300         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
301         if (!insn)
302                 return -ENOMEM;
303
304         for (i = 0; i < hlen / 2; i++)
305                 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
306         for (i = hlen - 1; i > hlen / 2; i--)
307                 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
308
309         insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
310         insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
311         insn[hlen + 1] = BPF_EXIT_INSN();
312
313         self->u.ptr.insns = insn;
314         self->u.ptr.len = len;
315
316         return 0;
317 }
318
319 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
320                          unsigned int plen)
321 {
322         struct sock_filter *insn;
323         unsigned int rlen;
324         int i, j;
325
326         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
327         if (!insn)
328                 return -ENOMEM;
329
330         rlen = (len % plen) - 1;
331
332         for (i = 0; i + plen < len; i += plen)
333                 for (j = 0; j < plen; j++)
334                         insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
335                                                  plen - 1 - j, 0, 0);
336         for (j = 0; j < rlen; j++)
337                 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
338                                          0, 0);
339
340         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
341
342         self->u.ptr.insns = insn;
343         self->u.ptr.len = len;
344
345         return 0;
346 }
347
348 static int bpf_fill_maxinsns11(struct bpf_test *self)
349 {
350         /* Hits 70 passes on x86_64 and triggers NOPs padding. */
351         return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
352 }
353
354 static int bpf_fill_maxinsns12(struct bpf_test *self)
355 {
356         unsigned int len = BPF_MAXINSNS;
357         struct sock_filter *insn;
358         int i = 0;
359
360         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
361         if (!insn)
362                 return -ENOMEM;
363
364         insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
365
366         for (i = 1; i < len - 1; i++)
367                 insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
368
369         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
370
371         self->u.ptr.insns = insn;
372         self->u.ptr.len = len;
373
374         return 0;
375 }
376
377 static int bpf_fill_maxinsns13(struct bpf_test *self)
378 {
379         unsigned int len = BPF_MAXINSNS;
380         struct sock_filter *insn;
381         int i = 0;
382
383         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
384         if (!insn)
385                 return -ENOMEM;
386
387         for (i = 0; i < len - 3; i++)
388                 insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
389
390         insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
391         insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
392         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
393
394         self->u.ptr.insns = insn;
395         self->u.ptr.len = len;
396
397         return 0;
398 }
399
400 static int bpf_fill_ja(struct bpf_test *self)
401 {
402         /* Hits exactly 11 passes on x86_64 JIT. */
403         return __bpf_fill_ja(self, 12, 9);
404 }
405
406 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
407 {
408         unsigned int len = BPF_MAXINSNS;
409         struct sock_filter *insn;
410         int i;
411
412         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
413         if (!insn)
414                 return -ENOMEM;
415
416         for (i = 0; i < len - 1; i += 2) {
417                 insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
418                 insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
419                                          SKF_AD_OFF + SKF_AD_CPU);
420         }
421
422         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
423
424         self->u.ptr.insns = insn;
425         self->u.ptr.len = len;
426
427         return 0;
428 }
429
430 static int __bpf_fill_stxdw(struct bpf_test *self, int size)
431 {
432         unsigned int len = BPF_MAXINSNS;
433         struct bpf_insn *insn;
434         int i;
435
436         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
437         if (!insn)
438                 return -ENOMEM;
439
440         insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
441         insn[1] = BPF_ST_MEM(size, R10, -40, 42);
442
443         for (i = 2; i < len - 2; i++)
444                 insn[i] = BPF_STX_XADD(size, R10, R0, -40);
445
446         insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
447         insn[len - 1] = BPF_EXIT_INSN();
448
449         self->u.ptr.insns = insn;
450         self->u.ptr.len = len;
451         self->stack_depth = 40;
452
453         return 0;
454 }
455
456 static int bpf_fill_stxw(struct bpf_test *self)
457 {
458         return __bpf_fill_stxdw(self, BPF_W);
459 }
460
461 static int bpf_fill_stxdw(struct bpf_test *self)
462 {
463         return __bpf_fill_stxdw(self, BPF_DW);
464 }
465
466 static int __bpf_ld_imm64(struct bpf_insn insns[2], u8 reg, s64 imm64)
467 {
468         struct bpf_insn tmp[] = {BPF_LD_IMM64(reg, imm64)};
469
470         memcpy(insns, tmp, sizeof(tmp));
471         return 2;
472 }
473
474 /*
475  * Branch conversion tests. Complex operations can expand to a lot
476  * of instructions when JITed. This in turn may cause jump offsets
477  * to overflow the field size of the native instruction, triggering
478  * a branch conversion mechanism in some JITs.
479  */
480 static int __bpf_fill_max_jmp(struct bpf_test *self, int jmp, int imm)
481 {
482         struct bpf_insn *insns;
483         int len = S16_MAX + 5;
484         int i;
485
486         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
487         if (!insns)
488                 return -ENOMEM;
489
490         i = __bpf_ld_imm64(insns, R1, 0x0123456789abcdefULL);
491         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
492         insns[i++] = BPF_JMP_IMM(jmp, R0, imm, S16_MAX);
493         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 2);
494         insns[i++] = BPF_EXIT_INSN();
495
496         while (i < len - 1) {
497                 static const int ops[] = {
498                         BPF_LSH, BPF_RSH, BPF_ARSH, BPF_ADD,
499                         BPF_SUB, BPF_MUL, BPF_DIV, BPF_MOD,
500                 };
501                 int op = ops[(i >> 1) % ARRAY_SIZE(ops)];
502
503                 if (i & 1)
504                         insns[i++] = BPF_ALU32_REG(op, R0, R1);
505                 else
506                         insns[i++] = BPF_ALU64_REG(op, R0, R1);
507         }
508
509         insns[i++] = BPF_EXIT_INSN();
510         self->u.ptr.insns = insns;
511         self->u.ptr.len = len;
512         BUG_ON(i != len);
513
514         return 0;
515 }
516
517 /* Branch taken by runtime decision */
518 static int bpf_fill_max_jmp_taken(struct bpf_test *self)
519 {
520         return __bpf_fill_max_jmp(self, BPF_JEQ, 1);
521 }
522
523 /* Branch not taken by runtime decision */
524 static int bpf_fill_max_jmp_not_taken(struct bpf_test *self)
525 {
526         return __bpf_fill_max_jmp(self, BPF_JEQ, 0);
527 }
528
529 /* Branch always taken, known at JIT time */
530 static int bpf_fill_max_jmp_always_taken(struct bpf_test *self)
531 {
532         return __bpf_fill_max_jmp(self, BPF_JGE, 0);
533 }
534
535 /* Branch never taken, known at JIT time */
536 static int bpf_fill_max_jmp_never_taken(struct bpf_test *self)
537 {
538         return __bpf_fill_max_jmp(self, BPF_JLT, 0);
539 }
540
541 /* ALU result computation used in tests */
542 static bool __bpf_alu_result(u64 *res, u64 v1, u64 v2, u8 op)
543 {
544         *res = 0;
545         switch (op) {
546         case BPF_MOV:
547                 *res = v2;
548                 break;
549         case BPF_AND:
550                 *res = v1 & v2;
551                 break;
552         case BPF_OR:
553                 *res = v1 | v2;
554                 break;
555         case BPF_XOR:
556                 *res = v1 ^ v2;
557                 break;
558         case BPF_LSH:
559                 *res = v1 << v2;
560                 break;
561         case BPF_RSH:
562                 *res = v1 >> v2;
563                 break;
564         case BPF_ARSH:
565                 *res = v1 >> v2;
566                 if (v2 > 0 && v1 > S64_MAX)
567                         *res |= ~0ULL << (64 - v2);
568                 break;
569         case BPF_ADD:
570                 *res = v1 + v2;
571                 break;
572         case BPF_SUB:
573                 *res = v1 - v2;
574                 break;
575         case BPF_MUL:
576                 *res = v1 * v2;
577                 break;
578         case BPF_DIV:
579                 if (v2 == 0)
580                         return false;
581                 *res = div64_u64(v1, v2);
582                 break;
583         case BPF_MOD:
584                 if (v2 == 0)
585                         return false;
586                 div64_u64_rem(v1, v2, res);
587                 break;
588         }
589         return true;
590 }
591
592 /* Test an ALU shift operation for all valid shift values */
593 static int __bpf_fill_alu_shift(struct bpf_test *self, u8 op,
594                                 u8 mode, bool alu32)
595 {
596         static const s64 regs[] = {
597                 0x0123456789abcdefLL, /* dword > 0, word < 0 */
598                 0xfedcba9876543210LL, /* dowrd < 0, word > 0 */
599                 0xfedcba0198765432LL, /* dowrd < 0, word < 0 */
600                 0x0123458967abcdefLL, /* dword > 0, word > 0 */
601         };
602         int bits = alu32 ? 32 : 64;
603         int len = (2 + 7 * bits) * ARRAY_SIZE(regs) + 3;
604         struct bpf_insn *insn;
605         int imm, k;
606         int i = 0;
607
608         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
609         if (!insn)
610                 return -ENOMEM;
611
612         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
613
614         for (k = 0; k < ARRAY_SIZE(regs); k++) {
615                 s64 reg = regs[k];
616
617                 i += __bpf_ld_imm64(&insn[i], R3, reg);
618
619                 for (imm = 0; imm < bits; imm++) {
620                         u64 val;
621
622                         /* Perform operation */
623                         insn[i++] = BPF_ALU64_REG(BPF_MOV, R1, R3);
624                         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R2, imm);
625                         if (alu32) {
626                                 if (mode == BPF_K)
627                                         insn[i++] = BPF_ALU32_IMM(op, R1, imm);
628                                 else
629                                         insn[i++] = BPF_ALU32_REG(op, R1, R2);
630
631                                 if (op == BPF_ARSH)
632                                         reg = (s32)reg;
633                                 else
634                                         reg = (u32)reg;
635                                 __bpf_alu_result(&val, reg, imm, op);
636                                 val = (u32)val;
637                         } else {
638                                 if (mode == BPF_K)
639                                         insn[i++] = BPF_ALU64_IMM(op, R1, imm);
640                                 else
641                                         insn[i++] = BPF_ALU64_REG(op, R1, R2);
642                                 __bpf_alu_result(&val, reg, imm, op);
643                         }
644
645                         /*
646                          * When debugging a JIT that fails this test, one
647                          * can write the immediate value to R0 here to find
648                          * out which operand values that fail.
649                          */
650
651                         /* Load reference and check the result */
652                         i += __bpf_ld_imm64(&insn[i], R4, val);
653                         insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R4, 1);
654                         insn[i++] = BPF_EXIT_INSN();
655                 }
656         }
657
658         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
659         insn[i++] = BPF_EXIT_INSN();
660
661         self->u.ptr.insns = insn;
662         self->u.ptr.len = len;
663         BUG_ON(i != len);
664
665         return 0;
666 }
667
668 static int bpf_fill_alu64_lsh_imm(struct bpf_test *self)
669 {
670         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, false);
671 }
672
673 static int bpf_fill_alu64_rsh_imm(struct bpf_test *self)
674 {
675         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, false);
676 }
677
678 static int bpf_fill_alu64_arsh_imm(struct bpf_test *self)
679 {
680         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, false);
681 }
682
683 static int bpf_fill_alu64_lsh_reg(struct bpf_test *self)
684 {
685         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, false);
686 }
687
688 static int bpf_fill_alu64_rsh_reg(struct bpf_test *self)
689 {
690         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, false);
691 }
692
693 static int bpf_fill_alu64_arsh_reg(struct bpf_test *self)
694 {
695         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, false);
696 }
697
698 static int bpf_fill_alu32_lsh_imm(struct bpf_test *self)
699 {
700         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, true);
701 }
702
703 static int bpf_fill_alu32_rsh_imm(struct bpf_test *self)
704 {
705         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, true);
706 }
707
708 static int bpf_fill_alu32_arsh_imm(struct bpf_test *self)
709 {
710         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, true);
711 }
712
713 static int bpf_fill_alu32_lsh_reg(struct bpf_test *self)
714 {
715         return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, true);
716 }
717
718 static int bpf_fill_alu32_rsh_reg(struct bpf_test *self)
719 {
720         return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, true);
721 }
722
723 static int bpf_fill_alu32_arsh_reg(struct bpf_test *self)
724 {
725         return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, true);
726 }
727
728 /*
729  * Test an ALU register shift operation for all valid shift values
730  * for the case when the source and destination are the same.
731  */
732 static int __bpf_fill_alu_shift_same_reg(struct bpf_test *self, u8 op,
733                                          bool alu32)
734 {
735         int bits = alu32 ? 32 : 64;
736         int len = 3 + 6 * bits;
737         struct bpf_insn *insn;
738         int i = 0;
739         u64 val;
740
741         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
742         if (!insn)
743                 return -ENOMEM;
744
745         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
746
747         for (val = 0; val < bits; val++) {
748                 u64 res;
749
750                 /* Perform operation */
751                 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R1, val);
752                 if (alu32)
753                         insn[i++] = BPF_ALU32_REG(op, R1, R1);
754                 else
755                         insn[i++] = BPF_ALU64_REG(op, R1, R1);
756
757                 /* Compute the reference result */
758                 __bpf_alu_result(&res, val, val, op);
759                 if (alu32)
760                         res = (u32)res;
761                 i += __bpf_ld_imm64(&insn[i], R2, res);
762
763                 /* Check the actual result */
764                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
765                 insn[i++] = BPF_EXIT_INSN();
766         }
767
768         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
769         insn[i++] = BPF_EXIT_INSN();
770
771         self->u.ptr.insns = insn;
772         self->u.ptr.len = len;
773         BUG_ON(i != len);
774
775         return 0;
776 }
777
778 static int bpf_fill_alu64_lsh_same_reg(struct bpf_test *self)
779 {
780         return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, false);
781 }
782
783 static int bpf_fill_alu64_rsh_same_reg(struct bpf_test *self)
784 {
785         return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, false);
786 }
787
788 static int bpf_fill_alu64_arsh_same_reg(struct bpf_test *self)
789 {
790         return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, false);
791 }
792
793 static int bpf_fill_alu32_lsh_same_reg(struct bpf_test *self)
794 {
795         return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, true);
796 }
797
798 static int bpf_fill_alu32_rsh_same_reg(struct bpf_test *self)
799 {
800         return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, true);
801 }
802
803 static int bpf_fill_alu32_arsh_same_reg(struct bpf_test *self)
804 {
805         return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, true);
806 }
807
808 /*
809  * Common operand pattern generator for exhaustive power-of-two magnitudes
810  * tests. The block size parameters can be adjusted to increase/reduce the
811  * number of combinatons tested and thereby execution speed and memory
812  * footprint.
813  */
814
815 static inline s64 value(int msb, int delta, int sign)
816 {
817         return sign * (1LL << msb) + delta;
818 }
819
820 static int __bpf_fill_pattern(struct bpf_test *self, void *arg,
821                               int dbits, int sbits, int block1, int block2,
822                               int (*emit)(struct bpf_test*, void*,
823                                           struct bpf_insn*, s64, s64))
824 {
825         static const int sgn[][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
826         struct bpf_insn *insns;
827         int di, si, bt, db, sb;
828         int count, len, k;
829         int extra = 1 + 2;
830         int i = 0;
831
832         /* Total number of iterations for the two pattern */
833         count = (dbits - 1) * (sbits - 1) * block1 * block1 * ARRAY_SIZE(sgn);
834         count += (max(dbits, sbits) - 1) * block2 * block2 * ARRAY_SIZE(sgn);
835
836         /* Compute the maximum number of insns and allocate the buffer */
837         len = extra + count * (*emit)(self, arg, NULL, 0, 0);
838         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
839         if (!insns)
840                 return -ENOMEM;
841
842         /* Add head instruction(s) */
843         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
844
845         /*
846          * Pattern 1: all combinations of power-of-two magnitudes and sign,
847          * and with a block of contiguous values around each magnitude.
848          */
849         for (di = 0; di < dbits - 1; di++)                 /* Dst magnitudes */
850                 for (si = 0; si < sbits - 1; si++)         /* Src magnitudes */
851                         for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */
852                                 for (db = -(block1 / 2);
853                                      db < (block1 + 1) / 2; db++)
854                                         for (sb = -(block1 / 2);
855                                              sb < (block1 + 1) / 2; sb++) {
856                                                 s64 dst, src;
857
858                                                 dst = value(di, db, sgn[k][0]);
859                                                 src = value(si, sb, sgn[k][1]);
860                                                 i += (*emit)(self, arg,
861                                                              &insns[i],
862                                                              dst, src);
863                                         }
864         /*
865          * Pattern 2: all combinations for a larger block of values
866          * for each power-of-two magnitude and sign, where the magnitude is
867          * the same for both operands.
868          */
869         for (bt = 0; bt < max(dbits, sbits) - 1; bt++)        /* Magnitude   */
870                 for (k = 0; k < ARRAY_SIZE(sgn); k++)         /* Sign combos */
871                         for (db = -(block2 / 2); db < (block2 + 1) / 2; db++)
872                                 for (sb = -(block2 / 2);
873                                      sb < (block2 + 1) / 2; sb++) {
874                                         s64 dst, src;
875
876                                         dst = value(bt % dbits, db, sgn[k][0]);
877                                         src = value(bt % sbits, sb, sgn[k][1]);
878                                         i += (*emit)(self, arg, &insns[i],
879                                                      dst, src);
880                                 }
881
882         /* Append tail instructions */
883         insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
884         insns[i++] = BPF_EXIT_INSN();
885         BUG_ON(i > len);
886
887         self->u.ptr.insns = insns;
888         self->u.ptr.len = i;
889
890         return 0;
891 }
892
893 /*
894  * Block size parameters used in pattern tests below. une as needed to
895  * increase/reduce the number combinations tested, see following examples.
896  *        block   values per operand MSB
897  * ----------------------------------------
898  *           0     none
899  *           1     (1 << MSB)
900  *           2     (1 << MSB) + [-1, 0]
901  *           3     (1 << MSB) + [-1, 0, 1]
902  */
903 #define PATTERN_BLOCK1 1
904 #define PATTERN_BLOCK2 5
905
906 /* Number of test runs for a pattern test */
907 #define NR_PATTERN_RUNS 1
908
909 /*
910  * Exhaustive tests of ALU operations for all combinations of power-of-two
911  * magnitudes of the operands, both for positive and negative values. The
912  * test is designed to verify e.g. the ALU and ALU64 operations for JITs that
913  * emit different code depending on the magnitude of the immediate value.
914  */
915 static int __bpf_emit_alu64_imm(struct bpf_test *self, void *arg,
916                                 struct bpf_insn *insns, s64 dst, s64 imm)
917 {
918         int op = *(int *)arg;
919         int i = 0;
920         u64 res;
921
922         if (!insns)
923                 return 7;
924
925         if (__bpf_alu_result(&res, dst, (s32)imm, op)) {
926                 i += __bpf_ld_imm64(&insns[i], R1, dst);
927                 i += __bpf_ld_imm64(&insns[i], R3, res);
928                 insns[i++] = BPF_ALU64_IMM(op, R1, imm);
929                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
930                 insns[i++] = BPF_EXIT_INSN();
931         }
932
933         return i;
934 }
935
936 static int __bpf_emit_alu32_imm(struct bpf_test *self, void *arg,
937                                 struct bpf_insn *insns, s64 dst, s64 imm)
938 {
939         int op = *(int *)arg;
940         int i = 0;
941         u64 res;
942
943         if (!insns)
944                 return 7;
945
946         if (__bpf_alu_result(&res, (u32)dst, (u32)imm, op)) {
947                 i += __bpf_ld_imm64(&insns[i], R1, dst);
948                 i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
949                 insns[i++] = BPF_ALU32_IMM(op, R1, imm);
950                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
951                 insns[i++] = BPF_EXIT_INSN();
952         }
953
954         return i;
955 }
956
957 static int __bpf_emit_alu64_reg(struct bpf_test *self, void *arg,
958                                 struct bpf_insn *insns, s64 dst, s64 src)
959 {
960         int op = *(int *)arg;
961         int i = 0;
962         u64 res;
963
964         if (!insns)
965                 return 9;
966
967         if (__bpf_alu_result(&res, dst, src, op)) {
968                 i += __bpf_ld_imm64(&insns[i], R1, dst);
969                 i += __bpf_ld_imm64(&insns[i], R2, src);
970                 i += __bpf_ld_imm64(&insns[i], R3, res);
971                 insns[i++] = BPF_ALU64_REG(op, R1, R2);
972                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
973                 insns[i++] = BPF_EXIT_INSN();
974         }
975
976         return i;
977 }
978
979 static int __bpf_emit_alu32_reg(struct bpf_test *self, void *arg,
980                                 struct bpf_insn *insns, s64 dst, s64 src)
981 {
982         int op = *(int *)arg;
983         int i = 0;
984         u64 res;
985
986         if (!insns)
987                 return 9;
988
989         if (__bpf_alu_result(&res, (u32)dst, (u32)src, op)) {
990                 i += __bpf_ld_imm64(&insns[i], R1, dst);
991                 i += __bpf_ld_imm64(&insns[i], R2, src);
992                 i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
993                 insns[i++] = BPF_ALU32_REG(op, R1, R2);
994                 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
995                 insns[i++] = BPF_EXIT_INSN();
996         }
997
998         return i;
999 }
1000
1001 static int __bpf_fill_alu64_imm(struct bpf_test *self, int op)
1002 {
1003         return __bpf_fill_pattern(self, &op, 64, 32,
1004                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1005                                   &__bpf_emit_alu64_imm);
1006 }
1007
1008 static int __bpf_fill_alu32_imm(struct bpf_test *self, int op)
1009 {
1010         return __bpf_fill_pattern(self, &op, 64, 32,
1011                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1012                                   &__bpf_emit_alu32_imm);
1013 }
1014
1015 static int __bpf_fill_alu64_reg(struct bpf_test *self, int op)
1016 {
1017         return __bpf_fill_pattern(self, &op, 64, 64,
1018                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1019                                   &__bpf_emit_alu64_reg);
1020 }
1021
1022 static int __bpf_fill_alu32_reg(struct bpf_test *self, int op)
1023 {
1024         return __bpf_fill_pattern(self, &op, 64, 64,
1025                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
1026                                   &__bpf_emit_alu32_reg);
1027 }
1028
1029 /* ALU64 immediate operations */
1030 static int bpf_fill_alu64_mov_imm(struct bpf_test *self)
1031 {
1032         return __bpf_fill_alu64_imm(self, BPF_MOV);
1033 }
1034
1035 static int bpf_fill_alu64_and_imm(struct bpf_test *self)
1036 {
1037         return __bpf_fill_alu64_imm(self, BPF_AND);
1038 }
1039
1040 static int bpf_fill_alu64_or_imm(struct bpf_test *self)
1041 {
1042         return __bpf_fill_alu64_imm(self, BPF_OR);
1043 }
1044
1045 static int bpf_fill_alu64_xor_imm(struct bpf_test *self)
1046 {
1047         return __bpf_fill_alu64_imm(self, BPF_XOR);
1048 }
1049
1050 static int bpf_fill_alu64_add_imm(struct bpf_test *self)
1051 {
1052         return __bpf_fill_alu64_imm(self, BPF_ADD);
1053 }
1054
1055 static int bpf_fill_alu64_sub_imm(struct bpf_test *self)
1056 {
1057         return __bpf_fill_alu64_imm(self, BPF_SUB);
1058 }
1059
1060 static int bpf_fill_alu64_mul_imm(struct bpf_test *self)
1061 {
1062         return __bpf_fill_alu64_imm(self, BPF_MUL);
1063 }
1064
1065 static int bpf_fill_alu64_div_imm(struct bpf_test *self)
1066 {
1067         return __bpf_fill_alu64_imm(self, BPF_DIV);
1068 }
1069
1070 static int bpf_fill_alu64_mod_imm(struct bpf_test *self)
1071 {
1072         return __bpf_fill_alu64_imm(self, BPF_MOD);
1073 }
1074
1075 /* ALU32 immediate operations */
1076 static int bpf_fill_alu32_mov_imm(struct bpf_test *self)
1077 {
1078         return __bpf_fill_alu32_imm(self, BPF_MOV);
1079 }
1080
1081 static int bpf_fill_alu32_and_imm(struct bpf_test *self)
1082 {
1083         return __bpf_fill_alu32_imm(self, BPF_AND);
1084 }
1085
1086 static int bpf_fill_alu32_or_imm(struct bpf_test *self)
1087 {
1088         return __bpf_fill_alu32_imm(self, BPF_OR);
1089 }
1090
1091 static int bpf_fill_alu32_xor_imm(struct bpf_test *self)
1092 {
1093         return __bpf_fill_alu32_imm(self, BPF_XOR);
1094 }
1095
1096 static int bpf_fill_alu32_add_imm(struct bpf_test *self)
1097 {
1098         return __bpf_fill_alu32_imm(self, BPF_ADD);
1099 }
1100
1101 static int bpf_fill_alu32_sub_imm(struct bpf_test *self)
1102 {
1103         return __bpf_fill_alu32_imm(self, BPF_SUB);
1104 }
1105
1106 static int bpf_fill_alu32_mul_imm(struct bpf_test *self)
1107 {
1108         return __bpf_fill_alu32_imm(self, BPF_MUL);
1109 }
1110
1111 static int bpf_fill_alu32_div_imm(struct bpf_test *self)
1112 {
1113         return __bpf_fill_alu32_imm(self, BPF_DIV);
1114 }
1115
1116 static int bpf_fill_alu32_mod_imm(struct bpf_test *self)
1117 {
1118         return __bpf_fill_alu32_imm(self, BPF_MOD);
1119 }
1120
1121 /* ALU64 register operations */
1122 static int bpf_fill_alu64_mov_reg(struct bpf_test *self)
1123 {
1124         return __bpf_fill_alu64_reg(self, BPF_MOV);
1125 }
1126
1127 static int bpf_fill_alu64_and_reg(struct bpf_test *self)
1128 {
1129         return __bpf_fill_alu64_reg(self, BPF_AND);
1130 }
1131
1132 static int bpf_fill_alu64_or_reg(struct bpf_test *self)
1133 {
1134         return __bpf_fill_alu64_reg(self, BPF_OR);
1135 }
1136
1137 static int bpf_fill_alu64_xor_reg(struct bpf_test *self)
1138 {
1139         return __bpf_fill_alu64_reg(self, BPF_XOR);
1140 }
1141
1142 static int bpf_fill_alu64_add_reg(struct bpf_test *self)
1143 {
1144         return __bpf_fill_alu64_reg(self, BPF_ADD);
1145 }
1146
1147 static int bpf_fill_alu64_sub_reg(struct bpf_test *self)
1148 {
1149         return __bpf_fill_alu64_reg(self, BPF_SUB);
1150 }
1151
1152 static int bpf_fill_alu64_mul_reg(struct bpf_test *self)
1153 {
1154         return __bpf_fill_alu64_reg(self, BPF_MUL);
1155 }
1156
1157 static int bpf_fill_alu64_div_reg(struct bpf_test *self)
1158 {
1159         return __bpf_fill_alu64_reg(self, BPF_DIV);
1160 }
1161
1162 static int bpf_fill_alu64_mod_reg(struct bpf_test *self)
1163 {
1164         return __bpf_fill_alu64_reg(self, BPF_MOD);
1165 }
1166
1167 /* ALU32 register operations */
1168 static int bpf_fill_alu32_mov_reg(struct bpf_test *self)
1169 {
1170         return __bpf_fill_alu32_reg(self, BPF_MOV);
1171 }
1172
1173 static int bpf_fill_alu32_and_reg(struct bpf_test *self)
1174 {
1175         return __bpf_fill_alu32_reg(self, BPF_AND);
1176 }
1177
1178 static int bpf_fill_alu32_or_reg(struct bpf_test *self)
1179 {
1180         return __bpf_fill_alu32_reg(self, BPF_OR);
1181 }
1182
1183 static int bpf_fill_alu32_xor_reg(struct bpf_test *self)
1184 {
1185         return __bpf_fill_alu32_reg(self, BPF_XOR);
1186 }
1187
1188 static int bpf_fill_alu32_add_reg(struct bpf_test *self)
1189 {
1190         return __bpf_fill_alu32_reg(self, BPF_ADD);
1191 }
1192
1193 static int bpf_fill_alu32_sub_reg(struct bpf_test *self)
1194 {
1195         return __bpf_fill_alu32_reg(self, BPF_SUB);
1196 }
1197
1198 static int bpf_fill_alu32_mul_reg(struct bpf_test *self)
1199 {
1200         return __bpf_fill_alu32_reg(self, BPF_MUL);
1201 }
1202
1203 static int bpf_fill_alu32_div_reg(struct bpf_test *self)
1204 {
1205         return __bpf_fill_alu32_reg(self, BPF_DIV);
1206 }
1207
1208 static int bpf_fill_alu32_mod_reg(struct bpf_test *self)
1209 {
1210         return __bpf_fill_alu32_reg(self, BPF_MOD);
1211 }
1212
1213 /*
1214  * Test JITs that implement complex ALU operations as function
1215  * calls, and must re-arrange operands for argument passing.
1216  */
1217 static int __bpf_fill_alu_imm_regs(struct bpf_test *self, u8 op, bool alu32)
1218 {
1219         int len = 2 + 10 * 10;
1220         struct bpf_insn *insns;
1221         u64 dst, res;
1222         int i = 0;
1223         u32 imm;
1224         int rd;
1225
1226         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
1227         if (!insns)
1228                 return -ENOMEM;
1229
1230         /* Operand and result values according to operation */
1231         if (alu32)
1232                 dst = 0x76543210U;
1233         else
1234                 dst = 0x7edcba9876543210ULL;
1235         imm = 0x01234567U;
1236
1237         if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH)
1238                 imm &= 31;
1239
1240         __bpf_alu_result(&res, dst, imm, op);
1241
1242         if (alu32)
1243                 res = (u32)res;
1244
1245         /* Check all operand registers */
1246         for (rd = R0; rd <= R9; rd++) {
1247                 i += __bpf_ld_imm64(&insns[i], rd, dst);
1248
1249                 if (alu32)
1250                         insns[i++] = BPF_ALU32_IMM(op, rd, imm);
1251                 else
1252                         insns[i++] = BPF_ALU64_IMM(op, rd, imm);
1253
1254                 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res, 2);
1255                 insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1256                 insns[i++] = BPF_EXIT_INSN();
1257
1258                 insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32);
1259                 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res >> 32, 2);
1260                 insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1261                 insns[i++] = BPF_EXIT_INSN();
1262         }
1263
1264         insns[i++] = BPF_MOV64_IMM(R0, 1);
1265         insns[i++] = BPF_EXIT_INSN();
1266
1267         self->u.ptr.insns = insns;
1268         self->u.ptr.len = len;
1269         BUG_ON(i != len);
1270
1271         return 0;
1272 }
1273
1274 /* ALU64 K registers */
1275 static int bpf_fill_alu64_mov_imm_regs(struct bpf_test *self)
1276 {
1277         return __bpf_fill_alu_imm_regs(self, BPF_MOV, false);
1278 }
1279
1280 static int bpf_fill_alu64_and_imm_regs(struct bpf_test *self)
1281 {
1282         return __bpf_fill_alu_imm_regs(self, BPF_AND, false);
1283 }
1284
1285 static int bpf_fill_alu64_or_imm_regs(struct bpf_test *self)
1286 {
1287         return __bpf_fill_alu_imm_regs(self, BPF_OR, false);
1288 }
1289
1290 static int bpf_fill_alu64_xor_imm_regs(struct bpf_test *self)
1291 {
1292         return __bpf_fill_alu_imm_regs(self, BPF_XOR, false);
1293 }
1294
1295 static int bpf_fill_alu64_lsh_imm_regs(struct bpf_test *self)
1296 {
1297         return __bpf_fill_alu_imm_regs(self, BPF_LSH, false);
1298 }
1299
1300 static int bpf_fill_alu64_rsh_imm_regs(struct bpf_test *self)
1301 {
1302         return __bpf_fill_alu_imm_regs(self, BPF_RSH, false);
1303 }
1304
1305 static int bpf_fill_alu64_arsh_imm_regs(struct bpf_test *self)
1306 {
1307         return __bpf_fill_alu_imm_regs(self, BPF_ARSH, false);
1308 }
1309
1310 static int bpf_fill_alu64_add_imm_regs(struct bpf_test *self)
1311 {
1312         return __bpf_fill_alu_imm_regs(self, BPF_ADD, false);
1313 }
1314
1315 static int bpf_fill_alu64_sub_imm_regs(struct bpf_test *self)
1316 {
1317         return __bpf_fill_alu_imm_regs(self, BPF_SUB, false);
1318 }
1319
1320 static int bpf_fill_alu64_mul_imm_regs(struct bpf_test *self)
1321 {
1322         return __bpf_fill_alu_imm_regs(self, BPF_MUL, false);
1323 }
1324
1325 static int bpf_fill_alu64_div_imm_regs(struct bpf_test *self)
1326 {
1327         return __bpf_fill_alu_imm_regs(self, BPF_DIV, false);
1328 }
1329
1330 static int bpf_fill_alu64_mod_imm_regs(struct bpf_test *self)
1331 {
1332         return __bpf_fill_alu_imm_regs(self, BPF_MOD, false);
1333 }
1334
1335 /* ALU32 K registers */
1336 static int bpf_fill_alu32_mov_imm_regs(struct bpf_test *self)
1337 {
1338         return __bpf_fill_alu_imm_regs(self, BPF_MOV, true);
1339 }
1340
1341 static int bpf_fill_alu32_and_imm_regs(struct bpf_test *self)
1342 {
1343         return __bpf_fill_alu_imm_regs(self, BPF_AND, true);
1344 }
1345
1346 static int bpf_fill_alu32_or_imm_regs(struct bpf_test *self)
1347 {
1348         return __bpf_fill_alu_imm_regs(self, BPF_OR, true);
1349 }
1350
1351 static int bpf_fill_alu32_xor_imm_regs(struct bpf_test *self)
1352 {
1353         return __bpf_fill_alu_imm_regs(self, BPF_XOR, true);
1354 }
1355
1356 static int bpf_fill_alu32_lsh_imm_regs(struct bpf_test *self)
1357 {
1358         return __bpf_fill_alu_imm_regs(self, BPF_LSH, true);
1359 }
1360
1361 static int bpf_fill_alu32_rsh_imm_regs(struct bpf_test *self)
1362 {
1363         return __bpf_fill_alu_imm_regs(self, BPF_RSH, true);
1364 }
1365
1366 static int bpf_fill_alu32_arsh_imm_regs(struct bpf_test *self)
1367 {
1368         return __bpf_fill_alu_imm_regs(self, BPF_ARSH, true);
1369 }
1370
1371 static int bpf_fill_alu32_add_imm_regs(struct bpf_test *self)
1372 {
1373         return __bpf_fill_alu_imm_regs(self, BPF_ADD, true);
1374 }
1375
1376 static int bpf_fill_alu32_sub_imm_regs(struct bpf_test *self)
1377 {
1378         return __bpf_fill_alu_imm_regs(self, BPF_SUB, true);
1379 }
1380
1381 static int bpf_fill_alu32_mul_imm_regs(struct bpf_test *self)
1382 {
1383         return __bpf_fill_alu_imm_regs(self, BPF_MUL, true);
1384 }
1385
1386 static int bpf_fill_alu32_div_imm_regs(struct bpf_test *self)
1387 {
1388         return __bpf_fill_alu_imm_regs(self, BPF_DIV, true);
1389 }
1390
1391 static int bpf_fill_alu32_mod_imm_regs(struct bpf_test *self)
1392 {
1393         return __bpf_fill_alu_imm_regs(self, BPF_MOD, true);
1394 }
1395
1396 /*
1397  * Test JITs that implement complex ALU operations as function
1398  * calls, and must re-arrange operands for argument passing.
1399  */
1400 static int __bpf_fill_alu_reg_pairs(struct bpf_test *self, u8 op, bool alu32)
1401 {
1402         int len = 2 + 10 * 10 * 12;
1403         u64 dst, src, res, same;
1404         struct bpf_insn *insns;
1405         int rd, rs;
1406         int i = 0;
1407
1408         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
1409         if (!insns)
1410                 return -ENOMEM;
1411
1412         /* Operand and result values according to operation */
1413         if (alu32) {
1414                 dst = 0x76543210U;
1415                 src = 0x01234567U;
1416         } else {
1417                 dst = 0x7edcba9876543210ULL;
1418                 src = 0x0123456789abcdefULL;
1419         }
1420
1421         if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH)
1422                 src &= 31;
1423
1424         __bpf_alu_result(&res, dst, src, op);
1425         __bpf_alu_result(&same, src, src, op);
1426
1427         if (alu32) {
1428                 res = (u32)res;
1429                 same = (u32)same;
1430         }
1431
1432         /* Check all combinations of operand registers */
1433         for (rd = R0; rd <= R9; rd++) {
1434                 for (rs = R0; rs <= R9; rs++) {
1435                         u64 val = rd == rs ? same : res;
1436
1437                         i += __bpf_ld_imm64(&insns[i], rd, dst);
1438                         i += __bpf_ld_imm64(&insns[i], rs, src);
1439
1440                         if (alu32)
1441                                 insns[i++] = BPF_ALU32_REG(op, rd, rs);
1442                         else
1443                                 insns[i++] = BPF_ALU64_REG(op, rd, rs);
1444
1445                         insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val, 2);
1446                         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1447                         insns[i++] = BPF_EXIT_INSN();
1448
1449                         insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32);
1450                         insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val >> 32, 2);
1451                         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1452                         insns[i++] = BPF_EXIT_INSN();
1453                 }
1454         }
1455
1456         insns[i++] = BPF_MOV64_IMM(R0, 1);
1457         insns[i++] = BPF_EXIT_INSN();
1458
1459         self->u.ptr.insns = insns;
1460         self->u.ptr.len = len;
1461         BUG_ON(i != len);
1462
1463         return 0;
1464 }
1465
1466 /* ALU64 X register combinations */
1467 static int bpf_fill_alu64_mov_reg_pairs(struct bpf_test *self)
1468 {
1469         return __bpf_fill_alu_reg_pairs(self, BPF_MOV, false);
1470 }
1471
1472 static int bpf_fill_alu64_and_reg_pairs(struct bpf_test *self)
1473 {
1474         return __bpf_fill_alu_reg_pairs(self, BPF_AND, false);
1475 }
1476
1477 static int bpf_fill_alu64_or_reg_pairs(struct bpf_test *self)
1478 {
1479         return __bpf_fill_alu_reg_pairs(self, BPF_OR, false);
1480 }
1481
1482 static int bpf_fill_alu64_xor_reg_pairs(struct bpf_test *self)
1483 {
1484         return __bpf_fill_alu_reg_pairs(self, BPF_XOR, false);
1485 }
1486
1487 static int bpf_fill_alu64_lsh_reg_pairs(struct bpf_test *self)
1488 {
1489         return __bpf_fill_alu_reg_pairs(self, BPF_LSH, false);
1490 }
1491
1492 static int bpf_fill_alu64_rsh_reg_pairs(struct bpf_test *self)
1493 {
1494         return __bpf_fill_alu_reg_pairs(self, BPF_RSH, false);
1495 }
1496
1497 static int bpf_fill_alu64_arsh_reg_pairs(struct bpf_test *self)
1498 {
1499         return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, false);
1500 }
1501
1502 static int bpf_fill_alu64_add_reg_pairs(struct bpf_test *self)
1503 {
1504         return __bpf_fill_alu_reg_pairs(self, BPF_ADD, false);
1505 }
1506
1507 static int bpf_fill_alu64_sub_reg_pairs(struct bpf_test *self)
1508 {
1509         return __bpf_fill_alu_reg_pairs(self, BPF_SUB, false);
1510 }
1511
1512 static int bpf_fill_alu64_mul_reg_pairs(struct bpf_test *self)
1513 {
1514         return __bpf_fill_alu_reg_pairs(self, BPF_MUL, false);
1515 }
1516
1517 static int bpf_fill_alu64_div_reg_pairs(struct bpf_test *self)
1518 {
1519         return __bpf_fill_alu_reg_pairs(self, BPF_DIV, false);
1520 }
1521
1522 static int bpf_fill_alu64_mod_reg_pairs(struct bpf_test *self)
1523 {
1524         return __bpf_fill_alu_reg_pairs(self, BPF_MOD, false);
1525 }
1526
1527 /* ALU32 X register combinations */
1528 static int bpf_fill_alu32_mov_reg_pairs(struct bpf_test *self)
1529 {
1530         return __bpf_fill_alu_reg_pairs(self, BPF_MOV, true);
1531 }
1532
1533 static int bpf_fill_alu32_and_reg_pairs(struct bpf_test *self)
1534 {
1535         return __bpf_fill_alu_reg_pairs(self, BPF_AND, true);
1536 }
1537
1538 static int bpf_fill_alu32_or_reg_pairs(struct bpf_test *self)
1539 {
1540         return __bpf_fill_alu_reg_pairs(self, BPF_OR, true);
1541 }
1542
1543 static int bpf_fill_alu32_xor_reg_pairs(struct bpf_test *self)
1544 {
1545         return __bpf_fill_alu_reg_pairs(self, BPF_XOR, true);
1546 }
1547
1548 static int bpf_fill_alu32_lsh_reg_pairs(struct bpf_test *self)
1549 {
1550         return __bpf_fill_alu_reg_pairs(self, BPF_LSH, true);
1551 }
1552
1553 static int bpf_fill_alu32_rsh_reg_pairs(struct bpf_test *self)
1554 {
1555         return __bpf_fill_alu_reg_pairs(self, BPF_RSH, true);
1556 }
1557
1558 static int bpf_fill_alu32_arsh_reg_pairs(struct bpf_test *self)
1559 {
1560         return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, true);
1561 }
1562
1563 static int bpf_fill_alu32_add_reg_pairs(struct bpf_test *self)
1564 {
1565         return __bpf_fill_alu_reg_pairs(self, BPF_ADD, true);
1566 }
1567
1568 static int bpf_fill_alu32_sub_reg_pairs(struct bpf_test *self)
1569 {
1570         return __bpf_fill_alu_reg_pairs(self, BPF_SUB, true);
1571 }
1572
1573 static int bpf_fill_alu32_mul_reg_pairs(struct bpf_test *self)
1574 {
1575         return __bpf_fill_alu_reg_pairs(self, BPF_MUL, true);
1576 }
1577
1578 static int bpf_fill_alu32_div_reg_pairs(struct bpf_test *self)
1579 {
1580         return __bpf_fill_alu_reg_pairs(self, BPF_DIV, true);
1581 }
1582
1583 static int bpf_fill_alu32_mod_reg_pairs(struct bpf_test *self)
1584 {
1585         return __bpf_fill_alu_reg_pairs(self, BPF_MOD, true);
1586 }
1587
1588 /*
1589  * Exhaustive tests of atomic operations for all power-of-two operand
1590  * magnitudes, both for positive and negative values.
1591  */
1592
1593 static int __bpf_emit_atomic64(struct bpf_test *self, void *arg,
1594                                struct bpf_insn *insns, s64 dst, s64 src)
1595 {
1596         int op = *(int *)arg;
1597         u64 keep, fetch, res;
1598         int i = 0;
1599
1600         if (!insns)
1601                 return 21;
1602
1603         switch (op) {
1604         case BPF_XCHG:
1605                 res = src;
1606                 break;
1607         default:
1608                 __bpf_alu_result(&res, dst, src, BPF_OP(op));
1609         }
1610
1611         keep = 0x0123456789abcdefULL;
1612         if (op & BPF_FETCH)
1613                 fetch = dst;
1614         else
1615                 fetch = src;
1616
1617         i += __bpf_ld_imm64(&insns[i], R0, keep);
1618         i += __bpf_ld_imm64(&insns[i], R1, dst);
1619         i += __bpf_ld_imm64(&insns[i], R2, src);
1620         i += __bpf_ld_imm64(&insns[i], R3, res);
1621         i += __bpf_ld_imm64(&insns[i], R4, fetch);
1622         i += __bpf_ld_imm64(&insns[i], R5, keep);
1623
1624         insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8);
1625         insns[i++] = BPF_ATOMIC_OP(BPF_DW, op, R10, R2, -8);
1626         insns[i++] = BPF_LDX_MEM(BPF_DW, R1, R10, -8);
1627
1628         insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
1629         insns[i++] = BPF_EXIT_INSN();
1630
1631         insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1);
1632         insns[i++] = BPF_EXIT_INSN();
1633
1634         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1);
1635         insns[i++] = BPF_EXIT_INSN();
1636
1637         return i;
1638 }
1639
1640 static int __bpf_emit_atomic32(struct bpf_test *self, void *arg,
1641                                struct bpf_insn *insns, s64 dst, s64 src)
1642 {
1643         int op = *(int *)arg;
1644         u64 keep, fetch, res;
1645         int i = 0;
1646
1647         if (!insns)
1648                 return 21;
1649
1650         switch (op) {
1651         case BPF_XCHG:
1652                 res = src;
1653                 break;
1654         default:
1655                 __bpf_alu_result(&res, (u32)dst, (u32)src, BPF_OP(op));
1656         }
1657
1658         keep = 0x0123456789abcdefULL;
1659         if (op & BPF_FETCH)
1660                 fetch = (u32)dst;
1661         else
1662                 fetch = src;
1663
1664         i += __bpf_ld_imm64(&insns[i], R0, keep);
1665         i += __bpf_ld_imm64(&insns[i], R1, (u32)dst);
1666         i += __bpf_ld_imm64(&insns[i], R2, src);
1667         i += __bpf_ld_imm64(&insns[i], R3, (u32)res);
1668         i += __bpf_ld_imm64(&insns[i], R4, fetch);
1669         i += __bpf_ld_imm64(&insns[i], R5, keep);
1670
1671         insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4);
1672         insns[i++] = BPF_ATOMIC_OP(BPF_W, op, R10, R2, -4);
1673         insns[i++] = BPF_LDX_MEM(BPF_W, R1, R10, -4);
1674
1675         insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1);
1676         insns[i++] = BPF_EXIT_INSN();
1677
1678         insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1);
1679         insns[i++] = BPF_EXIT_INSN();
1680
1681         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1);
1682         insns[i++] = BPF_EXIT_INSN();
1683
1684         return i;
1685 }
1686
1687 static int __bpf_emit_cmpxchg64(struct bpf_test *self, void *arg,
1688                                 struct bpf_insn *insns, s64 dst, s64 src)
1689 {
1690         int i = 0;
1691
1692         if (!insns)
1693                 return 23;
1694
1695         i += __bpf_ld_imm64(&insns[i], R0, ~dst);
1696         i += __bpf_ld_imm64(&insns[i], R1, dst);
1697         i += __bpf_ld_imm64(&insns[i], R2, src);
1698
1699         /* Result unsuccessful */
1700         insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8);
1701         insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8);
1702         insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8);
1703
1704         insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 2);
1705         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1706         insns[i++] = BPF_EXIT_INSN();
1707
1708         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2);
1709         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1710         insns[i++] = BPF_EXIT_INSN();
1711
1712         /* Result successful */
1713         insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8);
1714         insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8);
1715
1716         insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R3, 2);
1717         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1718         insns[i++] = BPF_EXIT_INSN();
1719
1720         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
1721         insns[i++] = BPF_MOV64_IMM(R0, __LINE__);
1722         insns[i++] = BPF_EXIT_INSN();
1723
1724         return i;
1725 }
1726
1727 static int __bpf_emit_cmpxchg32(struct bpf_test *self, void *arg,
1728                                 struct bpf_insn *insns, s64 dst, s64 src)
1729 {
1730         int i = 0;
1731
1732         if (!insns)
1733                 return 27;
1734
1735         i += __bpf_ld_imm64(&insns[i], R0, ~dst);
1736         i += __bpf_ld_imm64(&insns[i], R1, (u32)dst);
1737         i += __bpf_ld_imm64(&insns[i], R2, src);
1738
1739         /* Result unsuccessful */
1740         insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4);
1741         insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4);
1742         insns[i++] = BPF_ZEXT_REG(R0), /* Zext always inserted by verifier */
1743         insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4);
1744
1745         insns[i++] = BPF_JMP32_REG(BPF_JEQ, R1, R3, 2);
1746         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1747         insns[i++] = BPF_EXIT_INSN();
1748
1749         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2);
1750         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1751         insns[i++] = BPF_EXIT_INSN();
1752
1753         /* Result successful */
1754         i += __bpf_ld_imm64(&insns[i], R0, dst);
1755         insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4);
1756         insns[i++] = BPF_ZEXT_REG(R0), /* Zext always inserted by verifier */
1757         insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4);
1758
1759         insns[i++] = BPF_JMP32_REG(BPF_JEQ, R2, R3, 2);
1760         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1761         insns[i++] = BPF_EXIT_INSN();
1762
1763         insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
1764         insns[i++] = BPF_MOV32_IMM(R0, __LINE__);
1765         insns[i++] = BPF_EXIT_INSN();
1766
1767         return i;
1768 }
1769
1770 static int __bpf_fill_atomic64(struct bpf_test *self, int op)
1771 {
1772         return __bpf_fill_pattern(self, &op, 64, 64,
1773                                   0, PATTERN_BLOCK2,
1774                                   &__bpf_emit_atomic64);
1775 }
1776
1777 static int __bpf_fill_atomic32(struct bpf_test *self, int op)
1778 {
1779         return __bpf_fill_pattern(self, &op, 64, 64,
1780                                   0, PATTERN_BLOCK2,
1781                                   &__bpf_emit_atomic32);
1782 }
1783
1784 /* 64-bit atomic operations */
1785 static int bpf_fill_atomic64_add(struct bpf_test *self)
1786 {
1787         return __bpf_fill_atomic64(self, BPF_ADD);
1788 }
1789
1790 static int bpf_fill_atomic64_and(struct bpf_test *self)
1791 {
1792         return __bpf_fill_atomic64(self, BPF_AND);
1793 }
1794
1795 static int bpf_fill_atomic64_or(struct bpf_test *self)
1796 {
1797         return __bpf_fill_atomic64(self, BPF_OR);
1798 }
1799
1800 static int bpf_fill_atomic64_xor(struct bpf_test *self)
1801 {
1802         return __bpf_fill_atomic64(self, BPF_XOR);
1803 }
1804
1805 static int bpf_fill_atomic64_add_fetch(struct bpf_test *self)
1806 {
1807         return __bpf_fill_atomic64(self, BPF_ADD | BPF_FETCH);
1808 }
1809
1810 static int bpf_fill_atomic64_and_fetch(struct bpf_test *self)
1811 {
1812         return __bpf_fill_atomic64(self, BPF_AND | BPF_FETCH);
1813 }
1814
1815 static int bpf_fill_atomic64_or_fetch(struct bpf_test *self)
1816 {
1817         return __bpf_fill_atomic64(self, BPF_OR | BPF_FETCH);
1818 }
1819
1820 static int bpf_fill_atomic64_xor_fetch(struct bpf_test *self)
1821 {
1822         return __bpf_fill_atomic64(self, BPF_XOR | BPF_FETCH);
1823 }
1824
1825 static int bpf_fill_atomic64_xchg(struct bpf_test *self)
1826 {
1827         return __bpf_fill_atomic64(self, BPF_XCHG);
1828 }
1829
1830 static int bpf_fill_cmpxchg64(struct bpf_test *self)
1831 {
1832         return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2,
1833                                   &__bpf_emit_cmpxchg64);
1834 }
1835
1836 /* 32-bit atomic operations */
1837 static int bpf_fill_atomic32_add(struct bpf_test *self)
1838 {
1839         return __bpf_fill_atomic32(self, BPF_ADD);
1840 }
1841
1842 static int bpf_fill_atomic32_and(struct bpf_test *self)
1843 {
1844         return __bpf_fill_atomic32(self, BPF_AND);
1845 }
1846
1847 static int bpf_fill_atomic32_or(struct bpf_test *self)
1848 {
1849         return __bpf_fill_atomic32(self, BPF_OR);
1850 }
1851
1852 static int bpf_fill_atomic32_xor(struct bpf_test *self)
1853 {
1854         return __bpf_fill_atomic32(self, BPF_XOR);
1855 }
1856
1857 static int bpf_fill_atomic32_add_fetch(struct bpf_test *self)
1858 {
1859         return __bpf_fill_atomic32(self, BPF_ADD | BPF_FETCH);
1860 }
1861
1862 static int bpf_fill_atomic32_and_fetch(struct bpf_test *self)
1863 {
1864         return __bpf_fill_atomic32(self, BPF_AND | BPF_FETCH);
1865 }
1866
1867 static int bpf_fill_atomic32_or_fetch(struct bpf_test *self)
1868 {
1869         return __bpf_fill_atomic32(self, BPF_OR | BPF_FETCH);
1870 }
1871
1872 static int bpf_fill_atomic32_xor_fetch(struct bpf_test *self)
1873 {
1874         return __bpf_fill_atomic32(self, BPF_XOR | BPF_FETCH);
1875 }
1876
1877 static int bpf_fill_atomic32_xchg(struct bpf_test *self)
1878 {
1879         return __bpf_fill_atomic32(self, BPF_XCHG);
1880 }
1881
1882 static int bpf_fill_cmpxchg32(struct bpf_test *self)
1883 {
1884         return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2,
1885                                   &__bpf_emit_cmpxchg32);
1886 }
1887
1888 /*
1889  * Test JITs that implement ATOMIC operations as function calls or
1890  * other primitives, and must re-arrange operands for argument passing.
1891  */
1892 static int __bpf_fill_atomic_reg_pairs(struct bpf_test *self, u8 width, u8 op)
1893 {
1894         struct bpf_insn *insn;
1895         int len = 2 + 34 * 10 * 10;
1896         u64 mem, upd, res;
1897         int rd, rs, i = 0;
1898
1899         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
1900         if (!insn)
1901                 return -ENOMEM;
1902
1903         /* Operand and memory values */
1904         if (width == BPF_DW) {
1905                 mem = 0x0123456789abcdefULL;
1906                 upd = 0xfedcba9876543210ULL;
1907         } else { /* BPF_W */
1908                 mem = 0x01234567U;
1909                 upd = 0x76543210U;
1910         }
1911
1912         /* Memory updated according to operation */
1913         switch (op) {
1914         case BPF_XCHG:
1915                 res = upd;
1916                 break;
1917         case BPF_CMPXCHG:
1918                 res = mem;
1919                 break;
1920         default:
1921                 __bpf_alu_result(&res, mem, upd, BPF_OP(op));
1922         }
1923
1924         /* Test all operand registers */
1925         for (rd = R0; rd <= R9; rd++) {
1926                 for (rs = R0; rs <= R9; rs++) {
1927                         u64 cmp, src;
1928
1929                         /* Initialize value in memory */
1930                         i += __bpf_ld_imm64(&insn[i], R0, mem);
1931                         insn[i++] = BPF_STX_MEM(width, R10, R0, -8);
1932
1933                         /* Initialize registers in order */
1934                         i += __bpf_ld_imm64(&insn[i], R0, ~mem);
1935                         i += __bpf_ld_imm64(&insn[i], rs, upd);
1936                         insn[i++] = BPF_MOV64_REG(rd, R10);
1937
1938                         /* Perform atomic operation */
1939                         insn[i++] = BPF_ATOMIC_OP(width, op, rd, rs, -8);
1940                         if (op == BPF_CMPXCHG && width == BPF_W)
1941                                 insn[i++] = BPF_ZEXT_REG(R0);
1942
1943                         /* Check R0 register value */
1944                         if (op == BPF_CMPXCHG)
1945                                 cmp = mem;  /* Expect value from memory */
1946                         else if (R0 == rd || R0 == rs)
1947                                 cmp = 0;    /* Aliased, checked below */
1948                         else
1949                                 cmp = ~mem; /* Expect value to be preserved */
1950                         if (cmp) {
1951                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0,
1952                                                            (u32)cmp, 2);
1953                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1954                                 insn[i++] = BPF_EXIT_INSN();
1955                                 insn[i++] = BPF_ALU64_IMM(BPF_RSH, R0, 32);
1956                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0,
1957                                                            cmp >> 32, 2);
1958                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1959                                 insn[i++] = BPF_EXIT_INSN();
1960                         }
1961
1962                         /* Check source register value */
1963                         if (rs == R0 && op == BPF_CMPXCHG)
1964                                 src = 0;   /* Aliased with R0, checked above */
1965                         else if (rs == rd && (op == BPF_CMPXCHG ||
1966                                               !(op & BPF_FETCH)))
1967                                 src = 0;   /* Aliased with rd, checked below */
1968                         else if (op == BPF_CMPXCHG)
1969                                 src = upd; /* Expect value to be preserved */
1970                         else if (op & BPF_FETCH)
1971                                 src = mem; /* Expect fetched value from mem */
1972                         else /* no fetch */
1973                                 src = upd; /* Expect value to be preserved */
1974                         if (src) {
1975                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs,
1976                                                            (u32)src, 2);
1977                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1978                                 insn[i++] = BPF_EXIT_INSN();
1979                                 insn[i++] = BPF_ALU64_IMM(BPF_RSH, rs, 32);
1980                                 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs,
1981                                                            src >> 32, 2);
1982                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1983                                 insn[i++] = BPF_EXIT_INSN();
1984                         }
1985
1986                         /* Check destination register value */
1987                         if (!(rd == R0 && op == BPF_CMPXCHG) &&
1988                             !(rd == rs && (op & BPF_FETCH))) {
1989                                 insn[i++] = BPF_JMP_REG(BPF_JEQ, rd, R10, 2);
1990                                 insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
1991                                 insn[i++] = BPF_EXIT_INSN();
1992                         }
1993
1994                         /* Check value in memory */
1995                         if (rs != rd) {                  /* No aliasing */
1996                                 i += __bpf_ld_imm64(&insn[i], R1, res);
1997                         } else if (op == BPF_XCHG) {     /* Aliased, XCHG */
1998                                 insn[i++] = BPF_MOV64_REG(R1, R10);
1999                         } else if (op == BPF_CMPXCHG) {  /* Aliased, CMPXCHG */
2000                                 i += __bpf_ld_imm64(&insn[i], R1, mem);
2001                         } else {                        /* Aliased, ALU oper */
2002                                 i += __bpf_ld_imm64(&insn[i], R1, mem);
2003                                 insn[i++] = BPF_ALU64_REG(BPF_OP(op), R1, R10);
2004                         }
2005
2006                         insn[i++] = BPF_LDX_MEM(width, R0, R10, -8);
2007                         if (width == BPF_DW)
2008                                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2);
2009                         else /* width == BPF_W */
2010                                 insn[i++] = BPF_JMP32_REG(BPF_JEQ, R0, R1, 2);
2011                         insn[i++] = BPF_MOV32_IMM(R0, __LINE__);
2012                         insn[i++] = BPF_EXIT_INSN();
2013                 }
2014         }
2015
2016         insn[i++] = BPF_MOV64_IMM(R0, 1);
2017         insn[i++] = BPF_EXIT_INSN();
2018
2019         self->u.ptr.insns = insn;
2020         self->u.ptr.len = i;
2021         BUG_ON(i > len);
2022
2023         return 0;
2024 }
2025
2026 /* 64-bit atomic register tests */
2027 static int bpf_fill_atomic64_add_reg_pairs(struct bpf_test *self)
2028 {
2029         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD);
2030 }
2031
2032 static int bpf_fill_atomic64_and_reg_pairs(struct bpf_test *self)
2033 {
2034         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND);
2035 }
2036
2037 static int bpf_fill_atomic64_or_reg_pairs(struct bpf_test *self)
2038 {
2039         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR);
2040 }
2041
2042 static int bpf_fill_atomic64_xor_reg_pairs(struct bpf_test *self)
2043 {
2044         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR);
2045 }
2046
2047 static int bpf_fill_atomic64_add_fetch_reg_pairs(struct bpf_test *self)
2048 {
2049         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD | BPF_FETCH);
2050 }
2051
2052 static int bpf_fill_atomic64_and_fetch_reg_pairs(struct bpf_test *self)
2053 {
2054         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND | BPF_FETCH);
2055 }
2056
2057 static int bpf_fill_atomic64_or_fetch_reg_pairs(struct bpf_test *self)
2058 {
2059         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR | BPF_FETCH);
2060 }
2061
2062 static int bpf_fill_atomic64_xor_fetch_reg_pairs(struct bpf_test *self)
2063 {
2064         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR | BPF_FETCH);
2065 }
2066
2067 static int bpf_fill_atomic64_xchg_reg_pairs(struct bpf_test *self)
2068 {
2069         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XCHG);
2070 }
2071
2072 static int bpf_fill_atomic64_cmpxchg_reg_pairs(struct bpf_test *self)
2073 {
2074         return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_CMPXCHG);
2075 }
2076
2077 /* 32-bit atomic register tests */
2078 static int bpf_fill_atomic32_add_reg_pairs(struct bpf_test *self)
2079 {
2080         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD);
2081 }
2082
2083 static int bpf_fill_atomic32_and_reg_pairs(struct bpf_test *self)
2084 {
2085         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND);
2086 }
2087
2088 static int bpf_fill_atomic32_or_reg_pairs(struct bpf_test *self)
2089 {
2090         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR);
2091 }
2092
2093 static int bpf_fill_atomic32_xor_reg_pairs(struct bpf_test *self)
2094 {
2095         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR);
2096 }
2097
2098 static int bpf_fill_atomic32_add_fetch_reg_pairs(struct bpf_test *self)
2099 {
2100         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD | BPF_FETCH);
2101 }
2102
2103 static int bpf_fill_atomic32_and_fetch_reg_pairs(struct bpf_test *self)
2104 {
2105         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND | BPF_FETCH);
2106 }
2107
2108 static int bpf_fill_atomic32_or_fetch_reg_pairs(struct bpf_test *self)
2109 {
2110         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR | BPF_FETCH);
2111 }
2112
2113 static int bpf_fill_atomic32_xor_fetch_reg_pairs(struct bpf_test *self)
2114 {
2115         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR | BPF_FETCH);
2116 }
2117
2118 static int bpf_fill_atomic32_xchg_reg_pairs(struct bpf_test *self)
2119 {
2120         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XCHG);
2121 }
2122
2123 static int bpf_fill_atomic32_cmpxchg_reg_pairs(struct bpf_test *self)
2124 {
2125         return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_CMPXCHG);
2126 }
2127
2128 /*
2129  * Test the two-instruction 64-bit immediate load operation for all
2130  * power-of-two magnitudes of the immediate operand. For each MSB, a block
2131  * of immediate values centered around the power-of-two MSB are tested,
2132  * both for positive and negative values. The test is designed to verify
2133  * the operation for JITs that emit different code depending on the magnitude
2134  * of the immediate value. This is often the case if the native instruction
2135  * immediate field width is narrower than 32 bits.
2136  */
2137 static int bpf_fill_ld_imm64_magn(struct bpf_test *self)
2138 {
2139         int block = 64; /* Increase for more tests per MSB position */
2140         int len = 3 + 8 * 63 * block * 2;
2141         struct bpf_insn *insn;
2142         int bit, adj, sign;
2143         int i = 0;
2144
2145         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
2146         if (!insn)
2147                 return -ENOMEM;
2148
2149         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
2150
2151         for (bit = 0; bit <= 62; bit++) {
2152                 for (adj = -block / 2; adj < block / 2; adj++) {
2153                         for (sign = -1; sign <= 1; sign += 2) {
2154                                 s64 imm = sign * ((1LL << bit) + adj);
2155
2156                                 /* Perform operation */
2157                                 i += __bpf_ld_imm64(&insn[i], R1, imm);
2158
2159                                 /* Load reference */
2160                                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
2161                                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3,
2162                                                           (u32)(imm >> 32));
2163                                 insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
2164                                 insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
2165
2166                                 /* Check result */
2167                                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
2168                                 insn[i++] = BPF_EXIT_INSN();
2169                         }
2170                 }
2171         }
2172
2173         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
2174         insn[i++] = BPF_EXIT_INSN();
2175
2176         self->u.ptr.insns = insn;
2177         self->u.ptr.len = len;
2178         BUG_ON(i != len);
2179
2180         return 0;
2181 }
2182
2183 /*
2184  * Test the two-instruction 64-bit immediate load operation for different
2185  * combinations of bytes. Each byte in the 64-bit word is constructed as
2186  * (base & mask) | (rand() & ~mask), where rand() is a deterministic LCG.
2187  * All patterns (base1, mask1) and (base2, mask2) bytes are tested.
2188  */
2189 static int __bpf_fill_ld_imm64_bytes(struct bpf_test *self,
2190                                      u8 base1, u8 mask1,
2191                                      u8 base2, u8 mask2)
2192 {
2193         struct bpf_insn *insn;
2194         int len = 3 + 8 * BIT(8);
2195         int pattern, index;
2196         u32 rand = 1;
2197         int i = 0;
2198
2199         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
2200         if (!insn)
2201                 return -ENOMEM;
2202
2203         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
2204
2205         for (pattern = 0; pattern < BIT(8); pattern++) {
2206                 u64 imm = 0;
2207
2208                 for (index = 0; index < 8; index++) {
2209                         int byte;
2210
2211                         if (pattern & BIT(index))
2212                                 byte = (base1 & mask1) | (rand & ~mask1);
2213                         else
2214                                 byte = (base2 & mask2) | (rand & ~mask2);
2215                         imm = (imm << 8) | byte;
2216                 }
2217
2218                 /* Update our LCG */
2219                 rand = rand * 1664525 + 1013904223;
2220
2221                 /* Perform operation */
2222                 i += __bpf_ld_imm64(&insn[i], R1, imm);
2223
2224                 /* Load reference */
2225                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm);
2226                 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3, (u32)(imm >> 32));
2227                 insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32);
2228                 insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3);
2229
2230                 /* Check result */
2231                 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1);
2232                 insn[i++] = BPF_EXIT_INSN();
2233         }
2234
2235         insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
2236         insn[i++] = BPF_EXIT_INSN();
2237
2238         self->u.ptr.insns = insn;
2239         self->u.ptr.len = len;
2240         BUG_ON(i != len);
2241
2242         return 0;
2243 }
2244
2245 static int bpf_fill_ld_imm64_checker(struct bpf_test *self)
2246 {
2247         return __bpf_fill_ld_imm64_bytes(self, 0, 0xff, 0xff, 0xff);
2248 }
2249
2250 static int bpf_fill_ld_imm64_pos_neg(struct bpf_test *self)
2251 {
2252         return __bpf_fill_ld_imm64_bytes(self, 1, 0x81, 0x80, 0x80);
2253 }
2254
2255 static int bpf_fill_ld_imm64_pos_zero(struct bpf_test *self)
2256 {
2257         return __bpf_fill_ld_imm64_bytes(self, 1, 0x81, 0, 0xff);
2258 }
2259
2260 static int bpf_fill_ld_imm64_neg_zero(struct bpf_test *self)
2261 {
2262         return __bpf_fill_ld_imm64_bytes(self, 0x80, 0x80, 0, 0xff);
2263 }
2264
2265 /*
2266  * Exhaustive tests of JMP operations for all combinations of power-of-two
2267  * magnitudes of the operands, both for positive and negative values. The
2268  * test is designed to verify e.g. the JMP and JMP32 operations for JITs that
2269  * emit different code depending on the magnitude of the immediate value.
2270  */
2271
2272 static bool __bpf_match_jmp_cond(s64 v1, s64 v2, u8 op)
2273 {
2274         switch (op) {
2275         case BPF_JSET:
2276                 return !!(v1 & v2);
2277         case BPF_JEQ:
2278                 return v1 == v2;
2279         case BPF_JNE:
2280                 return v1 != v2;
2281         case BPF_JGT:
2282                 return (u64)v1 > (u64)v2;
2283         case BPF_JGE:
2284                 return (u64)v1 >= (u64)v2;
2285         case BPF_JLT:
2286                 return (u64)v1 < (u64)v2;
2287         case BPF_JLE:
2288                 return (u64)v1 <= (u64)v2;
2289         case BPF_JSGT:
2290                 return v1 > v2;
2291         case BPF_JSGE:
2292                 return v1 >= v2;
2293         case BPF_JSLT:
2294                 return v1 < v2;
2295         case BPF_JSLE:
2296                 return v1 <= v2;
2297         }
2298         return false;
2299 }
2300
2301 static int __bpf_emit_jmp_imm(struct bpf_test *self, void *arg,
2302                               struct bpf_insn *insns, s64 dst, s64 imm)
2303 {
2304         int op = *(int *)arg;
2305
2306         if (insns) {
2307                 bool match = __bpf_match_jmp_cond(dst, (s32)imm, op);
2308                 int i = 0;
2309
2310                 insns[i++] = BPF_ALU32_IMM(BPF_MOV, R0, match);
2311
2312                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2313                 insns[i++] = BPF_JMP_IMM(op, R1, imm, 1);
2314                 if (!match)
2315                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2316                 insns[i++] = BPF_EXIT_INSN();
2317
2318                 return i;
2319         }
2320
2321         return 5 + 1;
2322 }
2323
2324 static int __bpf_emit_jmp32_imm(struct bpf_test *self, void *arg,
2325                                 struct bpf_insn *insns, s64 dst, s64 imm)
2326 {
2327         int op = *(int *)arg;
2328
2329         if (insns) {
2330                 bool match = __bpf_match_jmp_cond((s32)dst, (s32)imm, op);
2331                 int i = 0;
2332
2333                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2334                 insns[i++] = BPF_JMP32_IMM(op, R1, imm, 1);
2335                 if (!match)
2336                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2337                 insns[i++] = BPF_EXIT_INSN();
2338
2339                 return i;
2340         }
2341
2342         return 5;
2343 }
2344
2345 static int __bpf_emit_jmp_reg(struct bpf_test *self, void *arg,
2346                               struct bpf_insn *insns, s64 dst, s64 src)
2347 {
2348         int op = *(int *)arg;
2349
2350         if (insns) {
2351                 bool match = __bpf_match_jmp_cond(dst, src, op);
2352                 int i = 0;
2353
2354                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2355                 i += __bpf_ld_imm64(&insns[i], R2, src);
2356                 insns[i++] = BPF_JMP_REG(op, R1, R2, 1);
2357                 if (!match)
2358                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2359                 insns[i++] = BPF_EXIT_INSN();
2360
2361                 return i;
2362         }
2363
2364         return 7;
2365 }
2366
2367 static int __bpf_emit_jmp32_reg(struct bpf_test *self, void *arg,
2368                                 struct bpf_insn *insns, s64 dst, s64 src)
2369 {
2370         int op = *(int *)arg;
2371
2372         if (insns) {
2373                 bool match = __bpf_match_jmp_cond((s32)dst, (s32)src, op);
2374                 int i = 0;
2375
2376                 i += __bpf_ld_imm64(&insns[i], R1, dst);
2377                 i += __bpf_ld_imm64(&insns[i], R2, src);
2378                 insns[i++] = BPF_JMP32_REG(op, R1, R2, 1);
2379                 if (!match)
2380                         insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1);
2381                 insns[i++] = BPF_EXIT_INSN();
2382
2383                 return i;
2384         }
2385
2386         return 7;
2387 }
2388
2389 static int __bpf_fill_jmp_imm(struct bpf_test *self, int op)
2390 {
2391         return __bpf_fill_pattern(self, &op, 64, 32,
2392                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2393                                   &__bpf_emit_jmp_imm);
2394 }
2395
2396 static int __bpf_fill_jmp32_imm(struct bpf_test *self, int op)
2397 {
2398         return __bpf_fill_pattern(self, &op, 64, 32,
2399                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2400                                   &__bpf_emit_jmp32_imm);
2401 }
2402
2403 static int __bpf_fill_jmp_reg(struct bpf_test *self, int op)
2404 {
2405         return __bpf_fill_pattern(self, &op, 64, 64,
2406                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2407                                   &__bpf_emit_jmp_reg);
2408 }
2409
2410 static int __bpf_fill_jmp32_reg(struct bpf_test *self, int op)
2411 {
2412         return __bpf_fill_pattern(self, &op, 64, 64,
2413                                   PATTERN_BLOCK1, PATTERN_BLOCK2,
2414                                   &__bpf_emit_jmp32_reg);
2415 }
2416
2417 /* JMP immediate tests */
2418 static int bpf_fill_jmp_jset_imm(struct bpf_test *self)
2419 {
2420         return __bpf_fill_jmp_imm(self, BPF_JSET);
2421 }
2422
2423 static int bpf_fill_jmp_jeq_imm(struct bpf_test *self)
2424 {
2425         return __bpf_fill_jmp_imm(self, BPF_JEQ);
2426 }
2427
2428 static int bpf_fill_jmp_jne_imm(struct bpf_test *self)
2429 {
2430         return __bpf_fill_jmp_imm(self, BPF_JNE);
2431 }
2432
2433 static int bpf_fill_jmp_jgt_imm(struct bpf_test *self)
2434 {
2435         return __bpf_fill_jmp_imm(self, BPF_JGT);
2436 }
2437
2438 static int bpf_fill_jmp_jge_imm(struct bpf_test *self)
2439 {
2440         return __bpf_fill_jmp_imm(self, BPF_JGE);
2441 }
2442
2443 static int bpf_fill_jmp_jlt_imm(struct bpf_test *self)
2444 {
2445         return __bpf_fill_jmp_imm(self, BPF_JLT);
2446 }
2447
2448 static int bpf_fill_jmp_jle_imm(struct bpf_test *self)
2449 {
2450         return __bpf_fill_jmp_imm(self, BPF_JLE);
2451 }
2452
2453 static int bpf_fill_jmp_jsgt_imm(struct bpf_test *self)
2454 {
2455         return __bpf_fill_jmp_imm(self, BPF_JSGT);
2456 }
2457
2458 static int bpf_fill_jmp_jsge_imm(struct bpf_test *self)
2459 {
2460         return __bpf_fill_jmp_imm(self, BPF_JSGE);
2461 }
2462
2463 static int bpf_fill_jmp_jslt_imm(struct bpf_test *self)
2464 {
2465         return __bpf_fill_jmp_imm(self, BPF_JSLT);
2466 }
2467
2468 static int bpf_fill_jmp_jsle_imm(struct bpf_test *self)
2469 {
2470         return __bpf_fill_jmp_imm(self, BPF_JSLE);
2471 }
2472
2473 /* JMP32 immediate tests */
2474 static int bpf_fill_jmp32_jset_imm(struct bpf_test *self)
2475 {
2476         return __bpf_fill_jmp32_imm(self, BPF_JSET);
2477 }
2478
2479 static int bpf_fill_jmp32_jeq_imm(struct bpf_test *self)
2480 {
2481         return __bpf_fill_jmp32_imm(self, BPF_JEQ);
2482 }
2483
2484 static int bpf_fill_jmp32_jne_imm(struct bpf_test *self)
2485 {
2486         return __bpf_fill_jmp32_imm(self, BPF_JNE);
2487 }
2488
2489 static int bpf_fill_jmp32_jgt_imm(struct bpf_test *self)
2490 {
2491         return __bpf_fill_jmp32_imm(self, BPF_JGT);
2492 }
2493
2494 static int bpf_fill_jmp32_jge_imm(struct bpf_test *self)
2495 {
2496         return __bpf_fill_jmp32_imm(self, BPF_JGE);
2497 }
2498
2499 static int bpf_fill_jmp32_jlt_imm(struct bpf_test *self)
2500 {
2501         return __bpf_fill_jmp32_imm(self, BPF_JLT);
2502 }
2503
2504 static int bpf_fill_jmp32_jle_imm(struct bpf_test *self)
2505 {
2506         return __bpf_fill_jmp32_imm(self, BPF_JLE);
2507 }
2508
2509 static int bpf_fill_jmp32_jsgt_imm(struct bpf_test *self)
2510 {
2511         return __bpf_fill_jmp32_imm(self, BPF_JSGT);
2512 }
2513
2514 static int bpf_fill_jmp32_jsge_imm(struct bpf_test *self)
2515 {
2516         return __bpf_fill_jmp32_imm(self, BPF_JSGE);
2517 }
2518
2519 static int bpf_fill_jmp32_jslt_imm(struct bpf_test *self)
2520 {
2521         return __bpf_fill_jmp32_imm(self, BPF_JSLT);
2522 }
2523
2524 static int bpf_fill_jmp32_jsle_imm(struct bpf_test *self)
2525 {
2526         return __bpf_fill_jmp32_imm(self, BPF_JSLE);
2527 }
2528
2529 /* JMP register tests */
2530 static int bpf_fill_jmp_jset_reg(struct bpf_test *self)
2531 {
2532         return __bpf_fill_jmp_reg(self, BPF_JSET);
2533 }
2534
2535 static int bpf_fill_jmp_jeq_reg(struct bpf_test *self)
2536 {
2537         return __bpf_fill_jmp_reg(self, BPF_JEQ);
2538 }
2539
2540 static int bpf_fill_jmp_jne_reg(struct bpf_test *self)
2541 {
2542         return __bpf_fill_jmp_reg(self, BPF_JNE);
2543 }
2544
2545 static int bpf_fill_jmp_jgt_reg(struct bpf_test *self)
2546 {
2547         return __bpf_fill_jmp_reg(self, BPF_JGT);
2548 }
2549
2550 static int bpf_fill_jmp_jge_reg(struct bpf_test *self)
2551 {
2552         return __bpf_fill_jmp_reg(self, BPF_JGE);
2553 }
2554
2555 static int bpf_fill_jmp_jlt_reg(struct bpf_test *self)
2556 {
2557         return __bpf_fill_jmp_reg(self, BPF_JLT);
2558 }
2559
2560 static int bpf_fill_jmp_jle_reg(struct bpf_test *self)
2561 {
2562         return __bpf_fill_jmp_reg(self, BPF_JLE);
2563 }
2564
2565 static int bpf_fill_jmp_jsgt_reg(struct bpf_test *self)
2566 {
2567         return __bpf_fill_jmp_reg(self, BPF_JSGT);
2568 }
2569
2570 static int bpf_fill_jmp_jsge_reg(struct bpf_test *self)
2571 {
2572         return __bpf_fill_jmp_reg(self, BPF_JSGE);
2573 }
2574
2575 static int bpf_fill_jmp_jslt_reg(struct bpf_test *self)
2576 {
2577         return __bpf_fill_jmp_reg(self, BPF_JSLT);
2578 }
2579
2580 static int bpf_fill_jmp_jsle_reg(struct bpf_test *self)
2581 {
2582         return __bpf_fill_jmp_reg(self, BPF_JSLE);
2583 }
2584
2585 /* JMP32 register tests */
2586 static int bpf_fill_jmp32_jset_reg(struct bpf_test *self)
2587 {
2588         return __bpf_fill_jmp32_reg(self, BPF_JSET);
2589 }
2590
2591 static int bpf_fill_jmp32_jeq_reg(struct bpf_test *self)
2592 {
2593         return __bpf_fill_jmp32_reg(self, BPF_JEQ);
2594 }
2595
2596 static int bpf_fill_jmp32_jne_reg(struct bpf_test *self)
2597 {
2598         return __bpf_fill_jmp32_reg(self, BPF_JNE);
2599 }
2600
2601 static int bpf_fill_jmp32_jgt_reg(struct bpf_test *self)
2602 {
2603         return __bpf_fill_jmp32_reg(self, BPF_JGT);
2604 }
2605
2606 static int bpf_fill_jmp32_jge_reg(struct bpf_test *self)
2607 {
2608         return __bpf_fill_jmp32_reg(self, BPF_JGE);
2609 }
2610
2611 static int bpf_fill_jmp32_jlt_reg(struct bpf_test *self)
2612 {
2613         return __bpf_fill_jmp32_reg(self, BPF_JLT);
2614 }
2615
2616 static int bpf_fill_jmp32_jle_reg(struct bpf_test *self)
2617 {
2618         return __bpf_fill_jmp32_reg(self, BPF_JLE);
2619 }
2620
2621 static int bpf_fill_jmp32_jsgt_reg(struct bpf_test *self)
2622 {
2623         return __bpf_fill_jmp32_reg(self, BPF_JSGT);
2624 }
2625
2626 static int bpf_fill_jmp32_jsge_reg(struct bpf_test *self)
2627 {
2628         return __bpf_fill_jmp32_reg(self, BPF_JSGE);
2629 }
2630
2631 static int bpf_fill_jmp32_jslt_reg(struct bpf_test *self)
2632 {
2633         return __bpf_fill_jmp32_reg(self, BPF_JSLT);
2634 }
2635
2636 static int bpf_fill_jmp32_jsle_reg(struct bpf_test *self)
2637 {
2638         return __bpf_fill_jmp32_reg(self, BPF_JSLE);
2639 }
2640
2641 /*
2642  * Set up a sequence of staggered jumps, forwards and backwards with
2643  * increasing offset. This tests the conversion of relative jumps to
2644  * JITed native jumps. On some architectures, for example MIPS, a large
2645  * PC-relative jump offset may overflow the immediate field of the native
2646  * conditional branch instruction, triggering a conversion to use an
2647  * absolute jump instead. Since this changes the jump offsets, another
2648  * offset computation pass is necessary, and that may in turn trigger
2649  * another branch conversion. This jump sequence is particularly nasty
2650  * in that regard.
2651  *
2652  * The sequence generation is parameterized by size and jump type.
2653  * The size must be even, and the expected result is always size + 1.
2654  * Below is an example with size=8 and result=9.
2655  *
2656  *                     ________________________Start
2657  *                     R0 = 0
2658  *                     R1 = r1
2659  *                     R2 = r2
2660  *            ,------- JMP +4 * 3______________Preamble: 4 insns
2661  * ,----------|-ind 0- if R0 != 7 JMP 8 * 3 + 1 <--------------------.
2662  * |          |        R0 = 8                                        |
2663  * |          |        JMP +7 * 3               ------------------------.
2664  * | ,--------|-----1- if R0 != 5 JMP 7 * 3 + 1 <--------------.     |  |
2665  * | |        |        R0 = 6                                  |     |  |
2666  * | |        |        JMP +5 * 3               ------------------.  |  |
2667  * | | ,------|-----2- if R0 != 3 JMP 6 * 3 + 1 <--------.     |  |  |  |
2668  * | | |      |        R0 = 4                            |     |  |  |  |
2669  * | | |      |        JMP +3 * 3               ------------.  |  |  |  |
2670  * | | | ,----|-----3- if R0 != 1 JMP 5 * 3 + 1 <--.     |  |  |  |  |  |
2671  * | | | |    |        R0 = 2                      |     |  |  |  |  |  |
2672  * | | | |    |        JMP +1 * 3               ------.  |  |  |  |  |  |
2673  * | | | | ,--t=====4> if R0 != 0 JMP 4 * 3 + 1    1  2  3  4  5  6  7  8 loc
2674  * | | | | |           R0 = 1                     -1 +2 -3 +4 -5 +6 -7 +8 off
2675  * | | | | |           JMP -2 * 3               ---'  |  |  |  |  |  |  |
2676  * | | | | | ,------5- if R0 != 2 JMP 3 * 3 + 1 <-----'  |  |  |  |  |  |
2677  * | | | | | |         R0 = 3                            |  |  |  |  |  |
2678  * | | | | | |         JMP -4 * 3               ---------'  |  |  |  |  |
2679  * | | | | | | ,----6- if R0 != 4 JMP 2 * 3 + 1 <-----------'  |  |  |  |
2680  * | | | | | | |       R0 = 5                                  |  |  |  |
2681  * | | | | | | |       JMP -6 * 3               ---------------'  |  |  |
2682  * | | | | | | | ,--7- if R0 != 6 JMP 1 * 3 + 1 <-----------------'  |  |
2683  * | | | | | | | |     R0 = 7                                        |  |
2684  * | | Error | | |     JMP -8 * 3               ---------------------'  |
2685  * | | paths | | | ,8- if R0 != 8 JMP 0 * 3 + 1 <-----------------------'
2686  * | | | | | | | | |   R0 = 9__________________Sequence: 3 * size - 1 insns
2687  * `-+-+-+-+-+-+-+-+-> EXIT____________________Return: 1 insn
2688  *
2689  */
2690
2691 /* The maximum size parameter */
2692 #define MAX_STAGGERED_JMP_SIZE ((0x7fff / 3) & ~1)
2693
2694 /* We use a reduced number of iterations to get a reasonable execution time */
2695 #define NR_STAGGERED_JMP_RUNS 10
2696
2697 static int __bpf_fill_staggered_jumps(struct bpf_test *self,
2698                                       const struct bpf_insn *jmp,
2699                                       u64 r1, u64 r2)
2700 {
2701         int size = self->test[0].result - 1;
2702         int len = 4 + 3 * (size + 1);
2703         struct bpf_insn *insns;
2704         int off, ind;
2705
2706         insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL);
2707         if (!insns)
2708                 return -ENOMEM;
2709
2710         /* Preamble */
2711         insns[0] = BPF_ALU64_IMM(BPF_MOV, R0, 0);
2712         insns[1] = BPF_ALU64_IMM(BPF_MOV, R1, r1);
2713         insns[2] = BPF_ALU64_IMM(BPF_MOV, R2, r2);
2714         insns[3] = BPF_JMP_IMM(BPF_JA, 0, 0, 3 * size / 2);
2715
2716         /* Sequence */
2717         for (ind = 0, off = size; ind <= size; ind++, off -= 2) {
2718                 struct bpf_insn *ins = &insns[4 + 3 * ind];
2719                 int loc;
2720
2721                 if (off == 0)
2722                         off--;
2723
2724                 loc = abs(off);
2725                 ins[0] = BPF_JMP_IMM(BPF_JNE, R0, loc - 1,
2726                                      3 * (size - ind) + 1);
2727                 ins[1] = BPF_ALU64_IMM(BPF_MOV, R0, loc);
2728                 ins[2] = *jmp;
2729                 ins[2].off = 3 * (off - 1);
2730         }
2731
2732         /* Return */
2733         insns[len - 1] = BPF_EXIT_INSN();
2734
2735         self->u.ptr.insns = insns;
2736         self->u.ptr.len = len;
2737
2738         return 0;
2739 }
2740
2741 /* 64-bit unconditional jump */
2742 static int bpf_fill_staggered_ja(struct bpf_test *self)
2743 {
2744         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JA, 0, 0, 0);
2745
2746         return __bpf_fill_staggered_jumps(self, &jmp, 0, 0);
2747 }
2748
2749 /* 64-bit immediate jumps */
2750 static int bpf_fill_staggered_jeq_imm(struct bpf_test *self)
2751 {
2752         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JEQ, R1, 1234, 0);
2753
2754         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2755 }
2756
2757 static int bpf_fill_staggered_jne_imm(struct bpf_test *self)
2758 {
2759         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JNE, R1, 1234, 0);
2760
2761         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
2762 }
2763
2764 static int bpf_fill_staggered_jset_imm(struct bpf_test *self)
2765 {
2766         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSET, R1, 0x82, 0);
2767
2768         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
2769 }
2770
2771 static int bpf_fill_staggered_jgt_imm(struct bpf_test *self)
2772 {
2773         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGT, R1, 1234, 0);
2774
2775         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
2776 }
2777
2778 static int bpf_fill_staggered_jge_imm(struct bpf_test *self)
2779 {
2780         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGE, R1, 1234, 0);
2781
2782         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2783 }
2784
2785 static int bpf_fill_staggered_jlt_imm(struct bpf_test *self)
2786 {
2787         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLT, R1, 0x80000000, 0);
2788
2789         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2790 }
2791
2792 static int bpf_fill_staggered_jle_imm(struct bpf_test *self)
2793 {
2794         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLE, R1, 1234, 0);
2795
2796         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2797 }
2798
2799 static int bpf_fill_staggered_jsgt_imm(struct bpf_test *self)
2800 {
2801         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGT, R1, -2, 0);
2802
2803         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2804 }
2805
2806 static int bpf_fill_staggered_jsge_imm(struct bpf_test *self)
2807 {
2808         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGE, R1, -2, 0);
2809
2810         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2811 }
2812
2813 static int bpf_fill_staggered_jslt_imm(struct bpf_test *self)
2814 {
2815         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLT, R1, -1, 0);
2816
2817         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2818 }
2819
2820 static int bpf_fill_staggered_jsle_imm(struct bpf_test *self)
2821 {
2822         struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLE, R1, -1, 0);
2823
2824         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2825 }
2826
2827 /* 64-bit register jumps */
2828 static int bpf_fill_staggered_jeq_reg(struct bpf_test *self)
2829 {
2830         struct bpf_insn jmp = BPF_JMP_REG(BPF_JEQ, R1, R2, 0);
2831
2832         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2833 }
2834
2835 static int bpf_fill_staggered_jne_reg(struct bpf_test *self)
2836 {
2837         struct bpf_insn jmp = BPF_JMP_REG(BPF_JNE, R1, R2, 0);
2838
2839         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
2840 }
2841
2842 static int bpf_fill_staggered_jset_reg(struct bpf_test *self)
2843 {
2844         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSET, R1, R2, 0);
2845
2846         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
2847 }
2848
2849 static int bpf_fill_staggered_jgt_reg(struct bpf_test *self)
2850 {
2851         struct bpf_insn jmp = BPF_JMP_REG(BPF_JGT, R1, R2, 0);
2852
2853         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
2854 }
2855
2856 static int bpf_fill_staggered_jge_reg(struct bpf_test *self)
2857 {
2858         struct bpf_insn jmp = BPF_JMP_REG(BPF_JGE, R1, R2, 0);
2859
2860         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2861 }
2862
2863 static int bpf_fill_staggered_jlt_reg(struct bpf_test *self)
2864 {
2865         struct bpf_insn jmp = BPF_JMP_REG(BPF_JLT, R1, R2, 0);
2866
2867         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
2868 }
2869
2870 static int bpf_fill_staggered_jle_reg(struct bpf_test *self)
2871 {
2872         struct bpf_insn jmp = BPF_JMP_REG(BPF_JLE, R1, R2, 0);
2873
2874         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2875 }
2876
2877 static int bpf_fill_staggered_jsgt_reg(struct bpf_test *self)
2878 {
2879         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGT, R1, R2, 0);
2880
2881         return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
2882 }
2883
2884 static int bpf_fill_staggered_jsge_reg(struct bpf_test *self)
2885 {
2886         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGE, R1, R2, 0);
2887
2888         return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
2889 }
2890
2891 static int bpf_fill_staggered_jslt_reg(struct bpf_test *self)
2892 {
2893         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLT, R1, R2, 0);
2894
2895         return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
2896 }
2897
2898 static int bpf_fill_staggered_jsle_reg(struct bpf_test *self)
2899 {
2900         struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLE, R1, R2, 0);
2901
2902         return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
2903 }
2904
2905 /* 32-bit immediate jumps */
2906 static int bpf_fill_staggered_jeq32_imm(struct bpf_test *self)
2907 {
2908         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JEQ, R1, 1234, 0);
2909
2910         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2911 }
2912
2913 static int bpf_fill_staggered_jne32_imm(struct bpf_test *self)
2914 {
2915         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JNE, R1, 1234, 0);
2916
2917         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0);
2918 }
2919
2920 static int bpf_fill_staggered_jset32_imm(struct bpf_test *self)
2921 {
2922         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSET, R1, 0x82, 0);
2923
2924         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0);
2925 }
2926
2927 static int bpf_fill_staggered_jgt32_imm(struct bpf_test *self)
2928 {
2929         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGT, R1, 1234, 0);
2930
2931         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0);
2932 }
2933
2934 static int bpf_fill_staggered_jge32_imm(struct bpf_test *self)
2935 {
2936         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGE, R1, 1234, 0);
2937
2938         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2939 }
2940
2941 static int bpf_fill_staggered_jlt32_imm(struct bpf_test *self)
2942 {
2943         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLT, R1, 0x80000000, 0);
2944
2945         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2946 }
2947
2948 static int bpf_fill_staggered_jle32_imm(struct bpf_test *self)
2949 {
2950         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLE, R1, 1234, 0);
2951
2952         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0);
2953 }
2954
2955 static int bpf_fill_staggered_jsgt32_imm(struct bpf_test *self)
2956 {
2957         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGT, R1, -2, 0);
2958
2959         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2960 }
2961
2962 static int bpf_fill_staggered_jsge32_imm(struct bpf_test *self)
2963 {
2964         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGE, R1, -2, 0);
2965
2966         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2967 }
2968
2969 static int bpf_fill_staggered_jslt32_imm(struct bpf_test *self)
2970 {
2971         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLT, R1, -1, 0);
2972
2973         return __bpf_fill_staggered_jumps(self, &jmp, -2, 0);
2974 }
2975
2976 static int bpf_fill_staggered_jsle32_imm(struct bpf_test *self)
2977 {
2978         struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLE, R1, -1, 0);
2979
2980         return __bpf_fill_staggered_jumps(self, &jmp, -1, 0);
2981 }
2982
2983 /* 32-bit register jumps */
2984 static int bpf_fill_staggered_jeq32_reg(struct bpf_test *self)
2985 {
2986         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JEQ, R1, R2, 0);
2987
2988         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
2989 }
2990
2991 static int bpf_fill_staggered_jne32_reg(struct bpf_test *self)
2992 {
2993         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JNE, R1, R2, 0);
2994
2995         return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234);
2996 }
2997
2998 static int bpf_fill_staggered_jset32_reg(struct bpf_test *self)
2999 {
3000         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSET, R1, R2, 0);
3001
3002         return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82);
3003 }
3004
3005 static int bpf_fill_staggered_jgt32_reg(struct bpf_test *self)
3006 {
3007         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGT, R1, R2, 0);
3008
3009         return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234);
3010 }
3011
3012 static int bpf_fill_staggered_jge32_reg(struct bpf_test *self)
3013 {
3014         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGE, R1, R2, 0);
3015
3016         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
3017 }
3018
3019 static int bpf_fill_staggered_jlt32_reg(struct bpf_test *self)
3020 {
3021         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLT, R1, R2, 0);
3022
3023         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000);
3024 }
3025
3026 static int bpf_fill_staggered_jle32_reg(struct bpf_test *self)
3027 {
3028         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLE, R1, R2, 0);
3029
3030         return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234);
3031 }
3032
3033 static int bpf_fill_staggered_jsgt32_reg(struct bpf_test *self)
3034 {
3035         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGT, R1, R2, 0);
3036
3037         return __bpf_fill_staggered_jumps(self, &jmp, -1, -2);
3038 }
3039
3040 static int bpf_fill_staggered_jsge32_reg(struct bpf_test *self)
3041 {
3042         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGE, R1, R2, 0);
3043
3044         return __bpf_fill_staggered_jumps(self, &jmp, -2, -2);
3045 }
3046
3047 static int bpf_fill_staggered_jslt32_reg(struct bpf_test *self)
3048 {
3049         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLT, R1, R2, 0);
3050
3051         return __bpf_fill_staggered_jumps(self, &jmp, -2, -1);
3052 }
3053
3054 static int bpf_fill_staggered_jsle32_reg(struct bpf_test *self)
3055 {
3056         struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLE, R1, R2, 0);
3057
3058         return __bpf_fill_staggered_jumps(self, &jmp, -1, -1);
3059 }
3060
3061
3062 static struct bpf_test tests[] = {
3063         {
3064                 "TAX",
3065                 .u.insns = {
3066                         BPF_STMT(BPF_LD | BPF_IMM, 1),
3067                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3068                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3069                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3070                         BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
3071                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3072                         BPF_STMT(BPF_LD | BPF_LEN, 0),
3073                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3074                         BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
3075                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
3076                         BPF_STMT(BPF_RET | BPF_A, 0)
3077                 },
3078                 CLASSIC,
3079                 { 10, 20, 30, 40, 50 },
3080                 { { 2, 10 }, { 3, 20 }, { 4, 30 } },
3081         },
3082         {
3083                 "TXA",
3084                 .u.insns = {
3085                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3086                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3087                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3088                         BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
3089                 },
3090                 CLASSIC,
3091                 { 10, 20, 30, 40, 50 },
3092                 { { 1, 2 }, { 3, 6 }, { 4, 8 } },
3093         },
3094         {
3095                 "ADD_SUB_MUL_K",
3096                 .u.insns = {
3097                         BPF_STMT(BPF_LD | BPF_IMM, 1),
3098                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
3099                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
3100                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
3101                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
3102                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
3103                         BPF_STMT(BPF_RET | BPF_A, 0)
3104                 },
3105                 CLASSIC | FLAG_NO_DATA,
3106                 { },
3107                 { { 0, 0xfffffffd } }
3108         },
3109         {
3110                 "DIV_MOD_KX",
3111                 .u.insns = {
3112                         BPF_STMT(BPF_LD | BPF_IMM, 8),
3113                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
3114                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3115                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3116                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
3117                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3118                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3119                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
3120                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3121                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3122                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
3123                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3124                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
3125                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
3126                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3127                         BPF_STMT(BPF_RET | BPF_A, 0)
3128                 },
3129                 CLASSIC | FLAG_NO_DATA,
3130                 { },
3131                 { { 0, 0x20000000 } }
3132         },
3133         {
3134                 "AND_OR_LSH_K",
3135                 .u.insns = {
3136                         BPF_STMT(BPF_LD | BPF_IMM, 0xff),
3137                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
3138                         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
3139                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3140                         BPF_STMT(BPF_LD | BPF_IMM, 0xf),
3141                         BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
3142                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3143                         BPF_STMT(BPF_RET | BPF_A, 0)
3144                 },
3145                 CLASSIC | FLAG_NO_DATA,
3146                 { },
3147                 { { 0, 0x800000ff }, { 1, 0x800000ff } },
3148         },
3149         {
3150                 "LD_IMM_0",
3151                 .u.insns = {
3152                         BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
3153                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
3154                         BPF_STMT(BPF_RET | BPF_K, 0),
3155                         BPF_STMT(BPF_RET | BPF_K, 1),
3156                 },
3157                 CLASSIC,
3158                 { },
3159                 { { 1, 1 } },
3160         },
3161         {
3162                 "LD_IND",
3163                 .u.insns = {
3164                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3165                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
3166                         BPF_STMT(BPF_RET | BPF_K, 1)
3167                 },
3168                 CLASSIC,
3169                 { },
3170                 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
3171         },
3172         {
3173                 "LD_ABS",
3174                 .u.insns = {
3175                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
3176                         BPF_STMT(BPF_RET | BPF_K, 1)
3177                 },
3178                 CLASSIC,
3179                 { },
3180                 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
3181         },
3182         {
3183                 "LD_ABS_LL",
3184                 .u.insns = {
3185                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
3186                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3187                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
3188                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3189                         BPF_STMT(BPF_RET | BPF_A, 0)
3190                 },
3191                 CLASSIC,
3192                 { 1, 2, 3 },
3193                 { { 1, 0 }, { 2, 3 } },
3194         },
3195         {
3196                 "LD_IND_LL",
3197                 .u.insns = {
3198                         BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
3199                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3200                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3201                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3202                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
3203                         BPF_STMT(BPF_RET | BPF_A, 0)
3204                 },
3205                 CLASSIC,
3206                 { 1, 2, 3, 0xff },
3207                 { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
3208         },
3209         {
3210                 "LD_ABS_NET",
3211                 .u.insns = {
3212                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
3213                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3214                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
3215                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3216                         BPF_STMT(BPF_RET | BPF_A, 0)
3217                 },
3218                 CLASSIC,
3219                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
3220                 { { 15, 0 }, { 16, 3 } },
3221         },
3222         {
3223                 "LD_IND_NET",
3224                 .u.insns = {
3225                         BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
3226                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3227                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
3228                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3229                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
3230                         BPF_STMT(BPF_RET | BPF_A, 0)
3231                 },
3232                 CLASSIC,
3233                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
3234                 { { 14, 0 }, { 15, 1 }, { 17, 3 } },
3235         },
3236         {
3237                 "LD_PKTTYPE",
3238                 .u.insns = {
3239                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3240                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
3241                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
3242                         BPF_STMT(BPF_RET | BPF_K, 1),
3243                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3244                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
3245                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
3246                         BPF_STMT(BPF_RET | BPF_K, 1),
3247                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3248                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
3249                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
3250                         BPF_STMT(BPF_RET | BPF_K, 1),
3251                         BPF_STMT(BPF_RET | BPF_A, 0)
3252                 },
3253                 CLASSIC,
3254                 { },
3255                 { { 1, 3 }, { 10, 3 } },
3256         },
3257         {
3258                 "LD_MARK",
3259                 .u.insns = {
3260                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3261                                  SKF_AD_OFF + SKF_AD_MARK),
3262                         BPF_STMT(BPF_RET | BPF_A, 0)
3263                 },
3264                 CLASSIC,
3265                 { },
3266                 { { 1, SKB_MARK}, { 10, SKB_MARK} },
3267         },
3268         {
3269                 "LD_RXHASH",
3270                 .u.insns = {
3271                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3272                                  SKF_AD_OFF + SKF_AD_RXHASH),
3273                         BPF_STMT(BPF_RET | BPF_A, 0)
3274                 },
3275                 CLASSIC,
3276                 { },
3277                 { { 1, SKB_HASH}, { 10, SKB_HASH} },
3278         },
3279         {
3280                 "LD_QUEUE",
3281                 .u.insns = {
3282                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3283                                  SKF_AD_OFF + SKF_AD_QUEUE),
3284                         BPF_STMT(BPF_RET | BPF_A, 0)
3285                 },
3286                 CLASSIC,
3287                 { },
3288                 { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
3289         },
3290         {
3291                 "LD_PROTOCOL",
3292                 .u.insns = {
3293                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
3294                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
3295                         BPF_STMT(BPF_RET | BPF_K, 0),
3296                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3297                                  SKF_AD_OFF + SKF_AD_PROTOCOL),
3298                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3299                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3300                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
3301                         BPF_STMT(BPF_RET | BPF_K, 0),
3302                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3303                         BPF_STMT(BPF_RET | BPF_A, 0)
3304                 },
3305                 CLASSIC,
3306                 { 10, 20, 30 },
3307                 { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
3308         },
3309         {
3310                 "LD_VLAN_TAG",
3311                 .u.insns = {
3312                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3313                                  SKF_AD_OFF + SKF_AD_VLAN_TAG),
3314                         BPF_STMT(BPF_RET | BPF_A, 0)
3315                 },
3316                 CLASSIC,
3317                 { },
3318                 {
3319                         { 1, SKB_VLAN_TCI },
3320                         { 10, SKB_VLAN_TCI }
3321                 },
3322         },
3323         {
3324                 "LD_VLAN_TAG_PRESENT",
3325                 .u.insns = {
3326                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3327                                  SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
3328                         BPF_STMT(BPF_RET | BPF_A, 0)
3329                 },
3330                 CLASSIC,
3331                 { },
3332                 {
3333                         { 1, SKB_VLAN_PRESENT },
3334                         { 10, SKB_VLAN_PRESENT }
3335                 },
3336         },
3337         {
3338                 "LD_IFINDEX",
3339                 .u.insns = {
3340                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3341                                  SKF_AD_OFF + SKF_AD_IFINDEX),
3342                         BPF_STMT(BPF_RET | BPF_A, 0)
3343                 },
3344                 CLASSIC,
3345                 { },
3346                 { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
3347         },
3348         {
3349                 "LD_HATYPE",
3350                 .u.insns = {
3351                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3352                                  SKF_AD_OFF + SKF_AD_HATYPE),
3353                         BPF_STMT(BPF_RET | BPF_A, 0)
3354                 },
3355                 CLASSIC,
3356                 { },
3357                 { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
3358         },
3359         {
3360                 "LD_CPU",
3361                 .u.insns = {
3362                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3363                                  SKF_AD_OFF + SKF_AD_CPU),
3364                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3365                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3366                                  SKF_AD_OFF + SKF_AD_CPU),
3367                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
3368                         BPF_STMT(BPF_RET | BPF_A, 0)
3369                 },
3370                 CLASSIC,
3371                 { },
3372                 { { 1, 0 }, { 10, 0 } },
3373         },
3374         {
3375                 "LD_NLATTR",
3376                 .u.insns = {
3377                         BPF_STMT(BPF_LDX | BPF_IMM, 2),
3378                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3379                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
3380                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3381                                  SKF_AD_OFF + SKF_AD_NLATTR),
3382                         BPF_STMT(BPF_RET | BPF_A, 0)
3383                 },
3384                 CLASSIC,
3385 #ifdef __BIG_ENDIAN
3386                 { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
3387 #else
3388                 { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
3389 #endif
3390                 { { 4, 0 }, { 20, 6 } },
3391         },
3392         {
3393                 "LD_NLATTR_NEST",
3394                 .u.insns = {
3395                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3396                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
3397                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3398                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3399                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3400                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3401                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3402                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3403                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3404                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3405                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3406                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3407                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3408                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3409                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3410                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3411                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3412                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3413                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3414                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3415                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3416                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3417                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3418                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3419                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
3420                         BPF_STMT(BPF_RET | BPF_A, 0)
3421                 },
3422                 CLASSIC,
3423 #ifdef __BIG_ENDIAN
3424                 { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
3425 #else
3426                 { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
3427 #endif
3428                 { { 4, 0 }, { 20, 10 } },
3429         },
3430         {
3431                 "LD_PAYLOAD_OFF",
3432                 .u.insns = {
3433                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3434                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3435                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3436                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3437                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3438                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3439                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3440                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3441                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3442                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
3443                         BPF_STMT(BPF_RET | BPF_A, 0)
3444                 },
3445                 CLASSIC,
3446                 /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
3447                  * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
3448                  * id 9737, seq 1, length 64
3449                  */
3450                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3451                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3452                   0x08, 0x00,
3453                   0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
3454                   0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
3455                 { { 30, 0 }, { 100, 42 } },
3456         },
3457         {
3458                 "LD_ANC_XOR",
3459                 .u.insns = {
3460                         BPF_STMT(BPF_LD | BPF_IMM, 10),
3461                         BPF_STMT(BPF_LDX | BPF_IMM, 300),
3462                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
3463                                  SKF_AD_OFF + SKF_AD_ALU_XOR_X),
3464                         BPF_STMT(BPF_RET | BPF_A, 0)
3465                 },
3466                 CLASSIC,
3467                 { },
3468                 { { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } },
3469         },
3470         {
3471                 "SPILL_FILL",
3472                 .u.insns = {
3473                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3474                         BPF_STMT(BPF_LD | BPF_IMM, 2),
3475                         BPF_STMT(BPF_ALU | BPF_RSH, 1),
3476                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
3477                         BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
3478                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
3479                         BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
3480                         BPF_STMT(BPF_STX, 15), /* M3 = len */
3481                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
3482                         BPF_STMT(BPF_LD | BPF_MEM, 2),
3483                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
3484                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
3485                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
3486                         BPF_STMT(BPF_RET | BPF_A, 0)
3487                 },
3488                 CLASSIC,
3489                 { },
3490                 { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
3491         },
3492         {
3493                 "JEQ",
3494                 .u.insns = {
3495                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3496                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3497                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
3498                         BPF_STMT(BPF_RET | BPF_K, 1),
3499                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3500                 },
3501                 CLASSIC,
3502                 { 3, 3, 3, 3, 3 },
3503                 { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
3504         },
3505         {
3506                 "JGT",
3507                 .u.insns = {
3508                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3509                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3510                         BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
3511                         BPF_STMT(BPF_RET | BPF_K, 1),
3512                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3513                 },
3514                 CLASSIC,
3515                 { 4, 4, 4, 3, 3 },
3516                 { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
3517         },
3518         {
3519                 "JGE (jt 0), test 1",
3520                 .u.insns = {
3521                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3522                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3523                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
3524                         BPF_STMT(BPF_RET | BPF_K, 1),
3525                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3526                 },
3527                 CLASSIC,
3528                 { 4, 4, 4, 3, 3 },
3529                 { { 2, 0 }, { 3, 1 }, { 4, 1 } },
3530         },
3531         {
3532                 "JGE (jt 0), test 2",
3533                 .u.insns = {
3534                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3535                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
3536                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
3537                         BPF_STMT(BPF_RET | BPF_K, 1),
3538                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3539                 },
3540                 CLASSIC,
3541                 { 4, 4, 5, 3, 3 },
3542                 { { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
3543         },
3544         {
3545                 "JGE",
3546                 .u.insns = {
3547                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3548                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
3549                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
3550                         BPF_STMT(BPF_RET | BPF_K, 10),
3551                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
3552                         BPF_STMT(BPF_RET | BPF_K, 20),
3553                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
3554                         BPF_STMT(BPF_RET | BPF_K, 30),
3555                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
3556                         BPF_STMT(BPF_RET | BPF_K, 40),
3557                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3558                 },
3559                 CLASSIC,
3560                 { 1, 2, 3, 4, 5 },
3561                 { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
3562         },
3563         {
3564                 "JSET",
3565                 .u.insns = {
3566                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
3567                         BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
3568                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
3569                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
3570                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
3571                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3572                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
3573                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3574                         BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
3575                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
3576                         BPF_STMT(BPF_RET | BPF_K, 10),
3577                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
3578                         BPF_STMT(BPF_RET | BPF_K, 20),
3579                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3580                         BPF_STMT(BPF_RET | BPF_K, 30),
3581                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3582                         BPF_STMT(BPF_RET | BPF_K, 30),
3583                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3584                         BPF_STMT(BPF_RET | BPF_K, 30),
3585                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3586                         BPF_STMT(BPF_RET | BPF_K, 30),
3587                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
3588                         BPF_STMT(BPF_RET | BPF_K, 30),
3589                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
3590                 },
3591                 CLASSIC,
3592                 { 0, 0xAA, 0x55, 1 },
3593                 { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
3594         },
3595         {
3596                 "tcpdump port 22",
3597                 .u.insns = {
3598                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
3599                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
3600                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
3601                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
3602                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
3603                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
3604                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
3605                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
3606                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
3607                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
3608                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
3609                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
3610                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
3611                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
3612                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
3613                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
3614                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
3615                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
3616                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
3617                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
3618                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
3619                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
3620                         BPF_STMT(BPF_RET | BPF_K, 0xffff),
3621                         BPF_STMT(BPF_RET | BPF_K, 0),
3622                 },
3623                 CLASSIC,
3624                 /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
3625                  * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
3626                  * seq 1305692979:1305693027, ack 3650467037, win 65535,
3627                  * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
3628                  */
3629                 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
3630                   0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
3631                   0x08, 0x00,
3632                   0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
3633                   0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
3634                   0x0a, 0x01, 0x01, 0x95, /* ip src */
3635                   0x0a, 0x01, 0x02, 0x0a, /* ip dst */
3636                   0xc2, 0x24,
3637                   0x00, 0x16 /* dst port */ },
3638                 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
3639         },
3640         {
3641                 "tcpdump complex",
3642                 .u.insns = {
3643                         /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
3644                          * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
3645                          * (len > 115 or len < 30000000000)' -d
3646                          */
3647                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
3648                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
3649                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
3650                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
3651                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
3652                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
3653                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
3654                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
3655                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
3656                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
3657                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
3658                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
3659                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
3660                         BPF_STMT(BPF_ST, 1),
3661                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
3662                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
3663                         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
3664                         BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
3665                         BPF_STMT(BPF_LD | BPF_MEM, 1),
3666                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
3667                         BPF_STMT(BPF_ST, 5),
3668                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
3669                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
3670                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
3671                         BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
3672                         BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
3673                         BPF_STMT(BPF_LD | BPF_MEM, 5),
3674                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
3675                         BPF_STMT(BPF_LD | BPF_LEN, 0),
3676                         BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
3677                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
3678                         BPF_STMT(BPF_RET | BPF_K, 0xffff),
3679                         BPF_STMT(BPF_RET | BPF_K, 0),
3680                 },
3681                 CLASSIC,
3682                 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
3683                   0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
3684                   0x08, 0x00,
3685                   0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
3686                   0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
3687                   0x0a, 0x01, 0x01, 0x95, /* ip src */
3688                   0x0a, 0x01, 0x02, 0x0a, /* ip dst */
3689                   0xc2, 0x24,
3690                   0x00, 0x16 /* dst port */ },
3691                 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
3692         },
3693         {
3694                 "RET_A",
3695                 .u.insns = {
3696                         /* check that uninitialized X and A contain zeros */
3697                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
3698                         BPF_STMT(BPF_RET | BPF_A, 0)
3699                 },
3700                 CLASSIC,
3701                 { },
3702                 { {1, 0}, {2, 0} },
3703         },
3704         {
3705                 "INT: ADD trivial",
3706                 .u.insns_int = {
3707                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
3708                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
3709                         BPF_ALU64_IMM(BPF_MOV, R2, 3),
3710                         BPF_ALU64_REG(BPF_SUB, R1, R2),
3711                         BPF_ALU64_IMM(BPF_ADD, R1, -1),
3712                         BPF_ALU64_IMM(BPF_MUL, R1, 3),
3713                         BPF_ALU64_REG(BPF_MOV, R0, R1),
3714                         BPF_EXIT_INSN(),
3715                 },
3716                 INTERNAL,
3717                 { },
3718                 { { 0, 0xfffffffd } }
3719         },
3720         {
3721                 "INT: MUL_X",
3722                 .u.insns_int = {
3723                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
3724                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
3725                         BPF_ALU64_IMM(BPF_MOV, R2, 3),
3726                         BPF_ALU64_REG(BPF_MUL, R1, R2),
3727                         BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
3728                         BPF_EXIT_INSN(),
3729                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
3730                         BPF_EXIT_INSN(),
3731                 },
3732                 INTERNAL,
3733                 { },
3734                 { { 0, 1 } }
3735         },
3736         {
3737                 "INT: MUL_X2",
3738                 .u.insns_int = {
3739                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
3740                         BPF_ALU32_IMM(BPF_MOV, R1, -1),
3741                         BPF_ALU32_IMM(BPF_MOV, R2, 3),
3742                         BPF_ALU64_REG(BPF_MUL, R1, R2),
3743                         BPF_ALU64_IMM(BPF_RSH, R1, 8),
3744                         BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
3745                         BPF_EXIT_INSN(),
3746                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3747                         BPF_EXIT_INSN(),
3748                 },
3749                 INTERNAL,
3750                 { },
3751                 { { 0, 1 } }
3752         },
3753         {
3754                 "INT: MUL32_X",
3755                 .u.insns_int = {
3756                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
3757                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
3758                         BPF_ALU32_IMM(BPF_MOV, R2, 3),
3759                         BPF_ALU32_REG(BPF_MUL, R1, R2),
3760                         BPF_ALU64_IMM(BPF_RSH, R1, 8),
3761                         BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
3762                         BPF_EXIT_INSN(),
3763                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3764                         BPF_EXIT_INSN(),
3765                 },
3766                 INTERNAL,
3767                 { },
3768                 { { 0, 1 } }
3769         },
3770         {
3771                 /* Have to test all register combinations, since
3772                  * JITing of different registers will produce
3773                  * different asm code.
3774                  */
3775                 "INT: ADD 64-bit",
3776                 .u.insns_int = {
3777                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
3778                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
3779                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
3780                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
3781                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
3782                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
3783                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
3784                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
3785                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
3786                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
3787                         BPF_ALU64_IMM(BPF_ADD, R0, 20),
3788                         BPF_ALU64_IMM(BPF_ADD, R1, 20),
3789                         BPF_ALU64_IMM(BPF_ADD, R2, 20),
3790                         BPF_ALU64_IMM(BPF_ADD, R3, 20),
3791                         BPF_ALU64_IMM(BPF_ADD, R4, 20),
3792                         BPF_ALU64_IMM(BPF_ADD, R5, 20),
3793                         BPF_ALU64_IMM(BPF_ADD, R6, 20),
3794                         BPF_ALU64_IMM(BPF_ADD, R7, 20),
3795                         BPF_ALU64_IMM(BPF_ADD, R8, 20),
3796                         BPF_ALU64_IMM(BPF_ADD, R9, 20),
3797                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
3798                         BPF_ALU64_IMM(BPF_SUB, R1, 10),
3799                         BPF_ALU64_IMM(BPF_SUB, R2, 10),
3800                         BPF_ALU64_IMM(BPF_SUB, R3, 10),
3801                         BPF_ALU64_IMM(BPF_SUB, R4, 10),
3802                         BPF_ALU64_IMM(BPF_SUB, R5, 10),
3803                         BPF_ALU64_IMM(BPF_SUB, R6, 10),
3804                         BPF_ALU64_IMM(BPF_SUB, R7, 10),
3805                         BPF_ALU64_IMM(BPF_SUB, R8, 10),
3806                         BPF_ALU64_IMM(BPF_SUB, R9, 10),
3807                         BPF_ALU64_REG(BPF_ADD, R0, R0),
3808                         BPF_ALU64_REG(BPF_ADD, R0, R1),
3809                         BPF_ALU64_REG(BPF_ADD, R0, R2),
3810                         BPF_ALU64_REG(BPF_ADD, R0, R3),
3811                         BPF_ALU64_REG(BPF_ADD, R0, R4),
3812                         BPF_ALU64_REG(BPF_ADD, R0, R5),
3813                         BPF_ALU64_REG(BPF_ADD, R0, R6),
3814                         BPF_ALU64_REG(BPF_ADD, R0, R7),
3815                         BPF_ALU64_REG(BPF_ADD, R0, R8),
3816                         BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
3817                         BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
3818                         BPF_EXIT_INSN(),
3819                         BPF_ALU64_REG(BPF_ADD, R1, R0),
3820                         BPF_ALU64_REG(BPF_ADD, R1, R1),
3821                         BPF_ALU64_REG(BPF_ADD, R1, R2),
3822                         BPF_ALU64_REG(BPF_ADD, R1, R3),
3823                         BPF_ALU64_REG(BPF_ADD, R1, R4),
3824                         BPF_ALU64_REG(BPF_ADD, R1, R5),
3825                         BPF_ALU64_REG(BPF_ADD, R1, R6),
3826                         BPF_ALU64_REG(BPF_ADD, R1, R7),
3827                         BPF_ALU64_REG(BPF_ADD, R1, R8),
3828                         BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
3829                         BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
3830                         BPF_EXIT_INSN(),
3831                         BPF_ALU64_REG(BPF_ADD, R2, R0),
3832                         BPF_ALU64_REG(BPF_ADD, R2, R1),
3833                         BPF_ALU64_REG(BPF_ADD, R2, R2),
3834                         BPF_ALU64_REG(BPF_ADD, R2, R3),
3835                         BPF_ALU64_REG(BPF_ADD, R2, R4),
3836                         BPF_ALU64_REG(BPF_ADD, R2, R5),
3837                         BPF_ALU64_REG(BPF_ADD, R2, R6),
3838                         BPF_ALU64_REG(BPF_ADD, R2, R7),
3839                         BPF_ALU64_REG(BPF_ADD, R2, R8),
3840                         BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
3841                         BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
3842                         BPF_EXIT_INSN(),
3843                         BPF_ALU64_REG(BPF_ADD, R3, R0),
3844                         BPF_ALU64_REG(BPF_ADD, R3, R1),
3845                         BPF_ALU64_REG(BPF_ADD, R3, R2),
3846                         BPF_ALU64_REG(BPF_ADD, R3, R3),
3847                         BPF_ALU64_REG(BPF_ADD, R3, R4),
3848                         BPF_ALU64_REG(BPF_ADD, R3, R5),
3849                         BPF_ALU64_REG(BPF_ADD, R3, R6),
3850                         BPF_ALU64_REG(BPF_ADD, R3, R7),
3851                         BPF_ALU64_REG(BPF_ADD, R3, R8),
3852                         BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
3853                         BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
3854                         BPF_EXIT_INSN(),
3855                         BPF_ALU64_REG(BPF_ADD, R4, R0),
3856                         BPF_ALU64_REG(BPF_ADD, R4, R1),
3857                         BPF_ALU64_REG(BPF_ADD, R4, R2),
3858                         BPF_ALU64_REG(BPF_ADD, R4, R3),
3859                         BPF_ALU64_REG(BPF_ADD, R4, R4),
3860                         BPF_ALU64_REG(BPF_ADD, R4, R5),
3861                         BPF_ALU64_REG(BPF_ADD, R4, R6),
3862                         BPF_ALU64_REG(BPF_ADD, R4, R7),
3863                         BPF_ALU64_REG(BPF_ADD, R4, R8),
3864                         BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
3865                         BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
3866                         BPF_EXIT_INSN(),
3867                         BPF_ALU64_REG(BPF_ADD, R5, R0),
3868                         BPF_ALU64_REG(BPF_ADD, R5, R1),
3869                         BPF_ALU64_REG(BPF_ADD, R5, R2),
3870                         BPF_ALU64_REG(BPF_ADD, R5, R3),
3871                         BPF_ALU64_REG(BPF_ADD, R5, R4),
3872                         BPF_ALU64_REG(BPF_ADD, R5, R5),
3873                         BPF_ALU64_REG(BPF_ADD, R5, R6),
3874                         BPF_ALU64_REG(BPF_ADD, R5, R7),
3875                         BPF_ALU64_REG(BPF_ADD, R5, R8),
3876                         BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
3877                         BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
3878                         BPF_EXIT_INSN(),
3879                         BPF_ALU64_REG(BPF_ADD, R6, R0),
3880                         BPF_ALU64_REG(BPF_ADD, R6, R1),
3881                         BPF_ALU64_REG(BPF_ADD, R6, R2),
3882                         BPF_ALU64_REG(BPF_ADD, R6, R3),
3883                         BPF_ALU64_REG(BPF_ADD, R6, R4),
3884                         BPF_ALU64_REG(BPF_ADD, R6, R5),
3885                         BPF_ALU64_REG(BPF_ADD, R6, R6),
3886                         BPF_ALU64_REG(BPF_ADD, R6, R7),
3887                         BPF_ALU64_REG(BPF_ADD, R6, R8),
3888                         BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
3889                         BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
3890                         BPF_EXIT_INSN(),
3891                         BPF_ALU64_REG(BPF_ADD, R7, R0),
3892                         BPF_ALU64_REG(BPF_ADD, R7, R1),
3893                         BPF_ALU64_REG(BPF_ADD, R7, R2),
3894                         BPF_ALU64_REG(BPF_ADD, R7, R3),
3895                         BPF_ALU64_REG(BPF_ADD, R7, R4),
3896                         BPF_ALU64_REG(BPF_ADD, R7, R5),
3897                         BPF_ALU64_REG(BPF_ADD, R7, R6),
3898                         BPF_ALU64_REG(BPF_ADD, R7, R7),
3899                         BPF_ALU64_REG(BPF_ADD, R7, R8),
3900                         BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
3901                         BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
3902                         BPF_EXIT_INSN(),
3903                         BPF_ALU64_REG(BPF_ADD, R8, R0),
3904                         BPF_ALU64_REG(BPF_ADD, R8, R1),
3905                         BPF_ALU64_REG(BPF_ADD, R8, R2),
3906                         BPF_ALU64_REG(BPF_ADD, R8, R3),
3907                         BPF_ALU64_REG(BPF_ADD, R8, R4),
3908                         BPF_ALU64_REG(BPF_ADD, R8, R5),
3909                         BPF_ALU64_REG(BPF_ADD, R8, R6),
3910                         BPF_ALU64_REG(BPF_ADD, R8, R7),
3911                         BPF_ALU64_REG(BPF_ADD, R8, R8),
3912                         BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
3913                         BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
3914                         BPF_EXIT_INSN(),
3915                         BPF_ALU64_REG(BPF_ADD, R9, R0),
3916                         BPF_ALU64_REG(BPF_ADD, R9, R1),
3917                         BPF_ALU64_REG(BPF_ADD, R9, R2),
3918                         BPF_ALU64_REG(BPF_ADD, R9, R3),
3919                         BPF_ALU64_REG(BPF_ADD, R9, R4),
3920                         BPF_ALU64_REG(BPF_ADD, R9, R5),
3921                         BPF_ALU64_REG(BPF_ADD, R9, R6),
3922                         BPF_ALU64_REG(BPF_ADD, R9, R7),
3923                         BPF_ALU64_REG(BPF_ADD, R9, R8),
3924                         BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
3925                         BPF_ALU64_REG(BPF_MOV, R0, R9),
3926                         BPF_EXIT_INSN(),
3927                 },
3928                 INTERNAL,
3929                 { },
3930                 { { 0, 2957380 } }
3931         },
3932         {
3933                 "INT: ADD 32-bit",
3934                 .u.insns_int = {
3935                         BPF_ALU32_IMM(BPF_MOV, R0, 20),
3936                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
3937                         BPF_ALU32_IMM(BPF_MOV, R2, 2),
3938                         BPF_ALU32_IMM(BPF_MOV, R3, 3),
3939                         BPF_ALU32_IMM(BPF_MOV, R4, 4),
3940                         BPF_ALU32_IMM(BPF_MOV, R5, 5),
3941                         BPF_ALU32_IMM(BPF_MOV, R6, 6),
3942                         BPF_ALU32_IMM(BPF_MOV, R7, 7),
3943                         BPF_ALU32_IMM(BPF_MOV, R8, 8),
3944                         BPF_ALU32_IMM(BPF_MOV, R9, 9),
3945                         BPF_ALU64_IMM(BPF_ADD, R1, 10),
3946                         BPF_ALU64_IMM(BPF_ADD, R2, 10),
3947                         BPF_ALU64_IMM(BPF_ADD, R3, 10),
3948                         BPF_ALU64_IMM(BPF_ADD, R4, 10),
3949                         BPF_ALU64_IMM(BPF_ADD, R5, 10),
3950                         BPF_ALU64_IMM(BPF_ADD, R6, 10),
3951                         BPF_ALU64_IMM(BPF_ADD, R7, 10),
3952                         BPF_ALU64_IMM(BPF_ADD, R8, 10),
3953                         BPF_ALU64_IMM(BPF_ADD, R9, 10),
3954                         BPF_ALU32_REG(BPF_ADD, R0, R1),
3955                         BPF_ALU32_REG(BPF_ADD, R0, R2),
3956                         BPF_ALU32_REG(BPF_ADD, R0, R3),
3957                         BPF_ALU32_REG(BPF_ADD, R0, R4),
3958                         BPF_ALU32_REG(BPF_ADD, R0, R5),
3959                         BPF_ALU32_REG(BPF_ADD, R0, R6),
3960                         BPF_ALU32_REG(BPF_ADD, R0, R7),
3961                         BPF_ALU32_REG(BPF_ADD, R0, R8),
3962                         BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
3963                         BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
3964                         BPF_EXIT_INSN(),
3965                         BPF_ALU32_REG(BPF_ADD, R1, R0),
3966                         BPF_ALU32_REG(BPF_ADD, R1, R1),
3967                         BPF_ALU32_REG(BPF_ADD, R1, R2),
3968                         BPF_ALU32_REG(BPF_ADD, R1, R3),
3969                         BPF_ALU32_REG(BPF_ADD, R1, R4),
3970                         BPF_ALU32_REG(BPF_ADD, R1, R5),
3971                         BPF_ALU32_REG(BPF_ADD, R1, R6),
3972                         BPF_ALU32_REG(BPF_ADD, R1, R7),
3973                         BPF_ALU32_REG(BPF_ADD, R1, R8),
3974                         BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
3975                         BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
3976                         BPF_EXIT_INSN(),
3977                         BPF_ALU32_REG(BPF_ADD, R2, R0),
3978                         BPF_ALU32_REG(BPF_ADD, R2, R1),
3979                         BPF_ALU32_REG(BPF_ADD, R2, R2),
3980                         BPF_ALU32_REG(BPF_ADD, R2, R3),
3981                         BPF_ALU32_REG(BPF_ADD, R2, R4),
3982                         BPF_ALU32_REG(BPF_ADD, R2, R5),
3983                         BPF_ALU32_REG(BPF_ADD, R2, R6),
3984                         BPF_ALU32_REG(BPF_ADD, R2, R7),
3985                         BPF_ALU32_REG(BPF_ADD, R2, R8),
3986                         BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
3987                         BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
3988                         BPF_EXIT_INSN(),
3989                         BPF_ALU32_REG(BPF_ADD, R3, R0),
3990                         BPF_ALU32_REG(BPF_ADD, R3, R1),
3991                         BPF_ALU32_REG(BPF_ADD, R3, R2),
3992                         BPF_ALU32_REG(BPF_ADD, R3, R3),
3993                         BPF_ALU32_REG(BPF_ADD, R3, R4),
3994                         BPF_ALU32_REG(BPF_ADD, R3, R5),
3995                         BPF_ALU32_REG(BPF_ADD, R3, R6),
3996                         BPF_ALU32_REG(BPF_ADD, R3, R7),
3997                         BPF_ALU32_REG(BPF_ADD, R3, R8),
3998                         BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
3999                         BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
4000                         BPF_EXIT_INSN(),
4001                         BPF_ALU32_REG(BPF_ADD, R4, R0),
4002                         BPF_ALU32_REG(BPF_ADD, R4, R1),
4003                         BPF_ALU32_REG(BPF_ADD, R4, R2),
4004                         BPF_ALU32_REG(BPF_ADD, R4, R3),
4005                         BPF_ALU32_REG(BPF_ADD, R4, R4),
4006                         BPF_ALU32_REG(BPF_ADD, R4, R5),
4007                         BPF_ALU32_REG(BPF_ADD, R4, R6),
4008                         BPF_ALU32_REG(BPF_ADD, R4, R7),
4009                         BPF_ALU32_REG(BPF_ADD, R4, R8),
4010                         BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
4011                         BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
4012                         BPF_EXIT_INSN(),
4013                         BPF_ALU32_REG(BPF_ADD, R5, R0),
4014                         BPF_ALU32_REG(BPF_ADD, R5, R1),
4015                         BPF_ALU32_REG(BPF_ADD, R5, R2),
4016                         BPF_ALU32_REG(BPF_ADD, R5, R3),
4017                         BPF_ALU32_REG(BPF_ADD, R5, R4),
4018                         BPF_ALU32_REG(BPF_ADD, R5, R5),
4019                         BPF_ALU32_REG(BPF_ADD, R5, R6),
4020                         BPF_ALU32_REG(BPF_ADD, R5, R7),
4021                         BPF_ALU32_REG(BPF_ADD, R5, R8),
4022                         BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
4023                         BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
4024                         BPF_EXIT_INSN(),
4025                         BPF_ALU32_REG(BPF_ADD, R6, R0),
4026                         BPF_ALU32_REG(BPF_ADD, R6, R1),
4027                         BPF_ALU32_REG(BPF_ADD, R6, R2),
4028                         BPF_ALU32_REG(BPF_ADD, R6, R3),
4029                         BPF_ALU32_REG(BPF_ADD, R6, R4),
4030                         BPF_ALU32_REG(BPF_ADD, R6, R5),
4031                         BPF_ALU32_REG(BPF_ADD, R6, R6),
4032                         BPF_ALU32_REG(BPF_ADD, R6, R7),
4033                         BPF_ALU32_REG(BPF_ADD, R6, R8),
4034                         BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
4035                         BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
4036                         BPF_EXIT_INSN(),
4037                         BPF_ALU32_REG(BPF_ADD, R7, R0),
4038                         BPF_ALU32_REG(BPF_ADD, R7, R1),
4039                         BPF_ALU32_REG(BPF_ADD, R7, R2),
4040                         BPF_ALU32_REG(BPF_ADD, R7, R3),
4041                         BPF_ALU32_REG(BPF_ADD, R7, R4),
4042                         BPF_ALU32_REG(BPF_ADD, R7, R5),
4043                         BPF_ALU32_REG(BPF_ADD, R7, R6),
4044                         BPF_ALU32_REG(BPF_ADD, R7, R7),
4045                         BPF_ALU32_REG(BPF_ADD, R7, R8),
4046                         BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
4047                         BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
4048                         BPF_EXIT_INSN(),
4049                         BPF_ALU32_REG(BPF_ADD, R8, R0),
4050                         BPF_ALU32_REG(BPF_ADD, R8, R1),
4051                         BPF_ALU32_REG(BPF_ADD, R8, R2),
4052                         BPF_ALU32_REG(BPF_ADD, R8, R3),
4053                         BPF_ALU32_REG(BPF_ADD, R8, R4),
4054                         BPF_ALU32_REG(BPF_ADD, R8, R5),
4055                         BPF_ALU32_REG(BPF_ADD, R8, R6),
4056                         BPF_ALU32_REG(BPF_ADD, R8, R7),
4057                         BPF_ALU32_REG(BPF_ADD, R8, R8),
4058                         BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
4059                         BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
4060                         BPF_EXIT_INSN(),
4061                         BPF_ALU32_REG(BPF_ADD, R9, R0),
4062                         BPF_ALU32_REG(BPF_ADD, R9, R1),
4063                         BPF_ALU32_REG(BPF_ADD, R9, R2),
4064                         BPF_ALU32_REG(BPF_ADD, R9, R3),
4065                         BPF_ALU32_REG(BPF_ADD, R9, R4),
4066                         BPF_ALU32_REG(BPF_ADD, R9, R5),
4067                         BPF_ALU32_REG(BPF_ADD, R9, R6),
4068                         BPF_ALU32_REG(BPF_ADD, R9, R7),
4069                         BPF_ALU32_REG(BPF_ADD, R9, R8),
4070                         BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
4071                         BPF_ALU32_REG(BPF_MOV, R0, R9),
4072                         BPF_EXIT_INSN(),
4073                 },
4074                 INTERNAL,
4075                 { },
4076                 { { 0, 2957380 } }
4077         },
4078         {       /* Mainly checking JIT here. */
4079                 "INT: SUB",
4080                 .u.insns_int = {
4081                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4082                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
4083                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
4084                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
4085                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
4086                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
4087                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
4088                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
4089                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
4090                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
4091                         BPF_ALU64_REG(BPF_SUB, R0, R0),
4092                         BPF_ALU64_REG(BPF_SUB, R0, R1),
4093                         BPF_ALU64_REG(BPF_SUB, R0, R2),
4094                         BPF_ALU64_REG(BPF_SUB, R0, R3),
4095                         BPF_ALU64_REG(BPF_SUB, R0, R4),
4096                         BPF_ALU64_REG(BPF_SUB, R0, R5),
4097                         BPF_ALU64_REG(BPF_SUB, R0, R6),
4098                         BPF_ALU64_REG(BPF_SUB, R0, R7),
4099                         BPF_ALU64_REG(BPF_SUB, R0, R8),
4100                         BPF_ALU64_REG(BPF_SUB, R0, R9),
4101                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
4102                         BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
4103                         BPF_EXIT_INSN(),
4104                         BPF_ALU64_REG(BPF_SUB, R1, R0),
4105                         BPF_ALU64_REG(BPF_SUB, R1, R2),
4106                         BPF_ALU64_REG(BPF_SUB, R1, R3),
4107                         BPF_ALU64_REG(BPF_SUB, R1, R4),
4108                         BPF_ALU64_REG(BPF_SUB, R1, R5),
4109                         BPF_ALU64_REG(BPF_SUB, R1, R6),
4110                         BPF_ALU64_REG(BPF_SUB, R1, R7),
4111                         BPF_ALU64_REG(BPF_SUB, R1, R8),
4112                         BPF_ALU64_REG(BPF_SUB, R1, R9),
4113                         BPF_ALU64_IMM(BPF_SUB, R1, 10),
4114                         BPF_ALU64_REG(BPF_SUB, R2, R0),
4115                         BPF_ALU64_REG(BPF_SUB, R2, R1),
4116                         BPF_ALU64_REG(BPF_SUB, R2, R3),
4117                         BPF_ALU64_REG(BPF_SUB, R2, R4),
4118                         BPF_ALU64_REG(BPF_SUB, R2, R5),
4119                         BPF_ALU64_REG(BPF_SUB, R2, R6),
4120                         BPF_ALU64_REG(BPF_SUB, R2, R7),
4121                         BPF_ALU64_REG(BPF_SUB, R2, R8),
4122                         BPF_ALU64_REG(BPF_SUB, R2, R9),
4123                         BPF_ALU64_IMM(BPF_SUB, R2, 10),
4124                         BPF_ALU64_REG(BPF_SUB, R3, R0),
4125                         BPF_ALU64_REG(BPF_SUB, R3, R1),
4126                         BPF_ALU64_REG(BPF_SUB, R3, R2),
4127                         BPF_ALU64_REG(BPF_SUB, R3, R4),
4128                         BPF_ALU64_REG(BPF_SUB, R3, R5),
4129                         BPF_ALU64_REG(BPF_SUB, R3, R6),
4130                         BPF_ALU64_REG(BPF_SUB, R3, R7),
4131                         BPF_ALU64_REG(BPF_SUB, R3, R8),
4132                         BPF_ALU64_REG(BPF_SUB, R3, R9),
4133                         BPF_ALU64_IMM(BPF_SUB, R3, 10),
4134                         BPF_ALU64_REG(BPF_SUB, R4, R0),
4135                         BPF_ALU64_REG(BPF_SUB, R4, R1),
4136                         BPF_ALU64_REG(BPF_SUB, R4, R2),
4137                         BPF_ALU64_REG(BPF_SUB, R4, R3),
4138                         BPF_ALU64_REG(BPF_SUB, R4, R5),
4139                         BPF_ALU64_REG(BPF_SUB, R4, R6),
4140                         BPF_ALU64_REG(BPF_SUB, R4, R7),
4141                         BPF_ALU64_REG(BPF_SUB, R4, R8),
4142                         BPF_ALU64_REG(BPF_SUB, R4, R9),
4143                         BPF_ALU64_IMM(BPF_SUB, R4, 10),
4144                         BPF_ALU64_REG(BPF_SUB, R5, R0),
4145                         BPF_ALU64_REG(BPF_SUB, R5, R1),
4146                         BPF_ALU64_REG(BPF_SUB, R5, R2),
4147                         BPF_ALU64_REG(BPF_SUB, R5, R3),
4148                         BPF_ALU64_REG(BPF_SUB, R5, R4),
4149                         BPF_ALU64_REG(BPF_SUB, R5, R6),
4150                         BPF_ALU64_REG(BPF_SUB, R5, R7),
4151                         BPF_ALU64_REG(BPF_SUB, R5, R8),
4152                         BPF_ALU64_REG(BPF_SUB, R5, R9),
4153                         BPF_ALU64_IMM(BPF_SUB, R5, 10),
4154                         BPF_ALU64_REG(BPF_SUB, R6, R0),
4155                         BPF_ALU64_REG(BPF_SUB, R6, R1),
4156                         BPF_ALU64_REG(BPF_SUB, R6, R2),
4157                         BPF_ALU64_REG(BPF_SUB, R6, R3),
4158                         BPF_ALU64_REG(BPF_SUB, R6, R4),
4159                         BPF_ALU64_REG(BPF_SUB, R6, R5),
4160                         BPF_ALU64_REG(BPF_SUB, R6, R7),
4161                         BPF_ALU64_REG(BPF_SUB, R6, R8),
4162                         BPF_ALU64_REG(BPF_SUB, R6, R9),
4163                         BPF_ALU64_IMM(BPF_SUB, R6, 10),
4164                         BPF_ALU64_REG(BPF_SUB, R7, R0),
4165                         BPF_ALU64_REG(BPF_SUB, R7, R1),
4166                         BPF_ALU64_REG(BPF_SUB, R7, R2),
4167                         BPF_ALU64_REG(BPF_SUB, R7, R3),
4168                         BPF_ALU64_REG(BPF_SUB, R7, R4),
4169                         BPF_ALU64_REG(BPF_SUB, R7, R5),
4170                         BPF_ALU64_REG(BPF_SUB, R7, R6),
4171                         BPF_ALU64_REG(BPF_SUB, R7, R8),
4172                         BPF_ALU64_REG(BPF_SUB, R7, R9),
4173                         BPF_ALU64_IMM(BPF_SUB, R7, 10),
4174                         BPF_ALU64_REG(BPF_SUB, R8, R0),
4175                         BPF_ALU64_REG(BPF_SUB, R8, R1),
4176                         BPF_ALU64_REG(BPF_SUB, R8, R2),
4177                         BPF_ALU64_REG(BPF_SUB, R8, R3),
4178                         BPF_ALU64_REG(BPF_SUB, R8, R4),
4179                         BPF_ALU64_REG(BPF_SUB, R8, R5),
4180                         BPF_ALU64_REG(BPF_SUB, R8, R6),
4181                         BPF_ALU64_REG(BPF_SUB, R8, R7),
4182                         BPF_ALU64_REG(BPF_SUB, R8, R9),
4183                         BPF_ALU64_IMM(BPF_SUB, R8, 10),
4184                         BPF_ALU64_REG(BPF_SUB, R9, R0),
4185                         BPF_ALU64_REG(BPF_SUB, R9, R1),
4186                         BPF_ALU64_REG(BPF_SUB, R9, R2),
4187                         BPF_ALU64_REG(BPF_SUB, R9, R3),
4188                         BPF_ALU64_REG(BPF_SUB, R9, R4),
4189                         BPF_ALU64_REG(BPF_SUB, R9, R5),
4190                         BPF_ALU64_REG(BPF_SUB, R9, R6),
4191                         BPF_ALU64_REG(BPF_SUB, R9, R7),
4192                         BPF_ALU64_REG(BPF_SUB, R9, R8),
4193                         BPF_ALU64_IMM(BPF_SUB, R9, 10),
4194                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
4195                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
4196                         BPF_ALU64_REG(BPF_SUB, R0, R1),
4197                         BPF_ALU64_REG(BPF_SUB, R0, R2),
4198                         BPF_ALU64_REG(BPF_SUB, R0, R3),
4199                         BPF_ALU64_REG(BPF_SUB, R0, R4),
4200                         BPF_ALU64_REG(BPF_SUB, R0, R5),
4201                         BPF_ALU64_REG(BPF_SUB, R0, R6),
4202                         BPF_ALU64_REG(BPF_SUB, R0, R7),
4203                         BPF_ALU64_REG(BPF_SUB, R0, R8),
4204                         BPF_ALU64_REG(BPF_SUB, R0, R9),
4205                         BPF_EXIT_INSN(),
4206                 },
4207                 INTERNAL,
4208                 { },
4209                 { { 0, 11 } }
4210         },
4211         {       /* Mainly checking JIT here. */
4212                 "INT: XOR",
4213                 .u.insns_int = {
4214                         BPF_ALU64_REG(BPF_SUB, R0, R0),
4215                         BPF_ALU64_REG(BPF_XOR, R1, R1),
4216                         BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
4217                         BPF_EXIT_INSN(),
4218                         BPF_ALU64_IMM(BPF_MOV, R0, 10),
4219                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
4220                         BPF_ALU64_REG(BPF_SUB, R1, R1),
4221                         BPF_ALU64_REG(BPF_XOR, R2, R2),
4222                         BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
4223                         BPF_EXIT_INSN(),
4224                         BPF_ALU64_REG(BPF_SUB, R2, R2),
4225                         BPF_ALU64_REG(BPF_XOR, R3, R3),
4226                         BPF_ALU64_IMM(BPF_MOV, R0, 10),
4227                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
4228                         BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
4229                         BPF_EXIT_INSN(),
4230                         BPF_ALU64_REG(BPF_SUB, R3, R3),
4231                         BPF_ALU64_REG(BPF_XOR, R4, R4),
4232                         BPF_ALU64_IMM(BPF_MOV, R2, 1),
4233                         BPF_ALU64_IMM(BPF_MOV, R5, -1),
4234                         BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
4235                         BPF_EXIT_INSN(),
4236                         BPF_ALU64_REG(BPF_SUB, R4, R4),
4237                         BPF_ALU64_REG(BPF_XOR, R5, R5),
4238                         BPF_ALU64_IMM(BPF_MOV, R3, 1),
4239                         BPF_ALU64_IMM(BPF_MOV, R7, -1),
4240                         BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
4241                         BPF_EXIT_INSN(),
4242                         BPF_ALU64_IMM(BPF_MOV, R5, 1),
4243                         BPF_ALU64_REG(BPF_SUB, R5, R5),
4244                         BPF_ALU64_REG(BPF_XOR, R6, R6),
4245                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
4246                         BPF_ALU64_IMM(BPF_MOV, R8, -1),
4247                         BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
4248                         BPF_EXIT_INSN(),
4249                         BPF_ALU64_REG(BPF_SUB, R6, R6),
4250                         BPF_ALU64_REG(BPF_XOR, R7, R7),
4251                         BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
4252                         BPF_EXIT_INSN(),
4253                         BPF_ALU64_REG(BPF_SUB, R7, R7),
4254                         BPF_ALU64_REG(BPF_XOR, R8, R8),
4255                         BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
4256                         BPF_EXIT_INSN(),
4257                         BPF_ALU64_REG(BPF_SUB, R8, R8),
4258                         BPF_ALU64_REG(BPF_XOR, R9, R9),
4259                         BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
4260                         BPF_EXIT_INSN(),
4261                         BPF_ALU64_REG(BPF_SUB, R9, R9),
4262                         BPF_ALU64_REG(BPF_XOR, R0, R0),
4263                         BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
4264                         BPF_EXIT_INSN(),
4265                         BPF_ALU64_REG(BPF_SUB, R1, R1),
4266                         BPF_ALU64_REG(BPF_XOR, R0, R0),
4267                         BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
4268                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4269                         BPF_EXIT_INSN(),
4270                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
4271                         BPF_EXIT_INSN(),
4272                 },
4273                 INTERNAL,
4274                 { },
4275                 { { 0, 1 } }
4276         },
4277         {       /* Mainly checking JIT here. */
4278                 "INT: MUL",
4279                 .u.insns_int = {
4280                         BPF_ALU64_IMM(BPF_MOV, R0, 11),
4281                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
4282                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
4283                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
4284                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
4285                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
4286                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
4287                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
4288                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
4289                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
4290                         BPF_ALU64_REG(BPF_MUL, R0, R0),
4291                         BPF_ALU64_REG(BPF_MUL, R0, R1),
4292                         BPF_ALU64_REG(BPF_MUL, R0, R2),
4293                         BPF_ALU64_REG(BPF_MUL, R0, R3),
4294                         BPF_ALU64_REG(BPF_MUL, R0, R4),
4295                         BPF_ALU64_REG(BPF_MUL, R0, R5),
4296                         BPF_ALU64_REG(BPF_MUL, R0, R6),
4297                         BPF_ALU64_REG(BPF_MUL, R0, R7),
4298                         BPF_ALU64_REG(BPF_MUL, R0, R8),
4299                         BPF_ALU64_REG(BPF_MUL, R0, R9),
4300                         BPF_ALU64_IMM(BPF_MUL, R0, 10),
4301                         BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
4302                         BPF_EXIT_INSN(),
4303                         BPF_ALU64_REG(BPF_MUL, R1, R0),
4304                         BPF_ALU64_REG(BPF_MUL, R1, R2),
4305                         BPF_ALU64_REG(BPF_MUL, R1, R3),
4306                         BPF_ALU64_REG(BPF_MUL, R1, R4),
4307                         BPF_ALU64_REG(BPF_MUL, R1, R5),
4308                         BPF_ALU64_REG(BPF_MUL, R1, R6),
4309                         BPF_ALU64_REG(BPF_MUL, R1, R7),
4310                         BPF_ALU64_REG(BPF_MUL, R1, R8),
4311                         BPF_ALU64_REG(BPF_MUL, R1, R9),
4312                         BPF_ALU64_IMM(BPF_MUL, R1, 10),
4313                         BPF_ALU64_REG(BPF_MOV, R2, R1),
4314                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
4315                         BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
4316                         BPF_EXIT_INSN(),
4317                         BPF_ALU64_IMM(BPF_LSH, R1, 32),
4318                         BPF_ALU64_IMM(BPF_ARSH, R1, 32),
4319                         BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
4320                         BPF_EXIT_INSN(),
4321                         BPF_ALU64_REG(BPF_MUL, R2, R0),
4322                         BPF_ALU64_REG(BPF_MUL, R2, R1),
4323                         BPF_ALU64_REG(BPF_MUL, R2, R3),
4324                         BPF_ALU64_REG(BPF_MUL, R2, R4),
4325                         BPF_ALU64_REG(BPF_MUL, R2, R5),
4326                         BPF_ALU64_REG(BPF_MUL, R2, R6),
4327                         BPF_ALU64_REG(BPF_MUL, R2, R7),
4328                         BPF_ALU64_REG(BPF_MUL, R2, R8),
4329                         BPF_ALU64_REG(BPF_MUL, R2, R9),
4330                         BPF_ALU64_IMM(BPF_MUL, R2, 10),
4331                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
4332                         BPF_ALU64_REG(BPF_MOV, R0, R2),
4333                         BPF_EXIT_INSN(),
4334                 },
4335                 INTERNAL,
4336                 { },
4337                 { { 0, 0x35d97ef2 } }
4338         },
4339         {       /* Mainly checking JIT here. */
4340                 "MOV REG64",
4341                 .u.insns_int = {
4342                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
4343                         BPF_MOV64_REG(R1, R0),
4344                         BPF_MOV64_REG(R2, R1),
4345                         BPF_MOV64_REG(R3, R2),
4346                         BPF_MOV64_REG(R4, R3),
4347                         BPF_MOV64_REG(R5, R4),
4348                         BPF_MOV64_REG(R6, R5),
4349                         BPF_MOV64_REG(R7, R6),
4350                         BPF_MOV64_REG(R8, R7),
4351                         BPF_MOV64_REG(R9, R8),
4352                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4353                         BPF_ALU64_IMM(BPF_MOV, R1, 0),
4354                         BPF_ALU64_IMM(BPF_MOV, R2, 0),
4355                         BPF_ALU64_IMM(BPF_MOV, R3, 0),
4356                         BPF_ALU64_IMM(BPF_MOV, R4, 0),
4357                         BPF_ALU64_IMM(BPF_MOV, R5, 0),
4358                         BPF_ALU64_IMM(BPF_MOV, R6, 0),
4359                         BPF_ALU64_IMM(BPF_MOV, R7, 0),
4360                         BPF_ALU64_IMM(BPF_MOV, R8, 0),
4361                         BPF_ALU64_IMM(BPF_MOV, R9, 0),
4362                         BPF_ALU64_REG(BPF_ADD, R0, R0),
4363                         BPF_ALU64_REG(BPF_ADD, R0, R1),
4364                         BPF_ALU64_REG(BPF_ADD, R0, R2),
4365                         BPF_ALU64_REG(BPF_ADD, R0, R3),
4366                         BPF_ALU64_REG(BPF_ADD, R0, R4),
4367                         BPF_ALU64_REG(BPF_ADD, R0, R5),
4368                         BPF_ALU64_REG(BPF_ADD, R0, R6),
4369                         BPF_ALU64_REG(BPF_ADD, R0, R7),
4370                         BPF_ALU64_REG(BPF_ADD, R0, R8),
4371                         BPF_ALU64_REG(BPF_ADD, R0, R9),
4372                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
4373                         BPF_EXIT_INSN(),
4374                 },
4375                 INTERNAL,
4376                 { },
4377                 { { 0, 0xfefe } }
4378         },
4379         {       /* Mainly checking JIT here. */
4380                 "MOV REG32",
4381                 .u.insns_int = {
4382                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
4383                         BPF_MOV64_REG(R1, R0),
4384                         BPF_MOV64_REG(R2, R1),
4385                         BPF_MOV64_REG(R3, R2),
4386                         BPF_MOV64_REG(R4, R3),
4387                         BPF_MOV64_REG(R5, R4),
4388                         BPF_MOV64_REG(R6, R5),
4389                         BPF_MOV64_REG(R7, R6),
4390                         BPF_MOV64_REG(R8, R7),
4391                         BPF_MOV64_REG(R9, R8),
4392                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4393                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
4394                         BPF_ALU32_IMM(BPF_MOV, R2, 0),
4395                         BPF_ALU32_IMM(BPF_MOV, R3, 0),
4396                         BPF_ALU32_IMM(BPF_MOV, R4, 0),
4397                         BPF_ALU32_IMM(BPF_MOV, R5, 0),
4398                         BPF_ALU32_IMM(BPF_MOV, R6, 0),
4399                         BPF_ALU32_IMM(BPF_MOV, R7, 0),
4400                         BPF_ALU32_IMM(BPF_MOV, R8, 0),
4401                         BPF_ALU32_IMM(BPF_MOV, R9, 0),
4402                         BPF_ALU64_REG(BPF_ADD, R0, R0),
4403                         BPF_ALU64_REG(BPF_ADD, R0, R1),
4404                         BPF_ALU64_REG(BPF_ADD, R0, R2),
4405                         BPF_ALU64_REG(BPF_ADD, R0, R3),
4406                         BPF_ALU64_REG(BPF_ADD, R0, R4),
4407                         BPF_ALU64_REG(BPF_ADD, R0, R5),
4408                         BPF_ALU64_REG(BPF_ADD, R0, R6),
4409                         BPF_ALU64_REG(BPF_ADD, R0, R7),
4410                         BPF_ALU64_REG(BPF_ADD, R0, R8),
4411                         BPF_ALU64_REG(BPF_ADD, R0, R9),
4412                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
4413                         BPF_EXIT_INSN(),
4414                 },
4415                 INTERNAL,
4416                 { },
4417                 { { 0, 0xfefe } }
4418         },
4419         {       /* Mainly checking JIT here. */
4420                 "LD IMM64",
4421                 .u.insns_int = {
4422                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
4423                         BPF_MOV64_REG(R1, R0),
4424                         BPF_MOV64_REG(R2, R1),
4425                         BPF_MOV64_REG(R3, R2),
4426                         BPF_MOV64_REG(R4, R3),
4427                         BPF_MOV64_REG(R5, R4),
4428                         BPF_MOV64_REG(R6, R5),
4429                         BPF_MOV64_REG(R7, R6),
4430                         BPF_MOV64_REG(R8, R7),
4431                         BPF_MOV64_REG(R9, R8),
4432                         BPF_LD_IMM64(R0, 0x0LL),
4433                         BPF_LD_IMM64(R1, 0x0LL),
4434                         BPF_LD_IMM64(R2, 0x0LL),
4435                         BPF_LD_IMM64(R3, 0x0LL),
4436                         BPF_LD_IMM64(R4, 0x0LL),
4437                         BPF_LD_IMM64(R5, 0x0LL),
4438                         BPF_LD_IMM64(R6, 0x0LL),
4439                         BPF_LD_IMM64(R7, 0x0LL),
4440                         BPF_LD_IMM64(R8, 0x0LL),
4441                         BPF_LD_IMM64(R9, 0x0LL),
4442                         BPF_ALU64_REG(BPF_ADD, R0, R0),
4443                         BPF_ALU64_REG(BPF_ADD, R0, R1),
4444                         BPF_ALU64_REG(BPF_ADD, R0, R2),
4445                         BPF_ALU64_REG(BPF_ADD, R0, R3),
4446                         BPF_ALU64_REG(BPF_ADD, R0, R4),
4447                         BPF_ALU64_REG(BPF_ADD, R0, R5),
4448                         BPF_ALU64_REG(BPF_ADD, R0, R6),
4449                         BPF_ALU64_REG(BPF_ADD, R0, R7),
4450                         BPF_ALU64_REG(BPF_ADD, R0, R8),
4451                         BPF_ALU64_REG(BPF_ADD, R0, R9),
4452                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
4453                         BPF_EXIT_INSN(),
4454                 },
4455                 INTERNAL,
4456                 { },
4457                 { { 0, 0xfefe } }
4458         },
4459         {
4460                 "INT: ALU MIX",
4461                 .u.insns_int = {
4462                         BPF_ALU64_IMM(BPF_MOV, R0, 11),
4463                         BPF_ALU64_IMM(BPF_ADD, R0, -1),
4464                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
4465                         BPF_ALU64_IMM(BPF_XOR, R2, 3),
4466                         BPF_ALU64_REG(BPF_DIV, R0, R2),
4467                         BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
4468                         BPF_EXIT_INSN(),
4469                         BPF_ALU64_IMM(BPF_MOD, R0, 3),
4470                         BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
4471                         BPF_EXIT_INSN(),
4472                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
4473                         BPF_EXIT_INSN(),
4474                 },
4475                 INTERNAL,
4476                 { },
4477                 { { 0, -1 } }
4478         },
4479         {
4480                 "INT: shifts by register",
4481                 .u.insns_int = {
4482                         BPF_MOV64_IMM(R0, -1234),
4483                         BPF_MOV64_IMM(R1, 1),
4484                         BPF_ALU32_REG(BPF_RSH, R0, R1),
4485                         BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
4486                         BPF_EXIT_INSN(),
4487                         BPF_MOV64_IMM(R2, 1),
4488                         BPF_ALU64_REG(BPF_LSH, R0, R2),
4489                         BPF_MOV32_IMM(R4, -1234),
4490                         BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
4491                         BPF_EXIT_INSN(),
4492                         BPF_ALU64_IMM(BPF_AND, R4, 63),
4493                         BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
4494                         BPF_MOV64_IMM(R3, 47),
4495                         BPF_ALU64_REG(BPF_ARSH, R0, R3),
4496                         BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
4497                         BPF_EXIT_INSN(),
4498                         BPF_MOV64_IMM(R2, 1),
4499                         BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
4500                         BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
4501                         BPF_EXIT_INSN(),
4502                         BPF_MOV64_IMM(R4, 4),
4503                         BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
4504                         BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
4505                         BPF_EXIT_INSN(),
4506                         BPF_MOV64_IMM(R4, 5),
4507                         BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
4508                         BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
4509                         BPF_EXIT_INSN(),
4510                         BPF_MOV64_IMM(R0, -1),
4511                         BPF_EXIT_INSN(),
4512                 },
4513                 INTERNAL,
4514                 { },
4515                 { { 0, -1 } }
4516         },
4517 #ifdef CONFIG_32BIT
4518         {
4519                 "INT: 32-bit context pointer word order and zero-extension",
4520                 .u.insns_int = {
4521                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4522                         BPF_JMP32_IMM(BPF_JEQ, R1, 0, 3),
4523                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
4524                         BPF_JMP32_IMM(BPF_JNE, R1, 0, 1),
4525                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4526                         BPF_EXIT_INSN(),
4527                 },
4528                 INTERNAL,
4529                 { },
4530                 { { 0, 1 } }
4531         },
4532 #endif
4533         {
4534                 "check: missing ret",
4535                 .u.insns = {
4536                         BPF_STMT(BPF_LD | BPF_IMM, 1),
4537                 },
4538                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4539                 { },
4540                 { },
4541                 .fill_helper = NULL,
4542                 .expected_errcode = -EINVAL,
4543         },
4544         {
4545                 "check: div_k_0",
4546                 .u.insns = {
4547                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
4548                         BPF_STMT(BPF_RET | BPF_K, 0)
4549                 },
4550                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4551                 { },
4552                 { },
4553                 .fill_helper = NULL,
4554                 .expected_errcode = -EINVAL,
4555         },
4556         {
4557                 "check: unknown insn",
4558                 .u.insns = {
4559                         /* seccomp insn, rejected in socket filter */
4560                         BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
4561                         BPF_STMT(BPF_RET | BPF_K, 0)
4562                 },
4563                 CLASSIC | FLAG_EXPECTED_FAIL,
4564                 { },
4565                 { },
4566                 .fill_helper = NULL,
4567                 .expected_errcode = -EINVAL,
4568         },
4569         {
4570                 "check: out of range spill/fill",
4571                 .u.insns = {
4572                         BPF_STMT(BPF_STX, 16),
4573                         BPF_STMT(BPF_RET | BPF_K, 0)
4574                 },
4575                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4576                 { },
4577                 { },
4578                 .fill_helper = NULL,
4579                 .expected_errcode = -EINVAL,
4580         },
4581         {
4582                 "JUMPS + HOLES",
4583                 .u.insns = {
4584                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4585                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
4586                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
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_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
4600                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4601                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
4602                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4603                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
4604                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
4605                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
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_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
4619                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
4620                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4621                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
4622                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
4623                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
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_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
4637                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
4638                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
4639                         BPF_STMT(BPF_RET | BPF_A, 0),
4640                         BPF_STMT(BPF_RET | BPF_A, 0),
4641                 },
4642                 CLASSIC,
4643                 { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
4644                   0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
4645                   0x08, 0x00,
4646                   0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
4647                   0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
4648                   0xc0, 0xa8, 0x33, 0x01,
4649                   0xc0, 0xa8, 0x33, 0x02,
4650                   0xbb, 0xb6,
4651                   0xa9, 0xfa,
4652                   0x00, 0x14, 0x00, 0x00,
4653                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
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 },
4661                 { { 88, 0x001b } }
4662         },
4663         {
4664                 "check: RET X",
4665                 .u.insns = {
4666                         BPF_STMT(BPF_RET | BPF_X, 0),
4667                 },
4668                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4669                 { },
4670                 { },
4671                 .fill_helper = NULL,
4672                 .expected_errcode = -EINVAL,
4673         },
4674         {
4675                 "check: LDX + RET X",
4676                 .u.insns = {
4677                         BPF_STMT(BPF_LDX | BPF_IMM, 42),
4678                         BPF_STMT(BPF_RET | BPF_X, 0),
4679                 },
4680                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4681                 { },
4682                 { },
4683                 .fill_helper = NULL,
4684                 .expected_errcode = -EINVAL,
4685         },
4686         {       /* Mainly checking JIT here. */
4687                 "M[]: alt STX + LDX",
4688                 .u.insns = {
4689                         BPF_STMT(BPF_LDX | BPF_IMM, 100),
4690                         BPF_STMT(BPF_STX, 0),
4691                         BPF_STMT(BPF_LDX | BPF_MEM, 0),
4692                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4693                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4694                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4695                         BPF_STMT(BPF_STX, 1),
4696                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
4697                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4698                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4699                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4700                         BPF_STMT(BPF_STX, 2),
4701                         BPF_STMT(BPF_LDX | BPF_MEM, 2),
4702                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4703                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4704                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4705                         BPF_STMT(BPF_STX, 3),
4706                         BPF_STMT(BPF_LDX | BPF_MEM, 3),
4707                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4708                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4709                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4710                         BPF_STMT(BPF_STX, 4),
4711                         BPF_STMT(BPF_LDX | BPF_MEM, 4),
4712                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4713                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4714                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4715                         BPF_STMT(BPF_STX, 5),
4716                         BPF_STMT(BPF_LDX | BPF_MEM, 5),
4717                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4718                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4719                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4720                         BPF_STMT(BPF_STX, 6),
4721                         BPF_STMT(BPF_LDX | BPF_MEM, 6),
4722                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4723                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4724                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4725                         BPF_STMT(BPF_STX, 7),
4726                         BPF_STMT(BPF_LDX | BPF_MEM, 7),
4727                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4728                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4729                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4730                         BPF_STMT(BPF_STX, 8),
4731                         BPF_STMT(BPF_LDX | BPF_MEM, 8),
4732                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4733                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4734                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4735                         BPF_STMT(BPF_STX, 9),
4736                         BPF_STMT(BPF_LDX | BPF_MEM, 9),
4737                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4738                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4739                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4740                         BPF_STMT(BPF_STX, 10),
4741                         BPF_STMT(BPF_LDX | BPF_MEM, 10),
4742                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4743                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4744                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4745                         BPF_STMT(BPF_STX, 11),
4746                         BPF_STMT(BPF_LDX | BPF_MEM, 11),
4747                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4748                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4749                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4750                         BPF_STMT(BPF_STX, 12),
4751                         BPF_STMT(BPF_LDX | BPF_MEM, 12),
4752                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4753                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4754                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4755                         BPF_STMT(BPF_STX, 13),
4756                         BPF_STMT(BPF_LDX | BPF_MEM, 13),
4757                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4758                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4759                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4760                         BPF_STMT(BPF_STX, 14),
4761                         BPF_STMT(BPF_LDX | BPF_MEM, 14),
4762                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4763                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4764                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4765                         BPF_STMT(BPF_STX, 15),
4766                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
4767                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4768                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
4769                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
4770                         BPF_STMT(BPF_RET | BPF_A, 0),
4771                 },
4772                 CLASSIC | FLAG_NO_DATA,
4773                 { },
4774                 { { 0, 116 } },
4775         },
4776         {       /* Mainly checking JIT here. */
4777                 "M[]: full STX + full LDX",
4778                 .u.insns = {
4779                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
4780                         BPF_STMT(BPF_STX, 0),
4781                         BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
4782                         BPF_STMT(BPF_STX, 1),
4783                         BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
4784                         BPF_STMT(BPF_STX, 2),
4785                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
4786                         BPF_STMT(BPF_STX, 3),
4787                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
4788                         BPF_STMT(BPF_STX, 4),
4789                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
4790                         BPF_STMT(BPF_STX, 5),
4791                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
4792                         BPF_STMT(BPF_STX, 6),
4793                         BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
4794                         BPF_STMT(BPF_STX, 7),
4795                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
4796                         BPF_STMT(BPF_STX, 8),
4797                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
4798                         BPF_STMT(BPF_STX, 9),
4799                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
4800                         BPF_STMT(BPF_STX, 10),
4801                         BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
4802                         BPF_STMT(BPF_STX, 11),
4803                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
4804                         BPF_STMT(BPF_STX, 12),
4805                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
4806                         BPF_STMT(BPF_STX, 13),
4807                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
4808                         BPF_STMT(BPF_STX, 14),
4809                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
4810                         BPF_STMT(BPF_STX, 15),
4811                         BPF_STMT(BPF_LDX | BPF_MEM, 0),
4812                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
4813                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
4814                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4815                         BPF_STMT(BPF_LDX | BPF_MEM, 2),
4816                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4817                         BPF_STMT(BPF_LDX | BPF_MEM, 3),
4818                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4819                         BPF_STMT(BPF_LDX | BPF_MEM, 4),
4820                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4821                         BPF_STMT(BPF_LDX | BPF_MEM, 5),
4822                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4823                         BPF_STMT(BPF_LDX | BPF_MEM, 6),
4824                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4825                         BPF_STMT(BPF_LDX | BPF_MEM, 7),
4826                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4827                         BPF_STMT(BPF_LDX | BPF_MEM, 8),
4828                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4829                         BPF_STMT(BPF_LDX | BPF_MEM, 9),
4830                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4831                         BPF_STMT(BPF_LDX | BPF_MEM, 10),
4832                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4833                         BPF_STMT(BPF_LDX | BPF_MEM, 11),
4834                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4835                         BPF_STMT(BPF_LDX | BPF_MEM, 12),
4836                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4837                         BPF_STMT(BPF_LDX | BPF_MEM, 13),
4838                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4839                         BPF_STMT(BPF_LDX | BPF_MEM, 14),
4840                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4841                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
4842                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
4843                         BPF_STMT(BPF_RET | BPF_A, 0),
4844                 },
4845                 CLASSIC | FLAG_NO_DATA,
4846                 { },
4847                 { { 0, 0x2a5a5e5 } },
4848         },
4849         {
4850                 "check: SKF_AD_MAX",
4851                 .u.insns = {
4852                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
4853                                  SKF_AD_OFF + SKF_AD_MAX),
4854                         BPF_STMT(BPF_RET | BPF_A, 0),
4855                 },
4856                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4857                 { },
4858                 { },
4859                 .fill_helper = NULL,
4860                 .expected_errcode = -EINVAL,
4861         },
4862         {       /* Passes checker but fails during runtime. */
4863                 "LD [SKF_AD_OFF-1]",
4864                 .u.insns = {
4865                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
4866                                  SKF_AD_OFF - 1),
4867                         BPF_STMT(BPF_RET | BPF_K, 1),
4868                 },
4869                 CLASSIC,
4870                 { },
4871                 { { 1, 0 } },
4872         },
4873         {
4874                 "load 64-bit immediate",
4875                 .u.insns_int = {
4876                         BPF_LD_IMM64(R1, 0x567800001234LL),
4877                         BPF_MOV64_REG(R2, R1),
4878                         BPF_MOV64_REG(R3, R2),
4879                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
4880                         BPF_ALU64_IMM(BPF_LSH, R3, 32),
4881                         BPF_ALU64_IMM(BPF_RSH, R3, 32),
4882                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
4883                         BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
4884                         BPF_EXIT_INSN(),
4885                         BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
4886                         BPF_EXIT_INSN(),
4887                         BPF_LD_IMM64(R0, 0x1ffffffffLL),
4888                         BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
4889                         BPF_EXIT_INSN(),
4890                 },
4891                 INTERNAL,
4892                 { },
4893                 { { 0, 1 } }
4894         },
4895         /* BPF_ALU | BPF_MOV | BPF_X */
4896         {
4897                 "ALU_MOV_X: dst = 2",
4898                 .u.insns_int = {
4899                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
4900                         BPF_ALU32_REG(BPF_MOV, R0, R1),
4901                         BPF_EXIT_INSN(),
4902                 },
4903                 INTERNAL,
4904                 { },
4905                 { { 0, 2 } },
4906         },
4907         {
4908                 "ALU_MOV_X: dst = 4294967295",
4909                 .u.insns_int = {
4910                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
4911                         BPF_ALU32_REG(BPF_MOV, R0, R1),
4912                         BPF_EXIT_INSN(),
4913                 },
4914                 INTERNAL,
4915                 { },
4916                 { { 0, 4294967295U } },
4917         },
4918         {
4919                 "ALU64_MOV_X: dst = 2",
4920                 .u.insns_int = {
4921                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
4922                         BPF_ALU64_REG(BPF_MOV, R0, R1),
4923                         BPF_EXIT_INSN(),
4924                 },
4925                 INTERNAL,
4926                 { },
4927                 { { 0, 2 } },
4928         },
4929         {
4930                 "ALU64_MOV_X: dst = 4294967295",
4931                 .u.insns_int = {
4932                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
4933                         BPF_ALU64_REG(BPF_MOV, R0, R1),
4934                         BPF_EXIT_INSN(),
4935                 },
4936                 INTERNAL,
4937                 { },
4938                 { { 0, 4294967295U } },
4939         },
4940         /* BPF_ALU | BPF_MOV | BPF_K */
4941         {
4942                 "ALU_MOV_K: dst = 2",
4943                 .u.insns_int = {
4944                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
4945                         BPF_EXIT_INSN(),
4946                 },
4947                 INTERNAL,
4948                 { },
4949                 { { 0, 2 } },
4950         },
4951         {
4952                 "ALU_MOV_K: dst = 4294967295",
4953                 .u.insns_int = {
4954                         BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
4955                         BPF_EXIT_INSN(),
4956                 },
4957                 INTERNAL,
4958                 { },
4959                 { { 0, 4294967295U } },
4960         },
4961         {
4962                 "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
4963                 .u.insns_int = {
4964                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4965                         BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
4966                         BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
4967                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4968                         BPF_MOV32_IMM(R0, 2),
4969                         BPF_EXIT_INSN(),
4970                         BPF_MOV32_IMM(R0, 1),
4971                         BPF_EXIT_INSN(),
4972                 },
4973                 INTERNAL,
4974                 { },
4975                 { { 0, 0x1 } },
4976         },
4977         {
4978                 "ALU_MOV_K: small negative",
4979                 .u.insns_int = {
4980                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
4981                         BPF_EXIT_INSN(),
4982                 },
4983                 INTERNAL,
4984                 { },
4985                 { { 0, -123 } }
4986         },
4987         {
4988                 "ALU_MOV_K: small negative zero extension",
4989                 .u.insns_int = {
4990                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
4991                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
4992                         BPF_EXIT_INSN(),
4993                 },
4994                 INTERNAL,
4995                 { },
4996                 { { 0, 0 } }
4997         },
4998         {
4999                 "ALU_MOV_K: large negative",
5000                 .u.insns_int = {
5001                         BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
5002                         BPF_EXIT_INSN(),
5003                 },
5004                 INTERNAL,
5005                 { },
5006                 { { 0, -123456789 } }
5007         },
5008         {
5009                 "ALU_MOV_K: large negative zero extension",
5010                 .u.insns_int = {
5011                         BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
5012                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5013                         BPF_EXIT_INSN(),
5014                 },
5015                 INTERNAL,
5016                 { },
5017                 { { 0, 0 } }
5018         },
5019         {
5020                 "ALU64_MOV_K: dst = 2",
5021                 .u.insns_int = {
5022                         BPF_ALU64_IMM(BPF_MOV, R0, 2),
5023                         BPF_EXIT_INSN(),
5024                 },
5025                 INTERNAL,
5026                 { },
5027                 { { 0, 2 } },
5028         },
5029         {
5030                 "ALU64_MOV_K: dst = 2147483647",
5031                 .u.insns_int = {
5032                         BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
5033                         BPF_EXIT_INSN(),
5034                 },
5035                 INTERNAL,
5036                 { },
5037                 { { 0, 2147483647 } },
5038         },
5039         {
5040                 "ALU64_OR_K: dst = 0x0",
5041                 .u.insns_int = {
5042                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5043                         BPF_LD_IMM64(R3, 0x0),
5044                         BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
5045                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5046                         BPF_MOV32_IMM(R0, 2),
5047                         BPF_EXIT_INSN(),
5048                         BPF_MOV32_IMM(R0, 1),
5049                         BPF_EXIT_INSN(),
5050                 },
5051                 INTERNAL,
5052                 { },
5053                 { { 0, 0x1 } },
5054         },
5055         {
5056                 "ALU64_MOV_K: dst = -1",
5057                 .u.insns_int = {
5058                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
5059                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5060                         BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
5061                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5062                         BPF_MOV32_IMM(R0, 2),
5063                         BPF_EXIT_INSN(),
5064                         BPF_MOV32_IMM(R0, 1),
5065                         BPF_EXIT_INSN(),
5066                 },
5067                 INTERNAL,
5068                 { },
5069                 { { 0, 0x1 } },
5070         },
5071         {
5072                 "ALU64_MOV_K: small negative",
5073                 .u.insns_int = {
5074                         BPF_ALU64_IMM(BPF_MOV, R0, -123),
5075                         BPF_EXIT_INSN(),
5076                 },
5077                 INTERNAL,
5078                 { },
5079                 { { 0, -123 } }
5080         },
5081         {
5082                 "ALU64_MOV_K: small negative sign extension",
5083                 .u.insns_int = {
5084                         BPF_ALU64_IMM(BPF_MOV, R0, -123),
5085                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5086                         BPF_EXIT_INSN(),
5087                 },
5088                 INTERNAL,
5089                 { },
5090                 { { 0, 0xffffffff } }
5091         },
5092         {
5093                 "ALU64_MOV_K: large negative",
5094                 .u.insns_int = {
5095                         BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
5096                         BPF_EXIT_INSN(),
5097                 },
5098                 INTERNAL,
5099                 { },
5100                 { { 0, -123456789 } }
5101         },
5102         {
5103                 "ALU64_MOV_K: large negative sign extension",
5104                 .u.insns_int = {
5105                         BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
5106                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5107                         BPF_EXIT_INSN(),
5108                 },
5109                 INTERNAL,
5110                 { },
5111                 { { 0, 0xffffffff } }
5112         },
5113         /* BPF_ALU | BPF_ADD | BPF_X */
5114         {
5115                 "ALU_ADD_X: 1 + 2 = 3",
5116                 .u.insns_int = {
5117                         BPF_LD_IMM64(R0, 1),
5118                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5119                         BPF_ALU32_REG(BPF_ADD, R0, R1),
5120                         BPF_EXIT_INSN(),
5121                 },
5122                 INTERNAL,
5123                 { },
5124                 { { 0, 3 } },
5125         },
5126         {
5127                 "ALU_ADD_X: 1 + 4294967294 = 4294967295",
5128                 .u.insns_int = {
5129                         BPF_LD_IMM64(R0, 1),
5130                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5131                         BPF_ALU32_REG(BPF_ADD, R0, R1),
5132                         BPF_EXIT_INSN(),
5133                 },
5134                 INTERNAL,
5135                 { },
5136                 { { 0, 4294967295U } },
5137         },
5138         {
5139                 "ALU_ADD_X: 2 + 4294967294 = 0",
5140                 .u.insns_int = {
5141                         BPF_LD_IMM64(R0, 2),
5142                         BPF_LD_IMM64(R1, 4294967294U),
5143                         BPF_ALU32_REG(BPF_ADD, R0, R1),
5144                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
5145                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
5146                         BPF_EXIT_INSN(),
5147                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
5148                         BPF_EXIT_INSN(),
5149                 },
5150                 INTERNAL,
5151                 { },
5152                 { { 0, 1 } },
5153         },
5154         {
5155                 "ALU64_ADD_X: 1 + 2 = 3",
5156                 .u.insns_int = {
5157                         BPF_LD_IMM64(R0, 1),
5158                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5159                         BPF_ALU64_REG(BPF_ADD, R0, R1),
5160                         BPF_EXIT_INSN(),
5161                 },
5162                 INTERNAL,
5163                 { },
5164                 { { 0, 3 } },
5165         },
5166         {
5167                 "ALU64_ADD_X: 1 + 4294967294 = 4294967295",
5168                 .u.insns_int = {
5169                         BPF_LD_IMM64(R0, 1),
5170                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5171                         BPF_ALU64_REG(BPF_ADD, R0, R1),
5172                         BPF_EXIT_INSN(),
5173                 },
5174                 INTERNAL,
5175                 { },
5176                 { { 0, 4294967295U } },
5177         },
5178         {
5179                 "ALU64_ADD_X: 2 + 4294967294 = 4294967296",
5180                 .u.insns_int = {
5181                         BPF_LD_IMM64(R0, 2),
5182                         BPF_LD_IMM64(R1, 4294967294U),
5183                         BPF_LD_IMM64(R2, 4294967296ULL),
5184                         BPF_ALU64_REG(BPF_ADD, R0, R1),
5185                         BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
5186                         BPF_MOV32_IMM(R0, 0),
5187                         BPF_EXIT_INSN(),
5188                         BPF_MOV32_IMM(R0, 1),
5189                         BPF_EXIT_INSN(),
5190                 },
5191                 INTERNAL,
5192                 { },
5193                 { { 0, 1 } },
5194         },
5195         /* BPF_ALU | BPF_ADD | BPF_K */
5196         {
5197                 "ALU_ADD_K: 1 + 2 = 3",
5198                 .u.insns_int = {
5199                         BPF_LD_IMM64(R0, 1),
5200                         BPF_ALU32_IMM(BPF_ADD, R0, 2),
5201                         BPF_EXIT_INSN(),
5202                 },
5203                 INTERNAL,
5204                 { },
5205                 { { 0, 3 } },
5206         },
5207         {
5208                 "ALU_ADD_K: 3 + 0 = 3",
5209                 .u.insns_int = {
5210                         BPF_LD_IMM64(R0, 3),
5211                         BPF_ALU32_IMM(BPF_ADD, R0, 0),
5212                         BPF_EXIT_INSN(),
5213                 },
5214                 INTERNAL,
5215                 { },
5216                 { { 0, 3 } },
5217         },
5218         {
5219                 "ALU_ADD_K: 1 + 4294967294 = 4294967295",
5220                 .u.insns_int = {
5221                         BPF_LD_IMM64(R0, 1),
5222                         BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
5223                         BPF_EXIT_INSN(),
5224                 },
5225                 INTERNAL,
5226                 { },
5227                 { { 0, 4294967295U } },
5228         },
5229         {
5230                 "ALU_ADD_K: 4294967294 + 2 = 0",
5231                 .u.insns_int = {
5232                         BPF_LD_IMM64(R0, 4294967294U),
5233                         BPF_ALU32_IMM(BPF_ADD, R0, 2),
5234                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
5235                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
5236                         BPF_EXIT_INSN(),
5237                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
5238                         BPF_EXIT_INSN(),
5239                 },
5240                 INTERNAL,
5241                 { },
5242                 { { 0, 1 } },
5243         },
5244         {
5245                 "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
5246                 .u.insns_int = {
5247                         BPF_LD_IMM64(R2, 0x0),
5248                         BPF_LD_IMM64(R3, 0x00000000ffffffff),
5249                         BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
5250                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5251                         BPF_MOV32_IMM(R0, 2),
5252                         BPF_EXIT_INSN(),
5253                         BPF_MOV32_IMM(R0, 1),
5254                         BPF_EXIT_INSN(),
5255                 },
5256                 INTERNAL,
5257                 { },
5258                 { { 0, 0x1 } },
5259         },
5260         {
5261                 "ALU_ADD_K: 0 + 0xffff = 0xffff",
5262                 .u.insns_int = {
5263                         BPF_LD_IMM64(R2, 0x0),
5264                         BPF_LD_IMM64(R3, 0xffff),
5265                         BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
5266                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5267                         BPF_MOV32_IMM(R0, 2),
5268                         BPF_EXIT_INSN(),
5269                         BPF_MOV32_IMM(R0, 1),
5270                         BPF_EXIT_INSN(),
5271                 },
5272                 INTERNAL,
5273                 { },
5274                 { { 0, 0x1 } },
5275         },
5276         {
5277                 "ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
5278                 .u.insns_int = {
5279                         BPF_LD_IMM64(R2, 0x0),
5280                         BPF_LD_IMM64(R3, 0x7fffffff),
5281                         BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
5282                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5283                         BPF_MOV32_IMM(R0, 2),
5284                         BPF_EXIT_INSN(),
5285                         BPF_MOV32_IMM(R0, 1),
5286                         BPF_EXIT_INSN(),
5287                 },
5288                 INTERNAL,
5289                 { },
5290                 { { 0, 0x1 } },
5291         },
5292         {
5293                 "ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
5294                 .u.insns_int = {
5295                         BPF_LD_IMM64(R2, 0x0),
5296                         BPF_LD_IMM64(R3, 0x80000000),
5297                         BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
5298                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5299                         BPF_MOV32_IMM(R0, 2),
5300                         BPF_EXIT_INSN(),
5301                         BPF_MOV32_IMM(R0, 1),
5302                         BPF_EXIT_INSN(),
5303                 },
5304                 INTERNAL,
5305                 { },
5306                 { { 0, 0x1 } },
5307         },
5308         {
5309                 "ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
5310                 .u.insns_int = {
5311                         BPF_LD_IMM64(R2, 0x0),
5312                         BPF_LD_IMM64(R3, 0x80008000),
5313                         BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
5314                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5315                         BPF_MOV32_IMM(R0, 2),
5316                         BPF_EXIT_INSN(),
5317                         BPF_MOV32_IMM(R0, 1),
5318                         BPF_EXIT_INSN(),
5319                 },
5320                 INTERNAL,
5321                 { },
5322                 { { 0, 0x1 } },
5323         },
5324         {
5325                 "ALU64_ADD_K: 1 + 2 = 3",
5326                 .u.insns_int = {
5327                         BPF_LD_IMM64(R0, 1),
5328                         BPF_ALU64_IMM(BPF_ADD, R0, 2),
5329                         BPF_EXIT_INSN(),
5330                 },
5331                 INTERNAL,
5332                 { },
5333                 { { 0, 3 } },
5334         },
5335         {
5336                 "ALU64_ADD_K: 3 + 0 = 3",
5337                 .u.insns_int = {
5338                         BPF_LD_IMM64(R0, 3),
5339                         BPF_ALU64_IMM(BPF_ADD, R0, 0),
5340                         BPF_EXIT_INSN(),
5341                 },
5342                 INTERNAL,
5343                 { },
5344                 { { 0, 3 } },
5345         },
5346         {
5347                 "ALU64_ADD_K: 1 + 2147483646 = 2147483647",
5348                 .u.insns_int = {
5349                         BPF_LD_IMM64(R0, 1),
5350                         BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
5351                         BPF_EXIT_INSN(),
5352                 },
5353                 INTERNAL,
5354                 { },
5355                 { { 0, 2147483647 } },
5356         },
5357         {
5358                 "ALU64_ADD_K: 4294967294 + 2 = 4294967296",
5359                 .u.insns_int = {
5360                         BPF_LD_IMM64(R0, 4294967294U),
5361                         BPF_LD_IMM64(R1, 4294967296ULL),
5362                         BPF_ALU64_IMM(BPF_ADD, R0, 2),
5363                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
5364                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
5365                         BPF_EXIT_INSN(),
5366                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
5367                         BPF_EXIT_INSN(),
5368                 },
5369                 INTERNAL,
5370                 { },
5371                 { { 0, 1 } },
5372         },
5373         {
5374                 "ALU64_ADD_K: 2147483646 + -2147483647 = -1",
5375                 .u.insns_int = {
5376                         BPF_LD_IMM64(R0, 2147483646),
5377                         BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
5378                         BPF_EXIT_INSN(),
5379                 },
5380                 INTERNAL,
5381                 { },
5382                 { { 0, -1 } },
5383         },
5384         {
5385                 "ALU64_ADD_K: 1 + 0 = 1",
5386                 .u.insns_int = {
5387                         BPF_LD_IMM64(R2, 0x1),
5388                         BPF_LD_IMM64(R3, 0x1),
5389                         BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
5390                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5391                         BPF_MOV32_IMM(R0, 2),
5392                         BPF_EXIT_INSN(),
5393                         BPF_MOV32_IMM(R0, 1),
5394                         BPF_EXIT_INSN(),
5395                 },
5396                 INTERNAL,
5397                 { },
5398                 { { 0, 0x1 } },
5399         },
5400         {
5401                 "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
5402                 .u.insns_int = {
5403                         BPF_LD_IMM64(R2, 0x0),
5404                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5405                         BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
5406                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5407                         BPF_MOV32_IMM(R0, 2),
5408                         BPF_EXIT_INSN(),
5409                         BPF_MOV32_IMM(R0, 1),
5410                         BPF_EXIT_INSN(),
5411                 },
5412                 INTERNAL,
5413                 { },
5414                 { { 0, 0x1 } },
5415         },
5416         {
5417                 "ALU64_ADD_K: 0 + 0xffff = 0xffff",
5418                 .u.insns_int = {
5419                         BPF_LD_IMM64(R2, 0x0),
5420                         BPF_LD_IMM64(R3, 0xffff),
5421                         BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
5422                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5423                         BPF_MOV32_IMM(R0, 2),
5424                         BPF_EXIT_INSN(),
5425                         BPF_MOV32_IMM(R0, 1),
5426                         BPF_EXIT_INSN(),
5427                 },
5428                 INTERNAL,
5429                 { },
5430                 { { 0, 0x1 } },
5431         },
5432         {
5433                 "ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
5434                 .u.insns_int = {
5435                         BPF_LD_IMM64(R2, 0x0),
5436                         BPF_LD_IMM64(R3, 0x7fffffff),
5437                         BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
5438                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5439                         BPF_MOV32_IMM(R0, 2),
5440                         BPF_EXIT_INSN(),
5441                         BPF_MOV32_IMM(R0, 1),
5442                         BPF_EXIT_INSN(),
5443                 },
5444                 INTERNAL,
5445                 { },
5446                 { { 0, 0x1 } },
5447         },
5448         {
5449                 "ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
5450                 .u.insns_int = {
5451                         BPF_LD_IMM64(R2, 0x0),
5452                         BPF_LD_IMM64(R3, 0xffffffff80000000LL),
5453                         BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
5454                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5455                         BPF_MOV32_IMM(R0, 2),
5456                         BPF_EXIT_INSN(),
5457                         BPF_MOV32_IMM(R0, 1),
5458                         BPF_EXIT_INSN(),
5459                 },
5460                 INTERNAL,
5461                 { },
5462                 { { 0, 0x1 } },
5463         },
5464         {
5465                 "ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
5466                 .u.insns_int = {
5467                         BPF_LD_IMM64(R2, 0x0),
5468                         BPF_LD_IMM64(R3, 0xffffffff80008000LL),
5469                         BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
5470                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5471                         BPF_MOV32_IMM(R0, 2),
5472                         BPF_EXIT_INSN(),
5473                         BPF_MOV32_IMM(R0, 1),
5474                         BPF_EXIT_INSN(),
5475                 },
5476                 INTERNAL,
5477                 { },
5478                 { { 0, 0x1 } },
5479         },
5480         /* BPF_ALU | BPF_SUB | BPF_X */
5481         {
5482                 "ALU_SUB_X: 3 - 1 = 2",
5483                 .u.insns_int = {
5484                         BPF_LD_IMM64(R0, 3),
5485                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
5486                         BPF_ALU32_REG(BPF_SUB, R0, R1),
5487                         BPF_EXIT_INSN(),
5488                 },
5489                 INTERNAL,
5490                 { },
5491                 { { 0, 2 } },
5492         },
5493         {
5494                 "ALU_SUB_X: 4294967295 - 4294967294 = 1",
5495                 .u.insns_int = {
5496                         BPF_LD_IMM64(R0, 4294967295U),
5497                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5498                         BPF_ALU32_REG(BPF_SUB, R0, R1),
5499                         BPF_EXIT_INSN(),
5500                 },
5501                 INTERNAL,
5502                 { },
5503                 { { 0, 1 } },
5504         },
5505         {
5506                 "ALU64_SUB_X: 3 - 1 = 2",
5507                 .u.insns_int = {
5508                         BPF_LD_IMM64(R0, 3),
5509                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
5510                         BPF_ALU64_REG(BPF_SUB, R0, R1),
5511                         BPF_EXIT_INSN(),
5512                 },
5513                 INTERNAL,
5514                 { },
5515                 { { 0, 2 } },
5516         },
5517         {
5518                 "ALU64_SUB_X: 4294967295 - 4294967294 = 1",
5519                 .u.insns_int = {
5520                         BPF_LD_IMM64(R0, 4294967295U),
5521                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
5522                         BPF_ALU64_REG(BPF_SUB, R0, R1),
5523                         BPF_EXIT_INSN(),
5524                 },
5525                 INTERNAL,
5526                 { },
5527                 { { 0, 1 } },
5528         },
5529         /* BPF_ALU | BPF_SUB | BPF_K */
5530         {
5531                 "ALU_SUB_K: 3 - 1 = 2",
5532                 .u.insns_int = {
5533                         BPF_LD_IMM64(R0, 3),
5534                         BPF_ALU32_IMM(BPF_SUB, R0, 1),
5535                         BPF_EXIT_INSN(),
5536                 },
5537                 INTERNAL,
5538                 { },
5539                 { { 0, 2 } },
5540         },
5541         {
5542                 "ALU_SUB_K: 3 - 0 = 3",
5543                 .u.insns_int = {
5544                         BPF_LD_IMM64(R0, 3),
5545                         BPF_ALU32_IMM(BPF_SUB, R0, 0),
5546                         BPF_EXIT_INSN(),
5547                 },
5548                 INTERNAL,
5549                 { },
5550                 { { 0, 3 } },
5551         },
5552         {
5553                 "ALU_SUB_K: 4294967295 - 4294967294 = 1",
5554                 .u.insns_int = {
5555                         BPF_LD_IMM64(R0, 4294967295U),
5556                         BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
5557                         BPF_EXIT_INSN(),
5558                 },
5559                 INTERNAL,
5560                 { },
5561                 { { 0, 1 } },
5562         },
5563         {
5564                 "ALU64_SUB_K: 3 - 1 = 2",
5565                 .u.insns_int = {
5566                         BPF_LD_IMM64(R0, 3),
5567                         BPF_ALU64_IMM(BPF_SUB, R0, 1),
5568                         BPF_EXIT_INSN(),
5569                 },
5570                 INTERNAL,
5571                 { },
5572                 { { 0, 2 } },
5573         },
5574         {
5575                 "ALU64_SUB_K: 3 - 0 = 3",
5576                 .u.insns_int = {
5577                         BPF_LD_IMM64(R0, 3),
5578                         BPF_ALU64_IMM(BPF_SUB, R0, 0),
5579                         BPF_EXIT_INSN(),
5580                 },
5581                 INTERNAL,
5582                 { },
5583                 { { 0, 3 } },
5584         },
5585         {
5586                 "ALU64_SUB_K: 4294967294 - 4294967295 = -1",
5587                 .u.insns_int = {
5588                         BPF_LD_IMM64(R0, 4294967294U),
5589                         BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
5590                         BPF_EXIT_INSN(),
5591                 },
5592                 INTERNAL,
5593                 { },
5594                 { { 0, -1 } },
5595         },
5596         {
5597                 "ALU64_ADD_K: 2147483646 - 2147483647 = -1",
5598                 .u.insns_int = {
5599                         BPF_LD_IMM64(R0, 2147483646),
5600                         BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
5601                         BPF_EXIT_INSN(),
5602                 },
5603                 INTERNAL,
5604                 { },
5605                 { { 0, -1 } },
5606         },
5607         /* BPF_ALU | BPF_MUL | BPF_X */
5608         {
5609                 "ALU_MUL_X: 2 * 3 = 6",
5610                 .u.insns_int = {
5611                         BPF_LD_IMM64(R0, 2),
5612                         BPF_ALU32_IMM(BPF_MOV, R1, 3),
5613                         BPF_ALU32_REG(BPF_MUL, R0, R1),
5614                         BPF_EXIT_INSN(),
5615                 },
5616                 INTERNAL,
5617                 { },
5618                 { { 0, 6 } },
5619         },
5620         {
5621                 "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
5622                 .u.insns_int = {
5623                         BPF_LD_IMM64(R0, 2),
5624                         BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
5625                         BPF_ALU32_REG(BPF_MUL, R0, R1),
5626                         BPF_EXIT_INSN(),
5627                 },
5628                 INTERNAL,
5629                 { },
5630                 { { 0, 0xFFFFFFF0 } },
5631         },
5632         {
5633                 "ALU_MUL_X: -1 * -1 = 1",
5634                 .u.insns_int = {
5635                         BPF_LD_IMM64(R0, -1),
5636                         BPF_ALU32_IMM(BPF_MOV, R1, -1),
5637                         BPF_ALU32_REG(BPF_MUL, R0, R1),
5638                         BPF_EXIT_INSN(),
5639                 },
5640                 INTERNAL,
5641                 { },
5642                 { { 0, 1 } },
5643         },
5644         {
5645                 "ALU64_MUL_X: 2 * 3 = 6",
5646                 .u.insns_int = {
5647                         BPF_LD_IMM64(R0, 2),
5648                         BPF_ALU32_IMM(BPF_MOV, R1, 3),
5649                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5650                         BPF_EXIT_INSN(),
5651                 },
5652                 INTERNAL,
5653                 { },
5654                 { { 0, 6 } },
5655         },
5656         {
5657                 "ALU64_MUL_X: 1 * 2147483647 = 2147483647",
5658                 .u.insns_int = {
5659                         BPF_LD_IMM64(R0, 1),
5660                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
5661                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5662                         BPF_EXIT_INSN(),
5663                 },
5664                 INTERNAL,
5665                 { },
5666                 { { 0, 2147483647 } },
5667         },
5668         {
5669                 "ALU64_MUL_X: 64x64 multiply, low word",
5670                 .u.insns_int = {
5671                         BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
5672                         BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
5673                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5674                         BPF_EXIT_INSN(),
5675                 },
5676                 INTERNAL,
5677                 { },
5678                 { { 0, 0xe5618cf0 } }
5679         },
5680         {
5681                 "ALU64_MUL_X: 64x64 multiply, high word",
5682                 .u.insns_int = {
5683                         BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
5684                         BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
5685                         BPF_ALU64_REG(BPF_MUL, R0, R1),
5686                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5687                         BPF_EXIT_INSN(),
5688                 },
5689                 INTERNAL,
5690                 { },
5691                 { { 0, 0x2236d88f } }
5692         },
5693         /* BPF_ALU | BPF_MUL | BPF_K */
5694         {
5695                 "ALU_MUL_K: 2 * 3 = 6",
5696                 .u.insns_int = {
5697                         BPF_LD_IMM64(R0, 2),
5698                         BPF_ALU32_IMM(BPF_MUL, R0, 3),
5699                         BPF_EXIT_INSN(),
5700                 },
5701                 INTERNAL,
5702                 { },
5703                 { { 0, 6 } },
5704         },
5705         {
5706                 "ALU_MUL_K: 3 * 1 = 3",
5707                 .u.insns_int = {
5708                         BPF_LD_IMM64(R0, 3),
5709                         BPF_ALU32_IMM(BPF_MUL, R0, 1),
5710                         BPF_EXIT_INSN(),
5711                 },
5712                 INTERNAL,
5713                 { },
5714                 { { 0, 3 } },
5715         },
5716         {
5717                 "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
5718                 .u.insns_int = {
5719                         BPF_LD_IMM64(R0, 2),
5720                         BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
5721                         BPF_EXIT_INSN(),
5722                 },
5723                 INTERNAL,
5724                 { },
5725                 { { 0, 0xFFFFFFF0 } },
5726         },
5727         {
5728                 "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
5729                 .u.insns_int = {
5730                         BPF_LD_IMM64(R2, 0x1),
5731                         BPF_LD_IMM64(R3, 0x00000000ffffffff),
5732                         BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
5733                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5734                         BPF_MOV32_IMM(R0, 2),
5735                         BPF_EXIT_INSN(),
5736                         BPF_MOV32_IMM(R0, 1),
5737                         BPF_EXIT_INSN(),
5738                 },
5739                 INTERNAL,
5740                 { },
5741                 { { 0, 0x1 } },
5742         },
5743         {
5744                 "ALU64_MUL_K: 2 * 3 = 6",
5745                 .u.insns_int = {
5746                         BPF_LD_IMM64(R0, 2),
5747                         BPF_ALU64_IMM(BPF_MUL, R0, 3),
5748                         BPF_EXIT_INSN(),
5749                 },
5750                 INTERNAL,
5751                 { },
5752                 { { 0, 6 } },
5753         },
5754         {
5755                 "ALU64_MUL_K: 3 * 1 = 3",
5756                 .u.insns_int = {
5757                         BPF_LD_IMM64(R0, 3),
5758                         BPF_ALU64_IMM(BPF_MUL, R0, 1),
5759                         BPF_EXIT_INSN(),
5760                 },
5761                 INTERNAL,
5762                 { },
5763                 { { 0, 3 } },
5764         },
5765         {
5766                 "ALU64_MUL_K: 1 * 2147483647 = 2147483647",
5767                 .u.insns_int = {
5768                         BPF_LD_IMM64(R0, 1),
5769                         BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
5770                         BPF_EXIT_INSN(),
5771                 },
5772                 INTERNAL,
5773                 { },
5774                 { { 0, 2147483647 } },
5775         },
5776         {
5777                 "ALU64_MUL_K: 1 * -2147483647 = -2147483647",
5778                 .u.insns_int = {
5779                         BPF_LD_IMM64(R0, 1),
5780                         BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
5781                         BPF_EXIT_INSN(),
5782                 },
5783                 INTERNAL,
5784                 { },
5785                 { { 0, -2147483647 } },
5786         },
5787         {
5788                 "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
5789                 .u.insns_int = {
5790                         BPF_LD_IMM64(R2, 0x1),
5791                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5792                         BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
5793                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5794                         BPF_MOV32_IMM(R0, 2),
5795                         BPF_EXIT_INSN(),
5796                         BPF_MOV32_IMM(R0, 1),
5797                         BPF_EXIT_INSN(),
5798                 },
5799                 INTERNAL,
5800                 { },
5801                 { { 0, 0x1 } },
5802         },
5803         {
5804                 "ALU64_MUL_K: 64x32 multiply, low word",
5805                 .u.insns_int = {
5806                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5807                         BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
5808                         BPF_EXIT_INSN(),
5809                 },
5810                 INTERNAL,
5811                 { },
5812                 { { 0, 0xe242d208 } }
5813         },
5814         {
5815                 "ALU64_MUL_K: 64x32 multiply, high word",
5816                 .u.insns_int = {
5817                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5818                         BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
5819                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
5820                         BPF_EXIT_INSN(),
5821                 },
5822                 INTERNAL,
5823                 { },
5824                 { { 0, 0xc28f5c28 } }
5825         },
5826         /* BPF_ALU | BPF_DIV | BPF_X */
5827         {
5828                 "ALU_DIV_X: 6 / 2 = 3",
5829                 .u.insns_int = {
5830                         BPF_LD_IMM64(R0, 6),
5831                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5832                         BPF_ALU32_REG(BPF_DIV, R0, R1),
5833                         BPF_EXIT_INSN(),
5834                 },
5835                 INTERNAL,
5836                 { },
5837                 { { 0, 3 } },
5838         },
5839         {
5840                 "ALU_DIV_X: 4294967295 / 4294967295 = 1",
5841                 .u.insns_int = {
5842                         BPF_LD_IMM64(R0, 4294967295U),
5843                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
5844                         BPF_ALU32_REG(BPF_DIV, R0, R1),
5845                         BPF_EXIT_INSN(),
5846                 },
5847                 INTERNAL,
5848                 { },
5849                 { { 0, 1 } },
5850         },
5851         {
5852                 "ALU64_DIV_X: 6 / 2 = 3",
5853                 .u.insns_int = {
5854                         BPF_LD_IMM64(R0, 6),
5855                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5856                         BPF_ALU64_REG(BPF_DIV, R0, R1),
5857                         BPF_EXIT_INSN(),
5858                 },
5859                 INTERNAL,
5860                 { },
5861                 { { 0, 3 } },
5862         },
5863         {
5864                 "ALU64_DIV_X: 2147483647 / 2147483647 = 1",
5865                 .u.insns_int = {
5866                         BPF_LD_IMM64(R0, 2147483647),
5867                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
5868                         BPF_ALU64_REG(BPF_DIV, R0, R1),
5869                         BPF_EXIT_INSN(),
5870                 },
5871                 INTERNAL,
5872                 { },
5873                 { { 0, 1 } },
5874         },
5875         {
5876                 "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
5877                 .u.insns_int = {
5878                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5879                         BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
5880                         BPF_LD_IMM64(R3, 0x0000000000000001LL),
5881                         BPF_ALU64_REG(BPF_DIV, R2, R4),
5882                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5883                         BPF_MOV32_IMM(R0, 2),
5884                         BPF_EXIT_INSN(),
5885                         BPF_MOV32_IMM(R0, 1),
5886                         BPF_EXIT_INSN(),
5887                 },
5888                 INTERNAL,
5889                 { },
5890                 { { 0, 0x1 } },
5891         },
5892         /* BPF_ALU | BPF_DIV | BPF_K */
5893         {
5894                 "ALU_DIV_K: 6 / 2 = 3",
5895                 .u.insns_int = {
5896                         BPF_LD_IMM64(R0, 6),
5897                         BPF_ALU32_IMM(BPF_DIV, R0, 2),
5898                         BPF_EXIT_INSN(),
5899                 },
5900                 INTERNAL,
5901                 { },
5902                 { { 0, 3 } },
5903         },
5904         {
5905                 "ALU_DIV_K: 3 / 1 = 3",
5906                 .u.insns_int = {
5907                         BPF_LD_IMM64(R0, 3),
5908                         BPF_ALU32_IMM(BPF_DIV, R0, 1),
5909                         BPF_EXIT_INSN(),
5910                 },
5911                 INTERNAL,
5912                 { },
5913                 { { 0, 3 } },
5914         },
5915         {
5916                 "ALU_DIV_K: 4294967295 / 4294967295 = 1",
5917                 .u.insns_int = {
5918                         BPF_LD_IMM64(R0, 4294967295U),
5919                         BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
5920                         BPF_EXIT_INSN(),
5921                 },
5922                 INTERNAL,
5923                 { },
5924                 { { 0, 1 } },
5925         },
5926         {
5927                 "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
5928                 .u.insns_int = {
5929                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5930                         BPF_LD_IMM64(R3, 0x1UL),
5931                         BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
5932                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5933                         BPF_MOV32_IMM(R0, 2),
5934                         BPF_EXIT_INSN(),
5935                         BPF_MOV32_IMM(R0, 1),
5936                         BPF_EXIT_INSN(),
5937                 },
5938                 INTERNAL,
5939                 { },
5940                 { { 0, 0x1 } },
5941         },
5942         {
5943                 "ALU64_DIV_K: 6 / 2 = 3",
5944                 .u.insns_int = {
5945                         BPF_LD_IMM64(R0, 6),
5946                         BPF_ALU64_IMM(BPF_DIV, R0, 2),
5947                         BPF_EXIT_INSN(),
5948                 },
5949                 INTERNAL,
5950                 { },
5951                 { { 0, 3 } },
5952         },
5953         {
5954                 "ALU64_DIV_K: 3 / 1 = 3",
5955                 .u.insns_int = {
5956                         BPF_LD_IMM64(R0, 3),
5957                         BPF_ALU64_IMM(BPF_DIV, R0, 1),
5958                         BPF_EXIT_INSN(),
5959                 },
5960                 INTERNAL,
5961                 { },
5962                 { { 0, 3 } },
5963         },
5964         {
5965                 "ALU64_DIV_K: 2147483647 / 2147483647 = 1",
5966                 .u.insns_int = {
5967                         BPF_LD_IMM64(R0, 2147483647),
5968                         BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
5969                         BPF_EXIT_INSN(),
5970                 },
5971                 INTERNAL,
5972                 { },
5973                 { { 0, 1 } },
5974         },
5975         {
5976                 "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
5977                 .u.insns_int = {
5978                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
5979                         BPF_LD_IMM64(R3, 0x0000000000000001LL),
5980                         BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
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_MOD | BPF_X */
5992         {
5993                 "ALU_MOD_X: 3 % 2 = 1",
5994                 .u.insns_int = {
5995                         BPF_LD_IMM64(R0, 3),
5996                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
5997                         BPF_ALU32_REG(BPF_MOD, R0, R1),
5998                         BPF_EXIT_INSN(),
5999                 },
6000                 INTERNAL,
6001                 { },
6002                 { { 0, 1 } },
6003         },
6004         {
6005                 "ALU_MOD_X: 4294967295 % 4294967293 = 2",
6006                 .u.insns_int = {
6007                         BPF_LD_IMM64(R0, 4294967295U),
6008                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
6009                         BPF_ALU32_REG(BPF_MOD, R0, R1),
6010                         BPF_EXIT_INSN(),
6011                 },
6012                 INTERNAL,
6013                 { },
6014                 { { 0, 2 } },
6015         },
6016         {
6017                 "ALU64_MOD_X: 3 % 2 = 1",
6018                 .u.insns_int = {
6019                         BPF_LD_IMM64(R0, 3),
6020                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6021                         BPF_ALU64_REG(BPF_MOD, R0, R1),
6022                         BPF_EXIT_INSN(),
6023                 },
6024                 INTERNAL,
6025                 { },
6026                 { { 0, 1 } },
6027         },
6028         {
6029                 "ALU64_MOD_X: 2147483647 % 2147483645 = 2",
6030                 .u.insns_int = {
6031                         BPF_LD_IMM64(R0, 2147483647),
6032                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
6033                         BPF_ALU64_REG(BPF_MOD, R0, R1),
6034                         BPF_EXIT_INSN(),
6035                 },
6036                 INTERNAL,
6037                 { },
6038                 { { 0, 2 } },
6039         },
6040         /* BPF_ALU | BPF_MOD | BPF_K */
6041         {
6042                 "ALU_MOD_K: 3 % 2 = 1",
6043                 .u.insns_int = {
6044                         BPF_LD_IMM64(R0, 3),
6045                         BPF_ALU32_IMM(BPF_MOD, R0, 2),
6046                         BPF_EXIT_INSN(),
6047                 },
6048                 INTERNAL,
6049                 { },
6050                 { { 0, 1 } },
6051         },
6052         {
6053                 "ALU_MOD_K: 3 % 1 = 0",
6054                 .u.insns_int = {
6055                         BPF_LD_IMM64(R0, 3),
6056                         BPF_ALU32_IMM(BPF_MOD, R0, 1),
6057                         BPF_EXIT_INSN(),
6058                 },
6059                 INTERNAL,
6060                 { },
6061                 { { 0, 0 } },
6062         },
6063         {
6064                 "ALU_MOD_K: 4294967295 % 4294967293 = 2",
6065                 .u.insns_int = {
6066                         BPF_LD_IMM64(R0, 4294967295U),
6067                         BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
6068                         BPF_EXIT_INSN(),
6069                 },
6070                 INTERNAL,
6071                 { },
6072                 { { 0, 2 } },
6073         },
6074         {
6075                 "ALU64_MOD_K: 3 % 2 = 1",
6076                 .u.insns_int = {
6077                         BPF_LD_IMM64(R0, 3),
6078                         BPF_ALU64_IMM(BPF_MOD, R0, 2),
6079                         BPF_EXIT_INSN(),
6080                 },
6081                 INTERNAL,
6082                 { },
6083                 { { 0, 1 } },
6084         },
6085         {
6086                 "ALU64_MOD_K: 3 % 1 = 0",
6087                 .u.insns_int = {
6088                         BPF_LD_IMM64(R0, 3),
6089                         BPF_ALU64_IMM(BPF_MOD, R0, 1),
6090                         BPF_EXIT_INSN(),
6091                 },
6092                 INTERNAL,
6093                 { },
6094                 { { 0, 0 } },
6095         },
6096         {
6097                 "ALU64_MOD_K: 2147483647 % 2147483645 = 2",
6098                 .u.insns_int = {
6099                         BPF_LD_IMM64(R0, 2147483647),
6100                         BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
6101                         BPF_EXIT_INSN(),
6102                 },
6103                 INTERNAL,
6104                 { },
6105                 { { 0, 2 } },
6106         },
6107         /* BPF_ALU | BPF_AND | BPF_X */
6108         {
6109                 "ALU_AND_X: 3 & 2 = 2",
6110                 .u.insns_int = {
6111                         BPF_LD_IMM64(R0, 3),
6112                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6113                         BPF_ALU32_REG(BPF_AND, R0, R1),
6114                         BPF_EXIT_INSN(),
6115                 },
6116                 INTERNAL,
6117                 { },
6118                 { { 0, 2 } },
6119         },
6120         {
6121                 "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
6122                 .u.insns_int = {
6123                         BPF_LD_IMM64(R0, 0xffffffff),
6124                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6125                         BPF_ALU32_REG(BPF_AND, R0, R1),
6126                         BPF_EXIT_INSN(),
6127                 },
6128                 INTERNAL,
6129                 { },
6130                 { { 0, 0xffffffff } },
6131         },
6132         {
6133                 "ALU64_AND_X: 3 & 2 = 2",
6134                 .u.insns_int = {
6135                         BPF_LD_IMM64(R0, 3),
6136                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6137                         BPF_ALU64_REG(BPF_AND, R0, R1),
6138                         BPF_EXIT_INSN(),
6139                 },
6140                 INTERNAL,
6141                 { },
6142                 { { 0, 2 } },
6143         },
6144         {
6145                 "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
6146                 .u.insns_int = {
6147                         BPF_LD_IMM64(R0, 0xffffffff),
6148                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6149                         BPF_ALU64_REG(BPF_AND, R0, R1),
6150                         BPF_EXIT_INSN(),
6151                 },
6152                 INTERNAL,
6153                 { },
6154                 { { 0, 0xffffffff } },
6155         },
6156         /* BPF_ALU | BPF_AND | BPF_K */
6157         {
6158                 "ALU_AND_K: 3 & 2 = 2",
6159                 .u.insns_int = {
6160                         BPF_LD_IMM64(R0, 3),
6161                         BPF_ALU32_IMM(BPF_AND, R0, 2),
6162                         BPF_EXIT_INSN(),
6163                 },
6164                 INTERNAL,
6165                 { },
6166                 { { 0, 2 } },
6167         },
6168         {
6169                 "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
6170                 .u.insns_int = {
6171                         BPF_LD_IMM64(R0, 0xffffffff),
6172                         BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
6173                         BPF_EXIT_INSN(),
6174                 },
6175                 INTERNAL,
6176                 { },
6177                 { { 0, 0xffffffff } },
6178         },
6179         {
6180                 "ALU_AND_K: Small immediate",
6181                 .u.insns_int = {
6182                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6183                         BPF_ALU32_IMM(BPF_AND, R0, 15),
6184                         BPF_EXIT_INSN(),
6185                 },
6186                 INTERNAL,
6187                 { },
6188                 { { 0, 4 } }
6189         },
6190         {
6191                 "ALU_AND_K: Large immediate",
6192                 .u.insns_int = {
6193                         BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
6194                         BPF_ALU32_IMM(BPF_AND, R0, 0xafbfcfdf),
6195                         BPF_EXIT_INSN(),
6196                 },
6197                 INTERNAL,
6198                 { },
6199                 { { 0, 0xa1b2c3d4 } }
6200         },
6201         {
6202                 "ALU_AND_K: Zero extension",
6203                 .u.insns_int = {
6204                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6205                         BPF_LD_IMM64(R1, 0x0000000080a0c0e0LL),
6206                         BPF_ALU32_IMM(BPF_AND, R0, 0xf0f0f0f0),
6207                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6208                         BPF_MOV32_IMM(R0, 2),
6209                         BPF_EXIT_INSN(),
6210                         BPF_MOV32_IMM(R0, 1),
6211                         BPF_EXIT_INSN(),
6212                 },
6213                 INTERNAL,
6214                 { },
6215                 { { 0, 1 } }
6216         },
6217         {
6218                 "ALU64_AND_K: 3 & 2 = 2",
6219                 .u.insns_int = {
6220                         BPF_LD_IMM64(R0, 3),
6221                         BPF_ALU64_IMM(BPF_AND, R0, 2),
6222                         BPF_EXIT_INSN(),
6223                 },
6224                 INTERNAL,
6225                 { },
6226                 { { 0, 2 } },
6227         },
6228         {
6229                 "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
6230                 .u.insns_int = {
6231                         BPF_LD_IMM64(R0, 0xffffffff),
6232                         BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
6233                         BPF_EXIT_INSN(),
6234                 },
6235                 INTERNAL,
6236                 { },
6237                 { { 0, 0xffffffff } },
6238         },
6239         {
6240                 "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000000000000000",
6241                 .u.insns_int = {
6242                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6243                         BPF_LD_IMM64(R3, 0x0000000000000000LL),
6244                         BPF_ALU64_IMM(BPF_AND, R2, 0x0),
6245                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6246                         BPF_MOV32_IMM(R0, 2),
6247                         BPF_EXIT_INSN(),
6248                         BPF_MOV32_IMM(R0, 1),
6249                         BPF_EXIT_INSN(),
6250                 },
6251                 INTERNAL,
6252                 { },
6253                 { { 0, 0x1 } },
6254         },
6255         {
6256                 "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffff0000",
6257                 .u.insns_int = {
6258                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6259                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
6260                         BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
6261                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6262                         BPF_MOV32_IMM(R0, 2),
6263                         BPF_EXIT_INSN(),
6264                         BPF_MOV32_IMM(R0, 1),
6265                         BPF_EXIT_INSN(),
6266                 },
6267                 INTERNAL,
6268                 { },
6269                 { { 0, 0x1 } },
6270         },
6271         {
6272                 "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
6273                 .u.insns_int = {
6274                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
6275                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6276                         BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
6277                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6278                         BPF_MOV32_IMM(R0, 2),
6279                         BPF_EXIT_INSN(),
6280                         BPF_MOV32_IMM(R0, 1),
6281                         BPF_EXIT_INSN(),
6282                 },
6283                 INTERNAL,
6284                 { },
6285                 { { 0, 0x1 } },
6286         },
6287         {
6288                 "ALU64_AND_K: Sign extension 1",
6289                 .u.insns_int = {
6290                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6291                         BPF_LD_IMM64(R1, 0x00000000090b0d0fLL),
6292                         BPF_ALU64_IMM(BPF_AND, R0, 0x0f0f0f0f),
6293                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6294                         BPF_MOV32_IMM(R0, 2),
6295                         BPF_EXIT_INSN(),
6296                         BPF_MOV32_IMM(R0, 1),
6297                         BPF_EXIT_INSN(),
6298                 },
6299                 INTERNAL,
6300                 { },
6301                 { { 0, 1 } }
6302         },
6303         {
6304                 "ALU64_AND_K: Sign extension 2",
6305                 .u.insns_int = {
6306                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6307                         BPF_LD_IMM64(R1, 0x0123456780a0c0e0LL),
6308                         BPF_ALU64_IMM(BPF_AND, R0, 0xf0f0f0f0),
6309                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6310                         BPF_MOV32_IMM(R0, 2),
6311                         BPF_EXIT_INSN(),
6312                         BPF_MOV32_IMM(R0, 1),
6313                         BPF_EXIT_INSN(),
6314                 },
6315                 INTERNAL,
6316                 { },
6317                 { { 0, 1 } }
6318         },
6319         /* BPF_ALU | BPF_OR | BPF_X */
6320         {
6321                 "ALU_OR_X: 1 | 2 = 3",
6322                 .u.insns_int = {
6323                         BPF_LD_IMM64(R0, 1),
6324                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6325                         BPF_ALU32_REG(BPF_OR, R0, R1),
6326                         BPF_EXIT_INSN(),
6327                 },
6328                 INTERNAL,
6329                 { },
6330                 { { 0, 3 } },
6331         },
6332         {
6333                 "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
6334                 .u.insns_int = {
6335                         BPF_LD_IMM64(R0, 0),
6336                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6337                         BPF_ALU32_REG(BPF_OR, R0, R1),
6338                         BPF_EXIT_INSN(),
6339                 },
6340                 INTERNAL,
6341                 { },
6342                 { { 0, 0xffffffff } },
6343         },
6344         {
6345                 "ALU64_OR_X: 1 | 2 = 3",
6346                 .u.insns_int = {
6347                         BPF_LD_IMM64(R0, 1),
6348                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
6349                         BPF_ALU64_REG(BPF_OR, R0, R1),
6350                         BPF_EXIT_INSN(),
6351                 },
6352                 INTERNAL,
6353                 { },
6354                 { { 0, 3 } },
6355         },
6356         {
6357                 "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
6358                 .u.insns_int = {
6359                         BPF_LD_IMM64(R0, 0),
6360                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6361                         BPF_ALU64_REG(BPF_OR, R0, R1),
6362                         BPF_EXIT_INSN(),
6363                 },
6364                 INTERNAL,
6365                 { },
6366                 { { 0, 0xffffffff } },
6367         },
6368         /* BPF_ALU | BPF_OR | BPF_K */
6369         {
6370                 "ALU_OR_K: 1 | 2 = 3",
6371                 .u.insns_int = {
6372                         BPF_LD_IMM64(R0, 1),
6373                         BPF_ALU32_IMM(BPF_OR, R0, 2),
6374                         BPF_EXIT_INSN(),
6375                 },
6376                 INTERNAL,
6377                 { },
6378                 { { 0, 3 } },
6379         },
6380         {
6381                 "ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
6382                 .u.insns_int = {
6383                         BPF_LD_IMM64(R0, 0),
6384                         BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
6385                         BPF_EXIT_INSN(),
6386                 },
6387                 INTERNAL,
6388                 { },
6389                 { { 0, 0xffffffff } },
6390         },
6391         {
6392                 "ALU_OR_K: Small immediate",
6393                 .u.insns_int = {
6394                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6395                         BPF_ALU32_IMM(BPF_OR, R0, 1),
6396                         BPF_EXIT_INSN(),
6397                 },
6398                 INTERNAL,
6399                 { },
6400                 { { 0, 0x01020305 } }
6401         },
6402         {
6403                 "ALU_OR_K: Large immediate",
6404                 .u.insns_int = {
6405                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6406                         BPF_ALU32_IMM(BPF_OR, R0, 0xa0b0c0d0),
6407                         BPF_EXIT_INSN(),
6408                 },
6409                 INTERNAL,
6410                 { },
6411                 { { 0, 0xa1b2c3d4 } }
6412         },
6413         {
6414                 "ALU_OR_K: Zero extension",
6415                 .u.insns_int = {
6416                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6417                         BPF_LD_IMM64(R1, 0x00000000f9fbfdffLL),
6418                         BPF_ALU32_IMM(BPF_OR, R0, 0xf0f0f0f0),
6419                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6420                         BPF_MOV32_IMM(R0, 2),
6421                         BPF_EXIT_INSN(),
6422                         BPF_MOV32_IMM(R0, 1),
6423                         BPF_EXIT_INSN(),
6424                 },
6425                 INTERNAL,
6426                 { },
6427                 { { 0, 1 } }
6428         },
6429         {
6430                 "ALU64_OR_K: 1 | 2 = 3",
6431                 .u.insns_int = {
6432                         BPF_LD_IMM64(R0, 1),
6433                         BPF_ALU64_IMM(BPF_OR, R0, 2),
6434                         BPF_EXIT_INSN(),
6435                 },
6436                 INTERNAL,
6437                 { },
6438                 { { 0, 3 } },
6439         },
6440         {
6441                 "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
6442                 .u.insns_int = {
6443                         BPF_LD_IMM64(R0, 0),
6444                         BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
6445                         BPF_EXIT_INSN(),
6446                 },
6447                 INTERNAL,
6448                 { },
6449                 { { 0, 0xffffffff } },
6450         },
6451         {
6452                 "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffffffff0000",
6453                 .u.insns_int = {
6454                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6455                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
6456                         BPF_ALU64_IMM(BPF_OR, R2, 0x0),
6457                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6458                         BPF_MOV32_IMM(R0, 2),
6459                         BPF_EXIT_INSN(),
6460                         BPF_MOV32_IMM(R0, 1),
6461                         BPF_EXIT_INSN(),
6462                 },
6463                 INTERNAL,
6464                 { },
6465                 { { 0, 0x1 } },
6466         },
6467         {
6468                 "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
6469                 .u.insns_int = {
6470                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6471                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6472                         BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
6473                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6474                         BPF_MOV32_IMM(R0, 2),
6475                         BPF_EXIT_INSN(),
6476                         BPF_MOV32_IMM(R0, 1),
6477                         BPF_EXIT_INSN(),
6478                 },
6479                 INTERNAL,
6480                 { },
6481                 { { 0, 0x1 } },
6482         },
6483         {
6484                 "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
6485                 .u.insns_int = {
6486                         BPF_LD_IMM64(R2, 0x0000000000000000LL),
6487                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6488                         BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
6489                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6490                         BPF_MOV32_IMM(R0, 2),
6491                         BPF_EXIT_INSN(),
6492                         BPF_MOV32_IMM(R0, 1),
6493                         BPF_EXIT_INSN(),
6494                 },
6495                 INTERNAL,
6496                 { },
6497                 { { 0, 0x1 } },
6498         },
6499         {
6500                 "ALU64_OR_K: Sign extension 1",
6501                 .u.insns_int = {
6502                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6503                         BPF_LD_IMM64(R1, 0x012345678fafcfefLL),
6504                         BPF_ALU64_IMM(BPF_OR, R0, 0x0f0f0f0f),
6505                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6506                         BPF_MOV32_IMM(R0, 2),
6507                         BPF_EXIT_INSN(),
6508                         BPF_MOV32_IMM(R0, 1),
6509                         BPF_EXIT_INSN(),
6510                 },
6511                 INTERNAL,
6512                 { },
6513                 { { 0, 1 } }
6514         },
6515         {
6516                 "ALU64_OR_K: Sign extension 2",
6517                 .u.insns_int = {
6518                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6519                         BPF_LD_IMM64(R1, 0xfffffffff9fbfdffLL),
6520                         BPF_ALU64_IMM(BPF_OR, R0, 0xf0f0f0f0),
6521                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6522                         BPF_MOV32_IMM(R0, 2),
6523                         BPF_EXIT_INSN(),
6524                         BPF_MOV32_IMM(R0, 1),
6525                         BPF_EXIT_INSN(),
6526                 },
6527                 INTERNAL,
6528                 { },
6529                 { { 0, 1 } }
6530         },
6531         /* BPF_ALU | BPF_XOR | BPF_X */
6532         {
6533                 "ALU_XOR_X: 5 ^ 6 = 3",
6534                 .u.insns_int = {
6535                         BPF_LD_IMM64(R0, 5),
6536                         BPF_ALU32_IMM(BPF_MOV, R1, 6),
6537                         BPF_ALU32_REG(BPF_XOR, R0, R1),
6538                         BPF_EXIT_INSN(),
6539                 },
6540                 INTERNAL,
6541                 { },
6542                 { { 0, 3 } },
6543         },
6544         {
6545                 "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
6546                 .u.insns_int = {
6547                         BPF_LD_IMM64(R0, 1),
6548                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6549                         BPF_ALU32_REG(BPF_XOR, R0, R1),
6550                         BPF_EXIT_INSN(),
6551                 },
6552                 INTERNAL,
6553                 { },
6554                 { { 0, 0xfffffffe } },
6555         },
6556         {
6557                 "ALU64_XOR_X: 5 ^ 6 = 3",
6558                 .u.insns_int = {
6559                         BPF_LD_IMM64(R0, 5),
6560                         BPF_ALU32_IMM(BPF_MOV, R1, 6),
6561                         BPF_ALU64_REG(BPF_XOR, R0, R1),
6562                         BPF_EXIT_INSN(),
6563                 },
6564                 INTERNAL,
6565                 { },
6566                 { { 0, 3 } },
6567         },
6568         {
6569                 "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
6570                 .u.insns_int = {
6571                         BPF_LD_IMM64(R0, 1),
6572                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6573                         BPF_ALU64_REG(BPF_XOR, R0, R1),
6574                         BPF_EXIT_INSN(),
6575                 },
6576                 INTERNAL,
6577                 { },
6578                 { { 0, 0xfffffffe } },
6579         },
6580         /* BPF_ALU | BPF_XOR | BPF_K */
6581         {
6582                 "ALU_XOR_K: 5 ^ 6 = 3",
6583                 .u.insns_int = {
6584                         BPF_LD_IMM64(R0, 5),
6585                         BPF_ALU32_IMM(BPF_XOR, R0, 6),
6586                         BPF_EXIT_INSN(),
6587                 },
6588                 INTERNAL,
6589                 { },
6590                 { { 0, 3 } },
6591         },
6592         {
6593                 "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
6594                 .u.insns_int = {
6595                         BPF_LD_IMM64(R0, 1),
6596                         BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
6597                         BPF_EXIT_INSN(),
6598                 },
6599                 INTERNAL,
6600                 { },
6601                 { { 0, 0xfffffffe } },
6602         },
6603         {
6604                 "ALU_XOR_K: Small immediate",
6605                 .u.insns_int = {
6606                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
6607                         BPF_ALU32_IMM(BPF_XOR, R0, 15),
6608                         BPF_EXIT_INSN(),
6609                 },
6610                 INTERNAL,
6611                 { },
6612                 { { 0, 0x0102030b } }
6613         },
6614         {
6615                 "ALU_XOR_K: Large immediate",
6616                 .u.insns_int = {
6617                         BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
6618                         BPF_ALU32_IMM(BPF_XOR, R0, 0xafbfcfdf),
6619                         BPF_EXIT_INSN(),
6620                 },
6621                 INTERNAL,
6622                 { },
6623                 { { 0, 0x5e4d3c2b } }
6624         },
6625         {
6626                 "ALU_XOR_K: Zero extension",
6627                 .u.insns_int = {
6628                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6629                         BPF_LD_IMM64(R1, 0x00000000795b3d1fLL),
6630                         BPF_ALU32_IMM(BPF_XOR, R0, 0xf0f0f0f0),
6631                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6632                         BPF_MOV32_IMM(R0, 2),
6633                         BPF_EXIT_INSN(),
6634                         BPF_MOV32_IMM(R0, 1),
6635                         BPF_EXIT_INSN(),
6636                 },
6637                 INTERNAL,
6638                 { },
6639                 { { 0, 1 } }
6640         },
6641         {
6642                 "ALU64_XOR_K: 5 ^ 6 = 3",
6643                 .u.insns_int = {
6644                         BPF_LD_IMM64(R0, 5),
6645                         BPF_ALU64_IMM(BPF_XOR, R0, 6),
6646                         BPF_EXIT_INSN(),
6647                 },
6648                 INTERNAL,
6649                 { },
6650                 { { 0, 3 } },
6651         },
6652         {
6653                 "ALU64_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
6654                 .u.insns_int = {
6655                         BPF_LD_IMM64(R0, 1),
6656                         BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
6657                         BPF_EXIT_INSN(),
6658                 },
6659                 INTERNAL,
6660                 { },
6661                 { { 0, 0xfffffffe } },
6662         },
6663         {
6664                 "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
6665                 .u.insns_int = {
6666                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6667                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
6668                         BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
6669                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6670                         BPF_MOV32_IMM(R0, 2),
6671                         BPF_EXIT_INSN(),
6672                         BPF_MOV32_IMM(R0, 1),
6673                         BPF_EXIT_INSN(),
6674                 },
6675                 INTERNAL,
6676                 { },
6677                 { { 0, 0x1 } },
6678         },
6679         {
6680                 "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
6681                 .u.insns_int = {
6682                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
6683                         BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
6684                         BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
6685                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6686                         BPF_MOV32_IMM(R0, 2),
6687                         BPF_EXIT_INSN(),
6688                         BPF_MOV32_IMM(R0, 1),
6689                         BPF_EXIT_INSN(),
6690                 },
6691                 INTERNAL,
6692                 { },
6693                 { { 0, 0x1 } },
6694         },
6695         {
6696                 "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
6697                 .u.insns_int = {
6698                         BPF_LD_IMM64(R2, 0x0000000000000000LL),
6699                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
6700                         BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
6701                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
6702                         BPF_MOV32_IMM(R0, 2),
6703                         BPF_EXIT_INSN(),
6704                         BPF_MOV32_IMM(R0, 1),
6705                         BPF_EXIT_INSN(),
6706                 },
6707                 INTERNAL,
6708                 { },
6709                 { { 0, 0x1 } },
6710         },
6711         {
6712                 "ALU64_XOR_K: Sign extension 1",
6713                 .u.insns_int = {
6714                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6715                         BPF_LD_IMM64(R1, 0x0123456786a4c2e0LL),
6716                         BPF_ALU64_IMM(BPF_XOR, R0, 0x0f0f0f0f),
6717                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6718                         BPF_MOV32_IMM(R0, 2),
6719                         BPF_EXIT_INSN(),
6720                         BPF_MOV32_IMM(R0, 1),
6721                         BPF_EXIT_INSN(),
6722                 },
6723                 INTERNAL,
6724                 { },
6725                 { { 0, 1 } }
6726         },
6727         {
6728                 "ALU64_XOR_K: Sign extension 2",
6729                 .u.insns_int = {
6730                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6731                         BPF_LD_IMM64(R1, 0xfedcba98795b3d1fLL),
6732                         BPF_ALU64_IMM(BPF_XOR, R0, 0xf0f0f0f0),
6733                         BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
6734                         BPF_MOV32_IMM(R0, 2),
6735                         BPF_EXIT_INSN(),
6736                         BPF_MOV32_IMM(R0, 1),
6737                         BPF_EXIT_INSN(),
6738                 },
6739                 INTERNAL,
6740                 { },
6741                 { { 0, 1 } }
6742         },
6743         /* BPF_ALU | BPF_LSH | BPF_X */
6744         {
6745                 "ALU_LSH_X: 1 << 1 = 2",
6746                 .u.insns_int = {
6747                         BPF_LD_IMM64(R0, 1),
6748                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
6749                         BPF_ALU32_REG(BPF_LSH, R0, R1),
6750                         BPF_EXIT_INSN(),
6751                 },
6752                 INTERNAL,
6753                 { },
6754                 { { 0, 2 } },
6755         },
6756         {
6757                 "ALU_LSH_X: 1 << 31 = 0x80000000",
6758                 .u.insns_int = {
6759                         BPF_LD_IMM64(R0, 1),
6760                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
6761                         BPF_ALU32_REG(BPF_LSH, R0, R1),
6762                         BPF_EXIT_INSN(),
6763                 },
6764                 INTERNAL,
6765                 { },
6766                 { { 0, 0x80000000 } },
6767         },
6768         {
6769                 "ALU_LSH_X: 0x12345678 << 12 = 0x45678000",
6770                 .u.insns_int = {
6771                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6772                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
6773                         BPF_ALU32_REG(BPF_LSH, R0, R1),
6774                         BPF_EXIT_INSN(),
6775                 },
6776                 INTERNAL,
6777                 { },
6778                 { { 0, 0x45678000 } }
6779         },
6780         {
6781                 "ALU64_LSH_X: 1 << 1 = 2",
6782                 .u.insns_int = {
6783                         BPF_LD_IMM64(R0, 1),
6784                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
6785                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6786                         BPF_EXIT_INSN(),
6787                 },
6788                 INTERNAL,
6789                 { },
6790                 { { 0, 2 } },
6791         },
6792         {
6793                 "ALU64_LSH_X: 1 << 31 = 0x80000000",
6794                 .u.insns_int = {
6795                         BPF_LD_IMM64(R0, 1),
6796                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
6797                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6798                         BPF_EXIT_INSN(),
6799                 },
6800                 INTERNAL,
6801                 { },
6802                 { { 0, 0x80000000 } },
6803         },
6804         {
6805                 "ALU64_LSH_X: Shift < 32, low word",
6806                 .u.insns_int = {
6807                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6808                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
6809                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6810                         BPF_EXIT_INSN(),
6811                 },
6812                 INTERNAL,
6813                 { },
6814                 { { 0, 0xbcdef000 } }
6815         },
6816         {
6817                 "ALU64_LSH_X: Shift < 32, high word",
6818                 .u.insns_int = {
6819                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6820                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
6821                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6822                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
6823                         BPF_EXIT_INSN(),
6824                 },
6825                 INTERNAL,
6826                 { },
6827                 { { 0, 0x3456789a } }
6828         },
6829         {
6830                 "ALU64_LSH_X: Shift > 32, low word",
6831                 .u.insns_int = {
6832                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6833                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
6834                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6835                         BPF_EXIT_INSN(),
6836                 },
6837                 INTERNAL,
6838                 { },
6839                 { { 0, 0 } }
6840         },
6841         {
6842                 "ALU64_LSH_X: Shift > 32, high word",
6843                 .u.insns_int = {
6844                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6845                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
6846                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6847                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
6848                         BPF_EXIT_INSN(),
6849                 },
6850                 INTERNAL,
6851                 { },
6852                 { { 0, 0x9abcdef0 } }
6853         },
6854         {
6855                 "ALU64_LSH_X: Shift == 32, low word",
6856                 .u.insns_int = {
6857                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6858                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
6859                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6860                         BPF_EXIT_INSN(),
6861                 },
6862                 INTERNAL,
6863                 { },
6864                 { { 0, 0 } }
6865         },
6866         {
6867                 "ALU64_LSH_X: Shift == 32, high word",
6868                 .u.insns_int = {
6869                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6870                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
6871                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6872                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
6873                         BPF_EXIT_INSN(),
6874                 },
6875                 INTERNAL,
6876                 { },
6877                 { { 0, 0x89abcdef } }
6878         },
6879         {
6880                 "ALU64_LSH_X: Zero shift, low word",
6881                 .u.insns_int = {
6882                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6883                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
6884                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6885                         BPF_EXIT_INSN(),
6886                 },
6887                 INTERNAL,
6888                 { },
6889                 { { 0, 0x89abcdef } }
6890         },
6891         {
6892                 "ALU64_LSH_X: Zero shift, high word",
6893                 .u.insns_int = {
6894                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6895                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
6896                         BPF_ALU64_REG(BPF_LSH, R0, R1),
6897                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
6898                         BPF_EXIT_INSN(),
6899                 },
6900                 INTERNAL,
6901                 { },
6902                 { { 0, 0x01234567 } }
6903         },
6904         /* BPF_ALU | BPF_LSH | BPF_K */
6905         {
6906                 "ALU_LSH_K: 1 << 1 = 2",
6907                 .u.insns_int = {
6908                         BPF_LD_IMM64(R0, 1),
6909                         BPF_ALU32_IMM(BPF_LSH, R0, 1),
6910                         BPF_EXIT_INSN(),
6911                 },
6912                 INTERNAL,
6913                 { },
6914                 { { 0, 2 } },
6915         },
6916         {
6917                 "ALU_LSH_K: 1 << 31 = 0x80000000",
6918                 .u.insns_int = {
6919                         BPF_LD_IMM64(R0, 1),
6920                         BPF_ALU32_IMM(BPF_LSH, R0, 31),
6921                         BPF_EXIT_INSN(),
6922                 },
6923                 INTERNAL,
6924                 { },
6925                 { { 0, 0x80000000 } },
6926         },
6927         {
6928                 "ALU_LSH_K: 0x12345678 << 12 = 0x45678000",
6929                 .u.insns_int = {
6930                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6931                         BPF_ALU32_IMM(BPF_LSH, R0, 12),
6932                         BPF_EXIT_INSN(),
6933                 },
6934                 INTERNAL,
6935                 { },
6936                 { { 0, 0x45678000 } }
6937         },
6938         {
6939                 "ALU_LSH_K: 0x12345678 << 0 = 0x12345678",
6940                 .u.insns_int = {
6941                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
6942                         BPF_ALU32_IMM(BPF_LSH, R0, 0),
6943                         BPF_EXIT_INSN(),
6944                 },
6945                 INTERNAL,
6946                 { },
6947                 { { 0, 0x12345678 } }
6948         },
6949         {
6950                 "ALU64_LSH_K: 1 << 1 = 2",
6951                 .u.insns_int = {
6952                         BPF_LD_IMM64(R0, 1),
6953                         BPF_ALU64_IMM(BPF_LSH, R0, 1),
6954                         BPF_EXIT_INSN(),
6955                 },
6956                 INTERNAL,
6957                 { },
6958                 { { 0, 2 } },
6959         },
6960         {
6961                 "ALU64_LSH_K: 1 << 31 = 0x80000000",
6962                 .u.insns_int = {
6963                         BPF_LD_IMM64(R0, 1),
6964                         BPF_ALU64_IMM(BPF_LSH, R0, 31),
6965                         BPF_EXIT_INSN(),
6966                 },
6967                 INTERNAL,
6968                 { },
6969                 { { 0, 0x80000000 } },
6970         },
6971         {
6972                 "ALU64_LSH_K: Shift < 32, low word",
6973                 .u.insns_int = {
6974                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6975                         BPF_ALU64_IMM(BPF_LSH, R0, 12),
6976                         BPF_EXIT_INSN(),
6977                 },
6978                 INTERNAL,
6979                 { },
6980                 { { 0, 0xbcdef000 } }
6981         },
6982         {
6983                 "ALU64_LSH_K: Shift < 32, high word",
6984                 .u.insns_int = {
6985                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6986                         BPF_ALU64_IMM(BPF_LSH, R0, 12),
6987                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
6988                         BPF_EXIT_INSN(),
6989                 },
6990                 INTERNAL,
6991                 { },
6992                 { { 0, 0x3456789a } }
6993         },
6994         {
6995                 "ALU64_LSH_K: Shift > 32, low word",
6996                 .u.insns_int = {
6997                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
6998                         BPF_ALU64_IMM(BPF_LSH, R0, 36),
6999                         BPF_EXIT_INSN(),
7000                 },
7001                 INTERNAL,
7002                 { },
7003                 { { 0, 0 } }
7004         },
7005         {
7006                 "ALU64_LSH_K: Shift > 32, high word",
7007                 .u.insns_int = {
7008                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7009                         BPF_ALU64_IMM(BPF_LSH, R0, 36),
7010                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7011                         BPF_EXIT_INSN(),
7012                 },
7013                 INTERNAL,
7014                 { },
7015                 { { 0, 0x9abcdef0 } }
7016         },
7017         {
7018                 "ALU64_LSH_K: Shift == 32, low word",
7019                 .u.insns_int = {
7020                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7021                         BPF_ALU64_IMM(BPF_LSH, R0, 32),
7022                         BPF_EXIT_INSN(),
7023                 },
7024                 INTERNAL,
7025                 { },
7026                 { { 0, 0 } }
7027         },
7028         {
7029                 "ALU64_LSH_K: Shift == 32, high word",
7030                 .u.insns_int = {
7031                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7032                         BPF_ALU64_IMM(BPF_LSH, R0, 32),
7033                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7034                         BPF_EXIT_INSN(),
7035                 },
7036                 INTERNAL,
7037                 { },
7038                 { { 0, 0x89abcdef } }
7039         },
7040         {
7041                 "ALU64_LSH_K: Zero shift",
7042                 .u.insns_int = {
7043                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7044                         BPF_ALU64_IMM(BPF_LSH, R0, 0),
7045                         BPF_EXIT_INSN(),
7046                 },
7047                 INTERNAL,
7048                 { },
7049                 { { 0, 0x89abcdef } }
7050         },
7051         /* BPF_ALU | BPF_RSH | BPF_X */
7052         {
7053                 "ALU_RSH_X: 2 >> 1 = 1",
7054                 .u.insns_int = {
7055                         BPF_LD_IMM64(R0, 2),
7056                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
7057                         BPF_ALU32_REG(BPF_RSH, R0, R1),
7058                         BPF_EXIT_INSN(),
7059                 },
7060                 INTERNAL,
7061                 { },
7062                 { { 0, 1 } },
7063         },
7064         {
7065                 "ALU_RSH_X: 0x80000000 >> 31 = 1",
7066                 .u.insns_int = {
7067                         BPF_LD_IMM64(R0, 0x80000000),
7068                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
7069                         BPF_ALU32_REG(BPF_RSH, R0, R1),
7070                         BPF_EXIT_INSN(),
7071                 },
7072                 INTERNAL,
7073                 { },
7074                 { { 0, 1 } },
7075         },
7076         {
7077                 "ALU_RSH_X: 0x12345678 >> 20 = 0x123",
7078                 .u.insns_int = {
7079                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7080                         BPF_ALU32_IMM(BPF_MOV, R1, 20),
7081                         BPF_ALU32_REG(BPF_RSH, R0, R1),
7082                         BPF_EXIT_INSN(),
7083                 },
7084                 INTERNAL,
7085                 { },
7086                 { { 0, 0x123 } }
7087         },
7088         {
7089                 "ALU64_RSH_X: 2 >> 1 = 1",
7090                 .u.insns_int = {
7091                         BPF_LD_IMM64(R0, 2),
7092                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
7093                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7094                         BPF_EXIT_INSN(),
7095                 },
7096                 INTERNAL,
7097                 { },
7098                 { { 0, 1 } },
7099         },
7100         {
7101                 "ALU64_RSH_X: 0x80000000 >> 31 = 1",
7102                 .u.insns_int = {
7103                         BPF_LD_IMM64(R0, 0x80000000),
7104                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
7105                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7106                         BPF_EXIT_INSN(),
7107                 },
7108                 INTERNAL,
7109                 { },
7110                 { { 0, 1 } },
7111         },
7112         {
7113                 "ALU64_RSH_X: Shift < 32, low word",
7114                 .u.insns_int = {
7115                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7116                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7117                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7118                         BPF_EXIT_INSN(),
7119                 },
7120                 INTERNAL,
7121                 { },
7122                 { { 0, 0x56789abc } }
7123         },
7124         {
7125                 "ALU64_RSH_X: Shift < 32, high word",
7126                 .u.insns_int = {
7127                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7128                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7129                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7130                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7131                         BPF_EXIT_INSN(),
7132                 },
7133                 INTERNAL,
7134                 { },
7135                 { { 0, 0x00081234 } }
7136         },
7137         {
7138                 "ALU64_RSH_X: Shift > 32, low word",
7139                 .u.insns_int = {
7140                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7141                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7142                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7143                         BPF_EXIT_INSN(),
7144                 },
7145                 INTERNAL,
7146                 { },
7147                 { { 0, 0x08123456 } }
7148         },
7149         {
7150                 "ALU64_RSH_X: Shift > 32, high word",
7151                 .u.insns_int = {
7152                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7153                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7154                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7155                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7156                         BPF_EXIT_INSN(),
7157                 },
7158                 INTERNAL,
7159                 { },
7160                 { { 0, 0 } }
7161         },
7162         {
7163                 "ALU64_RSH_X: Shift == 32, low word",
7164                 .u.insns_int = {
7165                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7166                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7167                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7168                         BPF_EXIT_INSN(),
7169                 },
7170                 INTERNAL,
7171                 { },
7172                 { { 0, 0x81234567 } }
7173         },
7174         {
7175                 "ALU64_RSH_X: Shift == 32, high word",
7176                 .u.insns_int = {
7177                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7178                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7179                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7180                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7181                         BPF_EXIT_INSN(),
7182                 },
7183                 INTERNAL,
7184                 { },
7185                 { { 0, 0 } }
7186         },
7187         {
7188                 "ALU64_RSH_X: Zero shift, low word",
7189                 .u.insns_int = {
7190                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7191                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7192                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7193                         BPF_EXIT_INSN(),
7194                 },
7195                 INTERNAL,
7196                 { },
7197                 { { 0, 0x89abcdef } }
7198         },
7199         {
7200                 "ALU64_RSH_X: Zero shift, high word",
7201                 .u.insns_int = {
7202                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7203                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7204                         BPF_ALU64_REG(BPF_RSH, R0, R1),
7205                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7206                         BPF_EXIT_INSN(),
7207                 },
7208                 INTERNAL,
7209                 { },
7210                 { { 0, 0x81234567 } }
7211         },
7212         /* BPF_ALU | BPF_RSH | BPF_K */
7213         {
7214                 "ALU_RSH_K: 2 >> 1 = 1",
7215                 .u.insns_int = {
7216                         BPF_LD_IMM64(R0, 2),
7217                         BPF_ALU32_IMM(BPF_RSH, R0, 1),
7218                         BPF_EXIT_INSN(),
7219                 },
7220                 INTERNAL,
7221                 { },
7222                 { { 0, 1 } },
7223         },
7224         {
7225                 "ALU_RSH_K: 0x80000000 >> 31 = 1",
7226                 .u.insns_int = {
7227                         BPF_LD_IMM64(R0, 0x80000000),
7228                         BPF_ALU32_IMM(BPF_RSH, R0, 31),
7229                         BPF_EXIT_INSN(),
7230                 },
7231                 INTERNAL,
7232                 { },
7233                 { { 0, 1 } },
7234         },
7235         {
7236                 "ALU_RSH_K: 0x12345678 >> 20 = 0x123",
7237                 .u.insns_int = {
7238                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7239                         BPF_ALU32_IMM(BPF_RSH, R0, 20),
7240                         BPF_EXIT_INSN(),
7241                 },
7242                 INTERNAL,
7243                 { },
7244                 { { 0, 0x123 } }
7245         },
7246         {
7247                 "ALU_RSH_K: 0x12345678 >> 0 = 0x12345678",
7248                 .u.insns_int = {
7249                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
7250                         BPF_ALU32_IMM(BPF_RSH, R0, 0),
7251                         BPF_EXIT_INSN(),
7252                 },
7253                 INTERNAL,
7254                 { },
7255                 { { 0, 0x12345678 } }
7256         },
7257         {
7258                 "ALU64_RSH_K: 2 >> 1 = 1",
7259                 .u.insns_int = {
7260                         BPF_LD_IMM64(R0, 2),
7261                         BPF_ALU64_IMM(BPF_RSH, R0, 1),
7262                         BPF_EXIT_INSN(),
7263                 },
7264                 INTERNAL,
7265                 { },
7266                 { { 0, 1 } },
7267         },
7268         {
7269                 "ALU64_RSH_K: 0x80000000 >> 31 = 1",
7270                 .u.insns_int = {
7271                         BPF_LD_IMM64(R0, 0x80000000),
7272                         BPF_ALU64_IMM(BPF_RSH, R0, 31),
7273                         BPF_EXIT_INSN(),
7274                 },
7275                 INTERNAL,
7276                 { },
7277                 { { 0, 1 } },
7278         },
7279         {
7280                 "ALU64_RSH_K: Shift < 32, low word",
7281                 .u.insns_int = {
7282                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7283                         BPF_ALU64_IMM(BPF_RSH, R0, 12),
7284                         BPF_EXIT_INSN(),
7285                 },
7286                 INTERNAL,
7287                 { },
7288                 { { 0, 0x56789abc } }
7289         },
7290         {
7291                 "ALU64_RSH_K: Shift < 32, high word",
7292                 .u.insns_int = {
7293                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7294                         BPF_ALU64_IMM(BPF_RSH, R0, 12),
7295                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7296                         BPF_EXIT_INSN(),
7297                 },
7298                 INTERNAL,
7299                 { },
7300                 { { 0, 0x00081234 } }
7301         },
7302         {
7303                 "ALU64_RSH_K: Shift > 32, low word",
7304                 .u.insns_int = {
7305                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7306                         BPF_ALU64_IMM(BPF_RSH, R0, 36),
7307                         BPF_EXIT_INSN(),
7308                 },
7309                 INTERNAL,
7310                 { },
7311                 { { 0, 0x08123456 } }
7312         },
7313         {
7314                 "ALU64_RSH_K: Shift > 32, high word",
7315                 .u.insns_int = {
7316                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7317                         BPF_ALU64_IMM(BPF_RSH, R0, 36),
7318                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7319                         BPF_EXIT_INSN(),
7320                 },
7321                 INTERNAL,
7322                 { },
7323                 { { 0, 0 } }
7324         },
7325         {
7326                 "ALU64_RSH_K: Shift == 32, low word",
7327                 .u.insns_int = {
7328                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7329                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7330                         BPF_EXIT_INSN(),
7331                 },
7332                 INTERNAL,
7333                 { },
7334                 { { 0, 0x81234567 } }
7335         },
7336         {
7337                 "ALU64_RSH_K: Shift == 32, high word",
7338                 .u.insns_int = {
7339                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7340                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7341                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7342                         BPF_EXIT_INSN(),
7343                 },
7344                 INTERNAL,
7345                 { },
7346                 { { 0, 0 } }
7347         },
7348         {
7349                 "ALU64_RSH_K: Zero shift",
7350                 .u.insns_int = {
7351                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7352                         BPF_ALU64_IMM(BPF_RSH, R0, 0),
7353                         BPF_EXIT_INSN(),
7354                 },
7355                 INTERNAL,
7356                 { },
7357                 { { 0, 0x89abcdef } }
7358         },
7359         /* BPF_ALU | BPF_ARSH | BPF_X */
7360         {
7361                 "ALU32_ARSH_X: -1234 >> 7 = -10",
7362                 .u.insns_int = {
7363                         BPF_ALU32_IMM(BPF_MOV, R0, -1234),
7364                         BPF_ALU32_IMM(BPF_MOV, R1, 7),
7365                         BPF_ALU32_REG(BPF_ARSH, R0, R1),
7366                         BPF_EXIT_INSN(),
7367                 },
7368                 INTERNAL,
7369                 { },
7370                 { { 0, -10 } }
7371         },
7372         {
7373                 "ALU64_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
7374                 .u.insns_int = {
7375                         BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
7376                         BPF_ALU32_IMM(BPF_MOV, R1, 40),
7377                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7378                         BPF_EXIT_INSN(),
7379                 },
7380                 INTERNAL,
7381                 { },
7382                 { { 0, 0xffff00ff } },
7383         },
7384         {
7385                 "ALU64_ARSH_X: Shift < 32, low word",
7386                 .u.insns_int = {
7387                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7388                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7389                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7390                         BPF_EXIT_INSN(),
7391                 },
7392                 INTERNAL,
7393                 { },
7394                 { { 0, 0x56789abc } }
7395         },
7396         {
7397                 "ALU64_ARSH_X: Shift < 32, high word",
7398                 .u.insns_int = {
7399                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7400                         BPF_ALU32_IMM(BPF_MOV, R1, 12),
7401                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7402                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7403                         BPF_EXIT_INSN(),
7404                 },
7405                 INTERNAL,
7406                 { },
7407                 { { 0, 0xfff81234 } }
7408         },
7409         {
7410                 "ALU64_ARSH_X: Shift > 32, low word",
7411                 .u.insns_int = {
7412                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7413                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7414                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7415                         BPF_EXIT_INSN(),
7416                 },
7417                 INTERNAL,
7418                 { },
7419                 { { 0, 0xf8123456 } }
7420         },
7421         {
7422                 "ALU64_ARSH_X: Shift > 32, high word",
7423                 .u.insns_int = {
7424                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7425                         BPF_ALU32_IMM(BPF_MOV, R1, 36),
7426                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7427                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7428                         BPF_EXIT_INSN(),
7429                 },
7430                 INTERNAL,
7431                 { },
7432                 { { 0, -1 } }
7433         },
7434         {
7435                 "ALU64_ARSH_X: Shift == 32, low word",
7436                 .u.insns_int = {
7437                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7438                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7439                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7440                         BPF_EXIT_INSN(),
7441                 },
7442                 INTERNAL,
7443                 { },
7444                 { { 0, 0x81234567 } }
7445         },
7446         {
7447                 "ALU64_ARSH_X: Shift == 32, high word",
7448                 .u.insns_int = {
7449                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7450                         BPF_ALU32_IMM(BPF_MOV, R1, 32),
7451                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7452                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7453                         BPF_EXIT_INSN(),
7454                 },
7455                 INTERNAL,
7456                 { },
7457                 { { 0, -1 } }
7458         },
7459         {
7460                 "ALU64_ARSH_X: Zero shift, low word",
7461                 .u.insns_int = {
7462                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7463                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7464                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7465                         BPF_EXIT_INSN(),
7466                 },
7467                 INTERNAL,
7468                 { },
7469                 { { 0, 0x89abcdef } }
7470         },
7471         {
7472                 "ALU64_ARSH_X: Zero shift, high word",
7473                 .u.insns_int = {
7474                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7475                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
7476                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
7477                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7478                         BPF_EXIT_INSN(),
7479                 },
7480                 INTERNAL,
7481                 { },
7482                 { { 0, 0x81234567 } }
7483         },
7484         /* BPF_ALU | BPF_ARSH | BPF_K */
7485         {
7486                 "ALU32_ARSH_K: -1234 >> 7 = -10",
7487                 .u.insns_int = {
7488                         BPF_ALU32_IMM(BPF_MOV, R0, -1234),
7489                         BPF_ALU32_IMM(BPF_ARSH, R0, 7),
7490                         BPF_EXIT_INSN(),
7491                 },
7492                 INTERNAL,
7493                 { },
7494                 { { 0, -10 } }
7495         },
7496         {
7497                 "ALU32_ARSH_K: -1234 >> 0 = -1234",
7498                 .u.insns_int = {
7499                         BPF_ALU32_IMM(BPF_MOV, R0, -1234),
7500                         BPF_ALU32_IMM(BPF_ARSH, R0, 0),
7501                         BPF_EXIT_INSN(),
7502                 },
7503                 INTERNAL,
7504                 { },
7505                 { { 0, -1234 } }
7506         },
7507         {
7508                 "ALU64_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
7509                 .u.insns_int = {
7510                         BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
7511                         BPF_ALU64_IMM(BPF_ARSH, R0, 40),
7512                         BPF_EXIT_INSN(),
7513                 },
7514                 INTERNAL,
7515                 { },
7516                 { { 0, 0xffff00ff } },
7517         },
7518         {
7519                 "ALU64_ARSH_K: Shift < 32, low word",
7520                 .u.insns_int = {
7521                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7522                         BPF_ALU64_IMM(BPF_RSH, R0, 12),
7523                         BPF_EXIT_INSN(),
7524                 },
7525                 INTERNAL,
7526                 { },
7527                 { { 0, 0x56789abc } }
7528         },
7529         {
7530                 "ALU64_ARSH_K: Shift < 32, high word",
7531                 .u.insns_int = {
7532                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7533                         BPF_ALU64_IMM(BPF_ARSH, R0, 12),
7534                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7535                         BPF_EXIT_INSN(),
7536                 },
7537                 INTERNAL,
7538                 { },
7539                 { { 0, 0xfff81234 } }
7540         },
7541         {
7542                 "ALU64_ARSH_K: Shift > 32, low word",
7543                 .u.insns_int = {
7544                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7545                         BPF_ALU64_IMM(BPF_ARSH, R0, 36),
7546                         BPF_EXIT_INSN(),
7547                 },
7548                 INTERNAL,
7549                 { },
7550                 { { 0, 0xf8123456 } }
7551         },
7552         {
7553                 "ALU64_ARSH_K: Shift > 32, high word",
7554                 .u.insns_int = {
7555                         BPF_LD_IMM64(R0, 0xf123456789abcdefLL),
7556                         BPF_ALU64_IMM(BPF_ARSH, R0, 36),
7557                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7558                         BPF_EXIT_INSN(),
7559                 },
7560                 INTERNAL,
7561                 { },
7562                 { { 0, -1 } }
7563         },
7564         {
7565                 "ALU64_ARSH_K: Shift == 32, low word",
7566                 .u.insns_int = {
7567                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7568                         BPF_ALU64_IMM(BPF_ARSH, R0, 32),
7569                         BPF_EXIT_INSN(),
7570                 },
7571                 INTERNAL,
7572                 { },
7573                 { { 0, 0x81234567 } }
7574         },
7575         {
7576                 "ALU64_ARSH_K: Shift == 32, high word",
7577                 .u.insns_int = {
7578                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7579                         BPF_ALU64_IMM(BPF_ARSH, R0, 32),
7580                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7581                         BPF_EXIT_INSN(),
7582                 },
7583                 INTERNAL,
7584                 { },
7585                 { { 0, -1 } }
7586         },
7587         {
7588                 "ALU64_ARSH_K: Zero shift",
7589                 .u.insns_int = {
7590                         BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
7591                         BPF_ALU64_IMM(BPF_ARSH, R0, 0),
7592                         BPF_EXIT_INSN(),
7593                 },
7594                 INTERNAL,
7595                 { },
7596                 { { 0, 0x89abcdef } }
7597         },
7598         /* BPF_ALU | BPF_NEG */
7599         {
7600                 "ALU_NEG: -(3) = -3",
7601                 .u.insns_int = {
7602                         BPF_ALU32_IMM(BPF_MOV, R0, 3),
7603                         BPF_ALU32_IMM(BPF_NEG, R0, 0),
7604                         BPF_EXIT_INSN(),
7605                 },
7606                 INTERNAL,
7607                 { },
7608                 { { 0, -3 } },
7609         },
7610         {
7611                 "ALU_NEG: -(-3) = 3",
7612                 .u.insns_int = {
7613                         BPF_ALU32_IMM(BPF_MOV, R0, -3),
7614                         BPF_ALU32_IMM(BPF_NEG, R0, 0),
7615                         BPF_EXIT_INSN(),
7616                 },
7617                 INTERNAL,
7618                 { },
7619                 { { 0, 3 } },
7620         },
7621         {
7622                 "ALU64_NEG: -(3) = -3",
7623                 .u.insns_int = {
7624                         BPF_LD_IMM64(R0, 3),
7625                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
7626                         BPF_EXIT_INSN(),
7627                 },
7628                 INTERNAL,
7629                 { },
7630                 { { 0, -3 } },
7631         },
7632         {
7633                 "ALU64_NEG: -(-3) = 3",
7634                 .u.insns_int = {
7635                         BPF_LD_IMM64(R0, -3),
7636                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
7637                         BPF_EXIT_INSN(),
7638                 },
7639                 INTERNAL,
7640                 { },
7641                 { { 0, 3 } },
7642         },
7643         /* BPF_ALU | BPF_END | BPF_FROM_BE */
7644         {
7645                 "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
7646                 .u.insns_int = {
7647                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7648                         BPF_ENDIAN(BPF_FROM_BE, R0, 16),
7649                         BPF_EXIT_INSN(),
7650                 },
7651                 INTERNAL,
7652                 { },
7653                 { { 0,  cpu_to_be16(0xcdef) } },
7654         },
7655         {
7656                 "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
7657                 .u.insns_int = {
7658                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7659                         BPF_ENDIAN(BPF_FROM_BE, R0, 32),
7660                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7661                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7662                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7663                         BPF_EXIT_INSN(),
7664                 },
7665                 INTERNAL,
7666                 { },
7667                 { { 0, cpu_to_be32(0x89abcdef) } },
7668         },
7669         {
7670                 "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
7671                 .u.insns_int = {
7672                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7673                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7674                         BPF_EXIT_INSN(),
7675                 },
7676                 INTERNAL,
7677                 { },
7678                 { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
7679         },
7680         {
7681                 "ALU_END_FROM_BE 64: 0x0123456789abcdef >> 32 -> 0x01234567",
7682                 .u.insns_int = {
7683                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7684                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7685                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7686                         BPF_EXIT_INSN(),
7687                 },
7688                 INTERNAL,
7689                 { },
7690                 { { 0, (u32) (cpu_to_be64(0x0123456789abcdefLL) >> 32) } },
7691         },
7692         /* BPF_ALU | BPF_END | BPF_FROM_BE, reversed */
7693         {
7694                 "ALU_END_FROM_BE 16: 0xfedcba9876543210 -> 0x3210",
7695                 .u.insns_int = {
7696                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7697                         BPF_ENDIAN(BPF_FROM_BE, R0, 16),
7698                         BPF_EXIT_INSN(),
7699                 },
7700                 INTERNAL,
7701                 { },
7702                 { { 0,  cpu_to_be16(0x3210) } },
7703         },
7704         {
7705                 "ALU_END_FROM_BE 32: 0xfedcba9876543210 -> 0x76543210",
7706                 .u.insns_int = {
7707                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7708                         BPF_ENDIAN(BPF_FROM_BE, R0, 32),
7709                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7710                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7711                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7712                         BPF_EXIT_INSN(),
7713                 },
7714                 INTERNAL,
7715                 { },
7716                 { { 0, cpu_to_be32(0x76543210) } },
7717         },
7718         {
7719                 "ALU_END_FROM_BE 64: 0xfedcba9876543210 -> 0x76543210",
7720                 .u.insns_int = {
7721                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7722                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7723                         BPF_EXIT_INSN(),
7724                 },
7725                 INTERNAL,
7726                 { },
7727                 { { 0, (u32) cpu_to_be64(0xfedcba9876543210ULL) } },
7728         },
7729         {
7730                 "ALU_END_FROM_BE 64: 0xfedcba9876543210 >> 32 -> 0xfedcba98",
7731                 .u.insns_int = {
7732                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7733                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
7734                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7735                         BPF_EXIT_INSN(),
7736                 },
7737                 INTERNAL,
7738                 { },
7739                 { { 0, (u32) (cpu_to_be64(0xfedcba9876543210ULL) >> 32) } },
7740         },
7741         /* BPF_ALU | BPF_END | BPF_FROM_LE */
7742         {
7743                 "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
7744                 .u.insns_int = {
7745                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7746                         BPF_ENDIAN(BPF_FROM_LE, R0, 16),
7747                         BPF_EXIT_INSN(),
7748                 },
7749                 INTERNAL,
7750                 { },
7751                 { { 0, cpu_to_le16(0xcdef) } },
7752         },
7753         {
7754                 "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
7755                 .u.insns_int = {
7756                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7757                         BPF_ENDIAN(BPF_FROM_LE, R0, 32),
7758                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7759                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7760                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7761                         BPF_EXIT_INSN(),
7762                 },
7763                 INTERNAL,
7764                 { },
7765                 { { 0, cpu_to_le32(0x89abcdef) } },
7766         },
7767         {
7768                 "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
7769                 .u.insns_int = {
7770                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7771                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
7772                         BPF_EXIT_INSN(),
7773                 },
7774                 INTERNAL,
7775                 { },
7776                 { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
7777         },
7778         {
7779                 "ALU_END_FROM_LE 64: 0x0123456789abcdef >> 32 -> 0xefcdab89",
7780                 .u.insns_int = {
7781                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
7782                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
7783                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7784                         BPF_EXIT_INSN(),
7785                 },
7786                 INTERNAL,
7787                 { },
7788                 { { 0, (u32) (cpu_to_le64(0x0123456789abcdefLL) >> 32) } },
7789         },
7790         /* BPF_ALU | BPF_END | BPF_FROM_LE, reversed */
7791         {
7792                 "ALU_END_FROM_LE 16: 0xfedcba9876543210 -> 0x1032",
7793                 .u.insns_int = {
7794                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7795                         BPF_ENDIAN(BPF_FROM_LE, R0, 16),
7796                         BPF_EXIT_INSN(),
7797                 },
7798                 INTERNAL,
7799                 { },
7800                 { { 0,  cpu_to_le16(0x3210) } },
7801         },
7802         {
7803                 "ALU_END_FROM_LE 32: 0xfedcba9876543210 -> 0x10325476",
7804                 .u.insns_int = {
7805                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7806                         BPF_ENDIAN(BPF_FROM_LE, R0, 32),
7807                         BPF_ALU64_REG(BPF_MOV, R1, R0),
7808                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
7809                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
7810                         BPF_EXIT_INSN(),
7811                 },
7812                 INTERNAL,
7813                 { },
7814                 { { 0, cpu_to_le32(0x76543210) } },
7815         },
7816         {
7817                 "ALU_END_FROM_LE 64: 0xfedcba9876543210 -> 0x10325476",
7818                 .u.insns_int = {
7819                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7820                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
7821                         BPF_EXIT_INSN(),
7822                 },
7823                 INTERNAL,
7824                 { },
7825                 { { 0, (u32) cpu_to_le64(0xfedcba9876543210ULL) } },
7826         },
7827         {
7828                 "ALU_END_FROM_LE 64: 0xfedcba9876543210 >> 32 -> 0x98badcfe",
7829                 .u.insns_int = {
7830                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
7831                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
7832                         BPF_ALU64_IMM(BPF_RSH, R0, 32),
7833                         BPF_EXIT_INSN(),
7834                 },
7835                 INTERNAL,
7836                 { },
7837                 { { 0, (u32) (cpu_to_le64(0xfedcba9876543210ULL) >> 32) } },
7838         },
7839         /* BPF_LDX_MEM B/H/W/DW */
7840         {
7841                 "BPF_LDX_MEM | BPF_B",
7842                 .u.insns_int = {
7843                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
7844                         BPF_LD_IMM64(R2, 0x0000000000000008ULL),
7845                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7846 #ifdef __BIG_ENDIAN
7847                         BPF_LDX_MEM(BPF_B, R0, R10, -1),
7848 #else
7849                         BPF_LDX_MEM(BPF_B, R0, R10, -8),
7850 #endif
7851                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7852                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7853                         BPF_EXIT_INSN(),
7854                 },
7855                 INTERNAL,
7856                 { },
7857                 { { 0, 0 } },
7858                 .stack_depth = 8,
7859         },
7860         {
7861                 "BPF_LDX_MEM | BPF_B, MSB set",
7862                 .u.insns_int = {
7863                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
7864                         BPF_LD_IMM64(R2, 0x0000000000000088ULL),
7865                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7866 #ifdef __BIG_ENDIAN
7867                         BPF_LDX_MEM(BPF_B, R0, R10, -1),
7868 #else
7869                         BPF_LDX_MEM(BPF_B, R0, R10, -8),
7870 #endif
7871                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7872                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7873                         BPF_EXIT_INSN(),
7874                 },
7875                 INTERNAL,
7876                 { },
7877                 { { 0, 0 } },
7878                 .stack_depth = 8,
7879         },
7880         {
7881                 "BPF_LDX_MEM | BPF_H",
7882                 .u.insns_int = {
7883                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
7884                         BPF_LD_IMM64(R2, 0x0000000000000708ULL),
7885                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7886 #ifdef __BIG_ENDIAN
7887                         BPF_LDX_MEM(BPF_H, R0, R10, -2),
7888 #else
7889                         BPF_LDX_MEM(BPF_H, R0, R10, -8),
7890 #endif
7891                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7892                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7893                         BPF_EXIT_INSN(),
7894                 },
7895                 INTERNAL,
7896                 { },
7897                 { { 0, 0 } },
7898                 .stack_depth = 8,
7899         },
7900         {
7901                 "BPF_LDX_MEM | BPF_H, MSB set",
7902                 .u.insns_int = {
7903                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
7904                         BPF_LD_IMM64(R2, 0x0000000000008788ULL),
7905                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7906 #ifdef __BIG_ENDIAN
7907                         BPF_LDX_MEM(BPF_H, R0, R10, -2),
7908 #else
7909                         BPF_LDX_MEM(BPF_H, R0, R10, -8),
7910 #endif
7911                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7912                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7913                         BPF_EXIT_INSN(),
7914                 },
7915                 INTERNAL,
7916                 { },
7917                 { { 0, 0 } },
7918                 .stack_depth = 8,
7919         },
7920         {
7921                 "BPF_LDX_MEM | BPF_W",
7922                 .u.insns_int = {
7923                         BPF_LD_IMM64(R1, 0x0102030405060708ULL),
7924                         BPF_LD_IMM64(R2, 0x0000000005060708ULL),
7925                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7926 #ifdef __BIG_ENDIAN
7927                         BPF_LDX_MEM(BPF_W, R0, R10, -4),
7928 #else
7929                         BPF_LDX_MEM(BPF_W, R0, R10, -8),
7930 #endif
7931                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7932                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7933                         BPF_EXIT_INSN(),
7934                 },
7935                 INTERNAL,
7936                 { },
7937                 { { 0, 0 } },
7938                 .stack_depth = 8,
7939         },
7940         {
7941                 "BPF_LDX_MEM | BPF_W, MSB set",
7942                 .u.insns_int = {
7943                         BPF_LD_IMM64(R1, 0x8182838485868788ULL),
7944                         BPF_LD_IMM64(R2, 0x0000000085868788ULL),
7945                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7946 #ifdef __BIG_ENDIAN
7947                         BPF_LDX_MEM(BPF_W, R0, R10, -4),
7948 #else
7949                         BPF_LDX_MEM(BPF_W, R0, R10, -8),
7950 #endif
7951                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
7952                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7953                         BPF_EXIT_INSN(),
7954                 },
7955                 INTERNAL,
7956                 { },
7957                 { { 0, 0 } },
7958                 .stack_depth = 8,
7959         },
7960         /* BPF_STX_MEM B/H/W/DW */
7961         {
7962                 "BPF_STX_MEM | BPF_B",
7963                 .u.insns_int = {
7964                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7965                         BPF_LD_IMM64(R2, 0x0102030405060708ULL),
7966                         BPF_LD_IMM64(R3, 0x8090a0b0c0d0e008ULL),
7967                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7968 #ifdef __BIG_ENDIAN
7969                         BPF_STX_MEM(BPF_B, R10, R2, -1),
7970 #else
7971                         BPF_STX_MEM(BPF_B, R10, R2, -8),
7972 #endif
7973                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7974                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7975                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7976                         BPF_EXIT_INSN(),
7977                 },
7978                 INTERNAL,
7979                 { },
7980                 { { 0, 0 } },
7981                 .stack_depth = 8,
7982         },
7983         {
7984                 "BPF_STX_MEM | BPF_B, MSB set",
7985                 .u.insns_int = {
7986                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
7987                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
7988                         BPF_LD_IMM64(R3, 0x8090a0b0c0d0e088ULL),
7989                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
7990 #ifdef __BIG_ENDIAN
7991                         BPF_STX_MEM(BPF_B, R10, R2, -1),
7992 #else
7993                         BPF_STX_MEM(BPF_B, R10, R2, -8),
7994 #endif
7995                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
7996                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
7997                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
7998                         BPF_EXIT_INSN(),
7999                 },
8000                 INTERNAL,
8001                 { },
8002                 { { 0, 0 } },
8003                 .stack_depth = 8,
8004         },
8005         {
8006                 "BPF_STX_MEM | BPF_H",
8007                 .u.insns_int = {
8008                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8009                         BPF_LD_IMM64(R2, 0x0102030405060708ULL),
8010                         BPF_LD_IMM64(R3, 0x8090a0b0c0d00708ULL),
8011                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8012 #ifdef __BIG_ENDIAN
8013                         BPF_STX_MEM(BPF_H, R10, R2, -2),
8014 #else
8015                         BPF_STX_MEM(BPF_H, R10, R2, -8),
8016 #endif
8017                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8018                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8019                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8020                         BPF_EXIT_INSN(),
8021                 },
8022                 INTERNAL,
8023                 { },
8024                 { { 0, 0 } },
8025                 .stack_depth = 8,
8026         },
8027         {
8028                 "BPF_STX_MEM | BPF_H, MSB set",
8029                 .u.insns_int = {
8030                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8031                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8032                         BPF_LD_IMM64(R3, 0x8090a0b0c0d08788ULL),
8033                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8034 #ifdef __BIG_ENDIAN
8035                         BPF_STX_MEM(BPF_H, R10, R2, -2),
8036 #else
8037                         BPF_STX_MEM(BPF_H, R10, R2, -8),
8038 #endif
8039                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8040                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8041                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8042                         BPF_EXIT_INSN(),
8043                 },
8044                 INTERNAL,
8045                 { },
8046                 { { 0, 0 } },
8047                 .stack_depth = 8,
8048         },
8049         {
8050                 "BPF_STX_MEM | BPF_W",
8051                 .u.insns_int = {
8052                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8053                         BPF_LD_IMM64(R2, 0x0102030405060708ULL),
8054                         BPF_LD_IMM64(R3, 0x8090a0b005060708ULL),
8055                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8056 #ifdef __BIG_ENDIAN
8057                         BPF_STX_MEM(BPF_W, R10, R2, -4),
8058 #else
8059                         BPF_STX_MEM(BPF_W, R10, R2, -8),
8060 #endif
8061                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8062                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8063                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8064                         BPF_EXIT_INSN(),
8065                 },
8066                 INTERNAL,
8067                 { },
8068                 { { 0, 0 } },
8069                 .stack_depth = 8,
8070         },
8071         {
8072                 "BPF_STX_MEM | BPF_W, MSB set",
8073                 .u.insns_int = {
8074                         BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL),
8075                         BPF_LD_IMM64(R2, 0x8182838485868788ULL),
8076                         BPF_LD_IMM64(R3, 0x8090a0b085868788ULL),
8077                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
8078 #ifdef __BIG_ENDIAN
8079                         BPF_STX_MEM(BPF_W, R10, R2, -4),
8080 #else
8081                         BPF_STX_MEM(BPF_W, R10, R2, -8),
8082 #endif
8083                         BPF_LDX_MEM(BPF_DW, R0, R10, -8),
8084                         BPF_JMP_REG(BPF_JNE, R0, R3, 1),
8085                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
8086                         BPF_EXIT_INSN(),
8087                 },
8088                 INTERNAL,
8089                 { },
8090                 { { 0, 0 } },
8091                 .stack_depth = 8,
8092         },
8093         /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
8094         {
8095                 "ST_MEM_B: Store/Load byte: max negative",
8096                 .u.insns_int = {
8097                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8098                         BPF_ST_MEM(BPF_B, R10, -40, 0xff),
8099                         BPF_LDX_MEM(BPF_B, R0, R10, -40),
8100                         BPF_EXIT_INSN(),
8101                 },
8102                 INTERNAL,
8103                 { },
8104                 { { 0, 0xff } },
8105                 .stack_depth = 40,
8106         },
8107         {
8108                 "ST_MEM_B: Store/Load byte: max positive",
8109                 .u.insns_int = {
8110                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8111                         BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
8112                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8113                         BPF_EXIT_INSN(),
8114                 },
8115                 INTERNAL,
8116                 { },
8117                 { { 0, 0x7f } },
8118                 .stack_depth = 40,
8119         },
8120         {
8121                 "STX_MEM_B: Store/Load byte: max negative",
8122                 .u.insns_int = {
8123                         BPF_LD_IMM64(R0, 0),
8124                         BPF_LD_IMM64(R1, 0xffLL),
8125                         BPF_STX_MEM(BPF_B, R10, R1, -40),
8126                         BPF_LDX_MEM(BPF_B, R0, R10, -40),
8127                         BPF_EXIT_INSN(),
8128                 },
8129                 INTERNAL,
8130                 { },
8131                 { { 0, 0xff } },
8132                 .stack_depth = 40,
8133         },
8134         {
8135                 "ST_MEM_H: Store/Load half word: max negative",
8136                 .u.insns_int = {
8137                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8138                         BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
8139                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8140                         BPF_EXIT_INSN(),
8141                 },
8142                 INTERNAL,
8143                 { },
8144                 { { 0, 0xffff } },
8145                 .stack_depth = 40,
8146         },
8147         {
8148                 "ST_MEM_H: Store/Load half word: max positive",
8149                 .u.insns_int = {
8150                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8151                         BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
8152                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8153                         BPF_EXIT_INSN(),
8154                 },
8155                 INTERNAL,
8156                 { },
8157                 { { 0, 0x7fff } },
8158                 .stack_depth = 40,
8159         },
8160         {
8161                 "STX_MEM_H: Store/Load half word: max negative",
8162                 .u.insns_int = {
8163                         BPF_LD_IMM64(R0, 0),
8164                         BPF_LD_IMM64(R1, 0xffffLL),
8165                         BPF_STX_MEM(BPF_H, R10, R1, -40),
8166                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
8167                         BPF_EXIT_INSN(),
8168                 },
8169                 INTERNAL,
8170                 { },
8171                 { { 0, 0xffff } },
8172                 .stack_depth = 40,
8173         },
8174         {
8175                 "ST_MEM_W: Store/Load word: max negative",
8176                 .u.insns_int = {
8177                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8178                         BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
8179                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8180                         BPF_EXIT_INSN(),
8181                 },
8182                 INTERNAL,
8183                 { },
8184                 { { 0, 0xffffffff } },
8185                 .stack_depth = 40,
8186         },
8187         {
8188                 "ST_MEM_W: Store/Load word: max positive",
8189                 .u.insns_int = {
8190                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8191                         BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
8192                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8193                         BPF_EXIT_INSN(),
8194                 },
8195                 INTERNAL,
8196                 { },
8197                 { { 0, 0x7fffffff } },
8198                 .stack_depth = 40,
8199         },
8200         {
8201                 "STX_MEM_W: Store/Load word: max negative",
8202                 .u.insns_int = {
8203                         BPF_LD_IMM64(R0, 0),
8204                         BPF_LD_IMM64(R1, 0xffffffffLL),
8205                         BPF_STX_MEM(BPF_W, R10, R1, -40),
8206                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8207                         BPF_EXIT_INSN(),
8208                 },
8209                 INTERNAL,
8210                 { },
8211                 { { 0, 0xffffffff } },
8212                 .stack_depth = 40,
8213         },
8214         {
8215                 "ST_MEM_DW: Store/Load double word: max negative",
8216                 .u.insns_int = {
8217                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8218                         BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
8219                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8220                         BPF_EXIT_INSN(),
8221                 },
8222                 INTERNAL,
8223                 { },
8224                 { { 0, 0xffffffff } },
8225                 .stack_depth = 40,
8226         },
8227         {
8228                 "ST_MEM_DW: Store/Load double word: max negative 2",
8229                 .u.insns_int = {
8230                         BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
8231                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
8232                         BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
8233                         BPF_LDX_MEM(BPF_DW, R2, R10, -40),
8234                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
8235                         BPF_MOV32_IMM(R0, 2),
8236                         BPF_EXIT_INSN(),
8237                         BPF_MOV32_IMM(R0, 1),
8238                         BPF_EXIT_INSN(),
8239                 },
8240                 INTERNAL,
8241                 { },
8242                 { { 0, 0x1 } },
8243                 .stack_depth = 40,
8244         },
8245         {
8246                 "ST_MEM_DW: Store/Load double word: max positive",
8247                 .u.insns_int = {
8248                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8249                         BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
8250                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8251                         BPF_EXIT_INSN(),
8252                 },
8253                 INTERNAL,
8254                 { },
8255                 { { 0, 0x7fffffff } },
8256                 .stack_depth = 40,
8257         },
8258         {
8259                 "STX_MEM_DW: Store/Load double word: max negative",
8260                 .u.insns_int = {
8261                         BPF_LD_IMM64(R0, 0),
8262                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
8263                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8264                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8265                         BPF_EXIT_INSN(),
8266                 },
8267                 INTERNAL,
8268                 { },
8269                 { { 0, 0xffffffff } },
8270                 .stack_depth = 40,
8271         },
8272         {
8273                 "STX_MEM_DW: Store double word: first word in memory",
8274                 .u.insns_int = {
8275                         BPF_LD_IMM64(R0, 0),
8276                         BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
8277                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8278                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8279                         BPF_EXIT_INSN(),
8280                 },
8281                 INTERNAL,
8282                 { },
8283 #ifdef __BIG_ENDIAN
8284                 { { 0, 0x01234567 } },
8285 #else
8286                 { { 0, 0x89abcdef } },
8287 #endif
8288                 .stack_depth = 40,
8289         },
8290         {
8291                 "STX_MEM_DW: Store double word: second word in memory",
8292                 .u.insns_int = {
8293                         BPF_LD_IMM64(R0, 0),
8294                         BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
8295                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8296                         BPF_LDX_MEM(BPF_W, R0, R10, -36),
8297                         BPF_EXIT_INSN(),
8298                 },
8299                 INTERNAL,
8300                 { },
8301 #ifdef __BIG_ENDIAN
8302                 { { 0, 0x89abcdef } },
8303 #else
8304                 { { 0, 0x01234567 } },
8305 #endif
8306                 .stack_depth = 40,
8307         },
8308         /* BPF_STX | BPF_ATOMIC | BPF_W/DW */
8309         {
8310                 "STX_XADD_W: X + 1 + 1 + 1 + ...",
8311                 { },
8312                 INTERNAL,
8313                 { },
8314                 { { 0, 4134 } },
8315                 .fill_helper = bpf_fill_stxw,
8316         },
8317         {
8318                 "STX_XADD_DW: X + 1 + 1 + 1 + ...",
8319                 { },
8320                 INTERNAL,
8321                 { },
8322                 { { 0, 4134 } },
8323                 .fill_helper = bpf_fill_stxdw,
8324         },
8325         /*
8326          * Exhaustive tests of atomic operation variants.
8327          * Individual tests are expanded from template macros for all
8328          * combinations of ALU operation, word size and fetching.
8329          */
8330 #define BPF_ATOMIC_POISON(width) ((width) == BPF_W ? (0xbaadf00dULL << 32) : 0)
8331
8332 #define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result)      \
8333 {                                                                       \
8334         "BPF_ATOMIC | " #width ", " #op ": Test: "                      \
8335                 #old " " #logic " " #update " = " #result,              \
8336         .u.insns_int = {                                                \
8337                 BPF_LD_IMM64(R5, (update) | BPF_ATOMIC_POISON(width)),  \
8338                 BPF_ST_MEM(width, R10, -40, old),                       \
8339                 BPF_ATOMIC_OP(width, op, R10, R5, -40),                 \
8340                 BPF_LDX_MEM(width, R0, R10, -40),                       \
8341                 BPF_ALU64_REG(BPF_MOV, R1, R0),                         \
8342                 BPF_ALU64_IMM(BPF_RSH, R1, 32),                         \
8343                 BPF_ALU64_REG(BPF_OR, R0, R1),                          \
8344                 BPF_EXIT_INSN(),                                        \
8345         },                                                              \
8346         INTERNAL,                                                       \
8347         { },                                                            \
8348         { { 0, result } },                                              \
8349         .stack_depth = 40,                                              \
8350 }
8351 #define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result)      \
8352 {                                                                       \
8353         "BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: "    \
8354                 #old " " #logic " " #update " = " #result,              \
8355         .u.insns_int = {                                                \
8356                 BPF_ALU64_REG(BPF_MOV, R1, R10),                        \
8357                 BPF_LD_IMM64(R0, (update) | BPF_ATOMIC_POISON(width)),  \
8358                 BPF_ST_MEM(BPF_W, R10, -40, old),                       \
8359                 BPF_ATOMIC_OP(width, op, R10, R0, -40),                 \
8360                 BPF_ALU64_REG(BPF_MOV, R0, R10),                        \
8361                 BPF_ALU64_REG(BPF_SUB, R0, R1),                         \
8362                 BPF_ALU64_REG(BPF_MOV, R1, R0),                         \
8363                 BPF_ALU64_IMM(BPF_RSH, R1, 32),                         \
8364                 BPF_ALU64_REG(BPF_OR, R0, R1),                          \
8365                 BPF_EXIT_INSN(),                                        \
8366         },                                                              \
8367         INTERNAL,                                                       \
8368         { },                                                            \
8369         { { 0, 0 } },                                                   \
8370         .stack_depth = 40,                                              \
8371 }
8372 #define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result)      \
8373 {                                                                       \
8374         "BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: "     \
8375                 #old " " #logic " " #update " = " #result,              \
8376         .u.insns_int = {                                                \
8377                 BPF_ALU64_REG(BPF_MOV, R0, R10),                        \
8378                 BPF_LD_IMM64(R1, (update) | BPF_ATOMIC_POISON(width)),  \
8379                 BPF_ST_MEM(width, R10, -40, old),                       \
8380                 BPF_ATOMIC_OP(width, op, R10, R1, -40),                 \
8381                 BPF_ALU64_REG(BPF_SUB, R0, R10),                        \
8382                 BPF_ALU64_REG(BPF_MOV, R1, R0),                         \
8383                 BPF_ALU64_IMM(BPF_RSH, R1, 32),                         \
8384                 BPF_ALU64_REG(BPF_OR, R0, R1),                          \
8385                 BPF_EXIT_INSN(),                                        \
8386         },                                                              \
8387         INTERNAL,                                                       \
8388         { },                                                            \
8389         { { 0, 0 } },                                                   \
8390         .stack_depth = 40,                                              \
8391 }
8392 #define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result)      \
8393 {                                                                       \
8394         "BPF_ATOMIC | " #width ", " #op ": Test fetch: "                \
8395                 #old " " #logic " " #update " = " #result,              \
8396         .u.insns_int = {                                                \
8397                 BPF_LD_IMM64(R3, (update) | BPF_ATOMIC_POISON(width)),  \
8398                 BPF_ST_MEM(width, R10, -40, old),                       \
8399                 BPF_ATOMIC_OP(width, op, R10, R3, -40),                 \
8400                 BPF_ALU32_REG(BPF_MOV, R0, R3),                         \
8401                 BPF_EXIT_INSN(),                                        \
8402         },                                                              \
8403         INTERNAL,                                                       \
8404         { },                                                            \
8405         { { 0, (op) & BPF_FETCH ? old : update } },                     \
8406         .stack_depth = 40,                                              \
8407 }
8408         /* BPF_ATOMIC | BPF_W: BPF_ADD */
8409         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
8410         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
8411         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
8412         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
8413         /* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
8414         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8415         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8416         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8417         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8418         /* BPF_ATOMIC | BPF_DW: BPF_ADD */
8419         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
8420         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
8421         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
8422         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
8423         /* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
8424         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8425         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8426         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8427         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
8428         /* BPF_ATOMIC | BPF_W: BPF_AND */
8429         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
8430         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
8431         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
8432         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
8433         /* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
8434         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8435         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8436         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8437         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8438         /* BPF_ATOMIC | BPF_DW: BPF_AND */
8439         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
8440         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
8441         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
8442         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
8443         /* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
8444         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8445         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8446         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8447         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
8448         /* BPF_ATOMIC | BPF_W: BPF_OR */
8449         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
8450         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
8451         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
8452         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
8453         /* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
8454         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8455         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8456         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8457         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8458         /* BPF_ATOMIC | BPF_DW: BPF_OR */
8459         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
8460         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
8461         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
8462         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
8463         /* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
8464         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8465         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8466         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8467         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
8468         /* BPF_ATOMIC | BPF_W: BPF_XOR */
8469         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8470         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8471         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8472         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8473         /* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
8474         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8475         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8476         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8477         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8478         /* BPF_ATOMIC | BPF_DW: BPF_XOR */
8479         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8480         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8481         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8482         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
8483         /* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
8484         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8485         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8486         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8487         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
8488         /* BPF_ATOMIC | BPF_W: BPF_XCHG */
8489         BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8490         BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8491         BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8492         BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8493         /* BPF_ATOMIC | BPF_DW: BPF_XCHG */
8494         BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8495         BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8496         BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8497         BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
8498 #undef BPF_ATOMIC_POISON
8499 #undef BPF_ATOMIC_OP_TEST1
8500 #undef BPF_ATOMIC_OP_TEST2
8501 #undef BPF_ATOMIC_OP_TEST3
8502 #undef BPF_ATOMIC_OP_TEST4
8503         /* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */
8504         {
8505                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return",
8506                 .u.insns_int = {
8507                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
8508                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
8509                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
8510                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
8511                         BPF_EXIT_INSN(),
8512                 },
8513                 INTERNAL,
8514                 { },
8515                 { { 0, 0x01234567 } },
8516                 .stack_depth = 40,
8517         },
8518         {
8519                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store",
8520                 .u.insns_int = {
8521                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
8522                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
8523                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
8524                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
8525                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8526                         BPF_EXIT_INSN(),
8527                 },
8528                 INTERNAL,
8529                 { },
8530                 { { 0, 0x89abcdef } },
8531                 .stack_depth = 40,
8532         },
8533         {
8534                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return",
8535                 .u.insns_int = {
8536                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
8537                         BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
8538                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
8539                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
8540                         BPF_EXIT_INSN(),
8541                 },
8542                 INTERNAL,
8543                 { },
8544                 { { 0, 0x01234567 } },
8545                 .stack_depth = 40,
8546         },
8547         {
8548                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store",
8549                 .u.insns_int = {
8550                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
8551                         BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
8552                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
8553                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
8554                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
8555                         BPF_EXIT_INSN(),
8556                 },
8557                 INTERNAL,
8558                 { },
8559                 { { 0, 0x01234567 } },
8560                 .stack_depth = 40,
8561         },
8562         {
8563                 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects",
8564                 .u.insns_int = {
8565                         BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
8566                         BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
8567                         BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
8568                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
8569                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
8570                         BPF_ALU32_REG(BPF_MOV, R0, R3),
8571                         BPF_EXIT_INSN(),
8572                 },
8573                 INTERNAL,
8574                 { },
8575                 { { 0, 0x89abcdef } },
8576                 .stack_depth = 40,
8577         },
8578         /* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */
8579         {
8580                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return",
8581                 .u.insns_int = {
8582                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
8583                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
8584                         BPF_ALU64_REG(BPF_MOV, R0, R1),
8585                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8586                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
8587                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
8588                         BPF_ALU64_REG(BPF_SUB, R0, R1),
8589                         BPF_EXIT_INSN(),
8590                 },
8591                 INTERNAL,
8592                 { },
8593                 { { 0, 0 } },
8594                 .stack_depth = 40,
8595         },
8596         {
8597                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store",
8598                 .u.insns_int = {
8599                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
8600                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
8601                         BPF_ALU64_REG(BPF_MOV, R0, R1),
8602                         BPF_STX_MEM(BPF_DW, R10, R0, -40),
8603                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
8604                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8605                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8606                         BPF_ALU64_REG(BPF_SUB, R0, R2),
8607                         BPF_EXIT_INSN(),
8608                 },
8609                 INTERNAL,
8610                 { },
8611                 { { 0, 0 } },
8612                 .stack_depth = 40,
8613         },
8614         {
8615                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return",
8616                 .u.insns_int = {
8617                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
8618                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
8619                         BPF_ALU64_REG(BPF_MOV, R0, R1),
8620                         BPF_ALU64_IMM(BPF_ADD, R0, 1),
8621                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8622                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
8623                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
8624                         BPF_ALU64_REG(BPF_SUB, R0, R1),
8625                         BPF_EXIT_INSN(),
8626                 },
8627                 INTERNAL,
8628                 { },
8629                 { { 0, 0 } },
8630                 .stack_depth = 40,
8631         },
8632         {
8633                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store",
8634                 .u.insns_int = {
8635                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
8636                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
8637                         BPF_ALU64_REG(BPF_MOV, R0, R1),
8638                         BPF_ALU64_IMM(BPF_ADD, R0, 1),
8639                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8640                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
8641                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
8642                         BPF_JMP_REG(BPF_JNE, R0, R1, 1),
8643                         BPF_ALU64_REG(BPF_SUB, R0, R1),
8644                         BPF_EXIT_INSN(),
8645                 },
8646                 INTERNAL,
8647                 { },
8648                 { { 0, 0 } },
8649                 .stack_depth = 40,
8650         },
8651         {
8652                 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects",
8653                 .u.insns_int = {
8654                         BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
8655                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),
8656                         BPF_ALU64_REG(BPF_MOV, R0, R1),
8657                         BPF_STX_MEM(BPF_DW, R10, R1, -40),
8658                         BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
8659                         BPF_LD_IMM64(R0, 0xfedcba9876543210ULL),
8660                         BPF_JMP_REG(BPF_JNE, R0, R2, 1),
8661                         BPF_ALU64_REG(BPF_SUB, R0, R2),
8662                         BPF_EXIT_INSN(),
8663                 },
8664                 INTERNAL,
8665                 { },
8666                 { { 0, 0 } },
8667                 .stack_depth = 40,
8668         },
8669         /* BPF_JMP32 | BPF_JEQ | BPF_K */
8670         {
8671                 "JMP32_JEQ_K: Small immediate",
8672                 .u.insns_int = {
8673                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
8674                         BPF_JMP32_IMM(BPF_JEQ, R0, 321, 1),
8675                         BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1),
8676                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8677                         BPF_EXIT_INSN(),
8678                 },
8679                 INTERNAL,
8680                 { },
8681                 { { 0, 123 } }
8682         },
8683         {
8684                 "JMP32_JEQ_K: Large immediate",
8685                 .u.insns_int = {
8686                         BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
8687                         BPF_JMP32_IMM(BPF_JEQ, R0, 12345678 & 0xffff, 1),
8688                         BPF_JMP32_IMM(BPF_JEQ, R0, 12345678, 1),
8689                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8690                         BPF_EXIT_INSN(),
8691                 },
8692                 INTERNAL,
8693                 { },
8694                 { { 0, 12345678 } }
8695         },
8696         {
8697                 "JMP32_JEQ_K: negative immediate",
8698                 .u.insns_int = {
8699                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
8700                         BPF_JMP32_IMM(BPF_JEQ, R0,  123, 1),
8701                         BPF_JMP32_IMM(BPF_JEQ, R0, -123, 1),
8702                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8703                         BPF_EXIT_INSN(),
8704                 },
8705                 INTERNAL,
8706                 { },
8707                 { { 0, -123 } }
8708         },
8709         /* BPF_JMP32 | BPF_JEQ | BPF_X */
8710         {
8711                 "JMP32_JEQ_X",
8712                 .u.insns_int = {
8713                         BPF_ALU32_IMM(BPF_MOV, R0, 1234),
8714                         BPF_ALU32_IMM(BPF_MOV, R1, 4321),
8715                         BPF_JMP32_REG(BPF_JEQ, R0, R1, 2),
8716                         BPF_ALU32_IMM(BPF_MOV, R1, 1234),
8717                         BPF_JMP32_REG(BPF_JEQ, R0, R1, 1),
8718                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8719                         BPF_EXIT_INSN(),
8720                 },
8721                 INTERNAL,
8722                 { },
8723                 { { 0, 1234 } }
8724         },
8725         /* BPF_JMP32 | BPF_JNE | BPF_K */
8726         {
8727                 "JMP32_JNE_K: Small immediate",
8728                 .u.insns_int = {
8729                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
8730                         BPF_JMP32_IMM(BPF_JNE, R0, 123, 1),
8731                         BPF_JMP32_IMM(BPF_JNE, R0, 321, 1),
8732                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8733                         BPF_EXIT_INSN(),
8734                 },
8735                 INTERNAL,
8736                 { },
8737                 { { 0, 123 } }
8738         },
8739         {
8740                 "JMP32_JNE_K: Large immediate",
8741                 .u.insns_int = {
8742                         BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
8743                         BPF_JMP32_IMM(BPF_JNE, R0, 12345678, 1),
8744                         BPF_JMP32_IMM(BPF_JNE, R0, 12345678 & 0xffff, 1),
8745                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8746                         BPF_EXIT_INSN(),
8747                 },
8748                 INTERNAL,
8749                 { },
8750                 { { 0, 12345678 } }
8751         },
8752         {
8753                 "JMP32_JNE_K: negative immediate",
8754                 .u.insns_int = {
8755                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
8756                         BPF_JMP32_IMM(BPF_JNE, R0, -123, 1),
8757                         BPF_JMP32_IMM(BPF_JNE, R0,  123, 1),
8758                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8759                         BPF_EXIT_INSN(),
8760                 },
8761                 INTERNAL,
8762                 { },
8763                 { { 0, -123 } }
8764         },
8765         /* BPF_JMP32 | BPF_JNE | BPF_X */
8766         {
8767                 "JMP32_JNE_X",
8768                 .u.insns_int = {
8769                         BPF_ALU32_IMM(BPF_MOV, R0, 1234),
8770                         BPF_ALU32_IMM(BPF_MOV, R1, 1234),
8771                         BPF_JMP32_REG(BPF_JNE, R0, R1, 2),
8772                         BPF_ALU32_IMM(BPF_MOV, R1, 4321),
8773                         BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
8774                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8775                         BPF_EXIT_INSN(),
8776                 },
8777                 INTERNAL,
8778                 { },
8779                 { { 0, 1234 } }
8780         },
8781         /* BPF_JMP32 | BPF_JSET | BPF_K */
8782         {
8783                 "JMP32_JSET_K: Small immediate",
8784                 .u.insns_int = {
8785                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
8786                         BPF_JMP32_IMM(BPF_JSET, R0, 2, 1),
8787                         BPF_JMP32_IMM(BPF_JSET, R0, 3, 1),
8788                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8789                         BPF_EXIT_INSN(),
8790                 },
8791                 INTERNAL,
8792                 { },
8793                 { { 0, 1 } }
8794         },
8795         {
8796                 "JMP32_JSET_K: Large immediate",
8797                 .u.insns_int = {
8798                         BPF_ALU32_IMM(BPF_MOV, R0, 0x40000000),
8799                         BPF_JMP32_IMM(BPF_JSET, R0, 0x3fffffff, 1),
8800                         BPF_JMP32_IMM(BPF_JSET, R0, 0x60000000, 1),
8801                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8802                         BPF_EXIT_INSN(),
8803                 },
8804                 INTERNAL,
8805                 { },
8806                 { { 0, 0x40000000 } }
8807         },
8808         {
8809                 "JMP32_JSET_K: negative immediate",
8810                 .u.insns_int = {
8811                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
8812                         BPF_JMP32_IMM(BPF_JSET, R0, -1, 1),
8813                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8814                         BPF_EXIT_INSN(),
8815                 },
8816                 INTERNAL,
8817                 { },
8818                 { { 0, -123 } }
8819         },
8820         /* BPF_JMP32 | BPF_JSET | BPF_X */
8821         {
8822                 "JMP32_JSET_X",
8823                 .u.insns_int = {
8824                         BPF_ALU32_IMM(BPF_MOV, R0, 8),
8825                         BPF_ALU32_IMM(BPF_MOV, R1, 7),
8826                         BPF_JMP32_REG(BPF_JSET, R0, R1, 2),
8827                         BPF_ALU32_IMM(BPF_MOV, R1, 8 | 2),
8828                         BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
8829                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8830                         BPF_EXIT_INSN(),
8831                 },
8832                 INTERNAL,
8833                 { },
8834                 { { 0, 8 } }
8835         },
8836         /* BPF_JMP32 | BPF_JGT | BPF_K */
8837         {
8838                 "JMP32_JGT_K: Small immediate",
8839                 .u.insns_int = {
8840                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
8841                         BPF_JMP32_IMM(BPF_JGT, R0, 123, 1),
8842                         BPF_JMP32_IMM(BPF_JGT, R0, 122, 1),
8843                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8844                         BPF_EXIT_INSN(),
8845                 },
8846                 INTERNAL,
8847                 { },
8848                 { { 0, 123 } }
8849         },
8850         {
8851                 "JMP32_JGT_K: Large immediate",
8852                 .u.insns_int = {
8853                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8854                         BPF_JMP32_IMM(BPF_JGT, R0, 0xffffffff, 1),
8855                         BPF_JMP32_IMM(BPF_JGT, R0, 0xfffffffd, 1),
8856                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8857                         BPF_EXIT_INSN(),
8858                 },
8859                 INTERNAL,
8860                 { },
8861                 { { 0, 0xfffffffe } }
8862         },
8863         /* BPF_JMP32 | BPF_JGT | BPF_X */
8864         {
8865                 "JMP32_JGT_X",
8866                 .u.insns_int = {
8867                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8868                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
8869                         BPF_JMP32_REG(BPF_JGT, R0, R1, 2),
8870                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
8871                         BPF_JMP32_REG(BPF_JGT, R0, R1, 1),
8872                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8873                         BPF_EXIT_INSN(),
8874                 },
8875                 INTERNAL,
8876                 { },
8877                 { { 0, 0xfffffffe } }
8878         },
8879         /* BPF_JMP32 | BPF_JGE | BPF_K */
8880         {
8881                 "JMP32_JGE_K: Small immediate",
8882                 .u.insns_int = {
8883                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
8884                         BPF_JMP32_IMM(BPF_JGE, R0, 124, 1),
8885                         BPF_JMP32_IMM(BPF_JGE, R0, 123, 1),
8886                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8887                         BPF_EXIT_INSN(),
8888                 },
8889                 INTERNAL,
8890                 { },
8891                 { { 0, 123 } }
8892         },
8893         {
8894                 "JMP32_JGE_K: Large immediate",
8895                 .u.insns_int = {
8896                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8897                         BPF_JMP32_IMM(BPF_JGE, R0, 0xffffffff, 1),
8898                         BPF_JMP32_IMM(BPF_JGE, R0, 0xfffffffe, 1),
8899                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8900                         BPF_EXIT_INSN(),
8901                 },
8902                 INTERNAL,
8903                 { },
8904                 { { 0, 0xfffffffe } }
8905         },
8906         /* BPF_JMP32 | BPF_JGE | BPF_X */
8907         {
8908                 "JMP32_JGE_X",
8909                 .u.insns_int = {
8910                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8911                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
8912                         BPF_JMP32_REG(BPF_JGE, R0, R1, 2),
8913                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
8914                         BPF_JMP32_REG(BPF_JGE, R0, R1, 1),
8915                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8916                         BPF_EXIT_INSN(),
8917                 },
8918                 INTERNAL,
8919                 { },
8920                 { { 0, 0xfffffffe } }
8921         },
8922         /* BPF_JMP32 | BPF_JLT | BPF_K */
8923         {
8924                 "JMP32_JLT_K: Small immediate",
8925                 .u.insns_int = {
8926                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
8927                         BPF_JMP32_IMM(BPF_JLT, R0, 123, 1),
8928                         BPF_JMP32_IMM(BPF_JLT, R0, 124, 1),
8929                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8930                         BPF_EXIT_INSN(),
8931                 },
8932                 INTERNAL,
8933                 { },
8934                 { { 0, 123 } }
8935         },
8936         {
8937                 "JMP32_JLT_K: Large immediate",
8938                 .u.insns_int = {
8939                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8940                         BPF_JMP32_IMM(BPF_JLT, R0, 0xfffffffd, 1),
8941                         BPF_JMP32_IMM(BPF_JLT, R0, 0xffffffff, 1),
8942                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8943                         BPF_EXIT_INSN(),
8944                 },
8945                 INTERNAL,
8946                 { },
8947                 { { 0, 0xfffffffe } }
8948         },
8949         /* BPF_JMP32 | BPF_JLT | BPF_X */
8950         {
8951                 "JMP32_JLT_X",
8952                 .u.insns_int = {
8953                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8954                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
8955                         BPF_JMP32_REG(BPF_JLT, R0, R1, 2),
8956                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
8957                         BPF_JMP32_REG(BPF_JLT, R0, R1, 1),
8958                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8959                         BPF_EXIT_INSN(),
8960                 },
8961                 INTERNAL,
8962                 { },
8963                 { { 0, 0xfffffffe } }
8964         },
8965         /* BPF_JMP32 | BPF_JLE | BPF_K */
8966         {
8967                 "JMP32_JLE_K: Small immediate",
8968                 .u.insns_int = {
8969                         BPF_ALU32_IMM(BPF_MOV, R0, 123),
8970                         BPF_JMP32_IMM(BPF_JLE, R0, 122, 1),
8971                         BPF_JMP32_IMM(BPF_JLE, R0, 123, 1),
8972                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8973                         BPF_EXIT_INSN(),
8974                 },
8975                 INTERNAL,
8976                 { },
8977                 { { 0, 123 } }
8978         },
8979         {
8980                 "JMP32_JLE_K: Large immediate",
8981                 .u.insns_int = {
8982                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8983                         BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffd, 1),
8984                         BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffe, 1),
8985                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
8986                         BPF_EXIT_INSN(),
8987                 },
8988                 INTERNAL,
8989                 { },
8990                 { { 0, 0xfffffffe } }
8991         },
8992         /* BPF_JMP32 | BPF_JLE | BPF_X */
8993         {
8994                 "JMP32_JLE_X",
8995                 .u.insns_int = {
8996                         BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
8997                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
8998                         BPF_JMP32_REG(BPF_JLE, R0, R1, 2),
8999                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
9000                         BPF_JMP32_REG(BPF_JLE, R0, R1, 1),
9001                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9002                         BPF_EXIT_INSN(),
9003                 },
9004                 INTERNAL,
9005                 { },
9006                 { { 0, 0xfffffffe } }
9007         },
9008         /* BPF_JMP32 | BPF_JSGT | BPF_K */
9009         {
9010                 "JMP32_JSGT_K: Small immediate",
9011                 .u.insns_int = {
9012                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9013                         BPF_JMP32_IMM(BPF_JSGT, R0, -123, 1),
9014                         BPF_JMP32_IMM(BPF_JSGT, R0, -124, 1),
9015                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9016                         BPF_EXIT_INSN(),
9017                 },
9018                 INTERNAL,
9019                 { },
9020                 { { 0, -123 } }
9021         },
9022         {
9023                 "JMP32_JSGT_K: Large immediate",
9024                 .u.insns_int = {
9025                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9026                         BPF_JMP32_IMM(BPF_JSGT, R0, -12345678, 1),
9027                         BPF_JMP32_IMM(BPF_JSGT, R0, -12345679, 1),
9028                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9029                         BPF_EXIT_INSN(),
9030                 },
9031                 INTERNAL,
9032                 { },
9033                 { { 0, -12345678 } }
9034         },
9035         /* BPF_JMP32 | BPF_JSGT | BPF_X */
9036         {
9037                 "JMP32_JSGT_X",
9038                 .u.insns_int = {
9039                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9040                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9041                         BPF_JMP32_REG(BPF_JSGT, R0, R1, 2),
9042                         BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
9043                         BPF_JMP32_REG(BPF_JSGT, R0, R1, 1),
9044                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9045                         BPF_EXIT_INSN(),
9046                 },
9047                 INTERNAL,
9048                 { },
9049                 { { 0, -12345678 } }
9050         },
9051         /* BPF_JMP32 | BPF_JSGE | BPF_K */
9052         {
9053                 "JMP32_JSGE_K: Small immediate",
9054                 .u.insns_int = {
9055                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9056                         BPF_JMP32_IMM(BPF_JSGE, R0, -122, 1),
9057                         BPF_JMP32_IMM(BPF_JSGE, R0, -123, 1),
9058                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9059                         BPF_EXIT_INSN(),
9060                 },
9061                 INTERNAL,
9062                 { },
9063                 { { 0, -123 } }
9064         },
9065         {
9066                 "JMP32_JSGE_K: Large immediate",
9067                 .u.insns_int = {
9068                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9069                         BPF_JMP32_IMM(BPF_JSGE, R0, -12345677, 1),
9070                         BPF_JMP32_IMM(BPF_JSGE, R0, -12345678, 1),
9071                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9072                         BPF_EXIT_INSN(),
9073                 },
9074                 INTERNAL,
9075                 { },
9076                 { { 0, -12345678 } }
9077         },
9078         /* BPF_JMP32 | BPF_JSGE | BPF_X */
9079         {
9080                 "JMP32_JSGE_X",
9081                 .u.insns_int = {
9082                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9083                         BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
9084                         BPF_JMP32_REG(BPF_JSGE, R0, R1, 2),
9085                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9086                         BPF_JMP32_REG(BPF_JSGE, R0, R1, 1),
9087                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9088                         BPF_EXIT_INSN(),
9089                 },
9090                 INTERNAL,
9091                 { },
9092                 { { 0, -12345678 } }
9093         },
9094         /* BPF_JMP32 | BPF_JSLT | BPF_K */
9095         {
9096                 "JMP32_JSLT_K: Small immediate",
9097                 .u.insns_int = {
9098                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9099                         BPF_JMP32_IMM(BPF_JSLT, R0, -123, 1),
9100                         BPF_JMP32_IMM(BPF_JSLT, R0, -122, 1),
9101                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9102                         BPF_EXIT_INSN(),
9103                 },
9104                 INTERNAL,
9105                 { },
9106                 { { 0, -123 } }
9107         },
9108         {
9109                 "JMP32_JSLT_K: Large immediate",
9110                 .u.insns_int = {
9111                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9112                         BPF_JMP32_IMM(BPF_JSLT, R0, -12345678, 1),
9113                         BPF_JMP32_IMM(BPF_JSLT, R0, -12345677, 1),
9114                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9115                         BPF_EXIT_INSN(),
9116                 },
9117                 INTERNAL,
9118                 { },
9119                 { { 0, -12345678 } }
9120         },
9121         /* BPF_JMP32 | BPF_JSLT | BPF_X */
9122         {
9123                 "JMP32_JSLT_X",
9124                 .u.insns_int = {
9125                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9126                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9127                         BPF_JMP32_REG(BPF_JSLT, R0, R1, 2),
9128                         BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
9129                         BPF_JMP32_REG(BPF_JSLT, R0, R1, 1),
9130                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9131                         BPF_EXIT_INSN(),
9132                 },
9133                 INTERNAL,
9134                 { },
9135                 { { 0, -12345678 } }
9136         },
9137         /* BPF_JMP32 | BPF_JSLE | BPF_K */
9138         {
9139                 "JMP32_JSLE_K: Small immediate",
9140                 .u.insns_int = {
9141                         BPF_ALU32_IMM(BPF_MOV, R0, -123),
9142                         BPF_JMP32_IMM(BPF_JSLE, R0, -124, 1),
9143                         BPF_JMP32_IMM(BPF_JSLE, R0, -123, 1),
9144                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9145                         BPF_EXIT_INSN(),
9146                 },
9147                 INTERNAL,
9148                 { },
9149                 { { 0, -123 } }
9150         },
9151         {
9152                 "JMP32_JSLE_K: Large immediate",
9153                 .u.insns_int = {
9154                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9155                         BPF_JMP32_IMM(BPF_JSLE, R0, -12345679, 1),
9156                         BPF_JMP32_IMM(BPF_JSLE, R0, -12345678, 1),
9157                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9158                         BPF_EXIT_INSN(),
9159                 },
9160                 INTERNAL,
9161                 { },
9162                 { { 0, -12345678 } }
9163         },
9164         /* BPF_JMP32 | BPF_JSLE | BPF_K */
9165         {
9166                 "JMP32_JSLE_X",
9167                 .u.insns_int = {
9168                         BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
9169                         BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
9170                         BPF_JMP32_REG(BPF_JSLE, R0, R1, 2),
9171                         BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
9172                         BPF_JMP32_REG(BPF_JSLE, R0, R1, 1),
9173                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9174                         BPF_EXIT_INSN(),
9175                 },
9176                 INTERNAL,
9177                 { },
9178                 { { 0, -12345678 } }
9179         },
9180         /* BPF_JMP | BPF_EXIT */
9181         {
9182                 "JMP_EXIT",
9183                 .u.insns_int = {
9184                         BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
9185                         BPF_EXIT_INSN(),
9186                         BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
9187                 },
9188                 INTERNAL,
9189                 { },
9190                 { { 0, 0x4711 } },
9191         },
9192         /* BPF_JMP | BPF_JA */
9193         {
9194                 "JMP_JA: Unconditional jump: if (true) return 1",
9195                 .u.insns_int = {
9196                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9197                         BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9198                         BPF_EXIT_INSN(),
9199                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9200                         BPF_EXIT_INSN(),
9201                 },
9202                 INTERNAL,
9203                 { },
9204                 { { 0, 1 } },
9205         },
9206         /* BPF_JMP | BPF_JSLT | BPF_K */
9207         {
9208                 "JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
9209                 .u.insns_int = {
9210                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9211                         BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
9212                         BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
9213                         BPF_EXIT_INSN(),
9214                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9215                         BPF_EXIT_INSN(),
9216                 },
9217                 INTERNAL,
9218                 { },
9219                 { { 0, 1 } },
9220         },
9221         {
9222                 "JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
9223                 .u.insns_int = {
9224                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9225                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9226                         BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
9227                         BPF_EXIT_INSN(),
9228                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9229                         BPF_EXIT_INSN(),
9230                 },
9231                 INTERNAL,
9232                 { },
9233                 { { 0, 1 } },
9234         },
9235         /* BPF_JMP | BPF_JSGT | BPF_K */
9236         {
9237                 "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
9238                 .u.insns_int = {
9239                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9240                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9241                         BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
9242                         BPF_EXIT_INSN(),
9243                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9244                         BPF_EXIT_INSN(),
9245                 },
9246                 INTERNAL,
9247                 { },
9248                 { { 0, 1 } },
9249         },
9250         {
9251                 "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
9252                 .u.insns_int = {
9253                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9254                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9255                         BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
9256                         BPF_EXIT_INSN(),
9257                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9258                         BPF_EXIT_INSN(),
9259                 },
9260                 INTERNAL,
9261                 { },
9262                 { { 0, 1 } },
9263         },
9264         /* BPF_JMP | BPF_JSLE | BPF_K */
9265         {
9266                 "JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
9267                 .u.insns_int = {
9268                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9269                         BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
9270                         BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
9271                         BPF_EXIT_INSN(),
9272                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9273                         BPF_EXIT_INSN(),
9274                 },
9275                 INTERNAL,
9276                 { },
9277                 { { 0, 1 } },
9278         },
9279         {
9280                 "JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
9281                 .u.insns_int = {
9282                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9283                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9284                         BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
9285                         BPF_EXIT_INSN(),
9286                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9287                         BPF_EXIT_INSN(),
9288                 },
9289                 INTERNAL,
9290                 { },
9291                 { { 0, 1 } },
9292         },
9293         {
9294                 "JMP_JSLE_K: Signed jump: value walk 1",
9295                 .u.insns_int = {
9296                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9297                         BPF_LD_IMM64(R1, 3),
9298                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
9299                         BPF_ALU64_IMM(BPF_SUB, R1, 1),
9300                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
9301                         BPF_ALU64_IMM(BPF_SUB, R1, 1),
9302                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
9303                         BPF_ALU64_IMM(BPF_SUB, R1, 1),
9304                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
9305                         BPF_EXIT_INSN(),                /* bad exit */
9306                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
9307                         BPF_EXIT_INSN(),
9308                 },
9309                 INTERNAL,
9310                 { },
9311                 { { 0, 1 } },
9312         },
9313         {
9314                 "JMP_JSLE_K: Signed jump: value walk 2",
9315                 .u.insns_int = {
9316                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9317                         BPF_LD_IMM64(R1, 3),
9318                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
9319                         BPF_ALU64_IMM(BPF_SUB, R1, 2),
9320                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
9321                         BPF_ALU64_IMM(BPF_SUB, R1, 2),
9322                         BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
9323                         BPF_EXIT_INSN(),                /* bad exit */
9324                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
9325                         BPF_EXIT_INSN(),
9326                 },
9327                 INTERNAL,
9328                 { },
9329                 { { 0, 1 } },
9330         },
9331         /* BPF_JMP | BPF_JSGE | BPF_K */
9332         {
9333                 "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
9334                 .u.insns_int = {
9335                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9336                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9337                         BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
9338                         BPF_EXIT_INSN(),
9339                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9340                         BPF_EXIT_INSN(),
9341                 },
9342                 INTERNAL,
9343                 { },
9344                 { { 0, 1 } },
9345         },
9346         {
9347                 "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
9348                 .u.insns_int = {
9349                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9350                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
9351                         BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
9352                         BPF_EXIT_INSN(),
9353                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9354                         BPF_EXIT_INSN(),
9355                 },
9356                 INTERNAL,
9357                 { },
9358                 { { 0, 1 } },
9359         },
9360         {
9361                 "JMP_JSGE_K: Signed jump: value walk 1",
9362                 .u.insns_int = {
9363                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9364                         BPF_LD_IMM64(R1, -3),
9365                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
9366                         BPF_ALU64_IMM(BPF_ADD, R1, 1),
9367                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
9368                         BPF_ALU64_IMM(BPF_ADD, R1, 1),
9369                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
9370                         BPF_ALU64_IMM(BPF_ADD, R1, 1),
9371                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
9372                         BPF_EXIT_INSN(),                /* bad exit */
9373                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
9374                         BPF_EXIT_INSN(),
9375                 },
9376                 INTERNAL,
9377                 { },
9378                 { { 0, 1 } },
9379         },
9380         {
9381                 "JMP_JSGE_K: Signed jump: value walk 2",
9382                 .u.insns_int = {
9383                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9384                         BPF_LD_IMM64(R1, -3),
9385                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
9386                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
9387                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
9388                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
9389                         BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
9390                         BPF_EXIT_INSN(),                /* bad exit */
9391                         BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
9392                         BPF_EXIT_INSN(),
9393                 },
9394                 INTERNAL,
9395                 { },
9396                 { { 0, 1 } },
9397         },
9398         /* BPF_JMP | BPF_JGT | BPF_K */
9399         {
9400                 "JMP_JGT_K: if (3 > 2) return 1",
9401                 .u.insns_int = {
9402                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9403                         BPF_LD_IMM64(R1, 3),
9404                         BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
9405                         BPF_EXIT_INSN(),
9406                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9407                         BPF_EXIT_INSN(),
9408                 },
9409                 INTERNAL,
9410                 { },
9411                 { { 0, 1 } },
9412         },
9413         {
9414                 "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
9415                 .u.insns_int = {
9416                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9417                         BPF_LD_IMM64(R1, -1),
9418                         BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
9419                         BPF_EXIT_INSN(),
9420                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9421                         BPF_EXIT_INSN(),
9422                 },
9423                 INTERNAL,
9424                 { },
9425                 { { 0, 1 } },
9426         },
9427         /* BPF_JMP | BPF_JLT | BPF_K */
9428         {
9429                 "JMP_JLT_K: if (2 < 3) return 1",
9430                 .u.insns_int = {
9431                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9432                         BPF_LD_IMM64(R1, 2),
9433                         BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
9434                         BPF_EXIT_INSN(),
9435                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9436                         BPF_EXIT_INSN(),
9437                 },
9438                 INTERNAL,
9439                 { },
9440                 { { 0, 1 } },
9441         },
9442         {
9443                 "JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
9444                 .u.insns_int = {
9445                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9446                         BPF_LD_IMM64(R1, 1),
9447                         BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
9448                         BPF_EXIT_INSN(),
9449                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9450                         BPF_EXIT_INSN(),
9451                 },
9452                 INTERNAL,
9453                 { },
9454                 { { 0, 1 } },
9455         },
9456         /* BPF_JMP | BPF_JGE | BPF_K */
9457         {
9458                 "JMP_JGE_K: if (3 >= 2) return 1",
9459                 .u.insns_int = {
9460                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9461                         BPF_LD_IMM64(R1, 3),
9462                         BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
9463                         BPF_EXIT_INSN(),
9464                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9465                         BPF_EXIT_INSN(),
9466                 },
9467                 INTERNAL,
9468                 { },
9469                 { { 0, 1 } },
9470         },
9471         /* BPF_JMP | BPF_JLE | BPF_K */
9472         {
9473                 "JMP_JLE_K: if (2 <= 3) return 1",
9474                 .u.insns_int = {
9475                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9476                         BPF_LD_IMM64(R1, 2),
9477                         BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
9478                         BPF_EXIT_INSN(),
9479                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9480                         BPF_EXIT_INSN(),
9481                 },
9482                 INTERNAL,
9483                 { },
9484                 { { 0, 1 } },
9485         },
9486         /* BPF_JMP | BPF_JGT | BPF_K jump backwards */
9487         {
9488                 "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
9489                 .u.insns_int = {
9490                         BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
9491                         BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
9492                         BPF_EXIT_INSN(),
9493                         BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
9494                         BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
9495                         BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
9496                         BPF_EXIT_INSN(),
9497                 },
9498                 INTERNAL,
9499                 { },
9500                 { { 0, 1 } },
9501         },
9502         {
9503                 "JMP_JGE_K: if (3 >= 3) return 1",
9504                 .u.insns_int = {
9505                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9506                         BPF_LD_IMM64(R1, 3),
9507                         BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
9508                         BPF_EXIT_INSN(),
9509                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9510                         BPF_EXIT_INSN(),
9511                 },
9512                 INTERNAL,
9513                 { },
9514                 { { 0, 1 } },
9515         },
9516         /* BPF_JMP | BPF_JLT | BPF_K jump backwards */
9517         {
9518                 "JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
9519                 .u.insns_int = {
9520                         BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
9521                         BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
9522                         BPF_EXIT_INSN(),
9523                         BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
9524                         BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
9525                         BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
9526                         BPF_EXIT_INSN(),
9527                 },
9528                 INTERNAL,
9529                 { },
9530                 { { 0, 1 } },
9531         },
9532         {
9533                 "JMP_JLE_K: if (3 <= 3) return 1",
9534                 .u.insns_int = {
9535                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9536                         BPF_LD_IMM64(R1, 3),
9537                         BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
9538                         BPF_EXIT_INSN(),
9539                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9540                         BPF_EXIT_INSN(),
9541                 },
9542                 INTERNAL,
9543                 { },
9544                 { { 0, 1 } },
9545         },
9546         /* BPF_JMP | BPF_JNE | BPF_K */
9547         {
9548                 "JMP_JNE_K: if (3 != 2) return 1",
9549                 .u.insns_int = {
9550                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9551                         BPF_LD_IMM64(R1, 3),
9552                         BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
9553                         BPF_EXIT_INSN(),
9554                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9555                         BPF_EXIT_INSN(),
9556                 },
9557                 INTERNAL,
9558                 { },
9559                 { { 0, 1 } },
9560         },
9561         /* BPF_JMP | BPF_JEQ | BPF_K */
9562         {
9563                 "JMP_JEQ_K: if (3 == 3) return 1",
9564                 .u.insns_int = {
9565                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9566                         BPF_LD_IMM64(R1, 3),
9567                         BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
9568                         BPF_EXIT_INSN(),
9569                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9570                         BPF_EXIT_INSN(),
9571                 },
9572                 INTERNAL,
9573                 { },
9574                 { { 0, 1 } },
9575         },
9576         /* BPF_JMP | BPF_JSET | BPF_K */
9577         {
9578                 "JMP_JSET_K: if (0x3 & 0x2) return 1",
9579                 .u.insns_int = {
9580                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9581                         BPF_LD_IMM64(R1, 3),
9582                         BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
9583                         BPF_EXIT_INSN(),
9584                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9585                         BPF_EXIT_INSN(),
9586                 },
9587                 INTERNAL,
9588                 { },
9589                 { { 0, 1 } },
9590         },
9591         {
9592                 "JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
9593                 .u.insns_int = {
9594                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9595                         BPF_LD_IMM64(R1, 3),
9596                         BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
9597                         BPF_EXIT_INSN(),
9598                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9599                         BPF_EXIT_INSN(),
9600                 },
9601                 INTERNAL,
9602                 { },
9603                 { { 0, 1 } },
9604         },
9605         /* BPF_JMP | BPF_JSGT | BPF_X */
9606         {
9607                 "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
9608                 .u.insns_int = {
9609                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9610                         BPF_LD_IMM64(R1, -1),
9611                         BPF_LD_IMM64(R2, -2),
9612                         BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
9613                         BPF_EXIT_INSN(),
9614                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9615                         BPF_EXIT_INSN(),
9616                 },
9617                 INTERNAL,
9618                 { },
9619                 { { 0, 1 } },
9620         },
9621         {
9622                 "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
9623                 .u.insns_int = {
9624                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9625                         BPF_LD_IMM64(R1, -1),
9626                         BPF_LD_IMM64(R2, -1),
9627                         BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
9628                         BPF_EXIT_INSN(),
9629                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9630                         BPF_EXIT_INSN(),
9631                 },
9632                 INTERNAL,
9633                 { },
9634                 { { 0, 1 } },
9635         },
9636         /* BPF_JMP | BPF_JSLT | BPF_X */
9637         {
9638                 "JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
9639                 .u.insns_int = {
9640                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9641                         BPF_LD_IMM64(R1, -1),
9642                         BPF_LD_IMM64(R2, -2),
9643                         BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
9644                         BPF_EXIT_INSN(),
9645                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9646                         BPF_EXIT_INSN(),
9647                 },
9648                 INTERNAL,
9649                 { },
9650                 { { 0, 1 } },
9651         },
9652         {
9653                 "JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
9654                 .u.insns_int = {
9655                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9656                         BPF_LD_IMM64(R1, -1),
9657                         BPF_LD_IMM64(R2, -1),
9658                         BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
9659                         BPF_EXIT_INSN(),
9660                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9661                         BPF_EXIT_INSN(),
9662                 },
9663                 INTERNAL,
9664                 { },
9665                 { { 0, 1 } },
9666         },
9667         /* BPF_JMP | BPF_JSGE | BPF_X */
9668         {
9669                 "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
9670                 .u.insns_int = {
9671                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9672                         BPF_LD_IMM64(R1, -1),
9673                         BPF_LD_IMM64(R2, -2),
9674                         BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
9675                         BPF_EXIT_INSN(),
9676                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9677                         BPF_EXIT_INSN(),
9678                 },
9679                 INTERNAL,
9680                 { },
9681                 { { 0, 1 } },
9682         },
9683         {
9684                 "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
9685                 .u.insns_int = {
9686                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9687                         BPF_LD_IMM64(R1, -1),
9688                         BPF_LD_IMM64(R2, -1),
9689                         BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
9690                         BPF_EXIT_INSN(),
9691                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9692                         BPF_EXIT_INSN(),
9693                 },
9694                 INTERNAL,
9695                 { },
9696                 { { 0, 1 } },
9697         },
9698         /* BPF_JMP | BPF_JSLE | BPF_X */
9699         {
9700                 "JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
9701                 .u.insns_int = {
9702                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9703                         BPF_LD_IMM64(R1, -1),
9704                         BPF_LD_IMM64(R2, -2),
9705                         BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
9706                         BPF_EXIT_INSN(),
9707                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9708                         BPF_EXIT_INSN(),
9709                 },
9710                 INTERNAL,
9711                 { },
9712                 { { 0, 1 } },
9713         },
9714         {
9715                 "JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
9716                 .u.insns_int = {
9717                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9718                         BPF_LD_IMM64(R1, -1),
9719                         BPF_LD_IMM64(R2, -1),
9720                         BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
9721                         BPF_EXIT_INSN(),
9722                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9723                         BPF_EXIT_INSN(),
9724                 },
9725                 INTERNAL,
9726                 { },
9727                 { { 0, 1 } },
9728         },
9729         /* BPF_JMP | BPF_JGT | BPF_X */
9730         {
9731                 "JMP_JGT_X: if (3 > 2) return 1",
9732                 .u.insns_int = {
9733                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9734                         BPF_LD_IMM64(R1, 3),
9735                         BPF_LD_IMM64(R2, 2),
9736                         BPF_JMP_REG(BPF_JGT, R1, R2, 1),
9737                         BPF_EXIT_INSN(),
9738                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9739                         BPF_EXIT_INSN(),
9740                 },
9741                 INTERNAL,
9742                 { },
9743                 { { 0, 1 } },
9744         },
9745         {
9746                 "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
9747                 .u.insns_int = {
9748                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9749                         BPF_LD_IMM64(R1, -1),
9750                         BPF_LD_IMM64(R2, 1),
9751                         BPF_JMP_REG(BPF_JGT, R1, R2, 1),
9752                         BPF_EXIT_INSN(),
9753                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9754                         BPF_EXIT_INSN(),
9755                 },
9756                 INTERNAL,
9757                 { },
9758                 { { 0, 1 } },
9759         },
9760         /* BPF_JMP | BPF_JLT | BPF_X */
9761         {
9762                 "JMP_JLT_X: if (2 < 3) return 1",
9763                 .u.insns_int = {
9764                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9765                         BPF_LD_IMM64(R1, 3),
9766                         BPF_LD_IMM64(R2, 2),
9767                         BPF_JMP_REG(BPF_JLT, R2, R1, 1),
9768                         BPF_EXIT_INSN(),
9769                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9770                         BPF_EXIT_INSN(),
9771                 },
9772                 INTERNAL,
9773                 { },
9774                 { { 0, 1 } },
9775         },
9776         {
9777                 "JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
9778                 .u.insns_int = {
9779                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9780                         BPF_LD_IMM64(R1, -1),
9781                         BPF_LD_IMM64(R2, 1),
9782                         BPF_JMP_REG(BPF_JLT, R2, R1, 1),
9783                         BPF_EXIT_INSN(),
9784                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9785                         BPF_EXIT_INSN(),
9786                 },
9787                 INTERNAL,
9788                 { },
9789                 { { 0, 1 } },
9790         },
9791         /* BPF_JMP | BPF_JGE | BPF_X */
9792         {
9793                 "JMP_JGE_X: if (3 >= 2) return 1",
9794                 .u.insns_int = {
9795                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9796                         BPF_LD_IMM64(R1, 3),
9797                         BPF_LD_IMM64(R2, 2),
9798                         BPF_JMP_REG(BPF_JGE, R1, R2, 1),
9799                         BPF_EXIT_INSN(),
9800                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9801                         BPF_EXIT_INSN(),
9802                 },
9803                 INTERNAL,
9804                 { },
9805                 { { 0, 1 } },
9806         },
9807         {
9808                 "JMP_JGE_X: if (3 >= 3) return 1",
9809                 .u.insns_int = {
9810                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9811                         BPF_LD_IMM64(R1, 3),
9812                         BPF_LD_IMM64(R2, 3),
9813                         BPF_JMP_REG(BPF_JGE, R1, R2, 1),
9814                         BPF_EXIT_INSN(),
9815                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9816                         BPF_EXIT_INSN(),
9817                 },
9818                 INTERNAL,
9819                 { },
9820                 { { 0, 1 } },
9821         },
9822         /* BPF_JMP | BPF_JLE | BPF_X */
9823         {
9824                 "JMP_JLE_X: if (2 <= 3) return 1",
9825                 .u.insns_int = {
9826                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9827                         BPF_LD_IMM64(R1, 3),
9828                         BPF_LD_IMM64(R2, 2),
9829                         BPF_JMP_REG(BPF_JLE, R2, R1, 1),
9830                         BPF_EXIT_INSN(),
9831                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9832                         BPF_EXIT_INSN(),
9833                 },
9834                 INTERNAL,
9835                 { },
9836                 { { 0, 1 } },
9837         },
9838         {
9839                 "JMP_JLE_X: if (3 <= 3) return 1",
9840                 .u.insns_int = {
9841                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9842                         BPF_LD_IMM64(R1, 3),
9843                         BPF_LD_IMM64(R2, 3),
9844                         BPF_JMP_REG(BPF_JLE, R1, R2, 1),
9845                         BPF_EXIT_INSN(),
9846                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9847                         BPF_EXIT_INSN(),
9848                 },
9849                 INTERNAL,
9850                 { },
9851                 { { 0, 1 } },
9852         },
9853         {
9854                 /* Mainly testing JIT + imm64 here. */
9855                 "JMP_JGE_X: ldimm64 test 1",
9856                 .u.insns_int = {
9857                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9858                         BPF_LD_IMM64(R1, 3),
9859                         BPF_LD_IMM64(R2, 2),
9860                         BPF_JMP_REG(BPF_JGE, R1, R2, 2),
9861                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9862                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
9863                         BPF_EXIT_INSN(),
9864                 },
9865                 INTERNAL,
9866                 { },
9867                 { { 0, 0xeeeeeeeeU } },
9868         },
9869         {
9870                 "JMP_JGE_X: ldimm64 test 2",
9871                 .u.insns_int = {
9872                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9873                         BPF_LD_IMM64(R1, 3),
9874                         BPF_LD_IMM64(R2, 2),
9875                         BPF_JMP_REG(BPF_JGE, R1, R2, 0),
9876                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9877                         BPF_EXIT_INSN(),
9878                 },
9879                 INTERNAL,
9880                 { },
9881                 { { 0, 0xffffffffU } },
9882         },
9883         {
9884                 "JMP_JGE_X: ldimm64 test 3",
9885                 .u.insns_int = {
9886                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9887                         BPF_LD_IMM64(R1, 3),
9888                         BPF_LD_IMM64(R2, 2),
9889                         BPF_JMP_REG(BPF_JGE, R1, R2, 4),
9890                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9891                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
9892                         BPF_EXIT_INSN(),
9893                 },
9894                 INTERNAL,
9895                 { },
9896                 { { 0, 1 } },
9897         },
9898         {
9899                 "JMP_JLE_X: ldimm64 test 1",
9900                 .u.insns_int = {
9901                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9902                         BPF_LD_IMM64(R1, 3),
9903                         BPF_LD_IMM64(R2, 2),
9904                         BPF_JMP_REG(BPF_JLE, R2, R1, 2),
9905                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9906                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
9907                         BPF_EXIT_INSN(),
9908                 },
9909                 INTERNAL,
9910                 { },
9911                 { { 0, 0xeeeeeeeeU } },
9912         },
9913         {
9914                 "JMP_JLE_X: ldimm64 test 2",
9915                 .u.insns_int = {
9916                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9917                         BPF_LD_IMM64(R1, 3),
9918                         BPF_LD_IMM64(R2, 2),
9919                         BPF_JMP_REG(BPF_JLE, R2, R1, 0),
9920                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9921                         BPF_EXIT_INSN(),
9922                 },
9923                 INTERNAL,
9924                 { },
9925                 { { 0, 0xffffffffU } },
9926         },
9927         {
9928                 "JMP_JLE_X: ldimm64 test 3",
9929                 .u.insns_int = {
9930                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9931                         BPF_LD_IMM64(R1, 3),
9932                         BPF_LD_IMM64(R2, 2),
9933                         BPF_JMP_REG(BPF_JLE, R2, R1, 4),
9934                         BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
9935                         BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
9936                         BPF_EXIT_INSN(),
9937                 },
9938                 INTERNAL,
9939                 { },
9940                 { { 0, 1 } },
9941         },
9942         /* BPF_JMP | BPF_JNE | BPF_X */
9943         {
9944                 "JMP_JNE_X: if (3 != 2) return 1",
9945                 .u.insns_int = {
9946                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9947                         BPF_LD_IMM64(R1, 3),
9948                         BPF_LD_IMM64(R2, 2),
9949                         BPF_JMP_REG(BPF_JNE, R1, R2, 1),
9950                         BPF_EXIT_INSN(),
9951                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9952                         BPF_EXIT_INSN(),
9953                 },
9954                 INTERNAL,
9955                 { },
9956                 { { 0, 1 } },
9957         },
9958         /* BPF_JMP | BPF_JEQ | BPF_X */
9959         {
9960                 "JMP_JEQ_X: if (3 == 3) return 1",
9961                 .u.insns_int = {
9962                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9963                         BPF_LD_IMM64(R1, 3),
9964                         BPF_LD_IMM64(R2, 3),
9965                         BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
9966                         BPF_EXIT_INSN(),
9967                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9968                         BPF_EXIT_INSN(),
9969                 },
9970                 INTERNAL,
9971                 { },
9972                 { { 0, 1 } },
9973         },
9974         /* BPF_JMP | BPF_JSET | BPF_X */
9975         {
9976                 "JMP_JSET_X: if (0x3 & 0x2) return 1",
9977                 .u.insns_int = {
9978                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9979                         BPF_LD_IMM64(R1, 3),
9980                         BPF_LD_IMM64(R2, 2),
9981                         BPF_JMP_REG(BPF_JSET, R1, R2, 1),
9982                         BPF_EXIT_INSN(),
9983                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9984                         BPF_EXIT_INSN(),
9985                 },
9986                 INTERNAL,
9987                 { },
9988                 { { 0, 1 } },
9989         },
9990         {
9991                 "JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
9992                 .u.insns_int = {
9993                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
9994                         BPF_LD_IMM64(R1, 3),
9995                         BPF_LD_IMM64(R2, 0xffffffff),
9996                         BPF_JMP_REG(BPF_JSET, R1, R2, 1),
9997                         BPF_EXIT_INSN(),
9998                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
9999                         BPF_EXIT_INSN(),
10000                 },
10001                 INTERNAL,
10002                 { },
10003                 { { 0, 1 } },
10004         },
10005         {
10006                 "JMP_JA: Jump, gap, jump, ...",
10007                 { },
10008                 CLASSIC | FLAG_NO_DATA,
10009                 { },
10010                 { { 0, 0xababcbac } },
10011                 .fill_helper = bpf_fill_ja,
10012         },
10013         {       /* Mainly checking JIT here. */
10014                 "BPF_MAXINSNS: Maximum possible literals",
10015                 { },
10016                 CLASSIC | FLAG_NO_DATA,
10017                 { },
10018                 { { 0, 0xffffffff } },
10019                 .fill_helper = bpf_fill_maxinsns1,
10020         },
10021         {       /* Mainly checking JIT here. */
10022                 "BPF_MAXINSNS: Single literal",
10023                 { },
10024                 CLASSIC | FLAG_NO_DATA,
10025                 { },
10026                 { { 0, 0xfefefefe } },
10027                 .fill_helper = bpf_fill_maxinsns2,
10028         },
10029         {       /* Mainly checking JIT here. */
10030                 "BPF_MAXINSNS: Run/add until end",
10031                 { },
10032                 CLASSIC | FLAG_NO_DATA,
10033                 { },
10034                 { { 0, 0x947bf368 } },
10035                 .fill_helper = bpf_fill_maxinsns3,
10036         },
10037         {
10038                 "BPF_MAXINSNS: Too many instructions",
10039                 { },
10040                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
10041                 { },
10042                 { },
10043                 .fill_helper = bpf_fill_maxinsns4,
10044                 .expected_errcode = -EINVAL,
10045         },
10046         {       /* Mainly checking JIT here. */
10047                 "BPF_MAXINSNS: Very long jump",
10048                 { },
10049                 CLASSIC | FLAG_NO_DATA,
10050                 { },
10051                 { { 0, 0xabababab } },
10052                 .fill_helper = bpf_fill_maxinsns5,
10053         },
10054         {       /* Mainly checking JIT here. */
10055                 "BPF_MAXINSNS: Ctx heavy transformations",
10056                 { },
10057                 CLASSIC,
10058                 { },
10059                 {
10060                         {  1, SKB_VLAN_PRESENT },
10061                         { 10, SKB_VLAN_PRESENT }
10062                 },
10063                 .fill_helper = bpf_fill_maxinsns6,
10064         },
10065         {       /* Mainly checking JIT here. */
10066                 "BPF_MAXINSNS: Call heavy transformations",
10067                 { },
10068                 CLASSIC | FLAG_NO_DATA,
10069                 { },
10070                 { { 1, 0 }, { 10, 0 } },
10071                 .fill_helper = bpf_fill_maxinsns7,
10072         },
10073         {       /* Mainly checking JIT here. */
10074                 "BPF_MAXINSNS: Jump heavy test",
10075                 { },
10076                 CLASSIC | FLAG_NO_DATA,
10077                 { },
10078                 { { 0, 0xffffffff } },
10079                 .fill_helper = bpf_fill_maxinsns8,
10080         },
10081         {       /* Mainly checking JIT here. */
10082                 "BPF_MAXINSNS: Very long jump backwards",
10083                 { },
10084                 INTERNAL | FLAG_NO_DATA,
10085                 { },
10086                 { { 0, 0xcbababab } },
10087                 .fill_helper = bpf_fill_maxinsns9,
10088         },
10089         {       /* Mainly checking JIT here. */
10090                 "BPF_MAXINSNS: Edge hopping nuthouse",
10091                 { },
10092                 INTERNAL | FLAG_NO_DATA,
10093                 { },
10094                 { { 0, 0xabababac } },
10095                 .fill_helper = bpf_fill_maxinsns10,
10096         },
10097         {
10098                 "BPF_MAXINSNS: Jump, gap, jump, ...",
10099                 { },
10100                 CLASSIC | FLAG_NO_DATA,
10101                 { },
10102                 { { 0, 0xababcbac } },
10103                 .fill_helper = bpf_fill_maxinsns11,
10104         },
10105         {
10106                 "BPF_MAXINSNS: jump over MSH",
10107                 { },
10108                 CLASSIC | FLAG_EXPECTED_FAIL,
10109                 { 0xfa, 0xfb, 0xfc, 0xfd, },
10110                 { { 4, 0xabababab } },
10111                 .fill_helper = bpf_fill_maxinsns12,
10112                 .expected_errcode = -EINVAL,
10113         },
10114         {
10115                 "BPF_MAXINSNS: exec all MSH",
10116                 { },
10117                 CLASSIC,
10118                 { 0xfa, 0xfb, 0xfc, 0xfd, },
10119                 { { 4, 0xababab83 } },
10120                 .fill_helper = bpf_fill_maxinsns13,
10121         },
10122         {
10123                 "BPF_MAXINSNS: ld_abs+get_processor_id",
10124                 { },
10125                 CLASSIC,
10126                 { },
10127                 { { 1, 0xbee } },
10128                 .fill_helper = bpf_fill_ld_abs_get_processor_id,
10129         },
10130         /*
10131          * LD_IND / LD_ABS on fragmented SKBs
10132          */
10133         {
10134                 "LD_IND byte frag",
10135                 .u.insns = {
10136                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10137                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
10138                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10139                 },
10140                 CLASSIC | FLAG_SKB_FRAG,
10141                 { },
10142                 { {0x40, 0x42} },
10143                 .frag_data = {
10144                         0x42, 0x00, 0x00, 0x00,
10145                         0x43, 0x44, 0x00, 0x00,
10146                         0x21, 0x07, 0x19, 0x83,
10147                 },
10148         },
10149         {
10150                 "LD_IND halfword frag",
10151                 .u.insns = {
10152                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10153                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
10154                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10155                 },
10156                 CLASSIC | FLAG_SKB_FRAG,
10157                 { },
10158                 { {0x40, 0x4344} },
10159                 .frag_data = {
10160                         0x42, 0x00, 0x00, 0x00,
10161                         0x43, 0x44, 0x00, 0x00,
10162                         0x21, 0x07, 0x19, 0x83,
10163                 },
10164         },
10165         {
10166                 "LD_IND word frag",
10167                 .u.insns = {
10168                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10169                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
10170                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10171                 },
10172                 CLASSIC | FLAG_SKB_FRAG,
10173                 { },
10174                 { {0x40, 0x21071983} },
10175                 .frag_data = {
10176                         0x42, 0x00, 0x00, 0x00,
10177                         0x43, 0x44, 0x00, 0x00,
10178                         0x21, 0x07, 0x19, 0x83,
10179                 },
10180         },
10181         {
10182                 "LD_IND halfword mixed head/frag",
10183                 .u.insns = {
10184                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10185                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
10186                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10187                 },
10188                 CLASSIC | FLAG_SKB_FRAG,
10189                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10190                 { {0x40, 0x0519} },
10191                 .frag_data = { 0x19, 0x82 },
10192         },
10193         {
10194                 "LD_IND word mixed head/frag",
10195                 .u.insns = {
10196                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
10197                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
10198                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10199                 },
10200                 CLASSIC | FLAG_SKB_FRAG,
10201                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10202                 { {0x40, 0x25051982} },
10203                 .frag_data = { 0x19, 0x82 },
10204         },
10205         {
10206                 "LD_ABS byte frag",
10207                 .u.insns = {
10208                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
10209                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10210                 },
10211                 CLASSIC | FLAG_SKB_FRAG,
10212                 { },
10213                 { {0x40, 0x42} },
10214                 .frag_data = {
10215                         0x42, 0x00, 0x00, 0x00,
10216                         0x43, 0x44, 0x00, 0x00,
10217                         0x21, 0x07, 0x19, 0x83,
10218                 },
10219         },
10220         {
10221                 "LD_ABS halfword frag",
10222                 .u.insns = {
10223                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
10224                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10225                 },
10226                 CLASSIC | FLAG_SKB_FRAG,
10227                 { },
10228                 { {0x40, 0x4344} },
10229                 .frag_data = {
10230                         0x42, 0x00, 0x00, 0x00,
10231                         0x43, 0x44, 0x00, 0x00,
10232                         0x21, 0x07, 0x19, 0x83,
10233                 },
10234         },
10235         {
10236                 "LD_ABS word frag",
10237                 .u.insns = {
10238                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
10239                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10240                 },
10241                 CLASSIC | FLAG_SKB_FRAG,
10242                 { },
10243                 { {0x40, 0x21071983} },
10244                 .frag_data = {
10245                         0x42, 0x00, 0x00, 0x00,
10246                         0x43, 0x44, 0x00, 0x00,
10247                         0x21, 0x07, 0x19, 0x83,
10248                 },
10249         },
10250         {
10251                 "LD_ABS halfword mixed head/frag",
10252                 .u.insns = {
10253                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
10254                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10255                 },
10256                 CLASSIC | FLAG_SKB_FRAG,
10257                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10258                 { {0x40, 0x0519} },
10259                 .frag_data = { 0x19, 0x82 },
10260         },
10261         {
10262                 "LD_ABS word mixed head/frag",
10263                 .u.insns = {
10264                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
10265                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10266                 },
10267                 CLASSIC | FLAG_SKB_FRAG,
10268                 { [0x3e] = 0x25, [0x3f] = 0x05, },
10269                 { {0x40, 0x25051982} },
10270                 .frag_data = { 0x19, 0x82 },
10271         },
10272         /*
10273          * LD_IND / LD_ABS on non fragmented SKBs
10274          */
10275         {
10276                 /*
10277                  * this tests that the JIT/interpreter correctly resets X
10278                  * before using it in an LD_IND instruction.
10279                  */
10280                 "LD_IND byte default X",
10281                 .u.insns = {
10282                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10283                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10284                 },
10285                 CLASSIC,
10286                 { [0x1] = 0x42 },
10287                 { {0x40, 0x42 } },
10288         },
10289         {
10290                 "LD_IND byte positive offset",
10291                 .u.insns = {
10292                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10293                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10294                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10295                 },
10296                 CLASSIC,
10297                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10298                 { {0x40, 0x82 } },
10299         },
10300         {
10301                 "LD_IND byte negative offset",
10302                 .u.insns = {
10303                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10304                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
10305                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10306                 },
10307                 CLASSIC,
10308                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10309                 { {0x40, 0x05 } },
10310         },
10311         {
10312                 "LD_IND byte positive offset, all ff",
10313                 .u.insns = {
10314                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10315                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10316                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10317                 },
10318                 CLASSIC,
10319                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10320                 { {0x40, 0xff } },
10321         },
10322         {
10323                 "LD_IND byte positive offset, out of bounds",
10324                 .u.insns = {
10325                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10326                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
10327                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10328                 },
10329                 CLASSIC,
10330                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10331                 { {0x3f, 0 }, },
10332         },
10333         {
10334                 "LD_IND byte negative offset, out of bounds",
10335                 .u.insns = {
10336                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10337                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
10338                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10339                 },
10340                 CLASSIC,
10341                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10342                 { {0x3f, 0 } },
10343         },
10344         {
10345                 "LD_IND byte negative offset, multiple calls",
10346                 .u.insns = {
10347                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
10348                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
10349                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
10350                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
10351                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
10352                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10353                 },
10354                 CLASSIC,
10355                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10356                 { {0x40, 0x82 }, },
10357         },
10358         {
10359                 "LD_IND halfword positive offset",
10360                 .u.insns = {
10361                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10362                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
10363                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10364                 },
10365                 CLASSIC,
10366                 {
10367                         [0x1c] = 0xaa, [0x1d] = 0x55,
10368                         [0x1e] = 0xbb, [0x1f] = 0x66,
10369                         [0x20] = 0xcc, [0x21] = 0x77,
10370                         [0x22] = 0xdd, [0x23] = 0x88,
10371                 },
10372                 { {0x40, 0xdd88 } },
10373         },
10374         {
10375                 "LD_IND halfword negative offset",
10376                 .u.insns = {
10377                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10378                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
10379                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10380                 },
10381                 CLASSIC,
10382                 {
10383                         [0x1c] = 0xaa, [0x1d] = 0x55,
10384                         [0x1e] = 0xbb, [0x1f] = 0x66,
10385                         [0x20] = 0xcc, [0x21] = 0x77,
10386                         [0x22] = 0xdd, [0x23] = 0x88,
10387                 },
10388                 { {0x40, 0xbb66 } },
10389         },
10390         {
10391                 "LD_IND halfword unaligned",
10392                 .u.insns = {
10393                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10394                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
10395                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10396                 },
10397                 CLASSIC,
10398                 {
10399                         [0x1c] = 0xaa, [0x1d] = 0x55,
10400                         [0x1e] = 0xbb, [0x1f] = 0x66,
10401                         [0x20] = 0xcc, [0x21] = 0x77,
10402                         [0x22] = 0xdd, [0x23] = 0x88,
10403                 },
10404                 { {0x40, 0x66cc } },
10405         },
10406         {
10407                 "LD_IND halfword positive offset, all ff",
10408                 .u.insns = {
10409                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
10410                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
10411                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10412                 },
10413                 CLASSIC,
10414                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10415                 { {0x40, 0xffff } },
10416         },
10417         {
10418                 "LD_IND halfword positive offset, out of bounds",
10419                 .u.insns = {
10420                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10421                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
10422                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10423                 },
10424                 CLASSIC,
10425                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10426                 { {0x3f, 0 }, },
10427         },
10428         {
10429                 "LD_IND halfword negative offset, out of bounds",
10430                 .u.insns = {
10431                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10432                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
10433                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10434                 },
10435                 CLASSIC,
10436                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10437                 { {0x3f, 0 } },
10438         },
10439         {
10440                 "LD_IND word positive offset",
10441                 .u.insns = {
10442                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10443                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
10444                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10445                 },
10446                 CLASSIC,
10447                 {
10448                         [0x1c] = 0xaa, [0x1d] = 0x55,
10449                         [0x1e] = 0xbb, [0x1f] = 0x66,
10450                         [0x20] = 0xcc, [0x21] = 0x77,
10451                         [0x22] = 0xdd, [0x23] = 0x88,
10452                         [0x24] = 0xee, [0x25] = 0x99,
10453                         [0x26] = 0xff, [0x27] = 0xaa,
10454                 },
10455                 { {0x40, 0xee99ffaa } },
10456         },
10457         {
10458                 "LD_IND word negative offset",
10459                 .u.insns = {
10460                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10461                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
10462                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10463                 },
10464                 CLASSIC,
10465                 {
10466                         [0x1c] = 0xaa, [0x1d] = 0x55,
10467                         [0x1e] = 0xbb, [0x1f] = 0x66,
10468                         [0x20] = 0xcc, [0x21] = 0x77,
10469                         [0x22] = 0xdd, [0x23] = 0x88,
10470                         [0x24] = 0xee, [0x25] = 0x99,
10471                         [0x26] = 0xff, [0x27] = 0xaa,
10472                 },
10473                 { {0x40, 0xaa55bb66 } },
10474         },
10475         {
10476                 "LD_IND word unaligned (addr & 3 == 2)",
10477                 .u.insns = {
10478                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10479                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
10480                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10481                 },
10482                 CLASSIC,
10483                 {
10484                         [0x1c] = 0xaa, [0x1d] = 0x55,
10485                         [0x1e] = 0xbb, [0x1f] = 0x66,
10486                         [0x20] = 0xcc, [0x21] = 0x77,
10487                         [0x22] = 0xdd, [0x23] = 0x88,
10488                         [0x24] = 0xee, [0x25] = 0x99,
10489                         [0x26] = 0xff, [0x27] = 0xaa,
10490                 },
10491                 { {0x40, 0xbb66cc77 } },
10492         },
10493         {
10494                 "LD_IND word unaligned (addr & 3 == 1)",
10495                 .u.insns = {
10496                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10497                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
10498                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10499                 },
10500                 CLASSIC,
10501                 {
10502                         [0x1c] = 0xaa, [0x1d] = 0x55,
10503                         [0x1e] = 0xbb, [0x1f] = 0x66,
10504                         [0x20] = 0xcc, [0x21] = 0x77,
10505                         [0x22] = 0xdd, [0x23] = 0x88,
10506                         [0x24] = 0xee, [0x25] = 0x99,
10507                         [0x26] = 0xff, [0x27] = 0xaa,
10508                 },
10509                 { {0x40, 0x55bb66cc } },
10510         },
10511         {
10512                 "LD_IND word unaligned (addr & 3 == 3)",
10513                 .u.insns = {
10514                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
10515                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
10516                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10517                 },
10518                 CLASSIC,
10519                 {
10520                         [0x1c] = 0xaa, [0x1d] = 0x55,
10521                         [0x1e] = 0xbb, [0x1f] = 0x66,
10522                         [0x20] = 0xcc, [0x21] = 0x77,
10523                         [0x22] = 0xdd, [0x23] = 0x88,
10524                         [0x24] = 0xee, [0x25] = 0x99,
10525                         [0x26] = 0xff, [0x27] = 0xaa,
10526                 },
10527                 { {0x40, 0x66cc77dd } },
10528         },
10529         {
10530                 "LD_IND word positive offset, all ff",
10531                 .u.insns = {
10532                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
10533                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
10534                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10535                 },
10536                 CLASSIC,
10537                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10538                 { {0x40, 0xffffffff } },
10539         },
10540         {
10541                 "LD_IND word positive offset, out of bounds",
10542                 .u.insns = {
10543                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10544                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
10545                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10546                 },
10547                 CLASSIC,
10548                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10549                 { {0x3f, 0 }, },
10550         },
10551         {
10552                 "LD_IND word negative offset, out of bounds",
10553                 .u.insns = {
10554                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
10555                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
10556                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10557                 },
10558                 CLASSIC,
10559                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10560                 { {0x3f, 0 } },
10561         },
10562         {
10563                 "LD_ABS byte",
10564                 .u.insns = {
10565                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
10566                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10567                 },
10568                 CLASSIC,
10569                 {
10570                         [0x1c] = 0xaa, [0x1d] = 0x55,
10571                         [0x1e] = 0xbb, [0x1f] = 0x66,
10572                         [0x20] = 0xcc, [0x21] = 0x77,
10573                         [0x22] = 0xdd, [0x23] = 0x88,
10574                         [0x24] = 0xee, [0x25] = 0x99,
10575                         [0x26] = 0xff, [0x27] = 0xaa,
10576                 },
10577                 { {0x40, 0xcc } },
10578         },
10579         {
10580                 "LD_ABS byte positive offset, all ff",
10581                 .u.insns = {
10582                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
10583                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10584                 },
10585                 CLASSIC,
10586                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10587                 { {0x40, 0xff } },
10588         },
10589         {
10590                 "LD_ABS byte positive offset, out of bounds",
10591                 .u.insns = {
10592                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
10593                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10594                 },
10595                 CLASSIC,
10596                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10597                 { {0x3f, 0 }, },
10598         },
10599         {
10600                 "LD_ABS byte negative offset, out of bounds load",
10601                 .u.insns = {
10602                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
10603                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10604                 },
10605                 CLASSIC | FLAG_EXPECTED_FAIL,
10606                 .expected_errcode = -EINVAL,
10607         },
10608         {
10609                 "LD_ABS byte negative offset, in bounds",
10610                 .u.insns = {
10611                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
10612                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10613                 },
10614                 CLASSIC,
10615                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10616                 { {0x40, 0x82 }, },
10617         },
10618         {
10619                 "LD_ABS byte negative offset, out of bounds",
10620                 .u.insns = {
10621                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
10622                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10623                 },
10624                 CLASSIC,
10625                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10626                 { {0x3f, 0 }, },
10627         },
10628         {
10629                 "LD_ABS byte negative offset, multiple calls",
10630                 .u.insns = {
10631                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
10632                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
10633                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
10634                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
10635                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10636                 },
10637                 CLASSIC,
10638                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10639                 { {0x40, 0x82 }, },
10640         },
10641         {
10642                 "LD_ABS halfword",
10643                 .u.insns = {
10644                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
10645                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10646                 },
10647                 CLASSIC,
10648                 {
10649                         [0x1c] = 0xaa, [0x1d] = 0x55,
10650                         [0x1e] = 0xbb, [0x1f] = 0x66,
10651                         [0x20] = 0xcc, [0x21] = 0x77,
10652                         [0x22] = 0xdd, [0x23] = 0x88,
10653                         [0x24] = 0xee, [0x25] = 0x99,
10654                         [0x26] = 0xff, [0x27] = 0xaa,
10655                 },
10656                 { {0x40, 0xdd88 } },
10657         },
10658         {
10659                 "LD_ABS halfword unaligned",
10660                 .u.insns = {
10661                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
10662                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10663                 },
10664                 CLASSIC,
10665                 {
10666                         [0x1c] = 0xaa, [0x1d] = 0x55,
10667                         [0x1e] = 0xbb, [0x1f] = 0x66,
10668                         [0x20] = 0xcc, [0x21] = 0x77,
10669                         [0x22] = 0xdd, [0x23] = 0x88,
10670                         [0x24] = 0xee, [0x25] = 0x99,
10671                         [0x26] = 0xff, [0x27] = 0xaa,
10672                 },
10673                 { {0x40, 0x99ff } },
10674         },
10675         {
10676                 "LD_ABS halfword positive offset, all ff",
10677                 .u.insns = {
10678                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
10679                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10680                 },
10681                 CLASSIC,
10682                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10683                 { {0x40, 0xffff } },
10684         },
10685         {
10686                 "LD_ABS halfword positive offset, out of bounds",
10687                 .u.insns = {
10688                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
10689                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10690                 },
10691                 CLASSIC,
10692                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10693                 { {0x3f, 0 }, },
10694         },
10695         {
10696                 "LD_ABS halfword negative offset, out of bounds load",
10697                 .u.insns = {
10698                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
10699                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10700                 },
10701                 CLASSIC | FLAG_EXPECTED_FAIL,
10702                 .expected_errcode = -EINVAL,
10703         },
10704         {
10705                 "LD_ABS halfword negative offset, in bounds",
10706                 .u.insns = {
10707                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
10708                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10709                 },
10710                 CLASSIC,
10711                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10712                 { {0x40, 0x1982 }, },
10713         },
10714         {
10715                 "LD_ABS halfword negative offset, out of bounds",
10716                 .u.insns = {
10717                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
10718                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10719                 },
10720                 CLASSIC,
10721                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10722                 { {0x3f, 0 }, },
10723         },
10724         {
10725                 "LD_ABS word",
10726                 .u.insns = {
10727                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
10728                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10729                 },
10730                 CLASSIC,
10731                 {
10732                         [0x1c] = 0xaa, [0x1d] = 0x55,
10733                         [0x1e] = 0xbb, [0x1f] = 0x66,
10734                         [0x20] = 0xcc, [0x21] = 0x77,
10735                         [0x22] = 0xdd, [0x23] = 0x88,
10736                         [0x24] = 0xee, [0x25] = 0x99,
10737                         [0x26] = 0xff, [0x27] = 0xaa,
10738                 },
10739                 { {0x40, 0xaa55bb66 } },
10740         },
10741         {
10742                 "LD_ABS word unaligned (addr & 3 == 2)",
10743                 .u.insns = {
10744                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
10745                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10746                 },
10747                 CLASSIC,
10748                 {
10749                         [0x1c] = 0xaa, [0x1d] = 0x55,
10750                         [0x1e] = 0xbb, [0x1f] = 0x66,
10751                         [0x20] = 0xcc, [0x21] = 0x77,
10752                         [0x22] = 0xdd, [0x23] = 0x88,
10753                         [0x24] = 0xee, [0x25] = 0x99,
10754                         [0x26] = 0xff, [0x27] = 0xaa,
10755                 },
10756                 { {0x40, 0xdd88ee99 } },
10757         },
10758         {
10759                 "LD_ABS word unaligned (addr & 3 == 1)",
10760                 .u.insns = {
10761                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
10762                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10763                 },
10764                 CLASSIC,
10765                 {
10766                         [0x1c] = 0xaa, [0x1d] = 0x55,
10767                         [0x1e] = 0xbb, [0x1f] = 0x66,
10768                         [0x20] = 0xcc, [0x21] = 0x77,
10769                         [0x22] = 0xdd, [0x23] = 0x88,
10770                         [0x24] = 0xee, [0x25] = 0x99,
10771                         [0x26] = 0xff, [0x27] = 0xaa,
10772                 },
10773                 { {0x40, 0x77dd88ee } },
10774         },
10775         {
10776                 "LD_ABS word unaligned (addr & 3 == 3)",
10777                 .u.insns = {
10778                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
10779                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10780                 },
10781                 CLASSIC,
10782                 {
10783                         [0x1c] = 0xaa, [0x1d] = 0x55,
10784                         [0x1e] = 0xbb, [0x1f] = 0x66,
10785                         [0x20] = 0xcc, [0x21] = 0x77,
10786                         [0x22] = 0xdd, [0x23] = 0x88,
10787                         [0x24] = 0xee, [0x25] = 0x99,
10788                         [0x26] = 0xff, [0x27] = 0xaa,
10789                 },
10790                 { {0x40, 0x88ee99ff } },
10791         },
10792         {
10793                 "LD_ABS word positive offset, all ff",
10794                 .u.insns = {
10795                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
10796                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10797                 },
10798                 CLASSIC,
10799                 { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
10800                 { {0x40, 0xffffffff } },
10801         },
10802         {
10803                 "LD_ABS word positive offset, out of bounds",
10804                 .u.insns = {
10805                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
10806                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10807                 },
10808                 CLASSIC,
10809                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10810                 { {0x3f, 0 }, },
10811         },
10812         {
10813                 "LD_ABS word negative offset, out of bounds load",
10814                 .u.insns = {
10815                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
10816                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10817                 },
10818                 CLASSIC | FLAG_EXPECTED_FAIL,
10819                 .expected_errcode = -EINVAL,
10820         },
10821         {
10822                 "LD_ABS word negative offset, in bounds",
10823                 .u.insns = {
10824                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
10825                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10826                 },
10827                 CLASSIC,
10828                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10829                 { {0x40, 0x25051982 }, },
10830         },
10831         {
10832                 "LD_ABS word negative offset, out of bounds",
10833                 .u.insns = {
10834                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
10835                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10836                 },
10837                 CLASSIC,
10838                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10839                 { {0x3f, 0 }, },
10840         },
10841         {
10842                 "LDX_MSH standalone, preserved A",
10843                 .u.insns = {
10844                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
10845                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
10846                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10847                 },
10848                 CLASSIC,
10849                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10850                 { {0x40, 0xffeebbaa }, },
10851         },
10852         {
10853                 "LDX_MSH standalone, preserved A 2",
10854                 .u.insns = {
10855                         BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
10856                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
10857                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
10858                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
10859                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
10860                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10861                 },
10862                 CLASSIC,
10863                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10864                 { {0x40, 0x175e9d63 }, },
10865         },
10866         {
10867                 "LDX_MSH standalone, test result 1",
10868                 .u.insns = {
10869                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
10870                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
10871                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
10872                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10873                 },
10874                 CLASSIC,
10875                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10876                 { {0x40, 0x14 }, },
10877         },
10878         {
10879                 "LDX_MSH standalone, test result 2",
10880                 .u.insns = {
10881                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
10882                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
10883                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
10884                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10885                 },
10886                 CLASSIC,
10887                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10888                 { {0x40, 0x24 }, },
10889         },
10890         {
10891                 "LDX_MSH standalone, negative offset",
10892                 .u.insns = {
10893                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
10894                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
10895                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
10896                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10897                 },
10898                 CLASSIC,
10899                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10900                 { {0x40, 0 }, },
10901         },
10902         {
10903                 "LDX_MSH standalone, negative offset 2",
10904                 .u.insns = {
10905                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
10906                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
10907                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
10908                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10909                 },
10910                 CLASSIC,
10911                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10912                 { {0x40, 0x24 }, },
10913         },
10914         {
10915                 "LDX_MSH standalone, out of bounds",
10916                 .u.insns = {
10917                         BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
10918                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
10919                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
10920                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10921                 },
10922                 CLASSIC,
10923                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
10924                 { {0x40, 0 }, },
10925         },
10926         /*
10927          * verify that the interpreter or JIT correctly sets A and X
10928          * to 0.
10929          */
10930         {
10931                 "ADD default X",
10932                 .u.insns = {
10933                         /*
10934                          * A = 0x42
10935                          * A = A + X
10936                          * ret A
10937                          */
10938                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
10939                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
10940                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10941                 },
10942                 CLASSIC | FLAG_NO_DATA,
10943                 {},
10944                 { {0x1, 0x42 } },
10945         },
10946         {
10947                 "ADD default A",
10948                 .u.insns = {
10949                         /*
10950                          * A = A + 0x42
10951                          * ret A
10952                          */
10953                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
10954                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10955                 },
10956                 CLASSIC | FLAG_NO_DATA,
10957                 {},
10958                 { {0x1, 0x42 } },
10959         },
10960         {
10961                 "SUB default X",
10962                 .u.insns = {
10963                         /*
10964                          * A = 0x66
10965                          * A = A - X
10966                          * ret A
10967                          */
10968                         BPF_STMT(BPF_LD | BPF_IMM, 0x66),
10969                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
10970                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10971                 },
10972                 CLASSIC | FLAG_NO_DATA,
10973                 {},
10974                 { {0x1, 0x66 } },
10975         },
10976         {
10977                 "SUB default A",
10978                 .u.insns = {
10979                         /*
10980                          * A = A - -0x66
10981                          * ret A
10982                          */
10983                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
10984                         BPF_STMT(BPF_RET | BPF_A, 0x0),
10985                 },
10986                 CLASSIC | FLAG_NO_DATA,
10987                 {},
10988                 { {0x1, 0x66 } },
10989         },
10990         {
10991                 "MUL default X",
10992                 .u.insns = {
10993                         /*
10994                          * A = 0x42
10995                          * A = A * X
10996                          * ret A
10997                          */
10998                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
10999                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
11000                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11001                 },
11002                 CLASSIC | FLAG_NO_DATA,
11003                 {},
11004                 { {0x1, 0x0 } },
11005         },
11006         {
11007                 "MUL default A",
11008                 .u.insns = {
11009                         /*
11010                          * A = A * 0x66
11011                          * ret A
11012                          */
11013                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
11014                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11015                 },
11016                 CLASSIC | FLAG_NO_DATA,
11017                 {},
11018                 { {0x1, 0x0 } },
11019         },
11020         {
11021                 "DIV default X",
11022                 .u.insns = {
11023                         /*
11024                          * A = 0x42
11025                          * A = A / X ; this halt the filter execution if X is 0
11026                          * ret 0x42
11027                          */
11028                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
11029                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
11030                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11031                 },
11032                 CLASSIC | FLAG_NO_DATA,
11033                 {},
11034                 { {0x1, 0x0 } },
11035         },
11036         {
11037                 "DIV default A",
11038                 .u.insns = {
11039                         /*
11040                          * A = A / 1
11041                          * ret A
11042                          */
11043                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
11044                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11045                 },
11046                 CLASSIC | FLAG_NO_DATA,
11047                 {},
11048                 { {0x1, 0x0 } },
11049         },
11050         {
11051                 "MOD default X",
11052                 .u.insns = {
11053                         /*
11054                          * A = 0x42
11055                          * A = A mod X ; this halt the filter execution if X is 0
11056                          * ret 0x42
11057                          */
11058                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
11059                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
11060                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11061                 },
11062                 CLASSIC | FLAG_NO_DATA,
11063                 {},
11064                 { {0x1, 0x0 } },
11065         },
11066         {
11067                 "MOD default A",
11068                 .u.insns = {
11069                         /*
11070                          * A = A mod 1
11071                          * ret A
11072                          */
11073                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
11074                         BPF_STMT(BPF_RET | BPF_A, 0x0),
11075                 },
11076                 CLASSIC | FLAG_NO_DATA,
11077                 {},
11078                 { {0x1, 0x0 } },
11079         },
11080         {
11081                 "JMP EQ default A",
11082                 .u.insns = {
11083                         /*
11084                          * cmp A, 0x0, 0, 1
11085                          * ret 0x42
11086                          * ret 0x66
11087                          */
11088                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
11089                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11090                         BPF_STMT(BPF_RET | BPF_K, 0x66),
11091                 },
11092                 CLASSIC | FLAG_NO_DATA,
11093                 {},
11094                 { {0x1, 0x42 } },
11095         },
11096         {
11097                 "JMP EQ default X",
11098                 .u.insns = {
11099                         /*
11100                          * A = 0x0
11101                          * cmp A, X, 0, 1
11102                          * ret 0x42
11103                          * ret 0x66
11104                          */
11105                         BPF_STMT(BPF_LD | BPF_IMM, 0x0),
11106                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
11107                         BPF_STMT(BPF_RET | BPF_K, 0x42),
11108                         BPF_STMT(BPF_RET | BPF_K, 0x66),
11109                 },
11110                 CLASSIC | FLAG_NO_DATA,
11111                 {},
11112                 { {0x1, 0x42 } },
11113         },
11114         /* Checking interpreter vs JIT wrt signed extended imms. */
11115         {
11116                 "JNE signed compare, test 1",
11117                 .u.insns_int = {
11118                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
11119                         BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
11120                         BPF_MOV64_REG(R2, R1),
11121                         BPF_ALU64_REG(BPF_AND, R2, R3),
11122                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11123                         BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
11124                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11125                         BPF_EXIT_INSN(),
11126                 },
11127                 INTERNAL,
11128                 { },
11129                 { { 0, 1 } },
11130         },
11131         {
11132                 "JNE signed compare, test 2",
11133                 .u.insns_int = {
11134                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
11135                         BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
11136                         BPF_MOV64_REG(R2, R1),
11137                         BPF_ALU64_REG(BPF_AND, R2, R3),
11138                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11139                         BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
11140                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11141                         BPF_EXIT_INSN(),
11142                 },
11143                 INTERNAL,
11144                 { },
11145                 { { 0, 1 } },
11146         },
11147         {
11148                 "JNE signed compare, test 3",
11149                 .u.insns_int = {
11150                         BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
11151                         BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
11152                         BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
11153                         BPF_MOV64_REG(R2, R1),
11154                         BPF_ALU64_REG(BPF_AND, R2, R3),
11155                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11156                         BPF_JMP_REG(BPF_JNE, R2, R4, 1),
11157                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11158                         BPF_EXIT_INSN(),
11159                 },
11160                 INTERNAL,
11161                 { },
11162                 { { 0, 2 } },
11163         },
11164         {
11165                 "JNE signed compare, test 4",
11166                 .u.insns_int = {
11167                         BPF_LD_IMM64(R1, -17104896),
11168                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11169                         BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
11170                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11171                         BPF_EXIT_INSN(),
11172                 },
11173                 INTERNAL,
11174                 { },
11175                 { { 0, 2 } },
11176         },
11177         {
11178                 "JNE signed compare, test 5",
11179                 .u.insns_int = {
11180                         BPF_LD_IMM64(R1, 0xfefb0000),
11181                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11182                         BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
11183                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11184                         BPF_EXIT_INSN(),
11185                 },
11186                 INTERNAL,
11187                 { },
11188                 { { 0, 1 } },
11189         },
11190         {
11191                 "JNE signed compare, test 6",
11192                 .u.insns_int = {
11193                         BPF_LD_IMM64(R1, 0x7efb0000),
11194                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
11195                         BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
11196                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
11197                         BPF_EXIT_INSN(),
11198                 },
11199                 INTERNAL,
11200                 { },
11201                 { { 0, 2 } },
11202         },
11203         {
11204                 "JNE signed compare, test 7",
11205                 .u.insns = {
11206                         BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
11207                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
11208                         BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
11209                         BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
11210                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
11211                         BPF_STMT(BPF_RET | BPF_K, 1),
11212                         BPF_STMT(BPF_RET | BPF_K, 2),
11213                 },
11214                 CLASSIC | FLAG_NO_DATA,
11215                 {},
11216                 { { 0, 2 } },
11217         },
11218         /* BPF_LDX_MEM with operand aliasing */
11219         {
11220                 "LDX_MEM_B: operand register aliasing",
11221                 .u.insns_int = {
11222                         BPF_ST_MEM(BPF_B, R10, -8, 123),
11223                         BPF_MOV64_REG(R0, R10),
11224                         BPF_LDX_MEM(BPF_B, R0, R0, -8),
11225                         BPF_EXIT_INSN(),
11226                 },
11227                 INTERNAL,
11228                 { },
11229                 { { 0, 123 } },
11230                 .stack_depth = 8,
11231         },
11232         {
11233                 "LDX_MEM_H: operand register aliasing",
11234                 .u.insns_int = {
11235                         BPF_ST_MEM(BPF_H, R10, -8, 12345),
11236                         BPF_MOV64_REG(R0, R10),
11237                         BPF_LDX_MEM(BPF_H, R0, R0, -8),
11238                         BPF_EXIT_INSN(),
11239                 },
11240                 INTERNAL,
11241                 { },
11242                 { { 0, 12345 } },
11243                 .stack_depth = 8,
11244         },
11245         {
11246                 "LDX_MEM_W: operand register aliasing",
11247                 .u.insns_int = {
11248                         BPF_ST_MEM(BPF_W, R10, -8, 123456789),
11249                         BPF_MOV64_REG(R0, R10),
11250                         BPF_LDX_MEM(BPF_W, R0, R0, -8),
11251                         BPF_EXIT_INSN(),
11252                 },
11253                 INTERNAL,
11254                 { },
11255                 { { 0, 123456789 } },
11256                 .stack_depth = 8,
11257         },
11258         {
11259                 "LDX_MEM_DW: operand register aliasing",
11260                 .u.insns_int = {
11261                         BPF_LD_IMM64(R1, 0x123456789abcdefULL),
11262                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
11263                         BPF_MOV64_REG(R0, R10),
11264                         BPF_LDX_MEM(BPF_DW, R0, R0, -8),
11265                         BPF_ALU64_REG(BPF_SUB, R0, R1),
11266                         BPF_MOV64_REG(R1, R0),
11267                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
11268                         BPF_ALU64_REG(BPF_OR, R0, R1),
11269                         BPF_EXIT_INSN(),
11270                 },
11271                 INTERNAL,
11272                 { },
11273                 { { 0, 0 } },
11274                 .stack_depth = 8,
11275         },
11276         /*
11277          * Register (non-)clobbering tests for the case where a JIT implements
11278          * complex ALU or ATOMIC operations via function calls. If so, the
11279          * function call must be transparent to the eBPF registers. The JIT
11280          * must therefore save and restore relevant registers across the call.
11281          * The following tests check that the eBPF registers retain their
11282          * values after such an operation. Mainly intended for complex ALU
11283          * and atomic operation, but we run it for all. You never know...
11284          *
11285          * Note that each operations should be tested twice with different
11286          * destinations, to check preservation for all registers.
11287          */
11288 #define BPF_TEST_CLOBBER_ALU(alu, op, dst, src)                 \
11289         {                                                       \
11290                 #alu "_" #op " to " #dst ": no clobbering",     \
11291                 .u.insns_int = {                                \
11292                         BPF_ALU64_IMM(BPF_MOV, R0, R0),         \
11293                         BPF_ALU64_IMM(BPF_MOV, R1, R1),         \
11294                         BPF_ALU64_IMM(BPF_MOV, R2, R2),         \
11295                         BPF_ALU64_IMM(BPF_MOV, R3, R3),         \
11296                         BPF_ALU64_IMM(BPF_MOV, R4, R4),         \
11297                         BPF_ALU64_IMM(BPF_MOV, R5, R5),         \
11298                         BPF_ALU64_IMM(BPF_MOV, R6, R6),         \
11299                         BPF_ALU64_IMM(BPF_MOV, R7, R7),         \
11300                         BPF_ALU64_IMM(BPF_MOV, R8, R8),         \
11301                         BPF_ALU64_IMM(BPF_MOV, R9, R9),         \
11302                         BPF_##alu(BPF_ ##op, dst, src),         \
11303                         BPF_ALU32_IMM(BPF_MOV, dst, dst),       \
11304                         BPF_JMP_IMM(BPF_JNE, R0, R0, 10),       \
11305                         BPF_JMP_IMM(BPF_JNE, R1, R1, 9),        \
11306                         BPF_JMP_IMM(BPF_JNE, R2, R2, 8),        \
11307                         BPF_JMP_IMM(BPF_JNE, R3, R3, 7),        \
11308                         BPF_JMP_IMM(BPF_JNE, R4, R4, 6),        \
11309                         BPF_JMP_IMM(BPF_JNE, R5, R5, 5),        \
11310                         BPF_JMP_IMM(BPF_JNE, R6, R6, 4),        \
11311                         BPF_JMP_IMM(BPF_JNE, R7, R7, 3),        \
11312                         BPF_JMP_IMM(BPF_JNE, R8, R8, 2),        \
11313                         BPF_JMP_IMM(BPF_JNE, R9, R9, 1),        \
11314                         BPF_ALU64_IMM(BPF_MOV, R0, 1),          \
11315                         BPF_EXIT_INSN(),                        \
11316                 },                                              \
11317                 INTERNAL,                                       \
11318                 { },                                            \
11319                 { { 0, 1 } }                                    \
11320         }
11321         /* ALU64 operations, register clobbering */
11322         BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R8, 123456789),
11323         BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R9, 123456789),
11324         BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R8, 123456789),
11325         BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R9, 123456789),
11326         BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R8, 123456789),
11327         BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R9, 123456789),
11328         BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R8, 12),
11329         BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R9, 12),
11330         BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R8, 12),
11331         BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R9, 12),
11332         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R8, 12),
11333         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R9, 12),
11334         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R8, 123456789),
11335         BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R9, 123456789),
11336         BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R8, 123456789),
11337         BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R9, 123456789),
11338         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R8, 123456789),
11339         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R9, 123456789),
11340         BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R8, 123456789),
11341         BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R9, 123456789),
11342         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R8, 123456789),
11343         BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R9, 123456789),
11344         /* ALU32 immediate operations, register clobbering */
11345         BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R8, 123456789),
11346         BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R9, 123456789),
11347         BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R8, 123456789),
11348         BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R9, 123456789),
11349         BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R8, 123456789),
11350         BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R9, 123456789),
11351         BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R8, 12),
11352         BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R9, 12),
11353         BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R8, 12),
11354         BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R9, 12),
11355         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R8, 12),
11356         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R9, 12),
11357         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R8, 123456789),
11358         BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R9, 123456789),
11359         BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R8, 123456789),
11360         BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R9, 123456789),
11361         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R8, 123456789),
11362         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R9, 123456789),
11363         BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R8, 123456789),
11364         BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R9, 123456789),
11365         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R8, 123456789),
11366         BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R9, 123456789),
11367         /* ALU64 register operations, register clobbering */
11368         BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R8, R1),
11369         BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R9, R1),
11370         BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R8, R1),
11371         BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R9, R1),
11372         BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R8, R1),
11373         BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R9, R1),
11374         BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R8, R1),
11375         BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R9, R1),
11376         BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R8, R1),
11377         BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R9, R1),
11378         BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R8, R1),
11379         BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R9, R1),
11380         BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R8, R1),
11381         BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R9, R1),
11382         BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R8, R1),
11383         BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R9, R1),
11384         BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R8, R1),
11385         BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R9, R1),
11386         BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R8, R1),
11387         BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R9, R1),
11388         BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R8, R1),
11389         BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R9, R1),
11390         /* ALU32 register operations, register clobbering */
11391         BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R8, R1),
11392         BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R9, R1),
11393         BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R8, R1),
11394         BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R9, R1),
11395         BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R8, R1),
11396         BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R9, R1),
11397         BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R8, R1),
11398         BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R9, R1),
11399         BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R8, R1),
11400         BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R9, R1),
11401         BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R8, R1),
11402         BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R9, R1),
11403         BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R8, R1),
11404         BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R9, R1),
11405         BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R8, R1),
11406         BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R9, R1),
11407         BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R8, R1),
11408         BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R9, R1),
11409         BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R8, R1),
11410         BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R9, R1),
11411         BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R8, R1),
11412         BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R9, R1),
11413 #undef BPF_TEST_CLOBBER_ALU
11414 #define BPF_TEST_CLOBBER_ATOMIC(width, op)                      \
11415         {                                                       \
11416                 "Atomic_" #width " " #op ": no clobbering",     \
11417                 .u.insns_int = {                                \
11418                         BPF_ALU64_IMM(BPF_MOV, R0, 0),          \
11419                         BPF_ALU64_IMM(BPF_MOV, R1, 1),          \
11420                         BPF_ALU64_IMM(BPF_MOV, R2, 2),          \
11421                         BPF_ALU64_IMM(BPF_MOV, R3, 3),          \
11422                         BPF_ALU64_IMM(BPF_MOV, R4, 4),          \
11423                         BPF_ALU64_IMM(BPF_MOV, R5, 5),          \
11424                         BPF_ALU64_IMM(BPF_MOV, R6, 6),          \
11425                         BPF_ALU64_IMM(BPF_MOV, R7, 7),          \
11426                         BPF_ALU64_IMM(BPF_MOV, R8, 8),          \
11427                         BPF_ALU64_IMM(BPF_MOV, R9, 9),          \
11428                         BPF_ST_MEM(width, R10, -8,              \
11429                                    (op) == BPF_CMPXCHG ? 0 :    \
11430                                    (op) & BPF_FETCH ? 1 : 0),   \
11431                         BPF_ATOMIC_OP(width, op, R10, R1, -8),  \
11432                         BPF_JMP_IMM(BPF_JNE, R0, 0, 10),        \
11433                         BPF_JMP_IMM(BPF_JNE, R1, 1, 9),         \
11434                         BPF_JMP_IMM(BPF_JNE, R2, 2, 8),         \
11435                         BPF_JMP_IMM(BPF_JNE, R3, 3, 7),         \
11436                         BPF_JMP_IMM(BPF_JNE, R4, 4, 6),         \
11437                         BPF_JMP_IMM(BPF_JNE, R5, 5, 5),         \
11438                         BPF_JMP_IMM(BPF_JNE, R6, 6, 4),         \
11439                         BPF_JMP_IMM(BPF_JNE, R7, 7, 3),         \
11440                         BPF_JMP_IMM(BPF_JNE, R8, 8, 2),         \
11441                         BPF_JMP_IMM(BPF_JNE, R9, 9, 1),         \
11442                         BPF_ALU64_IMM(BPF_MOV, R0, 1),          \
11443                         BPF_EXIT_INSN(),                        \
11444                 },                                              \
11445                 INTERNAL,                                       \
11446                 { },                                            \
11447                 { { 0, 1 } },                                   \
11448                 .stack_depth = 8,                               \
11449         }
11450         /* 64-bit atomic operations, register clobbering */
11451         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD),
11452         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND),
11453         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR),
11454         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR),
11455         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD | BPF_FETCH),
11456         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND | BPF_FETCH),
11457         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR | BPF_FETCH),
11458         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR | BPF_FETCH),
11459         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XCHG),
11460         BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_CMPXCHG),
11461         /* 32-bit atomic operations, register clobbering */
11462         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD),
11463         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND),
11464         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR),
11465         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR),
11466         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD | BPF_FETCH),
11467         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND | BPF_FETCH),
11468         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR | BPF_FETCH),
11469         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR | BPF_FETCH),
11470         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XCHG),
11471         BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_CMPXCHG),
11472 #undef BPF_TEST_CLOBBER_ATOMIC
11473         /* Checking that ALU32 src is not zero extended in place */
11474 #define BPF_ALU32_SRC_ZEXT(op)                                  \
11475         {                                                       \
11476                 "ALU32_" #op "_X: src preserved in zext",       \
11477                 .u.insns_int = {                                \
11478                         BPF_LD_IMM64(R1, 0x0123456789acbdefULL),\
11479                         BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),\
11480                         BPF_ALU64_REG(BPF_MOV, R0, R1),         \
11481                         BPF_ALU32_REG(BPF_##op, R2, R1),        \
11482                         BPF_ALU64_REG(BPF_SUB, R0, R1),         \
11483                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
11484                         BPF_ALU64_IMM(BPF_RSH, R1, 32),         \
11485                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
11486                         BPF_EXIT_INSN(),                        \
11487                 },                                              \
11488                 INTERNAL,                                       \
11489                 { },                                            \
11490                 { { 0, 0 } },                                   \
11491         }
11492         BPF_ALU32_SRC_ZEXT(MOV),
11493         BPF_ALU32_SRC_ZEXT(AND),
11494         BPF_ALU32_SRC_ZEXT(OR),
11495         BPF_ALU32_SRC_ZEXT(XOR),
11496         BPF_ALU32_SRC_ZEXT(ADD),
11497         BPF_ALU32_SRC_ZEXT(SUB),
11498         BPF_ALU32_SRC_ZEXT(MUL),
11499         BPF_ALU32_SRC_ZEXT(DIV),
11500         BPF_ALU32_SRC_ZEXT(MOD),
11501 #undef BPF_ALU32_SRC_ZEXT
11502         /* Checking that ATOMIC32 src is not zero extended in place */
11503 #define BPF_ATOMIC32_SRC_ZEXT(op)                                       \
11504         {                                                               \
11505                 "ATOMIC_W_" #op ": src preserved in zext",              \
11506                 .u.insns_int = {                                        \
11507                         BPF_LD_IMM64(R0, 0x0123456789acbdefULL),        \
11508                         BPF_ALU64_REG(BPF_MOV, R1, R0),                 \
11509                         BPF_ST_MEM(BPF_W, R10, -4, 0),                  \
11510                         BPF_ATOMIC_OP(BPF_W, BPF_##op, R10, R1, -4),    \
11511                         BPF_ALU64_REG(BPF_SUB, R0, R1),                 \
11512                         BPF_ALU64_REG(BPF_MOV, R1, R0),                 \
11513                         BPF_ALU64_IMM(BPF_RSH, R1, 32),                 \
11514                         BPF_ALU64_REG(BPF_OR, R0, R1),                  \
11515                         BPF_EXIT_INSN(),                                \
11516                 },                                                      \
11517                 INTERNAL,                                               \
11518                 { },                                                    \
11519                 { { 0, 0 } },                                           \
11520                 .stack_depth = 8,                                       \
11521         }
11522         BPF_ATOMIC32_SRC_ZEXT(ADD),
11523         BPF_ATOMIC32_SRC_ZEXT(AND),
11524         BPF_ATOMIC32_SRC_ZEXT(OR),
11525         BPF_ATOMIC32_SRC_ZEXT(XOR),
11526 #undef BPF_ATOMIC32_SRC_ZEXT
11527         /* Checking that CMPXCHG32 src is not zero extended in place */
11528         {
11529                 "ATOMIC_W_CMPXCHG: src preserved in zext",
11530                 .u.insns_int = {
11531                         BPF_LD_IMM64(R1, 0x0123456789acbdefULL),
11532                         BPF_ALU64_REG(BPF_MOV, R2, R1),
11533                         BPF_ALU64_REG(BPF_MOV, R0, 0),
11534                         BPF_ST_MEM(BPF_W, R10, -4, 0),
11535                         BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R1, -4),
11536                         BPF_ALU64_REG(BPF_SUB, R1, R2),
11537                         BPF_ALU64_REG(BPF_MOV, R2, R1),
11538                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
11539                         BPF_ALU64_REG(BPF_OR, R1, R2),
11540                         BPF_ALU64_REG(BPF_MOV, R0, R1),
11541                         BPF_EXIT_INSN(),
11542                 },
11543                 INTERNAL,
11544                 { },
11545                 { { 0, 0 } },
11546                 .stack_depth = 8,
11547         },
11548         /* Checking that JMP32 immediate src is not zero extended in place */
11549 #define BPF_JMP32_IMM_ZEXT(op)                                  \
11550         {                                                       \
11551                 "JMP32_" #op "_K: operand preserved in zext",   \
11552                 .u.insns_int = {                                \
11553                         BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\
11554                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
11555                         BPF_JMP32_IMM(BPF_##op, R0, 1234, 1),   \
11556                         BPF_JMP_A(0), /* Nop */                 \
11557                         BPF_ALU64_REG(BPF_SUB, R0, R1),         \
11558                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
11559                         BPF_ALU64_IMM(BPF_RSH, R1, 32),         \
11560                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
11561                         BPF_EXIT_INSN(),                        \
11562                 },                                              \
11563                 INTERNAL,                                       \
11564                 { },                                            \
11565                 { { 0, 0 } },                                   \
11566         }
11567         BPF_JMP32_IMM_ZEXT(JEQ),
11568         BPF_JMP32_IMM_ZEXT(JNE),
11569         BPF_JMP32_IMM_ZEXT(JSET),
11570         BPF_JMP32_IMM_ZEXT(JGT),
11571         BPF_JMP32_IMM_ZEXT(JGE),
11572         BPF_JMP32_IMM_ZEXT(JLT),
11573         BPF_JMP32_IMM_ZEXT(JLE),
11574         BPF_JMP32_IMM_ZEXT(JSGT),
11575         BPF_JMP32_IMM_ZEXT(JSGE),
11576         BPF_JMP32_IMM_ZEXT(JSGT),
11577         BPF_JMP32_IMM_ZEXT(JSLT),
11578         BPF_JMP32_IMM_ZEXT(JSLE),
11579 #undef BPF_JMP2_IMM_ZEXT
11580         /* Checking that JMP32 dst & src are not zero extended in place */
11581 #define BPF_JMP32_REG_ZEXT(op)                                  \
11582         {                                                       \
11583                 "JMP32_" #op "_X: operands preserved in zext",  \
11584                 .u.insns_int = {                                \
11585                         BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\
11586                         BPF_LD_IMM64(R1, 0xfedcba9876543210ULL),\
11587                         BPF_ALU64_REG(BPF_MOV, R2, R0),         \
11588                         BPF_ALU64_REG(BPF_MOV, R3, R1),         \
11589                         BPF_JMP32_IMM(BPF_##op, R0, R1, 1),     \
11590                         BPF_JMP_A(0), /* Nop */                 \
11591                         BPF_ALU64_REG(BPF_SUB, R0, R2),         \
11592                         BPF_ALU64_REG(BPF_SUB, R1, R3),         \
11593                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
11594                         BPF_ALU64_REG(BPF_MOV, R1, R0),         \
11595                         BPF_ALU64_IMM(BPF_RSH, R1, 32),         \
11596                         BPF_ALU64_REG(BPF_OR, R0, R1),          \
11597                         BPF_EXIT_INSN(),                        \
11598                 },                                              \
11599                 INTERNAL,                                       \
11600                 { },                                            \
11601                 { { 0, 0 } },                                   \
11602         }
11603         BPF_JMP32_REG_ZEXT(JEQ),
11604         BPF_JMP32_REG_ZEXT(JNE),
11605         BPF_JMP32_REG_ZEXT(JSET),
11606         BPF_JMP32_REG_ZEXT(JGT),
11607         BPF_JMP32_REG_ZEXT(JGE),
11608         BPF_JMP32_REG_ZEXT(JLT),
11609         BPF_JMP32_REG_ZEXT(JLE),
11610         BPF_JMP32_REG_ZEXT(JSGT),
11611         BPF_JMP32_REG_ZEXT(JSGE),
11612         BPF_JMP32_REG_ZEXT(JSGT),
11613         BPF_JMP32_REG_ZEXT(JSLT),
11614         BPF_JMP32_REG_ZEXT(JSLE),
11615 #undef BPF_JMP2_REG_ZEXT
11616         /* ALU64 K register combinations */
11617         {
11618                 "ALU64_MOV_K: registers",
11619                 { },
11620                 INTERNAL,
11621                 { },
11622                 { { 0, 1 } },
11623                 .fill_helper = bpf_fill_alu64_mov_imm_regs,
11624         },
11625         {
11626                 "ALU64_AND_K: registers",
11627                 { },
11628                 INTERNAL,
11629                 { },
11630                 { { 0, 1 } },
11631                 .fill_helper = bpf_fill_alu64_and_imm_regs,
11632         },
11633         {
11634                 "ALU64_OR_K: registers",
11635                 { },
11636                 INTERNAL,
11637                 { },
11638                 { { 0, 1 } },
11639                 .fill_helper = bpf_fill_alu64_or_imm_regs,
11640         },
11641         {
11642                 "ALU64_XOR_K: registers",
11643                 { },
11644                 INTERNAL,
11645                 { },
11646                 { { 0, 1 } },
11647                 .fill_helper = bpf_fill_alu64_xor_imm_regs,
11648         },
11649         {
11650                 "ALU64_LSH_K: registers",
11651                 { },
11652                 INTERNAL,
11653                 { },
11654                 { { 0, 1 } },
11655                 .fill_helper = bpf_fill_alu64_lsh_imm_regs,
11656         },
11657         {
11658                 "ALU64_RSH_K: registers",
11659                 { },
11660                 INTERNAL,
11661                 { },
11662                 { { 0, 1 } },
11663                 .fill_helper = bpf_fill_alu64_rsh_imm_regs,
11664         },
11665         {
11666                 "ALU64_ARSH_K: registers",
11667                 { },
11668                 INTERNAL,
11669                 { },
11670                 { { 0, 1 } },
11671                 .fill_helper = bpf_fill_alu64_arsh_imm_regs,
11672         },
11673         {
11674                 "ALU64_ADD_K: registers",
11675                 { },
11676                 INTERNAL,
11677                 { },
11678                 { { 0, 1 } },
11679                 .fill_helper = bpf_fill_alu64_add_imm_regs,
11680         },
11681         {
11682                 "ALU64_SUB_K: registers",
11683                 { },
11684                 INTERNAL,
11685                 { },
11686                 { { 0, 1 } },
11687                 .fill_helper = bpf_fill_alu64_sub_imm_regs,
11688         },
11689         {
11690                 "ALU64_MUL_K: registers",
11691                 { },
11692                 INTERNAL,
11693                 { },
11694                 { { 0, 1 } },
11695                 .fill_helper = bpf_fill_alu64_mul_imm_regs,
11696         },
11697         {
11698                 "ALU64_DIV_K: registers",
11699                 { },
11700                 INTERNAL,
11701                 { },
11702                 { { 0, 1 } },
11703                 .fill_helper = bpf_fill_alu64_div_imm_regs,
11704         },
11705         {
11706                 "ALU64_MOD_K: registers",
11707                 { },
11708                 INTERNAL,
11709                 { },
11710                 { { 0, 1 } },
11711                 .fill_helper = bpf_fill_alu64_mod_imm_regs,
11712         },
11713         /* ALU32 K registers */
11714         {
11715                 "ALU32_MOV_K: registers",
11716                 { },
11717                 INTERNAL,
11718                 { },
11719                 { { 0, 1 } },
11720                 .fill_helper = bpf_fill_alu32_mov_imm_regs,
11721         },
11722         {
11723                 "ALU32_AND_K: registers",
11724                 { },
11725                 INTERNAL,
11726                 { },
11727                 { { 0, 1 } },
11728                 .fill_helper = bpf_fill_alu32_and_imm_regs,
11729         },
11730         {
11731                 "ALU32_OR_K: registers",
11732                 { },
11733                 INTERNAL,
11734                 { },
11735                 { { 0, 1 } },
11736                 .fill_helper = bpf_fill_alu32_or_imm_regs,
11737         },
11738         {
11739                 "ALU32_XOR_K: registers",
11740                 { },
11741                 INTERNAL,
11742                 { },
11743                 { { 0, 1 } },
11744                 .fill_helper = bpf_fill_alu32_xor_imm_regs,
11745         },
11746         {
11747                 "ALU32_LSH_K: registers",
11748                 { },
11749                 INTERNAL,
11750                 { },
11751                 { { 0, 1 } },
11752                 .fill_helper = bpf_fill_alu32_lsh_imm_regs,
11753         },
11754         {
11755                 "ALU32_RSH_K: registers",
11756                 { },
11757                 INTERNAL,
11758                 { },
11759                 { { 0, 1 } },
11760                 .fill_helper = bpf_fill_alu32_rsh_imm_regs,
11761         },
11762         {
11763                 "ALU32_ARSH_K: registers",
11764                 { },
11765                 INTERNAL,
11766                 { },
11767                 { { 0, 1 } },
11768                 .fill_helper = bpf_fill_alu32_arsh_imm_regs,
11769         },
11770         {
11771                 "ALU32_ADD_K: registers",
11772                 { },
11773                 INTERNAL,
11774                 { },
11775                 { { 0, 1 } },
11776                 .fill_helper = bpf_fill_alu32_add_imm_regs,
11777         },
11778         {
11779                 "ALU32_SUB_K: registers",
11780                 { },
11781                 INTERNAL,
11782                 { },
11783                 { { 0, 1 } },
11784                 .fill_helper = bpf_fill_alu32_sub_imm_regs,
11785         },
11786         {
11787                 "ALU32_MUL_K: registers",
11788                 { },
11789                 INTERNAL,
11790                 { },
11791                 { { 0, 1 } },
11792                 .fill_helper = bpf_fill_alu32_mul_imm_regs,
11793         },
11794         {
11795                 "ALU32_DIV_K: registers",
11796                 { },
11797                 INTERNAL,
11798                 { },
11799                 { { 0, 1 } },
11800                 .fill_helper = bpf_fill_alu32_div_imm_regs,
11801         },
11802         {
11803                 "ALU32_MOD_K: registers",
11804                 { },
11805                 INTERNAL,
11806                 { },
11807                 { { 0, 1 } },
11808                 .fill_helper = bpf_fill_alu32_mod_imm_regs,
11809         },
11810         /* ALU64 X register combinations */
11811         {
11812                 "ALU64_MOV_X: register combinations",
11813                 { },
11814                 INTERNAL,
11815                 { },
11816                 { { 0, 1 } },
11817                 .fill_helper = bpf_fill_alu64_mov_reg_pairs,
11818         },
11819         {
11820                 "ALU64_AND_X: register combinations",
11821                 { },
11822                 INTERNAL,
11823                 { },
11824                 { { 0, 1 } },
11825                 .fill_helper = bpf_fill_alu64_and_reg_pairs,
11826         },
11827         {
11828                 "ALU64_OR_X: register combinations",
11829                 { },
11830                 INTERNAL,
11831                 { },
11832                 { { 0, 1 } },
11833                 .fill_helper = bpf_fill_alu64_or_reg_pairs,
11834         },
11835         {
11836                 "ALU64_XOR_X: register combinations",
11837                 { },
11838                 INTERNAL,
11839                 { },
11840                 { { 0, 1 } },
11841                 .fill_helper = bpf_fill_alu64_xor_reg_pairs,
11842         },
11843         {
11844                 "ALU64_LSH_X: register combinations",
11845                 { },
11846                 INTERNAL,
11847                 { },
11848                 { { 0, 1 } },
11849                 .fill_helper = bpf_fill_alu64_lsh_reg_pairs,
11850         },
11851         {
11852                 "ALU64_RSH_X: register combinations",
11853                 { },
11854                 INTERNAL,
11855                 { },
11856                 { { 0, 1 } },
11857                 .fill_helper = bpf_fill_alu64_rsh_reg_pairs,
11858         },
11859         {
11860                 "ALU64_ARSH_X: register combinations",
11861                 { },
11862                 INTERNAL,
11863                 { },
11864                 { { 0, 1 } },
11865                 .fill_helper = bpf_fill_alu64_arsh_reg_pairs,
11866         },
11867         {
11868                 "ALU64_ADD_X: register combinations",
11869                 { },
11870                 INTERNAL,
11871                 { },
11872                 { { 0, 1 } },
11873                 .fill_helper = bpf_fill_alu64_add_reg_pairs,
11874         },
11875         {
11876                 "ALU64_SUB_X: register combinations",
11877                 { },
11878                 INTERNAL,
11879                 { },
11880                 { { 0, 1 } },
11881                 .fill_helper = bpf_fill_alu64_sub_reg_pairs,
11882         },
11883         {
11884                 "ALU64_MUL_X: register combinations",
11885                 { },
11886                 INTERNAL,
11887                 { },
11888                 { { 0, 1 } },
11889                 .fill_helper = bpf_fill_alu64_mul_reg_pairs,
11890         },
11891         {
11892                 "ALU64_DIV_X: register combinations",
11893                 { },
11894                 INTERNAL,
11895                 { },
11896                 { { 0, 1 } },
11897                 .fill_helper = bpf_fill_alu64_div_reg_pairs,
11898         },
11899         {
11900                 "ALU64_MOD_X: register combinations",
11901                 { },
11902                 INTERNAL,
11903                 { },
11904                 { { 0, 1 } },
11905                 .fill_helper = bpf_fill_alu64_mod_reg_pairs,
11906         },
11907         /* ALU32 X register combinations */
11908         {
11909                 "ALU32_MOV_X: register combinations",
11910                 { },
11911                 INTERNAL,
11912                 { },
11913                 { { 0, 1 } },
11914                 .fill_helper = bpf_fill_alu32_mov_reg_pairs,
11915         },
11916         {
11917                 "ALU32_AND_X: register combinations",
11918                 { },
11919                 INTERNAL,
11920                 { },
11921                 { { 0, 1 } },
11922                 .fill_helper = bpf_fill_alu32_and_reg_pairs,
11923         },
11924         {
11925                 "ALU32_OR_X: register combinations",
11926                 { },
11927                 INTERNAL,
11928                 { },
11929                 { { 0, 1 } },
11930                 .fill_helper = bpf_fill_alu32_or_reg_pairs,
11931         },
11932         {
11933                 "ALU32_XOR_X: register combinations",
11934                 { },
11935                 INTERNAL,
11936                 { },
11937                 { { 0, 1 } },
11938                 .fill_helper = bpf_fill_alu32_xor_reg_pairs,
11939         },
11940         {
11941                 "ALU32_LSH_X: register combinations",
11942                 { },
11943                 INTERNAL,
11944                 { },
11945                 { { 0, 1 } },
11946                 .fill_helper = bpf_fill_alu32_lsh_reg_pairs,
11947         },
11948         {
11949                 "ALU32_RSH_X: register combinations",
11950                 { },
11951                 INTERNAL,
11952                 { },
11953                 { { 0, 1 } },
11954                 .fill_helper = bpf_fill_alu32_rsh_reg_pairs,
11955         },
11956         {
11957                 "ALU32_ARSH_X: register combinations",
11958                 { },
11959                 INTERNAL,
11960                 { },
11961                 { { 0, 1 } },
11962                 .fill_helper = bpf_fill_alu32_arsh_reg_pairs,
11963         },
11964         {
11965                 "ALU32_ADD_X: register combinations",
11966                 { },
11967                 INTERNAL,
11968                 { },
11969                 { { 0, 1 } },
11970                 .fill_helper = bpf_fill_alu32_add_reg_pairs,
11971         },
11972         {
11973                 "ALU32_SUB_X: register combinations",
11974                 { },
11975                 INTERNAL,
11976                 { },
11977                 { { 0, 1 } },
11978                 .fill_helper = bpf_fill_alu32_sub_reg_pairs,
11979         },
11980         {
11981                 "ALU32_MUL_X: register combinations",
11982                 { },
11983                 INTERNAL,
11984                 { },
11985                 { { 0, 1 } },
11986                 .fill_helper = bpf_fill_alu32_mul_reg_pairs,
11987         },
11988         {
11989                 "ALU32_DIV_X: register combinations",
11990                 { },
11991                 INTERNAL,
11992                 { },
11993                 { { 0, 1 } },
11994                 .fill_helper = bpf_fill_alu32_div_reg_pairs,
11995         },
11996         {
11997                 "ALU32_MOD_X register combinations",
11998                 { },
11999                 INTERNAL,
12000                 { },
12001                 { { 0, 1 } },
12002                 .fill_helper = bpf_fill_alu32_mod_reg_pairs,
12003         },
12004         /* Exhaustive test of ALU64 shift operations */
12005         {
12006                 "ALU64_LSH_K: all shift values",
12007                 { },
12008                 INTERNAL | FLAG_NO_DATA,
12009                 { },
12010                 { { 0, 1 } },
12011                 .fill_helper = bpf_fill_alu64_lsh_imm,
12012         },
12013         {
12014                 "ALU64_RSH_K: all shift values",
12015                 { },
12016                 INTERNAL | FLAG_NO_DATA,
12017                 { },
12018                 { { 0, 1 } },
12019                 .fill_helper = bpf_fill_alu64_rsh_imm,
12020         },
12021         {
12022                 "ALU64_ARSH_K: all shift values",
12023                 { },
12024                 INTERNAL | FLAG_NO_DATA,
12025                 { },
12026                 { { 0, 1 } },
12027                 .fill_helper = bpf_fill_alu64_arsh_imm,
12028         },
12029         {
12030                 "ALU64_LSH_X: all shift values",
12031                 { },
12032                 INTERNAL | FLAG_NO_DATA,
12033                 { },
12034                 { { 0, 1 } },
12035                 .fill_helper = bpf_fill_alu64_lsh_reg,
12036         },
12037         {
12038                 "ALU64_RSH_X: all shift values",
12039                 { },
12040                 INTERNAL | FLAG_NO_DATA,
12041                 { },
12042                 { { 0, 1 } },
12043                 .fill_helper = bpf_fill_alu64_rsh_reg,
12044         },
12045         {
12046                 "ALU64_ARSH_X: all shift values",
12047                 { },
12048                 INTERNAL | FLAG_NO_DATA,
12049                 { },
12050                 { { 0, 1 } },
12051                 .fill_helper = bpf_fill_alu64_arsh_reg,
12052         },
12053         /* Exhaustive test of ALU32 shift operations */
12054         {
12055                 "ALU32_LSH_K: all shift values",
12056                 { },
12057                 INTERNAL | FLAG_NO_DATA,
12058                 { },
12059                 { { 0, 1 } },
12060                 .fill_helper = bpf_fill_alu32_lsh_imm,
12061         },
12062         {
12063                 "ALU32_RSH_K: all shift values",
12064                 { },
12065                 INTERNAL | FLAG_NO_DATA,
12066                 { },
12067                 { { 0, 1 } },
12068                 .fill_helper = bpf_fill_alu32_rsh_imm,
12069         },
12070         {
12071                 "ALU32_ARSH_K: all shift values",
12072                 { },
12073                 INTERNAL | FLAG_NO_DATA,
12074                 { },
12075                 { { 0, 1 } },
12076                 .fill_helper = bpf_fill_alu32_arsh_imm,
12077         },
12078         {
12079                 "ALU32_LSH_X: all shift values",
12080                 { },
12081                 INTERNAL | FLAG_NO_DATA,
12082                 { },
12083                 { { 0, 1 } },
12084                 .fill_helper = bpf_fill_alu32_lsh_reg,
12085         },
12086         {
12087                 "ALU32_RSH_X: all shift values",
12088                 { },
12089                 INTERNAL | FLAG_NO_DATA,
12090                 { },
12091                 { { 0, 1 } },
12092                 .fill_helper = bpf_fill_alu32_rsh_reg,
12093         },
12094         {
12095                 "ALU32_ARSH_X: all shift values",
12096                 { },
12097                 INTERNAL | FLAG_NO_DATA,
12098                 { },
12099                 { { 0, 1 } },
12100                 .fill_helper = bpf_fill_alu32_arsh_reg,
12101         },
12102         /*
12103          * Exhaustive test of ALU64 shift operations when
12104          * source and destination register are the same.
12105          */
12106         {
12107                 "ALU64_LSH_X: all shift values with the same register",
12108                 { },
12109                 INTERNAL | FLAG_NO_DATA,
12110                 { },
12111                 { { 0, 1 } },
12112                 .fill_helper = bpf_fill_alu64_lsh_same_reg,
12113         },
12114         {
12115                 "ALU64_RSH_X: all shift values with the same register",
12116                 { },
12117                 INTERNAL | FLAG_NO_DATA,
12118                 { },
12119                 { { 0, 1 } },
12120                 .fill_helper = bpf_fill_alu64_rsh_same_reg,
12121         },
12122         {
12123                 "ALU64_ARSH_X: all shift values with the same register",
12124                 { },
12125                 INTERNAL | FLAG_NO_DATA,
12126                 { },
12127                 { { 0, 1 } },
12128                 .fill_helper = bpf_fill_alu64_arsh_same_reg,
12129         },
12130         /*
12131          * Exhaustive test of ALU32 shift operations when
12132          * source and destination register are the same.
12133          */
12134         {
12135                 "ALU32_LSH_X: all shift values with the same register",
12136                 { },
12137                 INTERNAL | FLAG_NO_DATA,
12138                 { },
12139                 { { 0, 1 } },
12140                 .fill_helper = bpf_fill_alu32_lsh_same_reg,
12141         },
12142         {
12143                 "ALU32_RSH_X: all shift values with the same register",
12144                 { },
12145                 INTERNAL | FLAG_NO_DATA,
12146                 { },
12147                 { { 0, 1 } },
12148                 .fill_helper = bpf_fill_alu32_rsh_same_reg,
12149         },
12150         {
12151                 "ALU32_ARSH_X: all shift values with the same register",
12152                 { },
12153                 INTERNAL | FLAG_NO_DATA,
12154                 { },
12155                 { { 0, 1 } },
12156                 .fill_helper = bpf_fill_alu32_arsh_same_reg,
12157         },
12158         /* ALU64 immediate magnitudes */
12159         {
12160                 "ALU64_MOV_K: all immediate value magnitudes",
12161                 { },
12162                 INTERNAL | FLAG_NO_DATA,
12163                 { },
12164                 { { 0, 1 } },
12165                 .fill_helper = bpf_fill_alu64_mov_imm,
12166                 .nr_testruns = NR_PATTERN_RUNS,
12167         },
12168         {
12169                 "ALU64_AND_K: all immediate value magnitudes",
12170                 { },
12171                 INTERNAL | FLAG_NO_DATA,
12172                 { },
12173                 { { 0, 1 } },
12174                 .fill_helper = bpf_fill_alu64_and_imm,
12175                 .nr_testruns = NR_PATTERN_RUNS,
12176         },
12177         {
12178                 "ALU64_OR_K: all immediate value magnitudes",
12179                 { },
12180                 INTERNAL | FLAG_NO_DATA,
12181                 { },
12182                 { { 0, 1 } },
12183                 .fill_helper = bpf_fill_alu64_or_imm,
12184                 .nr_testruns = NR_PATTERN_RUNS,
12185         },
12186         {
12187                 "ALU64_XOR_K: all immediate value magnitudes",
12188                 { },
12189                 INTERNAL | FLAG_NO_DATA,
12190                 { },
12191                 { { 0, 1 } },
12192                 .fill_helper = bpf_fill_alu64_xor_imm,
12193                 .nr_testruns = NR_PATTERN_RUNS,
12194         },
12195         {
12196                 "ALU64_ADD_K: all immediate value magnitudes",
12197                 { },
12198                 INTERNAL | FLAG_NO_DATA,
12199                 { },
12200                 { { 0, 1 } },
12201                 .fill_helper = bpf_fill_alu64_add_imm,
12202                 .nr_testruns = NR_PATTERN_RUNS,
12203         },
12204         {
12205                 "ALU64_SUB_K: all immediate value magnitudes",
12206                 { },
12207                 INTERNAL | FLAG_NO_DATA,
12208                 { },
12209                 { { 0, 1 } },
12210                 .fill_helper = bpf_fill_alu64_sub_imm,
12211                 .nr_testruns = NR_PATTERN_RUNS,
12212         },
12213         {
12214                 "ALU64_MUL_K: all immediate value magnitudes",
12215                 { },
12216                 INTERNAL | FLAG_NO_DATA,
12217                 { },
12218                 { { 0, 1 } },
12219                 .fill_helper = bpf_fill_alu64_mul_imm,
12220                 .nr_testruns = NR_PATTERN_RUNS,
12221         },
12222         {
12223                 "ALU64_DIV_K: all immediate value magnitudes",
12224                 { },
12225                 INTERNAL | FLAG_NO_DATA,
12226                 { },
12227                 { { 0, 1 } },
12228                 .fill_helper = bpf_fill_alu64_div_imm,
12229                 .nr_testruns = NR_PATTERN_RUNS,
12230         },
12231         {
12232                 "ALU64_MOD_K: all immediate value magnitudes",
12233                 { },
12234                 INTERNAL | FLAG_NO_DATA,
12235                 { },
12236                 { { 0, 1 } },
12237                 .fill_helper = bpf_fill_alu64_mod_imm,
12238                 .nr_testruns = NR_PATTERN_RUNS,
12239         },
12240         /* ALU32 immediate magnitudes */
12241         {
12242                 "ALU32_MOV_K: all immediate value magnitudes",
12243                 { },
12244                 INTERNAL | FLAG_NO_DATA,
12245                 { },
12246                 { { 0, 1 } },
12247                 .fill_helper = bpf_fill_alu32_mov_imm,
12248                 .nr_testruns = NR_PATTERN_RUNS,
12249         },
12250         {
12251                 "ALU32_AND_K: all immediate value magnitudes",
12252                 { },
12253                 INTERNAL | FLAG_NO_DATA,
12254                 { },
12255                 { { 0, 1 } },
12256                 .fill_helper = bpf_fill_alu32_and_imm,
12257                 .nr_testruns = NR_PATTERN_RUNS,
12258         },
12259         {
12260                 "ALU32_OR_K: all immediate value magnitudes",
12261                 { },
12262                 INTERNAL | FLAG_NO_DATA,
12263                 { },
12264                 { { 0, 1 } },
12265                 .fill_helper = bpf_fill_alu32_or_imm,
12266                 .nr_testruns = NR_PATTERN_RUNS,
12267         },
12268         {
12269                 "ALU32_XOR_K: all immediate value magnitudes",
12270                 { },
12271                 INTERNAL | FLAG_NO_DATA,
12272                 { },
12273                 { { 0, 1 } },
12274                 .fill_helper = bpf_fill_alu32_xor_imm,
12275                 .nr_testruns = NR_PATTERN_RUNS,
12276         },
12277         {
12278                 "ALU32_ADD_K: all immediate value magnitudes",
12279                 { },
12280                 INTERNAL | FLAG_NO_DATA,
12281                 { },
12282                 { { 0, 1 } },
12283                 .fill_helper = bpf_fill_alu32_add_imm,
12284                 .nr_testruns = NR_PATTERN_RUNS,
12285         },
12286         {
12287                 "ALU32_SUB_K: all immediate value magnitudes",
12288                 { },
12289                 INTERNAL | FLAG_NO_DATA,
12290                 { },
12291                 { { 0, 1 } },
12292                 .fill_helper = bpf_fill_alu32_sub_imm,
12293                 .nr_testruns = NR_PATTERN_RUNS,
12294         },
12295         {
12296                 "ALU32_MUL_K: all immediate value magnitudes",
12297                 { },
12298                 INTERNAL | FLAG_NO_DATA,
12299                 { },
12300                 { { 0, 1 } },
12301                 .fill_helper = bpf_fill_alu32_mul_imm,
12302                 .nr_testruns = NR_PATTERN_RUNS,
12303         },
12304         {
12305                 "ALU32_DIV_K: all immediate value magnitudes",
12306                 { },
12307                 INTERNAL | FLAG_NO_DATA,
12308                 { },
12309                 { { 0, 1 } },
12310                 .fill_helper = bpf_fill_alu32_div_imm,
12311                 .nr_testruns = NR_PATTERN_RUNS,
12312         },
12313         {
12314                 "ALU32_MOD_K: all immediate value magnitudes",
12315                 { },
12316                 INTERNAL | FLAG_NO_DATA,
12317                 { },
12318                 { { 0, 1 } },
12319                 .fill_helper = bpf_fill_alu32_mod_imm,
12320                 .nr_testruns = NR_PATTERN_RUNS,
12321         },
12322         /* ALU64 register magnitudes */
12323         {
12324                 "ALU64_MOV_X: all register value magnitudes",
12325                 { },
12326                 INTERNAL | FLAG_NO_DATA,
12327                 { },
12328                 { { 0, 1 } },
12329                 .fill_helper = bpf_fill_alu64_mov_reg,
12330                 .nr_testruns = NR_PATTERN_RUNS,
12331         },
12332         {
12333                 "ALU64_AND_X: all register value magnitudes",
12334                 { },
12335                 INTERNAL | FLAG_NO_DATA,
12336                 { },
12337                 { { 0, 1 } },
12338                 .fill_helper = bpf_fill_alu64_and_reg,
12339                 .nr_testruns = NR_PATTERN_RUNS,
12340         },
12341         {
12342                 "ALU64_OR_X: all register value magnitudes",
12343                 { },
12344                 INTERNAL | FLAG_NO_DATA,
12345                 { },
12346                 { { 0, 1 } },
12347                 .fill_helper = bpf_fill_alu64_or_reg,
12348                 .nr_testruns = NR_PATTERN_RUNS,
12349         },
12350         {
12351                 "ALU64_XOR_X: all register value magnitudes",
12352                 { },
12353                 INTERNAL | FLAG_NO_DATA,
12354                 { },
12355                 { { 0, 1 } },
12356                 .fill_helper = bpf_fill_alu64_xor_reg,
12357                 .nr_testruns = NR_PATTERN_RUNS,
12358         },
12359         {
12360                 "ALU64_ADD_X: all register value magnitudes",
12361                 { },
12362                 INTERNAL | FLAG_NO_DATA,
12363                 { },
12364                 { { 0, 1 } },
12365                 .fill_helper = bpf_fill_alu64_add_reg,
12366                 .nr_testruns = NR_PATTERN_RUNS,
12367         },
12368         {
12369                 "ALU64_SUB_X: all register value magnitudes",
12370                 { },
12371                 INTERNAL | FLAG_NO_DATA,
12372                 { },
12373                 { { 0, 1 } },
12374                 .fill_helper = bpf_fill_alu64_sub_reg,
12375                 .nr_testruns = NR_PATTERN_RUNS,
12376         },
12377         {
12378                 "ALU64_MUL_X: all register value magnitudes",
12379                 { },
12380                 INTERNAL | FLAG_NO_DATA,
12381                 { },
12382                 { { 0, 1 } },
12383                 .fill_helper = bpf_fill_alu64_mul_reg,
12384                 .nr_testruns = NR_PATTERN_RUNS,
12385         },
12386         {
12387                 "ALU64_DIV_X: all register value magnitudes",
12388                 { },
12389                 INTERNAL | FLAG_NO_DATA,
12390                 { },
12391                 { { 0, 1 } },
12392                 .fill_helper = bpf_fill_alu64_div_reg,
12393                 .nr_testruns = NR_PATTERN_RUNS,
12394         },
12395         {
12396                 "ALU64_MOD_X: all register value magnitudes",
12397                 { },
12398                 INTERNAL | FLAG_NO_DATA,
12399                 { },
12400                 { { 0, 1 } },
12401                 .fill_helper = bpf_fill_alu64_mod_reg,
12402                 .nr_testruns = NR_PATTERN_RUNS,
12403         },
12404         /* ALU32 register magnitudes */
12405         {
12406                 "ALU32_MOV_X: all register value magnitudes",
12407                 { },
12408                 INTERNAL | FLAG_NO_DATA,
12409                 { },
12410                 { { 0, 1 } },
12411                 .fill_helper = bpf_fill_alu32_mov_reg,
12412                 .nr_testruns = NR_PATTERN_RUNS,
12413         },
12414         {
12415                 "ALU32_AND_X: all register value magnitudes",
12416                 { },
12417                 INTERNAL | FLAG_NO_DATA,
12418                 { },
12419                 { { 0, 1 } },
12420                 .fill_helper = bpf_fill_alu32_and_reg,
12421                 .nr_testruns = NR_PATTERN_RUNS,
12422         },
12423         {
12424                 "ALU32_OR_X: all register value magnitudes",
12425                 { },
12426                 INTERNAL | FLAG_NO_DATA,
12427                 { },
12428                 { { 0, 1 } },
12429                 .fill_helper = bpf_fill_alu32_or_reg,
12430                 .nr_testruns = NR_PATTERN_RUNS,
12431         },
12432         {
12433                 "ALU32_XOR_X: all register value magnitudes",
12434                 { },
12435                 INTERNAL | FLAG_NO_DATA,
12436                 { },
12437                 { { 0, 1 } },
12438                 .fill_helper = bpf_fill_alu32_xor_reg,
12439                 .nr_testruns = NR_PATTERN_RUNS,
12440         },
12441         {
12442                 "ALU32_ADD_X: all register value magnitudes",
12443                 { },
12444                 INTERNAL | FLAG_NO_DATA,
12445                 { },
12446                 { { 0, 1 } },
12447                 .fill_helper = bpf_fill_alu32_add_reg,
12448                 .nr_testruns = NR_PATTERN_RUNS,
12449         },
12450         {
12451                 "ALU32_SUB_X: all register value magnitudes",
12452                 { },
12453                 INTERNAL | FLAG_NO_DATA,
12454                 { },
12455                 { { 0, 1 } },
12456                 .fill_helper = bpf_fill_alu32_sub_reg,
12457                 .nr_testruns = NR_PATTERN_RUNS,
12458         },
12459         {
12460                 "ALU32_MUL_X: all register value magnitudes",
12461                 { },
12462                 INTERNAL | FLAG_NO_DATA,
12463                 { },
12464                 { { 0, 1 } },
12465                 .fill_helper = bpf_fill_alu32_mul_reg,
12466                 .nr_testruns = NR_PATTERN_RUNS,
12467         },
12468         {
12469                 "ALU32_DIV_X: all register value magnitudes",
12470                 { },
12471                 INTERNAL | FLAG_NO_DATA,
12472                 { },
12473                 { { 0, 1 } },
12474                 .fill_helper = bpf_fill_alu32_div_reg,
12475                 .nr_testruns = NR_PATTERN_RUNS,
12476         },
12477         {
12478                 "ALU32_MOD_X: all register value magnitudes",
12479                 { },
12480                 INTERNAL | FLAG_NO_DATA,
12481                 { },
12482                 { { 0, 1 } },
12483                 .fill_helper = bpf_fill_alu32_mod_reg,
12484                 .nr_testruns = NR_PATTERN_RUNS,
12485         },
12486         /* LD_IMM64 immediate magnitudes and byte patterns */
12487         {
12488                 "LD_IMM64: all immediate value magnitudes",
12489                 { },
12490                 INTERNAL | FLAG_NO_DATA,
12491                 { },
12492                 { { 0, 1 } },
12493                 .fill_helper = bpf_fill_ld_imm64_magn,
12494         },
12495         {
12496                 "LD_IMM64: checker byte patterns",
12497                 { },
12498                 INTERNAL | FLAG_NO_DATA,
12499                 { },
12500                 { { 0, 1 } },
12501                 .fill_helper = bpf_fill_ld_imm64_checker,
12502         },
12503         {
12504                 "LD_IMM64: random positive and zero byte patterns",
12505                 { },
12506                 INTERNAL | FLAG_NO_DATA,
12507                 { },
12508                 { { 0, 1 } },
12509                 .fill_helper = bpf_fill_ld_imm64_pos_zero,
12510         },
12511         {
12512                 "LD_IMM64: random negative and zero byte patterns",
12513                 { },
12514                 INTERNAL | FLAG_NO_DATA,
12515                 { },
12516                 { { 0, 1 } },
12517                 .fill_helper = bpf_fill_ld_imm64_neg_zero,
12518         },
12519         {
12520                 "LD_IMM64: random positive and negative byte patterns",
12521                 { },
12522                 INTERNAL | FLAG_NO_DATA,
12523                 { },
12524                 { { 0, 1 } },
12525                 .fill_helper = bpf_fill_ld_imm64_pos_neg,
12526         },
12527         /* 64-bit ATOMIC register combinations */
12528         {
12529                 "ATOMIC_DW_ADD: register combinations",
12530                 { },
12531                 INTERNAL,
12532                 { },
12533                 { { 0, 1 } },
12534                 .fill_helper = bpf_fill_atomic64_add_reg_pairs,
12535                 .stack_depth = 8,
12536         },
12537         {
12538                 "ATOMIC_DW_AND: register combinations",
12539                 { },
12540                 INTERNAL,
12541                 { },
12542                 { { 0, 1 } },
12543                 .fill_helper = bpf_fill_atomic64_and_reg_pairs,
12544                 .stack_depth = 8,
12545         },
12546         {
12547                 "ATOMIC_DW_OR: register combinations",
12548                 { },
12549                 INTERNAL,
12550                 { },
12551                 { { 0, 1 } },
12552                 .fill_helper = bpf_fill_atomic64_or_reg_pairs,
12553                 .stack_depth = 8,
12554         },
12555         {
12556                 "ATOMIC_DW_XOR: register combinations",
12557                 { },
12558                 INTERNAL,
12559                 { },
12560                 { { 0, 1 } },
12561                 .fill_helper = bpf_fill_atomic64_xor_reg_pairs,
12562                 .stack_depth = 8,
12563         },
12564         {
12565                 "ATOMIC_DW_ADD_FETCH: register combinations",
12566                 { },
12567                 INTERNAL,
12568                 { },
12569                 { { 0, 1 } },
12570                 .fill_helper = bpf_fill_atomic64_add_fetch_reg_pairs,
12571                 .stack_depth = 8,
12572         },
12573         {
12574                 "ATOMIC_DW_AND_FETCH: register combinations",
12575                 { },
12576                 INTERNAL,
12577                 { },
12578                 { { 0, 1 } },
12579                 .fill_helper = bpf_fill_atomic64_and_fetch_reg_pairs,
12580                 .stack_depth = 8,
12581         },
12582         {
12583                 "ATOMIC_DW_OR_FETCH: register combinations",
12584                 { },
12585                 INTERNAL,
12586                 { },
12587                 { { 0, 1 } },
12588                 .fill_helper = bpf_fill_atomic64_or_fetch_reg_pairs,
12589                 .stack_depth = 8,
12590         },
12591         {
12592                 "ATOMIC_DW_XOR_FETCH: register combinations",
12593                 { },
12594                 INTERNAL,
12595                 { },
12596                 { { 0, 1 } },
12597                 .fill_helper = bpf_fill_atomic64_xor_fetch_reg_pairs,
12598                 .stack_depth = 8,
12599         },
12600         {
12601                 "ATOMIC_DW_XCHG: register combinations",
12602                 { },
12603                 INTERNAL,
12604                 { },
12605                 { { 0, 1 } },
12606                 .fill_helper = bpf_fill_atomic64_xchg_reg_pairs,
12607                 .stack_depth = 8,
12608         },
12609         {
12610                 "ATOMIC_DW_CMPXCHG: register combinations",
12611                 { },
12612                 INTERNAL,
12613                 { },
12614                 { { 0, 1 } },
12615                 .fill_helper = bpf_fill_atomic64_cmpxchg_reg_pairs,
12616                 .stack_depth = 8,
12617         },
12618         /* 32-bit ATOMIC register combinations */
12619         {
12620                 "ATOMIC_W_ADD: register combinations",
12621                 { },
12622                 INTERNAL,
12623                 { },
12624                 { { 0, 1 } },
12625                 .fill_helper = bpf_fill_atomic32_add_reg_pairs,
12626                 .stack_depth = 8,
12627         },
12628         {
12629                 "ATOMIC_W_AND: register combinations",
12630                 { },
12631                 INTERNAL,
12632                 { },
12633                 { { 0, 1 } },
12634                 .fill_helper = bpf_fill_atomic32_and_reg_pairs,
12635                 .stack_depth = 8,
12636         },
12637         {
12638                 "ATOMIC_W_OR: register combinations",
12639                 { },
12640                 INTERNAL,
12641                 { },
12642                 { { 0, 1 } },
12643                 .fill_helper = bpf_fill_atomic32_or_reg_pairs,
12644                 .stack_depth = 8,
12645         },
12646         {
12647                 "ATOMIC_W_XOR: register combinations",
12648                 { },
12649                 INTERNAL,
12650                 { },
12651                 { { 0, 1 } },
12652                 .fill_helper = bpf_fill_atomic32_xor_reg_pairs,
12653                 .stack_depth = 8,
12654         },
12655         {
12656                 "ATOMIC_W_ADD_FETCH: register combinations",
12657                 { },
12658                 INTERNAL,
12659                 { },
12660                 { { 0, 1 } },
12661                 .fill_helper = bpf_fill_atomic32_add_fetch_reg_pairs,
12662                 .stack_depth = 8,
12663         },
12664         {
12665                 "ATOMIC_W_AND_FETCH: register combinations",
12666                 { },
12667                 INTERNAL,
12668                 { },
12669                 { { 0, 1 } },
12670                 .fill_helper = bpf_fill_atomic32_and_fetch_reg_pairs,
12671                 .stack_depth = 8,
12672         },
12673         {
12674                 "ATOMIC_W_OR_FETCH: register combinations",
12675                 { },
12676                 INTERNAL,
12677                 { },
12678                 { { 0, 1 } },
12679                 .fill_helper = bpf_fill_atomic32_or_fetch_reg_pairs,
12680                 .stack_depth = 8,
12681         },
12682         {
12683                 "ATOMIC_W_XOR_FETCH: register combinations",
12684                 { },
12685                 INTERNAL,
12686                 { },
12687                 { { 0, 1 } },
12688                 .fill_helper = bpf_fill_atomic32_xor_fetch_reg_pairs,
12689                 .stack_depth = 8,
12690         },
12691         {
12692                 "ATOMIC_W_XCHG: register combinations",
12693                 { },
12694                 INTERNAL,
12695                 { },
12696                 { { 0, 1 } },
12697                 .fill_helper = bpf_fill_atomic32_xchg_reg_pairs,
12698                 .stack_depth = 8,
12699         },
12700         {
12701                 "ATOMIC_W_CMPXCHG: register combinations",
12702                 { },
12703                 INTERNAL,
12704                 { },
12705                 { { 0, 1 } },
12706                 .fill_helper = bpf_fill_atomic32_cmpxchg_reg_pairs,
12707                 .stack_depth = 8,
12708         },
12709         /* 64-bit ATOMIC magnitudes */
12710         {
12711                 "ATOMIC_DW_ADD: all operand magnitudes",
12712                 { },
12713                 INTERNAL | FLAG_NO_DATA,
12714                 { },
12715                 { { 0, 1 } },
12716                 .fill_helper = bpf_fill_atomic64_add,
12717                 .stack_depth = 8,
12718                 .nr_testruns = NR_PATTERN_RUNS,
12719         },
12720         {
12721                 "ATOMIC_DW_AND: all operand magnitudes",
12722                 { },
12723                 INTERNAL | FLAG_NO_DATA,
12724                 { },
12725                 { { 0, 1 } },
12726                 .fill_helper = bpf_fill_atomic64_and,
12727                 .stack_depth = 8,
12728                 .nr_testruns = NR_PATTERN_RUNS,
12729         },
12730         {
12731                 "ATOMIC_DW_OR: all operand magnitudes",
12732                 { },
12733                 INTERNAL | FLAG_NO_DATA,
12734                 { },
12735                 { { 0, 1 } },
12736                 .fill_helper = bpf_fill_atomic64_or,
12737                 .stack_depth = 8,
12738                 .nr_testruns = NR_PATTERN_RUNS,
12739         },
12740         {
12741                 "ATOMIC_DW_XOR: all operand magnitudes",
12742                 { },
12743                 INTERNAL | FLAG_NO_DATA,
12744                 { },
12745                 { { 0, 1 } },
12746                 .fill_helper = bpf_fill_atomic64_xor,
12747                 .stack_depth = 8,
12748                 .nr_testruns = NR_PATTERN_RUNS,
12749         },
12750         {
12751                 "ATOMIC_DW_ADD_FETCH: all operand magnitudes",
12752                 { },
12753                 INTERNAL | FLAG_NO_DATA,
12754                 { },
12755                 { { 0, 1 } },
12756                 .fill_helper = bpf_fill_atomic64_add_fetch,
12757                 .stack_depth = 8,
12758                 .nr_testruns = NR_PATTERN_RUNS,
12759         },
12760         {
12761                 "ATOMIC_DW_AND_FETCH: all operand magnitudes",
12762                 { },
12763                 INTERNAL | FLAG_NO_DATA,
12764                 { },
12765                 { { 0, 1 } },
12766                 .fill_helper = bpf_fill_atomic64_and_fetch,
12767                 .stack_depth = 8,
12768                 .nr_testruns = NR_PATTERN_RUNS,
12769         },
12770         {
12771                 "ATOMIC_DW_OR_FETCH: all operand magnitudes",
12772                 { },
12773                 INTERNAL | FLAG_NO_DATA,
12774                 { },
12775                 { { 0, 1 } },
12776                 .fill_helper = bpf_fill_atomic64_or_fetch,
12777                 .stack_depth = 8,
12778                 .nr_testruns = NR_PATTERN_RUNS,
12779         },
12780         {
12781                 "ATOMIC_DW_XOR_FETCH: all operand magnitudes",
12782                 { },
12783                 INTERNAL | FLAG_NO_DATA,
12784                 { },
12785                 { { 0, 1 } },
12786                 .fill_helper = bpf_fill_atomic64_xor_fetch,
12787                 .stack_depth = 8,
12788                 .nr_testruns = NR_PATTERN_RUNS,
12789         },
12790         {
12791                 "ATOMIC_DW_XCHG: all operand magnitudes",
12792                 { },
12793                 INTERNAL | FLAG_NO_DATA,
12794                 { },
12795                 { { 0, 1 } },
12796                 .fill_helper = bpf_fill_atomic64_xchg,
12797                 .stack_depth = 8,
12798                 .nr_testruns = NR_PATTERN_RUNS,
12799         },
12800         {
12801                 "ATOMIC_DW_CMPXCHG: all operand magnitudes",
12802                 { },
12803                 INTERNAL | FLAG_NO_DATA,
12804                 { },
12805                 { { 0, 1 } },
12806                 .fill_helper = bpf_fill_cmpxchg64,
12807                 .stack_depth = 8,
12808                 .nr_testruns = NR_PATTERN_RUNS,
12809         },
12810         /* 64-bit atomic magnitudes */
12811         {
12812                 "ATOMIC_W_ADD: all operand magnitudes",
12813                 { },
12814                 INTERNAL | FLAG_NO_DATA,
12815                 { },
12816                 { { 0, 1 } },
12817                 .fill_helper = bpf_fill_atomic32_add,
12818                 .stack_depth = 8,
12819                 .nr_testruns = NR_PATTERN_RUNS,
12820         },
12821         {
12822                 "ATOMIC_W_AND: all operand magnitudes",
12823                 { },
12824                 INTERNAL | FLAG_NO_DATA,
12825                 { },
12826                 { { 0, 1 } },
12827                 .fill_helper = bpf_fill_atomic32_and,
12828                 .stack_depth = 8,
12829                 .nr_testruns = NR_PATTERN_RUNS,
12830         },
12831         {
12832                 "ATOMIC_W_OR: all operand magnitudes",
12833                 { },
12834                 INTERNAL | FLAG_NO_DATA,
12835                 { },
12836                 { { 0, 1 } },
12837                 .fill_helper = bpf_fill_atomic32_or,
12838                 .stack_depth = 8,
12839                 .nr_testruns = NR_PATTERN_RUNS,
12840         },
12841         {
12842                 "ATOMIC_W_XOR: all operand magnitudes",
12843                 { },
12844                 INTERNAL | FLAG_NO_DATA,
12845                 { },
12846                 { { 0, 1 } },
12847                 .fill_helper = bpf_fill_atomic32_xor,
12848                 .stack_depth = 8,
12849                 .nr_testruns = NR_PATTERN_RUNS,
12850         },
12851         {
12852                 "ATOMIC_W_ADD_FETCH: all operand magnitudes",
12853                 { },
12854                 INTERNAL | FLAG_NO_DATA,
12855                 { },
12856                 { { 0, 1 } },
12857                 .fill_helper = bpf_fill_atomic32_add_fetch,
12858                 .stack_depth = 8,
12859                 .nr_testruns = NR_PATTERN_RUNS,
12860         },
12861         {
12862                 "ATOMIC_W_AND_FETCH: all operand magnitudes",
12863                 { },
12864                 INTERNAL | FLAG_NO_DATA,
12865                 { },
12866                 { { 0, 1 } },
12867                 .fill_helper = bpf_fill_atomic32_and_fetch,
12868                 .stack_depth = 8,
12869                 .nr_testruns = NR_PATTERN_RUNS,
12870         },
12871         {
12872                 "ATOMIC_W_OR_FETCH: all operand magnitudes",
12873                 { },
12874                 INTERNAL | FLAG_NO_DATA,
12875                 { },
12876                 { { 0, 1 } },
12877                 .fill_helper = bpf_fill_atomic32_or_fetch,
12878                 .stack_depth = 8,
12879                 .nr_testruns = NR_PATTERN_RUNS,
12880         },
12881         {
12882                 "ATOMIC_W_XOR_FETCH: all operand magnitudes",
12883                 { },
12884                 INTERNAL | FLAG_NO_DATA,
12885                 { },
12886                 { { 0, 1 } },
12887                 .fill_helper = bpf_fill_atomic32_xor_fetch,
12888                 .stack_depth = 8,
12889                 .nr_testruns = NR_PATTERN_RUNS,
12890         },
12891         {
12892                 "ATOMIC_W_XCHG: all operand magnitudes",
12893                 { },
12894                 INTERNAL | FLAG_NO_DATA,
12895                 { },
12896                 { { 0, 1 } },
12897                 .fill_helper = bpf_fill_atomic32_xchg,
12898                 .stack_depth = 8,
12899                 .nr_testruns = NR_PATTERN_RUNS,
12900         },
12901         {
12902                 "ATOMIC_W_CMPXCHG: all operand magnitudes",
12903                 { },
12904                 INTERNAL | FLAG_NO_DATA,
12905                 { },
12906                 { { 0, 1 } },
12907                 .fill_helper = bpf_fill_cmpxchg32,
12908                 .stack_depth = 8,
12909                 .nr_testruns = NR_PATTERN_RUNS,
12910         },
12911         /* JMP immediate magnitudes */
12912         {
12913                 "JMP_JSET_K: all immediate value magnitudes",
12914                 { },
12915                 INTERNAL | FLAG_NO_DATA,
12916                 { },
12917                 { { 0, 1 } },
12918                 .fill_helper = bpf_fill_jmp_jset_imm,
12919                 .nr_testruns = NR_PATTERN_RUNS,
12920         },
12921         {
12922                 "JMP_JEQ_K: all immediate value magnitudes",
12923                 { },
12924                 INTERNAL | FLAG_NO_DATA,
12925                 { },
12926                 { { 0, 1 } },
12927                 .fill_helper = bpf_fill_jmp_jeq_imm,
12928                 .nr_testruns = NR_PATTERN_RUNS,
12929         },
12930         {
12931                 "JMP_JNE_K: all immediate value magnitudes",
12932                 { },
12933                 INTERNAL | FLAG_NO_DATA,
12934                 { },
12935                 { { 0, 1 } },
12936                 .fill_helper = bpf_fill_jmp_jne_imm,
12937                 .nr_testruns = NR_PATTERN_RUNS,
12938         },
12939         {
12940                 "JMP_JGT_K: all immediate value magnitudes",
12941                 { },
12942                 INTERNAL | FLAG_NO_DATA,
12943                 { },
12944                 { { 0, 1 } },
12945                 .fill_helper = bpf_fill_jmp_jgt_imm,
12946                 .nr_testruns = NR_PATTERN_RUNS,
12947         },
12948         {
12949                 "JMP_JGE_K: all immediate value magnitudes",
12950                 { },
12951                 INTERNAL | FLAG_NO_DATA,
12952                 { },
12953                 { { 0, 1 } },
12954                 .fill_helper = bpf_fill_jmp_jge_imm,
12955                 .nr_testruns = NR_PATTERN_RUNS,
12956         },
12957         {
12958                 "JMP_JLT_K: all immediate value magnitudes",
12959                 { },
12960                 INTERNAL | FLAG_NO_DATA,
12961                 { },
12962                 { { 0, 1 } },
12963                 .fill_helper = bpf_fill_jmp_jlt_imm,
12964                 .nr_testruns = NR_PATTERN_RUNS,
12965         },
12966         {
12967                 "JMP_JLE_K: all immediate value magnitudes",
12968                 { },
12969                 INTERNAL | FLAG_NO_DATA,
12970                 { },
12971                 { { 0, 1 } },
12972                 .fill_helper = bpf_fill_jmp_jle_imm,
12973                 .nr_testruns = NR_PATTERN_RUNS,
12974         },
12975         {
12976                 "JMP_JSGT_K: all immediate value magnitudes",
12977                 { },
12978                 INTERNAL | FLAG_NO_DATA,
12979                 { },
12980                 { { 0, 1 } },
12981                 .fill_helper = bpf_fill_jmp_jsgt_imm,
12982                 .nr_testruns = NR_PATTERN_RUNS,
12983         },
12984         {
12985                 "JMP_JSGE_K: all immediate value magnitudes",
12986                 { },
12987                 INTERNAL | FLAG_NO_DATA,
12988                 { },
12989                 { { 0, 1 } },
12990                 .fill_helper = bpf_fill_jmp_jsge_imm,
12991                 .nr_testruns = NR_PATTERN_RUNS,
12992         },
12993         {
12994                 "JMP_JSLT_K: all immediate value magnitudes",
12995                 { },
12996                 INTERNAL | FLAG_NO_DATA,
12997                 { },
12998                 { { 0, 1 } },
12999                 .fill_helper = bpf_fill_jmp_jslt_imm,
13000                 .nr_testruns = NR_PATTERN_RUNS,
13001         },
13002         {
13003                 "JMP_JSLE_K: all immediate value magnitudes",
13004                 { },
13005                 INTERNAL | FLAG_NO_DATA,
13006                 { },
13007                 { { 0, 1 } },
13008                 .fill_helper = bpf_fill_jmp_jsle_imm,
13009                 .nr_testruns = NR_PATTERN_RUNS,
13010         },
13011         /* JMP register magnitudes */
13012         {
13013                 "JMP_JSET_X: all register value magnitudes",
13014                 { },
13015                 INTERNAL | FLAG_NO_DATA,
13016                 { },
13017                 { { 0, 1 } },
13018                 .fill_helper = bpf_fill_jmp_jset_reg,
13019                 .nr_testruns = NR_PATTERN_RUNS,
13020         },
13021         {
13022                 "JMP_JEQ_X: all register value magnitudes",
13023                 { },
13024                 INTERNAL | FLAG_NO_DATA,
13025                 { },
13026                 { { 0, 1 } },
13027                 .fill_helper = bpf_fill_jmp_jeq_reg,
13028                 .nr_testruns = NR_PATTERN_RUNS,
13029         },
13030         {
13031                 "JMP_JNE_X: all register value magnitudes",
13032                 { },
13033                 INTERNAL | FLAG_NO_DATA,
13034                 { },
13035                 { { 0, 1 } },
13036                 .fill_helper = bpf_fill_jmp_jne_reg,
13037                 .nr_testruns = NR_PATTERN_RUNS,
13038         },
13039         {
13040                 "JMP_JGT_X: all register value magnitudes",
13041                 { },
13042                 INTERNAL | FLAG_NO_DATA,
13043                 { },
13044                 { { 0, 1 } },
13045                 .fill_helper = bpf_fill_jmp_jgt_reg,
13046                 .nr_testruns = NR_PATTERN_RUNS,
13047         },
13048         {
13049                 "JMP_JGE_X: all register value magnitudes",
13050                 { },
13051                 INTERNAL | FLAG_NO_DATA,
13052                 { },
13053                 { { 0, 1 } },
13054                 .fill_helper = bpf_fill_jmp_jge_reg,
13055                 .nr_testruns = NR_PATTERN_RUNS,
13056         },
13057         {
13058                 "JMP_JLT_X: all register value magnitudes",
13059                 { },
13060                 INTERNAL | FLAG_NO_DATA,
13061                 { },
13062                 { { 0, 1 } },
13063                 .fill_helper = bpf_fill_jmp_jlt_reg,
13064                 .nr_testruns = NR_PATTERN_RUNS,
13065         },
13066         {
13067                 "JMP_JLE_X: all register value magnitudes",
13068                 { },
13069                 INTERNAL | FLAG_NO_DATA,
13070                 { },
13071                 { { 0, 1 } },
13072                 .fill_helper = bpf_fill_jmp_jle_reg,
13073                 .nr_testruns = NR_PATTERN_RUNS,
13074         },
13075         {
13076                 "JMP_JSGT_X: all register value magnitudes",
13077                 { },
13078                 INTERNAL | FLAG_NO_DATA,
13079                 { },
13080                 { { 0, 1 } },
13081                 .fill_helper = bpf_fill_jmp_jsgt_reg,
13082                 .nr_testruns = NR_PATTERN_RUNS,
13083         },
13084         {
13085                 "JMP_JSGE_X: all register value magnitudes",
13086                 { },
13087                 INTERNAL | FLAG_NO_DATA,
13088                 { },
13089                 { { 0, 1 } },
13090                 .fill_helper = bpf_fill_jmp_jsge_reg,
13091                 .nr_testruns = NR_PATTERN_RUNS,
13092         },
13093         {
13094                 "JMP_JSLT_X: all register value magnitudes",
13095                 { },
13096                 INTERNAL | FLAG_NO_DATA,
13097                 { },
13098                 { { 0, 1 } },
13099                 .fill_helper = bpf_fill_jmp_jslt_reg,
13100                 .nr_testruns = NR_PATTERN_RUNS,
13101         },
13102         {
13103                 "JMP_JSLE_X: all register value magnitudes",
13104                 { },
13105                 INTERNAL | FLAG_NO_DATA,
13106                 { },
13107                 { { 0, 1 } },
13108                 .fill_helper = bpf_fill_jmp_jsle_reg,
13109                 .nr_testruns = NR_PATTERN_RUNS,
13110         },
13111         /* JMP32 immediate magnitudes */
13112         {
13113                 "JMP32_JSET_K: all immediate value magnitudes",
13114                 { },
13115                 INTERNAL | FLAG_NO_DATA,
13116                 { },
13117                 { { 0, 1 } },
13118                 .fill_helper = bpf_fill_jmp32_jset_imm,
13119                 .nr_testruns = NR_PATTERN_RUNS,
13120         },
13121         {
13122                 "JMP32_JEQ_K: all immediate value magnitudes",
13123                 { },
13124                 INTERNAL | FLAG_NO_DATA,
13125                 { },
13126                 { { 0, 1 } },
13127                 .fill_helper = bpf_fill_jmp32_jeq_imm,
13128                 .nr_testruns = NR_PATTERN_RUNS,
13129         },
13130         {
13131                 "JMP32_JNE_K: all immediate value magnitudes",
13132                 { },
13133                 INTERNAL | FLAG_NO_DATA,
13134                 { },
13135                 { { 0, 1 } },
13136                 .fill_helper = bpf_fill_jmp32_jne_imm,
13137                 .nr_testruns = NR_PATTERN_RUNS,
13138         },
13139         {
13140                 "JMP32_JGT_K: all immediate value magnitudes",
13141                 { },
13142                 INTERNAL | FLAG_NO_DATA,
13143                 { },
13144                 { { 0, 1 } },
13145                 .fill_helper = bpf_fill_jmp32_jgt_imm,
13146                 .nr_testruns = NR_PATTERN_RUNS,
13147         },
13148         {
13149                 "JMP32_JGE_K: all immediate value magnitudes",
13150                 { },
13151                 INTERNAL | FLAG_NO_DATA,
13152                 { },
13153                 { { 0, 1 } },
13154                 .fill_helper = bpf_fill_jmp32_jge_imm,
13155                 .nr_testruns = NR_PATTERN_RUNS,
13156         },
13157         {
13158                 "JMP32_JLT_K: all immediate value magnitudes",
13159                 { },
13160                 INTERNAL | FLAG_NO_DATA,
13161                 { },
13162                 { { 0, 1 } },
13163                 .fill_helper = bpf_fill_jmp32_jlt_imm,
13164                 .nr_testruns = NR_PATTERN_RUNS,
13165         },
13166         {
13167                 "JMP32_JLE_K: all immediate value magnitudes",
13168                 { },
13169                 INTERNAL | FLAG_NO_DATA,
13170                 { },
13171                 { { 0, 1 } },
13172                 .fill_helper = bpf_fill_jmp32_jle_imm,
13173                 .nr_testruns = NR_PATTERN_RUNS,
13174         },
13175         {
13176                 "JMP32_JSGT_K: all immediate value magnitudes",
13177                 { },
13178                 INTERNAL | FLAG_NO_DATA,
13179                 { },
13180                 { { 0, 1 } },
13181                 .fill_helper = bpf_fill_jmp32_jsgt_imm,
13182                 .nr_testruns = NR_PATTERN_RUNS,
13183         },
13184         {
13185                 "JMP32_JSGE_K: all immediate value magnitudes",
13186                 { },
13187                 INTERNAL | FLAG_NO_DATA,
13188                 { },
13189                 { { 0, 1 } },
13190                 .fill_helper = bpf_fill_jmp32_jsge_imm,
13191                 .nr_testruns = NR_PATTERN_RUNS,
13192         },
13193         {
13194                 "JMP32_JSLT_K: all immediate value magnitudes",
13195                 { },
13196                 INTERNAL | FLAG_NO_DATA,
13197                 { },
13198                 { { 0, 1 } },
13199                 .fill_helper = bpf_fill_jmp32_jslt_imm,
13200                 .nr_testruns = NR_PATTERN_RUNS,
13201         },
13202         {
13203                 "JMP32_JSLE_K: all immediate value magnitudes",
13204                 { },
13205                 INTERNAL | FLAG_NO_DATA,
13206                 { },
13207                 { { 0, 1 } },
13208                 .fill_helper = bpf_fill_jmp32_jsle_imm,
13209                 .nr_testruns = NR_PATTERN_RUNS,
13210         },
13211         /* JMP32 register magnitudes */
13212         {
13213                 "JMP32_JSET_X: all register value magnitudes",
13214                 { },
13215                 INTERNAL | FLAG_NO_DATA,
13216                 { },
13217                 { { 0, 1 } },
13218                 .fill_helper = bpf_fill_jmp32_jset_reg,
13219                 .nr_testruns = NR_PATTERN_RUNS,
13220         },
13221         {
13222                 "JMP32_JEQ_X: all register value magnitudes",
13223                 { },
13224                 INTERNAL | FLAG_NO_DATA,
13225                 { },
13226                 { { 0, 1 } },
13227                 .fill_helper = bpf_fill_jmp32_jeq_reg,
13228                 .nr_testruns = NR_PATTERN_RUNS,
13229         },
13230         {
13231                 "JMP32_JNE_X: all register value magnitudes",
13232                 { },
13233                 INTERNAL | FLAG_NO_DATA,
13234                 { },
13235                 { { 0, 1 } },
13236                 .fill_helper = bpf_fill_jmp32_jne_reg,
13237                 .nr_testruns = NR_PATTERN_RUNS,
13238         },
13239         {
13240                 "JMP32_JGT_X: all register value magnitudes",
13241                 { },
13242                 INTERNAL | FLAG_NO_DATA,
13243                 { },
13244                 { { 0, 1 } },
13245                 .fill_helper = bpf_fill_jmp32_jgt_reg,
13246                 .nr_testruns = NR_PATTERN_RUNS,
13247         },
13248         {
13249                 "JMP32_JGE_X: all register value magnitudes",
13250                 { },
13251                 INTERNAL | FLAG_NO_DATA,
13252                 { },
13253                 { { 0, 1 } },
13254                 .fill_helper = bpf_fill_jmp32_jge_reg,
13255                 .nr_testruns = NR_PATTERN_RUNS,
13256         },
13257         {
13258                 "JMP32_JLT_X: all register value magnitudes",
13259                 { },
13260                 INTERNAL | FLAG_NO_DATA,
13261                 { },
13262                 { { 0, 1 } },
13263                 .fill_helper = bpf_fill_jmp32_jlt_reg,
13264                 .nr_testruns = NR_PATTERN_RUNS,
13265         },
13266         {
13267                 "JMP32_JLE_X: all register value magnitudes",
13268                 { },
13269                 INTERNAL | FLAG_NO_DATA,
13270                 { },
13271                 { { 0, 1 } },
13272                 .fill_helper = bpf_fill_jmp32_jle_reg,
13273                 .nr_testruns = NR_PATTERN_RUNS,
13274         },
13275         {
13276                 "JMP32_JSGT_X: all register value magnitudes",
13277                 { },
13278                 INTERNAL | FLAG_NO_DATA,
13279                 { },
13280                 { { 0, 1 } },
13281                 .fill_helper = bpf_fill_jmp32_jsgt_reg,
13282                 .nr_testruns = NR_PATTERN_RUNS,
13283         },
13284         {
13285                 "JMP32_JSGE_X: all register value magnitudes",
13286                 { },
13287                 INTERNAL | FLAG_NO_DATA,
13288                 { },
13289                 { { 0, 1 } },
13290                 .fill_helper = bpf_fill_jmp32_jsge_reg,
13291                 .nr_testruns = NR_PATTERN_RUNS,
13292         },
13293         {
13294                 "JMP32_JSLT_X: all register value magnitudes",
13295                 { },
13296                 INTERNAL | FLAG_NO_DATA,
13297                 { },
13298                 { { 0, 1 } },
13299                 .fill_helper = bpf_fill_jmp32_jslt_reg,
13300                 .nr_testruns = NR_PATTERN_RUNS,
13301         },
13302         {
13303                 "JMP32_JSLE_X: all register value magnitudes",
13304                 { },
13305                 INTERNAL | FLAG_NO_DATA,
13306                 { },
13307                 { { 0, 1 } },
13308                 .fill_helper = bpf_fill_jmp32_jsle_reg,
13309                 .nr_testruns = NR_PATTERN_RUNS,
13310         },
13311         /* Conditional jumps with constant decision */
13312         {
13313                 "JMP_JSET_K: imm = 0 -> never taken",
13314                 .u.insns_int = {
13315                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13316                         BPF_JMP_IMM(BPF_JSET, R1, 0, 1),
13317                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13318                         BPF_EXIT_INSN(),
13319                 },
13320                 INTERNAL | FLAG_NO_DATA,
13321                 { },
13322                 { { 0, 0 } },
13323         },
13324         {
13325                 "JMP_JLT_K: imm = 0 -> never taken",
13326                 .u.insns_int = {
13327                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13328                         BPF_JMP_IMM(BPF_JLT, R1, 0, 1),
13329                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13330                         BPF_EXIT_INSN(),
13331                 },
13332                 INTERNAL | FLAG_NO_DATA,
13333                 { },
13334                 { { 0, 0 } },
13335         },
13336         {
13337                 "JMP_JGE_K: imm = 0 -> always taken",
13338                 .u.insns_int = {
13339                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13340                         BPF_JMP_IMM(BPF_JGE, R1, 0, 1),
13341                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13342                         BPF_EXIT_INSN(),
13343                 },
13344                 INTERNAL | FLAG_NO_DATA,
13345                 { },
13346                 { { 0, 1 } },
13347         },
13348         {
13349                 "JMP_JGT_K: imm = 0xffffffff -> never taken",
13350                 .u.insns_int = {
13351                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13352                         BPF_JMP_IMM(BPF_JGT, R1, U32_MAX, 1),
13353                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13354                         BPF_EXIT_INSN(),
13355                 },
13356                 INTERNAL | FLAG_NO_DATA,
13357                 { },
13358                 { { 0, 0 } },
13359         },
13360         {
13361                 "JMP_JLE_K: imm = 0xffffffff -> always taken",
13362                 .u.insns_int = {
13363                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13364                         BPF_JMP_IMM(BPF_JLE, R1, U32_MAX, 1),
13365                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13366                         BPF_EXIT_INSN(),
13367                 },
13368                 INTERNAL | FLAG_NO_DATA,
13369                 { },
13370                 { { 0, 1 } },
13371         },
13372         {
13373                 "JMP32_JSGT_K: imm = 0x7fffffff -> never taken",
13374                 .u.insns_int = {
13375                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13376                         BPF_JMP32_IMM(BPF_JSGT, R1, S32_MAX, 1),
13377                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13378                         BPF_EXIT_INSN(),
13379                 },
13380                 INTERNAL | FLAG_NO_DATA,
13381                 { },
13382                 { { 0, 0 } },
13383         },
13384         {
13385                 "JMP32_JSGE_K: imm = -0x80000000 -> always taken",
13386                 .u.insns_int = {
13387                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13388                         BPF_JMP32_IMM(BPF_JSGE, R1, S32_MIN, 1),
13389                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13390                         BPF_EXIT_INSN(),
13391                 },
13392                 INTERNAL | FLAG_NO_DATA,
13393                 { },
13394                 { { 0, 1 } },
13395         },
13396         {
13397                 "JMP32_JSLT_K: imm = -0x80000000 -> never taken",
13398                 .u.insns_int = {
13399                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13400                         BPF_JMP32_IMM(BPF_JSLT, R1, S32_MIN, 1),
13401                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13402                         BPF_EXIT_INSN(),
13403                 },
13404                 INTERNAL | FLAG_NO_DATA,
13405                 { },
13406                 { { 0, 0 } },
13407         },
13408         {
13409                 "JMP32_JSLE_K: imm = 0x7fffffff -> always taken",
13410                 .u.insns_int = {
13411                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13412                         BPF_JMP32_IMM(BPF_JSLE, R1, S32_MAX, 1),
13413                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13414                         BPF_EXIT_INSN(),
13415                 },
13416                 INTERNAL | FLAG_NO_DATA,
13417                 { },
13418                 { { 0, 1 } },
13419         },
13420         {
13421                 "JMP_JEQ_X: dst = src -> always taken",
13422                 .u.insns_int = {
13423                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13424                         BPF_JMP_REG(BPF_JEQ, R1, R1, 1),
13425                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13426                         BPF_EXIT_INSN(),
13427                 },
13428                 INTERNAL | FLAG_NO_DATA,
13429                 { },
13430                 { { 0, 1 } },
13431         },
13432         {
13433                 "JMP_JGE_X: dst = src -> always taken",
13434                 .u.insns_int = {
13435                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13436                         BPF_JMP_REG(BPF_JGE, R1, R1, 1),
13437                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13438                         BPF_EXIT_INSN(),
13439                 },
13440                 INTERNAL | FLAG_NO_DATA,
13441                 { },
13442                 { { 0, 1 } },
13443         },
13444         {
13445                 "JMP_JLE_X: dst = src -> always taken",
13446                 .u.insns_int = {
13447                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13448                         BPF_JMP_REG(BPF_JLE, R1, R1, 1),
13449                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13450                         BPF_EXIT_INSN(),
13451                 },
13452                 INTERNAL | FLAG_NO_DATA,
13453                 { },
13454                 { { 0, 1 } },
13455         },
13456         {
13457                 "JMP_JSGE_X: dst = src -> always taken",
13458                 .u.insns_int = {
13459                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13460                         BPF_JMP_REG(BPF_JSGE, R1, R1, 1),
13461                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13462                         BPF_EXIT_INSN(),
13463                 },
13464                 INTERNAL | FLAG_NO_DATA,
13465                 { },
13466                 { { 0, 1 } },
13467         },
13468         {
13469                 "JMP_JSLE_X: dst = src -> always taken",
13470                 .u.insns_int = {
13471                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13472                         BPF_JMP_REG(BPF_JSLE, R1, R1, 1),
13473                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13474                         BPF_EXIT_INSN(),
13475                 },
13476                 INTERNAL | FLAG_NO_DATA,
13477                 { },
13478                 { { 0, 1 } },
13479         },
13480         {
13481                 "JMP_JNE_X: dst = src -> never taken",
13482                 .u.insns_int = {
13483                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13484                         BPF_JMP_REG(BPF_JNE, R1, R1, 1),
13485                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13486                         BPF_EXIT_INSN(),
13487                 },
13488                 INTERNAL | FLAG_NO_DATA,
13489                 { },
13490                 { { 0, 0 } },
13491         },
13492         {
13493                 "JMP_JGT_X: dst = src -> never taken",
13494                 .u.insns_int = {
13495                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13496                         BPF_JMP_REG(BPF_JGT, R1, R1, 1),
13497                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13498                         BPF_EXIT_INSN(),
13499                 },
13500                 INTERNAL | FLAG_NO_DATA,
13501                 { },
13502                 { { 0, 0 } },
13503         },
13504         {
13505                 "JMP_JLT_X: dst = src -> never taken",
13506                 .u.insns_int = {
13507                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13508                         BPF_JMP_REG(BPF_JLT, R1, R1, 1),
13509                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13510                         BPF_EXIT_INSN(),
13511                 },
13512                 INTERNAL | FLAG_NO_DATA,
13513                 { },
13514                 { { 0, 0 } },
13515         },
13516         {
13517                 "JMP_JSGT_X: dst = src -> never taken",
13518                 .u.insns_int = {
13519                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13520                         BPF_JMP_REG(BPF_JSGT, R1, R1, 1),
13521                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13522                         BPF_EXIT_INSN(),
13523                 },
13524                 INTERNAL | FLAG_NO_DATA,
13525                 { },
13526                 { { 0, 0 } },
13527         },
13528         {
13529                 "JMP_JSLT_X: dst = src -> never taken",
13530                 .u.insns_int = {
13531                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
13532                         BPF_JMP_REG(BPF_JSLT, R1, R1, 1),
13533                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13534                         BPF_EXIT_INSN(),
13535                 },
13536                 INTERNAL | FLAG_NO_DATA,
13537                 { },
13538                 { { 0, 0 } },
13539         },
13540         /* Short relative jumps */
13541         {
13542                 "Short relative jump: offset=0",
13543                 .u.insns_int = {
13544                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13545                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 0),
13546                         BPF_EXIT_INSN(),
13547                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
13548                 },
13549                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
13550                 { },
13551                 { { 0, 0 } },
13552         },
13553         {
13554                 "Short relative jump: offset=1",
13555                 .u.insns_int = {
13556                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13557                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 1),
13558                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13559                         BPF_EXIT_INSN(),
13560                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
13561                 },
13562                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
13563                 { },
13564                 { { 0, 0 } },
13565         },
13566         {
13567                 "Short relative jump: offset=2",
13568                 .u.insns_int = {
13569                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13570                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
13571                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13572                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13573                         BPF_EXIT_INSN(),
13574                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
13575                 },
13576                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
13577                 { },
13578                 { { 0, 0 } },
13579         },
13580         {
13581                 "Short relative jump: offset=3",
13582                 .u.insns_int = {
13583                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13584                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 3),
13585                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13586                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13587                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13588                         BPF_EXIT_INSN(),
13589                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
13590                 },
13591                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
13592                 { },
13593                 { { 0, 0 } },
13594         },
13595         {
13596                 "Short relative jump: offset=4",
13597                 .u.insns_int = {
13598                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
13599                         BPF_JMP_IMM(BPF_JEQ, R0, 0, 4),
13600                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13601                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13602                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13603                         BPF_ALU32_IMM(BPF_ADD, R0, 1),
13604                         BPF_EXIT_INSN(),
13605                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
13606                 },
13607                 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
13608                 { },
13609                 { { 0, 0 } },
13610         },
13611         /* Conditional branch conversions */
13612         {
13613                 "Long conditional jump: taken at runtime",
13614                 { },
13615                 INTERNAL | FLAG_NO_DATA,
13616                 { },
13617                 { { 0, 1 } },
13618                 .fill_helper = bpf_fill_max_jmp_taken,
13619         },
13620         {
13621                 "Long conditional jump: not taken at runtime",
13622                 { },
13623                 INTERNAL | FLAG_NO_DATA,
13624                 { },
13625                 { { 0, 2 } },
13626                 .fill_helper = bpf_fill_max_jmp_not_taken,
13627         },
13628         {
13629                 "Long conditional jump: always taken, known at JIT time",
13630                 { },
13631                 INTERNAL | FLAG_NO_DATA,
13632                 { },
13633                 { { 0, 1 } },
13634                 .fill_helper = bpf_fill_max_jmp_always_taken,
13635         },
13636         {
13637                 "Long conditional jump: never taken, known at JIT time",
13638                 { },
13639                 INTERNAL | FLAG_NO_DATA,
13640                 { },
13641                 { { 0, 2 } },
13642                 .fill_helper = bpf_fill_max_jmp_never_taken,
13643         },
13644         /* Staggered jump sequences, immediate */
13645         {
13646                 "Staggered jumps: JMP_JA",
13647                 { },
13648                 INTERNAL | FLAG_NO_DATA,
13649                 { },
13650                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13651                 .fill_helper = bpf_fill_staggered_ja,
13652                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13653         },
13654         {
13655                 "Staggered jumps: JMP_JEQ_K",
13656                 { },
13657                 INTERNAL | FLAG_NO_DATA,
13658                 { },
13659                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13660                 .fill_helper = bpf_fill_staggered_jeq_imm,
13661                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13662         },
13663         {
13664                 "Staggered jumps: JMP_JNE_K",
13665                 { },
13666                 INTERNAL | FLAG_NO_DATA,
13667                 { },
13668                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13669                 .fill_helper = bpf_fill_staggered_jne_imm,
13670                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13671         },
13672         {
13673                 "Staggered jumps: JMP_JSET_K",
13674                 { },
13675                 INTERNAL | FLAG_NO_DATA,
13676                 { },
13677                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13678                 .fill_helper = bpf_fill_staggered_jset_imm,
13679                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13680         },
13681         {
13682                 "Staggered jumps: JMP_JGT_K",
13683                 { },
13684                 INTERNAL | FLAG_NO_DATA,
13685                 { },
13686                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13687                 .fill_helper = bpf_fill_staggered_jgt_imm,
13688                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13689         },
13690         {
13691                 "Staggered jumps: JMP_JGE_K",
13692                 { },
13693                 INTERNAL | FLAG_NO_DATA,
13694                 { },
13695                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13696                 .fill_helper = bpf_fill_staggered_jge_imm,
13697                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13698         },
13699         {
13700                 "Staggered jumps: JMP_JLT_K",
13701                 { },
13702                 INTERNAL | FLAG_NO_DATA,
13703                 { },
13704                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13705                 .fill_helper = bpf_fill_staggered_jlt_imm,
13706                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13707         },
13708         {
13709                 "Staggered jumps: JMP_JLE_K",
13710                 { },
13711                 INTERNAL | FLAG_NO_DATA,
13712                 { },
13713                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13714                 .fill_helper = bpf_fill_staggered_jle_imm,
13715                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13716         },
13717         {
13718                 "Staggered jumps: JMP_JSGT_K",
13719                 { },
13720                 INTERNAL | FLAG_NO_DATA,
13721                 { },
13722                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13723                 .fill_helper = bpf_fill_staggered_jsgt_imm,
13724                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13725         },
13726         {
13727                 "Staggered jumps: JMP_JSGE_K",
13728                 { },
13729                 INTERNAL | FLAG_NO_DATA,
13730                 { },
13731                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13732                 .fill_helper = bpf_fill_staggered_jsge_imm,
13733                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13734         },
13735         {
13736                 "Staggered jumps: JMP_JSLT_K",
13737                 { },
13738                 INTERNAL | FLAG_NO_DATA,
13739                 { },
13740                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13741                 .fill_helper = bpf_fill_staggered_jslt_imm,
13742                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13743         },
13744         {
13745                 "Staggered jumps: JMP_JSLE_K",
13746                 { },
13747                 INTERNAL | FLAG_NO_DATA,
13748                 { },
13749                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13750                 .fill_helper = bpf_fill_staggered_jsle_imm,
13751                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13752         },
13753         /* Staggered jump sequences, register */
13754         {
13755                 "Staggered jumps: JMP_JEQ_X",
13756                 { },
13757                 INTERNAL | FLAG_NO_DATA,
13758                 { },
13759                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13760                 .fill_helper = bpf_fill_staggered_jeq_reg,
13761                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13762         },
13763         {
13764                 "Staggered jumps: JMP_JNE_X",
13765                 { },
13766                 INTERNAL | FLAG_NO_DATA,
13767                 { },
13768                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13769                 .fill_helper = bpf_fill_staggered_jne_reg,
13770                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13771         },
13772         {
13773                 "Staggered jumps: JMP_JSET_X",
13774                 { },
13775                 INTERNAL | FLAG_NO_DATA,
13776                 { },
13777                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13778                 .fill_helper = bpf_fill_staggered_jset_reg,
13779                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13780         },
13781         {
13782                 "Staggered jumps: JMP_JGT_X",
13783                 { },
13784                 INTERNAL | FLAG_NO_DATA,
13785                 { },
13786                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13787                 .fill_helper = bpf_fill_staggered_jgt_reg,
13788                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13789         },
13790         {
13791                 "Staggered jumps: JMP_JGE_X",
13792                 { },
13793                 INTERNAL | FLAG_NO_DATA,
13794                 { },
13795                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13796                 .fill_helper = bpf_fill_staggered_jge_reg,
13797                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13798         },
13799         {
13800                 "Staggered jumps: JMP_JLT_X",
13801                 { },
13802                 INTERNAL | FLAG_NO_DATA,
13803                 { },
13804                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13805                 .fill_helper = bpf_fill_staggered_jlt_reg,
13806                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13807         },
13808         {
13809                 "Staggered jumps: JMP_JLE_X",
13810                 { },
13811                 INTERNAL | FLAG_NO_DATA,
13812                 { },
13813                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13814                 .fill_helper = bpf_fill_staggered_jle_reg,
13815                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13816         },
13817         {
13818                 "Staggered jumps: JMP_JSGT_X",
13819                 { },
13820                 INTERNAL | FLAG_NO_DATA,
13821                 { },
13822                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13823                 .fill_helper = bpf_fill_staggered_jsgt_reg,
13824                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13825         },
13826         {
13827                 "Staggered jumps: JMP_JSGE_X",
13828                 { },
13829                 INTERNAL | FLAG_NO_DATA,
13830                 { },
13831                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13832                 .fill_helper = bpf_fill_staggered_jsge_reg,
13833                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13834         },
13835         {
13836                 "Staggered jumps: JMP_JSLT_X",
13837                 { },
13838                 INTERNAL | FLAG_NO_DATA,
13839                 { },
13840                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13841                 .fill_helper = bpf_fill_staggered_jslt_reg,
13842                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13843         },
13844         {
13845                 "Staggered jumps: JMP_JSLE_X",
13846                 { },
13847                 INTERNAL | FLAG_NO_DATA,
13848                 { },
13849                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13850                 .fill_helper = bpf_fill_staggered_jsle_reg,
13851                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13852         },
13853         /* Staggered jump sequences, JMP32 immediate */
13854         {
13855                 "Staggered jumps: JMP32_JEQ_K",
13856                 { },
13857                 INTERNAL | FLAG_NO_DATA,
13858                 { },
13859                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13860                 .fill_helper = bpf_fill_staggered_jeq32_imm,
13861                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13862         },
13863         {
13864                 "Staggered jumps: JMP32_JNE_K",
13865                 { },
13866                 INTERNAL | FLAG_NO_DATA,
13867                 { },
13868                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13869                 .fill_helper = bpf_fill_staggered_jne32_imm,
13870                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13871         },
13872         {
13873                 "Staggered jumps: JMP32_JSET_K",
13874                 { },
13875                 INTERNAL | FLAG_NO_DATA,
13876                 { },
13877                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13878                 .fill_helper = bpf_fill_staggered_jset32_imm,
13879                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13880         },
13881         {
13882                 "Staggered jumps: JMP32_JGT_K",
13883                 { },
13884                 INTERNAL | FLAG_NO_DATA,
13885                 { },
13886                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13887                 .fill_helper = bpf_fill_staggered_jgt32_imm,
13888                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13889         },
13890         {
13891                 "Staggered jumps: JMP32_JGE_K",
13892                 { },
13893                 INTERNAL | FLAG_NO_DATA,
13894                 { },
13895                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13896                 .fill_helper = bpf_fill_staggered_jge32_imm,
13897                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13898         },
13899         {
13900                 "Staggered jumps: JMP32_JLT_K",
13901                 { },
13902                 INTERNAL | FLAG_NO_DATA,
13903                 { },
13904                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13905                 .fill_helper = bpf_fill_staggered_jlt32_imm,
13906                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13907         },
13908         {
13909                 "Staggered jumps: JMP32_JLE_K",
13910                 { },
13911                 INTERNAL | FLAG_NO_DATA,
13912                 { },
13913                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13914                 .fill_helper = bpf_fill_staggered_jle32_imm,
13915                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13916         },
13917         {
13918                 "Staggered jumps: JMP32_JSGT_K",
13919                 { },
13920                 INTERNAL | FLAG_NO_DATA,
13921                 { },
13922                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13923                 .fill_helper = bpf_fill_staggered_jsgt32_imm,
13924                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13925         },
13926         {
13927                 "Staggered jumps: JMP32_JSGE_K",
13928                 { },
13929                 INTERNAL | FLAG_NO_DATA,
13930                 { },
13931                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13932                 .fill_helper = bpf_fill_staggered_jsge32_imm,
13933                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13934         },
13935         {
13936                 "Staggered jumps: JMP32_JSLT_K",
13937                 { },
13938                 INTERNAL | FLAG_NO_DATA,
13939                 { },
13940                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13941                 .fill_helper = bpf_fill_staggered_jslt32_imm,
13942                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13943         },
13944         {
13945                 "Staggered jumps: JMP32_JSLE_K",
13946                 { },
13947                 INTERNAL | FLAG_NO_DATA,
13948                 { },
13949                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13950                 .fill_helper = bpf_fill_staggered_jsle32_imm,
13951                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13952         },
13953         /* Staggered jump sequences, JMP32 register */
13954         {
13955                 "Staggered jumps: JMP32_JEQ_X",
13956                 { },
13957                 INTERNAL | FLAG_NO_DATA,
13958                 { },
13959                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13960                 .fill_helper = bpf_fill_staggered_jeq32_reg,
13961                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13962         },
13963         {
13964                 "Staggered jumps: JMP32_JNE_X",
13965                 { },
13966                 INTERNAL | FLAG_NO_DATA,
13967                 { },
13968                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13969                 .fill_helper = bpf_fill_staggered_jne32_reg,
13970                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13971         },
13972         {
13973                 "Staggered jumps: JMP32_JSET_X",
13974                 { },
13975                 INTERNAL | FLAG_NO_DATA,
13976                 { },
13977                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13978                 .fill_helper = bpf_fill_staggered_jset32_reg,
13979                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13980         },
13981         {
13982                 "Staggered jumps: JMP32_JGT_X",
13983                 { },
13984                 INTERNAL | FLAG_NO_DATA,
13985                 { },
13986                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13987                 .fill_helper = bpf_fill_staggered_jgt32_reg,
13988                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13989         },
13990         {
13991                 "Staggered jumps: JMP32_JGE_X",
13992                 { },
13993                 INTERNAL | FLAG_NO_DATA,
13994                 { },
13995                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
13996                 .fill_helper = bpf_fill_staggered_jge32_reg,
13997                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
13998         },
13999         {
14000                 "Staggered jumps: JMP32_JLT_X",
14001                 { },
14002                 INTERNAL | FLAG_NO_DATA,
14003                 { },
14004                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14005                 .fill_helper = bpf_fill_staggered_jlt32_reg,
14006                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14007         },
14008         {
14009                 "Staggered jumps: JMP32_JLE_X",
14010                 { },
14011                 INTERNAL | FLAG_NO_DATA,
14012                 { },
14013                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14014                 .fill_helper = bpf_fill_staggered_jle32_reg,
14015                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14016         },
14017         {
14018                 "Staggered jumps: JMP32_JSGT_X",
14019                 { },
14020                 INTERNAL | FLAG_NO_DATA,
14021                 { },
14022                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14023                 .fill_helper = bpf_fill_staggered_jsgt32_reg,
14024                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14025         },
14026         {
14027                 "Staggered jumps: JMP32_JSGE_X",
14028                 { },
14029                 INTERNAL | FLAG_NO_DATA,
14030                 { },
14031                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14032                 .fill_helper = bpf_fill_staggered_jsge32_reg,
14033                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14034         },
14035         {
14036                 "Staggered jumps: JMP32_JSLT_X",
14037                 { },
14038                 INTERNAL | FLAG_NO_DATA,
14039                 { },
14040                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14041                 .fill_helper = bpf_fill_staggered_jslt32_reg,
14042                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14043         },
14044         {
14045                 "Staggered jumps: JMP32_JSLE_X",
14046                 { },
14047                 INTERNAL | FLAG_NO_DATA,
14048                 { },
14049                 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } },
14050                 .fill_helper = bpf_fill_staggered_jsle32_reg,
14051                 .nr_testruns = NR_STAGGERED_JMP_RUNS,
14052         },
14053 };
14054
14055 static struct net_device dev;
14056
14057 static struct sk_buff *populate_skb(char *buf, int size)
14058 {
14059         struct sk_buff *skb;
14060
14061         if (size >= MAX_DATA)
14062                 return NULL;
14063
14064         skb = alloc_skb(MAX_DATA, GFP_KERNEL);
14065         if (!skb)
14066                 return NULL;
14067
14068         __skb_put_data(skb, buf, size);
14069
14070         /* Initialize a fake skb with test pattern. */
14071         skb_reset_mac_header(skb);
14072         skb->protocol = htons(ETH_P_IP);
14073         skb->pkt_type = SKB_TYPE;
14074         skb->mark = SKB_MARK;
14075         skb->hash = SKB_HASH;
14076         skb->queue_mapping = SKB_QUEUE_MAP;
14077         skb->vlan_tci = SKB_VLAN_TCI;
14078         skb->vlan_present = SKB_VLAN_PRESENT;
14079         skb->vlan_proto = htons(ETH_P_IP);
14080         dev_net_set(&dev, &init_net);
14081         skb->dev = &dev;
14082         skb->dev->ifindex = SKB_DEV_IFINDEX;
14083         skb->dev->type = SKB_DEV_TYPE;
14084         skb_set_network_header(skb, min(size, ETH_HLEN));
14085
14086         return skb;
14087 }
14088
14089 static void *generate_test_data(struct bpf_test *test, int sub)
14090 {
14091         struct sk_buff *skb;
14092         struct page *page;
14093
14094         if (test->aux & FLAG_NO_DATA)
14095                 return NULL;
14096
14097         /* Test case expects an skb, so populate one. Various
14098          * subtests generate skbs of different sizes based on
14099          * the same data.
14100          */
14101         skb = populate_skb(test->data, test->test[sub].data_size);
14102         if (!skb)
14103                 return NULL;
14104
14105         if (test->aux & FLAG_SKB_FRAG) {
14106                 /*
14107                  * when the test requires a fragmented skb, add a
14108                  * single fragment to the skb, filled with
14109                  * test->frag_data.
14110                  */
14111                 void *ptr;
14112
14113                 page = alloc_page(GFP_KERNEL);
14114
14115                 if (!page)
14116                         goto err_kfree_skb;
14117
14118                 ptr = kmap(page);
14119                 if (!ptr)
14120                         goto err_free_page;
14121                 memcpy(ptr, test->frag_data, MAX_DATA);
14122                 kunmap(page);
14123                 skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
14124         }
14125
14126         return skb;
14127
14128 err_free_page:
14129         __free_page(page);
14130 err_kfree_skb:
14131         kfree_skb(skb);
14132         return NULL;
14133 }
14134
14135 static void release_test_data(const struct bpf_test *test, void *data)
14136 {
14137         if (test->aux & FLAG_NO_DATA)
14138                 return;
14139
14140         kfree_skb(data);
14141 }
14142
14143 static int filter_length(int which)
14144 {
14145         struct sock_filter *fp;
14146         int len;
14147
14148         if (tests[which].fill_helper)
14149                 return tests[which].u.ptr.len;
14150
14151         fp = tests[which].u.insns;
14152         for (len = MAX_INSNS - 1; len > 0; --len)
14153                 if (fp[len].code != 0 || fp[len].k != 0)
14154                         break;
14155
14156         return len + 1;
14157 }
14158
14159 static void *filter_pointer(int which)
14160 {
14161         if (tests[which].fill_helper)
14162                 return tests[which].u.ptr.insns;
14163         else
14164                 return tests[which].u.insns;
14165 }
14166
14167 static struct bpf_prog *generate_filter(int which, int *err)
14168 {
14169         __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
14170         unsigned int flen = filter_length(which);
14171         void *fptr = filter_pointer(which);
14172         struct sock_fprog_kern fprog;
14173         struct bpf_prog *fp;
14174
14175         switch (test_type) {
14176         case CLASSIC:
14177                 fprog.filter = fptr;
14178                 fprog.len = flen;
14179
14180                 *err = bpf_prog_create(&fp, &fprog);
14181                 if (tests[which].aux & FLAG_EXPECTED_FAIL) {
14182                         if (*err == tests[which].expected_errcode) {
14183                                 pr_cont("PASS\n");
14184                                 /* Verifier rejected filter as expected. */
14185                                 *err = 0;
14186                                 return NULL;
14187                         } else {
14188                                 pr_cont("UNEXPECTED_PASS\n");
14189                                 /* Verifier didn't reject the test that's
14190                                  * bad enough, just return!
14191                                  */
14192                                 *err = -EINVAL;
14193                                 return NULL;
14194                         }
14195                 }
14196                 if (*err) {
14197                         pr_cont("FAIL to prog_create err=%d len=%d\n",
14198                                 *err, fprog.len);
14199                         return NULL;
14200                 }
14201                 break;
14202
14203         case INTERNAL:
14204                 fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
14205                 if (fp == NULL) {
14206                         pr_cont("UNEXPECTED_FAIL no memory left\n");
14207                         *err = -ENOMEM;
14208                         return NULL;
14209                 }
14210
14211                 fp->len = flen;
14212                 /* Type doesn't really matter here as long as it's not unspec. */
14213                 fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
14214                 memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
14215                 fp->aux->stack_depth = tests[which].stack_depth;
14216                 fp->aux->verifier_zext = !!(tests[which].aux &
14217                                             FLAG_VERIFIER_ZEXT);
14218
14219                 /* We cannot error here as we don't need type compatibility
14220                  * checks.
14221                  */
14222                 fp = bpf_prog_select_runtime(fp, err);
14223                 if (*err) {
14224                         pr_cont("FAIL to select_runtime err=%d\n", *err);
14225                         return NULL;
14226                 }
14227                 break;
14228         }
14229
14230         *err = 0;
14231         return fp;
14232 }
14233
14234 static void release_filter(struct bpf_prog *fp, int which)
14235 {
14236         __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
14237
14238         switch (test_type) {
14239         case CLASSIC:
14240                 bpf_prog_destroy(fp);
14241                 break;
14242         case INTERNAL:
14243                 bpf_prog_free(fp);
14244                 break;
14245         }
14246 }
14247
14248 static int __run_one(const struct bpf_prog *fp, const void *data,
14249                      int runs, u64 *duration)
14250 {
14251         u64 start, finish;
14252         int ret = 0, i;
14253
14254         migrate_disable();
14255         start = ktime_get_ns();
14256
14257         for (i = 0; i < runs; i++)
14258                 ret = bpf_prog_run(fp, data);
14259
14260         finish = ktime_get_ns();
14261         migrate_enable();
14262
14263         *duration = finish - start;
14264         do_div(*duration, runs);
14265
14266         return ret;
14267 }
14268
14269 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
14270 {
14271         int err_cnt = 0, i, runs = MAX_TESTRUNS;
14272
14273         if (test->nr_testruns)
14274                 runs = min(test->nr_testruns, MAX_TESTRUNS);
14275
14276         for (i = 0; i < MAX_SUBTESTS; i++) {
14277                 void *data;
14278                 u64 duration;
14279                 u32 ret;
14280
14281                 /*
14282                  * NOTE: Several sub-tests may be present, in which case
14283                  * a zero {data_size, result} tuple indicates the end of
14284                  * the sub-test array. The first test is always run,
14285                  * even if both data_size and result happen to be zero.
14286                  */
14287                 if (i > 0 &&
14288                     test->test[i].data_size == 0 &&
14289                     test->test[i].result == 0)
14290                         break;
14291
14292                 data = generate_test_data(test, i);
14293                 if (!data && !(test->aux & FLAG_NO_DATA)) {
14294                         pr_cont("data generation failed ");
14295                         err_cnt++;
14296                         break;
14297                 }
14298                 ret = __run_one(fp, data, runs, &duration);
14299                 release_test_data(test, data);
14300
14301                 if (ret == test->test[i].result) {
14302                         pr_cont("%lld ", duration);
14303                 } else {
14304                         pr_cont("ret %d != %d ", ret,
14305                                 test->test[i].result);
14306                         err_cnt++;
14307                 }
14308         }
14309
14310         return err_cnt;
14311 }
14312
14313 static char test_name[64];
14314 module_param_string(test_name, test_name, sizeof(test_name), 0);
14315
14316 static int test_id = -1;
14317 module_param(test_id, int, 0);
14318
14319 static int test_range[2] = { 0, INT_MAX };
14320 module_param_array(test_range, int, NULL, 0);
14321
14322 static bool exclude_test(int test_id)
14323 {
14324         return test_id < test_range[0] || test_id > test_range[1];
14325 }
14326
14327 static __init struct sk_buff *build_test_skb(void)
14328 {
14329         u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
14330         struct sk_buff *skb[2];
14331         struct page *page[2];
14332         int i, data_size = 8;
14333
14334         for (i = 0; i < 2; i++) {
14335                 page[i] = alloc_page(GFP_KERNEL);
14336                 if (!page[i]) {
14337                         if (i == 0)
14338                                 goto err_page0;
14339                         else
14340                                 goto err_page1;
14341                 }
14342
14343                 /* this will set skb[i]->head_frag */
14344                 skb[i] = dev_alloc_skb(headroom + data_size);
14345                 if (!skb[i]) {
14346                         if (i == 0)
14347                                 goto err_skb0;
14348                         else
14349                                 goto err_skb1;
14350                 }
14351
14352                 skb_reserve(skb[i], headroom);
14353                 skb_put(skb[i], data_size);
14354                 skb[i]->protocol = htons(ETH_P_IP);
14355                 skb_reset_network_header(skb[i]);
14356                 skb_set_mac_header(skb[i], -ETH_HLEN);
14357
14358                 skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
14359                 // skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
14360         }
14361
14362         /* setup shinfo */
14363         skb_shinfo(skb[0])->gso_size = 1448;
14364         skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
14365         skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
14366         skb_shinfo(skb[0])->gso_segs = 0;
14367         skb_shinfo(skb[0])->frag_list = skb[1];
14368         skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000;
14369
14370         /* adjust skb[0]'s len */
14371         skb[0]->len += skb[1]->len;
14372         skb[0]->data_len += skb[1]->data_len;
14373         skb[0]->truesize += skb[1]->truesize;
14374
14375         return skb[0];
14376
14377 err_skb1:
14378         __free_page(page[1]);
14379 err_page1:
14380         kfree_skb(skb[0]);
14381 err_skb0:
14382         __free_page(page[0]);
14383 err_page0:
14384         return NULL;
14385 }
14386
14387 static __init struct sk_buff *build_test_skb_linear_no_head_frag(void)
14388 {
14389         unsigned int alloc_size = 2000;
14390         unsigned int headroom = 102, doffset = 72, data_size = 1308;
14391         struct sk_buff *skb[2];
14392         int i;
14393
14394         /* skbs linked in a frag_list, both with linear data, with head_frag=0
14395          * (data allocated by kmalloc), both have tcp data of 1308 bytes
14396          * (total payload is 2616 bytes).
14397          * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom.
14398          */
14399         for (i = 0; i < 2; i++) {
14400                 skb[i] = alloc_skb(alloc_size, GFP_KERNEL);
14401                 if (!skb[i]) {
14402                         if (i == 0)
14403                                 goto err_skb0;
14404                         else
14405                                 goto err_skb1;
14406                 }
14407
14408                 skb[i]->protocol = htons(ETH_P_IPV6);
14409                 skb_reserve(skb[i], headroom);
14410                 skb_put(skb[i], doffset + data_size);
14411                 skb_reset_network_header(skb[i]);
14412                 if (i == 0)
14413                         skb_reset_mac_header(skb[i]);
14414                 else
14415                         skb_set_mac_header(skb[i], -ETH_HLEN);
14416                 __skb_pull(skb[i], doffset);
14417         }
14418
14419         /* setup shinfo.
14420          * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a
14421          * reduced gso_size.
14422          */
14423         skb_shinfo(skb[0])->gso_size = 1288;
14424         skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY;
14425         skb_shinfo(skb[0])->gso_segs = 0;
14426         skb_shinfo(skb[0])->frag_list = skb[1];
14427
14428         /* adjust skb[0]'s len */
14429         skb[0]->len += skb[1]->len;
14430         skb[0]->data_len += skb[1]->len;
14431         skb[0]->truesize += skb[1]->truesize;
14432
14433         return skb[0];
14434
14435 err_skb1:
14436         kfree_skb(skb[0]);
14437 err_skb0:
14438         return NULL;
14439 }
14440
14441 struct skb_segment_test {
14442         const char *descr;
14443         struct sk_buff *(*build_skb)(void);
14444         netdev_features_t features;
14445 };
14446
14447 static struct skb_segment_test skb_segment_tests[] __initconst = {
14448         {
14449                 .descr = "gso_with_rx_frags",
14450                 .build_skb = build_test_skb,
14451                 .features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
14452                             NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM
14453         },
14454         {
14455                 .descr = "gso_linear_no_head_frag",
14456                 .build_skb = build_test_skb_linear_no_head_frag,
14457                 .features = NETIF_F_SG | NETIF_F_FRAGLIST |
14458                             NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
14459                             NETIF_F_LLTX_BIT | NETIF_F_GRO |
14460                             NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
14461                             NETIF_F_HW_VLAN_STAG_TX_BIT
14462         }
14463 };
14464
14465 static __init int test_skb_segment_single(const struct skb_segment_test *test)
14466 {
14467         struct sk_buff *skb, *segs;
14468         int ret = -1;
14469
14470         skb = test->build_skb();
14471         if (!skb) {
14472                 pr_info("%s: failed to build_test_skb", __func__);
14473                 goto done;
14474         }
14475
14476         segs = skb_segment(skb, test->features);
14477         if (!IS_ERR(segs)) {
14478                 kfree_skb_list(segs);
14479                 ret = 0;
14480         }
14481         kfree_skb(skb);
14482 done:
14483         return ret;
14484 }
14485
14486 static __init int test_skb_segment(void)
14487 {
14488         int i, err_cnt = 0, pass_cnt = 0;
14489
14490         for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
14491                 const struct skb_segment_test *test = &skb_segment_tests[i];
14492
14493                 cond_resched();
14494                 if (exclude_test(i))
14495                         continue;
14496
14497                 pr_info("#%d %s ", i, test->descr);
14498
14499                 if (test_skb_segment_single(test)) {
14500                         pr_cont("FAIL\n");
14501                         err_cnt++;
14502                 } else {
14503                         pr_cont("PASS\n");
14504                         pass_cnt++;
14505                 }
14506         }
14507
14508         pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__,
14509                 pass_cnt, err_cnt);
14510         return err_cnt ? -EINVAL : 0;
14511 }
14512
14513 static __init int test_bpf(void)
14514 {
14515         int i, err_cnt = 0, pass_cnt = 0;
14516         int jit_cnt = 0, run_cnt = 0;
14517
14518         for (i = 0; i < ARRAY_SIZE(tests); i++) {
14519                 struct bpf_prog *fp;
14520                 int err;
14521
14522                 cond_resched();
14523                 if (exclude_test(i))
14524                         continue;
14525
14526                 pr_info("#%d %s ", i, tests[i].descr);
14527
14528                 if (tests[i].fill_helper &&
14529                     tests[i].fill_helper(&tests[i]) < 0) {
14530                         pr_cont("FAIL to prog_fill\n");
14531                         continue;
14532                 }
14533
14534                 fp = generate_filter(i, &err);
14535
14536                 if (tests[i].fill_helper) {
14537                         kfree(tests[i].u.ptr.insns);
14538                         tests[i].u.ptr.insns = NULL;
14539                 }
14540
14541                 if (fp == NULL) {
14542                         if (err == 0) {
14543                                 pass_cnt++;
14544                                 continue;
14545                         }
14546                         err_cnt++;
14547                         continue;
14548                 }
14549
14550                 pr_cont("jited:%u ", fp->jited);
14551
14552                 run_cnt++;
14553                 if (fp->jited)
14554                         jit_cnt++;
14555
14556                 err = run_one(fp, &tests[i]);
14557                 release_filter(fp, i);
14558
14559                 if (err) {
14560                         pr_cont("FAIL (%d times)\n", err);
14561                         err_cnt++;
14562                 } else {
14563                         pr_cont("PASS\n");
14564                         pass_cnt++;
14565                 }
14566         }
14567
14568         pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
14569                 pass_cnt, err_cnt, jit_cnt, run_cnt);
14570
14571         return err_cnt ? -EINVAL : 0;
14572 }
14573
14574 struct tail_call_test {
14575         const char *descr;
14576         struct bpf_insn insns[MAX_INSNS];
14577         int flags;
14578         int result;
14579         int stack_depth;
14580 };
14581
14582 /* Flags that can be passed to tail call test cases */
14583 #define FLAG_NEED_STATE         BIT(0)
14584 #define FLAG_RESULT_IN_STATE    BIT(1)
14585
14586 /*
14587  * Magic marker used in test snippets for tail calls below.
14588  * BPF_LD/MOV to R2 and R2 with this immediate value is replaced
14589  * with the proper values by the test runner.
14590  */
14591 #define TAIL_CALL_MARKER 0x7a11ca11
14592
14593 /* Special offset to indicate a NULL call target */
14594 #define TAIL_CALL_NULL 0x7fff
14595
14596 /* Special offset to indicate an out-of-range index */
14597 #define TAIL_CALL_INVALID 0x7ffe
14598
14599 #define TAIL_CALL(offset)                              \
14600         BPF_LD_IMM64(R2, TAIL_CALL_MARKER),            \
14601         BPF_RAW_INSN(BPF_ALU | BPF_MOV | BPF_K, R3, 0, \
14602                      offset, TAIL_CALL_MARKER),        \
14603         BPF_JMP_IMM(BPF_TAIL_CALL, 0, 0, 0)
14604
14605 /*
14606  * A test function to be called from a BPF program, clobbering a lot of
14607  * CPU registers in the process. A JITed BPF program calling this function
14608  * must save and restore any caller-saved registers it uses for internal
14609  * state, for example the current tail call count.
14610  */
14611 BPF_CALL_1(bpf_test_func, u64, arg)
14612 {
14613         char buf[64];
14614         long a = 0;
14615         long b = 1;
14616         long c = 2;
14617         long d = 3;
14618         long e = 4;
14619         long f = 5;
14620         long g = 6;
14621         long h = 7;
14622
14623         return snprintf(buf, sizeof(buf),
14624                         "%ld %lu %lx %ld %lu %lx %ld %lu %x",
14625                         a, b, c, d, e, f, g, h, (int)arg);
14626 }
14627 #define BPF_FUNC_test_func __BPF_FUNC_MAX_ID
14628
14629 /*
14630  * Tail call tests. Each test case may call any other test in the table,
14631  * including itself, specified as a relative index offset from the calling
14632  * test. The index TAIL_CALL_NULL can be used to specify a NULL target
14633  * function to test the JIT error path. Similarly, the index TAIL_CALL_INVALID
14634  * results in a target index that is out of range.
14635  */
14636 static struct tail_call_test tail_call_tests[] = {
14637         {
14638                 "Tail call leaf",
14639                 .insns = {
14640                         BPF_ALU64_REG(BPF_MOV, R0, R1),
14641                         BPF_ALU64_IMM(BPF_ADD, R0, 1),
14642                         BPF_EXIT_INSN(),
14643                 },
14644                 .result = 1,
14645         },
14646         {
14647                 "Tail call 2",
14648                 .insns = {
14649                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
14650                         TAIL_CALL(-1),
14651                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
14652                         BPF_EXIT_INSN(),
14653                 },
14654                 .result = 3,
14655         },
14656         {
14657                 "Tail call 3",
14658                 .insns = {
14659                         BPF_ALU64_IMM(BPF_ADD, R1, 3),
14660                         TAIL_CALL(-1),
14661                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
14662                         BPF_EXIT_INSN(),
14663                 },
14664                 .result = 6,
14665         },
14666         {
14667                 "Tail call 4",
14668                 .insns = {
14669                         BPF_ALU64_IMM(BPF_ADD, R1, 4),
14670                         TAIL_CALL(-1),
14671                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
14672                         BPF_EXIT_INSN(),
14673                 },
14674                 .result = 10,
14675         },
14676         {
14677                 "Tail call error path, max count reached",
14678                 .insns = {
14679                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
14680                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
14681                         BPF_STX_MEM(BPF_W, R1, R2, 0),
14682                         TAIL_CALL(0),
14683                         BPF_EXIT_INSN(),
14684                 },
14685                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
14686                 .result = (MAX_TAIL_CALL_CNT + 1 + 1) * MAX_TESTRUNS,
14687         },
14688         {
14689                 "Tail call count preserved across function calls",
14690                 .insns = {
14691                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
14692                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
14693                         BPF_STX_MEM(BPF_W, R1, R2, 0),
14694                         BPF_STX_MEM(BPF_DW, R10, R1, -8),
14695                         BPF_CALL_REL(BPF_FUNC_get_numa_node_id),
14696                         BPF_CALL_REL(BPF_FUNC_ktime_get_ns),
14697                         BPF_CALL_REL(BPF_FUNC_ktime_get_boot_ns),
14698                         BPF_CALL_REL(BPF_FUNC_ktime_get_coarse_ns),
14699                         BPF_CALL_REL(BPF_FUNC_jiffies64),
14700                         BPF_CALL_REL(BPF_FUNC_test_func),
14701                         BPF_LDX_MEM(BPF_DW, R1, R10, -8),
14702                         BPF_ALU32_REG(BPF_MOV, R0, R1),
14703                         TAIL_CALL(0),
14704                         BPF_EXIT_INSN(),
14705                 },
14706                 .stack_depth = 8,
14707                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
14708                 .result = (MAX_TAIL_CALL_CNT + 1 + 1) * MAX_TESTRUNS,
14709         },
14710         {
14711                 "Tail call error path, NULL target",
14712                 .insns = {
14713                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
14714                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
14715                         BPF_STX_MEM(BPF_W, R1, R2, 0),
14716                         TAIL_CALL(TAIL_CALL_NULL),
14717                         BPF_EXIT_INSN(),
14718                 },
14719                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
14720                 .result = MAX_TESTRUNS,
14721         },
14722         {
14723                 "Tail call error path, index out of range",
14724                 .insns = {
14725                         BPF_LDX_MEM(BPF_W, R2, R1, 0),
14726                         BPF_ALU64_IMM(BPF_ADD, R2, 1),
14727                         BPF_STX_MEM(BPF_W, R1, R2, 0),
14728                         TAIL_CALL(TAIL_CALL_INVALID),
14729                         BPF_EXIT_INSN(),
14730                 },
14731                 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE,
14732                 .result = MAX_TESTRUNS,
14733         },
14734 };
14735
14736 static void __init destroy_tail_call_tests(struct bpf_array *progs)
14737 {
14738         int i;
14739
14740         for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++)
14741                 if (progs->ptrs[i])
14742                         bpf_prog_free(progs->ptrs[i]);
14743         kfree(progs);
14744 }
14745
14746 static __init int prepare_tail_call_tests(struct bpf_array **pprogs)
14747 {
14748         int ntests = ARRAY_SIZE(tail_call_tests);
14749         struct bpf_array *progs;
14750         int which, err;
14751
14752         /* Allocate the table of programs to be used for tall calls */
14753         progs = kzalloc(sizeof(*progs) + (ntests + 1) * sizeof(progs->ptrs[0]),
14754                         GFP_KERNEL);
14755         if (!progs)
14756                 goto out_nomem;
14757
14758         /* Create all eBPF programs and populate the table */
14759         for (which = 0; which < ntests; which++) {
14760                 struct tail_call_test *test = &tail_call_tests[which];
14761                 struct bpf_prog *fp;
14762                 int len, i;
14763
14764                 /* Compute the number of program instructions */
14765                 for (len = 0; len < MAX_INSNS; len++) {
14766                         struct bpf_insn *insn = &test->insns[len];
14767
14768                         if (len < MAX_INSNS - 1 &&
14769                             insn->code == (BPF_LD | BPF_DW | BPF_IMM))
14770                                 len++;
14771                         if (insn->code == 0)
14772                                 break;
14773                 }
14774
14775                 /* Allocate and initialize the program */
14776                 fp = bpf_prog_alloc(bpf_prog_size(len), 0);
14777                 if (!fp)
14778                         goto out_nomem;
14779
14780                 fp->len = len;
14781                 fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
14782                 fp->aux->stack_depth = test->stack_depth;
14783                 memcpy(fp->insnsi, test->insns, len * sizeof(struct bpf_insn));
14784
14785                 /* Relocate runtime tail call offsets and addresses */
14786                 for (i = 0; i < len; i++) {
14787                         struct bpf_insn *insn = &fp->insnsi[i];
14788                         long addr = 0;
14789
14790                         switch (insn->code) {
14791                         case BPF_LD | BPF_DW | BPF_IMM:
14792                                 if (insn->imm != TAIL_CALL_MARKER)
14793                                         break;
14794                                 insn[0].imm = (u32)(long)progs;
14795                                 insn[1].imm = ((u64)(long)progs) >> 32;
14796                                 break;
14797
14798                         case BPF_ALU | BPF_MOV | BPF_K:
14799                                 if (insn->imm != TAIL_CALL_MARKER)
14800                                         break;
14801                                 if (insn->off == TAIL_CALL_NULL)
14802                                         insn->imm = ntests;
14803                                 else if (insn->off == TAIL_CALL_INVALID)
14804                                         insn->imm = ntests + 1;
14805                                 else
14806                                         insn->imm = which + insn->off;
14807                                 insn->off = 0;
14808                                 break;
14809
14810                         case BPF_JMP | BPF_CALL:
14811                                 if (insn->src_reg != BPF_PSEUDO_CALL)
14812                                         break;
14813                                 switch (insn->imm) {
14814                                 case BPF_FUNC_get_numa_node_id:
14815                                         addr = (long)&numa_node_id;
14816                                         break;
14817                                 case BPF_FUNC_ktime_get_ns:
14818                                         addr = (long)&ktime_get_ns;
14819                                         break;
14820                                 case BPF_FUNC_ktime_get_boot_ns:
14821                                         addr = (long)&ktime_get_boot_fast_ns;
14822                                         break;
14823                                 case BPF_FUNC_ktime_get_coarse_ns:
14824                                         addr = (long)&ktime_get_coarse_ns;
14825                                         break;
14826                                 case BPF_FUNC_jiffies64:
14827                                         addr = (long)&get_jiffies_64;
14828                                         break;
14829                                 case BPF_FUNC_test_func:
14830                                         addr = (long)&bpf_test_func;
14831                                         break;
14832                                 default:
14833                                         err = -EFAULT;
14834                                         goto out_err;
14835                                 }
14836                                 *insn = BPF_EMIT_CALL(addr);
14837                                 if ((long)__bpf_call_base + insn->imm != addr)
14838                                         *insn = BPF_JMP_A(0); /* Skip: NOP */
14839                                 break;
14840                         }
14841                 }
14842
14843                 fp = bpf_prog_select_runtime(fp, &err);
14844                 if (err)
14845                         goto out_err;
14846
14847                 progs->ptrs[which] = fp;
14848         }
14849
14850         /* The last entry contains a NULL program pointer */
14851         progs->map.max_entries = ntests + 1;
14852         *pprogs = progs;
14853         return 0;
14854
14855 out_nomem:
14856         err = -ENOMEM;
14857
14858 out_err:
14859         if (progs)
14860                 destroy_tail_call_tests(progs);
14861         return err;
14862 }
14863
14864 static __init int test_tail_calls(struct bpf_array *progs)
14865 {
14866         int i, err_cnt = 0, pass_cnt = 0;
14867         int jit_cnt = 0, run_cnt = 0;
14868
14869         for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
14870                 struct tail_call_test *test = &tail_call_tests[i];
14871                 struct bpf_prog *fp = progs->ptrs[i];
14872                 int *data = NULL;
14873                 int state = 0;
14874                 u64 duration;
14875                 int ret;
14876
14877                 cond_resched();
14878                 if (exclude_test(i))
14879                         continue;
14880
14881                 pr_info("#%d %s ", i, test->descr);
14882                 if (!fp) {
14883                         err_cnt++;
14884                         continue;
14885                 }
14886                 pr_cont("jited:%u ", fp->jited);
14887
14888                 run_cnt++;
14889                 if (fp->jited)
14890                         jit_cnt++;
14891
14892                 if (test->flags & FLAG_NEED_STATE)
14893                         data = &state;
14894                 ret = __run_one(fp, data, MAX_TESTRUNS, &duration);
14895                 if (test->flags & FLAG_RESULT_IN_STATE)
14896                         ret = state;
14897                 if (ret == test->result) {
14898                         pr_cont("%lld PASS", duration);
14899                         pass_cnt++;
14900                 } else {
14901                         pr_cont("ret %d != %d FAIL", ret, test->result);
14902                         err_cnt++;
14903                 }
14904         }
14905
14906         pr_info("%s: Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
14907                 __func__, pass_cnt, err_cnt, jit_cnt, run_cnt);
14908
14909         return err_cnt ? -EINVAL : 0;
14910 }
14911
14912 static char test_suite[32];
14913 module_param_string(test_suite, test_suite, sizeof(test_suite), 0);
14914
14915 static __init int find_test_index(const char *test_name)
14916 {
14917         int i;
14918
14919         if (!strcmp(test_suite, "test_bpf")) {
14920                 for (i = 0; i < ARRAY_SIZE(tests); i++) {
14921                         if (!strcmp(tests[i].descr, test_name))
14922                                 return i;
14923                 }
14924         }
14925
14926         if (!strcmp(test_suite, "test_tail_calls")) {
14927                 for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
14928                         if (!strcmp(tail_call_tests[i].descr, test_name))
14929                                 return i;
14930                 }
14931         }
14932
14933         if (!strcmp(test_suite, "test_skb_segment")) {
14934                 for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
14935                         if (!strcmp(skb_segment_tests[i].descr, test_name))
14936                                 return i;
14937                 }
14938         }
14939
14940         return -1;
14941 }
14942
14943 static __init int prepare_test_range(void)
14944 {
14945         int valid_range;
14946
14947         if (!strcmp(test_suite, "test_bpf"))
14948                 valid_range = ARRAY_SIZE(tests);
14949         else if (!strcmp(test_suite, "test_tail_calls"))
14950                 valid_range = ARRAY_SIZE(tail_call_tests);
14951         else if (!strcmp(test_suite, "test_skb_segment"))
14952                 valid_range = ARRAY_SIZE(skb_segment_tests);
14953         else
14954                 return 0;
14955
14956         if (test_id >= 0) {
14957                 /*
14958                  * if a test_id was specified, use test_range to
14959                  * cover only that test.
14960                  */
14961                 if (test_id >= valid_range) {
14962                         pr_err("test_bpf: invalid test_id specified for '%s' suite.\n",
14963                                test_suite);
14964                         return -EINVAL;
14965                 }
14966
14967                 test_range[0] = test_id;
14968                 test_range[1] = test_id;
14969         } else if (*test_name) {
14970                 /*
14971                  * if a test_name was specified, find it and setup
14972                  * test_range to cover only that test.
14973                  */
14974                 int idx = find_test_index(test_name);
14975
14976                 if (idx < 0) {
14977                         pr_err("test_bpf: no test named '%s' found for '%s' suite.\n",
14978                                test_name, test_suite);
14979                         return -EINVAL;
14980                 }
14981                 test_range[0] = idx;
14982                 test_range[1] = idx;
14983         } else if (test_range[0] != 0 || test_range[1] != INT_MAX) {
14984                 /*
14985                  * check that the supplied test_range is valid.
14986                  */
14987                 if (test_range[0] < 0 || test_range[1] >= valid_range) {
14988                         pr_err("test_bpf: test_range is out of bound for '%s' suite.\n",
14989                                test_suite);
14990                         return -EINVAL;
14991                 }
14992
14993                 if (test_range[1] < test_range[0]) {
14994                         pr_err("test_bpf: test_range is ending before it starts.\n");
14995                         return -EINVAL;
14996                 }
14997         }
14998
14999         return 0;
15000 }
15001
15002 static int __init test_bpf_init(void)
15003 {
15004         struct bpf_array *progs = NULL;
15005         int ret;
15006
15007         if (strlen(test_suite) &&
15008             strcmp(test_suite, "test_bpf") &&
15009             strcmp(test_suite, "test_tail_calls") &&
15010             strcmp(test_suite, "test_skb_segment")) {
15011                 pr_err("test_bpf: invalid test_suite '%s' specified.\n", test_suite);
15012                 return -EINVAL;
15013         }
15014
15015         /*
15016          * if test_suite is not specified, but test_id, test_name or test_range
15017          * is specified, set 'test_bpf' as the default test suite.
15018          */
15019         if (!strlen(test_suite) &&
15020             (test_id != -1 || strlen(test_name) ||
15021             (test_range[0] != 0 || test_range[1] != INT_MAX))) {
15022                 pr_info("test_bpf: set 'test_bpf' as the default test_suite.\n");
15023                 strscpy(test_suite, "test_bpf", sizeof(test_suite));
15024         }
15025
15026         ret = prepare_test_range();
15027         if (ret < 0)
15028                 return ret;
15029
15030         if (!strlen(test_suite) || !strcmp(test_suite, "test_bpf")) {
15031                 ret = test_bpf();
15032                 if (ret)
15033                         return ret;
15034         }
15035
15036         if (!strlen(test_suite) || !strcmp(test_suite, "test_tail_calls")) {
15037                 ret = prepare_tail_call_tests(&progs);
15038                 if (ret)
15039                         return ret;
15040                 ret = test_tail_calls(progs);
15041                 destroy_tail_call_tests(progs);
15042                 if (ret)
15043                         return ret;
15044         }
15045
15046         if (!strlen(test_suite) || !strcmp(test_suite, "test_skb_segment"))
15047                 return test_skb_segment();
15048
15049         return 0;
15050 }
15051
15052 static void __exit test_bpf_exit(void)
15053 {
15054 }
15055
15056 module_init(test_bpf_init);
15057 module_exit(test_bpf_exit);
15058
15059 MODULE_LICENSE("GPL");