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