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