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