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