Merge tag 'xfs-for-linus-4.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-drm-fsl-dcu.git] / lib / test_bpf.c
1 /*
2  * Testsuite for BPF interpreter and BPF JIT compiler
3  *
4  * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  */
15
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/filter.h>
21 #include <linux/bpf.h>
22 #include <linux/skbuff.h>
23 #include <linux/netdevice.h>
24 #include <linux/if_vlan.h>
25 #include <linux/random.h>
26 #include <linux/highmem.h>
27
28 /* General test specific settings */
29 #define MAX_SUBTESTS    3
30 #define MAX_TESTRUNS    10000
31 #define MAX_DATA        128
32 #define MAX_INSNS       512
33 #define MAX_K           0xffffFFFF
34
35 /* Few constants used to init test 'skb' */
36 #define SKB_TYPE        3
37 #define SKB_MARK        0x1234aaaa
38 #define SKB_HASH        0x1234aaab
39 #define SKB_QUEUE_MAP   123
40 #define SKB_VLAN_TCI    0xffff
41 #define SKB_DEV_IFINDEX 577
42 #define SKB_DEV_TYPE    588
43
44 /* Redefine REGs to make tests less verbose */
45 #define R0              BPF_REG_0
46 #define R1              BPF_REG_1
47 #define R2              BPF_REG_2
48 #define R3              BPF_REG_3
49 #define R4              BPF_REG_4
50 #define R5              BPF_REG_5
51 #define R6              BPF_REG_6
52 #define R7              BPF_REG_7
53 #define R8              BPF_REG_8
54 #define R9              BPF_REG_9
55 #define R10             BPF_REG_10
56
57 /* Flags that can be passed to test cases */
58 #define FLAG_NO_DATA            BIT(0)
59 #define FLAG_EXPECTED_FAIL      BIT(1)
60 #define FLAG_SKB_FRAG           BIT(2)
61
62 enum {
63         CLASSIC  = BIT(6),      /* Old BPF instructions only. */
64         INTERNAL = BIT(7),      /* Extended instruction set.  */
65 };
66
67 #define TEST_TYPE_MASK          (CLASSIC | INTERNAL)
68
69 struct bpf_test {
70         const char *descr;
71         union {
72                 struct sock_filter insns[MAX_INSNS];
73                 struct bpf_insn insns_int[MAX_INSNS];
74                 struct {
75                         void *insns;
76                         unsigned int len;
77                 } ptr;
78         } u;
79         __u8 aux;
80         __u8 data[MAX_DATA];
81         struct {
82                 int data_size;
83                 __u32 result;
84         } test[MAX_SUBTESTS];
85         int (*fill_helper)(struct bpf_test *self);
86         __u8 frag_data[MAX_DATA];
87 };
88
89 /* Large test cases need separate allocation and fill handler. */
90
91 static int bpf_fill_maxinsns1(struct bpf_test *self)
92 {
93         unsigned int len = BPF_MAXINSNS;
94         struct sock_filter *insn;
95         __u32 k = ~0;
96         int i;
97
98         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
99         if (!insn)
100                 return -ENOMEM;
101
102         for (i = 0; i < len; i++, k--)
103                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
104
105         self->u.ptr.insns = insn;
106         self->u.ptr.len = len;
107
108         return 0;
109 }
110
111 static int bpf_fill_maxinsns2(struct bpf_test *self)
112 {
113         unsigned int len = BPF_MAXINSNS;
114         struct sock_filter *insn;
115         int i;
116
117         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
118         if (!insn)
119                 return -ENOMEM;
120
121         for (i = 0; i < len; i++)
122                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
123
124         self->u.ptr.insns = insn;
125         self->u.ptr.len = len;
126
127         return 0;
128 }
129
130 static int bpf_fill_maxinsns3(struct bpf_test *self)
131 {
132         unsigned int len = BPF_MAXINSNS;
133         struct sock_filter *insn;
134         struct rnd_state rnd;
135         int i;
136
137         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
138         if (!insn)
139                 return -ENOMEM;
140
141         prandom_seed_state(&rnd, 3141592653589793238ULL);
142
143         for (i = 0; i < len - 1; i++) {
144                 __u32 k = prandom_u32_state(&rnd);
145
146                 insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
147         }
148
149         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
150
151         self->u.ptr.insns = insn;
152         self->u.ptr.len = len;
153
154         return 0;
155 }
156
157 static int bpf_fill_maxinsns4(struct bpf_test *self)
158 {
159         unsigned int len = BPF_MAXINSNS + 1;
160         struct sock_filter *insn;
161         int i;
162
163         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
164         if (!insn)
165                 return -ENOMEM;
166
167         for (i = 0; i < len; i++)
168                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
169
170         self->u.ptr.insns = insn;
171         self->u.ptr.len = len;
172
173         return 0;
174 }
175
176 static int bpf_fill_maxinsns5(struct bpf_test *self)
177 {
178         unsigned int len = BPF_MAXINSNS;
179         struct sock_filter *insn;
180         int i;
181
182         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
183         if (!insn)
184                 return -ENOMEM;
185
186         insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
187
188         for (i = 1; i < len - 1; i++)
189                 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
190
191         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
192
193         self->u.ptr.insns = insn;
194         self->u.ptr.len = len;
195
196         return 0;
197 }
198
199 static int bpf_fill_maxinsns6(struct bpf_test *self)
200 {
201         unsigned int len = BPF_MAXINSNS;
202         struct sock_filter *insn;
203         int i;
204
205         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
206         if (!insn)
207                 return -ENOMEM;
208
209         for (i = 0; i < len - 1; i++)
210                 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
211                                      SKF_AD_VLAN_TAG_PRESENT);
212
213         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
214
215         self->u.ptr.insns = insn;
216         self->u.ptr.len = len;
217
218         return 0;
219 }
220
221 static int bpf_fill_maxinsns7(struct bpf_test *self)
222 {
223         unsigned int len = BPF_MAXINSNS;
224         struct sock_filter *insn;
225         int i;
226
227         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
228         if (!insn)
229                 return -ENOMEM;
230
231         for (i = 0; i < len - 4; i++)
232                 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
233                                      SKF_AD_CPU);
234
235         insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
236         insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
237                                    SKF_AD_CPU);
238         insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
239         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
240
241         self->u.ptr.insns = insn;
242         self->u.ptr.len = len;
243
244         return 0;
245 }
246
247 static int bpf_fill_maxinsns8(struct bpf_test *self)
248 {
249         unsigned int len = BPF_MAXINSNS;
250         struct sock_filter *insn;
251         int i, jmp_off = len - 3;
252
253         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
254         if (!insn)
255                 return -ENOMEM;
256
257         insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
258
259         for (i = 1; i < len - 1; i++)
260                 insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
261
262         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
263
264         self->u.ptr.insns = insn;
265         self->u.ptr.len = len;
266
267         return 0;
268 }
269
270 static int bpf_fill_maxinsns9(struct bpf_test *self)
271 {
272         unsigned int len = BPF_MAXINSNS;
273         struct bpf_insn *insn;
274         int i;
275
276         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
277         if (!insn)
278                 return -ENOMEM;
279
280         insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
281         insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
282         insn[2] = BPF_EXIT_INSN();
283
284         for (i = 3; i < len - 2; i++)
285                 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
286
287         insn[len - 2] = BPF_EXIT_INSN();
288         insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
289
290         self->u.ptr.insns = insn;
291         self->u.ptr.len = len;
292
293         return 0;
294 }
295
296 static int bpf_fill_maxinsns10(struct bpf_test *self)
297 {
298         unsigned int len = BPF_MAXINSNS, hlen = len - 2;
299         struct bpf_insn *insn;
300         int i;
301
302         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
303         if (!insn)
304                 return -ENOMEM;
305
306         for (i = 0; i < hlen / 2; i++)
307                 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
308         for (i = hlen - 1; i > hlen / 2; i--)
309                 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
310
311         insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
312         insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
313         insn[hlen + 1] = BPF_EXIT_INSN();
314
315         self->u.ptr.insns = insn;
316         self->u.ptr.len = len;
317
318         return 0;
319 }
320
321 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
322                          unsigned int plen)
323 {
324         struct sock_filter *insn;
325         unsigned int rlen;
326         int i, j;
327
328         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
329         if (!insn)
330                 return -ENOMEM;
331
332         rlen = (len % plen) - 1;
333
334         for (i = 0; i + plen < len; i += plen)
335                 for (j = 0; j < plen; j++)
336                         insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
337                                                  plen - 1 - j, 0, 0);
338         for (j = 0; j < rlen; j++)
339                 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
340                                          0, 0);
341
342         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
343
344         self->u.ptr.insns = insn;
345         self->u.ptr.len = len;
346
347         return 0;
348 }
349
350 static int bpf_fill_maxinsns11(struct bpf_test *self)
351 {
352         /* Hits 70 passes on x86_64, so cannot get JITed there. */
353         return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
354 }
355
356 static int bpf_fill_ja(struct bpf_test *self)
357 {
358         /* Hits exactly 11 passes on x86_64 JIT. */
359         return __bpf_fill_ja(self, 12, 9);
360 }
361
362 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
363 {
364         unsigned int len = BPF_MAXINSNS;
365         struct sock_filter *insn;
366         int i;
367
368         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
369         if (!insn)
370                 return -ENOMEM;
371
372         for (i = 0; i < len - 1; i += 2) {
373                 insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
374                 insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
375                                          SKF_AD_OFF + SKF_AD_CPU);
376         }
377
378         insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
379
380         self->u.ptr.insns = insn;
381         self->u.ptr.len = len;
382
383         return 0;
384 }
385
386 #define PUSH_CNT 68
387 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */
388 static int bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self)
389 {
390         unsigned int len = BPF_MAXINSNS;
391         struct bpf_insn *insn;
392         int i = 0, j, k = 0;
393
394         insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
395         if (!insn)
396                 return -ENOMEM;
397
398         insn[i++] = BPF_MOV64_REG(R6, R1);
399 loop:
400         for (j = 0; j < PUSH_CNT; j++) {
401                 insn[i++] = BPF_LD_ABS(BPF_B, 0);
402                 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
403                 i++;
404                 insn[i++] = BPF_MOV64_REG(R1, R6);
405                 insn[i++] = BPF_MOV64_IMM(R2, 1);
406                 insn[i++] = BPF_MOV64_IMM(R3, 2);
407                 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
408                                          bpf_skb_vlan_push_proto.func - __bpf_call_base);
409                 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
410                 i++;
411         }
412
413         for (j = 0; j < PUSH_CNT; j++) {
414                 insn[i++] = BPF_LD_ABS(BPF_B, 0);
415                 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
416                 i++;
417                 insn[i++] = BPF_MOV64_REG(R1, R6);
418                 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
419                                          bpf_skb_vlan_pop_proto.func - __bpf_call_base);
420                 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
421                 i++;
422         }
423         if (++k < 5)
424                 goto loop;
425
426         for (; i < len - 1; i++)
427                 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xbef);
428
429         insn[len - 1] = BPF_EXIT_INSN();
430
431         self->u.ptr.insns = insn;
432         self->u.ptr.len = len;
433
434         return 0;
435 }
436
437 static struct bpf_test tests[] = {
438         {
439                 "TAX",
440                 .u.insns = {
441                         BPF_STMT(BPF_LD | BPF_IMM, 1),
442                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
443                         BPF_STMT(BPF_LD | BPF_IMM, 2),
444                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
445                         BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
446                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
447                         BPF_STMT(BPF_LD | BPF_LEN, 0),
448                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
449                         BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
450                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
451                         BPF_STMT(BPF_RET | BPF_A, 0)
452                 },
453                 CLASSIC,
454                 { 10, 20, 30, 40, 50 },
455                 { { 2, 10 }, { 3, 20 }, { 4, 30 } },
456         },
457         {
458                 "TXA",
459                 .u.insns = {
460                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
461                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
462                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
463                         BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
464                 },
465                 CLASSIC,
466                 { 10, 20, 30, 40, 50 },
467                 { { 1, 2 }, { 3, 6 }, { 4, 8 } },
468         },
469         {
470                 "ADD_SUB_MUL_K",
471                 .u.insns = {
472                         BPF_STMT(BPF_LD | BPF_IMM, 1),
473                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
474                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
475                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
476                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
477                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
478                         BPF_STMT(BPF_RET | BPF_A, 0)
479                 },
480                 CLASSIC | FLAG_NO_DATA,
481                 { },
482                 { { 0, 0xfffffffd } }
483         },
484         {
485                 "DIV_MOD_KX",
486                 .u.insns = {
487                         BPF_STMT(BPF_LD | BPF_IMM, 8),
488                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
489                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
490                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
491                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
492                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
493                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
494                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
495                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
496                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
497                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
498                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
499                         BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
500                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
501                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
502                         BPF_STMT(BPF_RET | BPF_A, 0)
503                 },
504                 CLASSIC | FLAG_NO_DATA,
505                 { },
506                 { { 0, 0x20000000 } }
507         },
508         {
509                 "AND_OR_LSH_K",
510                 .u.insns = {
511                         BPF_STMT(BPF_LD | BPF_IMM, 0xff),
512                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
513                         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
514                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
515                         BPF_STMT(BPF_LD | BPF_IMM, 0xf),
516                         BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
517                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
518                         BPF_STMT(BPF_RET | BPF_A, 0)
519                 },
520                 CLASSIC | FLAG_NO_DATA,
521                 { },
522                 { { 0, 0x800000ff }, { 1, 0x800000ff } },
523         },
524         {
525                 "LD_IMM_0",
526                 .u.insns = {
527                         BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
528                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
529                         BPF_STMT(BPF_RET | BPF_K, 0),
530                         BPF_STMT(BPF_RET | BPF_K, 1),
531                 },
532                 CLASSIC,
533                 { },
534                 { { 1, 1 } },
535         },
536         {
537                 "LD_IND",
538                 .u.insns = {
539                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
540                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
541                         BPF_STMT(BPF_RET | BPF_K, 1)
542                 },
543                 CLASSIC,
544                 { },
545                 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
546         },
547         {
548                 "LD_ABS",
549                 .u.insns = {
550                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
551                         BPF_STMT(BPF_RET | BPF_K, 1)
552                 },
553                 CLASSIC,
554                 { },
555                 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
556         },
557         {
558                 "LD_ABS_LL",
559                 .u.insns = {
560                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
561                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
562                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
563                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
564                         BPF_STMT(BPF_RET | BPF_A, 0)
565                 },
566                 CLASSIC,
567                 { 1, 2, 3 },
568                 { { 1, 0 }, { 2, 3 } },
569         },
570         {
571                 "LD_IND_LL",
572                 .u.insns = {
573                         BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
574                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
575                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
576                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
577                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
578                         BPF_STMT(BPF_RET | BPF_A, 0)
579                 },
580                 CLASSIC,
581                 { 1, 2, 3, 0xff },
582                 { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
583         },
584         {
585                 "LD_ABS_NET",
586                 .u.insns = {
587                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
588                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
589                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
590                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
591                         BPF_STMT(BPF_RET | BPF_A, 0)
592                 },
593                 CLASSIC,
594                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
595                 { { 15, 0 }, { 16, 3 } },
596         },
597         {
598                 "LD_IND_NET",
599                 .u.insns = {
600                         BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
601                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
602                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
603                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
604                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
605                         BPF_STMT(BPF_RET | BPF_A, 0)
606                 },
607                 CLASSIC,
608                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
609                 { { 14, 0 }, { 15, 1 }, { 17, 3 } },
610         },
611         {
612                 "LD_PKTTYPE",
613                 .u.insns = {
614                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
615                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
616                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
617                         BPF_STMT(BPF_RET | BPF_K, 1),
618                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
619                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
620                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
621                         BPF_STMT(BPF_RET | BPF_K, 1),
622                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
623                                  SKF_AD_OFF + SKF_AD_PKTTYPE),
624                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
625                         BPF_STMT(BPF_RET | BPF_K, 1),
626                         BPF_STMT(BPF_RET | BPF_A, 0)
627                 },
628                 CLASSIC,
629                 { },
630                 { { 1, 3 }, { 10, 3 } },
631         },
632         {
633                 "LD_MARK",
634                 .u.insns = {
635                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
636                                  SKF_AD_OFF + SKF_AD_MARK),
637                         BPF_STMT(BPF_RET | BPF_A, 0)
638                 },
639                 CLASSIC,
640                 { },
641                 { { 1, SKB_MARK}, { 10, SKB_MARK} },
642         },
643         {
644                 "LD_RXHASH",
645                 .u.insns = {
646                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
647                                  SKF_AD_OFF + SKF_AD_RXHASH),
648                         BPF_STMT(BPF_RET | BPF_A, 0)
649                 },
650                 CLASSIC,
651                 { },
652                 { { 1, SKB_HASH}, { 10, SKB_HASH} },
653         },
654         {
655                 "LD_QUEUE",
656                 .u.insns = {
657                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
658                                  SKF_AD_OFF + SKF_AD_QUEUE),
659                         BPF_STMT(BPF_RET | BPF_A, 0)
660                 },
661                 CLASSIC,
662                 { },
663                 { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
664         },
665         {
666                 "LD_PROTOCOL",
667                 .u.insns = {
668                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
669                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
670                         BPF_STMT(BPF_RET | BPF_K, 0),
671                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
672                                  SKF_AD_OFF + SKF_AD_PROTOCOL),
673                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
674                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
675                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
676                         BPF_STMT(BPF_RET | BPF_K, 0),
677                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
678                         BPF_STMT(BPF_RET | BPF_A, 0)
679                 },
680                 CLASSIC,
681                 { 10, 20, 30 },
682                 { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
683         },
684         {
685                 "LD_VLAN_TAG",
686                 .u.insns = {
687                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
688                                  SKF_AD_OFF + SKF_AD_VLAN_TAG),
689                         BPF_STMT(BPF_RET | BPF_A, 0)
690                 },
691                 CLASSIC,
692                 { },
693                 {
694                         { 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
695                         { 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
696                 },
697         },
698         {
699                 "LD_VLAN_TAG_PRESENT",
700                 .u.insns = {
701                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
702                                  SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
703                         BPF_STMT(BPF_RET | BPF_A, 0)
704                 },
705                 CLASSIC,
706                 { },
707                 {
708                         { 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
709                         { 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
710                 },
711         },
712         {
713                 "LD_IFINDEX",
714                 .u.insns = {
715                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
716                                  SKF_AD_OFF + SKF_AD_IFINDEX),
717                         BPF_STMT(BPF_RET | BPF_A, 0)
718                 },
719                 CLASSIC,
720                 { },
721                 { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
722         },
723         {
724                 "LD_HATYPE",
725                 .u.insns = {
726                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
727                                  SKF_AD_OFF + SKF_AD_HATYPE),
728                         BPF_STMT(BPF_RET | BPF_A, 0)
729                 },
730                 CLASSIC,
731                 { },
732                 { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
733         },
734         {
735                 "LD_CPU",
736                 .u.insns = {
737                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
738                                  SKF_AD_OFF + SKF_AD_CPU),
739                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
740                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
741                                  SKF_AD_OFF + SKF_AD_CPU),
742                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
743                         BPF_STMT(BPF_RET | BPF_A, 0)
744                 },
745                 CLASSIC,
746                 { },
747                 { { 1, 0 }, { 10, 0 } },
748         },
749         {
750                 "LD_NLATTR",
751                 .u.insns = {
752                         BPF_STMT(BPF_LDX | BPF_IMM, 2),
753                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
754                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
755                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
756                                  SKF_AD_OFF + SKF_AD_NLATTR),
757                         BPF_STMT(BPF_RET | BPF_A, 0)
758                 },
759                 CLASSIC,
760 #ifdef __BIG_ENDIAN
761                 { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
762 #else
763                 { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
764 #endif
765                 { { 4, 0 }, { 20, 6 } },
766         },
767         {
768                 "LD_NLATTR_NEST",
769                 .u.insns = {
770                         BPF_STMT(BPF_LD | BPF_IMM, 2),
771                         BPF_STMT(BPF_LDX | BPF_IMM, 3),
772                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
773                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
774                         BPF_STMT(BPF_LD | BPF_IMM, 2),
775                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
776                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
777                         BPF_STMT(BPF_LD | BPF_IMM, 2),
778                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
779                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
780                         BPF_STMT(BPF_LD | BPF_IMM, 2),
781                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
782                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
783                         BPF_STMT(BPF_LD | BPF_IMM, 2),
784                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
785                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
786                         BPF_STMT(BPF_LD | BPF_IMM, 2),
787                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
788                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
789                         BPF_STMT(BPF_LD | BPF_IMM, 2),
790                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
791                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
792                         BPF_STMT(BPF_LD | BPF_IMM, 2),
793                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
794                                  SKF_AD_OFF + SKF_AD_NLATTR_NEST),
795                         BPF_STMT(BPF_RET | BPF_A, 0)
796                 },
797                 CLASSIC,
798 #ifdef __BIG_ENDIAN
799                 { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
800 #else
801                 { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
802 #endif
803                 { { 4, 0 }, { 20, 10 } },
804         },
805         {
806                 "LD_PAYLOAD_OFF",
807                 .u.insns = {
808                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
809                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
810                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
811                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
812                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
813                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
814                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
815                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
816                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
817                                  SKF_AD_OFF + SKF_AD_PAY_OFFSET),
818                         BPF_STMT(BPF_RET | BPF_A, 0)
819                 },
820                 CLASSIC,
821                 /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
822                  * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
823                  * id 9737, seq 1, length 64
824                  */
825                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827                   0x08, 0x00,
828                   0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
829                   0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
830                 { { 30, 0 }, { 100, 42 } },
831         },
832         {
833                 "LD_ANC_XOR",
834                 .u.insns = {
835                         BPF_STMT(BPF_LD | BPF_IMM, 10),
836                         BPF_STMT(BPF_LDX | BPF_IMM, 300),
837                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
838                                  SKF_AD_OFF + SKF_AD_ALU_XOR_X),
839                         BPF_STMT(BPF_RET | BPF_A, 0)
840                 },
841                 CLASSIC,
842                 { },
843                 { { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
844         },
845         {
846                 "SPILL_FILL",
847                 .u.insns = {
848                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
849                         BPF_STMT(BPF_LD | BPF_IMM, 2),
850                         BPF_STMT(BPF_ALU | BPF_RSH, 1),
851                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
852                         BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
853                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
854                         BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
855                         BPF_STMT(BPF_STX, 15), /* M3 = len */
856                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
857                         BPF_STMT(BPF_LD | BPF_MEM, 2),
858                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
859                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
860                         BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
861                         BPF_STMT(BPF_RET | BPF_A, 0)
862                 },
863                 CLASSIC,
864                 { },
865                 { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
866         },
867         {
868                 "JEQ",
869                 .u.insns = {
870                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
871                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
872                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
873                         BPF_STMT(BPF_RET | BPF_K, 1),
874                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
875                 },
876                 CLASSIC,
877                 { 3, 3, 3, 3, 3 },
878                 { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
879         },
880         {
881                 "JGT",
882                 .u.insns = {
883                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
884                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
885                         BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
886                         BPF_STMT(BPF_RET | BPF_K, 1),
887                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
888                 },
889                 CLASSIC,
890                 { 4, 4, 4, 3, 3 },
891                 { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
892         },
893         {
894                 "JGE",
895                 .u.insns = {
896                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
897                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
898                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
899                         BPF_STMT(BPF_RET | BPF_K, 10),
900                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
901                         BPF_STMT(BPF_RET | BPF_K, 20),
902                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
903                         BPF_STMT(BPF_RET | BPF_K, 30),
904                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
905                         BPF_STMT(BPF_RET | BPF_K, 40),
906                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
907                 },
908                 CLASSIC,
909                 { 1, 2, 3, 4, 5 },
910                 { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
911         },
912         {
913                 "JSET",
914                 .u.insns = {
915                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
916                         BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
917                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
918                         BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
919                         BPF_STMT(BPF_LDX | BPF_LEN, 0),
920                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
921                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
922                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
923                         BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
924                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
925                         BPF_STMT(BPF_RET | BPF_K, 10),
926                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
927                         BPF_STMT(BPF_RET | BPF_K, 20),
928                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
929                         BPF_STMT(BPF_RET | BPF_K, 30),
930                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
931                         BPF_STMT(BPF_RET | BPF_K, 30),
932                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
933                         BPF_STMT(BPF_RET | BPF_K, 30),
934                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
935                         BPF_STMT(BPF_RET | BPF_K, 30),
936                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
937                         BPF_STMT(BPF_RET | BPF_K, 30),
938                         BPF_STMT(BPF_RET | BPF_K, MAX_K)
939                 },
940                 CLASSIC,
941                 { 0, 0xAA, 0x55, 1 },
942                 { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
943         },
944         {
945                 "tcpdump port 22",
946                 .u.insns = {
947                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
948                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
949                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
950                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
951                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
952                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
953                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
954                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
955                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
956                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
957                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
958                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
959                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
960                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
961                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
962                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
963                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
964                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
965                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
966                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
967                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
968                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
969                         BPF_STMT(BPF_RET | BPF_K, 0xffff),
970                         BPF_STMT(BPF_RET | BPF_K, 0),
971                 },
972                 CLASSIC,
973                 /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
974                  * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
975                  * seq 1305692979:1305693027, ack 3650467037, win 65535,
976                  * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
977                  */
978                 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
979                   0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
980                   0x08, 0x00,
981                   0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
982                   0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
983                   0x0a, 0x01, 0x01, 0x95, /* ip src */
984                   0x0a, 0x01, 0x02, 0x0a, /* ip dst */
985                   0xc2, 0x24,
986                   0x00, 0x16 /* dst port */ },
987                 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
988         },
989         {
990                 "tcpdump complex",
991                 .u.insns = {
992                         /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
993                          * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
994                          * (len > 115 or len < 30000000000)' -d
995                          */
996                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
997                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
998                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
999                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1000                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
1001                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1002                         BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
1003                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1004                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1005                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1006                         BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1007                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
1008                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
1009                         BPF_STMT(BPF_ST, 1),
1010                         BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
1011                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
1012                         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
1013                         BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
1014                         BPF_STMT(BPF_LD | BPF_MEM, 1),
1015                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
1016                         BPF_STMT(BPF_ST, 5),
1017                         BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1018                         BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
1019                         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
1020                         BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
1021                         BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
1022                         BPF_STMT(BPF_LD | BPF_MEM, 5),
1023                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
1024                         BPF_STMT(BPF_LD | BPF_LEN, 0),
1025                         BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
1026                         BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
1027                         BPF_STMT(BPF_RET | BPF_K, 0xffff),
1028                         BPF_STMT(BPF_RET | BPF_K, 0),
1029                 },
1030                 CLASSIC,
1031                 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1032                   0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1033                   0x08, 0x00,
1034                   0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1035                   0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1036                   0x0a, 0x01, 0x01, 0x95, /* ip src */
1037                   0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1038                   0xc2, 0x24,
1039                   0x00, 0x16 /* dst port */ },
1040                 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1041         },
1042         {
1043                 "RET_A",
1044                 .u.insns = {
1045                         /* check that unitialized X and A contain zeros */
1046                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
1047                         BPF_STMT(BPF_RET | BPF_A, 0)
1048                 },
1049                 CLASSIC,
1050                 { },
1051                 { {1, 0}, {2, 0} },
1052         },
1053         {
1054                 "INT: ADD trivial",
1055                 .u.insns_int = {
1056                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
1057                         BPF_ALU64_IMM(BPF_ADD, R1, 2),
1058                         BPF_ALU64_IMM(BPF_MOV, R2, 3),
1059                         BPF_ALU64_REG(BPF_SUB, R1, R2),
1060                         BPF_ALU64_IMM(BPF_ADD, R1, -1),
1061                         BPF_ALU64_IMM(BPF_MUL, R1, 3),
1062                         BPF_ALU64_REG(BPF_MOV, R0, R1),
1063                         BPF_EXIT_INSN(),
1064                 },
1065                 INTERNAL,
1066                 { },
1067                 { { 0, 0xfffffffd } }
1068         },
1069         {
1070                 "INT: MUL_X",
1071                 .u.insns_int = {
1072                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
1073                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
1074                         BPF_ALU64_IMM(BPF_MOV, R2, 3),
1075                         BPF_ALU64_REG(BPF_MUL, R1, R2),
1076                         BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
1077                         BPF_EXIT_INSN(),
1078                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
1079                         BPF_EXIT_INSN(),
1080                 },
1081                 INTERNAL,
1082                 { },
1083                 { { 0, 1 } }
1084         },
1085         {
1086                 "INT: MUL_X2",
1087                 .u.insns_int = {
1088                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
1089                         BPF_ALU32_IMM(BPF_MOV, R1, -1),
1090                         BPF_ALU32_IMM(BPF_MOV, R2, 3),
1091                         BPF_ALU64_REG(BPF_MUL, R1, R2),
1092                         BPF_ALU64_IMM(BPF_RSH, R1, 8),
1093                         BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
1094                         BPF_EXIT_INSN(),
1095                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
1096                         BPF_EXIT_INSN(),
1097                 },
1098                 INTERNAL,
1099                 { },
1100                 { { 0, 1 } }
1101         },
1102         {
1103                 "INT: MUL32_X",
1104                 .u.insns_int = {
1105                         BPF_ALU32_IMM(BPF_MOV, R0, -1),
1106                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
1107                         BPF_ALU32_IMM(BPF_MOV, R2, 3),
1108                         BPF_ALU32_REG(BPF_MUL, R1, R2),
1109                         BPF_ALU64_IMM(BPF_RSH, R1, 8),
1110                         BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
1111                         BPF_EXIT_INSN(),
1112                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
1113                         BPF_EXIT_INSN(),
1114                 },
1115                 INTERNAL,
1116                 { },
1117                 { { 0, 1 } }
1118         },
1119         {
1120                 /* Have to test all register combinations, since
1121                  * JITing of different registers will produce
1122                  * different asm code.
1123                  */
1124                 "INT: ADD 64-bit",
1125                 .u.insns_int = {
1126                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
1127                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
1128                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
1129                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
1130                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
1131                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
1132                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
1133                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
1134                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
1135                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
1136                         BPF_ALU64_IMM(BPF_ADD, R0, 20),
1137                         BPF_ALU64_IMM(BPF_ADD, R1, 20),
1138                         BPF_ALU64_IMM(BPF_ADD, R2, 20),
1139                         BPF_ALU64_IMM(BPF_ADD, R3, 20),
1140                         BPF_ALU64_IMM(BPF_ADD, R4, 20),
1141                         BPF_ALU64_IMM(BPF_ADD, R5, 20),
1142                         BPF_ALU64_IMM(BPF_ADD, R6, 20),
1143                         BPF_ALU64_IMM(BPF_ADD, R7, 20),
1144                         BPF_ALU64_IMM(BPF_ADD, R8, 20),
1145                         BPF_ALU64_IMM(BPF_ADD, R9, 20),
1146                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
1147                         BPF_ALU64_IMM(BPF_SUB, R1, 10),
1148                         BPF_ALU64_IMM(BPF_SUB, R2, 10),
1149                         BPF_ALU64_IMM(BPF_SUB, R3, 10),
1150                         BPF_ALU64_IMM(BPF_SUB, R4, 10),
1151                         BPF_ALU64_IMM(BPF_SUB, R5, 10),
1152                         BPF_ALU64_IMM(BPF_SUB, R6, 10),
1153                         BPF_ALU64_IMM(BPF_SUB, R7, 10),
1154                         BPF_ALU64_IMM(BPF_SUB, R8, 10),
1155                         BPF_ALU64_IMM(BPF_SUB, R9, 10),
1156                         BPF_ALU64_REG(BPF_ADD, R0, R0),
1157                         BPF_ALU64_REG(BPF_ADD, R0, R1),
1158                         BPF_ALU64_REG(BPF_ADD, R0, R2),
1159                         BPF_ALU64_REG(BPF_ADD, R0, R3),
1160                         BPF_ALU64_REG(BPF_ADD, R0, R4),
1161                         BPF_ALU64_REG(BPF_ADD, R0, R5),
1162                         BPF_ALU64_REG(BPF_ADD, R0, R6),
1163                         BPF_ALU64_REG(BPF_ADD, R0, R7),
1164                         BPF_ALU64_REG(BPF_ADD, R0, R8),
1165                         BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1166                         BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1167                         BPF_EXIT_INSN(),
1168                         BPF_ALU64_REG(BPF_ADD, R1, R0),
1169                         BPF_ALU64_REG(BPF_ADD, R1, R1),
1170                         BPF_ALU64_REG(BPF_ADD, R1, R2),
1171                         BPF_ALU64_REG(BPF_ADD, R1, R3),
1172                         BPF_ALU64_REG(BPF_ADD, R1, R4),
1173                         BPF_ALU64_REG(BPF_ADD, R1, R5),
1174                         BPF_ALU64_REG(BPF_ADD, R1, R6),
1175                         BPF_ALU64_REG(BPF_ADD, R1, R7),
1176                         BPF_ALU64_REG(BPF_ADD, R1, R8),
1177                         BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1178                         BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1179                         BPF_EXIT_INSN(),
1180                         BPF_ALU64_REG(BPF_ADD, R2, R0),
1181                         BPF_ALU64_REG(BPF_ADD, R2, R1),
1182                         BPF_ALU64_REG(BPF_ADD, R2, R2),
1183                         BPF_ALU64_REG(BPF_ADD, R2, R3),
1184                         BPF_ALU64_REG(BPF_ADD, R2, R4),
1185                         BPF_ALU64_REG(BPF_ADD, R2, R5),
1186                         BPF_ALU64_REG(BPF_ADD, R2, R6),
1187                         BPF_ALU64_REG(BPF_ADD, R2, R7),
1188                         BPF_ALU64_REG(BPF_ADD, R2, R8),
1189                         BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1190                         BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1191                         BPF_EXIT_INSN(),
1192                         BPF_ALU64_REG(BPF_ADD, R3, R0),
1193                         BPF_ALU64_REG(BPF_ADD, R3, R1),
1194                         BPF_ALU64_REG(BPF_ADD, R3, R2),
1195                         BPF_ALU64_REG(BPF_ADD, R3, R3),
1196                         BPF_ALU64_REG(BPF_ADD, R3, R4),
1197                         BPF_ALU64_REG(BPF_ADD, R3, R5),
1198                         BPF_ALU64_REG(BPF_ADD, R3, R6),
1199                         BPF_ALU64_REG(BPF_ADD, R3, R7),
1200                         BPF_ALU64_REG(BPF_ADD, R3, R8),
1201                         BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1202                         BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1203                         BPF_EXIT_INSN(),
1204                         BPF_ALU64_REG(BPF_ADD, R4, R0),
1205                         BPF_ALU64_REG(BPF_ADD, R4, R1),
1206                         BPF_ALU64_REG(BPF_ADD, R4, R2),
1207                         BPF_ALU64_REG(BPF_ADD, R4, R3),
1208                         BPF_ALU64_REG(BPF_ADD, R4, R4),
1209                         BPF_ALU64_REG(BPF_ADD, R4, R5),
1210                         BPF_ALU64_REG(BPF_ADD, R4, R6),
1211                         BPF_ALU64_REG(BPF_ADD, R4, R7),
1212                         BPF_ALU64_REG(BPF_ADD, R4, R8),
1213                         BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1214                         BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1215                         BPF_EXIT_INSN(),
1216                         BPF_ALU64_REG(BPF_ADD, R5, R0),
1217                         BPF_ALU64_REG(BPF_ADD, R5, R1),
1218                         BPF_ALU64_REG(BPF_ADD, R5, R2),
1219                         BPF_ALU64_REG(BPF_ADD, R5, R3),
1220                         BPF_ALU64_REG(BPF_ADD, R5, R4),
1221                         BPF_ALU64_REG(BPF_ADD, R5, R5),
1222                         BPF_ALU64_REG(BPF_ADD, R5, R6),
1223                         BPF_ALU64_REG(BPF_ADD, R5, R7),
1224                         BPF_ALU64_REG(BPF_ADD, R5, R8),
1225                         BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1226                         BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1227                         BPF_EXIT_INSN(),
1228                         BPF_ALU64_REG(BPF_ADD, R6, R0),
1229                         BPF_ALU64_REG(BPF_ADD, R6, R1),
1230                         BPF_ALU64_REG(BPF_ADD, R6, R2),
1231                         BPF_ALU64_REG(BPF_ADD, R6, R3),
1232                         BPF_ALU64_REG(BPF_ADD, R6, R4),
1233                         BPF_ALU64_REG(BPF_ADD, R6, R5),
1234                         BPF_ALU64_REG(BPF_ADD, R6, R6),
1235                         BPF_ALU64_REG(BPF_ADD, R6, R7),
1236                         BPF_ALU64_REG(BPF_ADD, R6, R8),
1237                         BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1238                         BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1239                         BPF_EXIT_INSN(),
1240                         BPF_ALU64_REG(BPF_ADD, R7, R0),
1241                         BPF_ALU64_REG(BPF_ADD, R7, R1),
1242                         BPF_ALU64_REG(BPF_ADD, R7, R2),
1243                         BPF_ALU64_REG(BPF_ADD, R7, R3),
1244                         BPF_ALU64_REG(BPF_ADD, R7, R4),
1245                         BPF_ALU64_REG(BPF_ADD, R7, R5),
1246                         BPF_ALU64_REG(BPF_ADD, R7, R6),
1247                         BPF_ALU64_REG(BPF_ADD, R7, R7),
1248                         BPF_ALU64_REG(BPF_ADD, R7, R8),
1249                         BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1250                         BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1251                         BPF_EXIT_INSN(),
1252                         BPF_ALU64_REG(BPF_ADD, R8, R0),
1253                         BPF_ALU64_REG(BPF_ADD, R8, R1),
1254                         BPF_ALU64_REG(BPF_ADD, R8, R2),
1255                         BPF_ALU64_REG(BPF_ADD, R8, R3),
1256                         BPF_ALU64_REG(BPF_ADD, R8, R4),
1257                         BPF_ALU64_REG(BPF_ADD, R8, R5),
1258                         BPF_ALU64_REG(BPF_ADD, R8, R6),
1259                         BPF_ALU64_REG(BPF_ADD, R8, R7),
1260                         BPF_ALU64_REG(BPF_ADD, R8, R8),
1261                         BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1262                         BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1263                         BPF_EXIT_INSN(),
1264                         BPF_ALU64_REG(BPF_ADD, R9, R0),
1265                         BPF_ALU64_REG(BPF_ADD, R9, R1),
1266                         BPF_ALU64_REG(BPF_ADD, R9, R2),
1267                         BPF_ALU64_REG(BPF_ADD, R9, R3),
1268                         BPF_ALU64_REG(BPF_ADD, R9, R4),
1269                         BPF_ALU64_REG(BPF_ADD, R9, R5),
1270                         BPF_ALU64_REG(BPF_ADD, R9, R6),
1271                         BPF_ALU64_REG(BPF_ADD, R9, R7),
1272                         BPF_ALU64_REG(BPF_ADD, R9, R8),
1273                         BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1274                         BPF_ALU64_REG(BPF_MOV, R0, R9),
1275                         BPF_EXIT_INSN(),
1276                 },
1277                 INTERNAL,
1278                 { },
1279                 { { 0, 2957380 } }
1280         },
1281         {
1282                 "INT: ADD 32-bit",
1283                 .u.insns_int = {
1284                         BPF_ALU32_IMM(BPF_MOV, R0, 20),
1285                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
1286                         BPF_ALU32_IMM(BPF_MOV, R2, 2),
1287                         BPF_ALU32_IMM(BPF_MOV, R3, 3),
1288                         BPF_ALU32_IMM(BPF_MOV, R4, 4),
1289                         BPF_ALU32_IMM(BPF_MOV, R5, 5),
1290                         BPF_ALU32_IMM(BPF_MOV, R6, 6),
1291                         BPF_ALU32_IMM(BPF_MOV, R7, 7),
1292                         BPF_ALU32_IMM(BPF_MOV, R8, 8),
1293                         BPF_ALU32_IMM(BPF_MOV, R9, 9),
1294                         BPF_ALU64_IMM(BPF_ADD, R1, 10),
1295                         BPF_ALU64_IMM(BPF_ADD, R2, 10),
1296                         BPF_ALU64_IMM(BPF_ADD, R3, 10),
1297                         BPF_ALU64_IMM(BPF_ADD, R4, 10),
1298                         BPF_ALU64_IMM(BPF_ADD, R5, 10),
1299                         BPF_ALU64_IMM(BPF_ADD, R6, 10),
1300                         BPF_ALU64_IMM(BPF_ADD, R7, 10),
1301                         BPF_ALU64_IMM(BPF_ADD, R8, 10),
1302                         BPF_ALU64_IMM(BPF_ADD, R9, 10),
1303                         BPF_ALU32_REG(BPF_ADD, R0, R1),
1304                         BPF_ALU32_REG(BPF_ADD, R0, R2),
1305                         BPF_ALU32_REG(BPF_ADD, R0, R3),
1306                         BPF_ALU32_REG(BPF_ADD, R0, R4),
1307                         BPF_ALU32_REG(BPF_ADD, R0, R5),
1308                         BPF_ALU32_REG(BPF_ADD, R0, R6),
1309                         BPF_ALU32_REG(BPF_ADD, R0, R7),
1310                         BPF_ALU32_REG(BPF_ADD, R0, R8),
1311                         BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1312                         BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1313                         BPF_EXIT_INSN(),
1314                         BPF_ALU32_REG(BPF_ADD, R1, R0),
1315                         BPF_ALU32_REG(BPF_ADD, R1, R1),
1316                         BPF_ALU32_REG(BPF_ADD, R1, R2),
1317                         BPF_ALU32_REG(BPF_ADD, R1, R3),
1318                         BPF_ALU32_REG(BPF_ADD, R1, R4),
1319                         BPF_ALU32_REG(BPF_ADD, R1, R5),
1320                         BPF_ALU32_REG(BPF_ADD, R1, R6),
1321                         BPF_ALU32_REG(BPF_ADD, R1, R7),
1322                         BPF_ALU32_REG(BPF_ADD, R1, R8),
1323                         BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1324                         BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1325                         BPF_EXIT_INSN(),
1326                         BPF_ALU32_REG(BPF_ADD, R2, R0),
1327                         BPF_ALU32_REG(BPF_ADD, R2, R1),
1328                         BPF_ALU32_REG(BPF_ADD, R2, R2),
1329                         BPF_ALU32_REG(BPF_ADD, R2, R3),
1330                         BPF_ALU32_REG(BPF_ADD, R2, R4),
1331                         BPF_ALU32_REG(BPF_ADD, R2, R5),
1332                         BPF_ALU32_REG(BPF_ADD, R2, R6),
1333                         BPF_ALU32_REG(BPF_ADD, R2, R7),
1334                         BPF_ALU32_REG(BPF_ADD, R2, R8),
1335                         BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1336                         BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1337                         BPF_EXIT_INSN(),
1338                         BPF_ALU32_REG(BPF_ADD, R3, R0),
1339                         BPF_ALU32_REG(BPF_ADD, R3, R1),
1340                         BPF_ALU32_REG(BPF_ADD, R3, R2),
1341                         BPF_ALU32_REG(BPF_ADD, R3, R3),
1342                         BPF_ALU32_REG(BPF_ADD, R3, R4),
1343                         BPF_ALU32_REG(BPF_ADD, R3, R5),
1344                         BPF_ALU32_REG(BPF_ADD, R3, R6),
1345                         BPF_ALU32_REG(BPF_ADD, R3, R7),
1346                         BPF_ALU32_REG(BPF_ADD, R3, R8),
1347                         BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1348                         BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1349                         BPF_EXIT_INSN(),
1350                         BPF_ALU32_REG(BPF_ADD, R4, R0),
1351                         BPF_ALU32_REG(BPF_ADD, R4, R1),
1352                         BPF_ALU32_REG(BPF_ADD, R4, R2),
1353                         BPF_ALU32_REG(BPF_ADD, R4, R3),
1354                         BPF_ALU32_REG(BPF_ADD, R4, R4),
1355                         BPF_ALU32_REG(BPF_ADD, R4, R5),
1356                         BPF_ALU32_REG(BPF_ADD, R4, R6),
1357                         BPF_ALU32_REG(BPF_ADD, R4, R7),
1358                         BPF_ALU32_REG(BPF_ADD, R4, R8),
1359                         BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1360                         BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1361                         BPF_EXIT_INSN(),
1362                         BPF_ALU32_REG(BPF_ADD, R5, R0),
1363                         BPF_ALU32_REG(BPF_ADD, R5, R1),
1364                         BPF_ALU32_REG(BPF_ADD, R5, R2),
1365                         BPF_ALU32_REG(BPF_ADD, R5, R3),
1366                         BPF_ALU32_REG(BPF_ADD, R5, R4),
1367                         BPF_ALU32_REG(BPF_ADD, R5, R5),
1368                         BPF_ALU32_REG(BPF_ADD, R5, R6),
1369                         BPF_ALU32_REG(BPF_ADD, R5, R7),
1370                         BPF_ALU32_REG(BPF_ADD, R5, R8),
1371                         BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1372                         BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1373                         BPF_EXIT_INSN(),
1374                         BPF_ALU32_REG(BPF_ADD, R6, R0),
1375                         BPF_ALU32_REG(BPF_ADD, R6, R1),
1376                         BPF_ALU32_REG(BPF_ADD, R6, R2),
1377                         BPF_ALU32_REG(BPF_ADD, R6, R3),
1378                         BPF_ALU32_REG(BPF_ADD, R6, R4),
1379                         BPF_ALU32_REG(BPF_ADD, R6, R5),
1380                         BPF_ALU32_REG(BPF_ADD, R6, R6),
1381                         BPF_ALU32_REG(BPF_ADD, R6, R7),
1382                         BPF_ALU32_REG(BPF_ADD, R6, R8),
1383                         BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1384                         BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1385                         BPF_EXIT_INSN(),
1386                         BPF_ALU32_REG(BPF_ADD, R7, R0),
1387                         BPF_ALU32_REG(BPF_ADD, R7, R1),
1388                         BPF_ALU32_REG(BPF_ADD, R7, R2),
1389                         BPF_ALU32_REG(BPF_ADD, R7, R3),
1390                         BPF_ALU32_REG(BPF_ADD, R7, R4),
1391                         BPF_ALU32_REG(BPF_ADD, R7, R5),
1392                         BPF_ALU32_REG(BPF_ADD, R7, R6),
1393                         BPF_ALU32_REG(BPF_ADD, R7, R7),
1394                         BPF_ALU32_REG(BPF_ADD, R7, R8),
1395                         BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1396                         BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1397                         BPF_EXIT_INSN(),
1398                         BPF_ALU32_REG(BPF_ADD, R8, R0),
1399                         BPF_ALU32_REG(BPF_ADD, R8, R1),
1400                         BPF_ALU32_REG(BPF_ADD, R8, R2),
1401                         BPF_ALU32_REG(BPF_ADD, R8, R3),
1402                         BPF_ALU32_REG(BPF_ADD, R8, R4),
1403                         BPF_ALU32_REG(BPF_ADD, R8, R5),
1404                         BPF_ALU32_REG(BPF_ADD, R8, R6),
1405                         BPF_ALU32_REG(BPF_ADD, R8, R7),
1406                         BPF_ALU32_REG(BPF_ADD, R8, R8),
1407                         BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1408                         BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1409                         BPF_EXIT_INSN(),
1410                         BPF_ALU32_REG(BPF_ADD, R9, R0),
1411                         BPF_ALU32_REG(BPF_ADD, R9, R1),
1412                         BPF_ALU32_REG(BPF_ADD, R9, R2),
1413                         BPF_ALU32_REG(BPF_ADD, R9, R3),
1414                         BPF_ALU32_REG(BPF_ADD, R9, R4),
1415                         BPF_ALU32_REG(BPF_ADD, R9, R5),
1416                         BPF_ALU32_REG(BPF_ADD, R9, R6),
1417                         BPF_ALU32_REG(BPF_ADD, R9, R7),
1418                         BPF_ALU32_REG(BPF_ADD, R9, R8),
1419                         BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1420                         BPF_ALU32_REG(BPF_MOV, R0, R9),
1421                         BPF_EXIT_INSN(),
1422                 },
1423                 INTERNAL,
1424                 { },
1425                 { { 0, 2957380 } }
1426         },
1427         {       /* Mainly checking JIT here. */
1428                 "INT: SUB",
1429                 .u.insns_int = {
1430                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
1431                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
1432                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
1433                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
1434                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
1435                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
1436                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
1437                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
1438                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
1439                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
1440                         BPF_ALU64_REG(BPF_SUB, R0, R0),
1441                         BPF_ALU64_REG(BPF_SUB, R0, R1),
1442                         BPF_ALU64_REG(BPF_SUB, R0, R2),
1443                         BPF_ALU64_REG(BPF_SUB, R0, R3),
1444                         BPF_ALU64_REG(BPF_SUB, R0, R4),
1445                         BPF_ALU64_REG(BPF_SUB, R0, R5),
1446                         BPF_ALU64_REG(BPF_SUB, R0, R6),
1447                         BPF_ALU64_REG(BPF_SUB, R0, R7),
1448                         BPF_ALU64_REG(BPF_SUB, R0, R8),
1449                         BPF_ALU64_REG(BPF_SUB, R0, R9),
1450                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
1451                         BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1452                         BPF_EXIT_INSN(),
1453                         BPF_ALU64_REG(BPF_SUB, R1, R0),
1454                         BPF_ALU64_REG(BPF_SUB, R1, R2),
1455                         BPF_ALU64_REG(BPF_SUB, R1, R3),
1456                         BPF_ALU64_REG(BPF_SUB, R1, R4),
1457                         BPF_ALU64_REG(BPF_SUB, R1, R5),
1458                         BPF_ALU64_REG(BPF_SUB, R1, R6),
1459                         BPF_ALU64_REG(BPF_SUB, R1, R7),
1460                         BPF_ALU64_REG(BPF_SUB, R1, R8),
1461                         BPF_ALU64_REG(BPF_SUB, R1, R9),
1462                         BPF_ALU64_IMM(BPF_SUB, R1, 10),
1463                         BPF_ALU64_REG(BPF_SUB, R2, R0),
1464                         BPF_ALU64_REG(BPF_SUB, R2, R1),
1465                         BPF_ALU64_REG(BPF_SUB, R2, R3),
1466                         BPF_ALU64_REG(BPF_SUB, R2, R4),
1467                         BPF_ALU64_REG(BPF_SUB, R2, R5),
1468                         BPF_ALU64_REG(BPF_SUB, R2, R6),
1469                         BPF_ALU64_REG(BPF_SUB, R2, R7),
1470                         BPF_ALU64_REG(BPF_SUB, R2, R8),
1471                         BPF_ALU64_REG(BPF_SUB, R2, R9),
1472                         BPF_ALU64_IMM(BPF_SUB, R2, 10),
1473                         BPF_ALU64_REG(BPF_SUB, R3, R0),
1474                         BPF_ALU64_REG(BPF_SUB, R3, R1),
1475                         BPF_ALU64_REG(BPF_SUB, R3, R2),
1476                         BPF_ALU64_REG(BPF_SUB, R3, R4),
1477                         BPF_ALU64_REG(BPF_SUB, R3, R5),
1478                         BPF_ALU64_REG(BPF_SUB, R3, R6),
1479                         BPF_ALU64_REG(BPF_SUB, R3, R7),
1480                         BPF_ALU64_REG(BPF_SUB, R3, R8),
1481                         BPF_ALU64_REG(BPF_SUB, R3, R9),
1482                         BPF_ALU64_IMM(BPF_SUB, R3, 10),
1483                         BPF_ALU64_REG(BPF_SUB, R4, R0),
1484                         BPF_ALU64_REG(BPF_SUB, R4, R1),
1485                         BPF_ALU64_REG(BPF_SUB, R4, R2),
1486                         BPF_ALU64_REG(BPF_SUB, R4, R3),
1487                         BPF_ALU64_REG(BPF_SUB, R4, R5),
1488                         BPF_ALU64_REG(BPF_SUB, R4, R6),
1489                         BPF_ALU64_REG(BPF_SUB, R4, R7),
1490                         BPF_ALU64_REG(BPF_SUB, R4, R8),
1491                         BPF_ALU64_REG(BPF_SUB, R4, R9),
1492                         BPF_ALU64_IMM(BPF_SUB, R4, 10),
1493                         BPF_ALU64_REG(BPF_SUB, R5, R0),
1494                         BPF_ALU64_REG(BPF_SUB, R5, R1),
1495                         BPF_ALU64_REG(BPF_SUB, R5, R2),
1496                         BPF_ALU64_REG(BPF_SUB, R5, R3),
1497                         BPF_ALU64_REG(BPF_SUB, R5, R4),
1498                         BPF_ALU64_REG(BPF_SUB, R5, R6),
1499                         BPF_ALU64_REG(BPF_SUB, R5, R7),
1500                         BPF_ALU64_REG(BPF_SUB, R5, R8),
1501                         BPF_ALU64_REG(BPF_SUB, R5, R9),
1502                         BPF_ALU64_IMM(BPF_SUB, R5, 10),
1503                         BPF_ALU64_REG(BPF_SUB, R6, R0),
1504                         BPF_ALU64_REG(BPF_SUB, R6, R1),
1505                         BPF_ALU64_REG(BPF_SUB, R6, R2),
1506                         BPF_ALU64_REG(BPF_SUB, R6, R3),
1507                         BPF_ALU64_REG(BPF_SUB, R6, R4),
1508                         BPF_ALU64_REG(BPF_SUB, R6, R5),
1509                         BPF_ALU64_REG(BPF_SUB, R6, R7),
1510                         BPF_ALU64_REG(BPF_SUB, R6, R8),
1511                         BPF_ALU64_REG(BPF_SUB, R6, R9),
1512                         BPF_ALU64_IMM(BPF_SUB, R6, 10),
1513                         BPF_ALU64_REG(BPF_SUB, R7, R0),
1514                         BPF_ALU64_REG(BPF_SUB, R7, R1),
1515                         BPF_ALU64_REG(BPF_SUB, R7, R2),
1516                         BPF_ALU64_REG(BPF_SUB, R7, R3),
1517                         BPF_ALU64_REG(BPF_SUB, R7, R4),
1518                         BPF_ALU64_REG(BPF_SUB, R7, R5),
1519                         BPF_ALU64_REG(BPF_SUB, R7, R6),
1520                         BPF_ALU64_REG(BPF_SUB, R7, R8),
1521                         BPF_ALU64_REG(BPF_SUB, R7, R9),
1522                         BPF_ALU64_IMM(BPF_SUB, R7, 10),
1523                         BPF_ALU64_REG(BPF_SUB, R8, R0),
1524                         BPF_ALU64_REG(BPF_SUB, R8, R1),
1525                         BPF_ALU64_REG(BPF_SUB, R8, R2),
1526                         BPF_ALU64_REG(BPF_SUB, R8, R3),
1527                         BPF_ALU64_REG(BPF_SUB, R8, R4),
1528                         BPF_ALU64_REG(BPF_SUB, R8, R5),
1529                         BPF_ALU64_REG(BPF_SUB, R8, R6),
1530                         BPF_ALU64_REG(BPF_SUB, R8, R7),
1531                         BPF_ALU64_REG(BPF_SUB, R8, R9),
1532                         BPF_ALU64_IMM(BPF_SUB, R8, 10),
1533                         BPF_ALU64_REG(BPF_SUB, R9, R0),
1534                         BPF_ALU64_REG(BPF_SUB, R9, R1),
1535                         BPF_ALU64_REG(BPF_SUB, R9, R2),
1536                         BPF_ALU64_REG(BPF_SUB, R9, R3),
1537                         BPF_ALU64_REG(BPF_SUB, R9, R4),
1538                         BPF_ALU64_REG(BPF_SUB, R9, R5),
1539                         BPF_ALU64_REG(BPF_SUB, R9, R6),
1540                         BPF_ALU64_REG(BPF_SUB, R9, R7),
1541                         BPF_ALU64_REG(BPF_SUB, R9, R8),
1542                         BPF_ALU64_IMM(BPF_SUB, R9, 10),
1543                         BPF_ALU64_IMM(BPF_SUB, R0, 10),
1544                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
1545                         BPF_ALU64_REG(BPF_SUB, R0, R1),
1546                         BPF_ALU64_REG(BPF_SUB, R0, R2),
1547                         BPF_ALU64_REG(BPF_SUB, R0, R3),
1548                         BPF_ALU64_REG(BPF_SUB, R0, R4),
1549                         BPF_ALU64_REG(BPF_SUB, R0, R5),
1550                         BPF_ALU64_REG(BPF_SUB, R0, R6),
1551                         BPF_ALU64_REG(BPF_SUB, R0, R7),
1552                         BPF_ALU64_REG(BPF_SUB, R0, R8),
1553                         BPF_ALU64_REG(BPF_SUB, R0, R9),
1554                         BPF_EXIT_INSN(),
1555                 },
1556                 INTERNAL,
1557                 { },
1558                 { { 0, 11 } }
1559         },
1560         {       /* Mainly checking JIT here. */
1561                 "INT: XOR",
1562                 .u.insns_int = {
1563                         BPF_ALU64_REG(BPF_SUB, R0, R0),
1564                         BPF_ALU64_REG(BPF_XOR, R1, R1),
1565                         BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1566                         BPF_EXIT_INSN(),
1567                         BPF_ALU64_IMM(BPF_MOV, R0, 10),
1568                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
1569                         BPF_ALU64_REG(BPF_SUB, R1, R1),
1570                         BPF_ALU64_REG(BPF_XOR, R2, R2),
1571                         BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1572                         BPF_EXIT_INSN(),
1573                         BPF_ALU64_REG(BPF_SUB, R2, R2),
1574                         BPF_ALU64_REG(BPF_XOR, R3, R3),
1575                         BPF_ALU64_IMM(BPF_MOV, R0, 10),
1576                         BPF_ALU64_IMM(BPF_MOV, R1, -1),
1577                         BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1578                         BPF_EXIT_INSN(),
1579                         BPF_ALU64_REG(BPF_SUB, R3, R3),
1580                         BPF_ALU64_REG(BPF_XOR, R4, R4),
1581                         BPF_ALU64_IMM(BPF_MOV, R2, 1),
1582                         BPF_ALU64_IMM(BPF_MOV, R5, -1),
1583                         BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1584                         BPF_EXIT_INSN(),
1585                         BPF_ALU64_REG(BPF_SUB, R4, R4),
1586                         BPF_ALU64_REG(BPF_XOR, R5, R5),
1587                         BPF_ALU64_IMM(BPF_MOV, R3, 1),
1588                         BPF_ALU64_IMM(BPF_MOV, R7, -1),
1589                         BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1590                         BPF_EXIT_INSN(),
1591                         BPF_ALU64_IMM(BPF_MOV, R5, 1),
1592                         BPF_ALU64_REG(BPF_SUB, R5, R5),
1593                         BPF_ALU64_REG(BPF_XOR, R6, R6),
1594                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
1595                         BPF_ALU64_IMM(BPF_MOV, R8, -1),
1596                         BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1597                         BPF_EXIT_INSN(),
1598                         BPF_ALU64_REG(BPF_SUB, R6, R6),
1599                         BPF_ALU64_REG(BPF_XOR, R7, R7),
1600                         BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1601                         BPF_EXIT_INSN(),
1602                         BPF_ALU64_REG(BPF_SUB, R7, R7),
1603                         BPF_ALU64_REG(BPF_XOR, R8, R8),
1604                         BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1605                         BPF_EXIT_INSN(),
1606                         BPF_ALU64_REG(BPF_SUB, R8, R8),
1607                         BPF_ALU64_REG(BPF_XOR, R9, R9),
1608                         BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1609                         BPF_EXIT_INSN(),
1610                         BPF_ALU64_REG(BPF_SUB, R9, R9),
1611                         BPF_ALU64_REG(BPF_XOR, R0, R0),
1612                         BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1613                         BPF_EXIT_INSN(),
1614                         BPF_ALU64_REG(BPF_SUB, R1, R1),
1615                         BPF_ALU64_REG(BPF_XOR, R0, R0),
1616                         BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1617                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
1618                         BPF_EXIT_INSN(),
1619                         BPF_ALU64_IMM(BPF_MOV, R0, 1),
1620                         BPF_EXIT_INSN(),
1621                 },
1622                 INTERNAL,
1623                 { },
1624                 { { 0, 1 } }
1625         },
1626         {       /* Mainly checking JIT here. */
1627                 "INT: MUL",
1628                 .u.insns_int = {
1629                         BPF_ALU64_IMM(BPF_MOV, R0, 11),
1630                         BPF_ALU64_IMM(BPF_MOV, R1, 1),
1631                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
1632                         BPF_ALU64_IMM(BPF_MOV, R3, 3),
1633                         BPF_ALU64_IMM(BPF_MOV, R4, 4),
1634                         BPF_ALU64_IMM(BPF_MOV, R5, 5),
1635                         BPF_ALU64_IMM(BPF_MOV, R6, 6),
1636                         BPF_ALU64_IMM(BPF_MOV, R7, 7),
1637                         BPF_ALU64_IMM(BPF_MOV, R8, 8),
1638                         BPF_ALU64_IMM(BPF_MOV, R9, 9),
1639                         BPF_ALU64_REG(BPF_MUL, R0, R0),
1640                         BPF_ALU64_REG(BPF_MUL, R0, R1),
1641                         BPF_ALU64_REG(BPF_MUL, R0, R2),
1642                         BPF_ALU64_REG(BPF_MUL, R0, R3),
1643                         BPF_ALU64_REG(BPF_MUL, R0, R4),
1644                         BPF_ALU64_REG(BPF_MUL, R0, R5),
1645                         BPF_ALU64_REG(BPF_MUL, R0, R6),
1646                         BPF_ALU64_REG(BPF_MUL, R0, R7),
1647                         BPF_ALU64_REG(BPF_MUL, R0, R8),
1648                         BPF_ALU64_REG(BPF_MUL, R0, R9),
1649                         BPF_ALU64_IMM(BPF_MUL, R0, 10),
1650                         BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1651                         BPF_EXIT_INSN(),
1652                         BPF_ALU64_REG(BPF_MUL, R1, R0),
1653                         BPF_ALU64_REG(BPF_MUL, R1, R2),
1654                         BPF_ALU64_REG(BPF_MUL, R1, R3),
1655                         BPF_ALU64_REG(BPF_MUL, R1, R4),
1656                         BPF_ALU64_REG(BPF_MUL, R1, R5),
1657                         BPF_ALU64_REG(BPF_MUL, R1, R6),
1658                         BPF_ALU64_REG(BPF_MUL, R1, R7),
1659                         BPF_ALU64_REG(BPF_MUL, R1, R8),
1660                         BPF_ALU64_REG(BPF_MUL, R1, R9),
1661                         BPF_ALU64_IMM(BPF_MUL, R1, 10),
1662                         BPF_ALU64_REG(BPF_MOV, R2, R1),
1663                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
1664                         BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1665                         BPF_EXIT_INSN(),
1666                         BPF_ALU64_IMM(BPF_LSH, R1, 32),
1667                         BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1668                         BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1669                         BPF_EXIT_INSN(),
1670                         BPF_ALU64_REG(BPF_MUL, R2, R0),
1671                         BPF_ALU64_REG(BPF_MUL, R2, R1),
1672                         BPF_ALU64_REG(BPF_MUL, R2, R3),
1673                         BPF_ALU64_REG(BPF_MUL, R2, R4),
1674                         BPF_ALU64_REG(BPF_MUL, R2, R5),
1675                         BPF_ALU64_REG(BPF_MUL, R2, R6),
1676                         BPF_ALU64_REG(BPF_MUL, R2, R7),
1677                         BPF_ALU64_REG(BPF_MUL, R2, R8),
1678                         BPF_ALU64_REG(BPF_MUL, R2, R9),
1679                         BPF_ALU64_IMM(BPF_MUL, R2, 10),
1680                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
1681                         BPF_ALU64_REG(BPF_MOV, R0, R2),
1682                         BPF_EXIT_INSN(),
1683                 },
1684                 INTERNAL,
1685                 { },
1686                 { { 0, 0x35d97ef2 } }
1687         },
1688         {       /* Mainly checking JIT here. */
1689                 "MOV REG64",
1690                 .u.insns_int = {
1691                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1692                         BPF_MOV64_REG(R1, R0),
1693                         BPF_MOV64_REG(R2, R1),
1694                         BPF_MOV64_REG(R3, R2),
1695                         BPF_MOV64_REG(R4, R3),
1696                         BPF_MOV64_REG(R5, R4),
1697                         BPF_MOV64_REG(R6, R5),
1698                         BPF_MOV64_REG(R7, R6),
1699                         BPF_MOV64_REG(R8, R7),
1700                         BPF_MOV64_REG(R9, R8),
1701                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
1702                         BPF_ALU64_IMM(BPF_MOV, R1, 0),
1703                         BPF_ALU64_IMM(BPF_MOV, R2, 0),
1704                         BPF_ALU64_IMM(BPF_MOV, R3, 0),
1705                         BPF_ALU64_IMM(BPF_MOV, R4, 0),
1706                         BPF_ALU64_IMM(BPF_MOV, R5, 0),
1707                         BPF_ALU64_IMM(BPF_MOV, R6, 0),
1708                         BPF_ALU64_IMM(BPF_MOV, R7, 0),
1709                         BPF_ALU64_IMM(BPF_MOV, R8, 0),
1710                         BPF_ALU64_IMM(BPF_MOV, R9, 0),
1711                         BPF_ALU64_REG(BPF_ADD, R0, R0),
1712                         BPF_ALU64_REG(BPF_ADD, R0, R1),
1713                         BPF_ALU64_REG(BPF_ADD, R0, R2),
1714                         BPF_ALU64_REG(BPF_ADD, R0, R3),
1715                         BPF_ALU64_REG(BPF_ADD, R0, R4),
1716                         BPF_ALU64_REG(BPF_ADD, R0, R5),
1717                         BPF_ALU64_REG(BPF_ADD, R0, R6),
1718                         BPF_ALU64_REG(BPF_ADD, R0, R7),
1719                         BPF_ALU64_REG(BPF_ADD, R0, R8),
1720                         BPF_ALU64_REG(BPF_ADD, R0, R9),
1721                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1722                         BPF_EXIT_INSN(),
1723                 },
1724                 INTERNAL,
1725                 { },
1726                 { { 0, 0xfefe } }
1727         },
1728         {       /* Mainly checking JIT here. */
1729                 "MOV REG32",
1730                 .u.insns_int = {
1731                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1732                         BPF_MOV64_REG(R1, R0),
1733                         BPF_MOV64_REG(R2, R1),
1734                         BPF_MOV64_REG(R3, R2),
1735                         BPF_MOV64_REG(R4, R3),
1736                         BPF_MOV64_REG(R5, R4),
1737                         BPF_MOV64_REG(R6, R5),
1738                         BPF_MOV64_REG(R7, R6),
1739                         BPF_MOV64_REG(R8, R7),
1740                         BPF_MOV64_REG(R9, R8),
1741                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
1742                         BPF_ALU32_IMM(BPF_MOV, R1, 0),
1743                         BPF_ALU32_IMM(BPF_MOV, R2, 0),
1744                         BPF_ALU32_IMM(BPF_MOV, R3, 0),
1745                         BPF_ALU32_IMM(BPF_MOV, R4, 0),
1746                         BPF_ALU32_IMM(BPF_MOV, R5, 0),
1747                         BPF_ALU32_IMM(BPF_MOV, R6, 0),
1748                         BPF_ALU32_IMM(BPF_MOV, R7, 0),
1749                         BPF_ALU32_IMM(BPF_MOV, R8, 0),
1750                         BPF_ALU32_IMM(BPF_MOV, R9, 0),
1751                         BPF_ALU64_REG(BPF_ADD, R0, R0),
1752                         BPF_ALU64_REG(BPF_ADD, R0, R1),
1753                         BPF_ALU64_REG(BPF_ADD, R0, R2),
1754                         BPF_ALU64_REG(BPF_ADD, R0, R3),
1755                         BPF_ALU64_REG(BPF_ADD, R0, R4),
1756                         BPF_ALU64_REG(BPF_ADD, R0, R5),
1757                         BPF_ALU64_REG(BPF_ADD, R0, R6),
1758                         BPF_ALU64_REG(BPF_ADD, R0, R7),
1759                         BPF_ALU64_REG(BPF_ADD, R0, R8),
1760                         BPF_ALU64_REG(BPF_ADD, R0, R9),
1761                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1762                         BPF_EXIT_INSN(),
1763                 },
1764                 INTERNAL,
1765                 { },
1766                 { { 0, 0xfefe } }
1767         },
1768         {       /* Mainly checking JIT here. */
1769                 "LD IMM64",
1770                 .u.insns_int = {
1771                         BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1772                         BPF_MOV64_REG(R1, R0),
1773                         BPF_MOV64_REG(R2, R1),
1774                         BPF_MOV64_REG(R3, R2),
1775                         BPF_MOV64_REG(R4, R3),
1776                         BPF_MOV64_REG(R5, R4),
1777                         BPF_MOV64_REG(R6, R5),
1778                         BPF_MOV64_REG(R7, R6),
1779                         BPF_MOV64_REG(R8, R7),
1780                         BPF_MOV64_REG(R9, R8),
1781                         BPF_LD_IMM64(R0, 0x0LL),
1782                         BPF_LD_IMM64(R1, 0x0LL),
1783                         BPF_LD_IMM64(R2, 0x0LL),
1784                         BPF_LD_IMM64(R3, 0x0LL),
1785                         BPF_LD_IMM64(R4, 0x0LL),
1786                         BPF_LD_IMM64(R5, 0x0LL),
1787                         BPF_LD_IMM64(R6, 0x0LL),
1788                         BPF_LD_IMM64(R7, 0x0LL),
1789                         BPF_LD_IMM64(R8, 0x0LL),
1790                         BPF_LD_IMM64(R9, 0x0LL),
1791                         BPF_ALU64_REG(BPF_ADD, R0, R0),
1792                         BPF_ALU64_REG(BPF_ADD, R0, R1),
1793                         BPF_ALU64_REG(BPF_ADD, R0, R2),
1794                         BPF_ALU64_REG(BPF_ADD, R0, R3),
1795                         BPF_ALU64_REG(BPF_ADD, R0, R4),
1796                         BPF_ALU64_REG(BPF_ADD, R0, R5),
1797                         BPF_ALU64_REG(BPF_ADD, R0, R6),
1798                         BPF_ALU64_REG(BPF_ADD, R0, R7),
1799                         BPF_ALU64_REG(BPF_ADD, R0, R8),
1800                         BPF_ALU64_REG(BPF_ADD, R0, R9),
1801                         BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1802                         BPF_EXIT_INSN(),
1803                 },
1804                 INTERNAL,
1805                 { },
1806                 { { 0, 0xfefe } }
1807         },
1808         {
1809                 "INT: ALU MIX",
1810                 .u.insns_int = {
1811                         BPF_ALU64_IMM(BPF_MOV, R0, 11),
1812                         BPF_ALU64_IMM(BPF_ADD, R0, -1),
1813                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
1814                         BPF_ALU64_IMM(BPF_XOR, R2, 3),
1815                         BPF_ALU64_REG(BPF_DIV, R0, R2),
1816                         BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1817                         BPF_EXIT_INSN(),
1818                         BPF_ALU64_IMM(BPF_MOD, R0, 3),
1819                         BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1820                         BPF_EXIT_INSN(),
1821                         BPF_ALU64_IMM(BPF_MOV, R0, -1),
1822                         BPF_EXIT_INSN(),
1823                 },
1824                 INTERNAL,
1825                 { },
1826                 { { 0, -1 } }
1827         },
1828         {
1829                 "INT: shifts by register",
1830                 .u.insns_int = {
1831                         BPF_MOV64_IMM(R0, -1234),
1832                         BPF_MOV64_IMM(R1, 1),
1833                         BPF_ALU32_REG(BPF_RSH, R0, R1),
1834                         BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1835                         BPF_EXIT_INSN(),
1836                         BPF_MOV64_IMM(R2, 1),
1837                         BPF_ALU64_REG(BPF_LSH, R0, R2),
1838                         BPF_MOV32_IMM(R4, -1234),
1839                         BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1840                         BPF_EXIT_INSN(),
1841                         BPF_ALU64_IMM(BPF_AND, R4, 63),
1842                         BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1843                         BPF_MOV64_IMM(R3, 47),
1844                         BPF_ALU64_REG(BPF_ARSH, R0, R3),
1845                         BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1846                         BPF_EXIT_INSN(),
1847                         BPF_MOV64_IMM(R2, 1),
1848                         BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1849                         BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1850                         BPF_EXIT_INSN(),
1851                         BPF_MOV64_IMM(R4, 4),
1852                         BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1853                         BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1854                         BPF_EXIT_INSN(),
1855                         BPF_MOV64_IMM(R4, 5),
1856                         BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1857                         BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1858                         BPF_EXIT_INSN(),
1859                         BPF_MOV64_IMM(R0, -1),
1860                         BPF_EXIT_INSN(),
1861                 },
1862                 INTERNAL,
1863                 { },
1864                 { { 0, -1 } }
1865         },
1866         {
1867                 "INT: DIV + ABS",
1868                 .u.insns_int = {
1869                         BPF_ALU64_REG(BPF_MOV, R6, R1),
1870                         BPF_LD_ABS(BPF_B, 3),
1871                         BPF_ALU64_IMM(BPF_MOV, R2, 2),
1872                         BPF_ALU32_REG(BPF_DIV, R0, R2),
1873                         BPF_ALU64_REG(BPF_MOV, R8, R0),
1874                         BPF_LD_ABS(BPF_B, 4),
1875                         BPF_ALU64_REG(BPF_ADD, R8, R0),
1876                         BPF_LD_IND(BPF_B, R8, -70),
1877                         BPF_EXIT_INSN(),
1878                 },
1879                 INTERNAL,
1880                 { 10, 20, 30, 40, 50 },
1881                 { { 4, 0 }, { 5, 10 } }
1882         },
1883         {
1884                 "INT: DIV by zero",
1885                 .u.insns_int = {
1886                         BPF_ALU64_REG(BPF_MOV, R6, R1),
1887                         BPF_ALU64_IMM(BPF_MOV, R7, 0),
1888                         BPF_LD_ABS(BPF_B, 3),
1889                         BPF_ALU32_REG(BPF_DIV, R0, R7),
1890                         BPF_EXIT_INSN(),
1891                 },
1892                 INTERNAL,
1893                 { 10, 20, 30, 40, 50 },
1894                 { { 3, 0 }, { 4, 0 } }
1895         },
1896         {
1897                 "check: missing ret",
1898                 .u.insns = {
1899                         BPF_STMT(BPF_LD | BPF_IMM, 1),
1900                 },
1901                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1902                 { },
1903                 { }
1904         },
1905         {
1906                 "check: div_k_0",
1907                 .u.insns = {
1908                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
1909                         BPF_STMT(BPF_RET | BPF_K, 0)
1910                 },
1911                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1912                 { },
1913                 { }
1914         },
1915         {
1916                 "check: unknown insn",
1917                 .u.insns = {
1918                         /* seccomp insn, rejected in socket filter */
1919                         BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
1920                         BPF_STMT(BPF_RET | BPF_K, 0)
1921                 },
1922                 CLASSIC | FLAG_EXPECTED_FAIL,
1923                 { },
1924                 { }
1925         },
1926         {
1927                 "check: out of range spill/fill",
1928                 .u.insns = {
1929                         BPF_STMT(BPF_STX, 16),
1930                         BPF_STMT(BPF_RET | BPF_K, 0)
1931                 },
1932                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1933                 { },
1934                 { }
1935         },
1936         {
1937                 "JUMPS + HOLES",
1938                 .u.insns = {
1939                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1940                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
1941                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1942                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1943                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1944                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1945                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1946                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1947                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1948                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1949                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1950                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1951                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1952                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1953                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1954                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
1955                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1956                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
1957                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1958                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1959                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1960                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1961                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1962                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1963                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1964                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1965                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1966                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1967                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1968                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1969                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1970                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1971                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1972                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1973                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
1974                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
1975                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1976                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1977                         BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1978                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1979                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1980                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1981                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1982                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1983                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1984                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1985                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1986                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1987                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1988                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1989                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1990                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1991                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
1992                         BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
1993                         BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1994                         BPF_STMT(BPF_RET | BPF_A, 0),
1995                         BPF_STMT(BPF_RET | BPF_A, 0),
1996                 },
1997                 CLASSIC,
1998                 { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
1999                   0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
2000                   0x08, 0x00,
2001                   0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
2002                   0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
2003                   0xc0, 0xa8, 0x33, 0x01,
2004                   0xc0, 0xa8, 0x33, 0x02,
2005                   0xbb, 0xb6,
2006                   0xa9, 0xfa,
2007                   0x00, 0x14, 0x00, 0x00,
2008                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2009                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2010                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2011                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2012                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2013                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2014                   0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2015                   0xcc, 0xcc, 0xcc, 0xcc },
2016                 { { 88, 0x001b } }
2017         },
2018         {
2019                 "check: RET X",
2020                 .u.insns = {
2021                         BPF_STMT(BPF_RET | BPF_X, 0),
2022                 },
2023                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2024                 { },
2025                 { },
2026         },
2027         {
2028                 "check: LDX + RET X",
2029                 .u.insns = {
2030                         BPF_STMT(BPF_LDX | BPF_IMM, 42),
2031                         BPF_STMT(BPF_RET | BPF_X, 0),
2032                 },
2033                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2034                 { },
2035                 { },
2036         },
2037         {       /* Mainly checking JIT here. */
2038                 "M[]: alt STX + LDX",
2039                 .u.insns = {
2040                         BPF_STMT(BPF_LDX | BPF_IMM, 100),
2041                         BPF_STMT(BPF_STX, 0),
2042                         BPF_STMT(BPF_LDX | BPF_MEM, 0),
2043                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2044                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2045                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2046                         BPF_STMT(BPF_STX, 1),
2047                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
2048                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2049                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2050                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2051                         BPF_STMT(BPF_STX, 2),
2052                         BPF_STMT(BPF_LDX | BPF_MEM, 2),
2053                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2054                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2055                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2056                         BPF_STMT(BPF_STX, 3),
2057                         BPF_STMT(BPF_LDX | BPF_MEM, 3),
2058                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2059                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2060                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2061                         BPF_STMT(BPF_STX, 4),
2062                         BPF_STMT(BPF_LDX | BPF_MEM, 4),
2063                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2064                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2065                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2066                         BPF_STMT(BPF_STX, 5),
2067                         BPF_STMT(BPF_LDX | BPF_MEM, 5),
2068                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2069                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2070                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2071                         BPF_STMT(BPF_STX, 6),
2072                         BPF_STMT(BPF_LDX | BPF_MEM, 6),
2073                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2074                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2075                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2076                         BPF_STMT(BPF_STX, 7),
2077                         BPF_STMT(BPF_LDX | BPF_MEM, 7),
2078                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2079                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2080                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2081                         BPF_STMT(BPF_STX, 8),
2082                         BPF_STMT(BPF_LDX | BPF_MEM, 8),
2083                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2084                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2085                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2086                         BPF_STMT(BPF_STX, 9),
2087                         BPF_STMT(BPF_LDX | BPF_MEM, 9),
2088                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2089                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2090                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2091                         BPF_STMT(BPF_STX, 10),
2092                         BPF_STMT(BPF_LDX | BPF_MEM, 10),
2093                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2094                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2095                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2096                         BPF_STMT(BPF_STX, 11),
2097                         BPF_STMT(BPF_LDX | BPF_MEM, 11),
2098                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2099                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2100                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2101                         BPF_STMT(BPF_STX, 12),
2102                         BPF_STMT(BPF_LDX | BPF_MEM, 12),
2103                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2104                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2105                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2106                         BPF_STMT(BPF_STX, 13),
2107                         BPF_STMT(BPF_LDX | BPF_MEM, 13),
2108                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2109                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2110                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2111                         BPF_STMT(BPF_STX, 14),
2112                         BPF_STMT(BPF_LDX | BPF_MEM, 14),
2113                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2114                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2115                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2116                         BPF_STMT(BPF_STX, 15),
2117                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
2118                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2119                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2120                         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2121                         BPF_STMT(BPF_RET | BPF_A, 0),
2122                 },
2123                 CLASSIC | FLAG_NO_DATA,
2124                 { },
2125                 { { 0, 116 } },
2126         },
2127         {       /* Mainly checking JIT here. */
2128                 "M[]: full STX + full LDX",
2129                 .u.insns = {
2130                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
2131                         BPF_STMT(BPF_STX, 0),
2132                         BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
2133                         BPF_STMT(BPF_STX, 1),
2134                         BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
2135                         BPF_STMT(BPF_STX, 2),
2136                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
2137                         BPF_STMT(BPF_STX, 3),
2138                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
2139                         BPF_STMT(BPF_STX, 4),
2140                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
2141                         BPF_STMT(BPF_STX, 5),
2142                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
2143                         BPF_STMT(BPF_STX, 6),
2144                         BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
2145                         BPF_STMT(BPF_STX, 7),
2146                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
2147                         BPF_STMT(BPF_STX, 8),
2148                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
2149                         BPF_STMT(BPF_STX, 9),
2150                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
2151                         BPF_STMT(BPF_STX, 10),
2152                         BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
2153                         BPF_STMT(BPF_STX, 11),
2154                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
2155                         BPF_STMT(BPF_STX, 12),
2156                         BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
2157                         BPF_STMT(BPF_STX, 13),
2158                         BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
2159                         BPF_STMT(BPF_STX, 14),
2160                         BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
2161                         BPF_STMT(BPF_STX, 15),
2162                         BPF_STMT(BPF_LDX | BPF_MEM, 0),
2163                         BPF_STMT(BPF_MISC | BPF_TXA, 0),
2164                         BPF_STMT(BPF_LDX | BPF_MEM, 1),
2165                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2166                         BPF_STMT(BPF_LDX | BPF_MEM, 2),
2167                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2168                         BPF_STMT(BPF_LDX | BPF_MEM, 3),
2169                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2170                         BPF_STMT(BPF_LDX | BPF_MEM, 4),
2171                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2172                         BPF_STMT(BPF_LDX | BPF_MEM, 5),
2173                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2174                         BPF_STMT(BPF_LDX | BPF_MEM, 6),
2175                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2176                         BPF_STMT(BPF_LDX | BPF_MEM, 7),
2177                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2178                         BPF_STMT(BPF_LDX | BPF_MEM, 8),
2179                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2180                         BPF_STMT(BPF_LDX | BPF_MEM, 9),
2181                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2182                         BPF_STMT(BPF_LDX | BPF_MEM, 10),
2183                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2184                         BPF_STMT(BPF_LDX | BPF_MEM, 11),
2185                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2186                         BPF_STMT(BPF_LDX | BPF_MEM, 12),
2187                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2188                         BPF_STMT(BPF_LDX | BPF_MEM, 13),
2189                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2190                         BPF_STMT(BPF_LDX | BPF_MEM, 14),
2191                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2192                         BPF_STMT(BPF_LDX | BPF_MEM, 15),
2193                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2194                         BPF_STMT(BPF_RET | BPF_A, 0),
2195                 },
2196                 CLASSIC | FLAG_NO_DATA,
2197                 { },
2198                 { { 0, 0x2a5a5e5 } },
2199         },
2200         {
2201                 "check: SKF_AD_MAX",
2202                 .u.insns = {
2203                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2204                                  SKF_AD_OFF + SKF_AD_MAX),
2205                         BPF_STMT(BPF_RET | BPF_A, 0),
2206                 },
2207                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2208                 { },
2209                 { },
2210         },
2211         {       /* Passes checker but fails during runtime. */
2212                 "LD [SKF_AD_OFF-1]",
2213                 .u.insns = {
2214                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2215                                  SKF_AD_OFF - 1),
2216                         BPF_STMT(BPF_RET | BPF_K, 1),
2217                 },
2218                 CLASSIC,
2219                 { },
2220                 { { 1, 0 } },
2221         },
2222         {
2223                 "load 64-bit immediate",
2224                 .u.insns_int = {
2225                         BPF_LD_IMM64(R1, 0x567800001234LL),
2226                         BPF_MOV64_REG(R2, R1),
2227                         BPF_MOV64_REG(R3, R2),
2228                         BPF_ALU64_IMM(BPF_RSH, R2, 32),
2229                         BPF_ALU64_IMM(BPF_LSH, R3, 32),
2230                         BPF_ALU64_IMM(BPF_RSH, R3, 32),
2231                         BPF_ALU64_IMM(BPF_MOV, R0, 0),
2232                         BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
2233                         BPF_EXIT_INSN(),
2234                         BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
2235                         BPF_EXIT_INSN(),
2236                         BPF_LD_IMM64(R0, 0x1ffffffffLL),
2237                         BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
2238                         BPF_EXIT_INSN(),
2239                 },
2240                 INTERNAL,
2241                 { },
2242                 { { 0, 1 } }
2243         },
2244         {
2245                 "nmap reduced",
2246                 .u.insns_int = {
2247                         BPF_MOV64_REG(R6, R1),
2248                         BPF_LD_ABS(BPF_H, 12),
2249                         BPF_JMP_IMM(BPF_JNE, R0, 0x806, 28),
2250                         BPF_LD_ABS(BPF_H, 12),
2251                         BPF_JMP_IMM(BPF_JNE, R0, 0x806, 26),
2252                         BPF_MOV32_IMM(R0, 18),
2253                         BPF_STX_MEM(BPF_W, R10, R0, -64),
2254                         BPF_LDX_MEM(BPF_W, R7, R10, -64),
2255                         BPF_LD_IND(BPF_W, R7, 14),
2256                         BPF_STX_MEM(BPF_W, R10, R0, -60),
2257                         BPF_MOV32_IMM(R0, 280971478),
2258                         BPF_STX_MEM(BPF_W, R10, R0, -56),
2259                         BPF_LDX_MEM(BPF_W, R7, R10, -56),
2260                         BPF_LDX_MEM(BPF_W, R0, R10, -60),
2261                         BPF_ALU32_REG(BPF_SUB, R0, R7),
2262                         BPF_JMP_IMM(BPF_JNE, R0, 0, 15),
2263                         BPF_LD_ABS(BPF_H, 12),
2264                         BPF_JMP_IMM(BPF_JNE, R0, 0x806, 13),
2265                         BPF_MOV32_IMM(R0, 22),
2266                         BPF_STX_MEM(BPF_W, R10, R0, -56),
2267                         BPF_LDX_MEM(BPF_W, R7, R10, -56),
2268                         BPF_LD_IND(BPF_H, R7, 14),
2269                         BPF_STX_MEM(BPF_W, R10, R0, -52),
2270                         BPF_MOV32_IMM(R0, 17366),
2271                         BPF_STX_MEM(BPF_W, R10, R0, -48),
2272                         BPF_LDX_MEM(BPF_W, R7, R10, -48),
2273                         BPF_LDX_MEM(BPF_W, R0, R10, -52),
2274                         BPF_ALU32_REG(BPF_SUB, R0, R7),
2275                         BPF_JMP_IMM(BPF_JNE, R0, 0, 2),
2276                         BPF_MOV32_IMM(R0, 256),
2277                         BPF_EXIT_INSN(),
2278                         BPF_MOV32_IMM(R0, 0),
2279                         BPF_EXIT_INSN(),
2280                 },
2281                 INTERNAL,
2282                 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 0,
2283                   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2284                   0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6},
2285                 { { 38, 256 } }
2286         },
2287         /* BPF_ALU | BPF_MOV | BPF_X */
2288         {
2289                 "ALU_MOV_X: dst = 2",
2290                 .u.insns_int = {
2291                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
2292                         BPF_ALU32_REG(BPF_MOV, R0, R1),
2293                         BPF_EXIT_INSN(),
2294                 },
2295                 INTERNAL,
2296                 { },
2297                 { { 0, 2 } },
2298         },
2299         {
2300                 "ALU_MOV_X: dst = 4294967295",
2301                 .u.insns_int = {
2302                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2303                         BPF_ALU32_REG(BPF_MOV, R0, R1),
2304                         BPF_EXIT_INSN(),
2305                 },
2306                 INTERNAL,
2307                 { },
2308                 { { 0, 4294967295U } },
2309         },
2310         {
2311                 "ALU64_MOV_X: dst = 2",
2312                 .u.insns_int = {
2313                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
2314                         BPF_ALU64_REG(BPF_MOV, R0, R1),
2315                         BPF_EXIT_INSN(),
2316                 },
2317                 INTERNAL,
2318                 { },
2319                 { { 0, 2 } },
2320         },
2321         {
2322                 "ALU64_MOV_X: dst = 4294967295",
2323                 .u.insns_int = {
2324                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2325                         BPF_ALU64_REG(BPF_MOV, R0, R1),
2326                         BPF_EXIT_INSN(),
2327                 },
2328                 INTERNAL,
2329                 { },
2330                 { { 0, 4294967295U } },
2331         },
2332         /* BPF_ALU | BPF_MOV | BPF_K */
2333         {
2334                 "ALU_MOV_K: dst = 2",
2335                 .u.insns_int = {
2336                         BPF_ALU32_IMM(BPF_MOV, R0, 2),
2337                         BPF_EXIT_INSN(),
2338                 },
2339                 INTERNAL,
2340                 { },
2341                 { { 0, 2 } },
2342         },
2343         {
2344                 "ALU_MOV_K: dst = 4294967295",
2345                 .u.insns_int = {
2346                         BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2347                         BPF_EXIT_INSN(),
2348                 },
2349                 INTERNAL,
2350                 { },
2351                 { { 0, 4294967295U } },
2352         },
2353         {
2354                 "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2355                 .u.insns_int = {
2356                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2357                         BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2358                         BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2359                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2360                         BPF_MOV32_IMM(R0, 2),
2361                         BPF_EXIT_INSN(),
2362                         BPF_MOV32_IMM(R0, 1),
2363                         BPF_EXIT_INSN(),
2364                 },
2365                 INTERNAL,
2366                 { },
2367                 { { 0, 0x1 } },
2368         },
2369         {
2370                 "ALU64_MOV_K: dst = 2",
2371                 .u.insns_int = {
2372                         BPF_ALU64_IMM(BPF_MOV, R0, 2),
2373                         BPF_EXIT_INSN(),
2374                 },
2375                 INTERNAL,
2376                 { },
2377                 { { 0, 2 } },
2378         },
2379         {
2380                 "ALU64_MOV_K: dst = 2147483647",
2381                 .u.insns_int = {
2382                         BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2383                         BPF_EXIT_INSN(),
2384                 },
2385                 INTERNAL,
2386                 { },
2387                 { { 0, 2147483647 } },
2388         },
2389         {
2390                 "ALU64_OR_K: dst = 0x0",
2391                 .u.insns_int = {
2392                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2393                         BPF_LD_IMM64(R3, 0x0),
2394                         BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
2395                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2396                         BPF_MOV32_IMM(R0, 2),
2397                         BPF_EXIT_INSN(),
2398                         BPF_MOV32_IMM(R0, 1),
2399                         BPF_EXIT_INSN(),
2400                 },
2401                 INTERNAL,
2402                 { },
2403                 { { 0, 0x1 } },
2404         },
2405         {
2406                 "ALU64_MOV_K: dst = -1",
2407                 .u.insns_int = {
2408                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2409                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2410                         BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2411                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2412                         BPF_MOV32_IMM(R0, 2),
2413                         BPF_EXIT_INSN(),
2414                         BPF_MOV32_IMM(R0, 1),
2415                         BPF_EXIT_INSN(),
2416                 },
2417                 INTERNAL,
2418                 { },
2419                 { { 0, 0x1 } },
2420         },
2421         /* BPF_ALU | BPF_ADD | BPF_X */
2422         {
2423                 "ALU_ADD_X: 1 + 2 = 3",
2424                 .u.insns_int = {
2425                         BPF_LD_IMM64(R0, 1),
2426                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
2427                         BPF_ALU32_REG(BPF_ADD, R0, R1),
2428                         BPF_EXIT_INSN(),
2429                 },
2430                 INTERNAL,
2431                 { },
2432                 { { 0, 3 } },
2433         },
2434         {
2435                 "ALU_ADD_X: 1 + 4294967294 = 4294967295",
2436                 .u.insns_int = {
2437                         BPF_LD_IMM64(R0, 1),
2438                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2439                         BPF_ALU32_REG(BPF_ADD, R0, R1),
2440                         BPF_EXIT_INSN(),
2441                 },
2442                 INTERNAL,
2443                 { },
2444                 { { 0, 4294967295U } },
2445         },
2446         {
2447                 "ALU64_ADD_X: 1 + 2 = 3",
2448                 .u.insns_int = {
2449                         BPF_LD_IMM64(R0, 1),
2450                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
2451                         BPF_ALU64_REG(BPF_ADD, R0, R1),
2452                         BPF_EXIT_INSN(),
2453                 },
2454                 INTERNAL,
2455                 { },
2456                 { { 0, 3 } },
2457         },
2458         {
2459                 "ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2460                 .u.insns_int = {
2461                         BPF_LD_IMM64(R0, 1),
2462                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2463                         BPF_ALU64_REG(BPF_ADD, R0, R1),
2464                         BPF_EXIT_INSN(),
2465                 },
2466                 INTERNAL,
2467                 { },
2468                 { { 0, 4294967295U } },
2469         },
2470         /* BPF_ALU | BPF_ADD | BPF_K */
2471         {
2472                 "ALU_ADD_K: 1 + 2 = 3",
2473                 .u.insns_int = {
2474                         BPF_LD_IMM64(R0, 1),
2475                         BPF_ALU32_IMM(BPF_ADD, R0, 2),
2476                         BPF_EXIT_INSN(),
2477                 },
2478                 INTERNAL,
2479                 { },
2480                 { { 0, 3 } },
2481         },
2482         {
2483                 "ALU_ADD_K: 3 + 0 = 3",
2484                 .u.insns_int = {
2485                         BPF_LD_IMM64(R0, 3),
2486                         BPF_ALU32_IMM(BPF_ADD, R0, 0),
2487                         BPF_EXIT_INSN(),
2488                 },
2489                 INTERNAL,
2490                 { },
2491                 { { 0, 3 } },
2492         },
2493         {
2494                 "ALU_ADD_K: 1 + 4294967294 = 4294967295",
2495                 .u.insns_int = {
2496                         BPF_LD_IMM64(R0, 1),
2497                         BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2498                         BPF_EXIT_INSN(),
2499                 },
2500                 INTERNAL,
2501                 { },
2502                 { { 0, 4294967295U } },
2503         },
2504         {
2505                 "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2506                 .u.insns_int = {
2507                         BPF_LD_IMM64(R2, 0x0),
2508                         BPF_LD_IMM64(R3, 0x00000000ffffffff),
2509                         BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2510                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2511                         BPF_MOV32_IMM(R0, 2),
2512                         BPF_EXIT_INSN(),
2513                         BPF_MOV32_IMM(R0, 1),
2514                         BPF_EXIT_INSN(),
2515                 },
2516                 INTERNAL,
2517                 { },
2518                 { { 0, 0x1 } },
2519         },
2520         {
2521                 "ALU64_ADD_K: 1 + 2 = 3",
2522                 .u.insns_int = {
2523                         BPF_LD_IMM64(R0, 1),
2524                         BPF_ALU64_IMM(BPF_ADD, R0, 2),
2525                         BPF_EXIT_INSN(),
2526                 },
2527                 INTERNAL,
2528                 { },
2529                 { { 0, 3 } },
2530         },
2531         {
2532                 "ALU64_ADD_K: 3 + 0 = 3",
2533                 .u.insns_int = {
2534                         BPF_LD_IMM64(R0, 3),
2535                         BPF_ALU64_IMM(BPF_ADD, R0, 0),
2536                         BPF_EXIT_INSN(),
2537                 },
2538                 INTERNAL,
2539                 { },
2540                 { { 0, 3 } },
2541         },
2542         {
2543                 "ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2544                 .u.insns_int = {
2545                         BPF_LD_IMM64(R0, 1),
2546                         BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2547                         BPF_EXIT_INSN(),
2548                 },
2549                 INTERNAL,
2550                 { },
2551                 { { 0, 2147483647 } },
2552         },
2553         {
2554                 "ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2555                 .u.insns_int = {
2556                         BPF_LD_IMM64(R0, 2147483646),
2557                         BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2558                         BPF_EXIT_INSN(),
2559                 },
2560                 INTERNAL,
2561                 { },
2562                 { { 0, -1 } },
2563         },
2564         {
2565                 "ALU64_ADD_K: 1 + 0 = 1",
2566                 .u.insns_int = {
2567                         BPF_LD_IMM64(R2, 0x1),
2568                         BPF_LD_IMM64(R3, 0x1),
2569                         BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2570                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2571                         BPF_MOV32_IMM(R0, 2),
2572                         BPF_EXIT_INSN(),
2573                         BPF_MOV32_IMM(R0, 1),
2574                         BPF_EXIT_INSN(),
2575                 },
2576                 INTERNAL,
2577                 { },
2578                 { { 0, 0x1 } },
2579         },
2580         {
2581                 "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2582                 .u.insns_int = {
2583                         BPF_LD_IMM64(R2, 0x0),
2584                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2585                         BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2586                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2587                         BPF_MOV32_IMM(R0, 2),
2588                         BPF_EXIT_INSN(),
2589                         BPF_MOV32_IMM(R0, 1),
2590                         BPF_EXIT_INSN(),
2591                 },
2592                 INTERNAL,
2593                 { },
2594                 { { 0, 0x1 } },
2595         },
2596         /* BPF_ALU | BPF_SUB | BPF_X */
2597         {
2598                 "ALU_SUB_X: 3 - 1 = 2",
2599                 .u.insns_int = {
2600                         BPF_LD_IMM64(R0, 3),
2601                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
2602                         BPF_ALU32_REG(BPF_SUB, R0, R1),
2603                         BPF_EXIT_INSN(),
2604                 },
2605                 INTERNAL,
2606                 { },
2607                 { { 0, 2 } },
2608         },
2609         {
2610                 "ALU_SUB_X: 4294967295 - 4294967294 = 1",
2611                 .u.insns_int = {
2612                         BPF_LD_IMM64(R0, 4294967295U),
2613                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2614                         BPF_ALU32_REG(BPF_SUB, R0, R1),
2615                         BPF_EXIT_INSN(),
2616                 },
2617                 INTERNAL,
2618                 { },
2619                 { { 0, 1 } },
2620         },
2621         {
2622                 "ALU64_SUB_X: 3 - 1 = 2",
2623                 .u.insns_int = {
2624                         BPF_LD_IMM64(R0, 3),
2625                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
2626                         BPF_ALU64_REG(BPF_SUB, R0, R1),
2627                         BPF_EXIT_INSN(),
2628                 },
2629                 INTERNAL,
2630                 { },
2631                 { { 0, 2 } },
2632         },
2633         {
2634                 "ALU64_SUB_X: 4294967295 - 4294967294 = 1",
2635                 .u.insns_int = {
2636                         BPF_LD_IMM64(R0, 4294967295U),
2637                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2638                         BPF_ALU64_REG(BPF_SUB, R0, R1),
2639                         BPF_EXIT_INSN(),
2640                 },
2641                 INTERNAL,
2642                 { },
2643                 { { 0, 1 } },
2644         },
2645         /* BPF_ALU | BPF_SUB | BPF_K */
2646         {
2647                 "ALU_SUB_K: 3 - 1 = 2",
2648                 .u.insns_int = {
2649                         BPF_LD_IMM64(R0, 3),
2650                         BPF_ALU32_IMM(BPF_SUB, R0, 1),
2651                         BPF_EXIT_INSN(),
2652                 },
2653                 INTERNAL,
2654                 { },
2655                 { { 0, 2 } },
2656         },
2657         {
2658                 "ALU_SUB_K: 3 - 0 = 3",
2659                 .u.insns_int = {
2660                         BPF_LD_IMM64(R0, 3),
2661                         BPF_ALU32_IMM(BPF_SUB, R0, 0),
2662                         BPF_EXIT_INSN(),
2663                 },
2664                 INTERNAL,
2665                 { },
2666                 { { 0, 3 } },
2667         },
2668         {
2669                 "ALU_SUB_K: 4294967295 - 4294967294 = 1",
2670                 .u.insns_int = {
2671                         BPF_LD_IMM64(R0, 4294967295U),
2672                         BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
2673                         BPF_EXIT_INSN(),
2674                 },
2675                 INTERNAL,
2676                 { },
2677                 { { 0, 1 } },
2678         },
2679         {
2680                 "ALU64_SUB_K: 3 - 1 = 2",
2681                 .u.insns_int = {
2682                         BPF_LD_IMM64(R0, 3),
2683                         BPF_ALU64_IMM(BPF_SUB, R0, 1),
2684                         BPF_EXIT_INSN(),
2685                 },
2686                 INTERNAL,
2687                 { },
2688                 { { 0, 2 } },
2689         },
2690         {
2691                 "ALU64_SUB_K: 3 - 0 = 3",
2692                 .u.insns_int = {
2693                         BPF_LD_IMM64(R0, 3),
2694                         BPF_ALU64_IMM(BPF_SUB, R0, 0),
2695                         BPF_EXIT_INSN(),
2696                 },
2697                 INTERNAL,
2698                 { },
2699                 { { 0, 3 } },
2700         },
2701         {
2702                 "ALU64_SUB_K: 4294967294 - 4294967295 = -1",
2703                 .u.insns_int = {
2704                         BPF_LD_IMM64(R0, 4294967294U),
2705                         BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
2706                         BPF_EXIT_INSN(),
2707                 },
2708                 INTERNAL,
2709                 { },
2710                 { { 0, -1 } },
2711         },
2712         {
2713                 "ALU64_ADD_K: 2147483646 - 2147483647 = -1",
2714                 .u.insns_int = {
2715                         BPF_LD_IMM64(R0, 2147483646),
2716                         BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
2717                         BPF_EXIT_INSN(),
2718                 },
2719                 INTERNAL,
2720                 { },
2721                 { { 0, -1 } },
2722         },
2723         /* BPF_ALU | BPF_MUL | BPF_X */
2724         {
2725                 "ALU_MUL_X: 2 * 3 = 6",
2726                 .u.insns_int = {
2727                         BPF_LD_IMM64(R0, 2),
2728                         BPF_ALU32_IMM(BPF_MOV, R1, 3),
2729                         BPF_ALU32_REG(BPF_MUL, R0, R1),
2730                         BPF_EXIT_INSN(),
2731                 },
2732                 INTERNAL,
2733                 { },
2734                 { { 0, 6 } },
2735         },
2736         {
2737                 "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2738                 .u.insns_int = {
2739                         BPF_LD_IMM64(R0, 2),
2740                         BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
2741                         BPF_ALU32_REG(BPF_MUL, R0, R1),
2742                         BPF_EXIT_INSN(),
2743                 },
2744                 INTERNAL,
2745                 { },
2746                 { { 0, 0xFFFFFFF0 } },
2747         },
2748         {
2749                 "ALU_MUL_X: -1 * -1 = 1",
2750                 .u.insns_int = {
2751                         BPF_LD_IMM64(R0, -1),
2752                         BPF_ALU32_IMM(BPF_MOV, R1, -1),
2753                         BPF_ALU32_REG(BPF_MUL, R0, R1),
2754                         BPF_EXIT_INSN(),
2755                 },
2756                 INTERNAL,
2757                 { },
2758                 { { 0, 1 } },
2759         },
2760         {
2761                 "ALU64_MUL_X: 2 * 3 = 6",
2762                 .u.insns_int = {
2763                         BPF_LD_IMM64(R0, 2),
2764                         BPF_ALU32_IMM(BPF_MOV, R1, 3),
2765                         BPF_ALU64_REG(BPF_MUL, R0, R1),
2766                         BPF_EXIT_INSN(),
2767                 },
2768                 INTERNAL,
2769                 { },
2770                 { { 0, 6 } },
2771         },
2772         {
2773                 "ALU64_MUL_X: 1 * 2147483647 = 2147483647",
2774                 .u.insns_int = {
2775                         BPF_LD_IMM64(R0, 1),
2776                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2777                         BPF_ALU64_REG(BPF_MUL, R0, R1),
2778                         BPF_EXIT_INSN(),
2779                 },
2780                 INTERNAL,
2781                 { },
2782                 { { 0, 2147483647 } },
2783         },
2784         /* BPF_ALU | BPF_MUL | BPF_K */
2785         {
2786                 "ALU_MUL_K: 2 * 3 = 6",
2787                 .u.insns_int = {
2788                         BPF_LD_IMM64(R0, 2),
2789                         BPF_ALU32_IMM(BPF_MUL, R0, 3),
2790                         BPF_EXIT_INSN(),
2791                 },
2792                 INTERNAL,
2793                 { },
2794                 { { 0, 6 } },
2795         },
2796         {
2797                 "ALU_MUL_K: 3 * 1 = 3",
2798                 .u.insns_int = {
2799                         BPF_LD_IMM64(R0, 3),
2800                         BPF_ALU32_IMM(BPF_MUL, R0, 1),
2801                         BPF_EXIT_INSN(),
2802                 },
2803                 INTERNAL,
2804                 { },
2805                 { { 0, 3 } },
2806         },
2807         {
2808                 "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2809                 .u.insns_int = {
2810                         BPF_LD_IMM64(R0, 2),
2811                         BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
2812                         BPF_EXIT_INSN(),
2813                 },
2814                 INTERNAL,
2815                 { },
2816                 { { 0, 0xFFFFFFF0 } },
2817         },
2818         {
2819                 "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
2820                 .u.insns_int = {
2821                         BPF_LD_IMM64(R2, 0x1),
2822                         BPF_LD_IMM64(R3, 0x00000000ffffffff),
2823                         BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
2824                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2825                         BPF_MOV32_IMM(R0, 2),
2826                         BPF_EXIT_INSN(),
2827                         BPF_MOV32_IMM(R0, 1),
2828                         BPF_EXIT_INSN(),
2829                 },
2830                 INTERNAL,
2831                 { },
2832                 { { 0, 0x1 } },
2833         },
2834         {
2835                 "ALU64_MUL_K: 2 * 3 = 6",
2836                 .u.insns_int = {
2837                         BPF_LD_IMM64(R0, 2),
2838                         BPF_ALU64_IMM(BPF_MUL, R0, 3),
2839                         BPF_EXIT_INSN(),
2840                 },
2841                 INTERNAL,
2842                 { },
2843                 { { 0, 6 } },
2844         },
2845         {
2846                 "ALU64_MUL_K: 3 * 1 = 3",
2847                 .u.insns_int = {
2848                         BPF_LD_IMM64(R0, 3),
2849                         BPF_ALU64_IMM(BPF_MUL, R0, 1),
2850                         BPF_EXIT_INSN(),
2851                 },
2852                 INTERNAL,
2853                 { },
2854                 { { 0, 3 } },
2855         },
2856         {
2857                 "ALU64_MUL_K: 1 * 2147483647 = 2147483647",
2858                 .u.insns_int = {
2859                         BPF_LD_IMM64(R0, 1),
2860                         BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
2861                         BPF_EXIT_INSN(),
2862                 },
2863                 INTERNAL,
2864                 { },
2865                 { { 0, 2147483647 } },
2866         },
2867         {
2868                 "ALU64_MUL_K: 1 * -2147483647 = -2147483647",
2869                 .u.insns_int = {
2870                         BPF_LD_IMM64(R0, 1),
2871                         BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
2872                         BPF_EXIT_INSN(),
2873                 },
2874                 INTERNAL,
2875                 { },
2876                 { { 0, -2147483647 } },
2877         },
2878         {
2879                 "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
2880                 .u.insns_int = {
2881                         BPF_LD_IMM64(R2, 0x1),
2882                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2883                         BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
2884                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2885                         BPF_MOV32_IMM(R0, 2),
2886                         BPF_EXIT_INSN(),
2887                         BPF_MOV32_IMM(R0, 1),
2888                         BPF_EXIT_INSN(),
2889                 },
2890                 INTERNAL,
2891                 { },
2892                 { { 0, 0x1 } },
2893         },
2894         /* BPF_ALU | BPF_DIV | BPF_X */
2895         {
2896                 "ALU_DIV_X: 6 / 2 = 3",
2897                 .u.insns_int = {
2898                         BPF_LD_IMM64(R0, 6),
2899                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
2900                         BPF_ALU32_REG(BPF_DIV, R0, R1),
2901                         BPF_EXIT_INSN(),
2902                 },
2903                 INTERNAL,
2904                 { },
2905                 { { 0, 3 } },
2906         },
2907         {
2908                 "ALU_DIV_X: 4294967295 / 4294967295 = 1",
2909                 .u.insns_int = {
2910                         BPF_LD_IMM64(R0, 4294967295U),
2911                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2912                         BPF_ALU32_REG(BPF_DIV, R0, R1),
2913                         BPF_EXIT_INSN(),
2914                 },
2915                 INTERNAL,
2916                 { },
2917                 { { 0, 1 } },
2918         },
2919         {
2920                 "ALU64_DIV_X: 6 / 2 = 3",
2921                 .u.insns_int = {
2922                         BPF_LD_IMM64(R0, 6),
2923                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
2924                         BPF_ALU64_REG(BPF_DIV, R0, R1),
2925                         BPF_EXIT_INSN(),
2926                 },
2927                 INTERNAL,
2928                 { },
2929                 { { 0, 3 } },
2930         },
2931         {
2932                 "ALU64_DIV_X: 2147483647 / 2147483647 = 1",
2933                 .u.insns_int = {
2934                         BPF_LD_IMM64(R0, 2147483647),
2935                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2936                         BPF_ALU64_REG(BPF_DIV, R0, R1),
2937                         BPF_EXIT_INSN(),
2938                 },
2939                 INTERNAL,
2940                 { },
2941                 { { 0, 1 } },
2942         },
2943         {
2944                 "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
2945                 .u.insns_int = {
2946                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2947                         BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
2948                         BPF_LD_IMM64(R3, 0x0000000000000001LL),
2949                         BPF_ALU64_REG(BPF_DIV, R2, R4),
2950                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2951                         BPF_MOV32_IMM(R0, 2),
2952                         BPF_EXIT_INSN(),
2953                         BPF_MOV32_IMM(R0, 1),
2954                         BPF_EXIT_INSN(),
2955                 },
2956                 INTERNAL,
2957                 { },
2958                 { { 0, 0x1 } },
2959         },
2960         /* BPF_ALU | BPF_DIV | BPF_K */
2961         {
2962                 "ALU_DIV_K: 6 / 2 = 3",
2963                 .u.insns_int = {
2964                         BPF_LD_IMM64(R0, 6),
2965                         BPF_ALU32_IMM(BPF_DIV, R0, 2),
2966                         BPF_EXIT_INSN(),
2967                 },
2968                 INTERNAL,
2969                 { },
2970                 { { 0, 3 } },
2971         },
2972         {
2973                 "ALU_DIV_K: 3 / 1 = 3",
2974                 .u.insns_int = {
2975                         BPF_LD_IMM64(R0, 3),
2976                         BPF_ALU32_IMM(BPF_DIV, R0, 1),
2977                         BPF_EXIT_INSN(),
2978                 },
2979                 INTERNAL,
2980                 { },
2981                 { { 0, 3 } },
2982         },
2983         {
2984                 "ALU_DIV_K: 4294967295 / 4294967295 = 1",
2985                 .u.insns_int = {
2986                         BPF_LD_IMM64(R0, 4294967295U),
2987                         BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
2988                         BPF_EXIT_INSN(),
2989                 },
2990                 INTERNAL,
2991                 { },
2992                 { { 0, 1 } },
2993         },
2994         {
2995                 "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
2996                 .u.insns_int = {
2997                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2998                         BPF_LD_IMM64(R3, 0x1UL),
2999                         BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
3000                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3001                         BPF_MOV32_IMM(R0, 2),
3002                         BPF_EXIT_INSN(),
3003                         BPF_MOV32_IMM(R0, 1),
3004                         BPF_EXIT_INSN(),
3005                 },
3006                 INTERNAL,
3007                 { },
3008                 { { 0, 0x1 } },
3009         },
3010         {
3011                 "ALU64_DIV_K: 6 / 2 = 3",
3012                 .u.insns_int = {
3013                         BPF_LD_IMM64(R0, 6),
3014                         BPF_ALU64_IMM(BPF_DIV, R0, 2),
3015                         BPF_EXIT_INSN(),
3016                 },
3017                 INTERNAL,
3018                 { },
3019                 { { 0, 3 } },
3020         },
3021         {
3022                 "ALU64_DIV_K: 3 / 1 = 3",
3023                 .u.insns_int = {
3024                         BPF_LD_IMM64(R0, 3),
3025                         BPF_ALU64_IMM(BPF_DIV, R0, 1),
3026                         BPF_EXIT_INSN(),
3027                 },
3028                 INTERNAL,
3029                 { },
3030                 { { 0, 3 } },
3031         },
3032         {
3033                 "ALU64_DIV_K: 2147483647 / 2147483647 = 1",
3034                 .u.insns_int = {
3035                         BPF_LD_IMM64(R0, 2147483647),
3036                         BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
3037                         BPF_EXIT_INSN(),
3038                 },
3039                 INTERNAL,
3040                 { },
3041                 { { 0, 1 } },
3042         },
3043         {
3044                 "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3045                 .u.insns_int = {
3046                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3047                         BPF_LD_IMM64(R3, 0x0000000000000001LL),
3048                         BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
3049                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3050                         BPF_MOV32_IMM(R0, 2),
3051                         BPF_EXIT_INSN(),
3052                         BPF_MOV32_IMM(R0, 1),
3053                         BPF_EXIT_INSN(),
3054                 },
3055                 INTERNAL,
3056                 { },
3057                 { { 0, 0x1 } },
3058         },
3059         /* BPF_ALU | BPF_MOD | BPF_X */
3060         {
3061                 "ALU_MOD_X: 3 % 2 = 1",
3062                 .u.insns_int = {
3063                         BPF_LD_IMM64(R0, 3),
3064                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
3065                         BPF_ALU32_REG(BPF_MOD, R0, R1),
3066                         BPF_EXIT_INSN(),
3067                 },
3068                 INTERNAL,
3069                 { },
3070                 { { 0, 1 } },
3071         },
3072         {
3073                 "ALU_MOD_X: 4294967295 % 4294967293 = 2",
3074                 .u.insns_int = {
3075                         BPF_LD_IMM64(R0, 4294967295U),
3076                         BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
3077                         BPF_ALU32_REG(BPF_MOD, R0, R1),
3078                         BPF_EXIT_INSN(),
3079                 },
3080                 INTERNAL,
3081                 { },
3082                 { { 0, 2 } },
3083         },
3084         {
3085                 "ALU64_MOD_X: 3 % 2 = 1",
3086                 .u.insns_int = {
3087                         BPF_LD_IMM64(R0, 3),
3088                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
3089                         BPF_ALU64_REG(BPF_MOD, R0, R1),
3090                         BPF_EXIT_INSN(),
3091                 },
3092                 INTERNAL,
3093                 { },
3094                 { { 0, 1 } },
3095         },
3096         {
3097                 "ALU64_MOD_X: 2147483647 % 2147483645 = 2",
3098                 .u.insns_int = {
3099                         BPF_LD_IMM64(R0, 2147483647),
3100                         BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
3101                         BPF_ALU64_REG(BPF_MOD, R0, R1),
3102                         BPF_EXIT_INSN(),
3103                 },
3104                 INTERNAL,
3105                 { },
3106                 { { 0, 2 } },
3107         },
3108         /* BPF_ALU | BPF_MOD | BPF_K */
3109         {
3110                 "ALU_MOD_K: 3 % 2 = 1",
3111                 .u.insns_int = {
3112                         BPF_LD_IMM64(R0, 3),
3113                         BPF_ALU32_IMM(BPF_MOD, R0, 2),
3114                         BPF_EXIT_INSN(),
3115                 },
3116                 INTERNAL,
3117                 { },
3118                 { { 0, 1 } },
3119         },
3120         {
3121                 "ALU_MOD_K: 3 % 1 = 0",
3122                 .u.insns_int = {
3123                         BPF_LD_IMM64(R0, 3),
3124                         BPF_ALU32_IMM(BPF_MOD, R0, 1),
3125                         BPF_EXIT_INSN(),
3126                 },
3127                 INTERNAL,
3128                 { },
3129                 { { 0, 0 } },
3130         },
3131         {
3132                 "ALU_MOD_K: 4294967295 % 4294967293 = 2",
3133                 .u.insns_int = {
3134                         BPF_LD_IMM64(R0, 4294967295U),
3135                         BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
3136                         BPF_EXIT_INSN(),
3137                 },
3138                 INTERNAL,
3139                 { },
3140                 { { 0, 2 } },
3141         },
3142         {
3143                 "ALU64_MOD_K: 3 % 2 = 1",
3144                 .u.insns_int = {
3145                         BPF_LD_IMM64(R0, 3),
3146                         BPF_ALU64_IMM(BPF_MOD, R0, 2),
3147                         BPF_EXIT_INSN(),
3148                 },
3149                 INTERNAL,
3150                 { },
3151                 { { 0, 1 } },
3152         },
3153         {
3154                 "ALU64_MOD_K: 3 % 1 = 0",
3155                 .u.insns_int = {
3156                         BPF_LD_IMM64(R0, 3),
3157                         BPF_ALU64_IMM(BPF_MOD, R0, 1),
3158                         BPF_EXIT_INSN(),
3159                 },
3160                 INTERNAL,
3161                 { },
3162                 { { 0, 0 } },
3163         },
3164         {
3165                 "ALU64_MOD_K: 2147483647 % 2147483645 = 2",
3166                 .u.insns_int = {
3167                         BPF_LD_IMM64(R0, 2147483647),
3168                         BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
3169                         BPF_EXIT_INSN(),
3170                 },
3171                 INTERNAL,
3172                 { },
3173                 { { 0, 2 } },
3174         },
3175         /* BPF_ALU | BPF_AND | BPF_X */
3176         {
3177                 "ALU_AND_X: 3 & 2 = 2",
3178                 .u.insns_int = {
3179                         BPF_LD_IMM64(R0, 3),
3180                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
3181                         BPF_ALU32_REG(BPF_AND, R0, R1),
3182                         BPF_EXIT_INSN(),
3183                 },
3184                 INTERNAL,
3185                 { },
3186                 { { 0, 2 } },
3187         },
3188         {
3189                 "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3190                 .u.insns_int = {
3191                         BPF_LD_IMM64(R0, 0xffffffff),
3192                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3193                         BPF_ALU32_REG(BPF_AND, R0, R1),
3194                         BPF_EXIT_INSN(),
3195                 },
3196                 INTERNAL,
3197                 { },
3198                 { { 0, 0xffffffff } },
3199         },
3200         {
3201                 "ALU64_AND_X: 3 & 2 = 2",
3202                 .u.insns_int = {
3203                         BPF_LD_IMM64(R0, 3),
3204                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
3205                         BPF_ALU64_REG(BPF_AND, R0, R1),
3206                         BPF_EXIT_INSN(),
3207                 },
3208                 INTERNAL,
3209                 { },
3210                 { { 0, 2 } },
3211         },
3212         {
3213                 "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3214                 .u.insns_int = {
3215                         BPF_LD_IMM64(R0, 0xffffffff),
3216                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3217                         BPF_ALU64_REG(BPF_AND, R0, R1),
3218                         BPF_EXIT_INSN(),
3219                 },
3220                 INTERNAL,
3221                 { },
3222                 { { 0, 0xffffffff } },
3223         },
3224         /* BPF_ALU | BPF_AND | BPF_K */
3225         {
3226                 "ALU_AND_K: 3 & 2 = 2",
3227                 .u.insns_int = {
3228                         BPF_LD_IMM64(R0, 3),
3229                         BPF_ALU32_IMM(BPF_AND, R0, 2),
3230                         BPF_EXIT_INSN(),
3231                 },
3232                 INTERNAL,
3233                 { },
3234                 { { 0, 2 } },
3235         },
3236         {
3237                 "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3238                 .u.insns_int = {
3239                         BPF_LD_IMM64(R0, 0xffffffff),
3240                         BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
3241                         BPF_EXIT_INSN(),
3242                 },
3243                 INTERNAL,
3244                 { },
3245                 { { 0, 0xffffffff } },
3246         },
3247         {
3248                 "ALU64_AND_K: 3 & 2 = 2",
3249                 .u.insns_int = {
3250                         BPF_LD_IMM64(R0, 3),
3251                         BPF_ALU64_IMM(BPF_AND, R0, 2),
3252                         BPF_EXIT_INSN(),
3253                 },
3254                 INTERNAL,
3255                 { },
3256                 { { 0, 2 } },
3257         },
3258         {
3259                 "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3260                 .u.insns_int = {
3261                         BPF_LD_IMM64(R0, 0xffffffff),
3262                         BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
3263                         BPF_EXIT_INSN(),
3264                 },
3265                 INTERNAL,
3266                 { },
3267                 { { 0, 0xffffffff } },
3268         },
3269         {
3270                 "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000ffff00000000",
3271                 .u.insns_int = {
3272                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3273                         BPF_LD_IMM64(R3, 0x0000000000000000LL),
3274                         BPF_ALU64_IMM(BPF_AND, R2, 0x0),
3275                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3276                         BPF_MOV32_IMM(R0, 2),
3277                         BPF_EXIT_INSN(),
3278                         BPF_MOV32_IMM(R0, 1),
3279                         BPF_EXIT_INSN(),
3280                 },
3281                 INTERNAL,
3282                 { },
3283                 { { 0, 0x1 } },
3284         },
3285         {
3286                 "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffffffff",
3287                 .u.insns_int = {
3288                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3289                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3290                         BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3291                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3292                         BPF_MOV32_IMM(R0, 2),
3293                         BPF_EXIT_INSN(),
3294                         BPF_MOV32_IMM(R0, 1),
3295                         BPF_EXIT_INSN(),
3296                 },
3297                 INTERNAL,
3298                 { },
3299                 { { 0, 0x1 } },
3300         },
3301         {
3302                 "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3303                 .u.insns_int = {
3304                         BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3305                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3306                         BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3307                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3308                         BPF_MOV32_IMM(R0, 2),
3309                         BPF_EXIT_INSN(),
3310                         BPF_MOV32_IMM(R0, 1),
3311                         BPF_EXIT_INSN(),
3312                 },
3313                 INTERNAL,
3314                 { },
3315                 { { 0, 0x1 } },
3316         },
3317         /* BPF_ALU | BPF_OR | BPF_X */
3318         {
3319                 "ALU_OR_X: 1 | 2 = 3",
3320                 .u.insns_int = {
3321                         BPF_LD_IMM64(R0, 1),
3322                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
3323                         BPF_ALU32_REG(BPF_OR, R0, R1),
3324                         BPF_EXIT_INSN(),
3325                 },
3326                 INTERNAL,
3327                 { },
3328                 { { 0, 3 } },
3329         },
3330         {
3331                 "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3332                 .u.insns_int = {
3333                         BPF_LD_IMM64(R0, 0),
3334                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3335                         BPF_ALU32_REG(BPF_OR, R0, R1),
3336                         BPF_EXIT_INSN(),
3337                 },
3338                 INTERNAL,
3339                 { },
3340                 { { 0, 0xffffffff } },
3341         },
3342         {
3343                 "ALU64_OR_X: 1 | 2 = 3",
3344                 .u.insns_int = {
3345                         BPF_LD_IMM64(R0, 1),
3346                         BPF_ALU32_IMM(BPF_MOV, R1, 2),
3347                         BPF_ALU64_REG(BPF_OR, R0, R1),
3348                         BPF_EXIT_INSN(),
3349                 },
3350                 INTERNAL,
3351                 { },
3352                 { { 0, 3 } },
3353         },
3354         {
3355                 "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3356                 .u.insns_int = {
3357                         BPF_LD_IMM64(R0, 0),
3358                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3359                         BPF_ALU64_REG(BPF_OR, R0, R1),
3360                         BPF_EXIT_INSN(),
3361                 },
3362                 INTERNAL,
3363                 { },
3364                 { { 0, 0xffffffff } },
3365         },
3366         /* BPF_ALU | BPF_OR | BPF_K */
3367         {
3368                 "ALU_OR_K: 1 | 2 = 3",
3369                 .u.insns_int = {
3370                         BPF_LD_IMM64(R0, 1),
3371                         BPF_ALU32_IMM(BPF_OR, R0, 2),
3372                         BPF_EXIT_INSN(),
3373                 },
3374                 INTERNAL,
3375                 { },
3376                 { { 0, 3 } },
3377         },
3378         {
3379                 "ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3380                 .u.insns_int = {
3381                         BPF_LD_IMM64(R0, 0),
3382                         BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3383                         BPF_EXIT_INSN(),
3384                 },
3385                 INTERNAL,
3386                 { },
3387                 { { 0, 0xffffffff } },
3388         },
3389         {
3390                 "ALU64_OR_K: 1 | 2 = 3",
3391                 .u.insns_int = {
3392                         BPF_LD_IMM64(R0, 1),
3393                         BPF_ALU64_IMM(BPF_OR, R0, 2),
3394                         BPF_EXIT_INSN(),
3395                 },
3396                 INTERNAL,
3397                 { },
3398                 { { 0, 3 } },
3399         },
3400         {
3401                 "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
3402                 .u.insns_int = {
3403                         BPF_LD_IMM64(R0, 0),
3404                         BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
3405                         BPF_EXIT_INSN(),
3406                 },
3407                 INTERNAL,
3408                 { },
3409                 { { 0, 0xffffffff } },
3410         },
3411         {
3412                 "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffff00000000",
3413                 .u.insns_int = {
3414                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3415                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3416                         BPF_ALU64_IMM(BPF_OR, R2, 0x0),
3417                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3418                         BPF_MOV32_IMM(R0, 2),
3419                         BPF_EXIT_INSN(),
3420                         BPF_MOV32_IMM(R0, 1),
3421                         BPF_EXIT_INSN(),
3422                 },
3423                 INTERNAL,
3424                 { },
3425                 { { 0, 0x1 } },
3426         },
3427         {
3428                 "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
3429                 .u.insns_int = {
3430                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3431                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3432                         BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3433                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3434                         BPF_MOV32_IMM(R0, 2),
3435                         BPF_EXIT_INSN(),
3436                         BPF_MOV32_IMM(R0, 1),
3437                         BPF_EXIT_INSN(),
3438                 },
3439                 INTERNAL,
3440                 { },
3441                 { { 0, 0x1 } },
3442         },
3443         {
3444                 "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
3445                 .u.insns_int = {
3446                         BPF_LD_IMM64(R2, 0x0000000000000000LL),
3447                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3448                         BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3449                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3450                         BPF_MOV32_IMM(R0, 2),
3451                         BPF_EXIT_INSN(),
3452                         BPF_MOV32_IMM(R0, 1),
3453                         BPF_EXIT_INSN(),
3454                 },
3455                 INTERNAL,
3456                 { },
3457                 { { 0, 0x1 } },
3458         },
3459         /* BPF_ALU | BPF_XOR | BPF_X */
3460         {
3461                 "ALU_XOR_X: 5 ^ 6 = 3",
3462                 .u.insns_int = {
3463                         BPF_LD_IMM64(R0, 5),
3464                         BPF_ALU32_IMM(BPF_MOV, R1, 6),
3465                         BPF_ALU32_REG(BPF_XOR, R0, R1),
3466                         BPF_EXIT_INSN(),
3467                 },
3468                 INTERNAL,
3469                 { },
3470                 { { 0, 3 } },
3471         },
3472         {
3473                 "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
3474                 .u.insns_int = {
3475                         BPF_LD_IMM64(R0, 1),
3476                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3477                         BPF_ALU32_REG(BPF_XOR, R0, R1),
3478                         BPF_EXIT_INSN(),
3479                 },
3480                 INTERNAL,
3481                 { },
3482                 { { 0, 0xfffffffe } },
3483         },
3484         {
3485                 "ALU64_XOR_X: 5 ^ 6 = 3",
3486                 .u.insns_int = {
3487                         BPF_LD_IMM64(R0, 5),
3488                         BPF_ALU32_IMM(BPF_MOV, R1, 6),
3489                         BPF_ALU64_REG(BPF_XOR, R0, R1),
3490                         BPF_EXIT_INSN(),
3491                 },
3492                 INTERNAL,
3493                 { },
3494                 { { 0, 3 } },
3495         },
3496         {
3497                 "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
3498                 .u.insns_int = {
3499                         BPF_LD_IMM64(R0, 1),
3500                         BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3501                         BPF_ALU64_REG(BPF_XOR, R0, R1),
3502                         BPF_EXIT_INSN(),
3503                 },
3504                 INTERNAL,
3505                 { },
3506                 { { 0, 0xfffffffe } },
3507         },
3508         /* BPF_ALU | BPF_XOR | BPF_K */
3509         {
3510                 "ALU_XOR_K: 5 ^ 6 = 3",
3511                 .u.insns_int = {
3512                         BPF_LD_IMM64(R0, 5),
3513                         BPF_ALU32_IMM(BPF_XOR, R0, 6),
3514                         BPF_EXIT_INSN(),
3515                 },
3516                 INTERNAL,
3517                 { },
3518                 { { 0, 3 } },
3519         },
3520         {
3521                 "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
3522                 .u.insns_int = {
3523                         BPF_LD_IMM64(R0, 1),
3524                         BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
3525                         BPF_EXIT_INSN(),
3526                 },
3527                 INTERNAL,
3528                 { },
3529                 { { 0, 0xfffffffe } },
3530         },
3531         {
3532                 "ALU64_XOR_K: 5 ^ 6 = 3",
3533                 .u.insns_int = {
3534                         BPF_LD_IMM64(R0, 5),
3535                         BPF_ALU64_IMM(BPF_XOR, R0, 6),
3536                         BPF_EXIT_INSN(),
3537                 },
3538                 INTERNAL,
3539                 { },
3540                 { { 0, 3 } },
3541         },
3542         {
3543                 "ALU64_XOR_K: 1 & 0xffffffff = 0xfffffffe",
3544                 .u.insns_int = {
3545                         BPF_LD_IMM64(R0, 1),
3546                         BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
3547                         BPF_EXIT_INSN(),
3548                 },
3549                 INTERNAL,
3550                 { },
3551                 { { 0, 0xfffffffe } },
3552         },
3553         {
3554                 "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
3555                 .u.insns_int = {
3556                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3557                         BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3558                         BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
3559                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3560                         BPF_MOV32_IMM(R0, 2),
3561                         BPF_EXIT_INSN(),
3562                         BPF_MOV32_IMM(R0, 1),
3563                         BPF_EXIT_INSN(),
3564                 },
3565                 INTERNAL,
3566                 { },
3567                 { { 0, 0x1 } },
3568         },
3569         {
3570                 "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
3571                 .u.insns_int = {
3572                         BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3573                         BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
3574                         BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3575                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3576                         BPF_MOV32_IMM(R0, 2),
3577                         BPF_EXIT_INSN(),
3578                         BPF_MOV32_IMM(R0, 1),
3579                         BPF_EXIT_INSN(),
3580                 },
3581                 INTERNAL,
3582                 { },
3583                 { { 0, 0x1 } },
3584         },
3585         {
3586                 "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
3587                 .u.insns_int = {
3588                         BPF_LD_IMM64(R2, 0x0000000000000000LL),
3589                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3590                         BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3591                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3592                         BPF_MOV32_IMM(R0, 2),
3593                         BPF_EXIT_INSN(),
3594                         BPF_MOV32_IMM(R0, 1),
3595                         BPF_EXIT_INSN(),
3596                 },
3597                 INTERNAL,
3598                 { },
3599                 { { 0, 0x1 } },
3600         },
3601         /* BPF_ALU | BPF_LSH | BPF_X */
3602         {
3603                 "ALU_LSH_X: 1 << 1 = 2",
3604                 .u.insns_int = {
3605                         BPF_LD_IMM64(R0, 1),
3606                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
3607                         BPF_ALU32_REG(BPF_LSH, R0, R1),
3608                         BPF_EXIT_INSN(),
3609                 },
3610                 INTERNAL,
3611                 { },
3612                 { { 0, 2 } },
3613         },
3614         {
3615                 "ALU_LSH_X: 1 << 31 = 0x80000000",
3616                 .u.insns_int = {
3617                         BPF_LD_IMM64(R0, 1),
3618                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
3619                         BPF_ALU32_REG(BPF_LSH, R0, R1),
3620                         BPF_EXIT_INSN(),
3621                 },
3622                 INTERNAL,
3623                 { },
3624                 { { 0, 0x80000000 } },
3625         },
3626         {
3627                 "ALU64_LSH_X: 1 << 1 = 2",
3628                 .u.insns_int = {
3629                         BPF_LD_IMM64(R0, 1),
3630                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
3631                         BPF_ALU64_REG(BPF_LSH, R0, R1),
3632                         BPF_EXIT_INSN(),
3633                 },
3634                 INTERNAL,
3635                 { },
3636                 { { 0, 2 } },
3637         },
3638         {
3639                 "ALU64_LSH_X: 1 << 31 = 0x80000000",
3640                 .u.insns_int = {
3641                         BPF_LD_IMM64(R0, 1),
3642                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
3643                         BPF_ALU64_REG(BPF_LSH, R0, R1),
3644                         BPF_EXIT_INSN(),
3645                 },
3646                 INTERNAL,
3647                 { },
3648                 { { 0, 0x80000000 } },
3649         },
3650         /* BPF_ALU | BPF_LSH | BPF_K */
3651         {
3652                 "ALU_LSH_K: 1 << 1 = 2",
3653                 .u.insns_int = {
3654                         BPF_LD_IMM64(R0, 1),
3655                         BPF_ALU32_IMM(BPF_LSH, R0, 1),
3656                         BPF_EXIT_INSN(),
3657                 },
3658                 INTERNAL,
3659                 { },
3660                 { { 0, 2 } },
3661         },
3662         {
3663                 "ALU_LSH_K: 1 << 31 = 0x80000000",
3664                 .u.insns_int = {
3665                         BPF_LD_IMM64(R0, 1),
3666                         BPF_ALU32_IMM(BPF_LSH, R0, 31),
3667                         BPF_EXIT_INSN(),
3668                 },
3669                 INTERNAL,
3670                 { },
3671                 { { 0, 0x80000000 } },
3672         },
3673         {
3674                 "ALU64_LSH_K: 1 << 1 = 2",
3675                 .u.insns_int = {
3676                         BPF_LD_IMM64(R0, 1),
3677                         BPF_ALU64_IMM(BPF_LSH, R0, 1),
3678                         BPF_EXIT_INSN(),
3679                 },
3680                 INTERNAL,
3681                 { },
3682                 { { 0, 2 } },
3683         },
3684         {
3685                 "ALU64_LSH_K: 1 << 31 = 0x80000000",
3686                 .u.insns_int = {
3687                         BPF_LD_IMM64(R0, 1),
3688                         BPF_ALU64_IMM(BPF_LSH, R0, 31),
3689                         BPF_EXIT_INSN(),
3690                 },
3691                 INTERNAL,
3692                 { },
3693                 { { 0, 0x80000000 } },
3694         },
3695         /* BPF_ALU | BPF_RSH | BPF_X */
3696         {
3697                 "ALU_RSH_X: 2 >> 1 = 1",
3698                 .u.insns_int = {
3699                         BPF_LD_IMM64(R0, 2),
3700                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
3701                         BPF_ALU32_REG(BPF_RSH, R0, R1),
3702                         BPF_EXIT_INSN(),
3703                 },
3704                 INTERNAL,
3705                 { },
3706                 { { 0, 1 } },
3707         },
3708         {
3709                 "ALU_RSH_X: 0x80000000 >> 31 = 1",
3710                 .u.insns_int = {
3711                         BPF_LD_IMM64(R0, 0x80000000),
3712                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
3713                         BPF_ALU32_REG(BPF_RSH, R0, R1),
3714                         BPF_EXIT_INSN(),
3715                 },
3716                 INTERNAL,
3717                 { },
3718                 { { 0, 1 } },
3719         },
3720         {
3721                 "ALU64_RSH_X: 2 >> 1 = 1",
3722                 .u.insns_int = {
3723                         BPF_LD_IMM64(R0, 2),
3724                         BPF_ALU32_IMM(BPF_MOV, R1, 1),
3725                         BPF_ALU64_REG(BPF_RSH, R0, R1),
3726                         BPF_EXIT_INSN(),
3727                 },
3728                 INTERNAL,
3729                 { },
3730                 { { 0, 1 } },
3731         },
3732         {
3733                 "ALU64_RSH_X: 0x80000000 >> 31 = 1",
3734                 .u.insns_int = {
3735                         BPF_LD_IMM64(R0, 0x80000000),
3736                         BPF_ALU32_IMM(BPF_MOV, R1, 31),
3737                         BPF_ALU64_REG(BPF_RSH, R0, R1),
3738                         BPF_EXIT_INSN(),
3739                 },
3740                 INTERNAL,
3741                 { },
3742                 { { 0, 1 } },
3743         },
3744         /* BPF_ALU | BPF_RSH | BPF_K */
3745         {
3746                 "ALU_RSH_K: 2 >> 1 = 1",
3747                 .u.insns_int = {
3748                         BPF_LD_IMM64(R0, 2),
3749                         BPF_ALU32_IMM(BPF_RSH, R0, 1),
3750                         BPF_EXIT_INSN(),
3751                 },
3752                 INTERNAL,
3753                 { },
3754                 { { 0, 1 } },
3755         },
3756         {
3757                 "ALU_RSH_K: 0x80000000 >> 31 = 1",
3758                 .u.insns_int = {
3759                         BPF_LD_IMM64(R0, 0x80000000),
3760                         BPF_ALU32_IMM(BPF_RSH, R0, 31),
3761                         BPF_EXIT_INSN(),
3762                 },
3763                 INTERNAL,
3764                 { },
3765                 { { 0, 1 } },
3766         },
3767         {
3768                 "ALU64_RSH_K: 2 >> 1 = 1",
3769                 .u.insns_int = {
3770                         BPF_LD_IMM64(R0, 2),
3771                         BPF_ALU64_IMM(BPF_RSH, R0, 1),
3772                         BPF_EXIT_INSN(),
3773                 },
3774                 INTERNAL,
3775                 { },
3776                 { { 0, 1 } },
3777         },
3778         {
3779                 "ALU64_RSH_K: 0x80000000 >> 31 = 1",
3780                 .u.insns_int = {
3781                         BPF_LD_IMM64(R0, 0x80000000),
3782                         BPF_ALU64_IMM(BPF_RSH, R0, 31),
3783                         BPF_EXIT_INSN(),
3784                 },
3785                 INTERNAL,
3786                 { },
3787                 { { 0, 1 } },
3788         },
3789         /* BPF_ALU | BPF_ARSH | BPF_X */
3790         {
3791                 "ALU_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3792                 .u.insns_int = {
3793                         BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3794                         BPF_ALU32_IMM(BPF_MOV, R1, 40),
3795                         BPF_ALU64_REG(BPF_ARSH, R0, R1),
3796                         BPF_EXIT_INSN(),
3797                 },
3798                 INTERNAL,
3799                 { },
3800                 { { 0, 0xffff00ff } },
3801         },
3802         /* BPF_ALU | BPF_ARSH | BPF_K */
3803         {
3804                 "ALU_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3805                 .u.insns_int = {
3806                         BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3807                         BPF_ALU64_IMM(BPF_ARSH, R0, 40),
3808                         BPF_EXIT_INSN(),
3809                 },
3810                 INTERNAL,
3811                 { },
3812                 { { 0, 0xffff00ff } },
3813         },
3814         /* BPF_ALU | BPF_NEG */
3815         {
3816                 "ALU_NEG: -(3) = -3",
3817                 .u.insns_int = {
3818                         BPF_ALU32_IMM(BPF_MOV, R0, 3),
3819                         BPF_ALU32_IMM(BPF_NEG, R0, 0),
3820                         BPF_EXIT_INSN(),
3821                 },
3822                 INTERNAL,
3823                 { },
3824                 { { 0, -3 } },
3825         },
3826         {
3827                 "ALU_NEG: -(-3) = 3",
3828                 .u.insns_int = {
3829                         BPF_ALU32_IMM(BPF_MOV, R0, -3),
3830                         BPF_ALU32_IMM(BPF_NEG, R0, 0),
3831                         BPF_EXIT_INSN(),
3832                 },
3833                 INTERNAL,
3834                 { },
3835                 { { 0, 3 } },
3836         },
3837         {
3838                 "ALU64_NEG: -(3) = -3",
3839                 .u.insns_int = {
3840                         BPF_LD_IMM64(R0, 3),
3841                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
3842                         BPF_EXIT_INSN(),
3843                 },
3844                 INTERNAL,
3845                 { },
3846                 { { 0, -3 } },
3847         },
3848         {
3849                 "ALU64_NEG: -(-3) = 3",
3850                 .u.insns_int = {
3851                         BPF_LD_IMM64(R0, -3),
3852                         BPF_ALU64_IMM(BPF_NEG, R0, 0),
3853                         BPF_EXIT_INSN(),
3854                 },
3855                 INTERNAL,
3856                 { },
3857                 { { 0, 3 } },
3858         },
3859         /* BPF_ALU | BPF_END | BPF_FROM_BE */
3860         {
3861                 "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
3862                 .u.insns_int = {
3863                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3864                         BPF_ENDIAN(BPF_FROM_BE, R0, 16),
3865                         BPF_EXIT_INSN(),
3866                 },
3867                 INTERNAL,
3868                 { },
3869                 { { 0,  cpu_to_be16(0xcdef) } },
3870         },
3871         {
3872                 "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
3873                 .u.insns_int = {
3874                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3875                         BPF_ENDIAN(BPF_FROM_BE, R0, 32),
3876                         BPF_ALU64_REG(BPF_MOV, R1, R0),
3877                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
3878                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
3879                         BPF_EXIT_INSN(),
3880                 },
3881                 INTERNAL,
3882                 { },
3883                 { { 0, cpu_to_be32(0x89abcdef) } },
3884         },
3885         {
3886                 "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
3887                 .u.insns_int = {
3888                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3889                         BPF_ENDIAN(BPF_FROM_BE, R0, 64),
3890                         BPF_EXIT_INSN(),
3891                 },
3892                 INTERNAL,
3893                 { },
3894                 { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
3895         },
3896         /* BPF_ALU | BPF_END | BPF_FROM_LE */
3897         {
3898                 "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
3899                 .u.insns_int = {
3900                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3901                         BPF_ENDIAN(BPF_FROM_LE, R0, 16),
3902                         BPF_EXIT_INSN(),
3903                 },
3904                 INTERNAL,
3905                 { },
3906                 { { 0, cpu_to_le16(0xcdef) } },
3907         },
3908         {
3909                 "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
3910                 .u.insns_int = {
3911                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3912                         BPF_ENDIAN(BPF_FROM_LE, R0, 32),
3913                         BPF_ALU64_REG(BPF_MOV, R1, R0),
3914                         BPF_ALU64_IMM(BPF_RSH, R1, 32),
3915                         BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
3916                         BPF_EXIT_INSN(),
3917                 },
3918                 INTERNAL,
3919                 { },
3920                 { { 0, cpu_to_le32(0x89abcdef) } },
3921         },
3922         {
3923                 "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
3924                 .u.insns_int = {
3925                         BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3926                         BPF_ENDIAN(BPF_FROM_LE, R0, 64),
3927                         BPF_EXIT_INSN(),
3928                 },
3929                 INTERNAL,
3930                 { },
3931                 { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
3932         },
3933         /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
3934         {
3935                 "ST_MEM_B: Store/Load byte: max negative",
3936                 .u.insns_int = {
3937                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3938                         BPF_ST_MEM(BPF_B, R10, -40, 0xff),
3939                         BPF_LDX_MEM(BPF_B, R0, R10, -40),
3940                         BPF_EXIT_INSN(),
3941                 },
3942                 INTERNAL,
3943                 { },
3944                 { { 0, 0xff } },
3945         },
3946         {
3947                 "ST_MEM_B: Store/Load byte: max positive",
3948                 .u.insns_int = {
3949                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3950                         BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
3951                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
3952                         BPF_EXIT_INSN(),
3953                 },
3954                 INTERNAL,
3955                 { },
3956                 { { 0, 0x7f } },
3957         },
3958         {
3959                 "STX_MEM_B: Store/Load byte: max negative",
3960                 .u.insns_int = {
3961                         BPF_LD_IMM64(R0, 0),
3962                         BPF_LD_IMM64(R1, 0xffLL),
3963                         BPF_STX_MEM(BPF_B, R10, R1, -40),
3964                         BPF_LDX_MEM(BPF_B, R0, R10, -40),
3965                         BPF_EXIT_INSN(),
3966                 },
3967                 INTERNAL,
3968                 { },
3969                 { { 0, 0xff } },
3970         },
3971         {
3972                 "ST_MEM_H: Store/Load half word: max negative",
3973                 .u.insns_int = {
3974                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3975                         BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
3976                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
3977                         BPF_EXIT_INSN(),
3978                 },
3979                 INTERNAL,
3980                 { },
3981                 { { 0, 0xffff } },
3982         },
3983         {
3984                 "ST_MEM_H: Store/Load half word: max positive",
3985                 .u.insns_int = {
3986                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
3987                         BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
3988                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
3989                         BPF_EXIT_INSN(),
3990                 },
3991                 INTERNAL,
3992                 { },
3993                 { { 0, 0x7fff } },
3994         },
3995         {
3996                 "STX_MEM_H: Store/Load half word: max negative",
3997                 .u.insns_int = {
3998                         BPF_LD_IMM64(R0, 0),
3999                         BPF_LD_IMM64(R1, 0xffffLL),
4000                         BPF_STX_MEM(BPF_H, R10, R1, -40),
4001                         BPF_LDX_MEM(BPF_H, R0, R10, -40),
4002                         BPF_EXIT_INSN(),
4003                 },
4004                 INTERNAL,
4005                 { },
4006                 { { 0, 0xffff } },
4007         },
4008         {
4009                 "ST_MEM_W: Store/Load word: max negative",
4010                 .u.insns_int = {
4011                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4012                         BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
4013                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
4014                         BPF_EXIT_INSN(),
4015                 },
4016                 INTERNAL,
4017                 { },
4018                 { { 0, 0xffffffff } },
4019         },
4020         {
4021                 "ST_MEM_W: Store/Load word: max positive",
4022                 .u.insns_int = {
4023                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4024                         BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
4025                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
4026                         BPF_EXIT_INSN(),
4027                 },
4028                 INTERNAL,
4029                 { },
4030                 { { 0, 0x7fffffff } },
4031         },
4032         {
4033                 "STX_MEM_W: Store/Load word: max negative",
4034                 .u.insns_int = {
4035                         BPF_LD_IMM64(R0, 0),
4036                         BPF_LD_IMM64(R1, 0xffffffffLL),
4037                         BPF_STX_MEM(BPF_W, R10, R1, -40),
4038                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
4039                         BPF_EXIT_INSN(),
4040                 },
4041                 INTERNAL,
4042                 { },
4043                 { { 0, 0xffffffff } },
4044         },
4045         {
4046                 "ST_MEM_DW: Store/Load double word: max negative",
4047                 .u.insns_int = {
4048                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4049                         BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4050                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4051                         BPF_EXIT_INSN(),
4052                 },
4053                 INTERNAL,
4054                 { },
4055                 { { 0, 0xffffffff } },
4056         },
4057         {
4058                 "ST_MEM_DW: Store/Load double word: max negative 2",
4059                 .u.insns_int = {
4060                         BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
4061                         BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4062                         BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4063                         BPF_LDX_MEM(BPF_DW, R2, R10, -40),
4064                         BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4065                         BPF_MOV32_IMM(R0, 2),
4066                         BPF_EXIT_INSN(),
4067                         BPF_MOV32_IMM(R0, 1),
4068                         BPF_EXIT_INSN(),
4069                 },
4070                 INTERNAL,
4071                 { },
4072                 { { 0, 0x1 } },
4073         },
4074         {
4075                 "ST_MEM_DW: Store/Load double word: max positive",
4076                 .u.insns_int = {
4077                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4078                         BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
4079                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4080                         BPF_EXIT_INSN(),
4081                 },
4082                 INTERNAL,
4083                 { },
4084                 { { 0, 0x7fffffff } },
4085         },
4086         {
4087                 "STX_MEM_DW: Store/Load double word: max negative",
4088                 .u.insns_int = {
4089                         BPF_LD_IMM64(R0, 0),
4090                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4091                         BPF_STX_MEM(BPF_W, R10, R1, -40),
4092                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
4093                         BPF_EXIT_INSN(),
4094                 },
4095                 INTERNAL,
4096                 { },
4097                 { { 0, 0xffffffff } },
4098         },
4099         /* BPF_STX | BPF_XADD | BPF_W/DW */
4100         {
4101                 "STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
4102                 .u.insns_int = {
4103                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4104                         BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4105                         BPF_STX_XADD(BPF_W, R10, R0, -40),
4106                         BPF_LDX_MEM(BPF_W, R0, R10, -40),
4107                         BPF_EXIT_INSN(),
4108                 },
4109                 INTERNAL,
4110                 { },
4111                 { { 0, 0x22 } },
4112         },
4113         {
4114                 "STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
4115                 .u.insns_int = {
4116                         BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4117                         BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4118                         BPF_STX_XADD(BPF_DW, R10, R0, -40),
4119                         BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4120                         BPF_EXIT_INSN(),
4121                 },
4122                 INTERNAL,
4123                 { },
4124                 { { 0, 0x22 } },
4125         },
4126         /* BPF_JMP | BPF_EXIT */
4127         {
4128                 "JMP_EXIT",
4129                 .u.insns_int = {
4130                         BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
4131                         BPF_EXIT_INSN(),
4132                         BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
4133                 },
4134                 INTERNAL,
4135                 { },
4136                 { { 0, 0x4711 } },
4137         },
4138         /* BPF_JMP | BPF_JA */
4139         {
4140                 "JMP_JA: Unconditional jump: if (true) return 1",
4141                 .u.insns_int = {
4142                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4143                         BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4144                         BPF_EXIT_INSN(),
4145                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4146                         BPF_EXIT_INSN(),
4147                 },
4148                 INTERNAL,
4149                 { },
4150                 { { 0, 1 } },
4151         },
4152         /* BPF_JMP | BPF_JSGT | BPF_K */
4153         {
4154                 "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
4155                 .u.insns_int = {
4156                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4157                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4158                         BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
4159                         BPF_EXIT_INSN(),
4160                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4161                         BPF_EXIT_INSN(),
4162                 },
4163                 INTERNAL,
4164                 { },
4165                 { { 0, 1 } },
4166         },
4167         {
4168                 "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
4169                 .u.insns_int = {
4170                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4171                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4172                         BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
4173                         BPF_EXIT_INSN(),
4174                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4175                         BPF_EXIT_INSN(),
4176                 },
4177                 INTERNAL,
4178                 { },
4179                 { { 0, 1 } },
4180         },
4181         /* BPF_JMP | BPF_JSGE | BPF_K */
4182         {
4183                 "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
4184                 .u.insns_int = {
4185                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4186                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4187                         BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
4188                         BPF_EXIT_INSN(),
4189                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4190                         BPF_EXIT_INSN(),
4191                 },
4192                 INTERNAL,
4193                 { },
4194                 { { 0, 1 } },
4195         },
4196         {
4197                 "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
4198                 .u.insns_int = {
4199                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4200                         BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4201                         BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
4202                         BPF_EXIT_INSN(),
4203                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4204                         BPF_EXIT_INSN(),
4205                 },
4206                 INTERNAL,
4207                 { },
4208                 { { 0, 1 } },
4209         },
4210         /* BPF_JMP | BPF_JGT | BPF_K */
4211         {
4212                 "JMP_JGT_K: if (3 > 2) return 1",
4213                 .u.insns_int = {
4214                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4215                         BPF_LD_IMM64(R1, 3),
4216                         BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
4217                         BPF_EXIT_INSN(),
4218                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4219                         BPF_EXIT_INSN(),
4220                 },
4221                 INTERNAL,
4222                 { },
4223                 { { 0, 1 } },
4224         },
4225         /* BPF_JMP | BPF_JGE | BPF_K */
4226         {
4227                 "JMP_JGE_K: if (3 >= 2) return 1",
4228                 .u.insns_int = {
4229                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4230                         BPF_LD_IMM64(R1, 3),
4231                         BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
4232                         BPF_EXIT_INSN(),
4233                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4234                         BPF_EXIT_INSN(),
4235                 },
4236                 INTERNAL,
4237                 { },
4238                 { { 0, 1 } },
4239         },
4240         /* BPF_JMP | BPF_JGT | BPF_K jump backwards */
4241         {
4242                 "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
4243                 .u.insns_int = {
4244                         BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4245                         BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4246                         BPF_EXIT_INSN(),
4247                         BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4248                         BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
4249                         BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
4250                         BPF_EXIT_INSN(),
4251                 },
4252                 INTERNAL,
4253                 { },
4254                 { { 0, 1 } },
4255         },
4256         {
4257                 "JMP_JGE_K: if (3 >= 3) return 1",
4258                 .u.insns_int = {
4259                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4260                         BPF_LD_IMM64(R1, 3),
4261                         BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
4262                         BPF_EXIT_INSN(),
4263                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4264                         BPF_EXIT_INSN(),
4265                 },
4266                 INTERNAL,
4267                 { },
4268                 { { 0, 1 } },
4269         },
4270         /* BPF_JMP | BPF_JNE | BPF_K */
4271         {
4272                 "JMP_JNE_K: if (3 != 2) return 1",
4273                 .u.insns_int = {
4274                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4275                         BPF_LD_IMM64(R1, 3),
4276                         BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4277                         BPF_EXIT_INSN(),
4278                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4279                         BPF_EXIT_INSN(),
4280                 },
4281                 INTERNAL,
4282                 { },
4283                 { { 0, 1 } },
4284         },
4285         /* BPF_JMP | BPF_JEQ | BPF_K */
4286         {
4287                 "JMP_JEQ_K: if (3 == 3) return 1",
4288                 .u.insns_int = {
4289                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4290                         BPF_LD_IMM64(R1, 3),
4291                         BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
4292                         BPF_EXIT_INSN(),
4293                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4294                         BPF_EXIT_INSN(),
4295                 },
4296                 INTERNAL,
4297                 { },
4298                 { { 0, 1 } },
4299         },
4300         /* BPF_JMP | BPF_JSET | BPF_K */
4301         {
4302                 "JMP_JSET_K: if (0x3 & 0x2) return 1",
4303                 .u.insns_int = {
4304                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4305                         BPF_LD_IMM64(R1, 3),
4306                         BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4307                         BPF_EXIT_INSN(),
4308                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4309                         BPF_EXIT_INSN(),
4310                 },
4311                 INTERNAL,
4312                 { },
4313                 { { 0, 1 } },
4314         },
4315         {
4316                 "JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
4317                 .u.insns_int = {
4318                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4319                         BPF_LD_IMM64(R1, 3),
4320                         BPF_JMP_IMM(BPF_JNE, R1, 0xffffffff, 1),
4321                         BPF_EXIT_INSN(),
4322                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4323                         BPF_EXIT_INSN(),
4324                 },
4325                 INTERNAL,
4326                 { },
4327                 { { 0, 1 } },
4328         },
4329         /* BPF_JMP | BPF_JSGT | BPF_X */
4330         {
4331                 "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
4332                 .u.insns_int = {
4333                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4334                         BPF_LD_IMM64(R1, -1),
4335                         BPF_LD_IMM64(R2, -2),
4336                         BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4337                         BPF_EXIT_INSN(),
4338                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4339                         BPF_EXIT_INSN(),
4340                 },
4341                 INTERNAL,
4342                 { },
4343                 { { 0, 1 } },
4344         },
4345         {
4346                 "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
4347                 .u.insns_int = {
4348                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4349                         BPF_LD_IMM64(R1, -1),
4350                         BPF_LD_IMM64(R2, -1),
4351                         BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4352                         BPF_EXIT_INSN(),
4353                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4354                         BPF_EXIT_INSN(),
4355                 },
4356                 INTERNAL,
4357                 { },
4358                 { { 0, 1 } },
4359         },
4360         /* BPF_JMP | BPF_JSGE | BPF_X */
4361         {
4362                 "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
4363                 .u.insns_int = {
4364                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4365                         BPF_LD_IMM64(R1, -1),
4366                         BPF_LD_IMM64(R2, -2),
4367                         BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4368                         BPF_EXIT_INSN(),
4369                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4370                         BPF_EXIT_INSN(),
4371                 },
4372                 INTERNAL,
4373                 { },
4374                 { { 0, 1 } },
4375         },
4376         {
4377                 "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
4378                 .u.insns_int = {
4379                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4380                         BPF_LD_IMM64(R1, -1),
4381                         BPF_LD_IMM64(R2, -1),
4382                         BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4383                         BPF_EXIT_INSN(),
4384                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4385                         BPF_EXIT_INSN(),
4386                 },
4387                 INTERNAL,
4388                 { },
4389                 { { 0, 1 } },
4390         },
4391         /* BPF_JMP | BPF_JGT | BPF_X */
4392         {
4393                 "JMP_JGT_X: if (3 > 2) return 1",
4394                 .u.insns_int = {
4395                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4396                         BPF_LD_IMM64(R1, 3),
4397                         BPF_LD_IMM64(R2, 2),
4398                         BPF_JMP_REG(BPF_JGT, R1, R2, 1),
4399                         BPF_EXIT_INSN(),
4400                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4401                         BPF_EXIT_INSN(),
4402                 },
4403                 INTERNAL,
4404                 { },
4405                 { { 0, 1 } },
4406         },
4407         /* BPF_JMP | BPF_JGE | BPF_X */
4408         {
4409                 "JMP_JGE_X: if (3 >= 2) return 1",
4410                 .u.insns_int = {
4411                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4412                         BPF_LD_IMM64(R1, 3),
4413                         BPF_LD_IMM64(R2, 2),
4414                         BPF_JMP_REG(BPF_JGE, R1, R2, 1),
4415                         BPF_EXIT_INSN(),
4416                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4417                         BPF_EXIT_INSN(),
4418                 },
4419                 INTERNAL,
4420                 { },
4421                 { { 0, 1 } },
4422         },
4423         {
4424                 "JMP_JGE_X: if (3 >= 3) return 1",
4425                 .u.insns_int = {
4426                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4427                         BPF_LD_IMM64(R1, 3),
4428                         BPF_LD_IMM64(R2, 3),
4429                         BPF_JMP_REG(BPF_JGE, R1, R2, 1),
4430                         BPF_EXIT_INSN(),
4431                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4432                         BPF_EXIT_INSN(),
4433                 },
4434                 INTERNAL,
4435                 { },
4436                 { { 0, 1 } },
4437         },
4438         /* BPF_JMP | BPF_JNE | BPF_X */
4439         {
4440                 "JMP_JNE_X: if (3 != 2) return 1",
4441                 .u.insns_int = {
4442                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4443                         BPF_LD_IMM64(R1, 3),
4444                         BPF_LD_IMM64(R2, 2),
4445                         BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4446                         BPF_EXIT_INSN(),
4447                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4448                         BPF_EXIT_INSN(),
4449                 },
4450                 INTERNAL,
4451                 { },
4452                 { { 0, 1 } },
4453         },
4454         /* BPF_JMP | BPF_JEQ | BPF_X */
4455         {
4456                 "JMP_JEQ_X: if (3 == 3) return 1",
4457                 .u.insns_int = {
4458                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4459                         BPF_LD_IMM64(R1, 3),
4460                         BPF_LD_IMM64(R2, 3),
4461                         BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
4462                         BPF_EXIT_INSN(),
4463                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4464                         BPF_EXIT_INSN(),
4465                 },
4466                 INTERNAL,
4467                 { },
4468                 { { 0, 1 } },
4469         },
4470         /* BPF_JMP | BPF_JSET | BPF_X */
4471         {
4472                 "JMP_JSET_X: if (0x3 & 0x2) return 1",
4473                 .u.insns_int = {
4474                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4475                         BPF_LD_IMM64(R1, 3),
4476                         BPF_LD_IMM64(R2, 2),
4477                         BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4478                         BPF_EXIT_INSN(),
4479                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4480                         BPF_EXIT_INSN(),
4481                 },
4482                 INTERNAL,
4483                 { },
4484                 { { 0, 1 } },
4485         },
4486         {
4487                 "JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
4488                 .u.insns_int = {
4489                         BPF_ALU32_IMM(BPF_MOV, R0, 0),
4490                         BPF_LD_IMM64(R1, 3),
4491                         BPF_LD_IMM64(R2, 0xffffffff),
4492                         BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4493                         BPF_EXIT_INSN(),
4494                         BPF_ALU32_IMM(BPF_MOV, R0, 1),
4495                         BPF_EXIT_INSN(),
4496                 },
4497                 INTERNAL,
4498                 { },
4499                 { { 0, 1 } },
4500         },
4501         {
4502                 "JMP_JA: Jump, gap, jump, ...",
4503                 { },
4504                 CLASSIC | FLAG_NO_DATA,
4505                 { },
4506                 { { 0, 0xababcbac } },
4507                 .fill_helper = bpf_fill_ja,
4508         },
4509         {       /* Mainly checking JIT here. */
4510                 "BPF_MAXINSNS: Maximum possible literals",
4511                 { },
4512                 CLASSIC | FLAG_NO_DATA,
4513                 { },
4514                 { { 0, 0xffffffff } },
4515                 .fill_helper = bpf_fill_maxinsns1,
4516         },
4517         {       /* Mainly checking JIT here. */
4518                 "BPF_MAXINSNS: Single literal",
4519                 { },
4520                 CLASSIC | FLAG_NO_DATA,
4521                 { },
4522                 { { 0, 0xfefefefe } },
4523                 .fill_helper = bpf_fill_maxinsns2,
4524         },
4525         {       /* Mainly checking JIT here. */
4526                 "BPF_MAXINSNS: Run/add until end",
4527                 { },
4528                 CLASSIC | FLAG_NO_DATA,
4529                 { },
4530                 { { 0, 0x947bf368 } },
4531                 .fill_helper = bpf_fill_maxinsns3,
4532         },
4533         {
4534                 "BPF_MAXINSNS: Too many instructions",
4535                 { },
4536                 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4537                 { },
4538                 { },
4539                 .fill_helper = bpf_fill_maxinsns4,
4540         },
4541         {       /* Mainly checking JIT here. */
4542                 "BPF_MAXINSNS: Very long jump",
4543                 { },
4544                 CLASSIC | FLAG_NO_DATA,
4545                 { },
4546                 { { 0, 0xabababab } },
4547                 .fill_helper = bpf_fill_maxinsns5,
4548         },
4549         {       /* Mainly checking JIT here. */
4550                 "BPF_MAXINSNS: Ctx heavy transformations",
4551                 { },
4552                 CLASSIC,
4553                 { },
4554                 {
4555                         {  1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
4556                         { 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
4557                 },
4558                 .fill_helper = bpf_fill_maxinsns6,
4559         },
4560         {       /* Mainly checking JIT here. */
4561                 "BPF_MAXINSNS: Call heavy transformations",
4562                 { },
4563                 CLASSIC | FLAG_NO_DATA,
4564                 { },
4565                 { { 1, 0 }, { 10, 0 } },
4566                 .fill_helper = bpf_fill_maxinsns7,
4567         },
4568         {       /* Mainly checking JIT here. */
4569                 "BPF_MAXINSNS: Jump heavy test",
4570                 { },
4571                 CLASSIC | FLAG_NO_DATA,
4572                 { },
4573                 { { 0, 0xffffffff } },
4574                 .fill_helper = bpf_fill_maxinsns8,
4575         },
4576         {       /* Mainly checking JIT here. */
4577                 "BPF_MAXINSNS: Very long jump backwards",
4578                 { },
4579                 INTERNAL | FLAG_NO_DATA,
4580                 { },
4581                 { { 0, 0xcbababab } },
4582                 .fill_helper = bpf_fill_maxinsns9,
4583         },
4584         {       /* Mainly checking JIT here. */
4585                 "BPF_MAXINSNS: Edge hopping nuthouse",
4586                 { },
4587                 INTERNAL | FLAG_NO_DATA,
4588                 { },
4589                 { { 0, 0xabababac } },
4590                 .fill_helper = bpf_fill_maxinsns10,
4591         },
4592         {
4593                 "BPF_MAXINSNS: Jump, gap, jump, ...",
4594                 { },
4595                 CLASSIC | FLAG_NO_DATA,
4596                 { },
4597                 { { 0, 0xababcbac } },
4598                 .fill_helper = bpf_fill_maxinsns11,
4599         },
4600         {
4601                 "BPF_MAXINSNS: ld_abs+get_processor_id",
4602                 { },
4603                 CLASSIC,
4604                 { },
4605                 { { 1, 0xbee } },
4606                 .fill_helper = bpf_fill_ld_abs_get_processor_id,
4607         },
4608         {
4609                 "BPF_MAXINSNS: ld_abs+vlan_push/pop",
4610                 { },
4611                 INTERNAL,
4612                 { 0x34 },
4613                 { { 1, 0xbef } },
4614                 .fill_helper = bpf_fill_ld_abs_vlan_push_pop,
4615         },
4616         /*
4617          * LD_IND / LD_ABS on fragmented SKBs
4618          */
4619         {
4620                 "LD_IND byte frag",
4621                 .u.insns = {
4622                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4623                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
4624                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4625                 },
4626                 CLASSIC | FLAG_SKB_FRAG,
4627                 { },
4628                 { {0x40, 0x42} },
4629                 .frag_data = {
4630                         0x42, 0x00, 0x00, 0x00,
4631                         0x43, 0x44, 0x00, 0x00,
4632                         0x21, 0x07, 0x19, 0x83,
4633                 },
4634         },
4635         {
4636                 "LD_IND halfword frag",
4637                 .u.insns = {
4638                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4639                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
4640                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4641                 },
4642                 CLASSIC | FLAG_SKB_FRAG,
4643                 { },
4644                 { {0x40, 0x4344} },
4645                 .frag_data = {
4646                         0x42, 0x00, 0x00, 0x00,
4647                         0x43, 0x44, 0x00, 0x00,
4648                         0x21, 0x07, 0x19, 0x83,
4649                 },
4650         },
4651         {
4652                 "LD_IND word frag",
4653                 .u.insns = {
4654                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4655                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
4656                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4657                 },
4658                 CLASSIC | FLAG_SKB_FRAG,
4659                 { },
4660                 { {0x40, 0x21071983} },
4661                 .frag_data = {
4662                         0x42, 0x00, 0x00, 0x00,
4663                         0x43, 0x44, 0x00, 0x00,
4664                         0x21, 0x07, 0x19, 0x83,
4665                 },
4666         },
4667         {
4668                 "LD_IND halfword mixed head/frag",
4669                 .u.insns = {
4670                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4671                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
4672                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4673                 },
4674                 CLASSIC | FLAG_SKB_FRAG,
4675                 { [0x3e] = 0x25, [0x3f] = 0x05, },
4676                 { {0x40, 0x0519} },
4677                 .frag_data = { 0x19, 0x82 },
4678         },
4679         {
4680                 "LD_IND word mixed head/frag",
4681                 .u.insns = {
4682                         BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4683                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
4684                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4685                 },
4686                 CLASSIC | FLAG_SKB_FRAG,
4687                 { [0x3e] = 0x25, [0x3f] = 0x05, },
4688                 { {0x40, 0x25051982} },
4689                 .frag_data = { 0x19, 0x82 },
4690         },
4691         {
4692                 "LD_ABS byte frag",
4693                 .u.insns = {
4694                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
4695                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4696                 },
4697                 CLASSIC | FLAG_SKB_FRAG,
4698                 { },
4699                 { {0x40, 0x42} },
4700                 .frag_data = {
4701                         0x42, 0x00, 0x00, 0x00,
4702                         0x43, 0x44, 0x00, 0x00,
4703                         0x21, 0x07, 0x19, 0x83,
4704                 },
4705         },
4706         {
4707                 "LD_ABS halfword frag",
4708                 .u.insns = {
4709                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
4710                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4711                 },
4712                 CLASSIC | FLAG_SKB_FRAG,
4713                 { },
4714                 { {0x40, 0x4344} },
4715                 .frag_data = {
4716                         0x42, 0x00, 0x00, 0x00,
4717                         0x43, 0x44, 0x00, 0x00,
4718                         0x21, 0x07, 0x19, 0x83,
4719                 },
4720         },
4721         {
4722                 "LD_ABS word frag",
4723                 .u.insns = {
4724                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
4725                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4726                 },
4727                 CLASSIC | FLAG_SKB_FRAG,
4728                 { },
4729                 { {0x40, 0x21071983} },
4730                 .frag_data = {
4731                         0x42, 0x00, 0x00, 0x00,
4732                         0x43, 0x44, 0x00, 0x00,
4733                         0x21, 0x07, 0x19, 0x83,
4734                 },
4735         },
4736         {
4737                 "LD_ABS halfword mixed head/frag",
4738                 .u.insns = {
4739                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
4740                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4741                 },
4742                 CLASSIC | FLAG_SKB_FRAG,
4743                 { [0x3e] = 0x25, [0x3f] = 0x05, },
4744                 { {0x40, 0x0519} },
4745                 .frag_data = { 0x19, 0x82 },
4746         },
4747         {
4748                 "LD_ABS word mixed head/frag",
4749                 .u.insns = {
4750                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
4751                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4752                 },
4753                 CLASSIC | FLAG_SKB_FRAG,
4754                 { [0x3e] = 0x25, [0x3f] = 0x05, },
4755                 { {0x40, 0x25051982} },
4756                 .frag_data = { 0x19, 0x82 },
4757         },
4758         /*
4759          * LD_IND / LD_ABS on non fragmented SKBs
4760          */
4761         {
4762                 /*
4763                  * this tests that the JIT/interpreter correctly resets X
4764                  * before using it in an LD_IND instruction.
4765                  */
4766                 "LD_IND byte default X",
4767                 .u.insns = {
4768                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
4769                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4770                 },
4771                 CLASSIC,
4772                 { [0x1] = 0x42 },
4773                 { {0x40, 0x42 } },
4774         },
4775         {
4776                 "LD_IND byte positive offset",
4777                 .u.insns = {
4778                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
4779                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
4780                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4781                 },
4782                 CLASSIC,
4783                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
4784                 { {0x40, 0x82 } },
4785         },
4786         {
4787                 "LD_IND byte negative offset",
4788                 .u.insns = {
4789                         BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
4790                         BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
4791                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4792                 },
4793                 CLASSIC,
4794                 { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
4795                 { {0x40, 0x05 } },
4796         },
4797         {
4798                 "LD_IND halfword positive offset",
4799                 .u.insns = {
4800                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4801                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
4802                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4803                 },
4804                 CLASSIC,
4805                 {
4806                         [0x1c] = 0xaa, [0x1d] = 0x55,
4807                         [0x1e] = 0xbb, [0x1f] = 0x66,
4808                         [0x20] = 0xcc, [0x21] = 0x77,
4809                         [0x22] = 0xdd, [0x23] = 0x88,
4810                 },
4811                 { {0x40, 0xdd88 } },
4812         },
4813         {
4814                 "LD_IND halfword negative offset",
4815                 .u.insns = {
4816                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4817                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
4818                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4819                 },
4820                 CLASSIC,
4821                 {
4822                         [0x1c] = 0xaa, [0x1d] = 0x55,
4823                         [0x1e] = 0xbb, [0x1f] = 0x66,
4824                         [0x20] = 0xcc, [0x21] = 0x77,
4825                         [0x22] = 0xdd, [0x23] = 0x88,
4826                 },
4827                 { {0x40, 0xbb66 } },
4828         },
4829         {
4830                 "LD_IND halfword unaligned",
4831                 .u.insns = {
4832                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4833                         BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
4834                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4835                 },
4836                 CLASSIC,
4837                 {
4838                         [0x1c] = 0xaa, [0x1d] = 0x55,
4839                         [0x1e] = 0xbb, [0x1f] = 0x66,
4840                         [0x20] = 0xcc, [0x21] = 0x77,
4841                         [0x22] = 0xdd, [0x23] = 0x88,
4842                 },
4843                 { {0x40, 0x66cc } },
4844         },
4845         {
4846                 "LD_IND word positive offset",
4847                 .u.insns = {
4848                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4849                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
4850                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4851                 },
4852                 CLASSIC,
4853                 {
4854                         [0x1c] = 0xaa, [0x1d] = 0x55,
4855                         [0x1e] = 0xbb, [0x1f] = 0x66,
4856                         [0x20] = 0xcc, [0x21] = 0x77,
4857                         [0x22] = 0xdd, [0x23] = 0x88,
4858                         [0x24] = 0xee, [0x25] = 0x99,
4859                         [0x26] = 0xff, [0x27] = 0xaa,
4860                 },
4861                 { {0x40, 0xee99ffaa } },
4862         },
4863         {
4864                 "LD_IND word negative offset",
4865                 .u.insns = {
4866                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4867                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
4868                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4869                 },
4870                 CLASSIC,
4871                 {
4872                         [0x1c] = 0xaa, [0x1d] = 0x55,
4873                         [0x1e] = 0xbb, [0x1f] = 0x66,
4874                         [0x20] = 0xcc, [0x21] = 0x77,
4875                         [0x22] = 0xdd, [0x23] = 0x88,
4876                         [0x24] = 0xee, [0x25] = 0x99,
4877                         [0x26] = 0xff, [0x27] = 0xaa,
4878                 },
4879                 { {0x40, 0xaa55bb66 } },
4880         },
4881         {
4882                 "LD_IND word unaligned (addr & 3 == 2)",
4883                 .u.insns = {
4884                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4885                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
4886                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4887                 },
4888                 CLASSIC,
4889                 {
4890                         [0x1c] = 0xaa, [0x1d] = 0x55,
4891                         [0x1e] = 0xbb, [0x1f] = 0x66,
4892                         [0x20] = 0xcc, [0x21] = 0x77,
4893                         [0x22] = 0xdd, [0x23] = 0x88,
4894                         [0x24] = 0xee, [0x25] = 0x99,
4895                         [0x26] = 0xff, [0x27] = 0xaa,
4896                 },
4897                 { {0x40, 0xbb66cc77 } },
4898         },
4899         {
4900                 "LD_IND word unaligned (addr & 3 == 1)",
4901                 .u.insns = {
4902                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4903                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
4904                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4905                 },
4906                 CLASSIC,
4907                 {
4908                         [0x1c] = 0xaa, [0x1d] = 0x55,
4909                         [0x1e] = 0xbb, [0x1f] = 0x66,
4910                         [0x20] = 0xcc, [0x21] = 0x77,
4911                         [0x22] = 0xdd, [0x23] = 0x88,
4912                         [0x24] = 0xee, [0x25] = 0x99,
4913                         [0x26] = 0xff, [0x27] = 0xaa,
4914                 },
4915                 { {0x40, 0x55bb66cc } },
4916         },
4917         {
4918                 "LD_IND word unaligned (addr & 3 == 3)",
4919                 .u.insns = {
4920                         BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4921                         BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
4922                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4923                 },
4924                 CLASSIC,
4925                 {
4926                         [0x1c] = 0xaa, [0x1d] = 0x55,
4927                         [0x1e] = 0xbb, [0x1f] = 0x66,
4928                         [0x20] = 0xcc, [0x21] = 0x77,
4929                         [0x22] = 0xdd, [0x23] = 0x88,
4930                         [0x24] = 0xee, [0x25] = 0x99,
4931                         [0x26] = 0xff, [0x27] = 0xaa,
4932                 },
4933                 { {0x40, 0x66cc77dd } },
4934         },
4935         {
4936                 "LD_ABS byte",
4937                 .u.insns = {
4938                         BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
4939                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4940                 },
4941                 CLASSIC,
4942                 {
4943                         [0x1c] = 0xaa, [0x1d] = 0x55,
4944                         [0x1e] = 0xbb, [0x1f] = 0x66,
4945                         [0x20] = 0xcc, [0x21] = 0x77,
4946                         [0x22] = 0xdd, [0x23] = 0x88,
4947                         [0x24] = 0xee, [0x25] = 0x99,
4948                         [0x26] = 0xff, [0x27] = 0xaa,
4949                 },
4950                 { {0x40, 0xcc } },
4951         },
4952         {
4953                 "LD_ABS halfword",
4954                 .u.insns = {
4955                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
4956                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4957                 },
4958                 CLASSIC,
4959                 {
4960                         [0x1c] = 0xaa, [0x1d] = 0x55,
4961                         [0x1e] = 0xbb, [0x1f] = 0x66,
4962                         [0x20] = 0xcc, [0x21] = 0x77,
4963                         [0x22] = 0xdd, [0x23] = 0x88,
4964                         [0x24] = 0xee, [0x25] = 0x99,
4965                         [0x26] = 0xff, [0x27] = 0xaa,
4966                 },
4967                 { {0x40, 0xdd88 } },
4968         },
4969         {
4970                 "LD_ABS halfword unaligned",
4971                 .u.insns = {
4972                         BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
4973                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4974                 },
4975                 CLASSIC,
4976                 {
4977                         [0x1c] = 0xaa, [0x1d] = 0x55,
4978                         [0x1e] = 0xbb, [0x1f] = 0x66,
4979                         [0x20] = 0xcc, [0x21] = 0x77,
4980                         [0x22] = 0xdd, [0x23] = 0x88,
4981                         [0x24] = 0xee, [0x25] = 0x99,
4982                         [0x26] = 0xff, [0x27] = 0xaa,
4983                 },
4984                 { {0x40, 0x99ff } },
4985         },
4986         {
4987                 "LD_ABS word",
4988                 .u.insns = {
4989                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
4990                         BPF_STMT(BPF_RET | BPF_A, 0x0),
4991                 },
4992                 CLASSIC,
4993                 {
4994                         [0x1c] = 0xaa, [0x1d] = 0x55,
4995                         [0x1e] = 0xbb, [0x1f] = 0x66,
4996                         [0x20] = 0xcc, [0x21] = 0x77,
4997                         [0x22] = 0xdd, [0x23] = 0x88,
4998                         [0x24] = 0xee, [0x25] = 0x99,
4999                         [0x26] = 0xff, [0x27] = 0xaa,
5000                 },
5001                 { {0x40, 0xaa55bb66 } },
5002         },
5003         {
5004                 "LD_ABS word unaligned (addr & 3 == 2)",
5005                 .u.insns = {
5006                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
5007                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5008                 },
5009                 CLASSIC,
5010                 {
5011                         [0x1c] = 0xaa, [0x1d] = 0x55,
5012                         [0x1e] = 0xbb, [0x1f] = 0x66,
5013                         [0x20] = 0xcc, [0x21] = 0x77,
5014                         [0x22] = 0xdd, [0x23] = 0x88,
5015                         [0x24] = 0xee, [0x25] = 0x99,
5016                         [0x26] = 0xff, [0x27] = 0xaa,
5017                 },
5018                 { {0x40, 0xdd88ee99 } },
5019         },
5020         {
5021                 "LD_ABS word unaligned (addr & 3 == 1)",
5022                 .u.insns = {
5023                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
5024                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5025                 },
5026                 CLASSIC,
5027                 {
5028                         [0x1c] = 0xaa, [0x1d] = 0x55,
5029                         [0x1e] = 0xbb, [0x1f] = 0x66,
5030                         [0x20] = 0xcc, [0x21] = 0x77,
5031                         [0x22] = 0xdd, [0x23] = 0x88,
5032                         [0x24] = 0xee, [0x25] = 0x99,
5033                         [0x26] = 0xff, [0x27] = 0xaa,
5034                 },
5035                 { {0x40, 0x77dd88ee } },
5036         },
5037         {
5038                 "LD_ABS word unaligned (addr & 3 == 3)",
5039                 .u.insns = {
5040                         BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
5041                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5042                 },
5043                 CLASSIC,
5044                 {
5045                         [0x1c] = 0xaa, [0x1d] = 0x55,
5046                         [0x1e] = 0xbb, [0x1f] = 0x66,
5047                         [0x20] = 0xcc, [0x21] = 0x77,
5048                         [0x22] = 0xdd, [0x23] = 0x88,
5049                         [0x24] = 0xee, [0x25] = 0x99,
5050                         [0x26] = 0xff, [0x27] = 0xaa,
5051                 },
5052                 { {0x40, 0x88ee99ff } },
5053         },
5054         /*
5055          * verify that the interpreter or JIT correctly sets A and X
5056          * to 0.
5057          */
5058         {
5059                 "ADD default X",
5060                 .u.insns = {
5061                         /*
5062                          * A = 0x42
5063                          * A = A + X
5064                          * ret A
5065                          */
5066                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5067                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
5068                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5069                 },
5070                 CLASSIC | FLAG_NO_DATA,
5071                 {},
5072                 { {0x1, 0x42 } },
5073         },
5074         {
5075                 "ADD default A",
5076                 .u.insns = {
5077                         /*
5078                          * A = A + 0x42
5079                          * ret A
5080                          */
5081                         BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
5082                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5083                 },
5084                 CLASSIC | FLAG_NO_DATA,
5085                 {},
5086                 { {0x1, 0x42 } },
5087         },
5088         {
5089                 "SUB default X",
5090                 .u.insns = {
5091                         /*
5092                          * A = 0x66
5093                          * A = A - X
5094                          * ret A
5095                          */
5096                         BPF_STMT(BPF_LD | BPF_IMM, 0x66),
5097                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
5098                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5099                 },
5100                 CLASSIC | FLAG_NO_DATA,
5101                 {},
5102                 { {0x1, 0x66 } },
5103         },
5104         {
5105                 "SUB default A",
5106                 .u.insns = {
5107                         /*
5108                          * A = A - -0x66
5109                          * ret A
5110                          */
5111                         BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
5112                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5113                 },
5114                 CLASSIC | FLAG_NO_DATA,
5115                 {},
5116                 { {0x1, 0x66 } },
5117         },
5118         {
5119                 "MUL default X",
5120                 .u.insns = {
5121                         /*
5122                          * A = 0x42
5123                          * A = A * X
5124                          * ret A
5125                          */
5126                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5127                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
5128                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5129                 },
5130                 CLASSIC | FLAG_NO_DATA,
5131                 {},
5132                 { {0x1, 0x0 } },
5133         },
5134         {
5135                 "MUL default A",
5136                 .u.insns = {
5137                         /*
5138                          * A = A * 0x66
5139                          * ret A
5140                          */
5141                         BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
5142                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5143                 },
5144                 CLASSIC | FLAG_NO_DATA,
5145                 {},
5146                 { {0x1, 0x0 } },
5147         },
5148         {
5149                 "DIV default X",
5150                 .u.insns = {
5151                         /*
5152                          * A = 0x42
5153                          * A = A / X ; this halt the filter execution if X is 0
5154                          * ret 0x42
5155                          */
5156                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5157                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
5158                         BPF_STMT(BPF_RET | BPF_K, 0x42),
5159                 },
5160                 CLASSIC | FLAG_NO_DATA,
5161                 {},
5162                 { {0x1, 0x0 } },
5163         },
5164         {
5165                 "DIV default A",
5166                 .u.insns = {
5167                         /*
5168                          * A = A / 1
5169                          * ret A
5170                          */
5171                         BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
5172                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5173                 },
5174                 CLASSIC | FLAG_NO_DATA,
5175                 {},
5176                 { {0x1, 0x0 } },
5177         },
5178         {
5179                 "MOD default X",
5180                 .u.insns = {
5181                         /*
5182                          * A = 0x42
5183                          * A = A mod X ; this halt the filter execution if X is 0
5184                          * ret 0x42
5185                          */
5186                         BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5187                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
5188                         BPF_STMT(BPF_RET | BPF_K, 0x42),
5189                 },
5190                 CLASSIC | FLAG_NO_DATA,
5191                 {},
5192                 { {0x1, 0x0 } },
5193         },
5194         {
5195                 "MOD default A",
5196                 .u.insns = {
5197                         /*
5198                          * A = A mod 1
5199                          * ret A
5200                          */
5201                         BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
5202                         BPF_STMT(BPF_RET | BPF_A, 0x0),
5203                 },
5204                 CLASSIC | FLAG_NO_DATA,
5205                 {},
5206                 { {0x1, 0x0 } },
5207         },
5208         {
5209                 "JMP EQ default A",
5210                 .u.insns = {
5211                         /*
5212                          * cmp A, 0x0, 0, 1
5213                          * ret 0x42
5214                          * ret 0x66
5215                          */
5216                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
5217                         BPF_STMT(BPF_RET | BPF_K, 0x42),
5218                         BPF_STMT(BPF_RET | BPF_K, 0x66),
5219                 },
5220                 CLASSIC | FLAG_NO_DATA,
5221                 {},
5222                 { {0x1, 0x42 } },
5223         },
5224         {
5225                 "JMP EQ default X",
5226                 .u.insns = {
5227                         /*
5228                          * A = 0x0
5229                          * cmp A, X, 0, 1
5230                          * ret 0x42
5231                          * ret 0x66
5232                          */
5233                         BPF_STMT(BPF_LD | BPF_IMM, 0x0),
5234                         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
5235                         BPF_STMT(BPF_RET | BPF_K, 0x42),
5236                         BPF_STMT(BPF_RET | BPF_K, 0x66),
5237                 },
5238                 CLASSIC | FLAG_NO_DATA,
5239                 {},
5240                 { {0x1, 0x42 } },
5241         },
5242 };
5243
5244 static struct net_device dev;
5245
5246 static struct sk_buff *populate_skb(char *buf, int size)
5247 {
5248         struct sk_buff *skb;
5249
5250         if (size >= MAX_DATA)
5251                 return NULL;
5252
5253         skb = alloc_skb(MAX_DATA, GFP_KERNEL);
5254         if (!skb)
5255                 return NULL;
5256
5257         memcpy(__skb_put(skb, size), buf, size);
5258
5259         /* Initialize a fake skb with test pattern. */
5260         skb_reset_mac_header(skb);
5261         skb->protocol = htons(ETH_P_IP);
5262         skb->pkt_type = SKB_TYPE;
5263         skb->mark = SKB_MARK;
5264         skb->hash = SKB_HASH;
5265         skb->queue_mapping = SKB_QUEUE_MAP;
5266         skb->vlan_tci = SKB_VLAN_TCI;
5267         skb->dev = &dev;
5268         skb->dev->ifindex = SKB_DEV_IFINDEX;
5269         skb->dev->type = SKB_DEV_TYPE;
5270         skb_set_network_header(skb, min(size, ETH_HLEN));
5271
5272         return skb;
5273 }
5274
5275 static void *generate_test_data(struct bpf_test *test, int sub)
5276 {
5277         struct sk_buff *skb;
5278         struct page *page;
5279
5280         if (test->aux & FLAG_NO_DATA)
5281                 return NULL;
5282
5283         /* Test case expects an skb, so populate one. Various
5284          * subtests generate skbs of different sizes based on
5285          * the same data.
5286          */
5287         skb = populate_skb(test->data, test->test[sub].data_size);
5288         if (!skb)
5289                 return NULL;
5290
5291         if (test->aux & FLAG_SKB_FRAG) {
5292                 /*
5293                  * when the test requires a fragmented skb, add a
5294                  * single fragment to the skb, filled with
5295                  * test->frag_data.
5296                  */
5297                 void *ptr;
5298
5299                 page = alloc_page(GFP_KERNEL);
5300
5301                 if (!page)
5302                         goto err_kfree_skb;
5303
5304                 ptr = kmap(page);
5305                 if (!ptr)
5306                         goto err_free_page;
5307                 memcpy(ptr, test->frag_data, MAX_DATA);
5308                 kunmap(page);
5309                 skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
5310         }
5311
5312         return skb;
5313
5314 err_free_page:
5315         __free_page(page);
5316 err_kfree_skb:
5317         kfree_skb(skb);
5318         return NULL;
5319 }
5320
5321 static void release_test_data(const struct bpf_test *test, void *data)
5322 {
5323         if (test->aux & FLAG_NO_DATA)
5324                 return;
5325
5326         kfree_skb(data);
5327 }
5328
5329 static int filter_length(int which)
5330 {
5331         struct sock_filter *fp;
5332         int len;
5333
5334         if (tests[which].fill_helper)
5335                 return tests[which].u.ptr.len;
5336
5337         fp = tests[which].u.insns;
5338         for (len = MAX_INSNS - 1; len > 0; --len)
5339                 if (fp[len].code != 0 || fp[len].k != 0)
5340                         break;
5341
5342         return len + 1;
5343 }
5344
5345 static void *filter_pointer(int which)
5346 {
5347         if (tests[which].fill_helper)
5348                 return tests[which].u.ptr.insns;
5349         else
5350                 return tests[which].u.insns;
5351 }
5352
5353 static struct bpf_prog *generate_filter(int which, int *err)
5354 {
5355         __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
5356         unsigned int flen = filter_length(which);
5357         void *fptr = filter_pointer(which);
5358         struct sock_fprog_kern fprog;
5359         struct bpf_prog *fp;
5360
5361         switch (test_type) {
5362         case CLASSIC:
5363                 fprog.filter = fptr;
5364                 fprog.len = flen;
5365
5366                 *err = bpf_prog_create(&fp, &fprog);
5367                 if (tests[which].aux & FLAG_EXPECTED_FAIL) {
5368                         if (*err == -EINVAL) {
5369                                 pr_cont("PASS\n");
5370                                 /* Verifier rejected filter as expected. */
5371                                 *err = 0;
5372                                 return NULL;
5373                         } else {
5374                                 pr_cont("UNEXPECTED_PASS\n");
5375                                 /* Verifier didn't reject the test that's
5376                                  * bad enough, just return!
5377                                  */
5378                                 *err = -EINVAL;
5379                                 return NULL;
5380                         }
5381                 }
5382                 /* We don't expect to fail. */
5383                 if (*err) {
5384                         pr_cont("FAIL to attach err=%d len=%d\n",
5385                                 *err, fprog.len);
5386                         return NULL;
5387                 }
5388                 break;
5389
5390         case INTERNAL:
5391                 fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
5392                 if (fp == NULL) {
5393                         pr_cont("UNEXPECTED_FAIL no memory left\n");
5394                         *err = -ENOMEM;
5395                         return NULL;
5396                 }
5397
5398                 fp->len = flen;
5399                 /* Type doesn't really matter here as long as it's not unspec. */
5400                 fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
5401                 memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
5402
5403                 bpf_prog_select_runtime(fp);
5404                 break;
5405         }
5406
5407         *err = 0;
5408         return fp;
5409 }
5410
5411 static void release_filter(struct bpf_prog *fp, int which)
5412 {
5413         __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
5414
5415         switch (test_type) {
5416         case CLASSIC:
5417                 bpf_prog_destroy(fp);
5418                 break;
5419         case INTERNAL:
5420                 bpf_prog_free(fp);
5421                 break;
5422         }
5423 }
5424
5425 static int __run_one(const struct bpf_prog *fp, const void *data,
5426                      int runs, u64 *duration)
5427 {
5428         u64 start, finish;
5429         int ret = 0, i;
5430
5431         start = ktime_get_ns();
5432
5433         for (i = 0; i < runs; i++)
5434                 ret = BPF_PROG_RUN(fp, data);
5435
5436         finish = ktime_get_ns();
5437
5438         *duration = finish - start;
5439         do_div(*duration, runs);
5440
5441         return ret;
5442 }
5443
5444 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
5445 {
5446         int err_cnt = 0, i, runs = MAX_TESTRUNS;
5447
5448         for (i = 0; i < MAX_SUBTESTS; i++) {
5449                 void *data;
5450                 u64 duration;
5451                 u32 ret;
5452
5453                 if (test->test[i].data_size == 0 &&
5454                     test->test[i].result == 0)
5455                         break;
5456
5457                 data = generate_test_data(test, i);
5458                 if (!data && !(test->aux & FLAG_NO_DATA)) {
5459                         pr_cont("data generation failed ");
5460                         err_cnt++;
5461                         break;
5462                 }
5463                 ret = __run_one(fp, data, runs, &duration);
5464                 release_test_data(test, data);
5465
5466                 if (ret == test->test[i].result) {
5467                         pr_cont("%lld ", duration);
5468                 } else {
5469                         pr_cont("ret %d != %d ", ret,
5470                                 test->test[i].result);
5471                         err_cnt++;
5472                 }
5473         }
5474
5475         return err_cnt;
5476 }
5477
5478 static char test_name[64];
5479 module_param_string(test_name, test_name, sizeof(test_name), 0);
5480
5481 static int test_id = -1;
5482 module_param(test_id, int, 0);
5483
5484 static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
5485 module_param_array(test_range, int, NULL, 0);
5486
5487 static __init int find_test_index(const char *test_name)
5488 {
5489         int i;
5490
5491         for (i = 0; i < ARRAY_SIZE(tests); i++) {
5492                 if (!strcmp(tests[i].descr, test_name))
5493                         return i;
5494         }
5495         return -1;
5496 }
5497
5498 static __init int prepare_bpf_tests(void)
5499 {
5500         int i;
5501
5502         if (test_id >= 0) {
5503                 /*
5504                  * if a test_id was specified, use test_range to
5505                  * cover only that test.
5506                  */
5507                 if (test_id >= ARRAY_SIZE(tests)) {
5508                         pr_err("test_bpf: invalid test_id specified.\n");
5509                         return -EINVAL;
5510                 }
5511
5512                 test_range[0] = test_id;
5513                 test_range[1] = test_id;
5514         } else if (*test_name) {
5515                 /*
5516                  * if a test_name was specified, find it and setup
5517                  * test_range to cover only that test.
5518                  */
5519                 int idx = find_test_index(test_name);
5520
5521                 if (idx < 0) {
5522                         pr_err("test_bpf: no test named '%s' found.\n",
5523                                test_name);
5524                         return -EINVAL;
5525                 }
5526                 test_range[0] = idx;
5527                 test_range[1] = idx;
5528         } else {
5529                 /*
5530                  * check that the supplied test_range is valid.
5531                  */
5532                 if (test_range[0] >= ARRAY_SIZE(tests) ||
5533                     test_range[1] >= ARRAY_SIZE(tests) ||
5534                     test_range[0] < 0 || test_range[1] < 0) {
5535                         pr_err("test_bpf: test_range is out of bound.\n");
5536                         return -EINVAL;
5537                 }
5538
5539                 if (test_range[1] < test_range[0]) {
5540                         pr_err("test_bpf: test_range is ending before it starts.\n");
5541                         return -EINVAL;
5542                 }
5543         }
5544
5545         for (i = 0; i < ARRAY_SIZE(tests); i++) {
5546                 if (tests[i].fill_helper &&
5547                     tests[i].fill_helper(&tests[i]) < 0)
5548                         return -ENOMEM;
5549         }
5550
5551         return 0;
5552 }
5553
5554 static __init void destroy_bpf_tests(void)
5555 {
5556         int i;
5557
5558         for (i = 0; i < ARRAY_SIZE(tests); i++) {
5559                 if (tests[i].fill_helper)
5560                         kfree(tests[i].u.ptr.insns);
5561         }
5562 }
5563
5564 static bool exclude_test(int test_id)
5565 {
5566         return test_id < test_range[0] || test_id > test_range[1];
5567 }
5568
5569 static __init int test_bpf(void)
5570 {
5571         int i, err_cnt = 0, pass_cnt = 0;
5572         int jit_cnt = 0, run_cnt = 0;
5573
5574         for (i = 0; i < ARRAY_SIZE(tests); i++) {
5575                 struct bpf_prog *fp;
5576                 int err;
5577
5578                 if (exclude_test(i))
5579                         continue;
5580
5581                 pr_info("#%d %s ", i, tests[i].descr);
5582
5583                 fp = generate_filter(i, &err);
5584                 if (fp == NULL) {
5585                         if (err == 0) {
5586                                 pass_cnt++;
5587                                 continue;
5588                         }
5589
5590                         return err;
5591                 }
5592
5593                 pr_cont("jited:%u ", fp->jited);
5594
5595                 run_cnt++;
5596                 if (fp->jited)
5597                         jit_cnt++;
5598
5599                 err = run_one(fp, &tests[i]);
5600                 release_filter(fp, i);
5601
5602                 if (err) {
5603                         pr_cont("FAIL (%d times)\n", err);
5604                         err_cnt++;
5605                 } else {
5606                         pr_cont("PASS\n");
5607                         pass_cnt++;
5608                 }
5609         }
5610
5611         pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
5612                 pass_cnt, err_cnt, jit_cnt, run_cnt);
5613
5614         return err_cnt ? -EINVAL : 0;
5615 }
5616
5617 static int __init test_bpf_init(void)
5618 {
5619         int ret;
5620
5621         ret = prepare_bpf_tests();
5622         if (ret < 0)
5623                 return ret;
5624
5625         ret = test_bpf();
5626
5627         destroy_bpf_tests();
5628         return ret;
5629 }
5630
5631 static void __exit test_bpf_exit(void)
5632 {
5633 }
5634
5635 module_init(test_bpf_init);
5636 module_exit(test_bpf_exit);
5637
5638 MODULE_LICENSE("GPL");