2 * Testsuite for BPF interpreter and BPF JIT compiler
4 * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
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.
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.
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/filter.h>
21 #include <linux/bpf.h>
22 #include <linux/skbuff.h>
23 #include <linux/netdevice.h>
24 #include <linux/if_vlan.h>
25 #include <linux/random.h>
26 #include <linux/highmem.h>
28 /* General test specific settings */
29 #define MAX_SUBTESTS 3
30 #define MAX_TESTRUNS 10000
33 #define MAX_K 0xffffFFFF
35 /* Few constants used to init test 'skb' */
37 #define SKB_MARK 0x1234aaaa
38 #define SKB_HASH 0x1234aaab
39 #define SKB_QUEUE_MAP 123
40 #define SKB_VLAN_TCI 0xffff
41 #define SKB_DEV_IFINDEX 577
42 #define SKB_DEV_TYPE 588
44 /* Redefine REGs to make tests less verbose */
55 #define R10 BPF_REG_10
57 /* Flags that can be passed to test cases */
58 #define FLAG_NO_DATA BIT(0)
59 #define FLAG_EXPECTED_FAIL BIT(1)
60 #define FLAG_SKB_FRAG BIT(2)
63 CLASSIC = BIT(6), /* Old BPF instructions only. */
64 INTERNAL = BIT(7), /* Extended instruction set. */
67 #define TEST_TYPE_MASK (CLASSIC | INTERNAL)
72 struct sock_filter insns[MAX_INSNS];
73 struct bpf_insn insns_int[MAX_INSNS];
85 int (*fill_helper)(struct bpf_test *self);
86 int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
87 __u8 frag_data[MAX_DATA];
90 /* Large test cases need separate allocation and fill handler. */
92 static int bpf_fill_maxinsns1(struct bpf_test *self)
94 unsigned int len = BPF_MAXINSNS;
95 struct sock_filter *insn;
99 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
103 for (i = 0; i < len; i++, k--)
104 insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
106 self->u.ptr.insns = insn;
107 self->u.ptr.len = len;
112 static int bpf_fill_maxinsns2(struct bpf_test *self)
114 unsigned int len = BPF_MAXINSNS;
115 struct sock_filter *insn;
118 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
122 for (i = 0; i < len; i++)
123 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
125 self->u.ptr.insns = insn;
126 self->u.ptr.len = len;
131 static int bpf_fill_maxinsns3(struct bpf_test *self)
133 unsigned int len = BPF_MAXINSNS;
134 struct sock_filter *insn;
135 struct rnd_state rnd;
138 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
142 prandom_seed_state(&rnd, 3141592653589793238ULL);
144 for (i = 0; i < len - 1; i++) {
145 __u32 k = prandom_u32_state(&rnd);
147 insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
150 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
152 self->u.ptr.insns = insn;
153 self->u.ptr.len = len;
158 static int bpf_fill_maxinsns4(struct bpf_test *self)
160 unsigned int len = BPF_MAXINSNS + 1;
161 struct sock_filter *insn;
164 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
168 for (i = 0; i < len; i++)
169 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
171 self->u.ptr.insns = insn;
172 self->u.ptr.len = len;
177 static int bpf_fill_maxinsns5(struct bpf_test *self)
179 unsigned int len = BPF_MAXINSNS;
180 struct sock_filter *insn;
183 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
187 insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
189 for (i = 1; i < len - 1; i++)
190 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
192 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
194 self->u.ptr.insns = insn;
195 self->u.ptr.len = len;
200 static int bpf_fill_maxinsns6(struct bpf_test *self)
202 unsigned int len = BPF_MAXINSNS;
203 struct sock_filter *insn;
206 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
210 for (i = 0; i < len - 1; i++)
211 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
212 SKF_AD_VLAN_TAG_PRESENT);
214 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
216 self->u.ptr.insns = insn;
217 self->u.ptr.len = len;
222 static int bpf_fill_maxinsns7(struct bpf_test *self)
224 unsigned int len = BPF_MAXINSNS;
225 struct sock_filter *insn;
228 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
232 for (i = 0; i < len - 4; i++)
233 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
236 insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
237 insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
239 insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
240 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
242 self->u.ptr.insns = insn;
243 self->u.ptr.len = len;
248 static int bpf_fill_maxinsns8(struct bpf_test *self)
250 unsigned int len = BPF_MAXINSNS;
251 struct sock_filter *insn;
252 int i, jmp_off = len - 3;
254 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
258 insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
260 for (i = 1; i < len - 1; i++)
261 insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
263 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
265 self->u.ptr.insns = insn;
266 self->u.ptr.len = len;
271 static int bpf_fill_maxinsns9(struct bpf_test *self)
273 unsigned int len = BPF_MAXINSNS;
274 struct bpf_insn *insn;
277 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
281 insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
282 insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
283 insn[2] = BPF_EXIT_INSN();
285 for (i = 3; i < len - 2; i++)
286 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
288 insn[len - 2] = BPF_EXIT_INSN();
289 insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
291 self->u.ptr.insns = insn;
292 self->u.ptr.len = len;
297 static int bpf_fill_maxinsns10(struct bpf_test *self)
299 unsigned int len = BPF_MAXINSNS, hlen = len - 2;
300 struct bpf_insn *insn;
303 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
307 for (i = 0; i < hlen / 2; i++)
308 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
309 for (i = hlen - 1; i > hlen / 2; i--)
310 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
312 insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
313 insn[hlen] = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
314 insn[hlen + 1] = BPF_EXIT_INSN();
316 self->u.ptr.insns = insn;
317 self->u.ptr.len = len;
322 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
325 struct sock_filter *insn;
329 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
333 rlen = (len % plen) - 1;
335 for (i = 0; i + plen < len; i += plen)
336 for (j = 0; j < plen; j++)
337 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
339 for (j = 0; j < rlen; j++)
340 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
343 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
345 self->u.ptr.insns = insn;
346 self->u.ptr.len = len;
351 static int bpf_fill_maxinsns11(struct bpf_test *self)
353 /* Hits 70 passes on x86_64, so cannot get JITed there. */
354 return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
357 static int bpf_fill_ja(struct bpf_test *self)
359 /* Hits exactly 11 passes on x86_64 JIT. */
360 return __bpf_fill_ja(self, 12, 9);
363 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
365 unsigned int len = BPF_MAXINSNS;
366 struct sock_filter *insn;
369 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
373 for (i = 0; i < len - 1; i += 2) {
374 insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
375 insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
376 SKF_AD_OFF + SKF_AD_CPU);
379 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
381 self->u.ptr.insns = insn;
382 self->u.ptr.len = len;
388 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */
389 static int bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self)
391 unsigned int len = BPF_MAXINSNS;
392 struct bpf_insn *insn;
395 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
399 insn[i++] = BPF_MOV64_REG(R6, R1);
401 for (j = 0; j < PUSH_CNT; j++) {
402 insn[i++] = BPF_LD_ABS(BPF_B, 0);
403 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
405 insn[i++] = BPF_MOV64_REG(R1, R6);
406 insn[i++] = BPF_MOV64_IMM(R2, 1);
407 insn[i++] = BPF_MOV64_IMM(R3, 2);
408 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
409 bpf_skb_vlan_push_proto.func - __bpf_call_base);
410 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
414 for (j = 0; j < PUSH_CNT; j++) {
415 insn[i++] = BPF_LD_ABS(BPF_B, 0);
416 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
418 insn[i++] = BPF_MOV64_REG(R1, R6);
419 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
420 bpf_skb_vlan_pop_proto.func - __bpf_call_base);
421 insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
427 for (; i < len - 1; i++)
428 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xbef);
430 insn[len - 1] = BPF_EXIT_INSN();
432 self->u.ptr.insns = insn;
433 self->u.ptr.len = len;
438 static struct bpf_test tests[] = {
442 BPF_STMT(BPF_LD | BPF_IMM, 1),
443 BPF_STMT(BPF_MISC | BPF_TAX, 0),
444 BPF_STMT(BPF_LD | BPF_IMM, 2),
445 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
446 BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
447 BPF_STMT(BPF_MISC | BPF_TAX, 0),
448 BPF_STMT(BPF_LD | BPF_LEN, 0),
449 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
450 BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
451 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
452 BPF_STMT(BPF_RET | BPF_A, 0)
455 { 10, 20, 30, 40, 50 },
456 { { 2, 10 }, { 3, 20 }, { 4, 30 } },
461 BPF_STMT(BPF_LDX | BPF_LEN, 0),
462 BPF_STMT(BPF_MISC | BPF_TXA, 0),
463 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
464 BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
467 { 10, 20, 30, 40, 50 },
468 { { 1, 2 }, { 3, 6 }, { 4, 8 } },
473 BPF_STMT(BPF_LD | BPF_IMM, 1),
474 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
475 BPF_STMT(BPF_LDX | BPF_IMM, 3),
476 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
477 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
478 BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
479 BPF_STMT(BPF_RET | BPF_A, 0)
481 CLASSIC | FLAG_NO_DATA,
483 { { 0, 0xfffffffd } }
488 BPF_STMT(BPF_LD | BPF_IMM, 8),
489 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
490 BPF_STMT(BPF_MISC | BPF_TAX, 0),
491 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
492 BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
493 BPF_STMT(BPF_MISC | BPF_TAX, 0),
494 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
495 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
496 BPF_STMT(BPF_MISC | BPF_TAX, 0),
497 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
498 BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
499 BPF_STMT(BPF_MISC | BPF_TAX, 0),
500 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
501 BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
502 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
503 BPF_STMT(BPF_RET | BPF_A, 0)
505 CLASSIC | FLAG_NO_DATA,
507 { { 0, 0x20000000 } }
512 BPF_STMT(BPF_LD | BPF_IMM, 0xff),
513 BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
514 BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
515 BPF_STMT(BPF_MISC | BPF_TAX, 0),
516 BPF_STMT(BPF_LD | BPF_IMM, 0xf),
517 BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
518 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
519 BPF_STMT(BPF_RET | BPF_A, 0)
521 CLASSIC | FLAG_NO_DATA,
523 { { 0, 0x800000ff }, { 1, 0x800000ff } },
528 BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
529 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
530 BPF_STMT(BPF_RET | BPF_K, 0),
531 BPF_STMT(BPF_RET | BPF_K, 1),
540 BPF_STMT(BPF_LDX | BPF_LEN, 0),
541 BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
542 BPF_STMT(BPF_RET | BPF_K, 1)
546 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
551 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
552 BPF_STMT(BPF_RET | BPF_K, 1)
556 { { 1, 0 }, { 10, 0 }, { 60, 0 } },
561 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
562 BPF_STMT(BPF_MISC | BPF_TAX, 0),
563 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
564 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
565 BPF_STMT(BPF_RET | BPF_A, 0)
569 { { 1, 0 }, { 2, 3 } },
574 BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
575 BPF_STMT(BPF_LDX | BPF_LEN, 0),
576 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
577 BPF_STMT(BPF_MISC | BPF_TAX, 0),
578 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
579 BPF_STMT(BPF_RET | BPF_A, 0)
583 { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
588 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
589 BPF_STMT(BPF_MISC | BPF_TAX, 0),
590 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
591 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
592 BPF_STMT(BPF_RET | BPF_A, 0)
595 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
596 { { 15, 0 }, { 16, 3 } },
601 BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
602 BPF_STMT(BPF_LDX | BPF_LEN, 0),
603 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
604 BPF_STMT(BPF_MISC | BPF_TAX, 0),
605 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
606 BPF_STMT(BPF_RET | BPF_A, 0)
609 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
610 { { 14, 0 }, { 15, 1 }, { 17, 3 } },
615 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
616 SKF_AD_OFF + SKF_AD_PKTTYPE),
617 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
618 BPF_STMT(BPF_RET | BPF_K, 1),
619 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
620 SKF_AD_OFF + SKF_AD_PKTTYPE),
621 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
622 BPF_STMT(BPF_RET | BPF_K, 1),
623 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
624 SKF_AD_OFF + SKF_AD_PKTTYPE),
625 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
626 BPF_STMT(BPF_RET | BPF_K, 1),
627 BPF_STMT(BPF_RET | BPF_A, 0)
631 { { 1, 3 }, { 10, 3 } },
636 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
637 SKF_AD_OFF + SKF_AD_MARK),
638 BPF_STMT(BPF_RET | BPF_A, 0)
642 { { 1, SKB_MARK}, { 10, SKB_MARK} },
647 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
648 SKF_AD_OFF + SKF_AD_RXHASH),
649 BPF_STMT(BPF_RET | BPF_A, 0)
653 { { 1, SKB_HASH}, { 10, SKB_HASH} },
658 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
659 SKF_AD_OFF + SKF_AD_QUEUE),
660 BPF_STMT(BPF_RET | BPF_A, 0)
664 { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
669 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
670 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
671 BPF_STMT(BPF_RET | BPF_K, 0),
672 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
673 SKF_AD_OFF + SKF_AD_PROTOCOL),
674 BPF_STMT(BPF_MISC | BPF_TAX, 0),
675 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
676 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
677 BPF_STMT(BPF_RET | BPF_K, 0),
678 BPF_STMT(BPF_MISC | BPF_TXA, 0),
679 BPF_STMT(BPF_RET | BPF_A, 0)
683 { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
688 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
689 SKF_AD_OFF + SKF_AD_VLAN_TAG),
690 BPF_STMT(BPF_RET | BPF_A, 0)
695 { 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
696 { 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
700 "LD_VLAN_TAG_PRESENT",
702 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
703 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
704 BPF_STMT(BPF_RET | BPF_A, 0)
709 { 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
710 { 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
716 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
717 SKF_AD_OFF + SKF_AD_IFINDEX),
718 BPF_STMT(BPF_RET | BPF_A, 0)
722 { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
727 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
728 SKF_AD_OFF + SKF_AD_HATYPE),
729 BPF_STMT(BPF_RET | BPF_A, 0)
733 { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
738 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
739 SKF_AD_OFF + SKF_AD_CPU),
740 BPF_STMT(BPF_MISC | BPF_TAX, 0),
741 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
742 SKF_AD_OFF + SKF_AD_CPU),
743 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
744 BPF_STMT(BPF_RET | BPF_A, 0)
748 { { 1, 0 }, { 10, 0 } },
753 BPF_STMT(BPF_LDX | BPF_IMM, 2),
754 BPF_STMT(BPF_MISC | BPF_TXA, 0),
755 BPF_STMT(BPF_LDX | BPF_IMM, 3),
756 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
757 SKF_AD_OFF + SKF_AD_NLATTR),
758 BPF_STMT(BPF_RET | BPF_A, 0)
762 { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
764 { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
766 { { 4, 0 }, { 20, 6 } },
771 BPF_STMT(BPF_LD | BPF_IMM, 2),
772 BPF_STMT(BPF_LDX | BPF_IMM, 3),
773 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
774 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
775 BPF_STMT(BPF_LD | BPF_IMM, 2),
776 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
777 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
778 BPF_STMT(BPF_LD | BPF_IMM, 2),
779 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
780 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
781 BPF_STMT(BPF_LD | BPF_IMM, 2),
782 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
783 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
784 BPF_STMT(BPF_LD | BPF_IMM, 2),
785 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
786 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
787 BPF_STMT(BPF_LD | BPF_IMM, 2),
788 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
789 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
790 BPF_STMT(BPF_LD | BPF_IMM, 2),
791 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
792 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
793 BPF_STMT(BPF_LD | BPF_IMM, 2),
794 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
795 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
796 BPF_STMT(BPF_RET | BPF_A, 0)
800 { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
802 { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
804 { { 4, 0 }, { 20, 10 } },
809 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
810 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
811 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
812 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
813 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
814 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
815 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
816 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
817 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
818 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
819 BPF_STMT(BPF_RET | BPF_A, 0)
822 /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
823 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
824 * id 9737, seq 1, length 64
826 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
829 0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
830 0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
831 { { 30, 0 }, { 100, 42 } },
836 BPF_STMT(BPF_LD | BPF_IMM, 10),
837 BPF_STMT(BPF_LDX | BPF_IMM, 300),
838 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
839 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
840 BPF_STMT(BPF_RET | BPF_A, 0)
844 { { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
849 BPF_STMT(BPF_LDX | BPF_LEN, 0),
850 BPF_STMT(BPF_LD | BPF_IMM, 2),
851 BPF_STMT(BPF_ALU | BPF_RSH, 1),
852 BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
853 BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
854 BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
855 BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
856 BPF_STMT(BPF_STX, 15), /* M3 = len */
857 BPF_STMT(BPF_LDX | BPF_MEM, 1),
858 BPF_STMT(BPF_LD | BPF_MEM, 2),
859 BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
860 BPF_STMT(BPF_LDX | BPF_MEM, 15),
861 BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
862 BPF_STMT(BPF_RET | BPF_A, 0)
866 { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
871 BPF_STMT(BPF_LDX | BPF_LEN, 0),
872 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
873 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
874 BPF_STMT(BPF_RET | BPF_K, 1),
875 BPF_STMT(BPF_RET | BPF_K, MAX_K)
879 { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
884 BPF_STMT(BPF_LDX | BPF_LEN, 0),
885 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
886 BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
887 BPF_STMT(BPF_RET | BPF_K, 1),
888 BPF_STMT(BPF_RET | BPF_K, MAX_K)
892 { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
897 BPF_STMT(BPF_LDX | BPF_LEN, 0),
898 BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
899 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
900 BPF_STMT(BPF_RET | BPF_K, 10),
901 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
902 BPF_STMT(BPF_RET | BPF_K, 20),
903 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
904 BPF_STMT(BPF_RET | BPF_K, 30),
905 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
906 BPF_STMT(BPF_RET | BPF_K, 40),
907 BPF_STMT(BPF_RET | BPF_K, MAX_K)
911 { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
916 BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
917 BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
918 BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
919 BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
920 BPF_STMT(BPF_LDX | BPF_LEN, 0),
921 BPF_STMT(BPF_MISC | BPF_TXA, 0),
922 BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
923 BPF_STMT(BPF_MISC | BPF_TAX, 0),
924 BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
925 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
926 BPF_STMT(BPF_RET | BPF_K, 10),
927 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
928 BPF_STMT(BPF_RET | BPF_K, 20),
929 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
930 BPF_STMT(BPF_RET | BPF_K, 30),
931 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
932 BPF_STMT(BPF_RET | BPF_K, 30),
933 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
934 BPF_STMT(BPF_RET | BPF_K, 30),
935 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
936 BPF_STMT(BPF_RET | BPF_K, 30),
937 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
938 BPF_STMT(BPF_RET | BPF_K, 30),
939 BPF_STMT(BPF_RET | BPF_K, MAX_K)
942 { 0, 0xAA, 0x55, 1 },
943 { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
948 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
949 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
950 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
951 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
952 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
953 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
954 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
955 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
956 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
957 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
958 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
959 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
960 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
961 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
962 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
963 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
964 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
965 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
966 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
967 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
968 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
969 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
970 BPF_STMT(BPF_RET | BPF_K, 0xffff),
971 BPF_STMT(BPF_RET | BPF_K, 0),
974 /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
975 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
976 * seq 1305692979:1305693027, ack 3650467037, win 65535,
977 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
979 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
980 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
982 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
983 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
984 0x0a, 0x01, 0x01, 0x95, /* ip src */
985 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
987 0x00, 0x16 /* dst port */ },
988 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
993 /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
994 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
995 * (len > 115 or len < 30000000000)' -d
997 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
998 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
999 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
1000 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1001 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
1002 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1003 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
1004 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1005 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1006 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1007 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1008 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
1009 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
1010 BPF_STMT(BPF_ST, 1),
1011 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
1012 BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
1013 BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
1014 BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
1015 BPF_STMT(BPF_LD | BPF_MEM, 1),
1016 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
1017 BPF_STMT(BPF_ST, 5),
1018 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1019 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
1020 BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
1021 BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
1022 BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
1023 BPF_STMT(BPF_LD | BPF_MEM, 5),
1024 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
1025 BPF_STMT(BPF_LD | BPF_LEN, 0),
1026 BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
1027 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
1028 BPF_STMT(BPF_RET | BPF_K, 0xffff),
1029 BPF_STMT(BPF_RET | BPF_K, 0),
1032 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1033 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1035 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1036 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1037 0x0a, 0x01, 0x01, 0x95, /* ip src */
1038 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1040 0x00, 0x16 /* dst port */ },
1041 { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1046 /* check that unitialized X and A contain zeros */
1047 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1048 BPF_STMT(BPF_RET | BPF_A, 0)
1057 BPF_ALU64_IMM(BPF_MOV, R1, 1),
1058 BPF_ALU64_IMM(BPF_ADD, R1, 2),
1059 BPF_ALU64_IMM(BPF_MOV, R2, 3),
1060 BPF_ALU64_REG(BPF_SUB, R1, R2),
1061 BPF_ALU64_IMM(BPF_ADD, R1, -1),
1062 BPF_ALU64_IMM(BPF_MUL, R1, 3),
1063 BPF_ALU64_REG(BPF_MOV, R0, R1),
1068 { { 0, 0xfffffffd } }
1073 BPF_ALU64_IMM(BPF_MOV, R0, -1),
1074 BPF_ALU64_IMM(BPF_MOV, R1, -1),
1075 BPF_ALU64_IMM(BPF_MOV, R2, 3),
1076 BPF_ALU64_REG(BPF_MUL, R1, R2),
1077 BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
1079 BPF_ALU64_IMM(BPF_MOV, R0, 1),
1089 BPF_ALU32_IMM(BPF_MOV, R0, -1),
1090 BPF_ALU32_IMM(BPF_MOV, R1, -1),
1091 BPF_ALU32_IMM(BPF_MOV, R2, 3),
1092 BPF_ALU64_REG(BPF_MUL, R1, R2),
1093 BPF_ALU64_IMM(BPF_RSH, R1, 8),
1094 BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
1096 BPF_ALU32_IMM(BPF_MOV, R0, 1),
1106 BPF_ALU32_IMM(BPF_MOV, R0, -1),
1107 BPF_ALU64_IMM(BPF_MOV, R1, -1),
1108 BPF_ALU32_IMM(BPF_MOV, R2, 3),
1109 BPF_ALU32_REG(BPF_MUL, R1, R2),
1110 BPF_ALU64_IMM(BPF_RSH, R1, 8),
1111 BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
1113 BPF_ALU32_IMM(BPF_MOV, R0, 1),
1121 /* Have to test all register combinations, since
1122 * JITing of different registers will produce
1123 * different asm code.
1127 BPF_ALU64_IMM(BPF_MOV, R0, 0),
1128 BPF_ALU64_IMM(BPF_MOV, R1, 1),
1129 BPF_ALU64_IMM(BPF_MOV, R2, 2),
1130 BPF_ALU64_IMM(BPF_MOV, R3, 3),
1131 BPF_ALU64_IMM(BPF_MOV, R4, 4),
1132 BPF_ALU64_IMM(BPF_MOV, R5, 5),
1133 BPF_ALU64_IMM(BPF_MOV, R6, 6),
1134 BPF_ALU64_IMM(BPF_MOV, R7, 7),
1135 BPF_ALU64_IMM(BPF_MOV, R8, 8),
1136 BPF_ALU64_IMM(BPF_MOV, R9, 9),
1137 BPF_ALU64_IMM(BPF_ADD, R0, 20),
1138 BPF_ALU64_IMM(BPF_ADD, R1, 20),
1139 BPF_ALU64_IMM(BPF_ADD, R2, 20),
1140 BPF_ALU64_IMM(BPF_ADD, R3, 20),
1141 BPF_ALU64_IMM(BPF_ADD, R4, 20),
1142 BPF_ALU64_IMM(BPF_ADD, R5, 20),
1143 BPF_ALU64_IMM(BPF_ADD, R6, 20),
1144 BPF_ALU64_IMM(BPF_ADD, R7, 20),
1145 BPF_ALU64_IMM(BPF_ADD, R8, 20),
1146 BPF_ALU64_IMM(BPF_ADD, R9, 20),
1147 BPF_ALU64_IMM(BPF_SUB, R0, 10),
1148 BPF_ALU64_IMM(BPF_SUB, R1, 10),
1149 BPF_ALU64_IMM(BPF_SUB, R2, 10),
1150 BPF_ALU64_IMM(BPF_SUB, R3, 10),
1151 BPF_ALU64_IMM(BPF_SUB, R4, 10),
1152 BPF_ALU64_IMM(BPF_SUB, R5, 10),
1153 BPF_ALU64_IMM(BPF_SUB, R6, 10),
1154 BPF_ALU64_IMM(BPF_SUB, R7, 10),
1155 BPF_ALU64_IMM(BPF_SUB, R8, 10),
1156 BPF_ALU64_IMM(BPF_SUB, R9, 10),
1157 BPF_ALU64_REG(BPF_ADD, R0, R0),
1158 BPF_ALU64_REG(BPF_ADD, R0, R1),
1159 BPF_ALU64_REG(BPF_ADD, R0, R2),
1160 BPF_ALU64_REG(BPF_ADD, R0, R3),
1161 BPF_ALU64_REG(BPF_ADD, R0, R4),
1162 BPF_ALU64_REG(BPF_ADD, R0, R5),
1163 BPF_ALU64_REG(BPF_ADD, R0, R6),
1164 BPF_ALU64_REG(BPF_ADD, R0, R7),
1165 BPF_ALU64_REG(BPF_ADD, R0, R8),
1166 BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1167 BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1169 BPF_ALU64_REG(BPF_ADD, R1, R0),
1170 BPF_ALU64_REG(BPF_ADD, R1, R1),
1171 BPF_ALU64_REG(BPF_ADD, R1, R2),
1172 BPF_ALU64_REG(BPF_ADD, R1, R3),
1173 BPF_ALU64_REG(BPF_ADD, R1, R4),
1174 BPF_ALU64_REG(BPF_ADD, R1, R5),
1175 BPF_ALU64_REG(BPF_ADD, R1, R6),
1176 BPF_ALU64_REG(BPF_ADD, R1, R7),
1177 BPF_ALU64_REG(BPF_ADD, R1, R8),
1178 BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1179 BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1181 BPF_ALU64_REG(BPF_ADD, R2, R0),
1182 BPF_ALU64_REG(BPF_ADD, R2, R1),
1183 BPF_ALU64_REG(BPF_ADD, R2, R2),
1184 BPF_ALU64_REG(BPF_ADD, R2, R3),
1185 BPF_ALU64_REG(BPF_ADD, R2, R4),
1186 BPF_ALU64_REG(BPF_ADD, R2, R5),
1187 BPF_ALU64_REG(BPF_ADD, R2, R6),
1188 BPF_ALU64_REG(BPF_ADD, R2, R7),
1189 BPF_ALU64_REG(BPF_ADD, R2, R8),
1190 BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1191 BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1193 BPF_ALU64_REG(BPF_ADD, R3, R0),
1194 BPF_ALU64_REG(BPF_ADD, R3, R1),
1195 BPF_ALU64_REG(BPF_ADD, R3, R2),
1196 BPF_ALU64_REG(BPF_ADD, R3, R3),
1197 BPF_ALU64_REG(BPF_ADD, R3, R4),
1198 BPF_ALU64_REG(BPF_ADD, R3, R5),
1199 BPF_ALU64_REG(BPF_ADD, R3, R6),
1200 BPF_ALU64_REG(BPF_ADD, R3, R7),
1201 BPF_ALU64_REG(BPF_ADD, R3, R8),
1202 BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1203 BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1205 BPF_ALU64_REG(BPF_ADD, R4, R0),
1206 BPF_ALU64_REG(BPF_ADD, R4, R1),
1207 BPF_ALU64_REG(BPF_ADD, R4, R2),
1208 BPF_ALU64_REG(BPF_ADD, R4, R3),
1209 BPF_ALU64_REG(BPF_ADD, R4, R4),
1210 BPF_ALU64_REG(BPF_ADD, R4, R5),
1211 BPF_ALU64_REG(BPF_ADD, R4, R6),
1212 BPF_ALU64_REG(BPF_ADD, R4, R7),
1213 BPF_ALU64_REG(BPF_ADD, R4, R8),
1214 BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1215 BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1217 BPF_ALU64_REG(BPF_ADD, R5, R0),
1218 BPF_ALU64_REG(BPF_ADD, R5, R1),
1219 BPF_ALU64_REG(BPF_ADD, R5, R2),
1220 BPF_ALU64_REG(BPF_ADD, R5, R3),
1221 BPF_ALU64_REG(BPF_ADD, R5, R4),
1222 BPF_ALU64_REG(BPF_ADD, R5, R5),
1223 BPF_ALU64_REG(BPF_ADD, R5, R6),
1224 BPF_ALU64_REG(BPF_ADD, R5, R7),
1225 BPF_ALU64_REG(BPF_ADD, R5, R8),
1226 BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1227 BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1229 BPF_ALU64_REG(BPF_ADD, R6, R0),
1230 BPF_ALU64_REG(BPF_ADD, R6, R1),
1231 BPF_ALU64_REG(BPF_ADD, R6, R2),
1232 BPF_ALU64_REG(BPF_ADD, R6, R3),
1233 BPF_ALU64_REG(BPF_ADD, R6, R4),
1234 BPF_ALU64_REG(BPF_ADD, R6, R5),
1235 BPF_ALU64_REG(BPF_ADD, R6, R6),
1236 BPF_ALU64_REG(BPF_ADD, R6, R7),
1237 BPF_ALU64_REG(BPF_ADD, R6, R8),
1238 BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1239 BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1241 BPF_ALU64_REG(BPF_ADD, R7, R0),
1242 BPF_ALU64_REG(BPF_ADD, R7, R1),
1243 BPF_ALU64_REG(BPF_ADD, R7, R2),
1244 BPF_ALU64_REG(BPF_ADD, R7, R3),
1245 BPF_ALU64_REG(BPF_ADD, R7, R4),
1246 BPF_ALU64_REG(BPF_ADD, R7, R5),
1247 BPF_ALU64_REG(BPF_ADD, R7, R6),
1248 BPF_ALU64_REG(BPF_ADD, R7, R7),
1249 BPF_ALU64_REG(BPF_ADD, R7, R8),
1250 BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1251 BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1253 BPF_ALU64_REG(BPF_ADD, R8, R0),
1254 BPF_ALU64_REG(BPF_ADD, R8, R1),
1255 BPF_ALU64_REG(BPF_ADD, R8, R2),
1256 BPF_ALU64_REG(BPF_ADD, R8, R3),
1257 BPF_ALU64_REG(BPF_ADD, R8, R4),
1258 BPF_ALU64_REG(BPF_ADD, R8, R5),
1259 BPF_ALU64_REG(BPF_ADD, R8, R6),
1260 BPF_ALU64_REG(BPF_ADD, R8, R7),
1261 BPF_ALU64_REG(BPF_ADD, R8, R8),
1262 BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1263 BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1265 BPF_ALU64_REG(BPF_ADD, R9, R0),
1266 BPF_ALU64_REG(BPF_ADD, R9, R1),
1267 BPF_ALU64_REG(BPF_ADD, R9, R2),
1268 BPF_ALU64_REG(BPF_ADD, R9, R3),
1269 BPF_ALU64_REG(BPF_ADD, R9, R4),
1270 BPF_ALU64_REG(BPF_ADD, R9, R5),
1271 BPF_ALU64_REG(BPF_ADD, R9, R6),
1272 BPF_ALU64_REG(BPF_ADD, R9, R7),
1273 BPF_ALU64_REG(BPF_ADD, R9, R8),
1274 BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1275 BPF_ALU64_REG(BPF_MOV, R0, R9),
1285 BPF_ALU32_IMM(BPF_MOV, R0, 20),
1286 BPF_ALU32_IMM(BPF_MOV, R1, 1),
1287 BPF_ALU32_IMM(BPF_MOV, R2, 2),
1288 BPF_ALU32_IMM(BPF_MOV, R3, 3),
1289 BPF_ALU32_IMM(BPF_MOV, R4, 4),
1290 BPF_ALU32_IMM(BPF_MOV, R5, 5),
1291 BPF_ALU32_IMM(BPF_MOV, R6, 6),
1292 BPF_ALU32_IMM(BPF_MOV, R7, 7),
1293 BPF_ALU32_IMM(BPF_MOV, R8, 8),
1294 BPF_ALU32_IMM(BPF_MOV, R9, 9),
1295 BPF_ALU64_IMM(BPF_ADD, R1, 10),
1296 BPF_ALU64_IMM(BPF_ADD, R2, 10),
1297 BPF_ALU64_IMM(BPF_ADD, R3, 10),
1298 BPF_ALU64_IMM(BPF_ADD, R4, 10),
1299 BPF_ALU64_IMM(BPF_ADD, R5, 10),
1300 BPF_ALU64_IMM(BPF_ADD, R6, 10),
1301 BPF_ALU64_IMM(BPF_ADD, R7, 10),
1302 BPF_ALU64_IMM(BPF_ADD, R8, 10),
1303 BPF_ALU64_IMM(BPF_ADD, R9, 10),
1304 BPF_ALU32_REG(BPF_ADD, R0, R1),
1305 BPF_ALU32_REG(BPF_ADD, R0, R2),
1306 BPF_ALU32_REG(BPF_ADD, R0, R3),
1307 BPF_ALU32_REG(BPF_ADD, R0, R4),
1308 BPF_ALU32_REG(BPF_ADD, R0, R5),
1309 BPF_ALU32_REG(BPF_ADD, R0, R6),
1310 BPF_ALU32_REG(BPF_ADD, R0, R7),
1311 BPF_ALU32_REG(BPF_ADD, R0, R8),
1312 BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1313 BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1315 BPF_ALU32_REG(BPF_ADD, R1, R0),
1316 BPF_ALU32_REG(BPF_ADD, R1, R1),
1317 BPF_ALU32_REG(BPF_ADD, R1, R2),
1318 BPF_ALU32_REG(BPF_ADD, R1, R3),
1319 BPF_ALU32_REG(BPF_ADD, R1, R4),
1320 BPF_ALU32_REG(BPF_ADD, R1, R5),
1321 BPF_ALU32_REG(BPF_ADD, R1, R6),
1322 BPF_ALU32_REG(BPF_ADD, R1, R7),
1323 BPF_ALU32_REG(BPF_ADD, R1, R8),
1324 BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1325 BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1327 BPF_ALU32_REG(BPF_ADD, R2, R0),
1328 BPF_ALU32_REG(BPF_ADD, R2, R1),
1329 BPF_ALU32_REG(BPF_ADD, R2, R2),
1330 BPF_ALU32_REG(BPF_ADD, R2, R3),
1331 BPF_ALU32_REG(BPF_ADD, R2, R4),
1332 BPF_ALU32_REG(BPF_ADD, R2, R5),
1333 BPF_ALU32_REG(BPF_ADD, R2, R6),
1334 BPF_ALU32_REG(BPF_ADD, R2, R7),
1335 BPF_ALU32_REG(BPF_ADD, R2, R8),
1336 BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1337 BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1339 BPF_ALU32_REG(BPF_ADD, R3, R0),
1340 BPF_ALU32_REG(BPF_ADD, R3, R1),
1341 BPF_ALU32_REG(BPF_ADD, R3, R2),
1342 BPF_ALU32_REG(BPF_ADD, R3, R3),
1343 BPF_ALU32_REG(BPF_ADD, R3, R4),
1344 BPF_ALU32_REG(BPF_ADD, R3, R5),
1345 BPF_ALU32_REG(BPF_ADD, R3, R6),
1346 BPF_ALU32_REG(BPF_ADD, R3, R7),
1347 BPF_ALU32_REG(BPF_ADD, R3, R8),
1348 BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1349 BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1351 BPF_ALU32_REG(BPF_ADD, R4, R0),
1352 BPF_ALU32_REG(BPF_ADD, R4, R1),
1353 BPF_ALU32_REG(BPF_ADD, R4, R2),
1354 BPF_ALU32_REG(BPF_ADD, R4, R3),
1355 BPF_ALU32_REG(BPF_ADD, R4, R4),
1356 BPF_ALU32_REG(BPF_ADD, R4, R5),
1357 BPF_ALU32_REG(BPF_ADD, R4, R6),
1358 BPF_ALU32_REG(BPF_ADD, R4, R7),
1359 BPF_ALU32_REG(BPF_ADD, R4, R8),
1360 BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1361 BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1363 BPF_ALU32_REG(BPF_ADD, R5, R0),
1364 BPF_ALU32_REG(BPF_ADD, R5, R1),
1365 BPF_ALU32_REG(BPF_ADD, R5, R2),
1366 BPF_ALU32_REG(BPF_ADD, R5, R3),
1367 BPF_ALU32_REG(BPF_ADD, R5, R4),
1368 BPF_ALU32_REG(BPF_ADD, R5, R5),
1369 BPF_ALU32_REG(BPF_ADD, R5, R6),
1370 BPF_ALU32_REG(BPF_ADD, R5, R7),
1371 BPF_ALU32_REG(BPF_ADD, R5, R8),
1372 BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1373 BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1375 BPF_ALU32_REG(BPF_ADD, R6, R0),
1376 BPF_ALU32_REG(BPF_ADD, R6, R1),
1377 BPF_ALU32_REG(BPF_ADD, R6, R2),
1378 BPF_ALU32_REG(BPF_ADD, R6, R3),
1379 BPF_ALU32_REG(BPF_ADD, R6, R4),
1380 BPF_ALU32_REG(BPF_ADD, R6, R5),
1381 BPF_ALU32_REG(BPF_ADD, R6, R6),
1382 BPF_ALU32_REG(BPF_ADD, R6, R7),
1383 BPF_ALU32_REG(BPF_ADD, R6, R8),
1384 BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1385 BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1387 BPF_ALU32_REG(BPF_ADD, R7, R0),
1388 BPF_ALU32_REG(BPF_ADD, R7, R1),
1389 BPF_ALU32_REG(BPF_ADD, R7, R2),
1390 BPF_ALU32_REG(BPF_ADD, R7, R3),
1391 BPF_ALU32_REG(BPF_ADD, R7, R4),
1392 BPF_ALU32_REG(BPF_ADD, R7, R5),
1393 BPF_ALU32_REG(BPF_ADD, R7, R6),
1394 BPF_ALU32_REG(BPF_ADD, R7, R7),
1395 BPF_ALU32_REG(BPF_ADD, R7, R8),
1396 BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1397 BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1399 BPF_ALU32_REG(BPF_ADD, R8, R0),
1400 BPF_ALU32_REG(BPF_ADD, R8, R1),
1401 BPF_ALU32_REG(BPF_ADD, R8, R2),
1402 BPF_ALU32_REG(BPF_ADD, R8, R3),
1403 BPF_ALU32_REG(BPF_ADD, R8, R4),
1404 BPF_ALU32_REG(BPF_ADD, R8, R5),
1405 BPF_ALU32_REG(BPF_ADD, R8, R6),
1406 BPF_ALU32_REG(BPF_ADD, R8, R7),
1407 BPF_ALU32_REG(BPF_ADD, R8, R8),
1408 BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1409 BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1411 BPF_ALU32_REG(BPF_ADD, R9, R0),
1412 BPF_ALU32_REG(BPF_ADD, R9, R1),
1413 BPF_ALU32_REG(BPF_ADD, R9, R2),
1414 BPF_ALU32_REG(BPF_ADD, R9, R3),
1415 BPF_ALU32_REG(BPF_ADD, R9, R4),
1416 BPF_ALU32_REG(BPF_ADD, R9, R5),
1417 BPF_ALU32_REG(BPF_ADD, R9, R6),
1418 BPF_ALU32_REG(BPF_ADD, R9, R7),
1419 BPF_ALU32_REG(BPF_ADD, R9, R8),
1420 BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1421 BPF_ALU32_REG(BPF_MOV, R0, R9),
1428 { /* Mainly checking JIT here. */
1431 BPF_ALU64_IMM(BPF_MOV, R0, 0),
1432 BPF_ALU64_IMM(BPF_MOV, R1, 1),
1433 BPF_ALU64_IMM(BPF_MOV, R2, 2),
1434 BPF_ALU64_IMM(BPF_MOV, R3, 3),
1435 BPF_ALU64_IMM(BPF_MOV, R4, 4),
1436 BPF_ALU64_IMM(BPF_MOV, R5, 5),
1437 BPF_ALU64_IMM(BPF_MOV, R6, 6),
1438 BPF_ALU64_IMM(BPF_MOV, R7, 7),
1439 BPF_ALU64_IMM(BPF_MOV, R8, 8),
1440 BPF_ALU64_IMM(BPF_MOV, R9, 9),
1441 BPF_ALU64_REG(BPF_SUB, R0, R0),
1442 BPF_ALU64_REG(BPF_SUB, R0, R1),
1443 BPF_ALU64_REG(BPF_SUB, R0, R2),
1444 BPF_ALU64_REG(BPF_SUB, R0, R3),
1445 BPF_ALU64_REG(BPF_SUB, R0, R4),
1446 BPF_ALU64_REG(BPF_SUB, R0, R5),
1447 BPF_ALU64_REG(BPF_SUB, R0, R6),
1448 BPF_ALU64_REG(BPF_SUB, R0, R7),
1449 BPF_ALU64_REG(BPF_SUB, R0, R8),
1450 BPF_ALU64_REG(BPF_SUB, R0, R9),
1451 BPF_ALU64_IMM(BPF_SUB, R0, 10),
1452 BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1454 BPF_ALU64_REG(BPF_SUB, R1, R0),
1455 BPF_ALU64_REG(BPF_SUB, R1, R2),
1456 BPF_ALU64_REG(BPF_SUB, R1, R3),
1457 BPF_ALU64_REG(BPF_SUB, R1, R4),
1458 BPF_ALU64_REG(BPF_SUB, R1, R5),
1459 BPF_ALU64_REG(BPF_SUB, R1, R6),
1460 BPF_ALU64_REG(BPF_SUB, R1, R7),
1461 BPF_ALU64_REG(BPF_SUB, R1, R8),
1462 BPF_ALU64_REG(BPF_SUB, R1, R9),
1463 BPF_ALU64_IMM(BPF_SUB, R1, 10),
1464 BPF_ALU64_REG(BPF_SUB, R2, R0),
1465 BPF_ALU64_REG(BPF_SUB, R2, R1),
1466 BPF_ALU64_REG(BPF_SUB, R2, R3),
1467 BPF_ALU64_REG(BPF_SUB, R2, R4),
1468 BPF_ALU64_REG(BPF_SUB, R2, R5),
1469 BPF_ALU64_REG(BPF_SUB, R2, R6),
1470 BPF_ALU64_REG(BPF_SUB, R2, R7),
1471 BPF_ALU64_REG(BPF_SUB, R2, R8),
1472 BPF_ALU64_REG(BPF_SUB, R2, R9),
1473 BPF_ALU64_IMM(BPF_SUB, R2, 10),
1474 BPF_ALU64_REG(BPF_SUB, R3, R0),
1475 BPF_ALU64_REG(BPF_SUB, R3, R1),
1476 BPF_ALU64_REG(BPF_SUB, R3, R2),
1477 BPF_ALU64_REG(BPF_SUB, R3, R4),
1478 BPF_ALU64_REG(BPF_SUB, R3, R5),
1479 BPF_ALU64_REG(BPF_SUB, R3, R6),
1480 BPF_ALU64_REG(BPF_SUB, R3, R7),
1481 BPF_ALU64_REG(BPF_SUB, R3, R8),
1482 BPF_ALU64_REG(BPF_SUB, R3, R9),
1483 BPF_ALU64_IMM(BPF_SUB, R3, 10),
1484 BPF_ALU64_REG(BPF_SUB, R4, R0),
1485 BPF_ALU64_REG(BPF_SUB, R4, R1),
1486 BPF_ALU64_REG(BPF_SUB, R4, R2),
1487 BPF_ALU64_REG(BPF_SUB, R4, R3),
1488 BPF_ALU64_REG(BPF_SUB, R4, R5),
1489 BPF_ALU64_REG(BPF_SUB, R4, R6),
1490 BPF_ALU64_REG(BPF_SUB, R4, R7),
1491 BPF_ALU64_REG(BPF_SUB, R4, R8),
1492 BPF_ALU64_REG(BPF_SUB, R4, R9),
1493 BPF_ALU64_IMM(BPF_SUB, R4, 10),
1494 BPF_ALU64_REG(BPF_SUB, R5, R0),
1495 BPF_ALU64_REG(BPF_SUB, R5, R1),
1496 BPF_ALU64_REG(BPF_SUB, R5, R2),
1497 BPF_ALU64_REG(BPF_SUB, R5, R3),
1498 BPF_ALU64_REG(BPF_SUB, R5, R4),
1499 BPF_ALU64_REG(BPF_SUB, R5, R6),
1500 BPF_ALU64_REG(BPF_SUB, R5, R7),
1501 BPF_ALU64_REG(BPF_SUB, R5, R8),
1502 BPF_ALU64_REG(BPF_SUB, R5, R9),
1503 BPF_ALU64_IMM(BPF_SUB, R5, 10),
1504 BPF_ALU64_REG(BPF_SUB, R6, R0),
1505 BPF_ALU64_REG(BPF_SUB, R6, R1),
1506 BPF_ALU64_REG(BPF_SUB, R6, R2),
1507 BPF_ALU64_REG(BPF_SUB, R6, R3),
1508 BPF_ALU64_REG(BPF_SUB, R6, R4),
1509 BPF_ALU64_REG(BPF_SUB, R6, R5),
1510 BPF_ALU64_REG(BPF_SUB, R6, R7),
1511 BPF_ALU64_REG(BPF_SUB, R6, R8),
1512 BPF_ALU64_REG(BPF_SUB, R6, R9),
1513 BPF_ALU64_IMM(BPF_SUB, R6, 10),
1514 BPF_ALU64_REG(BPF_SUB, R7, R0),
1515 BPF_ALU64_REG(BPF_SUB, R7, R1),
1516 BPF_ALU64_REG(BPF_SUB, R7, R2),
1517 BPF_ALU64_REG(BPF_SUB, R7, R3),
1518 BPF_ALU64_REG(BPF_SUB, R7, R4),
1519 BPF_ALU64_REG(BPF_SUB, R7, R5),
1520 BPF_ALU64_REG(BPF_SUB, R7, R6),
1521 BPF_ALU64_REG(BPF_SUB, R7, R8),
1522 BPF_ALU64_REG(BPF_SUB, R7, R9),
1523 BPF_ALU64_IMM(BPF_SUB, R7, 10),
1524 BPF_ALU64_REG(BPF_SUB, R8, R0),
1525 BPF_ALU64_REG(BPF_SUB, R8, R1),
1526 BPF_ALU64_REG(BPF_SUB, R8, R2),
1527 BPF_ALU64_REG(BPF_SUB, R8, R3),
1528 BPF_ALU64_REG(BPF_SUB, R8, R4),
1529 BPF_ALU64_REG(BPF_SUB, R8, R5),
1530 BPF_ALU64_REG(BPF_SUB, R8, R6),
1531 BPF_ALU64_REG(BPF_SUB, R8, R7),
1532 BPF_ALU64_REG(BPF_SUB, R8, R9),
1533 BPF_ALU64_IMM(BPF_SUB, R8, 10),
1534 BPF_ALU64_REG(BPF_SUB, R9, R0),
1535 BPF_ALU64_REG(BPF_SUB, R9, R1),
1536 BPF_ALU64_REG(BPF_SUB, R9, R2),
1537 BPF_ALU64_REG(BPF_SUB, R9, R3),
1538 BPF_ALU64_REG(BPF_SUB, R9, R4),
1539 BPF_ALU64_REG(BPF_SUB, R9, R5),
1540 BPF_ALU64_REG(BPF_SUB, R9, R6),
1541 BPF_ALU64_REG(BPF_SUB, R9, R7),
1542 BPF_ALU64_REG(BPF_SUB, R9, R8),
1543 BPF_ALU64_IMM(BPF_SUB, R9, 10),
1544 BPF_ALU64_IMM(BPF_SUB, R0, 10),
1545 BPF_ALU64_IMM(BPF_NEG, R0, 0),
1546 BPF_ALU64_REG(BPF_SUB, R0, R1),
1547 BPF_ALU64_REG(BPF_SUB, R0, R2),
1548 BPF_ALU64_REG(BPF_SUB, R0, R3),
1549 BPF_ALU64_REG(BPF_SUB, R0, R4),
1550 BPF_ALU64_REG(BPF_SUB, R0, R5),
1551 BPF_ALU64_REG(BPF_SUB, R0, R6),
1552 BPF_ALU64_REG(BPF_SUB, R0, R7),
1553 BPF_ALU64_REG(BPF_SUB, R0, R8),
1554 BPF_ALU64_REG(BPF_SUB, R0, R9),
1561 { /* Mainly checking JIT here. */
1564 BPF_ALU64_REG(BPF_SUB, R0, R0),
1565 BPF_ALU64_REG(BPF_XOR, R1, R1),
1566 BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1568 BPF_ALU64_IMM(BPF_MOV, R0, 10),
1569 BPF_ALU64_IMM(BPF_MOV, R1, -1),
1570 BPF_ALU64_REG(BPF_SUB, R1, R1),
1571 BPF_ALU64_REG(BPF_XOR, R2, R2),
1572 BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1574 BPF_ALU64_REG(BPF_SUB, R2, R2),
1575 BPF_ALU64_REG(BPF_XOR, R3, R3),
1576 BPF_ALU64_IMM(BPF_MOV, R0, 10),
1577 BPF_ALU64_IMM(BPF_MOV, R1, -1),
1578 BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1580 BPF_ALU64_REG(BPF_SUB, R3, R3),
1581 BPF_ALU64_REG(BPF_XOR, R4, R4),
1582 BPF_ALU64_IMM(BPF_MOV, R2, 1),
1583 BPF_ALU64_IMM(BPF_MOV, R5, -1),
1584 BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1586 BPF_ALU64_REG(BPF_SUB, R4, R4),
1587 BPF_ALU64_REG(BPF_XOR, R5, R5),
1588 BPF_ALU64_IMM(BPF_MOV, R3, 1),
1589 BPF_ALU64_IMM(BPF_MOV, R7, -1),
1590 BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1592 BPF_ALU64_IMM(BPF_MOV, R5, 1),
1593 BPF_ALU64_REG(BPF_SUB, R5, R5),
1594 BPF_ALU64_REG(BPF_XOR, R6, R6),
1595 BPF_ALU64_IMM(BPF_MOV, R1, 1),
1596 BPF_ALU64_IMM(BPF_MOV, R8, -1),
1597 BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1599 BPF_ALU64_REG(BPF_SUB, R6, R6),
1600 BPF_ALU64_REG(BPF_XOR, R7, R7),
1601 BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1603 BPF_ALU64_REG(BPF_SUB, R7, R7),
1604 BPF_ALU64_REG(BPF_XOR, R8, R8),
1605 BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1607 BPF_ALU64_REG(BPF_SUB, R8, R8),
1608 BPF_ALU64_REG(BPF_XOR, R9, R9),
1609 BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1611 BPF_ALU64_REG(BPF_SUB, R9, R9),
1612 BPF_ALU64_REG(BPF_XOR, R0, R0),
1613 BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1615 BPF_ALU64_REG(BPF_SUB, R1, R1),
1616 BPF_ALU64_REG(BPF_XOR, R0, R0),
1617 BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1618 BPF_ALU64_IMM(BPF_MOV, R0, 0),
1620 BPF_ALU64_IMM(BPF_MOV, R0, 1),
1627 { /* Mainly checking JIT here. */
1630 BPF_ALU64_IMM(BPF_MOV, R0, 11),
1631 BPF_ALU64_IMM(BPF_MOV, R1, 1),
1632 BPF_ALU64_IMM(BPF_MOV, R2, 2),
1633 BPF_ALU64_IMM(BPF_MOV, R3, 3),
1634 BPF_ALU64_IMM(BPF_MOV, R4, 4),
1635 BPF_ALU64_IMM(BPF_MOV, R5, 5),
1636 BPF_ALU64_IMM(BPF_MOV, R6, 6),
1637 BPF_ALU64_IMM(BPF_MOV, R7, 7),
1638 BPF_ALU64_IMM(BPF_MOV, R8, 8),
1639 BPF_ALU64_IMM(BPF_MOV, R9, 9),
1640 BPF_ALU64_REG(BPF_MUL, R0, R0),
1641 BPF_ALU64_REG(BPF_MUL, R0, R1),
1642 BPF_ALU64_REG(BPF_MUL, R0, R2),
1643 BPF_ALU64_REG(BPF_MUL, R0, R3),
1644 BPF_ALU64_REG(BPF_MUL, R0, R4),
1645 BPF_ALU64_REG(BPF_MUL, R0, R5),
1646 BPF_ALU64_REG(BPF_MUL, R0, R6),
1647 BPF_ALU64_REG(BPF_MUL, R0, R7),
1648 BPF_ALU64_REG(BPF_MUL, R0, R8),
1649 BPF_ALU64_REG(BPF_MUL, R0, R9),
1650 BPF_ALU64_IMM(BPF_MUL, R0, 10),
1651 BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1653 BPF_ALU64_REG(BPF_MUL, R1, R0),
1654 BPF_ALU64_REG(BPF_MUL, R1, R2),
1655 BPF_ALU64_REG(BPF_MUL, R1, R3),
1656 BPF_ALU64_REG(BPF_MUL, R1, R4),
1657 BPF_ALU64_REG(BPF_MUL, R1, R5),
1658 BPF_ALU64_REG(BPF_MUL, R1, R6),
1659 BPF_ALU64_REG(BPF_MUL, R1, R7),
1660 BPF_ALU64_REG(BPF_MUL, R1, R8),
1661 BPF_ALU64_REG(BPF_MUL, R1, R9),
1662 BPF_ALU64_IMM(BPF_MUL, R1, 10),
1663 BPF_ALU64_REG(BPF_MOV, R2, R1),
1664 BPF_ALU64_IMM(BPF_RSH, R2, 32),
1665 BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1667 BPF_ALU64_IMM(BPF_LSH, R1, 32),
1668 BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1669 BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1671 BPF_ALU64_REG(BPF_MUL, R2, R0),
1672 BPF_ALU64_REG(BPF_MUL, R2, R1),
1673 BPF_ALU64_REG(BPF_MUL, R2, R3),
1674 BPF_ALU64_REG(BPF_MUL, R2, R4),
1675 BPF_ALU64_REG(BPF_MUL, R2, R5),
1676 BPF_ALU64_REG(BPF_MUL, R2, R6),
1677 BPF_ALU64_REG(BPF_MUL, R2, R7),
1678 BPF_ALU64_REG(BPF_MUL, R2, R8),
1679 BPF_ALU64_REG(BPF_MUL, R2, R9),
1680 BPF_ALU64_IMM(BPF_MUL, R2, 10),
1681 BPF_ALU64_IMM(BPF_RSH, R2, 32),
1682 BPF_ALU64_REG(BPF_MOV, R0, R2),
1687 { { 0, 0x35d97ef2 } }
1692 BPF_ALU64_IMM(BPF_MOV, R0, 11),
1693 BPF_ALU64_IMM(BPF_ADD, R0, -1),
1694 BPF_ALU64_IMM(BPF_MOV, R2, 2),
1695 BPF_ALU64_IMM(BPF_XOR, R2, 3),
1696 BPF_ALU64_REG(BPF_DIV, R0, R2),
1697 BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1699 BPF_ALU64_IMM(BPF_MOD, R0, 3),
1700 BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1702 BPF_ALU64_IMM(BPF_MOV, R0, -1),
1710 "INT: shifts by register",
1712 BPF_MOV64_IMM(R0, -1234),
1713 BPF_MOV64_IMM(R1, 1),
1714 BPF_ALU32_REG(BPF_RSH, R0, R1),
1715 BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1717 BPF_MOV64_IMM(R2, 1),
1718 BPF_ALU64_REG(BPF_LSH, R0, R2),
1719 BPF_MOV32_IMM(R4, -1234),
1720 BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1722 BPF_ALU64_IMM(BPF_AND, R4, 63),
1723 BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1724 BPF_MOV64_IMM(R3, 47),
1725 BPF_ALU64_REG(BPF_ARSH, R0, R3),
1726 BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1728 BPF_MOV64_IMM(R2, 1),
1729 BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1730 BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1732 BPF_MOV64_IMM(R4, 4),
1733 BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1734 BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1736 BPF_MOV64_IMM(R4, 5),
1737 BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1738 BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1740 BPF_MOV64_IMM(R0, -1),
1750 BPF_ALU64_REG(BPF_MOV, R6, R1),
1751 BPF_LD_ABS(BPF_B, 3),
1752 BPF_ALU64_IMM(BPF_MOV, R2, 2),
1753 BPF_ALU32_REG(BPF_DIV, R0, R2),
1754 BPF_ALU64_REG(BPF_MOV, R8, R0),
1755 BPF_LD_ABS(BPF_B, 4),
1756 BPF_ALU64_REG(BPF_ADD, R8, R0),
1757 BPF_LD_IND(BPF_B, R8, -70),
1761 { 10, 20, 30, 40, 50 },
1762 { { 4, 0 }, { 5, 10 } }
1767 BPF_ALU64_REG(BPF_MOV, R6, R1),
1768 BPF_ALU64_IMM(BPF_MOV, R7, 0),
1769 BPF_LD_ABS(BPF_B, 3),
1770 BPF_ALU32_REG(BPF_DIV, R0, R7),
1774 { 10, 20, 30, 40, 50 },
1775 { { 3, 0 }, { 4, 0 } }
1778 "check: missing ret",
1780 BPF_STMT(BPF_LD | BPF_IMM, 1),
1782 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1785 .fill_helper = NULL,
1786 .expected_errcode = -EINVAL,
1791 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
1792 BPF_STMT(BPF_RET | BPF_K, 0)
1794 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1797 .fill_helper = NULL,
1798 .expected_errcode = -EINVAL,
1801 "check: unknown insn",
1803 /* seccomp insn, rejected in socket filter */
1804 BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
1805 BPF_STMT(BPF_RET | BPF_K, 0)
1807 CLASSIC | FLAG_EXPECTED_FAIL,
1810 .fill_helper = NULL,
1811 .expected_errcode = -EINVAL,
1814 "check: out of range spill/fill",
1816 BPF_STMT(BPF_STX, 16),
1817 BPF_STMT(BPF_RET | BPF_K, 0)
1819 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1822 .fill_helper = NULL,
1823 .expected_errcode = -EINVAL,
1828 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1829 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
1830 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1831 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1832 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1833 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1834 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1835 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1836 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1837 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1838 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1839 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1840 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1841 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1842 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1843 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
1844 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1845 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
1846 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1847 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1848 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1849 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1850 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1851 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1852 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1853 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1854 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1855 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1856 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1857 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1858 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1859 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1860 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1861 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1862 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
1863 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
1864 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1865 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1866 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1867 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1868 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1869 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1870 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1871 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1872 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1873 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1874 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1875 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1876 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1877 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1878 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1879 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1880 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
1881 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
1882 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1883 BPF_STMT(BPF_RET | BPF_A, 0),
1884 BPF_STMT(BPF_RET | BPF_A, 0),
1887 { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
1888 0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
1890 0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
1891 0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
1892 0xc0, 0xa8, 0x33, 0x01,
1893 0xc0, 0xa8, 0x33, 0x02,
1896 0x00, 0x14, 0x00, 0x00,
1897 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1898 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1899 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1900 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1901 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1902 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1903 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1904 0xcc, 0xcc, 0xcc, 0xcc },
1910 BPF_STMT(BPF_RET | BPF_X, 0),
1912 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1915 .fill_helper = NULL,
1916 .expected_errcode = -EINVAL,
1919 "check: LDX + RET X",
1921 BPF_STMT(BPF_LDX | BPF_IMM, 42),
1922 BPF_STMT(BPF_RET | BPF_X, 0),
1924 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1927 .fill_helper = NULL,
1928 .expected_errcode = -EINVAL,
1930 { /* Mainly checking JIT here. */
1931 "M[]: alt STX + LDX",
1933 BPF_STMT(BPF_LDX | BPF_IMM, 100),
1934 BPF_STMT(BPF_STX, 0),
1935 BPF_STMT(BPF_LDX | BPF_MEM, 0),
1936 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1937 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1938 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1939 BPF_STMT(BPF_STX, 1),
1940 BPF_STMT(BPF_LDX | BPF_MEM, 1),
1941 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1942 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1943 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1944 BPF_STMT(BPF_STX, 2),
1945 BPF_STMT(BPF_LDX | BPF_MEM, 2),
1946 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1947 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1948 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1949 BPF_STMT(BPF_STX, 3),
1950 BPF_STMT(BPF_LDX | BPF_MEM, 3),
1951 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1952 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1953 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1954 BPF_STMT(BPF_STX, 4),
1955 BPF_STMT(BPF_LDX | BPF_MEM, 4),
1956 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1957 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1958 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1959 BPF_STMT(BPF_STX, 5),
1960 BPF_STMT(BPF_LDX | BPF_MEM, 5),
1961 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1962 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1963 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1964 BPF_STMT(BPF_STX, 6),
1965 BPF_STMT(BPF_LDX | BPF_MEM, 6),
1966 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1967 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1968 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1969 BPF_STMT(BPF_STX, 7),
1970 BPF_STMT(BPF_LDX | BPF_MEM, 7),
1971 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1972 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1973 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1974 BPF_STMT(BPF_STX, 8),
1975 BPF_STMT(BPF_LDX | BPF_MEM, 8),
1976 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1977 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1978 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1979 BPF_STMT(BPF_STX, 9),
1980 BPF_STMT(BPF_LDX | BPF_MEM, 9),
1981 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1982 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1983 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1984 BPF_STMT(BPF_STX, 10),
1985 BPF_STMT(BPF_LDX | BPF_MEM, 10),
1986 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1987 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1988 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1989 BPF_STMT(BPF_STX, 11),
1990 BPF_STMT(BPF_LDX | BPF_MEM, 11),
1991 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1992 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1993 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1994 BPF_STMT(BPF_STX, 12),
1995 BPF_STMT(BPF_LDX | BPF_MEM, 12),
1996 BPF_STMT(BPF_MISC | BPF_TXA, 0),
1997 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1998 BPF_STMT(BPF_MISC | BPF_TAX, 0),
1999 BPF_STMT(BPF_STX, 13),
2000 BPF_STMT(BPF_LDX | BPF_MEM, 13),
2001 BPF_STMT(BPF_MISC | BPF_TXA, 0),
2002 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2003 BPF_STMT(BPF_MISC | BPF_TAX, 0),
2004 BPF_STMT(BPF_STX, 14),
2005 BPF_STMT(BPF_LDX | BPF_MEM, 14),
2006 BPF_STMT(BPF_MISC | BPF_TXA, 0),
2007 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2008 BPF_STMT(BPF_MISC | BPF_TAX, 0),
2009 BPF_STMT(BPF_STX, 15),
2010 BPF_STMT(BPF_LDX | BPF_MEM, 15),
2011 BPF_STMT(BPF_MISC | BPF_TXA, 0),
2012 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2013 BPF_STMT(BPF_MISC | BPF_TAX, 0),
2014 BPF_STMT(BPF_RET | BPF_A, 0),
2016 CLASSIC | FLAG_NO_DATA,
2020 { /* Mainly checking JIT here. */
2021 "M[]: full STX + full LDX",
2023 BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
2024 BPF_STMT(BPF_STX, 0),
2025 BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
2026 BPF_STMT(BPF_STX, 1),
2027 BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
2028 BPF_STMT(BPF_STX, 2),
2029 BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
2030 BPF_STMT(BPF_STX, 3),
2031 BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
2032 BPF_STMT(BPF_STX, 4),
2033 BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
2034 BPF_STMT(BPF_STX, 5),
2035 BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
2036 BPF_STMT(BPF_STX, 6),
2037 BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
2038 BPF_STMT(BPF_STX, 7),
2039 BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
2040 BPF_STMT(BPF_STX, 8),
2041 BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
2042 BPF_STMT(BPF_STX, 9),
2043 BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
2044 BPF_STMT(BPF_STX, 10),
2045 BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
2046 BPF_STMT(BPF_STX, 11),
2047 BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
2048 BPF_STMT(BPF_STX, 12),
2049 BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
2050 BPF_STMT(BPF_STX, 13),
2051 BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
2052 BPF_STMT(BPF_STX, 14),
2053 BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
2054 BPF_STMT(BPF_STX, 15),
2055 BPF_STMT(BPF_LDX | BPF_MEM, 0),
2056 BPF_STMT(BPF_MISC | BPF_TXA, 0),
2057 BPF_STMT(BPF_LDX | BPF_MEM, 1),
2058 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2059 BPF_STMT(BPF_LDX | BPF_MEM, 2),
2060 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2061 BPF_STMT(BPF_LDX | BPF_MEM, 3),
2062 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2063 BPF_STMT(BPF_LDX | BPF_MEM, 4),
2064 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2065 BPF_STMT(BPF_LDX | BPF_MEM, 5),
2066 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2067 BPF_STMT(BPF_LDX | BPF_MEM, 6),
2068 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2069 BPF_STMT(BPF_LDX | BPF_MEM, 7),
2070 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2071 BPF_STMT(BPF_LDX | BPF_MEM, 8),
2072 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2073 BPF_STMT(BPF_LDX | BPF_MEM, 9),
2074 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2075 BPF_STMT(BPF_LDX | BPF_MEM, 10),
2076 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2077 BPF_STMT(BPF_LDX | BPF_MEM, 11),
2078 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2079 BPF_STMT(BPF_LDX | BPF_MEM, 12),
2080 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2081 BPF_STMT(BPF_LDX | BPF_MEM, 13),
2082 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2083 BPF_STMT(BPF_LDX | BPF_MEM, 14),
2084 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2085 BPF_STMT(BPF_LDX | BPF_MEM, 15),
2086 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2087 BPF_STMT(BPF_RET | BPF_A, 0),
2089 CLASSIC | FLAG_NO_DATA,
2091 { { 0, 0x2a5a5e5 } },
2094 "check: SKF_AD_MAX",
2096 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2097 SKF_AD_OFF + SKF_AD_MAX),
2098 BPF_STMT(BPF_RET | BPF_A, 0),
2100 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2103 .fill_helper = NULL,
2104 .expected_errcode = -EINVAL,
2106 { /* Passes checker but fails during runtime. */
2107 "LD [SKF_AD_OFF-1]",
2109 BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2111 BPF_STMT(BPF_RET | BPF_K, 1),
2118 "load 64-bit immediate",
2120 BPF_LD_IMM64(R1, 0x567800001234LL),
2121 BPF_MOV64_REG(R2, R1),
2122 BPF_MOV64_REG(R3, R2),
2123 BPF_ALU64_IMM(BPF_RSH, R2, 32),
2124 BPF_ALU64_IMM(BPF_LSH, R3, 32),
2125 BPF_ALU64_IMM(BPF_RSH, R3, 32),
2126 BPF_ALU64_IMM(BPF_MOV, R0, 0),
2127 BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
2129 BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
2131 BPF_LD_IMM64(R0, 0x1ffffffffLL),
2132 BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
2142 BPF_MOV64_REG(R6, R1),
2143 BPF_LD_ABS(BPF_H, 12),
2144 BPF_JMP_IMM(BPF_JNE, R0, 0x806, 28),
2145 BPF_LD_ABS(BPF_H, 12),
2146 BPF_JMP_IMM(BPF_JNE, R0, 0x806, 26),
2147 BPF_MOV32_IMM(R0, 18),
2148 BPF_STX_MEM(BPF_W, R10, R0, -64),
2149 BPF_LDX_MEM(BPF_W, R7, R10, -64),
2150 BPF_LD_IND(BPF_W, R7, 14),
2151 BPF_STX_MEM(BPF_W, R10, R0, -60),
2152 BPF_MOV32_IMM(R0, 280971478),
2153 BPF_STX_MEM(BPF_W, R10, R0, -56),
2154 BPF_LDX_MEM(BPF_W, R7, R10, -56),
2155 BPF_LDX_MEM(BPF_W, R0, R10, -60),
2156 BPF_ALU32_REG(BPF_SUB, R0, R7),
2157 BPF_JMP_IMM(BPF_JNE, R0, 0, 15),
2158 BPF_LD_ABS(BPF_H, 12),
2159 BPF_JMP_IMM(BPF_JNE, R0, 0x806, 13),
2160 BPF_MOV32_IMM(R0, 22),
2161 BPF_STX_MEM(BPF_W, R10, R0, -56),
2162 BPF_LDX_MEM(BPF_W, R7, R10, -56),
2163 BPF_LD_IND(BPF_H, R7, 14),
2164 BPF_STX_MEM(BPF_W, R10, R0, -52),
2165 BPF_MOV32_IMM(R0, 17366),
2166 BPF_STX_MEM(BPF_W, R10, R0, -48),
2167 BPF_LDX_MEM(BPF_W, R7, R10, -48),
2168 BPF_LDX_MEM(BPF_W, R0, R10, -52),
2169 BPF_ALU32_REG(BPF_SUB, R0, R7),
2170 BPF_JMP_IMM(BPF_JNE, R0, 0, 2),
2171 BPF_MOV32_IMM(R0, 256),
2173 BPF_MOV32_IMM(R0, 0),
2177 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 0,
2178 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2179 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6},
2182 /* BPF_ALU | BPF_MOV | BPF_X */
2184 "ALU_MOV_X: dst = 2",
2186 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2187 BPF_ALU32_REG(BPF_MOV, R0, R1),
2195 "ALU_MOV_X: dst = 4294967295",
2197 BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2198 BPF_ALU32_REG(BPF_MOV, R0, R1),
2203 { { 0, 4294967295U } },
2206 "ALU64_MOV_X: dst = 2",
2208 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2209 BPF_ALU64_REG(BPF_MOV, R0, R1),
2217 "ALU64_MOV_X: dst = 4294967295",
2219 BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2220 BPF_ALU64_REG(BPF_MOV, R0, R1),
2225 { { 0, 4294967295U } },
2227 /* BPF_ALU | BPF_MOV | BPF_K */
2229 "ALU_MOV_K: dst = 2",
2231 BPF_ALU32_IMM(BPF_MOV, R0, 2),
2239 "ALU_MOV_K: dst = 4294967295",
2241 BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2246 { { 0, 4294967295U } },
2249 "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2251 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2252 BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2253 BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2254 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2255 BPF_MOV32_IMM(R0, 2),
2257 BPF_MOV32_IMM(R0, 1),
2265 "ALU64_MOV_K: dst = 2",
2267 BPF_ALU64_IMM(BPF_MOV, R0, 2),
2275 "ALU64_MOV_K: dst = 2147483647",
2277 BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2282 { { 0, 2147483647 } },
2285 "ALU64_OR_K: dst = 0x0",
2287 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2288 BPF_LD_IMM64(R3, 0x0),
2289 BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
2290 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2291 BPF_MOV32_IMM(R0, 2),
2293 BPF_MOV32_IMM(R0, 1),
2301 "ALU64_MOV_K: dst = -1",
2303 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2304 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2305 BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2306 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2307 BPF_MOV32_IMM(R0, 2),
2309 BPF_MOV32_IMM(R0, 1),
2316 /* BPF_ALU | BPF_ADD | BPF_X */
2318 "ALU_ADD_X: 1 + 2 = 3",
2320 BPF_LD_IMM64(R0, 1),
2321 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2322 BPF_ALU32_REG(BPF_ADD, R0, R1),
2330 "ALU_ADD_X: 1 + 4294967294 = 4294967295",
2332 BPF_LD_IMM64(R0, 1),
2333 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2334 BPF_ALU32_REG(BPF_ADD, R0, R1),
2339 { { 0, 4294967295U } },
2342 "ALU64_ADD_X: 1 + 2 = 3",
2344 BPF_LD_IMM64(R0, 1),
2345 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2346 BPF_ALU64_REG(BPF_ADD, R0, R1),
2354 "ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2356 BPF_LD_IMM64(R0, 1),
2357 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2358 BPF_ALU64_REG(BPF_ADD, R0, R1),
2363 { { 0, 4294967295U } },
2365 /* BPF_ALU | BPF_ADD | BPF_K */
2367 "ALU_ADD_K: 1 + 2 = 3",
2369 BPF_LD_IMM64(R0, 1),
2370 BPF_ALU32_IMM(BPF_ADD, R0, 2),
2378 "ALU_ADD_K: 3 + 0 = 3",
2380 BPF_LD_IMM64(R0, 3),
2381 BPF_ALU32_IMM(BPF_ADD, R0, 0),
2389 "ALU_ADD_K: 1 + 4294967294 = 4294967295",
2391 BPF_LD_IMM64(R0, 1),
2392 BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2397 { { 0, 4294967295U } },
2400 "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2402 BPF_LD_IMM64(R2, 0x0),
2403 BPF_LD_IMM64(R3, 0x00000000ffffffff),
2404 BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2405 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2406 BPF_MOV32_IMM(R0, 2),
2408 BPF_MOV32_IMM(R0, 1),
2416 "ALU64_ADD_K: 1 + 2 = 3",
2418 BPF_LD_IMM64(R0, 1),
2419 BPF_ALU64_IMM(BPF_ADD, R0, 2),
2427 "ALU64_ADD_K: 3 + 0 = 3",
2429 BPF_LD_IMM64(R0, 3),
2430 BPF_ALU64_IMM(BPF_ADD, R0, 0),
2438 "ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2440 BPF_LD_IMM64(R0, 1),
2441 BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2446 { { 0, 2147483647 } },
2449 "ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2451 BPF_LD_IMM64(R0, 2147483646),
2452 BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2460 "ALU64_ADD_K: 1 + 0 = 1",
2462 BPF_LD_IMM64(R2, 0x1),
2463 BPF_LD_IMM64(R3, 0x1),
2464 BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2465 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2466 BPF_MOV32_IMM(R0, 2),
2468 BPF_MOV32_IMM(R0, 1),
2476 "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2478 BPF_LD_IMM64(R2, 0x0),
2479 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2480 BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2481 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2482 BPF_MOV32_IMM(R0, 2),
2484 BPF_MOV32_IMM(R0, 1),
2491 /* BPF_ALU | BPF_SUB | BPF_X */
2493 "ALU_SUB_X: 3 - 1 = 2",
2495 BPF_LD_IMM64(R0, 3),
2496 BPF_ALU32_IMM(BPF_MOV, R1, 1),
2497 BPF_ALU32_REG(BPF_SUB, R0, R1),
2505 "ALU_SUB_X: 4294967295 - 4294967294 = 1",
2507 BPF_LD_IMM64(R0, 4294967295U),
2508 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2509 BPF_ALU32_REG(BPF_SUB, R0, R1),
2517 "ALU64_SUB_X: 3 - 1 = 2",
2519 BPF_LD_IMM64(R0, 3),
2520 BPF_ALU32_IMM(BPF_MOV, R1, 1),
2521 BPF_ALU64_REG(BPF_SUB, R0, R1),
2529 "ALU64_SUB_X: 4294967295 - 4294967294 = 1",
2531 BPF_LD_IMM64(R0, 4294967295U),
2532 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2533 BPF_ALU64_REG(BPF_SUB, R0, R1),
2540 /* BPF_ALU | BPF_SUB | BPF_K */
2542 "ALU_SUB_K: 3 - 1 = 2",
2544 BPF_LD_IMM64(R0, 3),
2545 BPF_ALU32_IMM(BPF_SUB, R0, 1),
2553 "ALU_SUB_K: 3 - 0 = 3",
2555 BPF_LD_IMM64(R0, 3),
2556 BPF_ALU32_IMM(BPF_SUB, R0, 0),
2564 "ALU_SUB_K: 4294967295 - 4294967294 = 1",
2566 BPF_LD_IMM64(R0, 4294967295U),
2567 BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
2575 "ALU64_SUB_K: 3 - 1 = 2",
2577 BPF_LD_IMM64(R0, 3),
2578 BPF_ALU64_IMM(BPF_SUB, R0, 1),
2586 "ALU64_SUB_K: 3 - 0 = 3",
2588 BPF_LD_IMM64(R0, 3),
2589 BPF_ALU64_IMM(BPF_SUB, R0, 0),
2597 "ALU64_SUB_K: 4294967294 - 4294967295 = -1",
2599 BPF_LD_IMM64(R0, 4294967294U),
2600 BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
2608 "ALU64_ADD_K: 2147483646 - 2147483647 = -1",
2610 BPF_LD_IMM64(R0, 2147483646),
2611 BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
2618 /* BPF_ALU | BPF_MUL | BPF_X */
2620 "ALU_MUL_X: 2 * 3 = 6",
2622 BPF_LD_IMM64(R0, 2),
2623 BPF_ALU32_IMM(BPF_MOV, R1, 3),
2624 BPF_ALU32_REG(BPF_MUL, R0, R1),
2632 "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2634 BPF_LD_IMM64(R0, 2),
2635 BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
2636 BPF_ALU32_REG(BPF_MUL, R0, R1),
2641 { { 0, 0xFFFFFFF0 } },
2644 "ALU_MUL_X: -1 * -1 = 1",
2646 BPF_LD_IMM64(R0, -1),
2647 BPF_ALU32_IMM(BPF_MOV, R1, -1),
2648 BPF_ALU32_REG(BPF_MUL, R0, R1),
2656 "ALU64_MUL_X: 2 * 3 = 6",
2658 BPF_LD_IMM64(R0, 2),
2659 BPF_ALU32_IMM(BPF_MOV, R1, 3),
2660 BPF_ALU64_REG(BPF_MUL, R0, R1),
2668 "ALU64_MUL_X: 1 * 2147483647 = 2147483647",
2670 BPF_LD_IMM64(R0, 1),
2671 BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2672 BPF_ALU64_REG(BPF_MUL, R0, R1),
2677 { { 0, 2147483647 } },
2679 /* BPF_ALU | BPF_MUL | BPF_K */
2681 "ALU_MUL_K: 2 * 3 = 6",
2683 BPF_LD_IMM64(R0, 2),
2684 BPF_ALU32_IMM(BPF_MUL, R0, 3),
2692 "ALU_MUL_K: 3 * 1 = 3",
2694 BPF_LD_IMM64(R0, 3),
2695 BPF_ALU32_IMM(BPF_MUL, R0, 1),
2703 "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2705 BPF_LD_IMM64(R0, 2),
2706 BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
2711 { { 0, 0xFFFFFFF0 } },
2714 "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
2716 BPF_LD_IMM64(R2, 0x1),
2717 BPF_LD_IMM64(R3, 0x00000000ffffffff),
2718 BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
2719 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2720 BPF_MOV32_IMM(R0, 2),
2722 BPF_MOV32_IMM(R0, 1),
2730 "ALU64_MUL_K: 2 * 3 = 6",
2732 BPF_LD_IMM64(R0, 2),
2733 BPF_ALU64_IMM(BPF_MUL, R0, 3),
2741 "ALU64_MUL_K: 3 * 1 = 3",
2743 BPF_LD_IMM64(R0, 3),
2744 BPF_ALU64_IMM(BPF_MUL, R0, 1),
2752 "ALU64_MUL_K: 1 * 2147483647 = 2147483647",
2754 BPF_LD_IMM64(R0, 1),
2755 BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
2760 { { 0, 2147483647 } },
2763 "ALU64_MUL_K: 1 * -2147483647 = -2147483647",
2765 BPF_LD_IMM64(R0, 1),
2766 BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
2771 { { 0, -2147483647 } },
2774 "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
2776 BPF_LD_IMM64(R2, 0x1),
2777 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2778 BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
2779 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2780 BPF_MOV32_IMM(R0, 2),
2782 BPF_MOV32_IMM(R0, 1),
2789 /* BPF_ALU | BPF_DIV | BPF_X */
2791 "ALU_DIV_X: 6 / 2 = 3",
2793 BPF_LD_IMM64(R0, 6),
2794 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2795 BPF_ALU32_REG(BPF_DIV, R0, R1),
2803 "ALU_DIV_X: 4294967295 / 4294967295 = 1",
2805 BPF_LD_IMM64(R0, 4294967295U),
2806 BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2807 BPF_ALU32_REG(BPF_DIV, R0, R1),
2815 "ALU64_DIV_X: 6 / 2 = 3",
2817 BPF_LD_IMM64(R0, 6),
2818 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2819 BPF_ALU64_REG(BPF_DIV, R0, R1),
2827 "ALU64_DIV_X: 2147483647 / 2147483647 = 1",
2829 BPF_LD_IMM64(R0, 2147483647),
2830 BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2831 BPF_ALU64_REG(BPF_DIV, R0, R1),
2839 "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
2841 BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2842 BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
2843 BPF_LD_IMM64(R3, 0x0000000000000001LL),
2844 BPF_ALU64_REG(BPF_DIV, R2, R4),
2845 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2846 BPF_MOV32_IMM(R0, 2),
2848 BPF_MOV32_IMM(R0, 1),
2855 /* BPF_ALU | BPF_DIV | BPF_K */
2857 "ALU_DIV_K: 6 / 2 = 3",
2859 BPF_LD_IMM64(R0, 6),
2860 BPF_ALU32_IMM(BPF_DIV, R0, 2),
2868 "ALU_DIV_K: 3 / 1 = 3",
2870 BPF_LD_IMM64(R0, 3),
2871 BPF_ALU32_IMM(BPF_DIV, R0, 1),
2879 "ALU_DIV_K: 4294967295 / 4294967295 = 1",
2881 BPF_LD_IMM64(R0, 4294967295U),
2882 BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
2890 "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
2892 BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2893 BPF_LD_IMM64(R3, 0x1UL),
2894 BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
2895 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2896 BPF_MOV32_IMM(R0, 2),
2898 BPF_MOV32_IMM(R0, 1),
2906 "ALU64_DIV_K: 6 / 2 = 3",
2908 BPF_LD_IMM64(R0, 6),
2909 BPF_ALU64_IMM(BPF_DIV, R0, 2),
2917 "ALU64_DIV_K: 3 / 1 = 3",
2919 BPF_LD_IMM64(R0, 3),
2920 BPF_ALU64_IMM(BPF_DIV, R0, 1),
2928 "ALU64_DIV_K: 2147483647 / 2147483647 = 1",
2930 BPF_LD_IMM64(R0, 2147483647),
2931 BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
2939 "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
2941 BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
2942 BPF_LD_IMM64(R3, 0x0000000000000001LL),
2943 BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
2944 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2945 BPF_MOV32_IMM(R0, 2),
2947 BPF_MOV32_IMM(R0, 1),
2954 /* BPF_ALU | BPF_MOD | BPF_X */
2956 "ALU_MOD_X: 3 % 2 = 1",
2958 BPF_LD_IMM64(R0, 3),
2959 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2960 BPF_ALU32_REG(BPF_MOD, R0, R1),
2968 "ALU_MOD_X: 4294967295 % 4294967293 = 2",
2970 BPF_LD_IMM64(R0, 4294967295U),
2971 BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
2972 BPF_ALU32_REG(BPF_MOD, R0, R1),
2980 "ALU64_MOD_X: 3 % 2 = 1",
2982 BPF_LD_IMM64(R0, 3),
2983 BPF_ALU32_IMM(BPF_MOV, R1, 2),
2984 BPF_ALU64_REG(BPF_MOD, R0, R1),
2992 "ALU64_MOD_X: 2147483647 % 2147483645 = 2",
2994 BPF_LD_IMM64(R0, 2147483647),
2995 BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
2996 BPF_ALU64_REG(BPF_MOD, R0, R1),
3003 /* BPF_ALU | BPF_MOD | BPF_K */
3005 "ALU_MOD_K: 3 % 2 = 1",
3007 BPF_LD_IMM64(R0, 3),
3008 BPF_ALU32_IMM(BPF_MOD, R0, 2),
3016 "ALU_MOD_K: 3 % 1 = 0",
3018 BPF_LD_IMM64(R0, 3),
3019 BPF_ALU32_IMM(BPF_MOD, R0, 1),
3027 "ALU_MOD_K: 4294967295 % 4294967293 = 2",
3029 BPF_LD_IMM64(R0, 4294967295U),
3030 BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
3038 "ALU64_MOD_K: 3 % 2 = 1",
3040 BPF_LD_IMM64(R0, 3),
3041 BPF_ALU64_IMM(BPF_MOD, R0, 2),
3049 "ALU64_MOD_K: 3 % 1 = 0",
3051 BPF_LD_IMM64(R0, 3),
3052 BPF_ALU64_IMM(BPF_MOD, R0, 1),
3060 "ALU64_MOD_K: 2147483647 % 2147483645 = 2",
3062 BPF_LD_IMM64(R0, 2147483647),
3063 BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
3070 /* BPF_ALU | BPF_AND | BPF_X */
3072 "ALU_AND_X: 3 & 2 = 2",
3074 BPF_LD_IMM64(R0, 3),
3075 BPF_ALU32_IMM(BPF_MOV, R1, 2),
3076 BPF_ALU32_REG(BPF_AND, R0, R1),
3084 "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3086 BPF_LD_IMM64(R0, 0xffffffff),
3087 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3088 BPF_ALU32_REG(BPF_AND, R0, R1),
3093 { { 0, 0xffffffff } },
3096 "ALU64_AND_X: 3 & 2 = 2",
3098 BPF_LD_IMM64(R0, 3),
3099 BPF_ALU32_IMM(BPF_MOV, R1, 2),
3100 BPF_ALU64_REG(BPF_AND, R0, R1),
3108 "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3110 BPF_LD_IMM64(R0, 0xffffffff),
3111 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3112 BPF_ALU64_REG(BPF_AND, R0, R1),
3117 { { 0, 0xffffffff } },
3119 /* BPF_ALU | BPF_AND | BPF_K */
3121 "ALU_AND_K: 3 & 2 = 2",
3123 BPF_LD_IMM64(R0, 3),
3124 BPF_ALU32_IMM(BPF_AND, R0, 2),
3132 "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3134 BPF_LD_IMM64(R0, 0xffffffff),
3135 BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
3140 { { 0, 0xffffffff } },
3143 "ALU64_AND_K: 3 & 2 = 2",
3145 BPF_LD_IMM64(R0, 3),
3146 BPF_ALU64_IMM(BPF_AND, R0, 2),
3154 "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3156 BPF_LD_IMM64(R0, 0xffffffff),
3157 BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
3162 { { 0, 0xffffffff } },
3165 "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000ffff00000000",
3167 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3168 BPF_LD_IMM64(R3, 0x0000000000000000LL),
3169 BPF_ALU64_IMM(BPF_AND, R2, 0x0),
3170 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3171 BPF_MOV32_IMM(R0, 2),
3173 BPF_MOV32_IMM(R0, 1),
3181 "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffffffff",
3183 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3184 BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3185 BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3186 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3187 BPF_MOV32_IMM(R0, 2),
3189 BPF_MOV32_IMM(R0, 1),
3197 "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3199 BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3200 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3201 BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3202 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3203 BPF_MOV32_IMM(R0, 2),
3205 BPF_MOV32_IMM(R0, 1),
3212 /* BPF_ALU | BPF_OR | BPF_X */
3214 "ALU_OR_X: 1 | 2 = 3",
3216 BPF_LD_IMM64(R0, 1),
3217 BPF_ALU32_IMM(BPF_MOV, R1, 2),
3218 BPF_ALU32_REG(BPF_OR, R0, R1),
3226 "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3228 BPF_LD_IMM64(R0, 0),
3229 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3230 BPF_ALU32_REG(BPF_OR, R0, R1),
3235 { { 0, 0xffffffff } },
3238 "ALU64_OR_X: 1 | 2 = 3",
3240 BPF_LD_IMM64(R0, 1),
3241 BPF_ALU32_IMM(BPF_MOV, R1, 2),
3242 BPF_ALU64_REG(BPF_OR, R0, R1),
3250 "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3252 BPF_LD_IMM64(R0, 0),
3253 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3254 BPF_ALU64_REG(BPF_OR, R0, R1),
3259 { { 0, 0xffffffff } },
3261 /* BPF_ALU | BPF_OR | BPF_K */
3263 "ALU_OR_K: 1 | 2 = 3",
3265 BPF_LD_IMM64(R0, 1),
3266 BPF_ALU32_IMM(BPF_OR, R0, 2),
3274 "ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3276 BPF_LD_IMM64(R0, 0),
3277 BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3282 { { 0, 0xffffffff } },
3285 "ALU64_OR_K: 1 | 2 = 3",
3287 BPF_LD_IMM64(R0, 1),
3288 BPF_ALU64_IMM(BPF_OR, R0, 2),
3296 "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
3298 BPF_LD_IMM64(R0, 0),
3299 BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
3304 { { 0, 0xffffffff } },
3307 "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffff00000000",
3309 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3310 BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3311 BPF_ALU64_IMM(BPF_OR, R2, 0x0),
3312 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3313 BPF_MOV32_IMM(R0, 2),
3315 BPF_MOV32_IMM(R0, 1),
3323 "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
3325 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3326 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3327 BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3328 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3329 BPF_MOV32_IMM(R0, 2),
3331 BPF_MOV32_IMM(R0, 1),
3339 "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
3341 BPF_LD_IMM64(R2, 0x0000000000000000LL),
3342 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3343 BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3344 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3345 BPF_MOV32_IMM(R0, 2),
3347 BPF_MOV32_IMM(R0, 1),
3354 /* BPF_ALU | BPF_XOR | BPF_X */
3356 "ALU_XOR_X: 5 ^ 6 = 3",
3358 BPF_LD_IMM64(R0, 5),
3359 BPF_ALU32_IMM(BPF_MOV, R1, 6),
3360 BPF_ALU32_REG(BPF_XOR, R0, R1),
3368 "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
3370 BPF_LD_IMM64(R0, 1),
3371 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3372 BPF_ALU32_REG(BPF_XOR, R0, R1),
3377 { { 0, 0xfffffffe } },
3380 "ALU64_XOR_X: 5 ^ 6 = 3",
3382 BPF_LD_IMM64(R0, 5),
3383 BPF_ALU32_IMM(BPF_MOV, R1, 6),
3384 BPF_ALU64_REG(BPF_XOR, R0, R1),
3392 "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
3394 BPF_LD_IMM64(R0, 1),
3395 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3396 BPF_ALU64_REG(BPF_XOR, R0, R1),
3401 { { 0, 0xfffffffe } },
3403 /* BPF_ALU | BPF_XOR | BPF_K */
3405 "ALU_XOR_K: 5 ^ 6 = 3",
3407 BPF_LD_IMM64(R0, 5),
3408 BPF_ALU32_IMM(BPF_XOR, R0, 6),
3416 "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
3418 BPF_LD_IMM64(R0, 1),
3419 BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
3424 { { 0, 0xfffffffe } },
3427 "ALU64_XOR_K: 5 ^ 6 = 3",
3429 BPF_LD_IMM64(R0, 5),
3430 BPF_ALU64_IMM(BPF_XOR, R0, 6),
3438 "ALU64_XOR_K: 1 & 0xffffffff = 0xfffffffe",
3440 BPF_LD_IMM64(R0, 1),
3441 BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
3446 { { 0, 0xfffffffe } },
3449 "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
3451 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3452 BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3453 BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
3454 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3455 BPF_MOV32_IMM(R0, 2),
3457 BPF_MOV32_IMM(R0, 1),
3465 "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
3467 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3468 BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
3469 BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3470 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3471 BPF_MOV32_IMM(R0, 2),
3473 BPF_MOV32_IMM(R0, 1),
3481 "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
3483 BPF_LD_IMM64(R2, 0x0000000000000000LL),
3484 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3485 BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3486 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3487 BPF_MOV32_IMM(R0, 2),
3489 BPF_MOV32_IMM(R0, 1),
3496 /* BPF_ALU | BPF_LSH | BPF_X */
3498 "ALU_LSH_X: 1 << 1 = 2",
3500 BPF_LD_IMM64(R0, 1),
3501 BPF_ALU32_IMM(BPF_MOV, R1, 1),
3502 BPF_ALU32_REG(BPF_LSH, R0, R1),
3510 "ALU_LSH_X: 1 << 31 = 0x80000000",
3512 BPF_LD_IMM64(R0, 1),
3513 BPF_ALU32_IMM(BPF_MOV, R1, 31),
3514 BPF_ALU32_REG(BPF_LSH, R0, R1),
3519 { { 0, 0x80000000 } },
3522 "ALU64_LSH_X: 1 << 1 = 2",
3524 BPF_LD_IMM64(R0, 1),
3525 BPF_ALU32_IMM(BPF_MOV, R1, 1),
3526 BPF_ALU64_REG(BPF_LSH, R0, R1),
3534 "ALU64_LSH_X: 1 << 31 = 0x80000000",
3536 BPF_LD_IMM64(R0, 1),
3537 BPF_ALU32_IMM(BPF_MOV, R1, 31),
3538 BPF_ALU64_REG(BPF_LSH, R0, R1),
3543 { { 0, 0x80000000 } },
3545 /* BPF_ALU | BPF_LSH | BPF_K */
3547 "ALU_LSH_K: 1 << 1 = 2",
3549 BPF_LD_IMM64(R0, 1),
3550 BPF_ALU32_IMM(BPF_LSH, R0, 1),
3558 "ALU_LSH_K: 1 << 31 = 0x80000000",
3560 BPF_LD_IMM64(R0, 1),
3561 BPF_ALU32_IMM(BPF_LSH, R0, 31),
3566 { { 0, 0x80000000 } },
3569 "ALU64_LSH_K: 1 << 1 = 2",
3571 BPF_LD_IMM64(R0, 1),
3572 BPF_ALU64_IMM(BPF_LSH, R0, 1),
3580 "ALU64_LSH_K: 1 << 31 = 0x80000000",
3582 BPF_LD_IMM64(R0, 1),
3583 BPF_ALU64_IMM(BPF_LSH, R0, 31),
3588 { { 0, 0x80000000 } },
3590 /* BPF_ALU | BPF_RSH | BPF_X */
3592 "ALU_RSH_X: 2 >> 1 = 1",
3594 BPF_LD_IMM64(R0, 2),
3595 BPF_ALU32_IMM(BPF_MOV, R1, 1),
3596 BPF_ALU32_REG(BPF_RSH, R0, R1),
3604 "ALU_RSH_X: 0x80000000 >> 31 = 1",
3606 BPF_LD_IMM64(R0, 0x80000000),
3607 BPF_ALU32_IMM(BPF_MOV, R1, 31),
3608 BPF_ALU32_REG(BPF_RSH, R0, R1),
3616 "ALU64_RSH_X: 2 >> 1 = 1",
3618 BPF_LD_IMM64(R0, 2),
3619 BPF_ALU32_IMM(BPF_MOV, R1, 1),
3620 BPF_ALU64_REG(BPF_RSH, R0, R1),
3628 "ALU64_RSH_X: 0x80000000 >> 31 = 1",
3630 BPF_LD_IMM64(R0, 0x80000000),
3631 BPF_ALU32_IMM(BPF_MOV, R1, 31),
3632 BPF_ALU64_REG(BPF_RSH, R0, R1),
3639 /* BPF_ALU | BPF_RSH | BPF_K */
3641 "ALU_RSH_K: 2 >> 1 = 1",
3643 BPF_LD_IMM64(R0, 2),
3644 BPF_ALU32_IMM(BPF_RSH, R0, 1),
3652 "ALU_RSH_K: 0x80000000 >> 31 = 1",
3654 BPF_LD_IMM64(R0, 0x80000000),
3655 BPF_ALU32_IMM(BPF_RSH, R0, 31),
3663 "ALU64_RSH_K: 2 >> 1 = 1",
3665 BPF_LD_IMM64(R0, 2),
3666 BPF_ALU64_IMM(BPF_RSH, R0, 1),
3674 "ALU64_RSH_K: 0x80000000 >> 31 = 1",
3676 BPF_LD_IMM64(R0, 0x80000000),
3677 BPF_ALU64_IMM(BPF_RSH, R0, 31),
3684 /* BPF_ALU | BPF_ARSH | BPF_X */
3686 "ALU_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3688 BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3689 BPF_ALU32_IMM(BPF_MOV, R1, 40),
3690 BPF_ALU64_REG(BPF_ARSH, R0, R1),
3695 { { 0, 0xffff00ff } },
3697 /* BPF_ALU | BPF_ARSH | BPF_K */
3699 "ALU_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3701 BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3702 BPF_ALU64_IMM(BPF_ARSH, R0, 40),
3707 { { 0, 0xffff00ff } },
3709 /* BPF_ALU | BPF_NEG */
3711 "ALU_NEG: -(3) = -3",
3713 BPF_ALU32_IMM(BPF_MOV, R0, 3),
3714 BPF_ALU32_IMM(BPF_NEG, R0, 0),
3722 "ALU_NEG: -(-3) = 3",
3724 BPF_ALU32_IMM(BPF_MOV, R0, -3),
3725 BPF_ALU32_IMM(BPF_NEG, R0, 0),
3733 "ALU64_NEG: -(3) = -3",
3735 BPF_LD_IMM64(R0, 3),
3736 BPF_ALU64_IMM(BPF_NEG, R0, 0),
3744 "ALU64_NEG: -(-3) = 3",
3746 BPF_LD_IMM64(R0, -3),
3747 BPF_ALU64_IMM(BPF_NEG, R0, 0),
3754 /* BPF_ALU | BPF_END | BPF_FROM_BE */
3756 "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
3758 BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3759 BPF_ENDIAN(BPF_FROM_BE, R0, 16),
3764 { { 0, cpu_to_be16(0xcdef) } },
3767 "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
3769 BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3770 BPF_ENDIAN(BPF_FROM_BE, R0, 32),
3771 BPF_ALU64_REG(BPF_MOV, R1, R0),
3772 BPF_ALU64_IMM(BPF_RSH, R1, 32),
3773 BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
3778 { { 0, cpu_to_be32(0x89abcdef) } },
3781 "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
3783 BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3784 BPF_ENDIAN(BPF_FROM_BE, R0, 64),
3789 { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
3791 /* BPF_ALU | BPF_END | BPF_FROM_LE */
3793 "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
3795 BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3796 BPF_ENDIAN(BPF_FROM_LE, R0, 16),
3801 { { 0, cpu_to_le16(0xcdef) } },
3804 "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
3806 BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3807 BPF_ENDIAN(BPF_FROM_LE, R0, 32),
3808 BPF_ALU64_REG(BPF_MOV, R1, R0),
3809 BPF_ALU64_IMM(BPF_RSH, R1, 32),
3810 BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
3815 { { 0, cpu_to_le32(0x89abcdef) } },
3818 "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
3820 BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3821 BPF_ENDIAN(BPF_FROM_LE, R0, 64),
3826 { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
3828 /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
3830 "ST_MEM_B: Store/Load byte: max negative",
3832 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3833 BPF_ST_MEM(BPF_B, R10, -40, 0xff),
3834 BPF_LDX_MEM(BPF_B, R0, R10, -40),
3842 "ST_MEM_B: Store/Load byte: max positive",
3844 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3845 BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
3846 BPF_LDX_MEM(BPF_H, R0, R10, -40),
3854 "STX_MEM_B: Store/Load byte: max negative",
3856 BPF_LD_IMM64(R0, 0),
3857 BPF_LD_IMM64(R1, 0xffLL),
3858 BPF_STX_MEM(BPF_B, R10, R1, -40),
3859 BPF_LDX_MEM(BPF_B, R0, R10, -40),
3867 "ST_MEM_H: Store/Load half word: max negative",
3869 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3870 BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
3871 BPF_LDX_MEM(BPF_H, R0, R10, -40),
3879 "ST_MEM_H: Store/Load half word: max positive",
3881 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3882 BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
3883 BPF_LDX_MEM(BPF_H, R0, R10, -40),
3891 "STX_MEM_H: Store/Load half word: max negative",
3893 BPF_LD_IMM64(R0, 0),
3894 BPF_LD_IMM64(R1, 0xffffLL),
3895 BPF_STX_MEM(BPF_H, R10, R1, -40),
3896 BPF_LDX_MEM(BPF_H, R0, R10, -40),
3904 "ST_MEM_W: Store/Load word: max negative",
3906 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3907 BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
3908 BPF_LDX_MEM(BPF_W, R0, R10, -40),
3913 { { 0, 0xffffffff } },
3916 "ST_MEM_W: Store/Load word: max positive",
3918 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3919 BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
3920 BPF_LDX_MEM(BPF_W, R0, R10, -40),
3925 { { 0, 0x7fffffff } },
3928 "STX_MEM_W: Store/Load word: max negative",
3930 BPF_LD_IMM64(R0, 0),
3931 BPF_LD_IMM64(R1, 0xffffffffLL),
3932 BPF_STX_MEM(BPF_W, R10, R1, -40),
3933 BPF_LDX_MEM(BPF_W, R0, R10, -40),
3938 { { 0, 0xffffffff } },
3941 "ST_MEM_DW: Store/Load double word: max negative",
3943 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3944 BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
3945 BPF_LDX_MEM(BPF_DW, R0, R10, -40),
3950 { { 0, 0xffffffff } },
3953 "ST_MEM_DW: Store/Load double word: max negative 2",
3955 BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
3956 BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3957 BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
3958 BPF_LDX_MEM(BPF_DW, R2, R10, -40),
3959 BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3960 BPF_MOV32_IMM(R0, 2),
3962 BPF_MOV32_IMM(R0, 1),
3970 "ST_MEM_DW: Store/Load double word: max positive",
3972 BPF_ALU32_IMM(BPF_MOV, R0, 1),
3973 BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
3974 BPF_LDX_MEM(BPF_DW, R0, R10, -40),
3979 { { 0, 0x7fffffff } },
3982 "STX_MEM_DW: Store/Load double word: max negative",
3984 BPF_LD_IMM64(R0, 0),
3985 BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
3986 BPF_STX_MEM(BPF_DW, R10, R1, -40),
3987 BPF_LDX_MEM(BPF_DW, R0, R10, -40),
3992 { { 0, 0xffffffff } },
3994 /* BPF_STX | BPF_XADD | BPF_W/DW */
3996 "STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
3998 BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
3999 BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4000 BPF_STX_XADD(BPF_W, R10, R0, -40),
4001 BPF_LDX_MEM(BPF_W, R0, R10, -40),
4009 "STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
4011 BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4012 BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4013 BPF_STX_XADD(BPF_DW, R10, R0, -40),
4014 BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4021 /* BPF_JMP | BPF_EXIT */
4025 BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
4027 BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
4033 /* BPF_JMP | BPF_JA */
4035 "JMP_JA: Unconditional jump: if (true) return 1",
4037 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4038 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4040 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4047 /* BPF_JMP | BPF_JSGT | BPF_K */
4049 "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
4051 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4052 BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4053 BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
4055 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4063 "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
4065 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4066 BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4067 BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
4069 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4076 /* BPF_JMP | BPF_JSGE | BPF_K */
4078 "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
4080 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4081 BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4082 BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
4084 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4092 "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
4094 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4095 BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4096 BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
4098 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4105 /* BPF_JMP | BPF_JGT | BPF_K */
4107 "JMP_JGT_K: if (3 > 2) return 1",
4109 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4110 BPF_LD_IMM64(R1, 3),
4111 BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
4113 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4120 /* BPF_JMP | BPF_JGE | BPF_K */
4122 "JMP_JGE_K: if (3 >= 2) return 1",
4124 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4125 BPF_LD_IMM64(R1, 3),
4126 BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
4128 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4135 /* BPF_JMP | BPF_JGT | BPF_K jump backwards */
4137 "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
4139 BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4140 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4142 BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4143 BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
4144 BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
4152 "JMP_JGE_K: if (3 >= 3) return 1",
4154 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4155 BPF_LD_IMM64(R1, 3),
4156 BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
4158 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4165 /* BPF_JMP | BPF_JNE | BPF_K */
4167 "JMP_JNE_K: if (3 != 2) return 1",
4169 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4170 BPF_LD_IMM64(R1, 3),
4171 BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4173 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4180 /* BPF_JMP | BPF_JEQ | BPF_K */
4182 "JMP_JEQ_K: if (3 == 3) return 1",
4184 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4185 BPF_LD_IMM64(R1, 3),
4186 BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
4188 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4195 /* BPF_JMP | BPF_JSET | BPF_K */
4197 "JMP_JSET_K: if (0x3 & 0x2) return 1",
4199 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4200 BPF_LD_IMM64(R1, 3),
4201 BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4203 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4211 "JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
4213 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4214 BPF_LD_IMM64(R1, 3),
4215 BPF_JMP_IMM(BPF_JNE, R1, 0xffffffff, 1),
4217 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4224 /* BPF_JMP | BPF_JSGT | BPF_X */
4226 "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
4228 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4229 BPF_LD_IMM64(R1, -1),
4230 BPF_LD_IMM64(R2, -2),
4231 BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4233 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4241 "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
4243 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4244 BPF_LD_IMM64(R1, -1),
4245 BPF_LD_IMM64(R2, -1),
4246 BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4248 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4255 /* BPF_JMP | BPF_JSGE | BPF_X */
4257 "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
4259 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4260 BPF_LD_IMM64(R1, -1),
4261 BPF_LD_IMM64(R2, -2),
4262 BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4264 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4272 "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
4274 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4275 BPF_LD_IMM64(R1, -1),
4276 BPF_LD_IMM64(R2, -1),
4277 BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4279 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4286 /* BPF_JMP | BPF_JGT | BPF_X */
4288 "JMP_JGT_X: if (3 > 2) return 1",
4290 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4291 BPF_LD_IMM64(R1, 3),
4292 BPF_LD_IMM64(R2, 2),
4293 BPF_JMP_REG(BPF_JGT, R1, R2, 1),
4295 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4302 /* BPF_JMP | BPF_JGE | BPF_X */
4304 "JMP_JGE_X: if (3 >= 2) return 1",
4306 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4307 BPF_LD_IMM64(R1, 3),
4308 BPF_LD_IMM64(R2, 2),
4309 BPF_JMP_REG(BPF_JGE, R1, R2, 1),
4311 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4319 "JMP_JGE_X: if (3 >= 3) return 1",
4321 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4322 BPF_LD_IMM64(R1, 3),
4323 BPF_LD_IMM64(R2, 3),
4324 BPF_JMP_REG(BPF_JGE, R1, R2, 1),
4326 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4334 /* Mainly testing JIT + imm64 here. */
4335 "JMP_JGE_X: ldimm64 test 1",
4337 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4338 BPF_LD_IMM64(R1, 3),
4339 BPF_LD_IMM64(R2, 2),
4340 BPF_JMP_REG(BPF_JGE, R1, R2, 2),
4341 BPF_LD_IMM64(R0, 0xffffffffffffffffUL),
4342 BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeUL),
4347 { { 0, 0xeeeeeeeeU } },
4350 "JMP_JGE_X: ldimm64 test 2",
4352 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4353 BPF_LD_IMM64(R1, 3),
4354 BPF_LD_IMM64(R2, 2),
4355 BPF_JMP_REG(BPF_JGE, R1, R2, 0),
4356 BPF_LD_IMM64(R0, 0xffffffffffffffffUL),
4361 { { 0, 0xffffffffU } },
4364 "JMP_JGE_X: ldimm64 test 3",
4366 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4367 BPF_LD_IMM64(R1, 3),
4368 BPF_LD_IMM64(R2, 2),
4369 BPF_JMP_REG(BPF_JGE, R1, R2, 4),
4370 BPF_LD_IMM64(R0, 0xffffffffffffffffUL),
4371 BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeUL),
4378 /* BPF_JMP | BPF_JNE | BPF_X */
4380 "JMP_JNE_X: if (3 != 2) return 1",
4382 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4383 BPF_LD_IMM64(R1, 3),
4384 BPF_LD_IMM64(R2, 2),
4385 BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4387 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4394 /* BPF_JMP | BPF_JEQ | BPF_X */
4396 "JMP_JEQ_X: if (3 == 3) return 1",
4398 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4399 BPF_LD_IMM64(R1, 3),
4400 BPF_LD_IMM64(R2, 3),
4401 BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
4403 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4410 /* BPF_JMP | BPF_JSET | BPF_X */
4412 "JMP_JSET_X: if (0x3 & 0x2) return 1",
4414 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4415 BPF_LD_IMM64(R1, 3),
4416 BPF_LD_IMM64(R2, 2),
4417 BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4419 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4427 "JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
4429 BPF_ALU32_IMM(BPF_MOV, R0, 0),
4430 BPF_LD_IMM64(R1, 3),
4431 BPF_LD_IMM64(R2, 0xffffffff),
4432 BPF_JMP_REG(BPF_JNE, R1, R2, 1),
4434 BPF_ALU32_IMM(BPF_MOV, R0, 1),
4442 "JMP_JA: Jump, gap, jump, ...",
4444 CLASSIC | FLAG_NO_DATA,
4446 { { 0, 0xababcbac } },
4447 .fill_helper = bpf_fill_ja,
4449 { /* Mainly checking JIT here. */
4450 "BPF_MAXINSNS: Maximum possible literals",
4452 CLASSIC | FLAG_NO_DATA,
4454 { { 0, 0xffffffff } },
4455 .fill_helper = bpf_fill_maxinsns1,
4457 { /* Mainly checking JIT here. */
4458 "BPF_MAXINSNS: Single literal",
4460 CLASSIC | FLAG_NO_DATA,
4462 { { 0, 0xfefefefe } },
4463 .fill_helper = bpf_fill_maxinsns2,
4465 { /* Mainly checking JIT here. */
4466 "BPF_MAXINSNS: Run/add until end",
4468 CLASSIC | FLAG_NO_DATA,
4470 { { 0, 0x947bf368 } },
4471 .fill_helper = bpf_fill_maxinsns3,
4474 "BPF_MAXINSNS: Too many instructions",
4476 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4479 .fill_helper = bpf_fill_maxinsns4,
4480 .expected_errcode = -EINVAL,
4482 { /* Mainly checking JIT here. */
4483 "BPF_MAXINSNS: Very long jump",
4485 CLASSIC | FLAG_NO_DATA,
4487 { { 0, 0xabababab } },
4488 .fill_helper = bpf_fill_maxinsns5,
4490 { /* Mainly checking JIT here. */
4491 "BPF_MAXINSNS: Ctx heavy transformations",
4496 { 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
4497 { 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
4499 .fill_helper = bpf_fill_maxinsns6,
4501 { /* Mainly checking JIT here. */
4502 "BPF_MAXINSNS: Call heavy transformations",
4504 CLASSIC | FLAG_NO_DATA,
4506 { { 1, 0 }, { 10, 0 } },
4507 .fill_helper = bpf_fill_maxinsns7,
4509 { /* Mainly checking JIT here. */
4510 "BPF_MAXINSNS: Jump heavy test",
4512 CLASSIC | FLAG_NO_DATA,
4514 { { 0, 0xffffffff } },
4515 .fill_helper = bpf_fill_maxinsns8,
4517 { /* Mainly checking JIT here. */
4518 "BPF_MAXINSNS: Very long jump backwards",
4520 INTERNAL | FLAG_NO_DATA,
4522 { { 0, 0xcbababab } },
4523 .fill_helper = bpf_fill_maxinsns9,
4525 { /* Mainly checking JIT here. */
4526 "BPF_MAXINSNS: Edge hopping nuthouse",
4528 INTERNAL | FLAG_NO_DATA,
4530 { { 0, 0xabababac } },
4531 .fill_helper = bpf_fill_maxinsns10,
4534 "BPF_MAXINSNS: Jump, gap, jump, ...",
4536 #ifdef CONFIG_BPF_JIT_ALWAYS_ON
4537 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
4539 CLASSIC | FLAG_NO_DATA,
4542 { { 0, 0xababcbac } },
4543 .fill_helper = bpf_fill_maxinsns11,
4544 .expected_errcode = -ENOTSUPP,
4547 "BPF_MAXINSNS: ld_abs+get_processor_id",
4552 .fill_helper = bpf_fill_ld_abs_get_processor_id,
4555 "BPF_MAXINSNS: ld_abs+vlan_push/pop",
4560 .fill_helper = bpf_fill_ld_abs_vlan_push_pop,
4563 * LD_IND / LD_ABS on fragmented SKBs
4568 BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4569 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
4570 BPF_STMT(BPF_RET | BPF_A, 0x0),
4572 CLASSIC | FLAG_SKB_FRAG,
4576 0x42, 0x00, 0x00, 0x00,
4577 0x43, 0x44, 0x00, 0x00,
4578 0x21, 0x07, 0x19, 0x83,
4582 "LD_IND halfword frag",
4584 BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4585 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
4586 BPF_STMT(BPF_RET | BPF_A, 0x0),
4588 CLASSIC | FLAG_SKB_FRAG,
4592 0x42, 0x00, 0x00, 0x00,
4593 0x43, 0x44, 0x00, 0x00,
4594 0x21, 0x07, 0x19, 0x83,
4600 BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4601 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
4602 BPF_STMT(BPF_RET | BPF_A, 0x0),
4604 CLASSIC | FLAG_SKB_FRAG,
4606 { {0x40, 0x21071983} },
4608 0x42, 0x00, 0x00, 0x00,
4609 0x43, 0x44, 0x00, 0x00,
4610 0x21, 0x07, 0x19, 0x83,
4614 "LD_IND halfword mixed head/frag",
4616 BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4617 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
4618 BPF_STMT(BPF_RET | BPF_A, 0x0),
4620 CLASSIC | FLAG_SKB_FRAG,
4621 { [0x3e] = 0x25, [0x3f] = 0x05, },
4623 .frag_data = { 0x19, 0x82 },
4626 "LD_IND word mixed head/frag",
4628 BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
4629 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
4630 BPF_STMT(BPF_RET | BPF_A, 0x0),
4632 CLASSIC | FLAG_SKB_FRAG,
4633 { [0x3e] = 0x25, [0x3f] = 0x05, },
4634 { {0x40, 0x25051982} },
4635 .frag_data = { 0x19, 0x82 },
4640 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
4641 BPF_STMT(BPF_RET | BPF_A, 0x0),
4643 CLASSIC | FLAG_SKB_FRAG,
4647 0x42, 0x00, 0x00, 0x00,
4648 0x43, 0x44, 0x00, 0x00,
4649 0x21, 0x07, 0x19, 0x83,
4653 "LD_ABS halfword frag",
4655 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
4656 BPF_STMT(BPF_RET | BPF_A, 0x0),
4658 CLASSIC | FLAG_SKB_FRAG,
4662 0x42, 0x00, 0x00, 0x00,
4663 0x43, 0x44, 0x00, 0x00,
4664 0x21, 0x07, 0x19, 0x83,
4670 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
4671 BPF_STMT(BPF_RET | BPF_A, 0x0),
4673 CLASSIC | FLAG_SKB_FRAG,
4675 { {0x40, 0x21071983} },
4677 0x42, 0x00, 0x00, 0x00,
4678 0x43, 0x44, 0x00, 0x00,
4679 0x21, 0x07, 0x19, 0x83,
4683 "LD_ABS halfword mixed head/frag",
4685 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
4686 BPF_STMT(BPF_RET | BPF_A, 0x0),
4688 CLASSIC | FLAG_SKB_FRAG,
4689 { [0x3e] = 0x25, [0x3f] = 0x05, },
4691 .frag_data = { 0x19, 0x82 },
4694 "LD_ABS word mixed head/frag",
4696 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
4697 BPF_STMT(BPF_RET | BPF_A, 0x0),
4699 CLASSIC | FLAG_SKB_FRAG,
4700 { [0x3e] = 0x25, [0x3f] = 0x05, },
4701 { {0x40, 0x25051982} },
4702 .frag_data = { 0x19, 0x82 },
4705 * LD_IND / LD_ABS on non fragmented SKBs
4709 * this tests that the JIT/interpreter correctly resets X
4710 * before using it in an LD_IND instruction.
4712 "LD_IND byte default X",
4714 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
4715 BPF_STMT(BPF_RET | BPF_A, 0x0),
4722 "LD_IND byte positive offset",
4724 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
4725 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
4726 BPF_STMT(BPF_RET | BPF_A, 0x0),
4729 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
4733 "LD_IND byte negative offset",
4735 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
4736 BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
4737 BPF_STMT(BPF_RET | BPF_A, 0x0),
4740 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
4744 "LD_IND halfword positive offset",
4746 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4747 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
4748 BPF_STMT(BPF_RET | BPF_A, 0x0),
4752 [0x1c] = 0xaa, [0x1d] = 0x55,
4753 [0x1e] = 0xbb, [0x1f] = 0x66,
4754 [0x20] = 0xcc, [0x21] = 0x77,
4755 [0x22] = 0xdd, [0x23] = 0x88,
4757 { {0x40, 0xdd88 } },
4760 "LD_IND halfword negative offset",
4762 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4763 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
4764 BPF_STMT(BPF_RET | BPF_A, 0x0),
4768 [0x1c] = 0xaa, [0x1d] = 0x55,
4769 [0x1e] = 0xbb, [0x1f] = 0x66,
4770 [0x20] = 0xcc, [0x21] = 0x77,
4771 [0x22] = 0xdd, [0x23] = 0x88,
4773 { {0x40, 0xbb66 } },
4776 "LD_IND halfword unaligned",
4778 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4779 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
4780 BPF_STMT(BPF_RET | BPF_A, 0x0),
4784 [0x1c] = 0xaa, [0x1d] = 0x55,
4785 [0x1e] = 0xbb, [0x1f] = 0x66,
4786 [0x20] = 0xcc, [0x21] = 0x77,
4787 [0x22] = 0xdd, [0x23] = 0x88,
4789 { {0x40, 0x66cc } },
4792 "LD_IND word positive offset",
4794 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4795 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
4796 BPF_STMT(BPF_RET | BPF_A, 0x0),
4800 [0x1c] = 0xaa, [0x1d] = 0x55,
4801 [0x1e] = 0xbb, [0x1f] = 0x66,
4802 [0x20] = 0xcc, [0x21] = 0x77,
4803 [0x22] = 0xdd, [0x23] = 0x88,
4804 [0x24] = 0xee, [0x25] = 0x99,
4805 [0x26] = 0xff, [0x27] = 0xaa,
4807 { {0x40, 0xee99ffaa } },
4810 "LD_IND word negative offset",
4812 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4813 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
4814 BPF_STMT(BPF_RET | BPF_A, 0x0),
4818 [0x1c] = 0xaa, [0x1d] = 0x55,
4819 [0x1e] = 0xbb, [0x1f] = 0x66,
4820 [0x20] = 0xcc, [0x21] = 0x77,
4821 [0x22] = 0xdd, [0x23] = 0x88,
4822 [0x24] = 0xee, [0x25] = 0x99,
4823 [0x26] = 0xff, [0x27] = 0xaa,
4825 { {0x40, 0xaa55bb66 } },
4828 "LD_IND word unaligned (addr & 3 == 2)",
4830 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4831 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
4832 BPF_STMT(BPF_RET | BPF_A, 0x0),
4836 [0x1c] = 0xaa, [0x1d] = 0x55,
4837 [0x1e] = 0xbb, [0x1f] = 0x66,
4838 [0x20] = 0xcc, [0x21] = 0x77,
4839 [0x22] = 0xdd, [0x23] = 0x88,
4840 [0x24] = 0xee, [0x25] = 0x99,
4841 [0x26] = 0xff, [0x27] = 0xaa,
4843 { {0x40, 0xbb66cc77 } },
4846 "LD_IND word unaligned (addr & 3 == 1)",
4848 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4849 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
4850 BPF_STMT(BPF_RET | BPF_A, 0x0),
4854 [0x1c] = 0xaa, [0x1d] = 0x55,
4855 [0x1e] = 0xbb, [0x1f] = 0x66,
4856 [0x20] = 0xcc, [0x21] = 0x77,
4857 [0x22] = 0xdd, [0x23] = 0x88,
4858 [0x24] = 0xee, [0x25] = 0x99,
4859 [0x26] = 0xff, [0x27] = 0xaa,
4861 { {0x40, 0x55bb66cc } },
4864 "LD_IND word unaligned (addr & 3 == 3)",
4866 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4867 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
4868 BPF_STMT(BPF_RET | BPF_A, 0x0),
4872 [0x1c] = 0xaa, [0x1d] = 0x55,
4873 [0x1e] = 0xbb, [0x1f] = 0x66,
4874 [0x20] = 0xcc, [0x21] = 0x77,
4875 [0x22] = 0xdd, [0x23] = 0x88,
4876 [0x24] = 0xee, [0x25] = 0x99,
4877 [0x26] = 0xff, [0x27] = 0xaa,
4879 { {0x40, 0x66cc77dd } },
4884 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
4885 BPF_STMT(BPF_RET | BPF_A, 0x0),
4889 [0x1c] = 0xaa, [0x1d] = 0x55,
4890 [0x1e] = 0xbb, [0x1f] = 0x66,
4891 [0x20] = 0xcc, [0x21] = 0x77,
4892 [0x22] = 0xdd, [0x23] = 0x88,
4893 [0x24] = 0xee, [0x25] = 0x99,
4894 [0x26] = 0xff, [0x27] = 0xaa,
4901 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
4902 BPF_STMT(BPF_RET | BPF_A, 0x0),
4906 [0x1c] = 0xaa, [0x1d] = 0x55,
4907 [0x1e] = 0xbb, [0x1f] = 0x66,
4908 [0x20] = 0xcc, [0x21] = 0x77,
4909 [0x22] = 0xdd, [0x23] = 0x88,
4910 [0x24] = 0xee, [0x25] = 0x99,
4911 [0x26] = 0xff, [0x27] = 0xaa,
4913 { {0x40, 0xdd88 } },
4916 "LD_ABS halfword unaligned",
4918 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
4919 BPF_STMT(BPF_RET | BPF_A, 0x0),
4923 [0x1c] = 0xaa, [0x1d] = 0x55,
4924 [0x1e] = 0xbb, [0x1f] = 0x66,
4925 [0x20] = 0xcc, [0x21] = 0x77,
4926 [0x22] = 0xdd, [0x23] = 0x88,
4927 [0x24] = 0xee, [0x25] = 0x99,
4928 [0x26] = 0xff, [0x27] = 0xaa,
4930 { {0x40, 0x99ff } },
4935 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
4936 BPF_STMT(BPF_RET | BPF_A, 0x0),
4940 [0x1c] = 0xaa, [0x1d] = 0x55,
4941 [0x1e] = 0xbb, [0x1f] = 0x66,
4942 [0x20] = 0xcc, [0x21] = 0x77,
4943 [0x22] = 0xdd, [0x23] = 0x88,
4944 [0x24] = 0xee, [0x25] = 0x99,
4945 [0x26] = 0xff, [0x27] = 0xaa,
4947 { {0x40, 0xaa55bb66 } },
4950 "LD_ABS word unaligned (addr & 3 == 2)",
4952 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
4953 BPF_STMT(BPF_RET | BPF_A, 0x0),
4957 [0x1c] = 0xaa, [0x1d] = 0x55,
4958 [0x1e] = 0xbb, [0x1f] = 0x66,
4959 [0x20] = 0xcc, [0x21] = 0x77,
4960 [0x22] = 0xdd, [0x23] = 0x88,
4961 [0x24] = 0xee, [0x25] = 0x99,
4962 [0x26] = 0xff, [0x27] = 0xaa,
4964 { {0x40, 0xdd88ee99 } },
4967 "LD_ABS word unaligned (addr & 3 == 1)",
4969 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
4970 BPF_STMT(BPF_RET | BPF_A, 0x0),
4974 [0x1c] = 0xaa, [0x1d] = 0x55,
4975 [0x1e] = 0xbb, [0x1f] = 0x66,
4976 [0x20] = 0xcc, [0x21] = 0x77,
4977 [0x22] = 0xdd, [0x23] = 0x88,
4978 [0x24] = 0xee, [0x25] = 0x99,
4979 [0x26] = 0xff, [0x27] = 0xaa,
4981 { {0x40, 0x77dd88ee } },
4984 "LD_ABS word unaligned (addr & 3 == 3)",
4986 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
4987 BPF_STMT(BPF_RET | BPF_A, 0x0),
4991 [0x1c] = 0xaa, [0x1d] = 0x55,
4992 [0x1e] = 0xbb, [0x1f] = 0x66,
4993 [0x20] = 0xcc, [0x21] = 0x77,
4994 [0x22] = 0xdd, [0x23] = 0x88,
4995 [0x24] = 0xee, [0x25] = 0x99,
4996 [0x26] = 0xff, [0x27] = 0xaa,
4998 { {0x40, 0x88ee99ff } },
5001 * verify that the interpreter or JIT correctly sets A and X
5012 BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5013 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
5014 BPF_STMT(BPF_RET | BPF_A, 0x0),
5016 CLASSIC | FLAG_NO_DATA,
5027 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
5028 BPF_STMT(BPF_RET | BPF_A, 0x0),
5030 CLASSIC | FLAG_NO_DATA,
5042 BPF_STMT(BPF_LD | BPF_IMM, 0x66),
5043 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
5044 BPF_STMT(BPF_RET | BPF_A, 0x0),
5046 CLASSIC | FLAG_NO_DATA,
5057 BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
5058 BPF_STMT(BPF_RET | BPF_A, 0x0),
5060 CLASSIC | FLAG_NO_DATA,
5072 BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5073 BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
5074 BPF_STMT(BPF_RET | BPF_A, 0x0),
5076 CLASSIC | FLAG_NO_DATA,
5087 BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
5088 BPF_STMT(BPF_RET | BPF_A, 0x0),
5090 CLASSIC | FLAG_NO_DATA,
5099 * A = A / X ; this halt the filter execution if X is 0
5102 BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5103 BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
5104 BPF_STMT(BPF_RET | BPF_K, 0x42),
5106 CLASSIC | FLAG_NO_DATA,
5117 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
5118 BPF_STMT(BPF_RET | BPF_A, 0x0),
5120 CLASSIC | FLAG_NO_DATA,
5129 * A = A mod X ; this halt the filter execution if X is 0
5132 BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5133 BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
5134 BPF_STMT(BPF_RET | BPF_K, 0x42),
5136 CLASSIC | FLAG_NO_DATA,
5147 BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
5148 BPF_STMT(BPF_RET | BPF_A, 0x0),
5150 CLASSIC | FLAG_NO_DATA,
5162 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
5163 BPF_STMT(BPF_RET | BPF_K, 0x42),
5164 BPF_STMT(BPF_RET | BPF_K, 0x66),
5166 CLASSIC | FLAG_NO_DATA,
5179 BPF_STMT(BPF_LD | BPF_IMM, 0x0),
5180 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
5181 BPF_STMT(BPF_RET | BPF_K, 0x42),
5182 BPF_STMT(BPF_RET | BPF_K, 0x66),
5184 CLASSIC | FLAG_NO_DATA,
5190 static struct net_device dev;
5192 static struct sk_buff *populate_skb(char *buf, int size)
5194 struct sk_buff *skb;
5196 if (size >= MAX_DATA)
5199 skb = alloc_skb(MAX_DATA, GFP_KERNEL);
5203 memcpy(__skb_put(skb, size), buf, size);
5205 /* Initialize a fake skb with test pattern. */
5206 skb_reset_mac_header(skb);
5207 skb->protocol = htons(ETH_P_IP);
5208 skb->pkt_type = SKB_TYPE;
5209 skb->mark = SKB_MARK;
5210 skb->hash = SKB_HASH;
5211 skb->queue_mapping = SKB_QUEUE_MAP;
5212 skb->vlan_tci = SKB_VLAN_TCI;
5214 skb->dev->ifindex = SKB_DEV_IFINDEX;
5215 skb->dev->type = SKB_DEV_TYPE;
5216 skb_set_network_header(skb, min(size, ETH_HLEN));
5221 static void *generate_test_data(struct bpf_test *test, int sub)
5223 struct sk_buff *skb;
5226 if (test->aux & FLAG_NO_DATA)
5229 /* Test case expects an skb, so populate one. Various
5230 * subtests generate skbs of different sizes based on
5233 skb = populate_skb(test->data, test->test[sub].data_size);
5237 if (test->aux & FLAG_SKB_FRAG) {
5239 * when the test requires a fragmented skb, add a
5240 * single fragment to the skb, filled with
5245 page = alloc_page(GFP_KERNEL);
5253 memcpy(ptr, test->frag_data, MAX_DATA);
5255 skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
5267 static void release_test_data(const struct bpf_test *test, void *data)
5269 if (test->aux & FLAG_NO_DATA)
5275 static int filter_length(int which)
5277 struct sock_filter *fp;
5280 if (tests[which].fill_helper)
5281 return tests[which].u.ptr.len;
5283 fp = tests[which].u.insns;
5284 for (len = MAX_INSNS - 1; len > 0; --len)
5285 if (fp[len].code != 0 || fp[len].k != 0)
5291 static void *filter_pointer(int which)
5293 if (tests[which].fill_helper)
5294 return tests[which].u.ptr.insns;
5296 return tests[which].u.insns;
5299 static struct bpf_prog *generate_filter(int which, int *err)
5301 __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
5302 unsigned int flen = filter_length(which);
5303 void *fptr = filter_pointer(which);
5304 struct sock_fprog_kern fprog;
5305 struct bpf_prog *fp;
5307 switch (test_type) {
5309 fprog.filter = fptr;
5312 *err = bpf_prog_create(&fp, &fprog);
5313 if (tests[which].aux & FLAG_EXPECTED_FAIL) {
5314 if (*err == tests[which].expected_errcode) {
5316 /* Verifier rejected filter as expected. */
5320 pr_cont("UNEXPECTED_PASS\n");
5321 /* Verifier didn't reject the test that's
5322 * bad enough, just return!
5329 pr_cont("FAIL to prog_create err=%d len=%d\n",
5336 fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
5338 pr_cont("UNEXPECTED_FAIL no memory left\n");
5344 /* Type doesn't really matter here as long as it's not unspec. */
5345 fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
5346 memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
5348 *err = bpf_prog_select_runtime(fp);
5350 pr_cont("FAIL to select_runtime err=%d\n", *err);
5360 static void release_filter(struct bpf_prog *fp, int which)
5362 __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
5364 switch (test_type) {
5366 bpf_prog_destroy(fp);
5374 static int __run_one(const struct bpf_prog *fp, const void *data,
5375 int runs, u64 *duration)
5380 start = ktime_get_ns();
5382 for (i = 0; i < runs; i++)
5383 ret = BPF_PROG_RUN(fp, data);
5385 finish = ktime_get_ns();
5387 *duration = finish - start;
5388 do_div(*duration, runs);
5393 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
5395 int err_cnt = 0, i, runs = MAX_TESTRUNS;
5397 for (i = 0; i < MAX_SUBTESTS; i++) {
5403 * NOTE: Several sub-tests may be present, in which case
5404 * a zero {data_size, result} tuple indicates the end of
5405 * the sub-test array. The first test is always run,
5406 * even if both data_size and result happen to be zero.
5409 test->test[i].data_size == 0 &&
5410 test->test[i].result == 0)
5413 data = generate_test_data(test, i);
5414 if (!data && !(test->aux & FLAG_NO_DATA)) {
5415 pr_cont("data generation failed ");
5419 ret = __run_one(fp, data, runs, &duration);
5420 release_test_data(test, data);
5422 if (ret == test->test[i].result) {
5423 pr_cont("%lld ", duration);
5425 pr_cont("ret %d != %d ", ret,
5426 test->test[i].result);
5434 static char test_name[64];
5435 module_param_string(test_name, test_name, sizeof(test_name), 0);
5437 static int test_id = -1;
5438 module_param(test_id, int, 0);
5440 static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
5441 module_param_array(test_range, int, NULL, 0);
5443 static __init int find_test_index(const char *test_name)
5447 for (i = 0; i < ARRAY_SIZE(tests); i++) {
5448 if (!strcmp(tests[i].descr, test_name))
5454 static __init int prepare_bpf_tests(void)
5460 * if a test_id was specified, use test_range to
5461 * cover only that test.
5463 if (test_id >= ARRAY_SIZE(tests)) {
5464 pr_err("test_bpf: invalid test_id specified.\n");
5468 test_range[0] = test_id;
5469 test_range[1] = test_id;
5470 } else if (*test_name) {
5472 * if a test_name was specified, find it and setup
5473 * test_range to cover only that test.
5475 int idx = find_test_index(test_name);
5478 pr_err("test_bpf: no test named '%s' found.\n",
5482 test_range[0] = idx;
5483 test_range[1] = idx;
5486 * check that the supplied test_range is valid.
5488 if (test_range[0] >= ARRAY_SIZE(tests) ||
5489 test_range[1] >= ARRAY_SIZE(tests) ||
5490 test_range[0] < 0 || test_range[1] < 0) {
5491 pr_err("test_bpf: test_range is out of bound.\n");
5495 if (test_range[1] < test_range[0]) {
5496 pr_err("test_bpf: test_range is ending before it starts.\n");
5501 for (i = 0; i < ARRAY_SIZE(tests); i++) {
5502 if (tests[i].fill_helper &&
5503 tests[i].fill_helper(&tests[i]) < 0)
5510 static __init void destroy_bpf_tests(void)
5514 for (i = 0; i < ARRAY_SIZE(tests); i++) {
5515 if (tests[i].fill_helper)
5516 kfree(tests[i].u.ptr.insns);
5520 static bool exclude_test(int test_id)
5522 return test_id < test_range[0] || test_id > test_range[1];
5525 static __init int test_bpf(void)
5527 int i, err_cnt = 0, pass_cnt = 0;
5528 int jit_cnt = 0, run_cnt = 0;
5530 for (i = 0; i < ARRAY_SIZE(tests); i++) {
5531 struct bpf_prog *fp;
5534 if (exclude_test(i))
5537 pr_info("#%d %s ", i, tests[i].descr);
5539 fp = generate_filter(i, &err);
5549 pr_cont("jited:%u ", fp->jited);
5555 err = run_one(fp, &tests[i]);
5556 release_filter(fp, i);
5559 pr_cont("FAIL (%d times)\n", err);
5567 pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
5568 pass_cnt, err_cnt, jit_cnt, run_cnt);
5570 return err_cnt ? -EINVAL : 0;
5573 static int __init test_bpf_init(void)
5577 ret = prepare_bpf_tests();
5583 destroy_bpf_tests();
5587 static void __exit test_bpf_exit(void)
5591 module_init(test_bpf_init);
5592 module_exit(test_bpf_exit);
5594 MODULE_LICENSE("GPL");