linux/lib/test_bpf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Testsuite for BPF interpreter and BPF JIT compiler
   4 *
   5 * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
   6 */
   7
   8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9
  10#include <linux/init.h>
  11#include <linux/module.h>
  12#include <linux/filter.h>
  13#include <linux/bpf.h>
  14#include <linux/skbuff.h>
  15#include <linux/netdevice.h>
  16#include <linux/if_vlan.h>
  17#include <linux/random.h>
  18#include <linux/highmem.h>
  19#include <linux/sched.h>
  20
  21/* General test specific settings */
  22#define MAX_SUBTESTS    3
  23#define MAX_TESTRUNS    1000
  24#define MAX_DATA        128
  25#define MAX_INSNS       512
  26#define MAX_K           0xffffFFFF
  27
  28/* Few constants used to init test 'skb' */
  29#define SKB_TYPE        3
  30#define SKB_MARK        0x1234aaaa
  31#define SKB_HASH        0x1234aaab
  32#define SKB_QUEUE_MAP   123
  33#define SKB_VLAN_TCI    0xffff
  34#define SKB_VLAN_PRESENT        1
  35#define SKB_DEV_IFINDEX 577
  36#define SKB_DEV_TYPE    588
  37
  38/* Redefine REGs to make tests less verbose */
  39#define R0              BPF_REG_0
  40#define R1              BPF_REG_1
  41#define R2              BPF_REG_2
  42#define R3              BPF_REG_3
  43#define R4              BPF_REG_4
  44#define R5              BPF_REG_5
  45#define R6              BPF_REG_6
  46#define R7              BPF_REG_7
  47#define R8              BPF_REG_8
  48#define R9              BPF_REG_9
  49#define R10             BPF_REG_10
  50
  51/* Flags that can be passed to test cases */
  52#define FLAG_NO_DATA            BIT(0)
  53#define FLAG_EXPECTED_FAIL      BIT(1)
  54#define FLAG_SKB_FRAG           BIT(2)
  55
  56enum {
  57        CLASSIC  = BIT(6),      /* Old BPF instructions only. */
  58        INTERNAL = BIT(7),      /* Extended instruction set.  */
  59};
  60
  61#define TEST_TYPE_MASK          (CLASSIC | INTERNAL)
  62
  63struct bpf_test {
  64        const char *descr;
  65        union {
  66                struct sock_filter insns[MAX_INSNS];
  67                struct bpf_insn insns_int[MAX_INSNS];
  68                struct {
  69                        void *insns;
  70                        unsigned int len;
  71                } ptr;
  72        } u;
  73        __u8 aux;
  74        __u8 data[MAX_DATA];
  75        struct {
  76                int data_size;
  77                __u32 result;
  78        } test[MAX_SUBTESTS];
  79        int (*fill_helper)(struct bpf_test *self);
  80        int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
  81        __u8 frag_data[MAX_DATA];
  82        int stack_depth; /* for eBPF only, since tests don't call verifier */
  83};
  84
  85/* Large test cases need separate allocation and fill handler. */
  86
  87static int bpf_fill_maxinsns1(struct bpf_test *self)
  88{
  89        unsigned int len = BPF_MAXINSNS;
  90        struct sock_filter *insn;
  91        __u32 k = ~0;
  92        int i;
  93
  94        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
  95        if (!insn)
  96                return -ENOMEM;
  97
  98        for (i = 0; i < len; i++, k--)
  99                insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
 100
 101        self->u.ptr.insns = insn;
 102        self->u.ptr.len = len;
 103
 104        return 0;
 105}
 106
 107static int bpf_fill_maxinsns2(struct bpf_test *self)
 108{
 109        unsigned int len = BPF_MAXINSNS;
 110        struct sock_filter *insn;
 111        int i;
 112
 113        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 114        if (!insn)
 115                return -ENOMEM;
 116
 117        for (i = 0; i < len; i++)
 118                insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
 119
 120        self->u.ptr.insns = insn;
 121        self->u.ptr.len = len;
 122
 123        return 0;
 124}
 125
 126static int bpf_fill_maxinsns3(struct bpf_test *self)
 127{
 128        unsigned int len = BPF_MAXINSNS;
 129        struct sock_filter *insn;
 130        struct rnd_state rnd;
 131        int i;
 132
 133        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 134        if (!insn)
 135                return -ENOMEM;
 136
 137        prandom_seed_state(&rnd, 3141592653589793238ULL);
 138
 139        for (i = 0; i < len - 1; i++) {
 140                __u32 k = prandom_u32_state(&rnd);
 141
 142                insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
 143        }
 144
 145        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 146
 147        self->u.ptr.insns = insn;
 148        self->u.ptr.len = len;
 149
 150        return 0;
 151}
 152
 153static int bpf_fill_maxinsns4(struct bpf_test *self)
 154{
 155        unsigned int len = BPF_MAXINSNS + 1;
 156        struct sock_filter *insn;
 157        int i;
 158
 159        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 160        if (!insn)
 161                return -ENOMEM;
 162
 163        for (i = 0; i < len; i++)
 164                insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
 165
 166        self->u.ptr.insns = insn;
 167        self->u.ptr.len = len;
 168
 169        return 0;
 170}
 171
 172static int bpf_fill_maxinsns5(struct bpf_test *self)
 173{
 174        unsigned int len = BPF_MAXINSNS;
 175        struct sock_filter *insn;
 176        int i;
 177
 178        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 179        if (!insn)
 180                return -ENOMEM;
 181
 182        insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
 183
 184        for (i = 1; i < len - 1; i++)
 185                insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
 186
 187        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
 188
 189        self->u.ptr.insns = insn;
 190        self->u.ptr.len = len;
 191
 192        return 0;
 193}
 194
 195static int bpf_fill_maxinsns6(struct bpf_test *self)
 196{
 197        unsigned int len = BPF_MAXINSNS;
 198        struct sock_filter *insn;
 199        int i;
 200
 201        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 202        if (!insn)
 203                return -ENOMEM;
 204
 205        for (i = 0; i < len - 1; i++)
 206                insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
 207                                     SKF_AD_VLAN_TAG_PRESENT);
 208
 209        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 210
 211        self->u.ptr.insns = insn;
 212        self->u.ptr.len = len;
 213
 214        return 0;
 215}
 216
 217static int bpf_fill_maxinsns7(struct bpf_test *self)
 218{
 219        unsigned int len = BPF_MAXINSNS;
 220        struct sock_filter *insn;
 221        int i;
 222
 223        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 224        if (!insn)
 225                return -ENOMEM;
 226
 227        for (i = 0; i < len - 4; i++)
 228                insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
 229                                     SKF_AD_CPU);
 230
 231        insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
 232        insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
 233                                   SKF_AD_CPU);
 234        insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
 235        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 236
 237        self->u.ptr.insns = insn;
 238        self->u.ptr.len = len;
 239
 240        return 0;
 241}
 242
 243static int bpf_fill_maxinsns8(struct bpf_test *self)
 244{
 245        unsigned int len = BPF_MAXINSNS;
 246        struct sock_filter *insn;
 247        int i, jmp_off = len - 3;
 248
 249        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 250        if (!insn)
 251                return -ENOMEM;
 252
 253        insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
 254
 255        for (i = 1; i < len - 1; i++)
 256                insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
 257
 258        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 259
 260        self->u.ptr.insns = insn;
 261        self->u.ptr.len = len;
 262
 263        return 0;
 264}
 265
 266static int bpf_fill_maxinsns9(struct bpf_test *self)
 267{
 268        unsigned int len = BPF_MAXINSNS;
 269        struct bpf_insn *insn;
 270        int i;
 271
 272        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 273        if (!insn)
 274                return -ENOMEM;
 275
 276        insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
 277        insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
 278        insn[2] = BPF_EXIT_INSN();
 279
 280        for (i = 3; i < len - 2; i++)
 281                insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
 282
 283        insn[len - 2] = BPF_EXIT_INSN();
 284        insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
 285
 286        self->u.ptr.insns = insn;
 287        self->u.ptr.len = len;
 288
 289        return 0;
 290}
 291
 292static int bpf_fill_maxinsns10(struct bpf_test *self)
 293{
 294        unsigned int len = BPF_MAXINSNS, hlen = len - 2;
 295        struct bpf_insn *insn;
 296        int i;
 297
 298        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 299        if (!insn)
 300                return -ENOMEM;
 301
 302        for (i = 0; i < hlen / 2; i++)
 303                insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
 304        for (i = hlen - 1; i > hlen / 2; i--)
 305                insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
 306
 307        insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
 308        insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
 309        insn[hlen + 1] = BPF_EXIT_INSN();
 310
 311        self->u.ptr.insns = insn;
 312        self->u.ptr.len = len;
 313
 314        return 0;
 315}
 316
 317static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
 318                         unsigned int plen)
 319{
 320        struct sock_filter *insn;
 321        unsigned int rlen;
 322        int i, j;
 323
 324        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 325        if (!insn)
 326                return -ENOMEM;
 327
 328        rlen = (len % plen) - 1;
 329
 330        for (i = 0; i + plen < len; i += plen)
 331                for (j = 0; j < plen; j++)
 332                        insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
 333                                                 plen - 1 - j, 0, 0);
 334        for (j = 0; j < rlen; j++)
 335                insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
 336                                         0, 0);
 337
 338        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
 339
 340        self->u.ptr.insns = insn;
 341        self->u.ptr.len = len;
 342
 343        return 0;
 344}
 345
 346static int bpf_fill_maxinsns11(struct bpf_test *self)
 347{
 348        /* Hits 70 passes on x86_64 and triggers NOPs padding. */
 349        return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
 350}
 351
 352static int bpf_fill_maxinsns12(struct bpf_test *self)
 353{
 354        unsigned int len = BPF_MAXINSNS;
 355        struct sock_filter *insn;
 356        int i = 0;
 357
 358        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 359        if (!insn)
 360                return -ENOMEM;
 361
 362        insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
 363
 364        for (i = 1; i < len - 1; i++)
 365                insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
 366
 367        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
 368
 369        self->u.ptr.insns = insn;
 370        self->u.ptr.len = len;
 371
 372        return 0;
 373}
 374
 375static int bpf_fill_maxinsns13(struct bpf_test *self)
 376{
 377        unsigned int len = BPF_MAXINSNS;
 378        struct sock_filter *insn;
 379        int i = 0;
 380
 381        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 382        if (!insn)
 383                return -ENOMEM;
 384
 385        for (i = 0; i < len - 3; i++)
 386                insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
 387
 388        insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
 389        insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
 390        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 391
 392        self->u.ptr.insns = insn;
 393        self->u.ptr.len = len;
 394
 395        return 0;
 396}
 397
 398static int bpf_fill_ja(struct bpf_test *self)
 399{
 400        /* Hits exactly 11 passes on x86_64 JIT. */
 401        return __bpf_fill_ja(self, 12, 9);
 402}
 403
 404static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
 405{
 406        unsigned int len = BPF_MAXINSNS;
 407        struct sock_filter *insn;
 408        int i;
 409
 410        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 411        if (!insn)
 412                return -ENOMEM;
 413
 414        for (i = 0; i < len - 1; i += 2) {
 415                insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
 416                insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 417                                         SKF_AD_OFF + SKF_AD_CPU);
 418        }
 419
 420        insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
 421
 422        self->u.ptr.insns = insn;
 423        self->u.ptr.len = len;
 424
 425        return 0;
 426}
 427
 428static int __bpf_fill_stxdw(struct bpf_test *self, int size)
 429{
 430        unsigned int len = BPF_MAXINSNS;
 431        struct bpf_insn *insn;
 432        int i;
 433
 434        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 435        if (!insn)
 436                return -ENOMEM;
 437
 438        insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
 439        insn[1] = BPF_ST_MEM(size, R10, -40, 42);
 440
 441        for (i = 2; i < len - 2; i++)
 442                insn[i] = BPF_STX_XADD(size, R10, R0, -40);
 443
 444        insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
 445        insn[len - 1] = BPF_EXIT_INSN();
 446
 447        self->u.ptr.insns = insn;
 448        self->u.ptr.len = len;
 449        self->stack_depth = 40;
 450
 451        return 0;
 452}
 453
 454static int bpf_fill_stxw(struct bpf_test *self)
 455{
 456        return __bpf_fill_stxdw(self, BPF_W);
 457}
 458
 459static int bpf_fill_stxdw(struct bpf_test *self)
 460{
 461        return __bpf_fill_stxdw(self, BPF_DW);
 462}
 463
 464static int bpf_fill_long_jmp(struct bpf_test *self)
 465{
 466        unsigned int len = BPF_MAXINSNS;
 467        struct bpf_insn *insn;
 468        int i;
 469
 470        insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 471        if (!insn)
 472                return -ENOMEM;
 473
 474        insn[0] = BPF_ALU64_IMM(BPF_MOV, R0, 1);
 475        insn[1] = BPF_JMP_IMM(BPF_JEQ, R0, 1, len - 2 - 1);
 476
 477        /*
 478         * Fill with a complex 64-bit operation that expands to a lot of
 479         * instructions on 32-bit JITs. The large jump offset can then
 480         * overflow the conditional branch field size, triggering a branch
 481         * conversion mechanism in some JITs.
 482         *
 483         * Note: BPF_MAXINSNS of ALU64 MUL is enough to trigger such branch
 484         * conversion on the 32-bit MIPS JIT. For other JITs, the instruction
 485         * count and/or operation may need to be modified to trigger the
 486         * branch conversion.
 487         */
 488        for (i = 2; i < len - 1; i++)
 489                insn[i] = BPF_ALU64_IMM(BPF_MUL, R0, (i << 16) + i);
 490
 491        insn[len - 1] = BPF_EXIT_INSN();
 492
 493        self->u.ptr.insns = insn;
 494        self->u.ptr.len = len;
 495
 496        return 0;
 497}
 498
 499static struct bpf_test tests[] = {
 500        {
 501                "TAX",
 502                .u.insns = {
 503                        BPF_STMT(BPF_LD | BPF_IMM, 1),
 504                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 505                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 506                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 507                        BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
 508                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 509                        BPF_STMT(BPF_LD | BPF_LEN, 0),
 510                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 511                        BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
 512                        BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
 513                        BPF_STMT(BPF_RET | BPF_A, 0)
 514                },
 515                CLASSIC,
 516                { 10, 20, 30, 40, 50 },
 517                { { 2, 10 }, { 3, 20 }, { 4, 30 } },
 518        },
 519        {
 520                "TXA",
 521                .u.insns = {
 522                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 523                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
 524                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 525                        BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
 526                },
 527                CLASSIC,
 528                { 10, 20, 30, 40, 50 },
 529                { { 1, 2 }, { 3, 6 }, { 4, 8 } },
 530        },
 531        {
 532                "ADD_SUB_MUL_K",
 533                .u.insns = {
 534                        BPF_STMT(BPF_LD | BPF_IMM, 1),
 535                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
 536                        BPF_STMT(BPF_LDX | BPF_IMM, 3),
 537                        BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
 538                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
 539                        BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
 540                        BPF_STMT(BPF_RET | BPF_A, 0)
 541                },
 542                CLASSIC | FLAG_NO_DATA,
 543                { },
 544                { { 0, 0xfffffffd } }
 545        },
 546        {
 547                "DIV_MOD_KX",
 548                .u.insns = {
 549                        BPF_STMT(BPF_LD | BPF_IMM, 8),
 550                        BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
 551                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 552                        BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 553                        BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
 554                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 555                        BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 556                        BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
 557                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 558                        BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 559                        BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
 560                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 561                        BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 562                        BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
 563                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 564                        BPF_STMT(BPF_RET | BPF_A, 0)
 565                },
 566                CLASSIC | FLAG_NO_DATA,
 567                { },
 568                { { 0, 0x20000000 } }
 569        },
 570        {
 571                "AND_OR_LSH_K",
 572                .u.insns = {
 573                        BPF_STMT(BPF_LD | BPF_IMM, 0xff),
 574                        BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
 575                        BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
 576                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 577                        BPF_STMT(BPF_LD | BPF_IMM, 0xf),
 578                        BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
 579                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 580                        BPF_STMT(BPF_RET | BPF_A, 0)
 581                },
 582                CLASSIC | FLAG_NO_DATA,
 583                { },
 584                { { 0, 0x800000ff }, { 1, 0x800000ff } },
 585        },
 586        {
 587                "LD_IMM_0",
 588                .u.insns = {
 589                        BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
 590                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
 591                        BPF_STMT(BPF_RET | BPF_K, 0),
 592                        BPF_STMT(BPF_RET | BPF_K, 1),
 593                },
 594                CLASSIC,
 595                { },
 596                { { 1, 1 } },
 597        },
 598        {
 599                "LD_IND",
 600                .u.insns = {
 601                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 602                        BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
 603                        BPF_STMT(BPF_RET | BPF_K, 1)
 604                },
 605                CLASSIC,
 606                { },
 607                { { 1, 0 }, { 10, 0 }, { 60, 0 } },
 608        },
 609        {
 610                "LD_ABS",
 611                .u.insns = {
 612                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
 613                        BPF_STMT(BPF_RET | BPF_K, 1)
 614                },
 615                CLASSIC,
 616                { },
 617                { { 1, 0 }, { 10, 0 }, { 60, 0 } },
 618        },
 619        {
 620                "LD_ABS_LL",
 621                .u.insns = {
 622                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
 623                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 624                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
 625                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 626                        BPF_STMT(BPF_RET | BPF_A, 0)
 627                },
 628                CLASSIC,
 629                { 1, 2, 3 },
 630                { { 1, 0 }, { 2, 3 } },
 631        },
 632        {
 633                "LD_IND_LL",
 634                .u.insns = {
 635                        BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
 636                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 637                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 638                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 639                        BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
 640                        BPF_STMT(BPF_RET | BPF_A, 0)
 641                },
 642                CLASSIC,
 643                { 1, 2, 3, 0xff },
 644                { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
 645        },
 646        {
 647                "LD_ABS_NET",
 648                .u.insns = {
 649                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
 650                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 651                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
 652                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 653                        BPF_STMT(BPF_RET | BPF_A, 0)
 654                },
 655                CLASSIC,
 656                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
 657                { { 15, 0 }, { 16, 3 } },
 658        },
 659        {
 660                "LD_IND_NET",
 661                .u.insns = {
 662                        BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
 663                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 664                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 665                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 666                        BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
 667                        BPF_STMT(BPF_RET | BPF_A, 0)
 668                },
 669                CLASSIC,
 670                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
 671                { { 14, 0 }, { 15, 1 }, { 17, 3 } },
 672        },
 673        {
 674                "LD_PKTTYPE",
 675                .u.insns = {
 676                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 677                                 SKF_AD_OFF + SKF_AD_PKTTYPE),
 678                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
 679                        BPF_STMT(BPF_RET | BPF_K, 1),
 680                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 681                                 SKF_AD_OFF + SKF_AD_PKTTYPE),
 682                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
 683                        BPF_STMT(BPF_RET | BPF_K, 1),
 684                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 685                                 SKF_AD_OFF + SKF_AD_PKTTYPE),
 686                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
 687                        BPF_STMT(BPF_RET | BPF_K, 1),
 688                        BPF_STMT(BPF_RET | BPF_A, 0)
 689                },
 690                CLASSIC,
 691                { },
 692                { { 1, 3 }, { 10, 3 } },
 693        },
 694        {
 695                "LD_MARK",
 696                .u.insns = {
 697                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 698                                 SKF_AD_OFF + SKF_AD_MARK),
 699                        BPF_STMT(BPF_RET | BPF_A, 0)
 700                },
 701                CLASSIC,
 702                { },
 703                { { 1, SKB_MARK}, { 10, SKB_MARK} },
 704        },
 705        {
 706                "LD_RXHASH",
 707                .u.insns = {
 708                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 709                                 SKF_AD_OFF + SKF_AD_RXHASH),
 710                        BPF_STMT(BPF_RET | BPF_A, 0)
 711                },
 712                CLASSIC,
 713                { },
 714                { { 1, SKB_HASH}, { 10, SKB_HASH} },
 715        },
 716        {
 717                "LD_QUEUE",
 718                .u.insns = {
 719                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 720                                 SKF_AD_OFF + SKF_AD_QUEUE),
 721                        BPF_STMT(BPF_RET | BPF_A, 0)
 722                },
 723                CLASSIC,
 724                { },
 725                { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
 726        },
 727        {
 728                "LD_PROTOCOL",
 729                .u.insns = {
 730                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
 731                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
 732                        BPF_STMT(BPF_RET | BPF_K, 0),
 733                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 734                                 SKF_AD_OFF + SKF_AD_PROTOCOL),
 735                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 736                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 737                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
 738                        BPF_STMT(BPF_RET | BPF_K, 0),
 739                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
 740                        BPF_STMT(BPF_RET | BPF_A, 0)
 741                },
 742                CLASSIC,
 743                { 10, 20, 30 },
 744                { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
 745        },
 746        {
 747                "LD_VLAN_TAG",
 748                .u.insns = {
 749                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 750                                 SKF_AD_OFF + SKF_AD_VLAN_TAG),
 751                        BPF_STMT(BPF_RET | BPF_A, 0)
 752                },
 753                CLASSIC,
 754                { },
 755                {
 756                        { 1, SKB_VLAN_TCI },
 757                        { 10, SKB_VLAN_TCI }
 758                },
 759        },
 760        {
 761                "LD_VLAN_TAG_PRESENT",
 762                .u.insns = {
 763                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 764                                 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
 765                        BPF_STMT(BPF_RET | BPF_A, 0)
 766                },
 767                CLASSIC,
 768                { },
 769                {
 770                        { 1, SKB_VLAN_PRESENT },
 771                        { 10, SKB_VLAN_PRESENT }
 772                },
 773        },
 774        {
 775                "LD_IFINDEX",
 776                .u.insns = {
 777                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 778                                 SKF_AD_OFF + SKF_AD_IFINDEX),
 779                        BPF_STMT(BPF_RET | BPF_A, 0)
 780                },
 781                CLASSIC,
 782                { },
 783                { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
 784        },
 785        {
 786                "LD_HATYPE",
 787                .u.insns = {
 788                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 789                                 SKF_AD_OFF + SKF_AD_HATYPE),
 790                        BPF_STMT(BPF_RET | BPF_A, 0)
 791                },
 792                CLASSIC,
 793                { },
 794                { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
 795        },
 796        {
 797                "LD_CPU",
 798                .u.insns = {
 799                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 800                                 SKF_AD_OFF + SKF_AD_CPU),
 801                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
 802                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 803                                 SKF_AD_OFF + SKF_AD_CPU),
 804                        BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
 805                        BPF_STMT(BPF_RET | BPF_A, 0)
 806                },
 807                CLASSIC,
 808                { },
 809                { { 1, 0 }, { 10, 0 } },
 810        },
 811        {
 812                "LD_NLATTR",
 813                .u.insns = {
 814                        BPF_STMT(BPF_LDX | BPF_IMM, 2),
 815                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
 816                        BPF_STMT(BPF_LDX | BPF_IMM, 3),
 817                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 818                                 SKF_AD_OFF + SKF_AD_NLATTR),
 819                        BPF_STMT(BPF_RET | BPF_A, 0)
 820                },
 821                CLASSIC,
 822#ifdef __BIG_ENDIAN
 823                { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
 824#else
 825                { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
 826#endif
 827                { { 4, 0 }, { 20, 6 } },
 828        },
 829        {
 830                "LD_NLATTR_NEST",
 831                .u.insns = {
 832                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 833                        BPF_STMT(BPF_LDX | BPF_IMM, 3),
 834                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 835                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 836                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 837                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 838                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 839                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 840                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 841                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 842                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 843                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 844                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 845                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 846                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 847                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 848                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 849                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 850                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 851                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 852                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 853                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 854                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 855                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 856                                 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 857                        BPF_STMT(BPF_RET | BPF_A, 0)
 858                },
 859                CLASSIC,
 860#ifdef __BIG_ENDIAN
 861                { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
 862#else
 863                { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
 864#endif
 865                { { 4, 0 }, { 20, 10 } },
 866        },
 867        {
 868                "LD_PAYLOAD_OFF",
 869                .u.insns = {
 870                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 871                                 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 872                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 873                                 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 874                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 875                                 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 876                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 877                                 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 878                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 879                                 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 880                        BPF_STMT(BPF_RET | BPF_A, 0)
 881                },
 882                CLASSIC,
 883                /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
 884                 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
 885                 * id 9737, seq 1, length 64
 886                 */
 887                { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 888                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 889                  0x08, 0x00,
 890                  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
 891                  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
 892                { { 30, 0 }, { 100, 42 } },
 893        },
 894        {
 895                "LD_ANC_XOR",
 896                .u.insns = {
 897                        BPF_STMT(BPF_LD | BPF_IMM, 10),
 898                        BPF_STMT(BPF_LDX | BPF_IMM, 300),
 899                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 900                                 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
 901                        BPF_STMT(BPF_RET | BPF_A, 0)
 902                },
 903                CLASSIC,
 904                { },
 905                { { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } },
 906        },
 907        {
 908                "SPILL_FILL",
 909                .u.insns = {
 910                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 911                        BPF_STMT(BPF_LD | BPF_IMM, 2),
 912                        BPF_STMT(BPF_ALU | BPF_RSH, 1),
 913                        BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
 914                        BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
 915                        BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
 916                        BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
 917                        BPF_STMT(BPF_STX, 15), /* M3 = len */
 918                        BPF_STMT(BPF_LDX | BPF_MEM, 1),
 919                        BPF_STMT(BPF_LD | BPF_MEM, 2),
 920                        BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
 921                        BPF_STMT(BPF_LDX | BPF_MEM, 15),
 922                        BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
 923                        BPF_STMT(BPF_RET | BPF_A, 0)
 924                },
 925                CLASSIC,
 926                { },
 927                { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
 928        },
 929        {
 930                "JEQ",
 931                .u.insns = {
 932                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 933                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 934                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
 935                        BPF_STMT(BPF_RET | BPF_K, 1),
 936                        BPF_STMT(BPF_RET | BPF_K, MAX_K)
 937                },
 938                CLASSIC,
 939                { 3, 3, 3, 3, 3 },
 940                { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
 941        },
 942        {
 943                "JGT",
 944                .u.insns = {
 945                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 946                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 947                        BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
 948                        BPF_STMT(BPF_RET | BPF_K, 1),
 949                        BPF_STMT(BPF_RET | BPF_K, MAX_K)
 950                },
 951                CLASSIC,
 952                { 4, 4, 4, 3, 3 },
 953                { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
 954        },
 955        {
 956                "JGE (jt 0), test 1",
 957                .u.insns = {
 958                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 959                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 960                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
 961                        BPF_STMT(BPF_RET | BPF_K, 1),
 962                        BPF_STMT(BPF_RET | BPF_K, MAX_K)
 963                },
 964                CLASSIC,
 965                { 4, 4, 4, 3, 3 },
 966                { { 2, 0 }, { 3, 1 }, { 4, 1 } },
 967        },
 968        {
 969                "JGE (jt 0), test 2",
 970                .u.insns = {
 971                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 972                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 973                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
 974                        BPF_STMT(BPF_RET | BPF_K, 1),
 975                        BPF_STMT(BPF_RET | BPF_K, MAX_K)
 976                },
 977                CLASSIC,
 978                { 4, 4, 5, 3, 3 },
 979                { { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
 980        },
 981        {
 982                "JGE",
 983                .u.insns = {
 984                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
 985                        BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
 986                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
 987                        BPF_STMT(BPF_RET | BPF_K, 10),
 988                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
 989                        BPF_STMT(BPF_RET | BPF_K, 20),
 990                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
 991                        BPF_STMT(BPF_RET | BPF_K, 30),
 992                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
 993                        BPF_STMT(BPF_RET | BPF_K, 40),
 994                        BPF_STMT(BPF_RET | BPF_K, MAX_K)
 995                },
 996                CLASSIC,
 997                { 1, 2, 3, 4, 5 },
 998                { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
 999        },
1000        {
1001                "JSET",
1002                .u.insns = {
1003                        BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1004                        BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
1005                        BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1006                        BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1007                        BPF_STMT(BPF_LDX | BPF_LEN, 0),
1008                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
1009                        BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
1010                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
1011                        BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
1012                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
1013                        BPF_STMT(BPF_RET | BPF_K, 10),
1014                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
1015                        BPF_STMT(BPF_RET | BPF_K, 20),
1016                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1017                        BPF_STMT(BPF_RET | BPF_K, 30),
1018                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1019                        BPF_STMT(BPF_RET | BPF_K, 30),
1020                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1021                        BPF_STMT(BPF_RET | BPF_K, 30),
1022                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1023                        BPF_STMT(BPF_RET | BPF_K, 30),
1024                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1025                        BPF_STMT(BPF_RET | BPF_K, 30),
1026                        BPF_STMT(BPF_RET | BPF_K, MAX_K)
1027                },
1028                CLASSIC,
1029                { 0, 0xAA, 0x55, 1 },
1030                { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
1031        },
1032        {
1033                "tcpdump port 22",
1034                .u.insns = {
1035                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1036                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
1037                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
1038                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1039                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1040                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
1041                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
1042                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
1043                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
1044                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
1045                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
1046                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1047                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1048                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1049                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
1050                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1051                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
1052                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1053                        BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1054                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1055                        BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1056                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
1057                        BPF_STMT(BPF_RET | BPF_K, 0xffff),
1058                        BPF_STMT(BPF_RET | BPF_K, 0),
1059                },
1060                CLASSIC,
1061                /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
1062                 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
1063                 * seq 1305692979:1305693027, ack 3650467037, win 65535,
1064                 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
1065                 */
1066                { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1067                  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1068                  0x08, 0x00,
1069                  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1070                  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1071                  0x0a, 0x01, 0x01, 0x95, /* ip src */
1072                  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1073                  0xc2, 0x24,
1074                  0x00, 0x16 /* dst port */ },
1075                { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1076        },
1077        {
1078                "tcpdump complex",
1079                .u.insns = {
1080                        /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
1081                         * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
1082                         * (len > 115 or len < 30000000000)' -d
1083                         */
1084                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1085                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
1086                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
1087                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1088                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
1089                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1090                        BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
1091                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1092                        BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1093                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1094                        BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1095                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
1096                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
1097                        BPF_STMT(BPF_ST, 1),
1098                        BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
1099                        BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
1100                        BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
1101                        BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
1102                        BPF_STMT(BPF_LD | BPF_MEM, 1),
1103                        BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
1104                        BPF_STMT(BPF_ST, 5),
1105                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1106                        BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
1107                        BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
1108                        BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
1109                        BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
1110                        BPF_STMT(BPF_LD | BPF_MEM, 5),
1111                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
1112                        BPF_STMT(BPF_LD | BPF_LEN, 0),
1113                        BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
1114                        BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
1115                        BPF_STMT(BPF_RET | BPF_K, 0xffff),
1116                        BPF_STMT(BPF_RET | BPF_K, 0),
1117                },
1118                CLASSIC,
1119                { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1120                  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1121                  0x08, 0x00,
1122                  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1123                  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1124                  0x0a, 0x01, 0x01, 0x95, /* ip src */
1125                  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1126                  0xc2, 0x24,
1127                  0x00, 0x16 /* dst port */ },
1128                { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1129        },
1130        {
1131                "RET_A",
1132                .u.insns = {
1133                        /* check that uninitialized X and A contain zeros */
1134                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
1135                        BPF_STMT(BPF_RET | BPF_A, 0)
1136                },
1137                CLASSIC,
1138                { },
1139                { {1, 0}, {2, 0} },
1140        },
1141        {
1142                "INT: ADD trivial",
1143                .u.insns_int = {
1144                        BPF_ALU64_IMM(BPF_MOV, R1, 1),
1145                        BPF_ALU64_IMM(BPF_ADD, R1, 2),
1146                        BPF_ALU64_IMM(BPF_MOV, R2, 3),
1147                        BPF_ALU64_REG(BPF_SUB, R1, R2),
1148                        BPF_ALU64_IMM(BPF_ADD, R1, -1),
1149                        BPF_ALU64_IMM(BPF_MUL, R1, 3),
1150                        BPF_ALU64_REG(BPF_MOV, R0, R1),
1151                        BPF_EXIT_INSN(),
1152                },
1153                INTERNAL,
1154                { },
1155                { { 0, 0xfffffffd } }
1156        },
1157        {
1158                "INT: MUL_X",
1159                .u.insns_int = {
1160                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
1161                        BPF_ALU64_IMM(BPF_MOV, R1, -1),
1162                        BPF_ALU64_IMM(BPF_MOV, R2, 3),
1163                        BPF_ALU64_REG(BPF_MUL, R1, R2),
1164                        BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
1165                        BPF_EXIT_INSN(),
1166                        BPF_ALU64_IMM(BPF_MOV, R0, 1),
1167                        BPF_EXIT_INSN(),
1168                },
1169                INTERNAL,
1170                { },
1171                { { 0, 1 } }
1172        },
1173        {
1174                "INT: MUL_X2",
1175                .u.insns_int = {
1176                        BPF_ALU32_IMM(BPF_MOV, R0, -1),
1177                        BPF_ALU32_IMM(BPF_MOV, R1, -1),
1178                        BPF_ALU32_IMM(BPF_MOV, R2, 3),
1179                        BPF_ALU64_REG(BPF_MUL, R1, R2),
1180                        BPF_ALU64_IMM(BPF_RSH, R1, 8),
1181                        BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
1182                        BPF_EXIT_INSN(),
1183                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
1184                        BPF_EXIT_INSN(),
1185                },
1186                INTERNAL,
1187                { },
1188                { { 0, 1 } }
1189        },
1190        {
1191                "INT: MUL32_X",
1192                .u.insns_int = {
1193                        BPF_ALU32_IMM(BPF_MOV, R0, -1),
1194                        BPF_ALU64_IMM(BPF_MOV, R1, -1),
1195                        BPF_ALU32_IMM(BPF_MOV, R2, 3),
1196                        BPF_ALU32_REG(BPF_MUL, R1, R2),
1197                        BPF_ALU64_IMM(BPF_RSH, R1, 8),
1198                        BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
1199                        BPF_EXIT_INSN(),
1200                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
1201                        BPF_EXIT_INSN(),
1202                },
1203                INTERNAL,
1204                { },
1205                { { 0, 1 } }
1206        },
1207        {
1208                /* Have to test all register combinations, since
1209                 * JITing of different registers will produce
1210                 * different asm code.
1211                 */
1212                "INT: ADD 64-bit",
1213                .u.insns_int = {
1214                        BPF_ALU64_IMM(BPF_MOV, R0, 0),
1215                        BPF_ALU64_IMM(BPF_MOV, R1, 1),
1216                        BPF_ALU64_IMM(BPF_MOV, R2, 2),
1217                        BPF_ALU64_IMM(BPF_MOV, R3, 3),
1218                        BPF_ALU64_IMM(BPF_MOV, R4, 4),
1219                        BPF_ALU64_IMM(BPF_MOV, R5, 5),
1220                        BPF_ALU64_IMM(BPF_MOV, R6, 6),
1221                        BPF_ALU64_IMM(BPF_MOV, R7, 7),
1222                        BPF_ALU64_IMM(BPF_MOV, R8, 8),
1223                        BPF_ALU64_IMM(BPF_MOV, R9, 9),
1224                        BPF_ALU64_IMM(BPF_ADD, R0, 20),
1225                        BPF_ALU64_IMM(BPF_ADD, R1, 20),
1226                        BPF_ALU64_IMM(BPF_ADD, R2, 20),
1227                        BPF_ALU64_IMM(BPF_ADD, R3, 20),
1228                        BPF_ALU64_IMM(BPF_ADD, R4, 20),
1229                        BPF_ALU64_IMM(BPF_ADD, R5, 20),
1230                        BPF_ALU64_IMM(BPF_ADD, R6, 20),
1231                        BPF_ALU64_IMM(BPF_ADD, R7, 20),
1232                        BPF_ALU64_IMM(BPF_ADD, R8, 20),
1233                        BPF_ALU64_IMM(BPF_ADD, R9, 20),
1234                        BPF_ALU64_IMM(BPF_SUB, R0, 10),
1235                        BPF_ALU64_IMM(BPF_SUB, R1, 10),
1236                        BPF_ALU64_IMM(BPF_SUB, R2, 10),
1237                        BPF_ALU64_IMM(BPF_SUB, R3, 10),
1238                        BPF_ALU64_IMM(BPF_SUB, R4, 10),
1239                        BPF_ALU64_IMM(BPF_SUB, R5, 10),
1240                        BPF_ALU64_IMM(BPF_SUB, R6, 10),
1241                        BPF_ALU64_IMM(BPF_SUB, R7, 10),
1242                        BPF_ALU64_IMM(BPF_SUB, R8, 10),
1243                        BPF_ALU64_IMM(BPF_SUB, R9, 10),
1244                        BPF_ALU64_REG(BPF_ADD, R0, R0),
1245                        BPF_ALU64_REG(BPF_ADD, R0, R1),
1246                        BPF_ALU64_REG(BPF_ADD, R0, R2),
1247                        BPF_ALU64_REG(BPF_ADD, R0, R3),
1248                        BPF_ALU64_REG(BPF_ADD, R0, R4),
1249                        BPF_ALU64_REG(BPF_ADD, R0, R5),
1250                        BPF_ALU64_REG(BPF_ADD, R0, R6),
1251                        BPF_ALU64_REG(BPF_ADD, R0, R7),
1252                        BPF_ALU64_REG(BPF_ADD, R0, R8),
1253                        BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1254                        BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1255                        BPF_EXIT_INSN(),
1256                        BPF_ALU64_REG(BPF_ADD, R1, R0),
1257                        BPF_ALU64_REG(BPF_ADD, R1, R1),
1258                        BPF_ALU64_REG(BPF_ADD, R1, R2),
1259                        BPF_ALU64_REG(BPF_ADD, R1, R3),
1260                        BPF_ALU64_REG(BPF_ADD, R1, R4),
1261                        BPF_ALU64_REG(BPF_ADD, R1, R5),
1262                        BPF_ALU64_REG(BPF_ADD, R1, R6),
1263                        BPF_ALU64_REG(BPF_ADD, R1, R7),
1264                        BPF_ALU64_REG(BPF_ADD, R1, R8),
1265                        BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1266                        BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1267                        BPF_EXIT_INSN(),
1268                        BPF_ALU64_REG(BPF_ADD, R2, R0),
1269                        BPF_ALU64_REG(BPF_ADD, R2, R1),
1270                        BPF_ALU64_REG(BPF_ADD, R2, R2),
1271                        BPF_ALU64_REG(BPF_ADD, R2, R3),
1272                        BPF_ALU64_REG(BPF_ADD, R2, R4),
1273                        BPF_ALU64_REG(BPF_ADD, R2, R5),
1274                        BPF_ALU64_REG(BPF_ADD, R2, R6),
1275                        BPF_ALU64_REG(BPF_ADD, R2, R7),
1276                        BPF_ALU64_REG(BPF_ADD, R2, R8),
1277                        BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1278                        BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1279                        BPF_EXIT_INSN(),
1280                        BPF_ALU64_REG(BPF_ADD, R3, R0),
1281                        BPF_ALU64_REG(BPF_ADD, R3, R1),
1282                        BPF_ALU64_REG(BPF_ADD, R3, R2),
1283                        BPF_ALU64_REG(BPF_ADD, R3, R3),
1284                        BPF_ALU64_REG(BPF_ADD, R3, R4),
1285                        BPF_ALU64_REG(BPF_ADD, R3, R5),
1286                        BPF_ALU64_REG(BPF_ADD, R3, R6),
1287                        BPF_ALU64_REG(BPF_ADD, R3, R7),
1288                        BPF_ALU64_REG(BPF_ADD, R3, R8),
1289                        BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1290                        BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1291                        BPF_EXIT_INSN(),
1292                        BPF_ALU64_REG(BPF_ADD, R4, R0),
1293                        BPF_ALU64_REG(BPF_ADD, R4, R1),
1294                        BPF_ALU64_REG(BPF_ADD, R4, R2),
1295                        BPF_ALU64_REG(BPF_ADD, R4, R3),
1296                        BPF_ALU64_REG(BPF_ADD, R4, R4),
1297                        BPF_ALU64_REG(BPF_ADD, R4, R5),
1298                        BPF_ALU64_REG(BPF_ADD, R4, R6),
1299                        BPF_ALU64_REG(BPF_ADD, R4, R7),
1300                        BPF_ALU64_REG(BPF_ADD, R4, R8),
1301                        BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1302                        BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1303                        BPF_EXIT_INSN(),
1304                        BPF_ALU64_REG(BPF_ADD, R5, R0),
1305                        BPF_ALU64_REG(BPF_ADD, R5, R1),
1306                        BPF_ALU64_REG(BPF_ADD, R5, R2),
1307                        BPF_ALU64_REG(BPF_ADD, R5, R3),
1308                        BPF_ALU64_REG(BPF_ADD, R5, R4),
1309                        BPF_ALU64_REG(BPF_ADD, R5, R5),
1310                        BPF_ALU64_REG(BPF_ADD, R5, R6),
1311                        BPF_ALU64_REG(BPF_ADD, R5, R7),
1312                        BPF_ALU64_REG(BPF_ADD, R5, R8),
1313                        BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1314                        BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1315                        BPF_EXIT_INSN(),
1316                        BPF_ALU64_REG(BPF_ADD, R6, R0),
1317                        BPF_ALU64_REG(BPF_ADD, R6, R1),
1318                        BPF_ALU64_REG(BPF_ADD, R6, R2),
1319                        BPF_ALU64_REG(BPF_ADD, R6, R3),
1320                        BPF_ALU64_REG(BPF_ADD, R6, R4),
1321                        BPF_ALU64_REG(BPF_ADD, R6, R5),
1322                        BPF_ALU64_REG(BPF_ADD, R6, R6),
1323                        BPF_ALU64_REG(BPF_ADD, R6, R7),
1324                        BPF_ALU64_REG(BPF_ADD, R6, R8),
1325                        BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1326                        BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1327                        BPF_EXIT_INSN(),
1328                        BPF_ALU64_REG(BPF_ADD, R7, R0),
1329                        BPF_ALU64_REG(BPF_ADD, R7, R1),
1330                        BPF_ALU64_REG(BPF_ADD, R7, R2),
1331                        BPF_ALU64_REG(BPF_ADD, R7, R3),
1332                        BPF_ALU64_REG(BPF_ADD, R7, R4),
1333                        BPF_ALU64_REG(BPF_ADD, R7, R5),
1334                        BPF_ALU64_REG(BPF_ADD, R7, R6),
1335                        BPF_ALU64_REG(BPF_ADD, R7, R7),
1336                        BPF_ALU64_REG(BPF_ADD, R7, R8),
1337                        BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1338                        BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1339                        BPF_EXIT_INSN(),
1340                        BPF_ALU64_REG(BPF_ADD, R8, R0),
1341                        BPF_ALU64_REG(BPF_ADD, R8, R1),
1342                        BPF_ALU64_REG(BPF_ADD, R8, R2),
1343                        BPF_ALU64_REG(BPF_ADD, R8, R3),
1344                        BPF_ALU64_REG(BPF_ADD, R8, R4),
1345                        BPF_ALU64_REG(BPF_ADD, R8, R5),
1346                        BPF_ALU64_REG(BPF_ADD, R8, R6),
1347                        BPF_ALU64_REG(BPF_ADD, R8, R7),
1348                        BPF_ALU64_REG(BPF_ADD, R8, R8),
1349                        BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1350                        BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1351                        BPF_EXIT_INSN(),
1352                        BPF_ALU64_REG(BPF_ADD, R9, R0),
1353                        BPF_ALU64_REG(BPF_ADD, R9, R1),
1354                        BPF_ALU64_REG(BPF_ADD, R9, R2),
1355                        BPF_ALU64_REG(BPF_ADD, R9, R3),
1356                        BPF_ALU64_REG(BPF_ADD, R9, R4),
1357                        BPF_ALU64_REG(BPF_ADD, R9, R5),
1358                        BPF_ALU64_REG(BPF_ADD, R9, R6),
1359                        BPF_ALU64_REG(BPF_ADD, R9, R7),
1360                        BPF_ALU64_REG(BPF_ADD, R9, R8),
1361                        BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1362                        BPF_ALU64_REG(BPF_MOV, R0, R9),
1363                        BPF_EXIT_INSN(),
1364                },
1365                INTERNAL,
1366                { },
1367                { { 0, 2957380 } }
1368        },
1369        {
1370                "INT: ADD 32-bit",
1371                .u.insns_int = {
1372                        BPF_ALU32_IMM(BPF_MOV, R0, 20),
1373                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
1374                        BPF_ALU32_IMM(BPF_MOV, R2, 2),
1375                        BPF_ALU32_IMM(BPF_MOV, R3, 3),
1376                        BPF_ALU32_IMM(BPF_MOV, R4, 4),
1377                        BPF_ALU32_IMM(BPF_MOV, R5, 5),
1378                        BPF_ALU32_IMM(BPF_MOV, R6, 6),
1379                        BPF_ALU32_IMM(BPF_MOV, R7, 7),
1380                        BPF_ALU32_IMM(BPF_MOV, R8, 8),
1381                        BPF_ALU32_IMM(BPF_MOV, R9, 9),
1382                        BPF_ALU64_IMM(BPF_ADD, R1, 10),
1383                        BPF_ALU64_IMM(BPF_ADD, R2, 10),
1384                        BPF_ALU64_IMM(BPF_ADD, R3, 10),
1385                        BPF_ALU64_IMM(BPF_ADD, R4, 10),
1386                        BPF_ALU64_IMM(BPF_ADD, R5, 10),
1387                        BPF_ALU64_IMM(BPF_ADD, R6, 10),
1388                        BPF_ALU64_IMM(BPF_ADD, R7, 10),
1389                        BPF_ALU64_IMM(BPF_ADD, R8, 10),
1390                        BPF_ALU64_IMM(BPF_ADD, R9, 10),
1391                        BPF_ALU32_REG(BPF_ADD, R0, R1),
1392                        BPF_ALU32_REG(BPF_ADD, R0, R2),
1393                        BPF_ALU32_REG(BPF_ADD, R0, R3),
1394                        BPF_ALU32_REG(BPF_ADD, R0, R4),
1395                        BPF_ALU32_REG(BPF_ADD, R0, R5),
1396                        BPF_ALU32_REG(BPF_ADD, R0, R6),
1397                        BPF_ALU32_REG(BPF_ADD, R0, R7),
1398                        BPF_ALU32_REG(BPF_ADD, R0, R8),
1399                        BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1400                        BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1401                        BPF_EXIT_INSN(),
1402                        BPF_ALU32_REG(BPF_ADD, R1, R0),
1403                        BPF_ALU32_REG(BPF_ADD, R1, R1),
1404                        BPF_ALU32_REG(BPF_ADD, R1, R2),
1405                        BPF_ALU32_REG(BPF_ADD, R1, R3),
1406                        BPF_ALU32_REG(BPF_ADD, R1, R4),
1407                        BPF_ALU32_REG(BPF_ADD, R1, R5),
1408                        BPF_ALU32_REG(BPF_ADD, R1, R6),
1409                        BPF_ALU32_REG(BPF_ADD, R1, R7),
1410                        BPF_ALU32_REG(BPF_ADD, R1, R8),
1411                        BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1412                        BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1413                        BPF_EXIT_INSN(),
1414                        BPF_ALU32_REG(BPF_ADD, R2, R0),
1415                        BPF_ALU32_REG(BPF_ADD, R2, R1),
1416                        BPF_ALU32_REG(BPF_ADD, R2, R2),
1417                        BPF_ALU32_REG(BPF_ADD, R2, R3),
1418                        BPF_ALU32_REG(BPF_ADD, R2, R4),
1419                        BPF_ALU32_REG(BPF_ADD, R2, R5),
1420                        BPF_ALU32_REG(BPF_ADD, R2, R6),
1421                        BPF_ALU32_REG(BPF_ADD, R2, R7),
1422                        BPF_ALU32_REG(BPF_ADD, R2, R8),
1423                        BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1424                        BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1425                        BPF_EXIT_INSN(),
1426                        BPF_ALU32_REG(BPF_ADD, R3, R0),
1427                        BPF_ALU32_REG(BPF_ADD, R3, R1),
1428                        BPF_ALU32_REG(BPF_ADD, R3, R2),
1429                        BPF_ALU32_REG(BPF_ADD, R3, R3),
1430                        BPF_ALU32_REG(BPF_ADD, R3, R4),
1431                        BPF_ALU32_REG(BPF_ADD, R3, R5),
1432                        BPF_ALU32_REG(BPF_ADD, R3, R6),
1433                        BPF_ALU32_REG(BPF_ADD, R3, R7),
1434                        BPF_ALU32_REG(BPF_ADD, R3, R8),
1435                        BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1436                        BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1437                        BPF_EXIT_INSN(),
1438                        BPF_ALU32_REG(BPF_ADD, R4, R0),
1439                        BPF_ALU32_REG(BPF_ADD, R4, R1),
1440                        BPF_ALU32_REG(BPF_ADD, R4, R2),
1441                        BPF_ALU32_REG(BPF_ADD, R4, R3),
1442                        BPF_ALU32_REG(BPF_ADD, R4, R4),
1443                        BPF_ALU32_REG(BPF_ADD, R4, R5),
1444                        BPF_ALU32_REG(BPF_ADD, R4, R6),
1445                        BPF_ALU32_REG(BPF_ADD, R4, R7),
1446                        BPF_ALU32_REG(BPF_ADD, R4, R8),
1447                        BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1448                        BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1449                        BPF_EXIT_INSN(),
1450                        BPF_ALU32_REG(BPF_ADD, R5, R0),
1451                        BPF_ALU32_REG(BPF_ADD, R5, R1),
1452                        BPF_ALU32_REG(BPF_ADD, R5, R2),
1453                        BPF_ALU32_REG(BPF_ADD, R5, R3),
1454                        BPF_ALU32_REG(BPF_ADD, R5, R4),
1455                        BPF_ALU32_REG(BPF_ADD, R5, R5),
1456                        BPF_ALU32_REG(BPF_ADD, R5, R6),
1457                        BPF_ALU32_REG(BPF_ADD, R5, R7),
1458                        BPF_ALU32_REG(BPF_ADD, R5, R8),
1459                        BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1460                        BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1461                        BPF_EXIT_INSN(),
1462                        BPF_ALU32_REG(BPF_ADD, R6, R0),
1463                        BPF_ALU32_REG(BPF_ADD, R6, R1),
1464                        BPF_ALU32_REG(BPF_ADD, R6, R2),
1465                        BPF_ALU32_REG(BPF_ADD, R6, R3),
1466                        BPF_ALU32_REG(BPF_ADD, R6, R4),
1467                        BPF_ALU32_REG(BPF_ADD, R6, R5),
1468                        BPF_ALU32_REG(BPF_ADD, R6, R6),
1469                        BPF_ALU32_REG(BPF_ADD, R6, R7),
1470                        BPF_ALU32_REG(BPF_ADD, R6, R8),
1471                        BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1472                        BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1473                        BPF_EXIT_INSN(),
1474                        BPF_ALU32_REG(BPF_ADD, R7, R0),
1475                        BPF_ALU32_REG(BPF_ADD, R7, R1),
1476                        BPF_ALU32_REG(BPF_ADD, R7, R2),
1477                        BPF_ALU32_REG(BPF_ADD, R7, R3),
1478                        BPF_ALU32_REG(BPF_ADD, R7, R4),
1479                        BPF_ALU32_REG(BPF_ADD, R7, R5),
1480                        BPF_ALU32_REG(BPF_ADD, R7, R6),
1481                        BPF_ALU32_REG(BPF_ADD, R7, R7),
1482                        BPF_ALU32_REG(BPF_ADD, R7, R8),
1483                        BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1484                        BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1485                        BPF_EXIT_INSN(),
1486                        BPF_ALU32_REG(BPF_ADD, R8, R0),
1487                        BPF_ALU32_REG(BPF_ADD, R8, R1),
1488                        BPF_ALU32_REG(BPF_ADD, R8, R2),
1489                        BPF_ALU32_REG(BPF_ADD, R8, R3),
1490                        BPF_ALU32_REG(BPF_ADD, R8, R4),
1491                        BPF_ALU32_REG(BPF_ADD, R8, R5),
1492                        BPF_ALU32_REG(BPF_ADD, R8, R6),
1493                        BPF_ALU32_REG(BPF_ADD, R8, R7),
1494                        BPF_ALU32_REG(BPF_ADD, R8, R8),
1495                        BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1496                        BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1497                        BPF_EXIT_INSN(),
1498                        BPF_ALU32_REG(BPF_ADD, R9, R0),
1499                        BPF_ALU32_REG(BPF_ADD, R9, R1),
1500                        BPF_ALU32_REG(BPF_ADD, R9, R2),
1501                        BPF_ALU32_REG(BPF_ADD, R9, R3),
1502                        BPF_ALU32_REG(BPF_ADD, R9, R4),
1503                        BPF_ALU32_REG(BPF_ADD, R9, R5),
1504                        BPF_ALU32_REG(BPF_ADD, R9, R6),
1505                        BPF_ALU32_REG(BPF_ADD, R9, R7),
1506                        BPF_ALU32_REG(BPF_ADD, R9, R8),
1507                        BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1508                        BPF_ALU32_REG(BPF_MOV, R0, R9),
1509                        BPF_EXIT_INSN(),
1510                },
1511                INTERNAL,
1512                { },
1513                { { 0, 2957380 } }
1514        },
1515        {       /* Mainly checking JIT here. */
1516                "INT: SUB",
1517                .u.insns_int = {
1518                        BPF_ALU64_IMM(BPF_MOV, R0, 0),
1519                        BPF_ALU64_IMM(BPF_MOV, R1, 1),
1520                        BPF_ALU64_IMM(BPF_MOV, R2, 2),
1521                        BPF_ALU64_IMM(BPF_MOV, R3, 3),
1522                        BPF_ALU64_IMM(BPF_MOV, R4, 4),
1523                        BPF_ALU64_IMM(BPF_MOV, R5, 5),
1524                        BPF_ALU64_IMM(BPF_MOV, R6, 6),
1525                        BPF_ALU64_IMM(BPF_MOV, R7, 7),
1526                        BPF_ALU64_IMM(BPF_MOV, R8, 8),
1527                        BPF_ALU64_IMM(BPF_MOV, R9, 9),
1528                        BPF_ALU64_REG(BPF_SUB, R0, R0),
1529                        BPF_ALU64_REG(BPF_SUB, R0, R1),
1530                        BPF_ALU64_REG(BPF_SUB, R0, R2),
1531                        BPF_ALU64_REG(BPF_SUB, R0, R3),
1532                        BPF_ALU64_REG(BPF_SUB, R0, R4),
1533                        BPF_ALU64_REG(BPF_SUB, R0, R5),
1534                        BPF_ALU64_REG(BPF_SUB, R0, R6),
1535                        BPF_ALU64_REG(BPF_SUB, R0, R7),
1536                        BPF_ALU64_REG(BPF_SUB, R0, R8),
1537                        BPF_ALU64_REG(BPF_SUB, R0, R9),
1538                        BPF_ALU64_IMM(BPF_SUB, R0, 10),
1539                        BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1540                        BPF_EXIT_INSN(),
1541                        BPF_ALU64_REG(BPF_SUB, R1, R0),
1542                        BPF_ALU64_REG(BPF_SUB, R1, R2),
1543                        BPF_ALU64_REG(BPF_SUB, R1, R3),
1544                        BPF_ALU64_REG(BPF_SUB, R1, R4),
1545                        BPF_ALU64_REG(BPF_SUB, R1, R5),
1546                        BPF_ALU64_REG(BPF_SUB, R1, R6),
1547                        BPF_ALU64_REG(BPF_SUB, R1, R7),
1548                        BPF_ALU64_REG(BPF_SUB, R1, R8),
1549                        BPF_ALU64_REG(BPF_SUB, R1, R9),
1550                        BPF_ALU64_IMM(BPF_SUB, R1, 10),
1551                        BPF_ALU64_REG(BPF_SUB, R2, R0),
1552                        BPF_ALU64_REG(BPF_SUB, R2, R1),
1553                        BPF_ALU64_REG(BPF_SUB, R2, R3),
1554                        BPF_ALU64_REG(BPF_SUB, R2, R4),
1555                        BPF_ALU64_REG(BPF_SUB, R2, R5),
1556                        BPF_ALU64_REG(BPF_SUB, R2, R6),
1557                        BPF_ALU64_REG(BPF_SUB, R2, R7),
1558                        BPF_ALU64_REG(BPF_SUB, R2, R8),
1559                        BPF_ALU64_REG(BPF_SUB, R2, R9),
1560                        BPF_ALU64_IMM(BPF_SUB, R2, 10),
1561                        BPF_ALU64_REG(BPF_SUB, R3, R0),
1562                        BPF_ALU64_REG(BPF_SUB, R3, R1),
1563                        BPF_ALU64_REG(BPF_SUB, R3, R2),
1564                        BPF_ALU64_REG(BPF_SUB, R3, R4),
1565                        BPF_ALU64_REG(BPF_SUB, R3, R5),
1566                        BPF_ALU64_REG(BPF_SUB, R3, R6),
1567                        BPF_ALU64_REG(BPF_SUB, R3, R7),
1568                        BPF_ALU64_REG(BPF_SUB, R3, R8),
1569                        BPF_ALU64_REG(BPF_SUB, R3, R9),
1570                        BPF_ALU64_IMM(BPF_SUB, R3, 10),
1571                        BPF_ALU64_REG(BPF_SUB, R4, R0),
1572                        BPF_ALU64_REG(BPF_SUB, R4, R1),
1573                        BPF_ALU64_REG(BPF_SUB, R4, R2),
1574                        BPF_ALU64_REG(BPF_SUB, R4, R3),
1575                        BPF_ALU64_REG(BPF_SUB, R4, R5),
1576                        BPF_ALU64_REG(BPF_SUB, R4, R6),
1577                        BPF_ALU64_REG(BPF_SUB, R4, R7),
1578                        BPF_ALU64_REG(BPF_SUB, R4, R8),
1579                        BPF_ALU64_REG(BPF_SUB, R4, R9),
1580                        BPF_ALU64_IMM(BPF_SUB, R4, 10),
1581                        BPF_ALU64_REG(BPF_SUB, R5, R0),
1582                        BPF_ALU64_REG(BPF_SUB, R5, R1),
1583                        BPF_ALU64_REG(BPF_SUB, R5, R2),
1584                        BPF_ALU64_REG(BPF_SUB, R5, R3),
1585                        BPF_ALU64_REG(BPF_SUB, R5, R4),
1586                        BPF_ALU64_REG(BPF_SUB, R5, R6),
1587                        BPF_ALU64_REG(BPF_SUB, R5, R7),
1588                        BPF_ALU64_REG(BPF_SUB, R5, R8),
1589                        BPF_ALU64_REG(BPF_SUB, R5, R9),
1590                        BPF_ALU64_IMM(BPF_SUB, R5, 10),
1591                        BPF_ALU64_REG(BPF_SUB, R6, R0),
1592                        BPF_ALU64_REG(BPF_SUB, R6, R1),
1593                        BPF_ALU64_REG(BPF_SUB, R6, R2),
1594                        BPF_ALU64_REG(BPF_SUB, R6, R3),
1595                        BPF_ALU64_REG(BPF_SUB, R6, R4),
1596                        BPF_ALU64_REG(BPF_SUB, R6, R5),
1597                        BPF_ALU64_REG(BPF_SUB, R6, R7),
1598                        BPF_ALU64_REG(BPF_SUB, R6, R8),
1599                        BPF_ALU64_REG(BPF_SUB, R6, R9),
1600                        BPF_ALU64_IMM(BPF_SUB, R6, 10),
1601                        BPF_ALU64_REG(BPF_SUB, R7, R0),
1602                        BPF_ALU64_REG(BPF_SUB, R7, R1),
1603                        BPF_ALU64_REG(BPF_SUB, R7, R2),
1604                        BPF_ALU64_REG(BPF_SUB, R7, R3),
1605                        BPF_ALU64_REG(BPF_SUB, R7, R4),
1606                        BPF_ALU64_REG(BPF_SUB, R7, R5),
1607                        BPF_ALU64_REG(BPF_SUB, R7, R6),
1608                        BPF_ALU64_REG(BPF_SUB, R7, R8),
1609                        BPF_ALU64_REG(BPF_SUB, R7, R9),
1610                        BPF_ALU64_IMM(BPF_SUB, R7, 10),
1611                        BPF_ALU64_REG(BPF_SUB, R8, R0),
1612                        BPF_ALU64_REG(BPF_SUB, R8, R1),
1613                        BPF_ALU64_REG(BPF_SUB, R8, R2),
1614                        BPF_ALU64_REG(BPF_SUB, R8, R3),
1615                        BPF_ALU64_REG(BPF_SUB, R8, R4),
1616                        BPF_ALU64_REG(BPF_SUB, R8, R5),
1617                        BPF_ALU64_REG(BPF_SUB, R8, R6),
1618                        BPF_ALU64_REG(BPF_SUB, R8, R7),
1619                        BPF_ALU64_REG(BPF_SUB, R8, R9),
1620                        BPF_ALU64_IMM(BPF_SUB, R8, 10),
1621                        BPF_ALU64_REG(BPF_SUB, R9, R0),
1622                        BPF_ALU64_REG(BPF_SUB, R9, R1),
1623                        BPF_ALU64_REG(BPF_SUB, R9, R2),
1624                        BPF_ALU64_REG(BPF_SUB, R9, R3),
1625                        BPF_ALU64_REG(BPF_SUB, R9, R4),
1626                        BPF_ALU64_REG(BPF_SUB, R9, R5),
1627                        BPF_ALU64_REG(BPF_SUB, R9, R6),
1628                        BPF_ALU64_REG(BPF_SUB, R9, R7),
1629                        BPF_ALU64_REG(BPF_SUB, R9, R8),
1630                        BPF_ALU64_IMM(BPF_SUB, R9, 10),
1631                        BPF_ALU64_IMM(BPF_SUB, R0, 10),
1632                        BPF_ALU64_IMM(BPF_NEG, R0, 0),
1633                        BPF_ALU64_REG(BPF_SUB, R0, R1),
1634                        BPF_ALU64_REG(BPF_SUB, R0, R2),
1635                        BPF_ALU64_REG(BPF_SUB, R0, R3),
1636                        BPF_ALU64_REG(BPF_SUB, R0, R4),
1637                        BPF_ALU64_REG(BPF_SUB, R0, R5),
1638                        BPF_ALU64_REG(BPF_SUB, R0, R6),
1639                        BPF_ALU64_REG(BPF_SUB, R0, R7),
1640                        BPF_ALU64_REG(BPF_SUB, R0, R8),
1641                        BPF_ALU64_REG(BPF_SUB, R0, R9),
1642                        BPF_EXIT_INSN(),
1643                },
1644                INTERNAL,
1645                { },
1646                { { 0, 11 } }
1647        },
1648        {       /* Mainly checking JIT here. */
1649                "INT: XOR",
1650                .u.insns_int = {
1651                        BPF_ALU64_REG(BPF_SUB, R0, R0),
1652                        BPF_ALU64_REG(BPF_XOR, R1, R1),
1653                        BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1654                        BPF_EXIT_INSN(),
1655                        BPF_ALU64_IMM(BPF_MOV, R0, 10),
1656                        BPF_ALU64_IMM(BPF_MOV, R1, -1),
1657                        BPF_ALU64_REG(BPF_SUB, R1, R1),
1658                        BPF_ALU64_REG(BPF_XOR, R2, R2),
1659                        BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1660                        BPF_EXIT_INSN(),
1661                        BPF_ALU64_REG(BPF_SUB, R2, R2),
1662                        BPF_ALU64_REG(BPF_XOR, R3, R3),
1663                        BPF_ALU64_IMM(BPF_MOV, R0, 10),
1664                        BPF_ALU64_IMM(BPF_MOV, R1, -1),
1665                        BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1666                        BPF_EXIT_INSN(),
1667                        BPF_ALU64_REG(BPF_SUB, R3, R3),
1668                        BPF_ALU64_REG(BPF_XOR, R4, R4),
1669                        BPF_ALU64_IMM(BPF_MOV, R2, 1),
1670                        BPF_ALU64_IMM(BPF_MOV, R5, -1),
1671                        BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1672                        BPF_EXIT_INSN(),
1673                        BPF_ALU64_REG(BPF_SUB, R4, R4),
1674                        BPF_ALU64_REG(BPF_XOR, R5, R5),
1675                        BPF_ALU64_IMM(BPF_MOV, R3, 1),
1676                        BPF_ALU64_IMM(BPF_MOV, R7, -1),
1677                        BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1678                        BPF_EXIT_INSN(),
1679                        BPF_ALU64_IMM(BPF_MOV, R5, 1),
1680                        BPF_ALU64_REG(BPF_SUB, R5, R5),
1681                        BPF_ALU64_REG(BPF_XOR, R6, R6),
1682                        BPF_ALU64_IMM(BPF_MOV, R1, 1),
1683                        BPF_ALU64_IMM(BPF_MOV, R8, -1),
1684                        BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1685                        BPF_EXIT_INSN(),
1686                        BPF_ALU64_REG(BPF_SUB, R6, R6),
1687                        BPF_ALU64_REG(BPF_XOR, R7, R7),
1688                        BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1689                        BPF_EXIT_INSN(),
1690                        BPF_ALU64_REG(BPF_SUB, R7, R7),
1691                        BPF_ALU64_REG(BPF_XOR, R8, R8),
1692                        BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1693                        BPF_EXIT_INSN(),
1694                        BPF_ALU64_REG(BPF_SUB, R8, R8),
1695                        BPF_ALU64_REG(BPF_XOR, R9, R9),
1696                        BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1697                        BPF_EXIT_INSN(),
1698                        BPF_ALU64_REG(BPF_SUB, R9, R9),
1699                        BPF_ALU64_REG(BPF_XOR, R0, R0),
1700                        BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1701                        BPF_EXIT_INSN(),
1702                        BPF_ALU64_REG(BPF_SUB, R1, R1),
1703                        BPF_ALU64_REG(BPF_XOR, R0, R0),
1704                        BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1705                        BPF_ALU64_IMM(BPF_MOV, R0, 0),
1706                        BPF_EXIT_INSN(),
1707                        BPF_ALU64_IMM(BPF_MOV, R0, 1),
1708                        BPF_EXIT_INSN(),
1709                },
1710                INTERNAL,
1711                { },
1712                { { 0, 1 } }
1713        },
1714        {       /* Mainly checking JIT here. */
1715                "INT: MUL",
1716                .u.insns_int = {
1717                        BPF_ALU64_IMM(BPF_MOV, R0, 11),
1718                        BPF_ALU64_IMM(BPF_MOV, R1, 1),
1719                        BPF_ALU64_IMM(BPF_MOV, R2, 2),
1720                        BPF_ALU64_IMM(BPF_MOV, R3, 3),
1721                        BPF_ALU64_IMM(BPF_MOV, R4, 4),
1722                        BPF_ALU64_IMM(BPF_MOV, R5, 5),
1723                        BPF_ALU64_IMM(BPF_MOV, R6, 6),
1724                        BPF_ALU64_IMM(BPF_MOV, R7, 7),
1725                        BPF_ALU64_IMM(BPF_MOV, R8, 8),
1726                        BPF_ALU64_IMM(BPF_MOV, R9, 9),
1727                        BPF_ALU64_REG(BPF_MUL, R0, R0),
1728                        BPF_ALU64_REG(BPF_MUL, R0, R1),
1729                        BPF_ALU64_REG(BPF_MUL, R0, R2),
1730                        BPF_ALU64_REG(BPF_MUL, R0, R3),
1731                        BPF_ALU64_REG(BPF_MUL, R0, R4),
1732                        BPF_ALU64_REG(BPF_MUL, R0, R5),
1733                        BPF_ALU64_REG(BPF_MUL, R0, R6),
1734                        BPF_ALU64_REG(BPF_MUL, R0, R7),
1735                        BPF_ALU64_REG(BPF_MUL, R0, R8),
1736                        BPF_ALU64_REG(BPF_MUL, R0, R9),
1737                        BPF_ALU64_IMM(BPF_MUL, R0, 10),
1738                        BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1739                        BPF_EXIT_INSN(),
1740                        BPF_ALU64_REG(BPF_MUL, R1, R0),
1741                        BPF_ALU64_REG(BPF_MUL, R1, R2),
1742                        BPF_ALU64_REG(BPF_MUL, R1, R3),
1743                        BPF_ALU64_REG(BPF_MUL, R1, R4),
1744                        BPF_ALU64_REG(BPF_MUL, R1, R5),
1745                        BPF_ALU64_REG(BPF_MUL, R1, R6),
1746                        BPF_ALU64_REG(BPF_MUL, R1, R7),
1747                        BPF_ALU64_REG(BPF_MUL, R1, R8),
1748                        BPF_ALU64_REG(BPF_MUL, R1, R9),
1749                        BPF_ALU64_IMM(BPF_MUL, R1, 10),
1750                        BPF_ALU64_REG(BPF_MOV, R2, R1),
1751                        BPF_ALU64_IMM(BPF_RSH, R2, 32),
1752                        BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1753                        BPF_EXIT_INSN(),
1754                        BPF_ALU64_IMM(BPF_LSH, R1, 32),
1755                        BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1756                        BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1757                        BPF_EXIT_INSN(),
1758                        BPF_ALU64_REG(BPF_MUL, R2, R0),
1759                        BPF_ALU64_REG(BPF_MUL, R2, R1),
1760                        BPF_ALU64_REG(BPF_MUL, R2, R3),
1761                        BPF_ALU64_REG(BPF_MUL, R2, R4),
1762                        BPF_ALU64_REG(BPF_MUL, R2, R5),
1763                        BPF_ALU64_REG(BPF_MUL, R2, R6),
1764                        BPF_ALU64_REG(BPF_MUL, R2, R7),
1765                        BPF_ALU64_REG(BPF_MUL, R2, R8),
1766                        BPF_ALU64_REG(BPF_MUL, R2, R9),
1767                        BPF_ALU64_IMM(BPF_MUL, R2, 10),
1768                        BPF_ALU64_IMM(BPF_RSH, R2, 32),
1769                        BPF_ALU64_REG(BPF_MOV, R0, R2),
1770                        BPF_EXIT_INSN(),
1771                },
1772                INTERNAL,
1773                { },
1774                { { 0, 0x35d97ef2 } }
1775        },
1776        {       /* Mainly checking JIT here. */
1777                "MOV REG64",
1778                .u.insns_int = {
1779                        BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1780                        BPF_MOV64_REG(R1, R0),
1781                        BPF_MOV64_REG(R2, R1),
1782                        BPF_MOV64_REG(R3, R2),
1783                        BPF_MOV64_REG(R4, R3),
1784                        BPF_MOV64_REG(R5, R4),
1785                        BPF_MOV64_REG(R6, R5),
1786                        BPF_MOV64_REG(R7, R6),
1787                        BPF_MOV64_REG(R8, R7),
1788                        BPF_MOV64_REG(R9, R8),
1789                        BPF_ALU64_IMM(BPF_MOV, R0, 0),
1790                        BPF_ALU64_IMM(BPF_MOV, R1, 0),
1791                        BPF_ALU64_IMM(BPF_MOV, R2, 0),
1792                        BPF_ALU64_IMM(BPF_MOV, R3, 0),
1793                        BPF_ALU64_IMM(BPF_MOV, R4, 0),
1794                        BPF_ALU64_IMM(BPF_MOV, R5, 0),
1795                        BPF_ALU64_IMM(BPF_MOV, R6, 0),
1796                        BPF_ALU64_IMM(BPF_MOV, R7, 0),
1797                        BPF_ALU64_IMM(BPF_MOV, R8, 0),
1798                        BPF_ALU64_IMM(BPF_MOV, R9, 0),
1799                        BPF_ALU64_REG(BPF_ADD, R0, R0),
1800                        BPF_ALU64_REG(BPF_ADD, R0, R1),
1801                        BPF_ALU64_REG(BPF_ADD, R0, R2),
1802                        BPF_ALU64_REG(BPF_ADD, R0, R3),
1803                        BPF_ALU64_REG(BPF_ADD, R0, R4),
1804                        BPF_ALU64_REG(BPF_ADD, R0, R5),
1805                        BPF_ALU64_REG(BPF_ADD, R0, R6),
1806                        BPF_ALU64_REG(BPF_ADD, R0, R7),
1807                        BPF_ALU64_REG(BPF_ADD, R0, R8),
1808                        BPF_ALU64_REG(BPF_ADD, R0, R9),
1809                        BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1810                        BPF_EXIT_INSN(),
1811                },
1812                INTERNAL,
1813                { },
1814                { { 0, 0xfefe } }
1815        },
1816        {       /* Mainly checking JIT here. */
1817                "MOV REG32",
1818                .u.insns_int = {
1819                        BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1820                        BPF_MOV64_REG(R1, R0),
1821                        BPF_MOV64_REG(R2, R1),
1822                        BPF_MOV64_REG(R3, R2),
1823                        BPF_MOV64_REG(R4, R3),
1824                        BPF_MOV64_REG(R5, R4),
1825                        BPF_MOV64_REG(R6, R5),
1826                        BPF_MOV64_REG(R7, R6),
1827                        BPF_MOV64_REG(R8, R7),
1828                        BPF_MOV64_REG(R9, R8),
1829                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
1830                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
1831                        BPF_ALU32_IMM(BPF_MOV, R2, 0),
1832                        BPF_ALU32_IMM(BPF_MOV, R3, 0),
1833                        BPF_ALU32_IMM(BPF_MOV, R4, 0),
1834                        BPF_ALU32_IMM(BPF_MOV, R5, 0),
1835                        BPF_ALU32_IMM(BPF_MOV, R6, 0),
1836                        BPF_ALU32_IMM(BPF_MOV, R7, 0),
1837                        BPF_ALU32_IMM(BPF_MOV, R8, 0),
1838                        BPF_ALU32_IMM(BPF_MOV, R9, 0),
1839                        BPF_ALU64_REG(BPF_ADD, R0, R0),
1840                        BPF_ALU64_REG(BPF_ADD, R0, R1),
1841                        BPF_ALU64_REG(BPF_ADD, R0, R2),
1842                        BPF_ALU64_REG(BPF_ADD, R0, R3),
1843                        BPF_ALU64_REG(BPF_ADD, R0, R4),
1844                        BPF_ALU64_REG(BPF_ADD, R0, R5),
1845                        BPF_ALU64_REG(BPF_ADD, R0, R6),
1846                        BPF_ALU64_REG(BPF_ADD, R0, R7),
1847                        BPF_ALU64_REG(BPF_ADD, R0, R8),
1848                        BPF_ALU64_REG(BPF_ADD, R0, R9),
1849                        BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1850                        BPF_EXIT_INSN(),
1851                },
1852                INTERNAL,
1853                { },
1854                { { 0, 0xfefe } }
1855        },
1856        {       /* Mainly checking JIT here. */
1857                "LD IMM64",
1858                .u.insns_int = {
1859                        BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1860                        BPF_MOV64_REG(R1, R0),
1861                        BPF_MOV64_REG(R2, R1),
1862                        BPF_MOV64_REG(R3, R2),
1863                        BPF_MOV64_REG(R4, R3),
1864                        BPF_MOV64_REG(R5, R4),
1865                        BPF_MOV64_REG(R6, R5),
1866                        BPF_MOV64_REG(R7, R6),
1867                        BPF_MOV64_REG(R8, R7),
1868                        BPF_MOV64_REG(R9, R8),
1869                        BPF_LD_IMM64(R0, 0x0LL),
1870                        BPF_LD_IMM64(R1, 0x0LL),
1871                        BPF_LD_IMM64(R2, 0x0LL),
1872                        BPF_LD_IMM64(R3, 0x0LL),
1873                        BPF_LD_IMM64(R4, 0x0LL),
1874                        BPF_LD_IMM64(R5, 0x0LL),
1875                        BPF_LD_IMM64(R6, 0x0LL),
1876                        BPF_LD_IMM64(R7, 0x0LL),
1877                        BPF_LD_IMM64(R8, 0x0LL),
1878                        BPF_LD_IMM64(R9, 0x0LL),
1879                        BPF_ALU64_REG(BPF_ADD, R0, R0),
1880                        BPF_ALU64_REG(BPF_ADD, R0, R1),
1881                        BPF_ALU64_REG(BPF_ADD, R0, R2),
1882                        BPF_ALU64_REG(BPF_ADD, R0, R3),
1883                        BPF_ALU64_REG(BPF_ADD, R0, R4),
1884                        BPF_ALU64_REG(BPF_ADD, R0, R5),
1885                        BPF_ALU64_REG(BPF_ADD, R0, R6),
1886                        BPF_ALU64_REG(BPF_ADD, R0, R7),
1887                        BPF_ALU64_REG(BPF_ADD, R0, R8),
1888                        BPF_ALU64_REG(BPF_ADD, R0, R9),
1889                        BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1890                        BPF_EXIT_INSN(),
1891                },
1892                INTERNAL,
1893                { },
1894                { { 0, 0xfefe } }
1895        },
1896        {
1897                "INT: ALU MIX",
1898                .u.insns_int = {
1899                        BPF_ALU64_IMM(BPF_MOV, R0, 11),
1900                        BPF_ALU64_IMM(BPF_ADD, R0, -1),
1901                        BPF_ALU64_IMM(BPF_MOV, R2, 2),
1902                        BPF_ALU64_IMM(BPF_XOR, R2, 3),
1903                        BPF_ALU64_REG(BPF_DIV, R0, R2),
1904                        BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1905                        BPF_EXIT_INSN(),
1906                        BPF_ALU64_IMM(BPF_MOD, R0, 3),
1907                        BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1908                        BPF_EXIT_INSN(),
1909                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
1910                        BPF_EXIT_INSN(),
1911                },
1912                INTERNAL,
1913                { },
1914                { { 0, -1 } }
1915        },
1916        {
1917                "INT: shifts by register",
1918                .u.insns_int = {
1919                        BPF_MOV64_IMM(R0, -1234),
1920                        BPF_MOV64_IMM(R1, 1),
1921                        BPF_ALU32_REG(BPF_RSH, R0, R1),
1922                        BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1923                        BPF_EXIT_INSN(),
1924                        BPF_MOV64_IMM(R2, 1),
1925                        BPF_ALU64_REG(BPF_LSH, R0, R2),
1926                        BPF_MOV32_IMM(R4, -1234),
1927                        BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1928                        BPF_EXIT_INSN(),
1929                        BPF_ALU64_IMM(BPF_AND, R4, 63),
1930                        BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1931                        BPF_MOV64_IMM(R3, 47),
1932                        BPF_ALU64_REG(BPF_ARSH, R0, R3),
1933                        BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1934                        BPF_EXIT_INSN(),
1935                        BPF_MOV64_IMM(R2, 1),
1936                        BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1937                        BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1938                        BPF_EXIT_INSN(),
1939                        BPF_MOV64_IMM(R4, 4),
1940                        BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1941                        BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1942                        BPF_EXIT_INSN(),
1943                        BPF_MOV64_IMM(R4, 5),
1944                        BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1945                        BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1946                        BPF_EXIT_INSN(),
1947                        BPF_MOV64_IMM(R0, -1),
1948                        BPF_EXIT_INSN(),
1949                },
1950                INTERNAL,
1951                { },
1952                { { 0, -1 } }
1953        },
1954        {
1955                /*
1956                 * Register (non-)clobbering test, in the case where a 32-bit
1957                 * JIT implements complex ALU64 operations via function calls.
1958                 * If so, the function call must be invisible in the eBPF
1959                 * registers. The JIT must then save and restore relevant
1960                 * registers during the call. The following tests check that
1961                 * the eBPF registers retain their values after such a call.
1962                 */
1963                "INT: Register clobbering, R1 updated",
1964                .u.insns_int = {
1965                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
1966                        BPF_ALU32_IMM(BPF_MOV, R1, 123456789),
1967                        BPF_ALU32_IMM(BPF_MOV, R2, 2),
1968                        BPF_ALU32_IMM(BPF_MOV, R3, 3),
1969                        BPF_ALU32_IMM(BPF_MOV, R4, 4),
1970                        BPF_ALU32_IMM(BPF_MOV, R5, 5),
1971                        BPF_ALU32_IMM(BPF_MOV, R6, 6),
1972                        BPF_ALU32_IMM(BPF_MOV, R7, 7),
1973                        BPF_ALU32_IMM(BPF_MOV, R8, 8),
1974                        BPF_ALU32_IMM(BPF_MOV, R9, 9),
1975                        BPF_ALU64_IMM(BPF_DIV, R1, 123456789),
1976                        BPF_JMP_IMM(BPF_JNE, R0, 0, 10),
1977                        BPF_JMP_IMM(BPF_JNE, R1, 1, 9),
1978                        BPF_JMP_IMM(BPF_JNE, R2, 2, 8),
1979                        BPF_JMP_IMM(BPF_JNE, R3, 3, 7),
1980                        BPF_JMP_IMM(BPF_JNE, R4, 4, 6),
1981                        BPF_JMP_IMM(BPF_JNE, R5, 5, 5),
1982                        BPF_JMP_IMM(BPF_JNE, R6, 6, 4),
1983                        BPF_JMP_IMM(BPF_JNE, R7, 7, 3),
1984                        BPF_JMP_IMM(BPF_JNE, R8, 8, 2),
1985                        BPF_JMP_IMM(BPF_JNE, R9, 9, 1),
1986                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
1987                        BPF_EXIT_INSN(),
1988                },
1989                INTERNAL,
1990                { },
1991                { { 0, 1 } }
1992        },
1993        {
1994                "INT: Register clobbering, R2 updated",
1995                .u.insns_int = {
1996                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
1997                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
1998                        BPF_ALU32_IMM(BPF_MOV, R2, 2 * 123456789),
1999                        BPF_ALU32_IMM(BPF_MOV, R3, 3),
2000                        BPF_ALU32_IMM(BPF_MOV, R4, 4),
2001                        BPF_ALU32_IMM(BPF_MOV, R5, 5),
2002                        BPF_ALU32_IMM(BPF_MOV, R6, 6),
2003                        BPF_ALU32_IMM(BPF_MOV, R7, 7),
2004                        BPF_ALU32_IMM(BPF_MOV, R8, 8),
2005                        BPF_ALU32_IMM(BPF_MOV, R9, 9),
2006                        BPF_ALU64_IMM(BPF_DIV, R2, 123456789),
2007                        BPF_JMP_IMM(BPF_JNE, R0, 0, 10),
2008                        BPF_JMP_IMM(BPF_JNE, R1, 1, 9),
2009                        BPF_JMP_IMM(BPF_JNE, R2, 2, 8),
2010                        BPF_JMP_IMM(BPF_JNE, R3, 3, 7),
2011                        BPF_JMP_IMM(BPF_JNE, R4, 4, 6),
2012                        BPF_JMP_IMM(BPF_JNE, R5, 5, 5),
2013                        BPF_JMP_IMM(BPF_JNE, R6, 6, 4),
2014                        BPF_JMP_IMM(BPF_JNE, R7, 7, 3),
2015                        BPF_JMP_IMM(BPF_JNE, R8, 8, 2),
2016                        BPF_JMP_IMM(BPF_JNE, R9, 9, 1),
2017                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
2018                        BPF_EXIT_INSN(),
2019                },
2020                INTERNAL,
2021                { },
2022                { { 0, 1 } }
2023        },
2024        {
2025                /*
2026                 * Test 32-bit JITs that implement complex ALU64 operations as
2027                 * function calls R0 = f(R1, R2), and must re-arrange operands.
2028                 */
2029#define NUMER 0xfedcba9876543210ULL
2030#define DENOM 0x0123456789abcdefULL
2031                "ALU64_DIV X: Operand register permutations",
2032                .u.insns_int = {
2033                        /* R0 / R2 */
2034                        BPF_LD_IMM64(R0, NUMER),
2035                        BPF_LD_IMM64(R2, DENOM),
2036                        BPF_ALU64_REG(BPF_DIV, R0, R2),
2037                        BPF_JMP_IMM(BPF_JEQ, R0, NUMER / DENOM, 1),
2038                        BPF_EXIT_INSN(),
2039                        /* R1 / R0 */
2040                        BPF_LD_IMM64(R1, NUMER),
2041                        BPF_LD_IMM64(R0, DENOM),
2042                        BPF_ALU64_REG(BPF_DIV, R1, R0),
2043                        BPF_JMP_IMM(BPF_JEQ, R1, NUMER / DENOM, 1),
2044                        BPF_EXIT_INSN(),
2045                        /* R0 / R1 */
2046                        BPF_LD_IMM64(R0, NUMER),
2047                        BPF_LD_IMM64(R1, DENOM),
2048                        BPF_ALU64_REG(BPF_DIV, R0, R1),
2049                        BPF_JMP_IMM(BPF_JEQ, R0, NUMER / DENOM, 1),
2050                        BPF_EXIT_INSN(),
2051                        /* R2 / R0 */
2052                        BPF_LD_IMM64(R2, NUMER),
2053                        BPF_LD_IMM64(R0, DENOM),
2054                        BPF_ALU64_REG(BPF_DIV, R2, R0),
2055                        BPF_JMP_IMM(BPF_JEQ, R2, NUMER / DENOM, 1),
2056                        BPF_EXIT_INSN(),
2057                        /* R2 / R1 */
2058                        BPF_LD_IMM64(R2, NUMER),
2059                        BPF_LD_IMM64(R1, DENOM),
2060                        BPF_ALU64_REG(BPF_DIV, R2, R1),
2061                        BPF_JMP_IMM(BPF_JEQ, R2, NUMER / DENOM, 1),
2062                        BPF_EXIT_INSN(),
2063                        /* R1 / R2 */
2064                        BPF_LD_IMM64(R1, NUMER),
2065                        BPF_LD_IMM64(R2, DENOM),
2066                        BPF_ALU64_REG(BPF_DIV, R1, R2),
2067                        BPF_JMP_IMM(BPF_JEQ, R1, NUMER / DENOM, 1),
2068                        BPF_EXIT_INSN(),
2069                        /* R1 / R1 */
2070                        BPF_LD_IMM64(R1, NUMER),
2071                        BPF_ALU64_REG(BPF_DIV, R1, R1),
2072                        BPF_JMP_IMM(BPF_JEQ, R1, 1, 1),
2073                        BPF_EXIT_INSN(),
2074                        /* R2 / R2 */
2075                        BPF_LD_IMM64(R2, DENOM),
2076                        BPF_ALU64_REG(BPF_DIV, R2, R2),
2077                        BPF_JMP_IMM(BPF_JEQ, R2, 1, 1),
2078                        BPF_EXIT_INSN(),
2079                        /* R3 / R4 */
2080                        BPF_LD_IMM64(R3, NUMER),
2081                        BPF_LD_IMM64(R4, DENOM),
2082                        BPF_ALU64_REG(BPF_DIV, R3, R4),
2083                        BPF_JMP_IMM(BPF_JEQ, R3, NUMER / DENOM, 1),
2084                        BPF_EXIT_INSN(),
2085                        /* Successful return */
2086                        BPF_LD_IMM64(R0, 1),
2087                        BPF_EXIT_INSN(),
2088                },
2089                INTERNAL,
2090                { },
2091                { { 0, 1 } },
2092#undef NUMER
2093#undef DENOM
2094        },
2095#ifdef CONFIG_32BIT
2096        {
2097                "INT: 32-bit context pointer word order and zero-extension",
2098                .u.insns_int = {
2099                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
2100                        BPF_JMP32_IMM(BPF_JEQ, R1, 0, 3),
2101                        BPF_ALU64_IMM(BPF_RSH, R1, 32),
2102                        BPF_JMP32_IMM(BPF_JNE, R1, 0, 1),
2103                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
2104                        BPF_EXIT_INSN(),
2105                },
2106                INTERNAL,
2107                { },
2108                { { 0, 1 } }
2109        },
2110#endif
2111        {
2112                "check: missing ret",
2113                .u.insns = {
2114                        BPF_STMT(BPF_LD | BPF_IMM, 1),
2115                },
2116                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2117                { },
2118                { },
2119                .fill_helper = NULL,
2120                .expected_errcode = -EINVAL,
2121        },
2122        {
2123                "check: div_k_0",
2124                .u.insns = {
2125                        BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
2126                        BPF_STMT(BPF_RET | BPF_K, 0)
2127                },
2128                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2129                { },
2130                { },
2131                .fill_helper = NULL,
2132                .expected_errcode = -EINVAL,
2133        },
2134        {
2135                "check: unknown insn",
2136                .u.insns = {
2137                        /* seccomp insn, rejected in socket filter */
2138                        BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
2139                        BPF_STMT(BPF_RET | BPF_K, 0)
2140                },
2141                CLASSIC | FLAG_EXPECTED_FAIL,
2142                { },
2143                { },
2144                .fill_helper = NULL,
2145                .expected_errcode = -EINVAL,
2146        },
2147        {
2148                "check: out of range spill/fill",
2149                .u.insns = {
2150                        BPF_STMT(BPF_STX, 16),
2151                        BPF_STMT(BPF_RET | BPF_K, 0)
2152                },
2153                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2154                { },
2155                { },
2156                .fill_helper = NULL,
2157                .expected_errcode = -EINVAL,
2158        },
2159        {
2160                "JUMPS + HOLES",
2161                .u.insns = {
2162                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2163                        BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
2164                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2165                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2166                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2167                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2168                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2169                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2170                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2171                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2172                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2173                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2174                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2175                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2176                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2177                        BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
2178                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2179                        BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
2180                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2181                        BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2182                        BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2183                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2184                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2185                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2186                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2187                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2188                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2189                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2190                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2191                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2192                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2193                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2194                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2195                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2196                        BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
2197                        BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
2198                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2199                        BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2200                        BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2201                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2202                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2203                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2204                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2205                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2206                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2207                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2208                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2209                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2210                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2211                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2212                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2213                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2214                        BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
2215                        BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
2216                        BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2217                        BPF_STMT(BPF_RET | BPF_A, 0),
2218                        BPF_STMT(BPF_RET | BPF_A, 0),
2219                },
2220                CLASSIC,
2221                { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
2222                  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
2223                  0x08, 0x00,
2224                  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
2225                  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
2226                  0xc0, 0xa8, 0x33, 0x01,
2227                  0xc0, 0xa8, 0x33, 0x02,
2228                  0xbb, 0xb6,
2229                  0xa9, 0xfa,
2230                  0x00, 0x14, 0x00, 0x00,
2231                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2232                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2233                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2234                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2235                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2236                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2237                  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2238                  0xcc, 0xcc, 0xcc, 0xcc },
2239                { { 88, 0x001b } }
2240        },
2241        {
2242                "check: RET X",
2243                .u.insns = {
2244                        BPF_STMT(BPF_RET | BPF_X, 0),
2245                },
2246                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2247                { },
2248                { },
2249                .fill_helper = NULL,
2250                .expected_errcode = -EINVAL,
2251        },
2252        {
2253                "check: LDX + RET X",
2254                .u.insns = {
2255                        BPF_STMT(BPF_LDX | BPF_IMM, 42),
2256                        BPF_STMT(BPF_RET | BPF_X, 0),
2257                },
2258                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2259                { },
2260                { },
2261                .fill_helper = NULL,
2262                .expected_errcode = -EINVAL,
2263        },
2264        {       /* Mainly checking JIT here. */
2265                "M[]: alt STX + LDX",
2266                .u.insns = {
2267                        BPF_STMT(BPF_LDX | BPF_IMM, 100),
2268                        BPF_STMT(BPF_STX, 0),
2269                        BPF_STMT(BPF_LDX | BPF_MEM, 0),
2270                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2271                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2272                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2273                        BPF_STMT(BPF_STX, 1),
2274                        BPF_STMT(BPF_LDX | BPF_MEM, 1),
2275                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2276                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2277                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2278                        BPF_STMT(BPF_STX, 2),
2279                        BPF_STMT(BPF_LDX | BPF_MEM, 2),
2280                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2281                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2282                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2283                        BPF_STMT(BPF_STX, 3),
2284                        BPF_STMT(BPF_LDX | BPF_MEM, 3),
2285                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2286                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2287                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2288                        BPF_STMT(BPF_STX, 4),
2289                        BPF_STMT(BPF_LDX | BPF_MEM, 4),
2290                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2291                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2292                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2293                        BPF_STMT(BPF_STX, 5),
2294                        BPF_STMT(BPF_LDX | BPF_MEM, 5),
2295                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2296                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2297                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2298                        BPF_STMT(BPF_STX, 6),
2299                        BPF_STMT(BPF_LDX | BPF_MEM, 6),
2300                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2301                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2302                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2303                        BPF_STMT(BPF_STX, 7),
2304                        BPF_STMT(BPF_LDX | BPF_MEM, 7),
2305                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2306                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2307                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2308                        BPF_STMT(BPF_STX, 8),
2309                        BPF_STMT(BPF_LDX | BPF_MEM, 8),
2310                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2311                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2312                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2313                        BPF_STMT(BPF_STX, 9),
2314                        BPF_STMT(BPF_LDX | BPF_MEM, 9),
2315                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2316                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2317                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2318                        BPF_STMT(BPF_STX, 10),
2319                        BPF_STMT(BPF_LDX | BPF_MEM, 10),
2320                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2321                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2322                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2323                        BPF_STMT(BPF_STX, 11),
2324                        BPF_STMT(BPF_LDX | BPF_MEM, 11),
2325                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2326                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2327                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2328                        BPF_STMT(BPF_STX, 12),
2329                        BPF_STMT(BPF_LDX | BPF_MEM, 12),
2330                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2331                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2332                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2333                        BPF_STMT(BPF_STX, 13),
2334                        BPF_STMT(BPF_LDX | BPF_MEM, 13),
2335                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2336                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2337                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2338                        BPF_STMT(BPF_STX, 14),
2339                        BPF_STMT(BPF_LDX | BPF_MEM, 14),
2340                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2341                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2342                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2343                        BPF_STMT(BPF_STX, 15),
2344                        BPF_STMT(BPF_LDX | BPF_MEM, 15),
2345                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2346                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2347                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
2348                        BPF_STMT(BPF_RET | BPF_A, 0),
2349                },
2350                CLASSIC | FLAG_NO_DATA,
2351                { },
2352                { { 0, 116 } },
2353        },
2354        {       /* Mainly checking JIT here. */
2355                "M[]: full STX + full LDX",
2356                .u.insns = {
2357                        BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
2358                        BPF_STMT(BPF_STX, 0),
2359                        BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
2360                        BPF_STMT(BPF_STX, 1),
2361                        BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
2362                        BPF_STMT(BPF_STX, 2),
2363                        BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
2364                        BPF_STMT(BPF_STX, 3),
2365                        BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
2366                        BPF_STMT(BPF_STX, 4),
2367                        BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
2368                        BPF_STMT(BPF_STX, 5),
2369                        BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
2370                        BPF_STMT(BPF_STX, 6),
2371                        BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
2372                        BPF_STMT(BPF_STX, 7),
2373                        BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
2374                        BPF_STMT(BPF_STX, 8),
2375                        BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
2376                        BPF_STMT(BPF_STX, 9),
2377                        BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
2378                        BPF_STMT(BPF_STX, 10),
2379                        BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
2380                        BPF_STMT(BPF_STX, 11),
2381                        BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
2382                        BPF_STMT(BPF_STX, 12),
2383                        BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
2384                        BPF_STMT(BPF_STX, 13),
2385                        BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
2386                        BPF_STMT(BPF_STX, 14),
2387                        BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
2388                        BPF_STMT(BPF_STX, 15),
2389                        BPF_STMT(BPF_LDX | BPF_MEM, 0),
2390                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
2391                        BPF_STMT(BPF_LDX | BPF_MEM, 1),
2392                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2393                        BPF_STMT(BPF_LDX | BPF_MEM, 2),
2394                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2395                        BPF_STMT(BPF_LDX | BPF_MEM, 3),
2396                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2397                        BPF_STMT(BPF_LDX | BPF_MEM, 4),
2398                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2399                        BPF_STMT(BPF_LDX | BPF_MEM, 5),
2400                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2401                        BPF_STMT(BPF_LDX | BPF_MEM, 6),
2402                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2403                        BPF_STMT(BPF_LDX | BPF_MEM, 7),
2404                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2405                        BPF_STMT(BPF_LDX | BPF_MEM, 8),
2406                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2407                        BPF_STMT(BPF_LDX | BPF_MEM, 9),
2408                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2409                        BPF_STMT(BPF_LDX | BPF_MEM, 10),
2410                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2411                        BPF_STMT(BPF_LDX | BPF_MEM, 11),
2412                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2413                        BPF_STMT(BPF_LDX | BPF_MEM, 12),
2414                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2415                        BPF_STMT(BPF_LDX | BPF_MEM, 13),
2416                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2417                        BPF_STMT(BPF_LDX | BPF_MEM, 14),
2418                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2419                        BPF_STMT(BPF_LDX | BPF_MEM, 15),
2420                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2421                        BPF_STMT(BPF_RET | BPF_A, 0),
2422                },
2423                CLASSIC | FLAG_NO_DATA,
2424                { },
2425                { { 0, 0x2a5a5e5 } },
2426        },
2427        {
2428                "check: SKF_AD_MAX",
2429                .u.insns = {
2430                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2431                                 SKF_AD_OFF + SKF_AD_MAX),
2432                        BPF_STMT(BPF_RET | BPF_A, 0),
2433                },
2434                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2435                { },
2436                { },
2437                .fill_helper = NULL,
2438                .expected_errcode = -EINVAL,
2439        },
2440        {       /* Passes checker but fails during runtime. */
2441                "LD [SKF_AD_OFF-1]",
2442                .u.insns = {
2443                        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2444                                 SKF_AD_OFF - 1),
2445                        BPF_STMT(BPF_RET | BPF_K, 1),
2446                },
2447                CLASSIC,
2448                { },
2449                { { 1, 0 } },
2450        },
2451        {
2452                "load 64-bit immediate",
2453                .u.insns_int = {
2454                        BPF_LD_IMM64(R1, 0x567800001234LL),
2455                        BPF_MOV64_REG(R2, R1),
2456                        BPF_MOV64_REG(R3, R2),
2457                        BPF_ALU64_IMM(BPF_RSH, R2, 32),
2458                        BPF_ALU64_IMM(BPF_LSH, R3, 32),
2459                        BPF_ALU64_IMM(BPF_RSH, R3, 32),
2460                        BPF_ALU64_IMM(BPF_MOV, R0, 0),
2461                        BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
2462                        BPF_EXIT_INSN(),
2463                        BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
2464                        BPF_EXIT_INSN(),
2465                        BPF_LD_IMM64(R0, 0x1ffffffffLL),
2466                        BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
2467                        BPF_EXIT_INSN(),
2468                },
2469                INTERNAL,
2470                { },
2471                { { 0, 1 } }
2472        },
2473        /* BPF_ALU | BPF_MOV | BPF_X */
2474        {
2475                "ALU_MOV_X: dst = 2",
2476                .u.insns_int = {
2477                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
2478                        BPF_ALU32_REG(BPF_MOV, R0, R1),
2479                        BPF_EXIT_INSN(),
2480                },
2481                INTERNAL,
2482                { },
2483                { { 0, 2 } },
2484        },
2485        {
2486                "ALU_MOV_X: dst = 4294967295",
2487                .u.insns_int = {
2488                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2489                        BPF_ALU32_REG(BPF_MOV, R0, R1),
2490                        BPF_EXIT_INSN(),
2491                },
2492                INTERNAL,
2493                { },
2494                { { 0, 4294967295U } },
2495        },
2496        {
2497                "ALU64_MOV_X: dst = 2",
2498                .u.insns_int = {
2499                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
2500                        BPF_ALU64_REG(BPF_MOV, R0, R1),
2501                        BPF_EXIT_INSN(),
2502                },
2503                INTERNAL,
2504                { },
2505                { { 0, 2 } },
2506        },
2507        {
2508                "ALU64_MOV_X: dst = 4294967295",
2509                .u.insns_int = {
2510                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2511                        BPF_ALU64_REG(BPF_MOV, R0, R1),
2512                        BPF_EXIT_INSN(),
2513                },
2514                INTERNAL,
2515                { },
2516                { { 0, 4294967295U } },
2517        },
2518        /* BPF_ALU | BPF_MOV | BPF_K */
2519        {
2520                "ALU_MOV_K: dst = 2",
2521                .u.insns_int = {
2522                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
2523                        BPF_EXIT_INSN(),
2524                },
2525                INTERNAL,
2526                { },
2527                { { 0, 2 } },
2528        },
2529        {
2530                "ALU_MOV_K: dst = 4294967295",
2531                .u.insns_int = {
2532                        BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2533                        BPF_EXIT_INSN(),
2534                },
2535                INTERNAL,
2536                { },
2537                { { 0, 4294967295U } },
2538        },
2539        {
2540                "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2541                .u.insns_int = {
2542                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2543                        BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2544                        BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2545                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2546                        BPF_MOV32_IMM(R0, 2),
2547                        BPF_EXIT_INSN(),
2548                        BPF_MOV32_IMM(R0, 1),
2549                        BPF_EXIT_INSN(),
2550                },
2551                INTERNAL,
2552                { },
2553                { { 0, 0x1 } },
2554        },
2555        {
2556                "ALU_MOV_K: small negative",
2557                .u.insns_int = {
2558                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
2559                        BPF_EXIT_INSN(),
2560                },
2561                INTERNAL,
2562                { },
2563                { { 0, -123 } }
2564        },
2565        {
2566                "ALU_MOV_K: small negative zero extension",
2567                .u.insns_int = {
2568                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
2569                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
2570                        BPF_EXIT_INSN(),
2571                },
2572                INTERNAL,
2573                { },
2574                { { 0, 0 } }
2575        },
2576        {
2577                "ALU_MOV_K: large negative",
2578                .u.insns_int = {
2579                        BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
2580                        BPF_EXIT_INSN(),
2581                },
2582                INTERNAL,
2583                { },
2584                { { 0, -123456789 } }
2585        },
2586        {
2587                "ALU_MOV_K: large negative zero extension",
2588                .u.insns_int = {
2589                        BPF_ALU32_IMM(BPF_MOV, R0, -123456789),
2590                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
2591                        BPF_EXIT_INSN(),
2592                },
2593                INTERNAL,
2594                { },
2595                { { 0, 0 } }
2596        },
2597        {
2598                "ALU64_MOV_K: dst = 2",
2599                .u.insns_int = {
2600                        BPF_ALU64_IMM(BPF_MOV, R0, 2),
2601                        BPF_EXIT_INSN(),
2602                },
2603                INTERNAL,
2604                { },
2605                { { 0, 2 } },
2606        },
2607        {
2608                "ALU64_MOV_K: dst = 2147483647",
2609                .u.insns_int = {
2610                        BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2611                        BPF_EXIT_INSN(),
2612                },
2613                INTERNAL,
2614                { },
2615                { { 0, 2147483647 } },
2616        },
2617        {
2618                "ALU64_OR_K: dst = 0x0",
2619                .u.insns_int = {
2620                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2621                        BPF_LD_IMM64(R3, 0x0),
2622                        BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
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_MOV_K: dst = -1",
2635                .u.insns_int = {
2636                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2637                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2638                        BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2639                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2640                        BPF_MOV32_IMM(R0, 2),
2641                        BPF_EXIT_INSN(),
2642                        BPF_MOV32_IMM(R0, 1),
2643                        BPF_EXIT_INSN(),
2644                },
2645                INTERNAL,
2646                { },
2647                { { 0, 0x1 } },
2648        },
2649        {
2650                "ALU64_MOV_K: small negative",
2651                .u.insns_int = {
2652                        BPF_ALU64_IMM(BPF_MOV, R0, -123),
2653                        BPF_EXIT_INSN(),
2654                },
2655                INTERNAL,
2656                { },
2657                { { 0, -123 } }
2658        },
2659        {
2660                "ALU64_MOV_K: small negative sign extension",
2661                .u.insns_int = {
2662                        BPF_ALU64_IMM(BPF_MOV, R0, -123),
2663                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
2664                        BPF_EXIT_INSN(),
2665                },
2666                INTERNAL,
2667                { },
2668                { { 0, 0xffffffff } }
2669        },
2670        {
2671                "ALU64_MOV_K: large negative",
2672                .u.insns_int = {
2673                        BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
2674                        BPF_EXIT_INSN(),
2675                },
2676                INTERNAL,
2677                { },
2678                { { 0, -123456789 } }
2679        },
2680        {
2681                "ALU64_MOV_K: large negative sign extension",
2682                .u.insns_int = {
2683                        BPF_ALU64_IMM(BPF_MOV, R0, -123456789),
2684                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
2685                        BPF_EXIT_INSN(),
2686                },
2687                INTERNAL,
2688                { },
2689                { { 0, 0xffffffff } }
2690        },
2691        /* BPF_ALU | BPF_ADD | BPF_X */
2692        {
2693                "ALU_ADD_X: 1 + 2 = 3",
2694                .u.insns_int = {
2695                        BPF_LD_IMM64(R0, 1),
2696                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
2697                        BPF_ALU32_REG(BPF_ADD, R0, R1),
2698                        BPF_EXIT_INSN(),
2699                },
2700                INTERNAL,
2701                { },
2702                { { 0, 3 } },
2703        },
2704        {
2705                "ALU_ADD_X: 1 + 4294967294 = 4294967295",
2706                .u.insns_int = {
2707                        BPF_LD_IMM64(R0, 1),
2708                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2709                        BPF_ALU32_REG(BPF_ADD, R0, R1),
2710                        BPF_EXIT_INSN(),
2711                },
2712                INTERNAL,
2713                { },
2714                { { 0, 4294967295U } },
2715        },
2716        {
2717                "ALU_ADD_X: 2 + 4294967294 = 0",
2718                .u.insns_int = {
2719                        BPF_LD_IMM64(R0, 2),
2720                        BPF_LD_IMM64(R1, 4294967294U),
2721                        BPF_ALU32_REG(BPF_ADD, R0, R1),
2722                        BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2723                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
2724                        BPF_EXIT_INSN(),
2725                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
2726                        BPF_EXIT_INSN(),
2727                },
2728                INTERNAL,
2729                { },
2730                { { 0, 1 } },
2731        },
2732        {
2733                "ALU64_ADD_X: 1 + 2 = 3",
2734                .u.insns_int = {
2735                        BPF_LD_IMM64(R0, 1),
2736                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
2737                        BPF_ALU64_REG(BPF_ADD, R0, R1),
2738                        BPF_EXIT_INSN(),
2739                },
2740                INTERNAL,
2741                { },
2742                { { 0, 3 } },
2743        },
2744        {
2745                "ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2746                .u.insns_int = {
2747                        BPF_LD_IMM64(R0, 1),
2748                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2749                        BPF_ALU64_REG(BPF_ADD, R0, R1),
2750                        BPF_EXIT_INSN(),
2751                },
2752                INTERNAL,
2753                { },
2754                { { 0, 4294967295U } },
2755        },
2756        {
2757                "ALU64_ADD_X: 2 + 4294967294 = 4294967296",
2758                .u.insns_int = {
2759                        BPF_LD_IMM64(R0, 2),
2760                        BPF_LD_IMM64(R1, 4294967294U),
2761                        BPF_LD_IMM64(R2, 4294967296ULL),
2762                        BPF_ALU64_REG(BPF_ADD, R0, R1),
2763                        BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
2764                        BPF_MOV32_IMM(R0, 0),
2765                        BPF_EXIT_INSN(),
2766                        BPF_MOV32_IMM(R0, 1),
2767                        BPF_EXIT_INSN(),
2768                },
2769                INTERNAL,
2770                { },
2771                { { 0, 1 } },
2772        },
2773        /* BPF_ALU | BPF_ADD | BPF_K */
2774        {
2775                "ALU_ADD_K: 1 + 2 = 3",
2776                .u.insns_int = {
2777                        BPF_LD_IMM64(R0, 1),
2778                        BPF_ALU32_IMM(BPF_ADD, R0, 2),
2779                        BPF_EXIT_INSN(),
2780                },
2781                INTERNAL,
2782                { },
2783                { { 0, 3 } },
2784        },
2785        {
2786                "ALU_ADD_K: 3 + 0 = 3",
2787                .u.insns_int = {
2788                        BPF_LD_IMM64(R0, 3),
2789                        BPF_ALU32_IMM(BPF_ADD, R0, 0),
2790                        BPF_EXIT_INSN(),
2791                },
2792                INTERNAL,
2793                { },
2794                { { 0, 3 } },
2795        },
2796        {
2797                "ALU_ADD_K: 1 + 4294967294 = 4294967295",
2798                .u.insns_int = {
2799                        BPF_LD_IMM64(R0, 1),
2800                        BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2801                        BPF_EXIT_INSN(),
2802                },
2803                INTERNAL,
2804                { },
2805                { { 0, 4294967295U } },
2806        },
2807        {
2808                "ALU_ADD_K: 4294967294 + 2 = 0",
2809                .u.insns_int = {
2810                        BPF_LD_IMM64(R0, 4294967294U),
2811                        BPF_ALU32_IMM(BPF_ADD, R0, 2),
2812                        BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2813                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
2814                        BPF_EXIT_INSN(),
2815                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
2816                        BPF_EXIT_INSN(),
2817                },
2818                INTERNAL,
2819                { },
2820                { { 0, 1 } },
2821        },
2822        {
2823                "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2824                .u.insns_int = {
2825                        BPF_LD_IMM64(R2, 0x0),
2826                        BPF_LD_IMM64(R3, 0x00000000ffffffff),
2827                        BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2828                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2829                        BPF_MOV32_IMM(R0, 2),
2830                        BPF_EXIT_INSN(),
2831                        BPF_MOV32_IMM(R0, 1),
2832                        BPF_EXIT_INSN(),
2833                },
2834                INTERNAL,
2835                { },
2836                { { 0, 0x1 } },
2837        },
2838        {
2839                "ALU_ADD_K: 0 + 0xffff = 0xffff",
2840                .u.insns_int = {
2841                        BPF_LD_IMM64(R2, 0x0),
2842                        BPF_LD_IMM64(R3, 0xffff),
2843                        BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
2844                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2845                        BPF_MOV32_IMM(R0, 2),
2846                        BPF_EXIT_INSN(),
2847                        BPF_MOV32_IMM(R0, 1),
2848                        BPF_EXIT_INSN(),
2849                },
2850                INTERNAL,
2851                { },
2852                { { 0, 0x1 } },
2853        },
2854        {
2855                "ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2856                .u.insns_int = {
2857                        BPF_LD_IMM64(R2, 0x0),
2858                        BPF_LD_IMM64(R3, 0x7fffffff),
2859                        BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
2860                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2861                        BPF_MOV32_IMM(R0, 2),
2862                        BPF_EXIT_INSN(),
2863                        BPF_MOV32_IMM(R0, 1),
2864                        BPF_EXIT_INSN(),
2865                },
2866                INTERNAL,
2867                { },
2868                { { 0, 0x1 } },
2869        },
2870        {
2871                "ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
2872                .u.insns_int = {
2873                        BPF_LD_IMM64(R2, 0x0),
2874                        BPF_LD_IMM64(R3, 0x80000000),
2875                        BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
2876                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2877                        BPF_MOV32_IMM(R0, 2),
2878                        BPF_EXIT_INSN(),
2879                        BPF_MOV32_IMM(R0, 1),
2880                        BPF_EXIT_INSN(),
2881                },
2882                INTERNAL,
2883                { },
2884                { { 0, 0x1 } },
2885        },
2886        {
2887                "ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
2888                .u.insns_int = {
2889                        BPF_LD_IMM64(R2, 0x0),
2890                        BPF_LD_IMM64(R3, 0x80008000),
2891                        BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
2892                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2893                        BPF_MOV32_IMM(R0, 2),
2894                        BPF_EXIT_INSN(),
2895                        BPF_MOV32_IMM(R0, 1),
2896                        BPF_EXIT_INSN(),
2897                },
2898                INTERNAL,
2899                { },
2900                { { 0, 0x1 } },
2901        },
2902        {
2903                "ALU64_ADD_K: 1 + 2 = 3",
2904                .u.insns_int = {
2905                        BPF_LD_IMM64(R0, 1),
2906                        BPF_ALU64_IMM(BPF_ADD, R0, 2),
2907                        BPF_EXIT_INSN(),
2908                },
2909                INTERNAL,
2910                { },
2911                { { 0, 3 } },
2912        },
2913        {
2914                "ALU64_ADD_K: 3 + 0 = 3",
2915                .u.insns_int = {
2916                        BPF_LD_IMM64(R0, 3),
2917                        BPF_ALU64_IMM(BPF_ADD, R0, 0),
2918                        BPF_EXIT_INSN(),
2919                },
2920                INTERNAL,
2921                { },
2922                { { 0, 3 } },
2923        },
2924        {
2925                "ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2926                .u.insns_int = {
2927                        BPF_LD_IMM64(R0, 1),
2928                        BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2929                        BPF_EXIT_INSN(),
2930                },
2931                INTERNAL,
2932                { },
2933                { { 0, 2147483647 } },
2934        },
2935        {
2936                "ALU64_ADD_K: 4294967294 + 2 = 4294967296",
2937                .u.insns_int = {
2938                        BPF_LD_IMM64(R0, 4294967294U),
2939                        BPF_LD_IMM64(R1, 4294967296ULL),
2940                        BPF_ALU64_IMM(BPF_ADD, R0, 2),
2941                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
2942                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
2943                        BPF_EXIT_INSN(),
2944                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
2945                        BPF_EXIT_INSN(),
2946                },
2947                INTERNAL,
2948                { },
2949                { { 0, 1 } },
2950        },
2951        {
2952                "ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2953                .u.insns_int = {
2954                        BPF_LD_IMM64(R0, 2147483646),
2955                        BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2956                        BPF_EXIT_INSN(),
2957                },
2958                INTERNAL,
2959                { },
2960                { { 0, -1 } },
2961        },
2962        {
2963                "ALU64_ADD_K: 1 + 0 = 1",
2964                .u.insns_int = {
2965                        BPF_LD_IMM64(R2, 0x1),
2966                        BPF_LD_IMM64(R3, 0x1),
2967                        BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2968                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2969                        BPF_MOV32_IMM(R0, 2),
2970                        BPF_EXIT_INSN(),
2971                        BPF_MOV32_IMM(R0, 1),
2972                        BPF_EXIT_INSN(),
2973                },
2974                INTERNAL,
2975                { },
2976                { { 0, 0x1 } },
2977        },
2978        {
2979                "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2980                .u.insns_int = {
2981                        BPF_LD_IMM64(R2, 0x0),
2982                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2983                        BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2984                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2985                        BPF_MOV32_IMM(R0, 2),
2986                        BPF_EXIT_INSN(),
2987                        BPF_MOV32_IMM(R0, 1),
2988                        BPF_EXIT_INSN(),
2989                },
2990                INTERNAL,
2991                { },
2992                { { 0, 0x1 } },
2993        },
2994        {
2995                "ALU64_ADD_K: 0 + 0xffff = 0xffff",
2996                .u.insns_int = {
2997                        BPF_LD_IMM64(R2, 0x0),
2998                        BPF_LD_IMM64(R3, 0xffff),
2999                        BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
3000                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3001                        BPF_MOV32_IMM(R0, 2),
3002                        BPF_EXIT_INSN(),
3003                        BPF_MOV32_IMM(R0, 1),
3004                        BPF_EXIT_INSN(),
3005                },
3006                INTERNAL,
3007                { },
3008                { { 0, 0x1 } },
3009        },
3010        {
3011                "ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
3012                .u.insns_int = {
3013                        BPF_LD_IMM64(R2, 0x0),
3014                        BPF_LD_IMM64(R3, 0x7fffffff),
3015                        BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
3016                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3017                        BPF_MOV32_IMM(R0, 2),
3018                        BPF_EXIT_INSN(),
3019                        BPF_MOV32_IMM(R0, 1),
3020                        BPF_EXIT_INSN(),
3021                },
3022                INTERNAL,
3023                { },
3024                { { 0, 0x1 } },
3025        },
3026        {
3027                "ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
3028                .u.insns_int = {
3029                        BPF_LD_IMM64(R2, 0x0),
3030                        BPF_LD_IMM64(R3, 0xffffffff80000000LL),
3031                        BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
3032                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3033                        BPF_MOV32_IMM(R0, 2),
3034                        BPF_EXIT_INSN(),
3035                        BPF_MOV32_IMM(R0, 1),
3036                        BPF_EXIT_INSN(),
3037                },
3038                INTERNAL,
3039                { },
3040                { { 0, 0x1 } },
3041        },
3042        {
3043                "ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
3044                .u.insns_int = {
3045                        BPF_LD_IMM64(R2, 0x0),
3046                        BPF_LD_IMM64(R3, 0xffffffff80008000LL),
3047                        BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
3048                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3049                        BPF_MOV32_IMM(R0, 2),
3050                        BPF_EXIT_INSN(),
3051                        BPF_MOV32_IMM(R0, 1),
3052                        BPF_EXIT_INSN(),
3053                },
3054                INTERNAL,
3055                { },
3056                { { 0, 0x1 } },
3057        },
3058        /* BPF_ALU | BPF_SUB | BPF_X */
3059        {
3060                "ALU_SUB_X: 3 - 1 = 2",
3061                .u.insns_int = {
3062                        BPF_LD_IMM64(R0, 3),
3063                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
3064                        BPF_ALU32_REG(BPF_SUB, R0, R1),
3065                        BPF_EXIT_INSN(),
3066                },
3067                INTERNAL,
3068                { },
3069                { { 0, 2 } },
3070        },
3071        {
3072                "ALU_SUB_X: 4294967295 - 4294967294 = 1",
3073                .u.insns_int = {
3074                        BPF_LD_IMM64(R0, 4294967295U),
3075                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
3076                        BPF_ALU32_REG(BPF_SUB, R0, R1),
3077                        BPF_EXIT_INSN(),
3078                },
3079                INTERNAL,
3080                { },
3081                { { 0, 1 } },
3082        },
3083        {
3084                "ALU64_SUB_X: 3 - 1 = 2",
3085                .u.insns_int = {
3086                        BPF_LD_IMM64(R0, 3),
3087                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
3088                        BPF_ALU64_REG(BPF_SUB, R0, R1),
3089                        BPF_EXIT_INSN(),
3090                },
3091                INTERNAL,
3092                { },
3093                { { 0, 2 } },
3094        },
3095        {
3096                "ALU64_SUB_X: 4294967295 - 4294967294 = 1",
3097                .u.insns_int = {
3098                        BPF_LD_IMM64(R0, 4294967295U),
3099                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
3100                        BPF_ALU64_REG(BPF_SUB, R0, R1),
3101                        BPF_EXIT_INSN(),
3102                },
3103                INTERNAL,
3104                { },
3105                { { 0, 1 } },
3106        },
3107        /* BPF_ALU | BPF_SUB | BPF_K */
3108        {
3109                "ALU_SUB_K: 3 - 1 = 2",
3110                .u.insns_int = {
3111                        BPF_LD_IMM64(R0, 3),
3112                        BPF_ALU32_IMM(BPF_SUB, R0, 1),
3113                        BPF_EXIT_INSN(),
3114                },
3115                INTERNAL,
3116                { },
3117                { { 0, 2 } },
3118        },
3119        {
3120                "ALU_SUB_K: 3 - 0 = 3",
3121                .u.insns_int = {
3122                        BPF_LD_IMM64(R0, 3),
3123                        BPF_ALU32_IMM(BPF_SUB, R0, 0),
3124                        BPF_EXIT_INSN(),
3125                },
3126                INTERNAL,
3127                { },
3128                { { 0, 3 } },
3129        },
3130        {
3131                "ALU_SUB_K: 4294967295 - 4294967294 = 1",
3132                .u.insns_int = {
3133                        BPF_LD_IMM64(R0, 4294967295U),
3134                        BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
3135                        BPF_EXIT_INSN(),
3136                },
3137                INTERNAL,
3138                { },
3139                { { 0, 1 } },
3140        },
3141        {
3142                "ALU64_SUB_K: 3 - 1 = 2",
3143                .u.insns_int = {
3144                        BPF_LD_IMM64(R0, 3),
3145                        BPF_ALU64_IMM(BPF_SUB, R0, 1),
3146                        BPF_EXIT_INSN(),
3147                },
3148                INTERNAL,
3149                { },
3150                { { 0, 2 } },
3151        },
3152        {
3153                "ALU64_SUB_K: 3 - 0 = 3",
3154                .u.insns_int = {
3155                        BPF_LD_IMM64(R0, 3),
3156                        BPF_ALU64_IMM(BPF_SUB, R0, 0),
3157                        BPF_EXIT_INSN(),
3158                },
3159                INTERNAL,
3160                { },
3161                { { 0, 3 } },
3162        },
3163        {
3164                "ALU64_SUB_K: 4294967294 - 4294967295 = -1",
3165                .u.insns_int = {
3166                        BPF_LD_IMM64(R0, 4294967294U),
3167                        BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
3168                        BPF_EXIT_INSN(),
3169                },
3170                INTERNAL,
3171                { },
3172                { { 0, -1 } },
3173        },
3174        {
3175                "ALU64_ADD_K: 2147483646 - 2147483647 = -1",
3176                .u.insns_int = {
3177                        BPF_LD_IMM64(R0, 2147483646),
3178                        BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
3179                        BPF_EXIT_INSN(),
3180                },
3181                INTERNAL,
3182                { },
3183                { { 0, -1 } },
3184        },
3185        /* BPF_ALU | BPF_MUL | BPF_X */
3186        {
3187                "ALU_MUL_X: 2 * 3 = 6",
3188                .u.insns_int = {
3189                        BPF_LD_IMM64(R0, 2),
3190                        BPF_ALU32_IMM(BPF_MOV, R1, 3),
3191                        BPF_ALU32_REG(BPF_MUL, R0, R1),
3192                        BPF_EXIT_INSN(),
3193                },
3194                INTERNAL,
3195                { },
3196                { { 0, 6 } },
3197        },
3198        {
3199                "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
3200                .u.insns_int = {
3201                        BPF_LD_IMM64(R0, 2),
3202                        BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
3203                        BPF_ALU32_REG(BPF_MUL, R0, R1),
3204                        BPF_EXIT_INSN(),
3205                },
3206                INTERNAL,
3207                { },
3208                { { 0, 0xFFFFFFF0 } },
3209        },
3210        {
3211                "ALU_MUL_X: -1 * -1 = 1",
3212                .u.insns_int = {
3213                        BPF_LD_IMM64(R0, -1),
3214                        BPF_ALU32_IMM(BPF_MOV, R1, -1),
3215                        BPF_ALU32_REG(BPF_MUL, R0, R1),
3216                        BPF_EXIT_INSN(),
3217                },
3218                INTERNAL,
3219                { },
3220                { { 0, 1 } },
3221        },
3222        {
3223                "ALU64_MUL_X: 2 * 3 = 6",
3224                .u.insns_int = {
3225                        BPF_LD_IMM64(R0, 2),
3226                        BPF_ALU32_IMM(BPF_MOV, R1, 3),
3227                        BPF_ALU64_REG(BPF_MUL, R0, R1),
3228                        BPF_EXIT_INSN(),
3229                },
3230                INTERNAL,
3231                { },
3232                { { 0, 6 } },
3233        },
3234        {
3235                "ALU64_MUL_X: 1 * 2147483647 = 2147483647",
3236                .u.insns_int = {
3237                        BPF_LD_IMM64(R0, 1),
3238                        BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3239                        BPF_ALU64_REG(BPF_MUL, R0, R1),
3240                        BPF_EXIT_INSN(),
3241                },
3242                INTERNAL,
3243                { },
3244                { { 0, 2147483647 } },
3245        },
3246        {
3247                "ALU64_MUL_X: 64x64 multiply, low word",
3248                .u.insns_int = {
3249                        BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
3250                        BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
3251                        BPF_ALU64_REG(BPF_MUL, R0, R1),
3252                        BPF_EXIT_INSN(),
3253                },
3254                INTERNAL,
3255                { },
3256                { { 0, 0xe5618cf0 } }
3257        },
3258        {
3259                "ALU64_MUL_X: 64x64 multiply, high word",
3260                .u.insns_int = {
3261                        BPF_LD_IMM64(R0, 0x0fedcba987654321LL),
3262                        BPF_LD_IMM64(R1, 0x123456789abcdef0LL),
3263                        BPF_ALU64_REG(BPF_MUL, R0, R1),
3264                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
3265                        BPF_EXIT_INSN(),
3266                },
3267                INTERNAL,
3268                { },
3269                { { 0, 0x2236d88f } }
3270        },
3271        /* BPF_ALU | BPF_MUL | BPF_K */
3272        {
3273                "ALU_MUL_K: 2 * 3 = 6",
3274                .u.insns_int = {
3275                        BPF_LD_IMM64(R0, 2),
3276                        BPF_ALU32_IMM(BPF_MUL, R0, 3),
3277                        BPF_EXIT_INSN(),
3278                },
3279                INTERNAL,
3280                { },
3281                { { 0, 6 } },
3282        },
3283        {
3284                "ALU_MUL_K: 3 * 1 = 3",
3285                .u.insns_int = {
3286                        BPF_LD_IMM64(R0, 3),
3287                        BPF_ALU32_IMM(BPF_MUL, R0, 1),
3288                        BPF_EXIT_INSN(),
3289                },
3290                INTERNAL,
3291                { },
3292                { { 0, 3 } },
3293        },
3294        {
3295                "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
3296                .u.insns_int = {
3297                        BPF_LD_IMM64(R0, 2),
3298                        BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
3299                        BPF_EXIT_INSN(),
3300                },
3301                INTERNAL,
3302                { },
3303                { { 0, 0xFFFFFFF0 } },
3304        },
3305        {
3306                "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
3307                .u.insns_int = {
3308                        BPF_LD_IMM64(R2, 0x1),
3309                        BPF_LD_IMM64(R3, 0x00000000ffffffff),
3310                        BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
3311                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3312                        BPF_MOV32_IMM(R0, 2),
3313                        BPF_EXIT_INSN(),
3314                        BPF_MOV32_IMM(R0, 1),
3315                        BPF_EXIT_INSN(),
3316                },
3317                INTERNAL,
3318                { },
3319                { { 0, 0x1 } },
3320        },
3321        {
3322                "ALU64_MUL_K: 2 * 3 = 6",
3323                .u.insns_int = {
3324                        BPF_LD_IMM64(R0, 2),
3325                        BPF_ALU64_IMM(BPF_MUL, R0, 3),
3326                        BPF_EXIT_INSN(),
3327                },
3328                INTERNAL,
3329                { },
3330                { { 0, 6 } },
3331        },
3332        {
3333                "ALU64_MUL_K: 3 * 1 = 3",
3334                .u.insns_int = {
3335                        BPF_LD_IMM64(R0, 3),
3336                        BPF_ALU64_IMM(BPF_MUL, R0, 1),
3337                        BPF_EXIT_INSN(),
3338                },
3339                INTERNAL,
3340                { },
3341                { { 0, 3 } },
3342        },
3343        {
3344                "ALU64_MUL_K: 1 * 2147483647 = 2147483647",
3345                .u.insns_int = {
3346                        BPF_LD_IMM64(R0, 1),
3347                        BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
3348                        BPF_EXIT_INSN(),
3349                },
3350                INTERNAL,
3351                { },
3352                { { 0, 2147483647 } },
3353        },
3354        {
3355                "ALU64_MUL_K: 1 * -2147483647 = -2147483647",
3356                .u.insns_int = {
3357                        BPF_LD_IMM64(R0, 1),
3358                        BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
3359                        BPF_EXIT_INSN(),
3360                },
3361                INTERNAL,
3362                { },
3363                { { 0, -2147483647 } },
3364        },
3365        {
3366                "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
3367                .u.insns_int = {
3368                        BPF_LD_IMM64(R2, 0x1),
3369                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3370                        BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
3371                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3372                        BPF_MOV32_IMM(R0, 2),
3373                        BPF_EXIT_INSN(),
3374                        BPF_MOV32_IMM(R0, 1),
3375                        BPF_EXIT_INSN(),
3376                },
3377                INTERNAL,
3378                { },
3379                { { 0, 0x1 } },
3380        },
3381        {
3382                "ALU64_MUL_K: 64x32 multiply, low word",
3383                .u.insns_int = {
3384                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3385                        BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
3386                        BPF_EXIT_INSN(),
3387                },
3388                INTERNAL,
3389                { },
3390                { { 0, 0xe242d208 } }
3391        },
3392        {
3393                "ALU64_MUL_K: 64x32 multiply, high word",
3394                .u.insns_int = {
3395                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3396                        BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678),
3397                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
3398                        BPF_EXIT_INSN(),
3399                },
3400                INTERNAL,
3401                { },
3402                { { 0, 0xc28f5c28 } }
3403        },
3404        /* BPF_ALU | BPF_DIV | BPF_X */
3405        {
3406                "ALU_DIV_X: 6 / 2 = 3",
3407                .u.insns_int = {
3408                        BPF_LD_IMM64(R0, 6),
3409                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3410                        BPF_ALU32_REG(BPF_DIV, R0, R1),
3411                        BPF_EXIT_INSN(),
3412                },
3413                INTERNAL,
3414                { },
3415                { { 0, 3 } },
3416        },
3417        {
3418                "ALU_DIV_X: 4294967295 / 4294967295 = 1",
3419                .u.insns_int = {
3420                        BPF_LD_IMM64(R0, 4294967295U),
3421                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
3422                        BPF_ALU32_REG(BPF_DIV, R0, R1),
3423                        BPF_EXIT_INSN(),
3424                },
3425                INTERNAL,
3426                { },
3427                { { 0, 1 } },
3428        },
3429        {
3430                "ALU64_DIV_X: 6 / 2 = 3",
3431                .u.insns_int = {
3432                        BPF_LD_IMM64(R0, 6),
3433                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3434                        BPF_ALU64_REG(BPF_DIV, R0, R1),
3435                        BPF_EXIT_INSN(),
3436                },
3437                INTERNAL,
3438                { },
3439                { { 0, 3 } },
3440        },
3441        {
3442                "ALU64_DIV_X: 2147483647 / 2147483647 = 1",
3443                .u.insns_int = {
3444                        BPF_LD_IMM64(R0, 2147483647),
3445                        BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3446                        BPF_ALU64_REG(BPF_DIV, R0, R1),
3447                        BPF_EXIT_INSN(),
3448                },
3449                INTERNAL,
3450                { },
3451                { { 0, 1 } },
3452        },
3453        {
3454                "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3455                .u.insns_int = {
3456                        BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3457                        BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
3458                        BPF_LD_IMM64(R3, 0x0000000000000001LL),
3459                        BPF_ALU64_REG(BPF_DIV, R2, R4),
3460                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3461                        BPF_MOV32_IMM(R0, 2),
3462                        BPF_EXIT_INSN(),
3463                        BPF_MOV32_IMM(R0, 1),
3464                        BPF_EXIT_INSN(),
3465                },
3466                INTERNAL,
3467                { },
3468                { { 0, 0x1 } },
3469        },
3470        /* BPF_ALU | BPF_DIV | BPF_K */
3471        {
3472                "ALU_DIV_K: 6 / 2 = 3",
3473                .u.insns_int = {
3474                        BPF_LD_IMM64(R0, 6),
3475                        BPF_ALU32_IMM(BPF_DIV, R0, 2),
3476                        BPF_EXIT_INSN(),
3477                },
3478                INTERNAL,
3479                { },
3480                { { 0, 3 } },
3481        },
3482        {
3483                "ALU_DIV_K: 3 / 1 = 3",
3484                .u.insns_int = {
3485                        BPF_LD_IMM64(R0, 3),
3486                        BPF_ALU32_IMM(BPF_DIV, R0, 1),
3487                        BPF_EXIT_INSN(),
3488                },
3489                INTERNAL,
3490                { },
3491                { { 0, 3 } },
3492        },
3493        {
3494                "ALU_DIV_K: 4294967295 / 4294967295 = 1",
3495                .u.insns_int = {
3496                        BPF_LD_IMM64(R0, 4294967295U),
3497                        BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
3498                        BPF_EXIT_INSN(),
3499                },
3500                INTERNAL,
3501                { },
3502                { { 0, 1 } },
3503        },
3504        {
3505                "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
3506                .u.insns_int = {
3507                        BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3508                        BPF_LD_IMM64(R3, 0x1UL),
3509                        BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
3510                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3511                        BPF_MOV32_IMM(R0, 2),
3512                        BPF_EXIT_INSN(),
3513                        BPF_MOV32_IMM(R0, 1),
3514                        BPF_EXIT_INSN(),
3515                },
3516                INTERNAL,
3517                { },
3518                { { 0, 0x1 } },
3519        },
3520        {
3521                "ALU64_DIV_K: 6 / 2 = 3",
3522                .u.insns_int = {
3523                        BPF_LD_IMM64(R0, 6),
3524                        BPF_ALU64_IMM(BPF_DIV, R0, 2),
3525                        BPF_EXIT_INSN(),
3526                },
3527                INTERNAL,
3528                { },
3529                { { 0, 3 } },
3530        },
3531        {
3532                "ALU64_DIV_K: 3 / 1 = 3",
3533                .u.insns_int = {
3534                        BPF_LD_IMM64(R0, 3),
3535                        BPF_ALU64_IMM(BPF_DIV, R0, 1),
3536                        BPF_EXIT_INSN(),
3537                },
3538                INTERNAL,
3539                { },
3540                { { 0, 3 } },
3541        },
3542        {
3543                "ALU64_DIV_K: 2147483647 / 2147483647 = 1",
3544                .u.insns_int = {
3545                        BPF_LD_IMM64(R0, 2147483647),
3546                        BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
3547                        BPF_EXIT_INSN(),
3548                },
3549                INTERNAL,
3550                { },
3551                { { 0, 1 } },
3552        },
3553        {
3554                "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3555                .u.insns_int = {
3556                        BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3557                        BPF_LD_IMM64(R3, 0x0000000000000001LL),
3558                        BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
3559                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3560                        BPF_MOV32_IMM(R0, 2),
3561                        BPF_EXIT_INSN(),
3562                        BPF_MOV32_IMM(R0, 1),
3563                        BPF_EXIT_INSN(),
3564                },
3565                INTERNAL,
3566                { },
3567                { { 0, 0x1 } },
3568        },
3569        /* BPF_ALU | BPF_MOD | BPF_X */
3570        {
3571                "ALU_MOD_X: 3 % 2 = 1",
3572                .u.insns_int = {
3573                        BPF_LD_IMM64(R0, 3),
3574                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3575                        BPF_ALU32_REG(BPF_MOD, R0, R1),
3576                        BPF_EXIT_INSN(),
3577                },
3578                INTERNAL,
3579                { },
3580                { { 0, 1 } },
3581        },
3582        {
3583                "ALU_MOD_X: 4294967295 % 4294967293 = 2",
3584                .u.insns_int = {
3585                        BPF_LD_IMM64(R0, 4294967295U),
3586                        BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
3587                        BPF_ALU32_REG(BPF_MOD, R0, R1),
3588                        BPF_EXIT_INSN(),
3589                },
3590                INTERNAL,
3591                { },
3592                { { 0, 2 } },
3593        },
3594        {
3595                "ALU64_MOD_X: 3 % 2 = 1",
3596                .u.insns_int = {
3597                        BPF_LD_IMM64(R0, 3),
3598                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3599                        BPF_ALU64_REG(BPF_MOD, R0, R1),
3600                        BPF_EXIT_INSN(),
3601                },
3602                INTERNAL,
3603                { },
3604                { { 0, 1 } },
3605        },
3606        {
3607                "ALU64_MOD_X: 2147483647 % 2147483645 = 2",
3608                .u.insns_int = {
3609                        BPF_LD_IMM64(R0, 2147483647),
3610                        BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
3611                        BPF_ALU64_REG(BPF_MOD, R0, R1),
3612                        BPF_EXIT_INSN(),
3613                },
3614                INTERNAL,
3615                { },
3616                { { 0, 2 } },
3617        },
3618        /* BPF_ALU | BPF_MOD | BPF_K */
3619        {
3620                "ALU_MOD_K: 3 % 2 = 1",
3621                .u.insns_int = {
3622                        BPF_LD_IMM64(R0, 3),
3623                        BPF_ALU32_IMM(BPF_MOD, R0, 2),
3624                        BPF_EXIT_INSN(),
3625                },
3626                INTERNAL,
3627                { },
3628                { { 0, 1 } },
3629        },
3630        {
3631                "ALU_MOD_K: 3 % 1 = 0",
3632                .u.insns_int = {
3633                        BPF_LD_IMM64(R0, 3),
3634                        BPF_ALU32_IMM(BPF_MOD, R0, 1),
3635                        BPF_EXIT_INSN(),
3636                },
3637                INTERNAL,
3638                { },
3639                { { 0, 0 } },
3640        },
3641        {
3642                "ALU_MOD_K: 4294967295 % 4294967293 = 2",
3643                .u.insns_int = {
3644                        BPF_LD_IMM64(R0, 4294967295U),
3645                        BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
3646                        BPF_EXIT_INSN(),
3647                },
3648                INTERNAL,
3649                { },
3650                { { 0, 2 } },
3651        },
3652        {
3653                "ALU64_MOD_K: 3 % 2 = 1",
3654                .u.insns_int = {
3655                        BPF_LD_IMM64(R0, 3),
3656                        BPF_ALU64_IMM(BPF_MOD, R0, 2),
3657                        BPF_EXIT_INSN(),
3658                },
3659                INTERNAL,
3660                { },
3661                { { 0, 1 } },
3662        },
3663        {
3664                "ALU64_MOD_K: 3 % 1 = 0",
3665                .u.insns_int = {
3666                        BPF_LD_IMM64(R0, 3),
3667                        BPF_ALU64_IMM(BPF_MOD, R0, 1),
3668                        BPF_EXIT_INSN(),
3669                },
3670                INTERNAL,
3671                { },
3672                { { 0, 0 } },
3673        },
3674        {
3675                "ALU64_MOD_K: 2147483647 % 2147483645 = 2",
3676                .u.insns_int = {
3677                        BPF_LD_IMM64(R0, 2147483647),
3678                        BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
3679                        BPF_EXIT_INSN(),
3680                },
3681                INTERNAL,
3682                { },
3683                { { 0, 2 } },
3684        },
3685        /* BPF_ALU | BPF_AND | BPF_X */
3686        {
3687                "ALU_AND_X: 3 & 2 = 2",
3688                .u.insns_int = {
3689                        BPF_LD_IMM64(R0, 3),
3690                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3691                        BPF_ALU32_REG(BPF_AND, R0, R1),
3692                        BPF_EXIT_INSN(),
3693                },
3694                INTERNAL,
3695                { },
3696                { { 0, 2 } },
3697        },
3698        {
3699                "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3700                .u.insns_int = {
3701                        BPF_LD_IMM64(R0, 0xffffffff),
3702                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3703                        BPF_ALU32_REG(BPF_AND, R0, R1),
3704                        BPF_EXIT_INSN(),
3705                },
3706                INTERNAL,
3707                { },
3708                { { 0, 0xffffffff } },
3709        },
3710        {
3711                "ALU64_AND_X: 3 & 2 = 2",
3712                .u.insns_int = {
3713                        BPF_LD_IMM64(R0, 3),
3714                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3715                        BPF_ALU64_REG(BPF_AND, R0, R1),
3716                        BPF_EXIT_INSN(),
3717                },
3718                INTERNAL,
3719                { },
3720                { { 0, 2 } },
3721        },
3722        {
3723                "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3724                .u.insns_int = {
3725                        BPF_LD_IMM64(R0, 0xffffffff),
3726                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3727                        BPF_ALU64_REG(BPF_AND, R0, R1),
3728                        BPF_EXIT_INSN(),
3729                },
3730                INTERNAL,
3731                { },
3732                { { 0, 0xffffffff } },
3733        },
3734        /* BPF_ALU | BPF_AND | BPF_K */
3735        {
3736                "ALU_AND_K: 3 & 2 = 2",
3737                .u.insns_int = {
3738                        BPF_LD_IMM64(R0, 3),
3739                        BPF_ALU32_IMM(BPF_AND, R0, 2),
3740                        BPF_EXIT_INSN(),
3741                },
3742                INTERNAL,
3743                { },
3744                { { 0, 2 } },
3745        },
3746        {
3747                "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3748                .u.insns_int = {
3749                        BPF_LD_IMM64(R0, 0xffffffff),
3750                        BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
3751                        BPF_EXIT_INSN(),
3752                },
3753                INTERNAL,
3754                { },
3755                { { 0, 0xffffffff } },
3756        },
3757        {
3758                "ALU_AND_K: Small immediate",
3759                .u.insns_int = {
3760                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
3761                        BPF_ALU32_IMM(BPF_AND, R0, 15),
3762                        BPF_EXIT_INSN(),
3763                },
3764                INTERNAL,
3765                { },
3766                { { 0, 4 } }
3767        },
3768        {
3769                "ALU_AND_K: Large immediate",
3770                .u.insns_int = {
3771                        BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
3772                        BPF_ALU32_IMM(BPF_AND, R0, 0xafbfcfdf),
3773                        BPF_EXIT_INSN(),
3774                },
3775                INTERNAL,
3776                { },
3777                { { 0, 0xa1b2c3d4 } }
3778        },
3779        {
3780                "ALU_AND_K: Zero extension",
3781                .u.insns_int = {
3782                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3783                        BPF_LD_IMM64(R1, 0x0000000080a0c0e0LL),
3784                        BPF_ALU32_IMM(BPF_AND, R0, 0xf0f0f0f0),
3785                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
3786                        BPF_MOV32_IMM(R0, 2),
3787                        BPF_EXIT_INSN(),
3788                        BPF_MOV32_IMM(R0, 1),
3789                        BPF_EXIT_INSN(),
3790                },
3791                INTERNAL,
3792                { },
3793                { { 0, 1 } }
3794        },
3795        {
3796                "ALU64_AND_K: 3 & 2 = 2",
3797                .u.insns_int = {
3798                        BPF_LD_IMM64(R0, 3),
3799                        BPF_ALU64_IMM(BPF_AND, R0, 2),
3800                        BPF_EXIT_INSN(),
3801                },
3802                INTERNAL,
3803                { },
3804                { { 0, 2 } },
3805        },
3806        {
3807                "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3808                .u.insns_int = {
3809                        BPF_LD_IMM64(R0, 0xffffffff),
3810                        BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
3811                        BPF_EXIT_INSN(),
3812                },
3813                INTERNAL,
3814                { },
3815                { { 0, 0xffffffff } },
3816        },
3817        {
3818                "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000000000000000",
3819                .u.insns_int = {
3820                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3821                        BPF_LD_IMM64(R3, 0x0000000000000000LL),
3822                        BPF_ALU64_IMM(BPF_AND, R2, 0x0),
3823                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3824                        BPF_MOV32_IMM(R0, 2),
3825                        BPF_EXIT_INSN(),
3826                        BPF_MOV32_IMM(R0, 1),
3827                        BPF_EXIT_INSN(),
3828                },
3829                INTERNAL,
3830                { },
3831                { { 0, 0x1 } },
3832        },
3833        {
3834                "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffff0000",
3835                .u.insns_int = {
3836                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3837                        BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3838                        BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3839                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3840                        BPF_MOV32_IMM(R0, 2),
3841                        BPF_EXIT_INSN(),
3842                        BPF_MOV32_IMM(R0, 1),
3843                        BPF_EXIT_INSN(),
3844                },
3845                INTERNAL,
3846                { },
3847                { { 0, 0x1 } },
3848        },
3849        {
3850                "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3851                .u.insns_int = {
3852                        BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3853                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3854                        BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3855                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3856                        BPF_MOV32_IMM(R0, 2),
3857                        BPF_EXIT_INSN(),
3858                        BPF_MOV32_IMM(R0, 1),
3859                        BPF_EXIT_INSN(),
3860                },
3861                INTERNAL,
3862                { },
3863                { { 0, 0x1 } },
3864        },
3865        {
3866                "ALU64_AND_K: Sign extension 1",
3867                .u.insns_int = {
3868                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3869                        BPF_LD_IMM64(R1, 0x00000000090b0d0fLL),
3870                        BPF_ALU64_IMM(BPF_AND, R0, 0x0f0f0f0f),
3871                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
3872                        BPF_MOV32_IMM(R0, 2),
3873                        BPF_EXIT_INSN(),
3874                        BPF_MOV32_IMM(R0, 1),
3875                        BPF_EXIT_INSN(),
3876                },
3877                INTERNAL,
3878                { },
3879                { { 0, 1 } }
3880        },
3881        {
3882                "ALU64_AND_K: Sign extension 2",
3883                .u.insns_int = {
3884                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3885                        BPF_LD_IMM64(R1, 0x0123456780a0c0e0LL),
3886                        BPF_ALU64_IMM(BPF_AND, R0, 0xf0f0f0f0),
3887                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
3888                        BPF_MOV32_IMM(R0, 2),
3889                        BPF_EXIT_INSN(),
3890                        BPF_MOV32_IMM(R0, 1),
3891                        BPF_EXIT_INSN(),
3892                },
3893                INTERNAL,
3894                { },
3895                { { 0, 1 } }
3896        },
3897        /* BPF_ALU | BPF_OR | BPF_X */
3898        {
3899                "ALU_OR_X: 1 | 2 = 3",
3900                .u.insns_int = {
3901                        BPF_LD_IMM64(R0, 1),
3902                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3903                        BPF_ALU32_REG(BPF_OR, R0, R1),
3904                        BPF_EXIT_INSN(),
3905                },
3906                INTERNAL,
3907                { },
3908                { { 0, 3 } },
3909        },
3910        {
3911                "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3912                .u.insns_int = {
3913                        BPF_LD_IMM64(R0, 0),
3914                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3915                        BPF_ALU32_REG(BPF_OR, R0, R1),
3916                        BPF_EXIT_INSN(),
3917                },
3918                INTERNAL,
3919                { },
3920                { { 0, 0xffffffff } },
3921        },
3922        {
3923                "ALU64_OR_X: 1 | 2 = 3",
3924                .u.insns_int = {
3925                        BPF_LD_IMM64(R0, 1),
3926                        BPF_ALU32_IMM(BPF_MOV, R1, 2),
3927                        BPF_ALU64_REG(BPF_OR, R0, R1),
3928                        BPF_EXIT_INSN(),
3929                },
3930                INTERNAL,
3931                { },
3932                { { 0, 3 } },
3933        },
3934        {
3935                "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3936                .u.insns_int = {
3937                        BPF_LD_IMM64(R0, 0),
3938                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3939                        BPF_ALU64_REG(BPF_OR, R0, R1),
3940                        BPF_EXIT_INSN(),
3941                },
3942                INTERNAL,
3943                { },
3944                { { 0, 0xffffffff } },
3945        },
3946        /* BPF_ALU | BPF_OR | BPF_K */
3947        {
3948                "ALU_OR_K: 1 | 2 = 3",
3949                .u.insns_int = {
3950                        BPF_LD_IMM64(R0, 1),
3951                        BPF_ALU32_IMM(BPF_OR, R0, 2),
3952                        BPF_EXIT_INSN(),
3953                },
3954                INTERNAL,
3955                { },
3956                { { 0, 3 } },
3957        },
3958        {
3959                "ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3960                .u.insns_int = {
3961                        BPF_LD_IMM64(R0, 0),
3962                        BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3963                        BPF_EXIT_INSN(),
3964                },
3965                INTERNAL,
3966                { },
3967                { { 0, 0xffffffff } },
3968        },
3969        {
3970                "ALU_OR_K: Small immediate",
3971                .u.insns_int = {
3972                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
3973                        BPF_ALU32_IMM(BPF_OR, R0, 1),
3974                        BPF_EXIT_INSN(),
3975                },
3976                INTERNAL,
3977                { },
3978                { { 0, 0x01020305 } }
3979        },
3980        {
3981                "ALU_OR_K: Large immediate",
3982                .u.insns_int = {
3983                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
3984                        BPF_ALU32_IMM(BPF_OR, R0, 0xa0b0c0d0),
3985                        BPF_EXIT_INSN(),
3986                },
3987                INTERNAL,
3988                { },
3989                { { 0, 0xa1b2c3d4 } }
3990        },
3991        {
3992                "ALU_OR_K: Zero extension",
3993                .u.insns_int = {
3994                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
3995                        BPF_LD_IMM64(R1, 0x00000000f9fbfdffLL),
3996                        BPF_ALU32_IMM(BPF_OR, R0, 0xf0f0f0f0),
3997                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
3998                        BPF_MOV32_IMM(R0, 2),
3999                        BPF_EXIT_INSN(),
4000                        BPF_MOV32_IMM(R0, 1),
4001                        BPF_EXIT_INSN(),
4002                },
4003                INTERNAL,
4004                { },
4005                { { 0, 1 } }
4006        },
4007        {
4008                "ALU64_OR_K: 1 | 2 = 3",
4009                .u.insns_int = {
4010                        BPF_LD_IMM64(R0, 1),
4011                        BPF_ALU64_IMM(BPF_OR, R0, 2),
4012                        BPF_EXIT_INSN(),
4013                },
4014                INTERNAL,
4015                { },
4016                { { 0, 3 } },
4017        },
4018        {
4019                "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
4020                .u.insns_int = {
4021                        BPF_LD_IMM64(R0, 0),
4022                        BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
4023                        BPF_EXIT_INSN(),
4024                },
4025                INTERNAL,
4026                { },
4027                { { 0, 0xffffffff } },
4028        },
4029        {
4030                "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffffffff0000",
4031                .u.insns_int = {
4032                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4033                        BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
4034                        BPF_ALU64_IMM(BPF_OR, R2, 0x0),
4035                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4036                        BPF_MOV32_IMM(R0, 2),
4037                        BPF_EXIT_INSN(),
4038                        BPF_MOV32_IMM(R0, 1),
4039                        BPF_EXIT_INSN(),
4040                },
4041                INTERNAL,
4042                { },
4043                { { 0, 0x1 } },
4044        },
4045        {
4046                "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
4047                .u.insns_int = {
4048                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4049                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4050                        BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
4051                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4052                        BPF_MOV32_IMM(R0, 2),
4053                        BPF_EXIT_INSN(),
4054                        BPF_MOV32_IMM(R0, 1),
4055                        BPF_EXIT_INSN(),
4056                },
4057                INTERNAL,
4058                { },
4059                { { 0, 0x1 } },
4060        },
4061        {
4062                "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
4063                .u.insns_int = {
4064                        BPF_LD_IMM64(R2, 0x0000000000000000LL),
4065                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4066                        BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
4067                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4068                        BPF_MOV32_IMM(R0, 2),
4069                        BPF_EXIT_INSN(),
4070                        BPF_MOV32_IMM(R0, 1),
4071                        BPF_EXIT_INSN(),
4072                },
4073                INTERNAL,
4074                { },
4075                { { 0, 0x1 } },
4076        },
4077        {
4078                "ALU64_OR_K: Sign extension 1",
4079                .u.insns_int = {
4080                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4081                        BPF_LD_IMM64(R1, 0x012345678fafcfefLL),
4082                        BPF_ALU64_IMM(BPF_OR, R0, 0x0f0f0f0f),
4083                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
4084                        BPF_MOV32_IMM(R0, 2),
4085                        BPF_EXIT_INSN(),
4086                        BPF_MOV32_IMM(R0, 1),
4087                        BPF_EXIT_INSN(),
4088                },
4089                INTERNAL,
4090                { },
4091                { { 0, 1 } }
4092        },
4093        {
4094                "ALU64_OR_K: Sign extension 2",
4095                .u.insns_int = {
4096                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4097                        BPF_LD_IMM64(R1, 0xfffffffff9fbfdffLL),
4098                        BPF_ALU64_IMM(BPF_OR, R0, 0xf0f0f0f0),
4099                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
4100                        BPF_MOV32_IMM(R0, 2),
4101                        BPF_EXIT_INSN(),
4102                        BPF_MOV32_IMM(R0, 1),
4103                        BPF_EXIT_INSN(),
4104                },
4105                INTERNAL,
4106                { },
4107                { { 0, 1 } }
4108        },
4109        /* BPF_ALU | BPF_XOR | BPF_X */
4110        {
4111                "ALU_XOR_X: 5 ^ 6 = 3",
4112                .u.insns_int = {
4113                        BPF_LD_IMM64(R0, 5),
4114                        BPF_ALU32_IMM(BPF_MOV, R1, 6),
4115                        BPF_ALU32_REG(BPF_XOR, R0, R1),
4116                        BPF_EXIT_INSN(),
4117                },
4118                INTERNAL,
4119                { },
4120                { { 0, 3 } },
4121        },
4122        {
4123                "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
4124                .u.insns_int = {
4125                        BPF_LD_IMM64(R0, 1),
4126                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
4127                        BPF_ALU32_REG(BPF_XOR, R0, R1),
4128                        BPF_EXIT_INSN(),
4129                },
4130                INTERNAL,
4131                { },
4132                { { 0, 0xfffffffe } },
4133        },
4134        {
4135                "ALU64_XOR_X: 5 ^ 6 = 3",
4136                .u.insns_int = {
4137                        BPF_LD_IMM64(R0, 5),
4138                        BPF_ALU32_IMM(BPF_MOV, R1, 6),
4139                        BPF_ALU64_REG(BPF_XOR, R0, R1),
4140                        BPF_EXIT_INSN(),
4141                },
4142                INTERNAL,
4143                { },
4144                { { 0, 3 } },
4145        },
4146        {
4147                "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
4148                .u.insns_int = {
4149                        BPF_LD_IMM64(R0, 1),
4150                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
4151                        BPF_ALU64_REG(BPF_XOR, R0, R1),
4152                        BPF_EXIT_INSN(),
4153                },
4154                INTERNAL,
4155                { },
4156                { { 0, 0xfffffffe } },
4157        },
4158        /* BPF_ALU | BPF_XOR | BPF_K */
4159        {
4160                "ALU_XOR_K: 5 ^ 6 = 3",
4161                .u.insns_int = {
4162                        BPF_LD_IMM64(R0, 5),
4163                        BPF_ALU32_IMM(BPF_XOR, R0, 6),
4164                        BPF_EXIT_INSN(),
4165                },
4166                INTERNAL,
4167                { },
4168                { { 0, 3 } },
4169        },
4170        {
4171                "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
4172                .u.insns_int = {
4173                        BPF_LD_IMM64(R0, 1),
4174                        BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
4175                        BPF_EXIT_INSN(),
4176                },
4177                INTERNAL,
4178                { },
4179                { { 0, 0xfffffffe } },
4180        },
4181        {
4182                "ALU_XOR_K: Small immediate",
4183                .u.insns_int = {
4184                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304),
4185                        BPF_ALU32_IMM(BPF_XOR, R0, 15),
4186                        BPF_EXIT_INSN(),
4187                },
4188                INTERNAL,
4189                { },
4190                { { 0, 0x0102030b } }
4191        },
4192        {
4193                "ALU_XOR_K: Large immediate",
4194                .u.insns_int = {
4195                        BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4),
4196                        BPF_ALU32_IMM(BPF_XOR, R0, 0xafbfcfdf),
4197                        BPF_EXIT_INSN(),
4198                },
4199                INTERNAL,
4200                { },
4201                { { 0, 0x5e4d3c2b } }
4202        },
4203        {
4204                "ALU_XOR_K: Zero extension",
4205                .u.insns_int = {
4206                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4207                        BPF_LD_IMM64(R1, 0x00000000795b3d1fLL),
4208                        BPF_ALU32_IMM(BPF_XOR, R0, 0xf0f0f0f0),
4209                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
4210                        BPF_MOV32_IMM(R0, 2),
4211                        BPF_EXIT_INSN(),
4212                        BPF_MOV32_IMM(R0, 1),
4213                        BPF_EXIT_INSN(),
4214                },
4215                INTERNAL,
4216                { },
4217                { { 0, 1 } }
4218        },
4219        {
4220                "ALU64_XOR_K: 5 ^ 6 = 3",
4221                .u.insns_int = {
4222                        BPF_LD_IMM64(R0, 5),
4223                        BPF_ALU64_IMM(BPF_XOR, R0, 6),
4224                        BPF_EXIT_INSN(),
4225                },
4226                INTERNAL,
4227                { },
4228                { { 0, 3 } },
4229        },
4230        {
4231                "ALU64_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
4232                .u.insns_int = {
4233                        BPF_LD_IMM64(R0, 1),
4234                        BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
4235                        BPF_EXIT_INSN(),
4236                },
4237                INTERNAL,
4238                { },
4239                { { 0, 0xfffffffe } },
4240        },
4241        {
4242                "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
4243                .u.insns_int = {
4244                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4245                        BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
4246                        BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
4247                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4248                        BPF_MOV32_IMM(R0, 2),
4249                        BPF_EXIT_INSN(),
4250                        BPF_MOV32_IMM(R0, 1),
4251                        BPF_EXIT_INSN(),
4252                },
4253                INTERNAL,
4254                { },
4255                { { 0, 0x1 } },
4256        },
4257        {
4258                "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
4259                .u.insns_int = {
4260                        BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
4261                        BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
4262                        BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
4263                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4264                        BPF_MOV32_IMM(R0, 2),
4265                        BPF_EXIT_INSN(),
4266                        BPF_MOV32_IMM(R0, 1),
4267                        BPF_EXIT_INSN(),
4268                },
4269                INTERNAL,
4270                { },
4271                { { 0, 0x1 } },
4272        },
4273        {
4274                "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
4275                .u.insns_int = {
4276                        BPF_LD_IMM64(R2, 0x0000000000000000LL),
4277                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4278                        BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
4279                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4280                        BPF_MOV32_IMM(R0, 2),
4281                        BPF_EXIT_INSN(),
4282                        BPF_MOV32_IMM(R0, 1),
4283                        BPF_EXIT_INSN(),
4284                },
4285                INTERNAL,
4286                { },
4287                { { 0, 0x1 } },
4288        },
4289        {
4290                "ALU64_XOR_K: Sign extension 1",
4291                .u.insns_int = {
4292                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4293                        BPF_LD_IMM64(R1, 0x0123456786a4c2e0LL),
4294                        BPF_ALU64_IMM(BPF_XOR, R0, 0x0f0f0f0f),
4295                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
4296                        BPF_MOV32_IMM(R0, 2),
4297                        BPF_EXIT_INSN(),
4298                        BPF_MOV32_IMM(R0, 1),
4299                        BPF_EXIT_INSN(),
4300                },
4301                INTERNAL,
4302                { },
4303                { { 0, 1 } }
4304        },
4305        {
4306                "ALU64_XOR_K: Sign extension 2",
4307                .u.insns_int = {
4308                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4309                        BPF_LD_IMM64(R1, 0xfedcba98795b3d1fLL),
4310                        BPF_ALU64_IMM(BPF_XOR, R0, 0xf0f0f0f0),
4311                        BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
4312                        BPF_MOV32_IMM(R0, 2),
4313                        BPF_EXIT_INSN(),
4314                        BPF_MOV32_IMM(R0, 1),
4315                        BPF_EXIT_INSN(),
4316                },
4317                INTERNAL,
4318                { },
4319                { { 0, 1 } }
4320        },
4321        /* BPF_ALU | BPF_LSH | BPF_X */
4322        {
4323                "ALU_LSH_X: 1 << 1 = 2",
4324                .u.insns_int = {
4325                        BPF_LD_IMM64(R0, 1),
4326                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
4327                        BPF_ALU32_REG(BPF_LSH, R0, R1),
4328                        BPF_EXIT_INSN(),
4329                },
4330                INTERNAL,
4331                { },
4332                { { 0, 2 } },
4333        },
4334        {
4335                "ALU_LSH_X: 1 << 31 = 0x80000000",
4336                .u.insns_int = {
4337                        BPF_LD_IMM64(R0, 1),
4338                        BPF_ALU32_IMM(BPF_MOV, R1, 31),
4339                        BPF_ALU32_REG(BPF_LSH, R0, R1),
4340                        BPF_EXIT_INSN(),
4341                },
4342                INTERNAL,
4343                { },
4344                { { 0, 0x80000000 } },
4345        },
4346        {
4347                "ALU_LSH_X: 0x12345678 << 12 = 0x45678000",
4348                .u.insns_int = {
4349                        BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
4350                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4351                        BPF_ALU32_REG(BPF_LSH, R0, R1),
4352                        BPF_EXIT_INSN(),
4353                },
4354                INTERNAL,
4355                { },
4356                { { 0, 0x45678000 } }
4357        },
4358        {
4359                "ALU64_LSH_X: 1 << 1 = 2",
4360                .u.insns_int = {
4361                        BPF_LD_IMM64(R0, 1),
4362                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
4363                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4364                        BPF_EXIT_INSN(),
4365                },
4366                INTERNAL,
4367                { },
4368                { { 0, 2 } },
4369        },
4370        {
4371                "ALU64_LSH_X: 1 << 31 = 0x80000000",
4372                .u.insns_int = {
4373                        BPF_LD_IMM64(R0, 1),
4374                        BPF_ALU32_IMM(BPF_MOV, R1, 31),
4375                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4376                        BPF_EXIT_INSN(),
4377                },
4378                INTERNAL,
4379                { },
4380                { { 0, 0x80000000 } },
4381        },
4382        {
4383                "ALU64_LSH_X: Shift < 32, low word",
4384                .u.insns_int = {
4385                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4386                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4387                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4388                        BPF_EXIT_INSN(),
4389                },
4390                INTERNAL,
4391                { },
4392                { { 0, 0xbcdef000 } }
4393        },
4394        {
4395                "ALU64_LSH_X: Shift < 32, high word",
4396                .u.insns_int = {
4397                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4398                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4399                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4400                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4401                        BPF_EXIT_INSN(),
4402                },
4403                INTERNAL,
4404                { },
4405                { { 0, 0x3456789a } }
4406        },
4407        {
4408                "ALU64_LSH_X: Shift > 32, low word",
4409                .u.insns_int = {
4410                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4411                        BPF_ALU32_IMM(BPF_MOV, R1, 36),
4412                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4413                        BPF_EXIT_INSN(),
4414                },
4415                INTERNAL,
4416                { },
4417                { { 0, 0 } }
4418        },
4419        {
4420                "ALU64_LSH_X: Shift > 32, high word",
4421                .u.insns_int = {
4422                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4423                        BPF_ALU32_IMM(BPF_MOV, R1, 36),
4424                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4425                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4426                        BPF_EXIT_INSN(),
4427                },
4428                INTERNAL,
4429                { },
4430                { { 0, 0x9abcdef0 } }
4431        },
4432        {
4433                "ALU64_LSH_X: Shift == 32, low word",
4434                .u.insns_int = {
4435                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4436                        BPF_ALU32_IMM(BPF_MOV, R1, 32),
4437                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4438                        BPF_EXIT_INSN(),
4439                },
4440                INTERNAL,
4441                { },
4442                { { 0, 0 } }
4443        },
4444        {
4445                "ALU64_LSH_X: Shift == 32, high word",
4446                .u.insns_int = {
4447                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4448                        BPF_ALU32_IMM(BPF_MOV, R1, 32),
4449                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4450                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4451                        BPF_EXIT_INSN(),
4452                },
4453                INTERNAL,
4454                { },
4455                { { 0, 0x89abcdef } }
4456        },
4457        {
4458                "ALU64_LSH_X: Zero shift, low word",
4459                .u.insns_int = {
4460                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4461                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
4462                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4463                        BPF_EXIT_INSN(),
4464                },
4465                INTERNAL,
4466                { },
4467                { { 0, 0x89abcdef } }
4468        },
4469        {
4470                "ALU64_LSH_X: Zero shift, high word",
4471                .u.insns_int = {
4472                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4473                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
4474                        BPF_ALU64_REG(BPF_LSH, R0, R1),
4475                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4476                        BPF_EXIT_INSN(),
4477                },
4478                INTERNAL,
4479                { },
4480                { { 0, 0x01234567 } }
4481        },
4482        /* BPF_ALU | BPF_LSH | BPF_K */
4483        {
4484                "ALU_LSH_K: 1 << 1 = 2",
4485                .u.insns_int = {
4486                        BPF_LD_IMM64(R0, 1),
4487                        BPF_ALU32_IMM(BPF_LSH, R0, 1),
4488                        BPF_EXIT_INSN(),
4489                },
4490                INTERNAL,
4491                { },
4492                { { 0, 2 } },
4493        },
4494        {
4495                "ALU_LSH_K: 1 << 31 = 0x80000000",
4496                .u.insns_int = {
4497                        BPF_LD_IMM64(R0, 1),
4498                        BPF_ALU32_IMM(BPF_LSH, R0, 31),
4499                        BPF_EXIT_INSN(),
4500                },
4501                INTERNAL,
4502                { },
4503                { { 0, 0x80000000 } },
4504        },
4505        {
4506                "ALU_LSH_K: 0x12345678 << 12 = 0x45678000",
4507                .u.insns_int = {
4508                        BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
4509                        BPF_ALU32_IMM(BPF_LSH, R0, 12),
4510                        BPF_EXIT_INSN(),
4511                },
4512                INTERNAL,
4513                { },
4514                { { 0, 0x45678000 } }
4515        },
4516        {
4517                "ALU_LSH_K: 0x12345678 << 0 = 0x12345678",
4518                .u.insns_int = {
4519                        BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
4520                        BPF_ALU32_IMM(BPF_LSH, R0, 0),
4521                        BPF_EXIT_INSN(),
4522                },
4523                INTERNAL,
4524                { },
4525                { { 0, 0x12345678 } }
4526        },
4527        {
4528                "ALU64_LSH_K: 1 << 1 = 2",
4529                .u.insns_int = {
4530                        BPF_LD_IMM64(R0, 1),
4531                        BPF_ALU64_IMM(BPF_LSH, R0, 1),
4532                        BPF_EXIT_INSN(),
4533                },
4534                INTERNAL,
4535                { },
4536                { { 0, 2 } },
4537        },
4538        {
4539                "ALU64_LSH_K: 1 << 31 = 0x80000000",
4540                .u.insns_int = {
4541                        BPF_LD_IMM64(R0, 1),
4542                        BPF_ALU64_IMM(BPF_LSH, R0, 31),
4543                        BPF_EXIT_INSN(),
4544                },
4545                INTERNAL,
4546                { },
4547                { { 0, 0x80000000 } },
4548        },
4549        {
4550                "ALU64_LSH_K: Shift < 32, low word",
4551                .u.insns_int = {
4552                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4553                        BPF_ALU64_IMM(BPF_LSH, R0, 12),
4554                        BPF_EXIT_INSN(),
4555                },
4556                INTERNAL,
4557                { },
4558                { { 0, 0xbcdef000 } }
4559        },
4560        {
4561                "ALU64_LSH_K: Shift < 32, high word",
4562                .u.insns_int = {
4563                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4564                        BPF_ALU64_IMM(BPF_LSH, R0, 12),
4565                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4566                        BPF_EXIT_INSN(),
4567                },
4568                INTERNAL,
4569                { },
4570                { { 0, 0x3456789a } }
4571        },
4572        {
4573                "ALU64_LSH_K: Shift > 32, low word",
4574                .u.insns_int = {
4575                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4576                        BPF_ALU64_IMM(BPF_LSH, R0, 36),
4577                        BPF_EXIT_INSN(),
4578                },
4579                INTERNAL,
4580                { },
4581                { { 0, 0 } }
4582        },
4583        {
4584                "ALU64_LSH_K: Shift > 32, high word",
4585                .u.insns_int = {
4586                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4587                        BPF_ALU64_IMM(BPF_LSH, R0, 36),
4588                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4589                        BPF_EXIT_INSN(),
4590                },
4591                INTERNAL,
4592                { },
4593                { { 0, 0x9abcdef0 } }
4594        },
4595        {
4596                "ALU64_LSH_K: Shift == 32, low word",
4597                .u.insns_int = {
4598                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4599                        BPF_ALU64_IMM(BPF_LSH, R0, 32),
4600                        BPF_EXIT_INSN(),
4601                },
4602                INTERNAL,
4603                { },
4604                { { 0, 0 } }
4605        },
4606        {
4607                "ALU64_LSH_K: Shift == 32, high word",
4608                .u.insns_int = {
4609                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4610                        BPF_ALU64_IMM(BPF_LSH, R0, 32),
4611                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4612                        BPF_EXIT_INSN(),
4613                },
4614                INTERNAL,
4615                { },
4616                { { 0, 0x89abcdef } }
4617        },
4618        {
4619                "ALU64_LSH_K: Zero shift",
4620                .u.insns_int = {
4621                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4622                        BPF_ALU64_IMM(BPF_LSH, R0, 0),
4623                        BPF_EXIT_INSN(),
4624                },
4625                INTERNAL,
4626                { },
4627                { { 0, 0x89abcdef } }
4628        },
4629        /* BPF_ALU | BPF_RSH | BPF_X */
4630        {
4631                "ALU_RSH_X: 2 >> 1 = 1",
4632                .u.insns_int = {
4633                        BPF_LD_IMM64(R0, 2),
4634                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
4635                        BPF_ALU32_REG(BPF_RSH, R0, R1),
4636                        BPF_EXIT_INSN(),
4637                },
4638                INTERNAL,
4639                { },
4640                { { 0, 1 } },
4641        },
4642        {
4643                "ALU_RSH_X: 0x80000000 >> 31 = 1",
4644                .u.insns_int = {
4645                        BPF_LD_IMM64(R0, 0x80000000),
4646                        BPF_ALU32_IMM(BPF_MOV, R1, 31),
4647                        BPF_ALU32_REG(BPF_RSH, R0, R1),
4648                        BPF_EXIT_INSN(),
4649                },
4650                INTERNAL,
4651                { },
4652                { { 0, 1 } },
4653        },
4654        {
4655                "ALU_RSH_X: 0x12345678 >> 20 = 0x123",
4656                .u.insns_int = {
4657                        BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
4658                        BPF_ALU32_IMM(BPF_MOV, R1, 20),
4659                        BPF_ALU32_REG(BPF_RSH, R0, R1),
4660                        BPF_EXIT_INSN(),
4661                },
4662                INTERNAL,
4663                { },
4664                { { 0, 0x123 } }
4665        },
4666        {
4667                "ALU64_RSH_X: 2 >> 1 = 1",
4668                .u.insns_int = {
4669                        BPF_LD_IMM64(R0, 2),
4670                        BPF_ALU32_IMM(BPF_MOV, R1, 1),
4671                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4672                        BPF_EXIT_INSN(),
4673                },
4674                INTERNAL,
4675                { },
4676                { { 0, 1 } },
4677        },
4678        {
4679                "ALU64_RSH_X: 0x80000000 >> 31 = 1",
4680                .u.insns_int = {
4681                        BPF_LD_IMM64(R0, 0x80000000),
4682                        BPF_ALU32_IMM(BPF_MOV, R1, 31),
4683                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4684                        BPF_EXIT_INSN(),
4685                },
4686                INTERNAL,
4687                { },
4688                { { 0, 1 } },
4689        },
4690        {
4691                "ALU64_RSH_X: Shift < 32, low word",
4692                .u.insns_int = {
4693                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4694                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4695                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4696                        BPF_EXIT_INSN(),
4697                },
4698                INTERNAL,
4699                { },
4700                { { 0, 0x56789abc } }
4701        },
4702        {
4703                "ALU64_RSH_X: Shift < 32, high word",
4704                .u.insns_int = {
4705                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4706                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4707                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4708                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4709                        BPF_EXIT_INSN(),
4710                },
4711                INTERNAL,
4712                { },
4713                { { 0, 0x00081234 } }
4714        },
4715        {
4716                "ALU64_RSH_X: Shift > 32, low word",
4717                .u.insns_int = {
4718                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4719                        BPF_ALU32_IMM(BPF_MOV, R1, 36),
4720                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4721                        BPF_EXIT_INSN(),
4722                },
4723                INTERNAL,
4724                { },
4725                { { 0, 0x08123456 } }
4726        },
4727        {
4728                "ALU64_RSH_X: Shift > 32, high word",
4729                .u.insns_int = {
4730                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4731                        BPF_ALU32_IMM(BPF_MOV, R1, 36),
4732                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4733                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4734                        BPF_EXIT_INSN(),
4735                },
4736                INTERNAL,
4737                { },
4738                { { 0, 0 } }
4739        },
4740        {
4741                "ALU64_RSH_X: Shift == 32, low word",
4742                .u.insns_int = {
4743                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4744                        BPF_ALU32_IMM(BPF_MOV, R1, 32),
4745                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4746                        BPF_EXIT_INSN(),
4747                },
4748                INTERNAL,
4749                { },
4750                { { 0, 0x81234567 } }
4751        },
4752        {
4753                "ALU64_RSH_X: Shift == 32, high word",
4754                .u.insns_int = {
4755                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4756                        BPF_ALU32_IMM(BPF_MOV, R1, 32),
4757                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4758                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4759                        BPF_EXIT_INSN(),
4760                },
4761                INTERNAL,
4762                { },
4763                { { 0, 0 } }
4764        },
4765        {
4766                "ALU64_RSH_X: Zero shift, low word",
4767                .u.insns_int = {
4768                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4769                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
4770                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4771                        BPF_EXIT_INSN(),
4772                },
4773                INTERNAL,
4774                { },
4775                { { 0, 0x89abcdef } }
4776        },
4777        {
4778                "ALU64_RSH_X: Zero shift, high word",
4779                .u.insns_int = {
4780                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4781                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
4782                        BPF_ALU64_REG(BPF_RSH, R0, R1),
4783                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4784                        BPF_EXIT_INSN(),
4785                },
4786                INTERNAL,
4787                { },
4788                { { 0, 0x81234567 } }
4789        },
4790        /* BPF_ALU | BPF_RSH | BPF_K */
4791        {
4792                "ALU_RSH_K: 2 >> 1 = 1",
4793                .u.insns_int = {
4794                        BPF_LD_IMM64(R0, 2),
4795                        BPF_ALU32_IMM(BPF_RSH, R0, 1),
4796                        BPF_EXIT_INSN(),
4797                },
4798                INTERNAL,
4799                { },
4800                { { 0, 1 } },
4801        },
4802        {
4803                "ALU_RSH_K: 0x80000000 >> 31 = 1",
4804                .u.insns_int = {
4805                        BPF_LD_IMM64(R0, 0x80000000),
4806                        BPF_ALU32_IMM(BPF_RSH, R0, 31),
4807                        BPF_EXIT_INSN(),
4808                },
4809                INTERNAL,
4810                { },
4811                { { 0, 1 } },
4812        },
4813        {
4814                "ALU_RSH_K: 0x12345678 >> 20 = 0x123",
4815                .u.insns_int = {
4816                        BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
4817                        BPF_ALU32_IMM(BPF_RSH, R0, 20),
4818                        BPF_EXIT_INSN(),
4819                },
4820                INTERNAL,
4821                { },
4822                { { 0, 0x123 } }
4823        },
4824        {
4825                "ALU_RSH_K: 0x12345678 >> 0 = 0x12345678",
4826                .u.insns_int = {
4827                        BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678),
4828                        BPF_ALU32_IMM(BPF_RSH, R0, 0),
4829                        BPF_EXIT_INSN(),
4830                },
4831                INTERNAL,
4832                { },
4833                { { 0, 0x12345678 } }
4834        },
4835        {
4836                "ALU64_RSH_K: 2 >> 1 = 1",
4837                .u.insns_int = {
4838                        BPF_LD_IMM64(R0, 2),
4839                        BPF_ALU64_IMM(BPF_RSH, R0, 1),
4840                        BPF_EXIT_INSN(),
4841                },
4842                INTERNAL,
4843                { },
4844                { { 0, 1 } },
4845        },
4846        {
4847                "ALU64_RSH_K: 0x80000000 >> 31 = 1",
4848                .u.insns_int = {
4849                        BPF_LD_IMM64(R0, 0x80000000),
4850                        BPF_ALU64_IMM(BPF_RSH, R0, 31),
4851                        BPF_EXIT_INSN(),
4852                },
4853                INTERNAL,
4854                { },
4855                { { 0, 1 } },
4856        },
4857        {
4858                "ALU64_RSH_K: Shift < 32, low word",
4859                .u.insns_int = {
4860                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4861                        BPF_ALU64_IMM(BPF_RSH, R0, 12),
4862                        BPF_EXIT_INSN(),
4863                },
4864                INTERNAL,
4865                { },
4866                { { 0, 0x56789abc } }
4867        },
4868        {
4869                "ALU64_RSH_K: Shift < 32, high word",
4870                .u.insns_int = {
4871                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4872                        BPF_ALU64_IMM(BPF_RSH, R0, 12),
4873                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4874                        BPF_EXIT_INSN(),
4875                },
4876                INTERNAL,
4877                { },
4878                { { 0, 0x00081234 } }
4879        },
4880        {
4881                "ALU64_RSH_K: Shift > 32, low word",
4882                .u.insns_int = {
4883                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4884                        BPF_ALU64_IMM(BPF_RSH, R0, 36),
4885                        BPF_EXIT_INSN(),
4886                },
4887                INTERNAL,
4888                { },
4889                { { 0, 0x08123456 } }
4890        },
4891        {
4892                "ALU64_RSH_K: Shift > 32, high word",
4893                .u.insns_int = {
4894                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4895                        BPF_ALU64_IMM(BPF_RSH, R0, 36),
4896                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4897                        BPF_EXIT_INSN(),
4898                },
4899                INTERNAL,
4900                { },
4901                { { 0, 0 } }
4902        },
4903        {
4904                "ALU64_RSH_K: Shift == 32, low word",
4905                .u.insns_int = {
4906                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4907                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4908                        BPF_EXIT_INSN(),
4909                },
4910                INTERNAL,
4911                { },
4912                { { 0, 0x81234567 } }
4913        },
4914        {
4915                "ALU64_RSH_K: Shift == 32, high word",
4916                .u.insns_int = {
4917                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4918                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4919                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4920                        BPF_EXIT_INSN(),
4921                },
4922                INTERNAL,
4923                { },
4924                { { 0, 0 } }
4925        },
4926        {
4927                "ALU64_RSH_K: Zero shift",
4928                .u.insns_int = {
4929                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4930                        BPF_ALU64_IMM(BPF_RSH, R0, 0),
4931                        BPF_EXIT_INSN(),
4932                },
4933                INTERNAL,
4934                { },
4935                { { 0, 0x89abcdef } }
4936        },
4937        /* BPF_ALU | BPF_ARSH | BPF_X */
4938        {
4939                "ALU32_ARSH_X: -1234 >> 7 = -10",
4940                .u.insns_int = {
4941                        BPF_ALU32_IMM(BPF_MOV, R0, -1234),
4942                        BPF_ALU32_IMM(BPF_MOV, R1, 7),
4943                        BPF_ALU32_REG(BPF_ARSH, R0, R1),
4944                        BPF_EXIT_INSN(),
4945                },
4946                INTERNAL,
4947                { },
4948                { { 0, -10 } }
4949        },
4950        {
4951                "ALU64_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
4952                .u.insns_int = {
4953                        BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
4954                        BPF_ALU32_IMM(BPF_MOV, R1, 40),
4955                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
4956                        BPF_EXIT_INSN(),
4957                },
4958                INTERNAL,
4959                { },
4960                { { 0, 0xffff00ff } },
4961        },
4962        {
4963                "ALU64_ARSH_X: Shift < 32, low word",
4964                .u.insns_int = {
4965                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4966                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4967                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
4968                        BPF_EXIT_INSN(),
4969                },
4970                INTERNAL,
4971                { },
4972                { { 0, 0x56789abc } }
4973        },
4974        {
4975                "ALU64_ARSH_X: Shift < 32, high word",
4976                .u.insns_int = {
4977                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4978                        BPF_ALU32_IMM(BPF_MOV, R1, 12),
4979                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
4980                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
4981                        BPF_EXIT_INSN(),
4982                },
4983                INTERNAL,
4984                { },
4985                { { 0, 0xfff81234 } }
4986        },
4987        {
4988                "ALU64_ARSH_X: Shift > 32, low word",
4989                .u.insns_int = {
4990                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
4991                        BPF_ALU32_IMM(BPF_MOV, R1, 36),
4992                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
4993                        BPF_EXIT_INSN(),
4994                },
4995                INTERNAL,
4996                { },
4997                { { 0, 0xf8123456 } }
4998        },
4999        {
5000                "ALU64_ARSH_X: Shift > 32, high word",
5001                .u.insns_int = {
5002                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5003                        BPF_ALU32_IMM(BPF_MOV, R1, 36),
5004                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
5005                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
5006                        BPF_EXIT_INSN(),
5007                },
5008                INTERNAL,
5009                { },
5010                { { 0, -1 } }
5011        },
5012        {
5013                "ALU64_ARSH_X: Shift == 32, low word",
5014                .u.insns_int = {
5015                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5016                        BPF_ALU32_IMM(BPF_MOV, R1, 32),
5017                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
5018                        BPF_EXIT_INSN(),
5019                },
5020                INTERNAL,
5021                { },
5022                { { 0, 0x81234567 } }
5023        },
5024        {
5025                "ALU64_ARSH_X: Shift == 32, high word",
5026                .u.insns_int = {
5027                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5028                        BPF_ALU32_IMM(BPF_MOV, R1, 32),
5029                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
5030                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
5031                        BPF_EXIT_INSN(),
5032                },
5033                INTERNAL,
5034                { },
5035                { { 0, -1 } }
5036        },
5037        {
5038                "ALU64_ARSH_X: Zero shift, low word",
5039                .u.insns_int = {
5040                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5041                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
5042                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
5043                        BPF_EXIT_INSN(),
5044                },
5045                INTERNAL,
5046                { },
5047                { { 0, 0x89abcdef } }
5048        },
5049        {
5050                "ALU64_ARSH_X: Zero shift, high word",
5051                .u.insns_int = {
5052                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5053                        BPF_ALU32_IMM(BPF_MOV, R1, 0),
5054                        BPF_ALU64_REG(BPF_ARSH, R0, R1),
5055                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
5056                        BPF_EXIT_INSN(),
5057                },
5058                INTERNAL,
5059                { },
5060                { { 0, 0x81234567 } }
5061        },
5062        /* BPF_ALU | BPF_ARSH | BPF_K */
5063        {
5064                "ALU32_ARSH_K: -1234 >> 7 = -10",
5065                .u.insns_int = {
5066                        BPF_ALU32_IMM(BPF_MOV, R0, -1234),
5067                        BPF_ALU32_IMM(BPF_ARSH, R0, 7),
5068                        BPF_EXIT_INSN(),
5069                },
5070                INTERNAL,
5071                { },
5072                { { 0, -10 } }
5073        },
5074        {
5075                "ALU32_ARSH_K: -1234 >> 0 = -1234",
5076                .u.insns_int = {
5077                        BPF_ALU32_IMM(BPF_MOV, R0, -1234),
5078                        BPF_ALU32_IMM(BPF_ARSH, R0, 0),
5079                        BPF_EXIT_INSN(),
5080                },
5081                INTERNAL,
5082                { },
5083                { { 0, -1234 } }
5084        },
5085        {
5086                "ALU64_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
5087                .u.insns_int = {
5088                        BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
5089                        BPF_ALU64_IMM(BPF_ARSH, R0, 40),
5090                        BPF_EXIT_INSN(),
5091                },
5092                INTERNAL,
5093                { },
5094                { { 0, 0xffff00ff } },
5095        },
5096        {
5097                "ALU64_ARSH_K: Shift < 32, low word",
5098                .u.insns_int = {
5099                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5100                        BPF_ALU64_IMM(BPF_RSH, R0, 12),
5101                        BPF_EXIT_INSN(),
5102                },
5103                INTERNAL,
5104                { },
5105                { { 0, 0x56789abc } }
5106        },
5107        {
5108                "ALU64_ARSH_K: Shift < 32, high word",
5109                .u.insns_int = {
5110                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5111                        BPF_ALU64_IMM(BPF_ARSH, R0, 12),
5112                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
5113                        BPF_EXIT_INSN(),
5114                },
5115                INTERNAL,
5116                { },
5117                { { 0, 0xfff81234 } }
5118        },
5119        {
5120                "ALU64_ARSH_K: Shift > 32, low word",
5121                .u.insns_int = {
5122                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5123                        BPF_ALU64_IMM(BPF_ARSH, R0, 36),
5124                        BPF_EXIT_INSN(),
5125                },
5126                INTERNAL,
5127                { },
5128                { { 0, 0xf8123456 } }
5129        },
5130        {
5131                "ALU64_ARSH_K: Shift > 32, high word",
5132                .u.insns_int = {
5133                        BPF_LD_IMM64(R0, 0xf123456789abcdefLL),
5134                        BPF_ALU64_IMM(BPF_ARSH, R0, 36),
5135                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
5136                        BPF_EXIT_INSN(),
5137                },
5138                INTERNAL,
5139                { },
5140                { { 0, -1 } }
5141        },
5142        {
5143                "ALU64_ARSH_K: Shift == 32, low word",
5144                .u.insns_int = {
5145                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5146                        BPF_ALU64_IMM(BPF_ARSH, R0, 32),
5147                        BPF_EXIT_INSN(),
5148                },
5149                INTERNAL,
5150                { },
5151                { { 0, 0x81234567 } }
5152        },
5153        {
5154                "ALU64_ARSH_K: Shift == 32, high word",
5155                .u.insns_int = {
5156                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5157                        BPF_ALU64_IMM(BPF_ARSH, R0, 32),
5158                        BPF_ALU64_IMM(BPF_RSH, R0, 32),
5159                        BPF_EXIT_INSN(),
5160                },
5161                INTERNAL,
5162                { },
5163                { { 0, -1 } }
5164        },
5165        {
5166                "ALU64_ARSH_K: Zero shift",
5167                .u.insns_int = {
5168                        BPF_LD_IMM64(R0, 0x8123456789abcdefLL),
5169                        BPF_ALU64_IMM(BPF_ARSH, R0, 0),
5170                        BPF_EXIT_INSN(),
5171                },
5172                INTERNAL,
5173                { },
5174                { { 0, 0x89abcdef } }
5175        },
5176        /* BPF_ALU | BPF_NEG */
5177        {
5178                "ALU_NEG: -(3) = -3",
5179                .u.insns_int = {
5180                        BPF_ALU32_IMM(BPF_MOV, R0, 3),
5181                        BPF_ALU32_IMM(BPF_NEG, R0, 0),
5182                        BPF_EXIT_INSN(),
5183                },
5184                INTERNAL,
5185                { },
5186                { { 0, -3 } },
5187        },
5188        {
5189                "ALU_NEG: -(-3) = 3",
5190                .u.insns_int = {
5191                        BPF_ALU32_IMM(BPF_MOV, R0, -3),
5192                        BPF_ALU32_IMM(BPF_NEG, R0, 0),
5193                        BPF_EXIT_INSN(),
5194                },
5195                INTERNAL,
5196                { },
5197                { { 0, 3 } },
5198        },
5199        {
5200                "ALU64_NEG: -(3) = -3",
5201                .u.insns_int = {
5202                        BPF_LD_IMM64(R0, 3),
5203                        BPF_ALU64_IMM(BPF_NEG, R0, 0),
5204                        BPF_EXIT_INSN(),
5205                },
5206                INTERNAL,
5207                { },
5208                { { 0, -3 } },
5209        },
5210        {
5211                "ALU64_NEG: -(-3) = 3",
5212                .u.insns_int = {
5213                        BPF_LD_IMM64(R0, -3),
5214                        BPF_ALU64_IMM(BPF_NEG, R0, 0),
5215                        BPF_EXIT_INSN(),
5216                },
5217                INTERNAL,
5218                { },
5219                { { 0, 3 } },
5220        },
5221        /* BPF_ALU | BPF_END | BPF_FROM_BE */
5222        {
5223                "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
5224                .u.insns_int = {
5225                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5226                        BPF_ENDIAN(BPF_FROM_BE, R0, 16),
5227                        BPF_EXIT_INSN(),
5228                },
5229                INTERNAL,
5230                { },
5231                { { 0,  cpu_to_be16(0xcdef) } },
5232        },
5233        {
5234                "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
5235                .u.insns_int = {
5236                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5237                        BPF_ENDIAN(BPF_FROM_BE, R0, 32),
5238                        BPF_ALU64_REG(BPF_MOV, R1, R0),
5239                        BPF_ALU64_IMM(BPF_RSH, R1, 32),
5240                        BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
5241                        BPF_EXIT_INSN(),
5242                },
5243                INTERNAL,
5244                { },
5245                { { 0, cpu_to_be32(0x89abcdef) } },
5246        },
5247        {
5248                "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
5249                .u.insns_int = {
5250                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5251                        BPF_ENDIAN(BPF_FROM_BE, R0, 64),
5252                        BPF_EXIT_INSN(),
5253                },
5254                INTERNAL,
5255                { },
5256                { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
5257        },
5258        /* BPF_ALU | BPF_END | BPF_FROM_LE */
5259        {
5260                "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
5261                .u.insns_int = {
5262                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5263                        BPF_ENDIAN(BPF_FROM_LE, R0, 16),
5264                        BPF_EXIT_INSN(),
5265                },
5266                INTERNAL,
5267                { },
5268                { { 0, cpu_to_le16(0xcdef) } },
5269        },
5270        {
5271                "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
5272                .u.insns_int = {
5273                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5274                        BPF_ENDIAN(BPF_FROM_LE, R0, 32),
5275                        BPF_ALU64_REG(BPF_MOV, R1, R0),
5276                        BPF_ALU64_IMM(BPF_RSH, R1, 32),
5277                        BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
5278                        BPF_EXIT_INSN(),
5279                },
5280                INTERNAL,
5281                { },
5282                { { 0, cpu_to_le32(0x89abcdef) } },
5283        },
5284        {
5285                "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
5286                .u.insns_int = {
5287                        BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
5288                        BPF_ENDIAN(BPF_FROM_LE, R0, 64),
5289                        BPF_EXIT_INSN(),
5290                },
5291                INTERNAL,
5292                { },
5293                { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
5294        },
5295        /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
5296        {
5297                "ST_MEM_B: Store/Load byte: max negative",
5298                .u.insns_int = {
5299                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5300                        BPF_ST_MEM(BPF_B, R10, -40, 0xff),
5301                        BPF_LDX_MEM(BPF_B, R0, R10, -40),
5302                        BPF_EXIT_INSN(),
5303                },
5304                INTERNAL,
5305                { },
5306                { { 0, 0xff } },
5307                .stack_depth = 40,
5308        },
5309        {
5310                "ST_MEM_B: Store/Load byte: max positive",
5311                .u.insns_int = {
5312                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5313                        BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
5314                        BPF_LDX_MEM(BPF_H, R0, R10, -40),
5315                        BPF_EXIT_INSN(),
5316                },
5317                INTERNAL,
5318                { },
5319                { { 0, 0x7f } },
5320                .stack_depth = 40,
5321        },
5322        {
5323                "STX_MEM_B: Store/Load byte: max negative",
5324                .u.insns_int = {
5325                        BPF_LD_IMM64(R0, 0),
5326                        BPF_LD_IMM64(R1, 0xffLL),
5327                        BPF_STX_MEM(BPF_B, R10, R1, -40),
5328                        BPF_LDX_MEM(BPF_B, R0, R10, -40),
5329                        BPF_EXIT_INSN(),
5330                },
5331                INTERNAL,
5332                { },
5333                { { 0, 0xff } },
5334                .stack_depth = 40,
5335        },
5336        {
5337                "ST_MEM_H: Store/Load half word: max negative",
5338                .u.insns_int = {
5339                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5340                        BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
5341                        BPF_LDX_MEM(BPF_H, R0, R10, -40),
5342                        BPF_EXIT_INSN(),
5343                },
5344                INTERNAL,
5345                { },
5346                { { 0, 0xffff } },
5347                .stack_depth = 40,
5348        },
5349        {
5350                "ST_MEM_H: Store/Load half word: max positive",
5351                .u.insns_int = {
5352                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5353                        BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
5354                        BPF_LDX_MEM(BPF_H, R0, R10, -40),
5355                        BPF_EXIT_INSN(),
5356                },
5357                INTERNAL,
5358                { },
5359                { { 0, 0x7fff } },
5360                .stack_depth = 40,
5361        },
5362        {
5363                "STX_MEM_H: Store/Load half word: max negative",
5364                .u.insns_int = {
5365                        BPF_LD_IMM64(R0, 0),
5366                        BPF_LD_IMM64(R1, 0xffffLL),
5367                        BPF_STX_MEM(BPF_H, R10, R1, -40),
5368                        BPF_LDX_MEM(BPF_H, R0, R10, -40),
5369                        BPF_EXIT_INSN(),
5370                },
5371                INTERNAL,
5372                { },
5373                { { 0, 0xffff } },
5374                .stack_depth = 40,
5375        },
5376        {
5377                "ST_MEM_W: Store/Load word: max negative",
5378                .u.insns_int = {
5379                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5380                        BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
5381                        BPF_LDX_MEM(BPF_W, R0, R10, -40),
5382                        BPF_EXIT_INSN(),
5383                },
5384                INTERNAL,
5385                { },
5386                { { 0, 0xffffffff } },
5387                .stack_depth = 40,
5388        },
5389        {
5390                "ST_MEM_W: Store/Load word: max positive",
5391                .u.insns_int = {
5392                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5393                        BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
5394                        BPF_LDX_MEM(BPF_W, R0, R10, -40),
5395                        BPF_EXIT_INSN(),
5396                },
5397                INTERNAL,
5398                { },
5399                { { 0, 0x7fffffff } },
5400                .stack_depth = 40,
5401        },
5402        {
5403                "STX_MEM_W: Store/Load word: max negative",
5404                .u.insns_int = {
5405                        BPF_LD_IMM64(R0, 0),
5406                        BPF_LD_IMM64(R1, 0xffffffffLL),
5407                        BPF_STX_MEM(BPF_W, R10, R1, -40),
5408                        BPF_LDX_MEM(BPF_W, R0, R10, -40),
5409                        BPF_EXIT_INSN(),
5410                },
5411                INTERNAL,
5412                { },
5413                { { 0, 0xffffffff } },
5414                .stack_depth = 40,
5415        },
5416        {
5417                "ST_MEM_DW: Store/Load double word: max negative",
5418                .u.insns_int = {
5419                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5420                        BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
5421                        BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5422                        BPF_EXIT_INSN(),
5423                },
5424                INTERNAL,
5425                { },
5426                { { 0, 0xffffffff } },
5427                .stack_depth = 40,
5428        },
5429        {
5430                "ST_MEM_DW: Store/Load double word: max negative 2",
5431                .u.insns_int = {
5432                        BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
5433                        BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
5434                        BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
5435                        BPF_LDX_MEM(BPF_DW, R2, R10, -40),
5436                        BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
5437                        BPF_MOV32_IMM(R0, 2),
5438                        BPF_EXIT_INSN(),
5439                        BPF_MOV32_IMM(R0, 1),
5440                        BPF_EXIT_INSN(),
5441                },
5442                INTERNAL,
5443                { },
5444                { { 0, 0x1 } },
5445                .stack_depth = 40,
5446        },
5447        {
5448                "ST_MEM_DW: Store/Load double word: max positive",
5449                .u.insns_int = {
5450                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5451                        BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
5452                        BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5453                        BPF_EXIT_INSN(),
5454                },
5455                INTERNAL,
5456                { },
5457                { { 0, 0x7fffffff } },
5458                .stack_depth = 40,
5459        },
5460        {
5461                "STX_MEM_DW: Store/Load double word: max negative",
5462                .u.insns_int = {
5463                        BPF_LD_IMM64(R0, 0),
5464                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
5465                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5466                        BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5467                        BPF_EXIT_INSN(),
5468                },
5469                INTERNAL,
5470                { },
5471                { { 0, 0xffffffff } },
5472                .stack_depth = 40,
5473        },
5474        {
5475                "STX_MEM_DW: Store double word: first word in memory",
5476                .u.insns_int = {
5477                        BPF_LD_IMM64(R0, 0),
5478                        BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
5479                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5480                        BPF_LDX_MEM(BPF_W, R0, R10, -40),
5481                        BPF_EXIT_INSN(),
5482                },
5483                INTERNAL,
5484                { },
5485#ifdef __BIG_ENDIAN
5486                { { 0, 0x01234567 } },
5487#else
5488                { { 0, 0x89abcdef } },
5489#endif
5490                .stack_depth = 40,
5491        },
5492        {
5493                "STX_MEM_DW: Store double word: second word in memory",
5494                .u.insns_int = {
5495                        BPF_LD_IMM64(R0, 0),
5496                        BPF_LD_IMM64(R1, 0x0123456789abcdefLL),
5497                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5498                        BPF_LDX_MEM(BPF_W, R0, R10, -36),
5499                        BPF_EXIT_INSN(),
5500                },
5501                INTERNAL,
5502                { },
5503#ifdef __BIG_ENDIAN
5504                { { 0, 0x89abcdef } },
5505#else
5506                { { 0, 0x01234567 } },
5507#endif
5508                .stack_depth = 40,
5509        },
5510        /* BPF_STX | BPF_ATOMIC | BPF_W/DW */
5511        {
5512                "STX_XADD_W: X + 1 + 1 + 1 + ...",
5513                { },
5514                INTERNAL,
5515                { },
5516                { { 0, 4134 } },
5517                .fill_helper = bpf_fill_stxw,
5518        },
5519        {
5520                "STX_XADD_DW: X + 1 + 1 + 1 + ...",
5521                { },
5522                INTERNAL,
5523                { },
5524                { { 0, 4134 } },
5525                .fill_helper = bpf_fill_stxdw,
5526        },
5527        /*
5528         * Exhaustive tests of atomic operation variants.
5529         * Individual tests are expanded from template macros for all
5530         * combinations of ALU operation, word size and fetching.
5531         */
5532#define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result)      \
5533{                                                                       \
5534        "BPF_ATOMIC | " #width ", " #op ": Test: "                      \
5535                #old " " #logic " " #update " = " #result,              \
5536        .u.insns_int = {                                                \
5537                BPF_ALU32_IMM(BPF_MOV, R5, update),                     \
5538                BPF_ST_MEM(width, R10, -40, old),                       \
5539                BPF_ATOMIC_OP(width, op, R10, R5, -40),                 \
5540                BPF_LDX_MEM(width, R0, R10, -40),                       \
5541                BPF_EXIT_INSN(),                                        \
5542        },                                                              \
5543        INTERNAL,                                                       \
5544        { },                                                            \
5545        { { 0, result } },                                              \
5546        .stack_depth = 40,                                              \
5547}
5548#define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result)      \
5549{                                                                       \
5550        "BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: "    \
5551                #old " " #logic " " #update " = " #result,              \
5552        .u.insns_int = {                                                \
5553                BPF_ALU64_REG(BPF_MOV, R1, R10),                        \
5554                BPF_ALU32_IMM(BPF_MOV, R0, update),                     \
5555                BPF_ST_MEM(BPF_W, R10, -40, old),                       \
5556                BPF_ATOMIC_OP(width, op, R10, R0, -40),                 \
5557                BPF_ALU64_REG(BPF_MOV, R0, R10),                        \
5558                BPF_ALU64_REG(BPF_SUB, R0, R1),                         \
5559                BPF_EXIT_INSN(),                                        \
5560        },                                                              \
5561        INTERNAL,                                                       \
5562        { },                                                            \
5563        { { 0, 0 } },                                                   \
5564        .stack_depth = 40,                                              \
5565}
5566#define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result)      \
5567{                                                                       \
5568        "BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: "     \
5569                #old " " #logic " " #update " = " #result,              \
5570        .u.insns_int = {                                                \
5571                BPF_ALU64_REG(BPF_MOV, R0, R10),                        \
5572                BPF_ALU32_IMM(BPF_MOV, R1, update),                     \
5573                BPF_ST_MEM(width, R10, -40, old),                       \
5574                BPF_ATOMIC_OP(width, op, R10, R1, -40),                 \
5575                BPF_ALU64_REG(BPF_SUB, R0, R10),                        \
5576                BPF_EXIT_INSN(),                                        \
5577        },                                                              \
5578        INTERNAL,                                                       \
5579        { },                                                            \
5580        { { 0, 0 } },                                                   \
5581        .stack_depth = 40,                                              \
5582}
5583#define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result)      \
5584{                                                                       \
5585        "BPF_ATOMIC | " #width ", " #op ": Test fetch: "                \
5586                #old " " #logic " " #update " = " #result,              \
5587        .u.insns_int = {                                                \
5588                BPF_ALU32_IMM(BPF_MOV, R3, update),                     \
5589                BPF_ST_MEM(width, R10, -40, old),                       \
5590                BPF_ATOMIC_OP(width, op, R10, R3, -40),                 \
5591                BPF_ALU64_REG(BPF_MOV, R0, R3),                         \
5592                BPF_EXIT_INSN(),                                        \
5593        },                                                              \
5594        INTERNAL,                                                       \
5595        { },                                                            \
5596        { { 0, (op) & BPF_FETCH ? old : update } },                     \
5597        .stack_depth = 40,                                              \
5598}
5599        /* BPF_ATOMIC | BPF_W: BPF_ADD */
5600        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5601        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5602        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5603        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5604        /* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
5605        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5606        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5607        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5608        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5609        /* BPF_ATOMIC | BPF_DW: BPF_ADD */
5610        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5611        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5612        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5613        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5614        /* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
5615        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5616        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5617        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5618        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5619        /* BPF_ATOMIC | BPF_W: BPF_AND */
5620        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5621        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5622        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5623        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5624        /* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
5625        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5626        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5627        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5628        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5629        /* BPF_ATOMIC | BPF_DW: BPF_AND */
5630        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5631        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5632        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5633        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5634        /* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
5635        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5636        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5637        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5638        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5639        /* BPF_ATOMIC | BPF_W: BPF_OR */
5640        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5641        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5642        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5643        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5644        /* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
5645        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5646        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5647        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5648        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5649        /* BPF_ATOMIC | BPF_DW: BPF_OR */
5650        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5651        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5652        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5653        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5654        /* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
5655        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5656        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5657        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5658        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5659        /* BPF_ATOMIC | BPF_W: BPF_XOR */
5660        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5661        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5662        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5663        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5664        /* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
5665        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5666        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5667        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5668        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5669        /* BPF_ATOMIC | BPF_DW: BPF_XOR */
5670        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5671        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5672        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5673        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5674        /* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
5675        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5676        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5677        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5678        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5679        /* BPF_ATOMIC | BPF_W: BPF_XCHG */
5680        BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5681        BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5682        BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5683        BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5684        /* BPF_ATOMIC | BPF_DW: BPF_XCHG */
5685        BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5686        BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5687        BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5688        BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5689#undef BPF_ATOMIC_OP_TEST1
5690#undef BPF_ATOMIC_OP_TEST2
5691#undef BPF_ATOMIC_OP_TEST3
5692#undef BPF_ATOMIC_OP_TEST4
5693        /* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */
5694        {
5695                "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return",
5696                .u.insns_int = {
5697                        BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5698                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
5699                        BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5700                        BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5701                        BPF_EXIT_INSN(),
5702                },
5703                INTERNAL,
5704                { },
5705                { { 0, 0x01234567 } },
5706                .stack_depth = 40,
5707        },
5708        {
5709                "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store",
5710                .u.insns_int = {
5711                        BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5712                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
5713                        BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5714                        BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5715                        BPF_LDX_MEM(BPF_W, R0, R10, -40),
5716                        BPF_EXIT_INSN(),
5717                },
5718                INTERNAL,
5719                { },
5720                { { 0, 0x89abcdef } },
5721                .stack_depth = 40,
5722        },
5723        {
5724                "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return",
5725                .u.insns_int = {
5726                        BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5727                        BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
5728                        BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5729                        BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5730                        BPF_EXIT_INSN(),
5731                },
5732                INTERNAL,
5733                { },
5734                { { 0, 0x01234567 } },
5735                .stack_depth = 40,
5736        },
5737        {
5738                "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store",
5739                .u.insns_int = {
5740                        BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5741                        BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
5742                        BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5743                        BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5744                        BPF_LDX_MEM(BPF_W, R0, R10, -40),
5745                        BPF_EXIT_INSN(),
5746                },
5747                INTERNAL,
5748                { },
5749                { { 0, 0x01234567 } },
5750                .stack_depth = 40,
5751        },
5752        {
5753                "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects",
5754                .u.insns_int = {
5755                        BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5756                        BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
5757                        BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5758                        BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5759                        BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5760                        BPF_ALU32_REG(BPF_MOV, R0, R3),
5761                        BPF_EXIT_INSN(),
5762                },
5763                INTERNAL,
5764                { },
5765                { { 0, 0x89abcdef } },
5766                .stack_depth = 40,
5767        },
5768        /* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */
5769        {
5770                "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return",
5771                .u.insns_int = {
5772                        BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5773                        BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5774                        BPF_ALU64_REG(BPF_MOV, R0, R1),
5775                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5776                        BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5777                        BPF_JMP_REG(BPF_JNE, R0, R1, 1),
5778                        BPF_ALU64_REG(BPF_SUB, R0, R1),
5779                        BPF_EXIT_INSN(),
5780                },
5781                INTERNAL,
5782                { },
5783                { { 0, 0 } },
5784                .stack_depth = 40,
5785        },
5786        {
5787                "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store",
5788                .u.insns_int = {
5789                        BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5790                        BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5791                        BPF_ALU64_REG(BPF_MOV, R0, R1),
5792                        BPF_STX_MEM(BPF_DW, R10, R0, -40),
5793                        BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5794                        BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5795                        BPF_JMP_REG(BPF_JNE, R0, R2, 1),
5796                        BPF_ALU64_REG(BPF_SUB, R0, R2),
5797                        BPF_EXIT_INSN(),
5798                },
5799                INTERNAL,
5800                { },
5801                { { 0, 0 } },
5802                .stack_depth = 40,
5803        },
5804        {
5805                "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return",
5806                .u.insns_int = {
5807                        BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5808                        BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5809                        BPF_ALU64_REG(BPF_MOV, R0, R1),
5810                        BPF_ALU64_IMM(BPF_ADD, R0, 1),
5811                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5812                        BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5813                        BPF_JMP_REG(BPF_JNE, R0, R1, 1),
5814                        BPF_ALU64_REG(BPF_SUB, R0, R1),
5815                        BPF_EXIT_INSN(),
5816                },
5817                INTERNAL,
5818                { },
5819                { { 0, 0 } },
5820                .stack_depth = 40,
5821        },
5822        {
5823                "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store",
5824                .u.insns_int = {
5825                        BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5826                        BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5827                        BPF_ALU64_REG(BPF_MOV, R0, R1),
5828                        BPF_ALU64_IMM(BPF_ADD, R0, 1),
5829                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5830                        BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5831                        BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5832                        BPF_JMP_REG(BPF_JNE, R0, R1, 1),
5833                        BPF_ALU64_REG(BPF_SUB, R0, R1),
5834                        BPF_EXIT_INSN(),
5835                },
5836                INTERNAL,
5837                { },
5838                { { 0, 0 } },
5839                .stack_depth = 40,
5840        },
5841        {
5842                "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects",
5843                .u.insns_int = {
5844                        BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5845                        BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5846                        BPF_ALU64_REG(BPF_MOV, R0, R1),
5847                        BPF_STX_MEM(BPF_DW, R10, R1, -40),
5848                        BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5849                        BPF_LD_IMM64(R0, 0xfecdba9876543210ULL),
5850                        BPF_JMP_REG(BPF_JNE, R0, R2, 1),
5851                        BPF_ALU64_REG(BPF_SUB, R0, R2),
5852                        BPF_EXIT_INSN(),
5853                },
5854                INTERNAL,
5855                { },
5856                { { 0, 0 } },
5857                .stack_depth = 40,
5858        },
5859        /* BPF_JMP32 | BPF_JEQ | BPF_K */
5860        {
5861                "JMP32_JEQ_K: Small immediate",
5862                .u.insns_int = {
5863                        BPF_ALU32_IMM(BPF_MOV, R0, 123),
5864                        BPF_JMP32_IMM(BPF_JEQ, R0, 321, 1),
5865                        BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1),
5866                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5867                        BPF_EXIT_INSN(),
5868                },
5869                INTERNAL,
5870                { },
5871                { { 0, 123 } }
5872        },
5873        {
5874                "JMP32_JEQ_K: Large immediate",
5875                .u.insns_int = {
5876                        BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
5877                        BPF_JMP32_IMM(BPF_JEQ, R0, 12345678 & 0xffff, 1),
5878                        BPF_JMP32_IMM(BPF_JEQ, R0, 12345678, 1),
5879                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5880                        BPF_EXIT_INSN(),
5881                },
5882                INTERNAL,
5883                { },
5884                { { 0, 12345678 } }
5885        },
5886        {
5887                "JMP32_JEQ_K: negative immediate",
5888                .u.insns_int = {
5889                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
5890                        BPF_JMP32_IMM(BPF_JEQ, R0,  123, 1),
5891                        BPF_JMP32_IMM(BPF_JEQ, R0, -123, 1),
5892                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5893                        BPF_EXIT_INSN(),
5894                },
5895                INTERNAL,
5896                { },
5897                { { 0, -123 } }
5898        },
5899        /* BPF_JMP32 | BPF_JEQ | BPF_X */
5900        {
5901                "JMP32_JEQ_X",
5902                .u.insns_int = {
5903                        BPF_ALU32_IMM(BPF_MOV, R0, 1234),
5904                        BPF_ALU32_IMM(BPF_MOV, R1, 4321),
5905                        BPF_JMP32_REG(BPF_JEQ, R0, R1, 2),
5906                        BPF_ALU32_IMM(BPF_MOV, R1, 1234),
5907                        BPF_JMP32_REG(BPF_JEQ, R0, R1, 1),
5908                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5909                        BPF_EXIT_INSN(),
5910                },
5911                INTERNAL,
5912                { },
5913                { { 0, 1234 } }
5914        },
5915        /* BPF_JMP32 | BPF_JNE | BPF_K */
5916        {
5917                "JMP32_JNE_K: Small immediate",
5918                .u.insns_int = {
5919                        BPF_ALU32_IMM(BPF_MOV, R0, 123),
5920                        BPF_JMP32_IMM(BPF_JNE, R0, 123, 1),
5921                        BPF_JMP32_IMM(BPF_JNE, R0, 321, 1),
5922                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5923                        BPF_EXIT_INSN(),
5924                },
5925                INTERNAL,
5926                { },
5927                { { 0, 123 } }
5928        },
5929        {
5930                "JMP32_JNE_K: Large immediate",
5931                .u.insns_int = {
5932                        BPF_ALU32_IMM(BPF_MOV, R0, 12345678),
5933                        BPF_JMP32_IMM(BPF_JNE, R0, 12345678, 1),
5934                        BPF_JMP32_IMM(BPF_JNE, R0, 12345678 & 0xffff, 1),
5935                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5936                        BPF_EXIT_INSN(),
5937                },
5938                INTERNAL,
5939                { },
5940                { { 0, 12345678 } }
5941        },
5942        {
5943                "JMP32_JNE_K: negative immediate",
5944                .u.insns_int = {
5945                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
5946                        BPF_JMP32_IMM(BPF_JNE, R0, -123, 1),
5947                        BPF_JMP32_IMM(BPF_JNE, R0,  123, 1),
5948                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5949                        BPF_EXIT_INSN(),
5950                },
5951                INTERNAL,
5952                { },
5953                { { 0, -123 } }
5954        },
5955        /* BPF_JMP32 | BPF_JNE | BPF_X */
5956        {
5957                "JMP32_JNE_X",
5958                .u.insns_int = {
5959                        BPF_ALU32_IMM(BPF_MOV, R0, 1234),
5960                        BPF_ALU32_IMM(BPF_MOV, R1, 1234),
5961                        BPF_JMP32_REG(BPF_JNE, R0, R1, 2),
5962                        BPF_ALU32_IMM(BPF_MOV, R1, 4321),
5963                        BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
5964                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5965                        BPF_EXIT_INSN(),
5966                },
5967                INTERNAL,
5968                { },
5969                { { 0, 1234 } }
5970        },
5971        /* BPF_JMP32 | BPF_JSET | BPF_K */
5972        {
5973                "JMP32_JSET_K: Small immediate",
5974                .u.insns_int = {
5975                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
5976                        BPF_JMP32_IMM(BPF_JSET, R0, 2, 1),
5977                        BPF_JMP32_IMM(BPF_JSET, R0, 3, 1),
5978                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5979                        BPF_EXIT_INSN(),
5980                },
5981                INTERNAL,
5982                { },
5983                { { 0, 1 } }
5984        },
5985        {
5986                "JMP32_JSET_K: Large immediate",
5987                .u.insns_int = {
5988                        BPF_ALU32_IMM(BPF_MOV, R0, 0x40000000),
5989                        BPF_JMP32_IMM(BPF_JSET, R0, 0x3fffffff, 1),
5990                        BPF_JMP32_IMM(BPF_JSET, R0, 0x60000000, 1),
5991                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
5992                        BPF_EXIT_INSN(),
5993                },
5994                INTERNAL,
5995                { },
5996                { { 0, 0x40000000 } }
5997        },
5998        {
5999                "JMP32_JSET_K: negative immediate",
6000                .u.insns_int = {
6001                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
6002                        BPF_JMP32_IMM(BPF_JSET, R0, -1, 1),
6003                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6004                        BPF_EXIT_INSN(),
6005                },
6006                INTERNAL,
6007                { },
6008                { { 0, -123 } }
6009        },
6010        /* BPF_JMP32 | BPF_JSET | BPF_X */
6011        {
6012                "JMP32_JSET_X",
6013                .u.insns_int = {
6014                        BPF_ALU32_IMM(BPF_MOV, R0, 8),
6015                        BPF_ALU32_IMM(BPF_MOV, R1, 7),
6016                        BPF_JMP32_REG(BPF_JSET, R0, R1, 2),
6017                        BPF_ALU32_IMM(BPF_MOV, R1, 8 | 2),
6018                        BPF_JMP32_REG(BPF_JNE, R0, R1, 1),
6019                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6020                        BPF_EXIT_INSN(),
6021                },
6022                INTERNAL,
6023                { },
6024                { { 0, 8 } }
6025        },
6026        /* BPF_JMP32 | BPF_JGT | BPF_K */
6027        {
6028                "JMP32_JGT_K: Small immediate",
6029                .u.insns_int = {
6030                        BPF_ALU32_IMM(BPF_MOV, R0, 123),
6031                        BPF_JMP32_IMM(BPF_JGT, R0, 123, 1),
6032                        BPF_JMP32_IMM(BPF_JGT, R0, 122, 1),
6033                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6034                        BPF_EXIT_INSN(),
6035                },
6036                INTERNAL,
6037                { },
6038                { { 0, 123 } }
6039        },
6040        {
6041                "JMP32_JGT_K: Large immediate",
6042                .u.insns_int = {
6043                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6044                        BPF_JMP32_IMM(BPF_JGT, R0, 0xffffffff, 1),
6045                        BPF_JMP32_IMM(BPF_JGT, R0, 0xfffffffd, 1),
6046                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6047                        BPF_EXIT_INSN(),
6048                },
6049                INTERNAL,
6050                { },
6051                { { 0, 0xfffffffe } }
6052        },
6053        /* BPF_JMP32 | BPF_JGT | BPF_X */
6054        {
6055                "JMP32_JGT_X",
6056                .u.insns_int = {
6057                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6058                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6059                        BPF_JMP32_REG(BPF_JGT, R0, R1, 2),
6060                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
6061                        BPF_JMP32_REG(BPF_JGT, R0, R1, 1),
6062                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6063                        BPF_EXIT_INSN(),
6064                },
6065                INTERNAL,
6066                { },
6067                { { 0, 0xfffffffe } }
6068        },
6069        /* BPF_JMP32 | BPF_JGE | BPF_K */
6070        {
6071                "JMP32_JGE_K: Small immediate",
6072                .u.insns_int = {
6073                        BPF_ALU32_IMM(BPF_MOV, R0, 123),
6074                        BPF_JMP32_IMM(BPF_JGE, R0, 124, 1),
6075                        BPF_JMP32_IMM(BPF_JGE, R0, 123, 1),
6076                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6077                        BPF_EXIT_INSN(),
6078                },
6079                INTERNAL,
6080                { },
6081                { { 0, 123 } }
6082        },
6083        {
6084                "JMP32_JGE_K: Large immediate",
6085                .u.insns_int = {
6086                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6087                        BPF_JMP32_IMM(BPF_JGE, R0, 0xffffffff, 1),
6088                        BPF_JMP32_IMM(BPF_JGE, R0, 0xfffffffe, 1),
6089                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6090                        BPF_EXIT_INSN(),
6091                },
6092                INTERNAL,
6093                { },
6094                { { 0, 0xfffffffe } }
6095        },
6096        /* BPF_JMP32 | BPF_JGE | BPF_X */
6097        {
6098                "JMP32_JGE_X",
6099                .u.insns_int = {
6100                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6101                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6102                        BPF_JMP32_REG(BPF_JGE, R0, R1, 2),
6103                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
6104                        BPF_JMP32_REG(BPF_JGE, R0, R1, 1),
6105                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6106                        BPF_EXIT_INSN(),
6107                },
6108                INTERNAL,
6109                { },
6110                { { 0, 0xfffffffe } }
6111        },
6112        /* BPF_JMP32 | BPF_JLT | BPF_K */
6113        {
6114                "JMP32_JLT_K: Small immediate",
6115                .u.insns_int = {
6116                        BPF_ALU32_IMM(BPF_MOV, R0, 123),
6117                        BPF_JMP32_IMM(BPF_JLT, R0, 123, 1),
6118                        BPF_JMP32_IMM(BPF_JLT, R0, 124, 1),
6119                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6120                        BPF_EXIT_INSN(),
6121                },
6122                INTERNAL,
6123                { },
6124                { { 0, 123 } }
6125        },
6126        {
6127                "JMP32_JLT_K: Large immediate",
6128                .u.insns_int = {
6129                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6130                        BPF_JMP32_IMM(BPF_JLT, R0, 0xfffffffd, 1),
6131                        BPF_JMP32_IMM(BPF_JLT, R0, 0xffffffff, 1),
6132                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6133                        BPF_EXIT_INSN(),
6134                },
6135                INTERNAL,
6136                { },
6137                { { 0, 0xfffffffe } }
6138        },
6139        /* BPF_JMP32 | BPF_JLT | BPF_X */
6140        {
6141                "JMP32_JLT_X",
6142                .u.insns_int = {
6143                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6144                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
6145                        BPF_JMP32_REG(BPF_JLT, R0, R1, 2),
6146                        BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
6147                        BPF_JMP32_REG(BPF_JLT, R0, R1, 1),
6148                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6149                        BPF_EXIT_INSN(),
6150                },
6151                INTERNAL,
6152                { },
6153                { { 0, 0xfffffffe } }
6154        },
6155        /* BPF_JMP32 | BPF_JLE | BPF_K */
6156        {
6157                "JMP32_JLE_K: Small immediate",
6158                .u.insns_int = {
6159                        BPF_ALU32_IMM(BPF_MOV, R0, 123),
6160                        BPF_JMP32_IMM(BPF_JLE, R0, 122, 1),
6161                        BPF_JMP32_IMM(BPF_JLE, R0, 123, 1),
6162                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6163                        BPF_EXIT_INSN(),
6164                },
6165                INTERNAL,
6166                { },
6167                { { 0, 123 } }
6168        },
6169        {
6170                "JMP32_JLE_K: Large immediate",
6171                .u.insns_int = {
6172                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6173                        BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffd, 1),
6174                        BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffe, 1),
6175                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6176                        BPF_EXIT_INSN(),
6177                },
6178                INTERNAL,
6179                { },
6180                { { 0, 0xfffffffe } }
6181        },
6182        /* BPF_JMP32 | BPF_JLE | BPF_X */
6183        {
6184                "JMP32_JLE_X",
6185                .u.insns_int = {
6186                        BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe),
6187                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd),
6188                        BPF_JMP32_REG(BPF_JLE, R0, R1, 2),
6189                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe),
6190                        BPF_JMP32_REG(BPF_JLE, R0, R1, 1),
6191                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6192                        BPF_EXIT_INSN(),
6193                },
6194                INTERNAL,
6195                { },
6196                { { 0, 0xfffffffe } }
6197        },
6198        /* BPF_JMP32 | BPF_JSGT | BPF_K */
6199        {
6200                "JMP32_JSGT_K: Small immediate",
6201                .u.insns_int = {
6202                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
6203                        BPF_JMP32_IMM(BPF_JSGT, R0, -123, 1),
6204                        BPF_JMP32_IMM(BPF_JSGT, R0, -124, 1),
6205                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6206                        BPF_EXIT_INSN(),
6207                },
6208                INTERNAL,
6209                { },
6210                { { 0, -123 } }
6211        },
6212        {
6213                "JMP32_JSGT_K: Large immediate",
6214                .u.insns_int = {
6215                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6216                        BPF_JMP32_IMM(BPF_JSGT, R0, -12345678, 1),
6217                        BPF_JMP32_IMM(BPF_JSGT, R0, -12345679, 1),
6218                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6219                        BPF_EXIT_INSN(),
6220                },
6221                INTERNAL,
6222                { },
6223                { { 0, -12345678 } }
6224        },
6225        /* BPF_JMP32 | BPF_JSGT | BPF_X */
6226        {
6227                "JMP32_JSGT_X",
6228                .u.insns_int = {
6229                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6230                        BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
6231                        BPF_JMP32_REG(BPF_JSGT, R0, R1, 2),
6232                        BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
6233                        BPF_JMP32_REG(BPF_JSGT, R0, R1, 1),
6234                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6235                        BPF_EXIT_INSN(),
6236                },
6237                INTERNAL,
6238                { },
6239                { { 0, -12345678 } }
6240        },
6241        /* BPF_JMP32 | BPF_JSGE | BPF_K */
6242        {
6243                "JMP32_JSGE_K: Small immediate",
6244                .u.insns_int = {
6245                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
6246                        BPF_JMP32_IMM(BPF_JSGE, R0, -122, 1),
6247                        BPF_JMP32_IMM(BPF_JSGE, R0, -123, 1),
6248                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6249                        BPF_EXIT_INSN(),
6250                },
6251                INTERNAL,
6252                { },
6253                { { 0, -123 } }
6254        },
6255        {
6256                "JMP32_JSGE_K: Large immediate",
6257                .u.insns_int = {
6258                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6259                        BPF_JMP32_IMM(BPF_JSGE, R0, -12345677, 1),
6260                        BPF_JMP32_IMM(BPF_JSGE, R0, -12345678, 1),
6261                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6262                        BPF_EXIT_INSN(),
6263                },
6264                INTERNAL,
6265                { },
6266                { { 0, -12345678 } }
6267        },
6268        /* BPF_JMP32 | BPF_JSGE | BPF_X */
6269        {
6270                "JMP32_JSGE_X",
6271                .u.insns_int = {
6272                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6273                        BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
6274                        BPF_JMP32_REG(BPF_JSGE, R0, R1, 2),
6275                        BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
6276                        BPF_JMP32_REG(BPF_JSGE, R0, R1, 1),
6277                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6278                        BPF_EXIT_INSN(),
6279                },
6280                INTERNAL,
6281                { },
6282                { { 0, -12345678 } }
6283        },
6284        /* BPF_JMP32 | BPF_JSLT | BPF_K */
6285        {
6286                "JMP32_JSLT_K: Small immediate",
6287                .u.insns_int = {
6288                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
6289                        BPF_JMP32_IMM(BPF_JSLT, R0, -123, 1),
6290                        BPF_JMP32_IMM(BPF_JSLT, R0, -122, 1),
6291                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6292                        BPF_EXIT_INSN(),
6293                },
6294                INTERNAL,
6295                { },
6296                { { 0, -123 } }
6297        },
6298        {
6299                "JMP32_JSLT_K: Large immediate",
6300                .u.insns_int = {
6301                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6302                        BPF_JMP32_IMM(BPF_JSLT, R0, -12345678, 1),
6303                        BPF_JMP32_IMM(BPF_JSLT, R0, -12345677, 1),
6304                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6305                        BPF_EXIT_INSN(),
6306                },
6307                INTERNAL,
6308                { },
6309                { { 0, -12345678 } }
6310        },
6311        /* BPF_JMP32 | BPF_JSLT | BPF_X */
6312        {
6313                "JMP32_JSLT_X",
6314                .u.insns_int = {
6315                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6316                        BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
6317                        BPF_JMP32_REG(BPF_JSLT, R0, R1, 2),
6318                        BPF_ALU32_IMM(BPF_MOV, R1, -12345677),
6319                        BPF_JMP32_REG(BPF_JSLT, R0, R1, 1),
6320                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6321                        BPF_EXIT_INSN(),
6322                },
6323                INTERNAL,
6324                { },
6325                { { 0, -12345678 } }
6326        },
6327        /* BPF_JMP32 | BPF_JSLE | BPF_K */
6328        {
6329                "JMP32_JSLE_K: Small immediate",
6330                .u.insns_int = {
6331                        BPF_ALU32_IMM(BPF_MOV, R0, -123),
6332                        BPF_JMP32_IMM(BPF_JSLE, R0, -124, 1),
6333                        BPF_JMP32_IMM(BPF_JSLE, R0, -123, 1),
6334                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6335                        BPF_EXIT_INSN(),
6336                },
6337                INTERNAL,
6338                { },
6339                { { 0, -123 } }
6340        },
6341        {
6342                "JMP32_JSLE_K: Large immediate",
6343                .u.insns_int = {
6344                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6345                        BPF_JMP32_IMM(BPF_JSLE, R0, -12345679, 1),
6346                        BPF_JMP32_IMM(BPF_JSLE, R0, -12345678, 1),
6347                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6348                        BPF_EXIT_INSN(),
6349                },
6350                INTERNAL,
6351                { },
6352                { { 0, -12345678 } }
6353        },
6354        /* BPF_JMP32 | BPF_JSLE | BPF_K */
6355        {
6356                "JMP32_JSLE_X",
6357                .u.insns_int = {
6358                        BPF_ALU32_IMM(BPF_MOV, R0, -12345678),
6359                        BPF_ALU32_IMM(BPF_MOV, R1, -12345679),
6360                        BPF_JMP32_REG(BPF_JSLE, R0, R1, 2),
6361                        BPF_ALU32_IMM(BPF_MOV, R1, -12345678),
6362                        BPF_JMP32_REG(BPF_JSLE, R0, R1, 1),
6363                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6364                        BPF_EXIT_INSN(),
6365                },
6366                INTERNAL,
6367                { },
6368                { { 0, -12345678 } }
6369        },
6370        /* BPF_JMP | BPF_EXIT */
6371        {
6372                "JMP_EXIT",
6373                .u.insns_int = {
6374                        BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
6375                        BPF_EXIT_INSN(),
6376                        BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
6377                },
6378                INTERNAL,
6379                { },
6380                { { 0, 0x4711 } },
6381        },
6382        /* BPF_JMP | BPF_JA */
6383        {
6384                "JMP_JA: Unconditional jump: if (true) return 1",
6385                .u.insns_int = {
6386                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6387                        BPF_JMP_IMM(BPF_JA, 0, 0, 1),
6388                        BPF_EXIT_INSN(),
6389                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6390                        BPF_EXIT_INSN(),
6391                },
6392                INTERNAL,
6393                { },
6394                { { 0, 1 } },
6395        },
6396        /* BPF_JMP | BPF_JSLT | BPF_K */
6397        {
6398                "JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
6399                .u.insns_int = {
6400                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6401                        BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
6402                        BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
6403                        BPF_EXIT_INSN(),
6404                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6405                        BPF_EXIT_INSN(),
6406                },
6407                INTERNAL,
6408                { },
6409                { { 0, 1 } },
6410        },
6411        {
6412                "JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
6413                .u.insns_int = {
6414                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6415                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
6416                        BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
6417                        BPF_EXIT_INSN(),
6418                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6419                        BPF_EXIT_INSN(),
6420                },
6421                INTERNAL,
6422                { },
6423                { { 0, 1 } },
6424        },
6425        /* BPF_JMP | BPF_JSGT | BPF_K */
6426        {
6427                "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
6428                .u.insns_int = {
6429                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6430                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
6431                        BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
6432                        BPF_EXIT_INSN(),
6433                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6434                        BPF_EXIT_INSN(),
6435                },
6436                INTERNAL,
6437                { },
6438                { { 0, 1 } },
6439        },
6440        {
6441                "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
6442                .u.insns_int = {
6443                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6444                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
6445                        BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
6446                        BPF_EXIT_INSN(),
6447                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6448                        BPF_EXIT_INSN(),
6449                },
6450                INTERNAL,
6451                { },
6452                { { 0, 1 } },
6453        },
6454        /* BPF_JMP | BPF_JSLE | BPF_K */
6455        {
6456                "JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
6457                .u.insns_int = {
6458                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6459                        BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
6460                        BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
6461                        BPF_EXIT_INSN(),
6462                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6463                        BPF_EXIT_INSN(),
6464                },
6465                INTERNAL,
6466                { },
6467                { { 0, 1 } },
6468        },
6469        {
6470                "JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
6471                .u.insns_int = {
6472                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6473                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
6474                        BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
6475                        BPF_EXIT_INSN(),
6476                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6477                        BPF_EXIT_INSN(),
6478                },
6479                INTERNAL,
6480                { },
6481                { { 0, 1 } },
6482        },
6483        {
6484                "JMP_JSLE_K: Signed jump: value walk 1",
6485                .u.insns_int = {
6486                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6487                        BPF_LD_IMM64(R1, 3),
6488                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
6489                        BPF_ALU64_IMM(BPF_SUB, R1, 1),
6490                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
6491                        BPF_ALU64_IMM(BPF_SUB, R1, 1),
6492                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
6493                        BPF_ALU64_IMM(BPF_SUB, R1, 1),
6494                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
6495                        BPF_EXIT_INSN(),                /* bad exit */
6496                        BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
6497                        BPF_EXIT_INSN(),
6498                },
6499                INTERNAL,
6500                { },
6501                { { 0, 1 } },
6502        },
6503        {
6504                "JMP_JSLE_K: Signed jump: value walk 2",
6505                .u.insns_int = {
6506                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6507                        BPF_LD_IMM64(R1, 3),
6508                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
6509                        BPF_ALU64_IMM(BPF_SUB, R1, 2),
6510                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
6511                        BPF_ALU64_IMM(BPF_SUB, R1, 2),
6512                        BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
6513                        BPF_EXIT_INSN(),                /* bad exit */
6514                        BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
6515                        BPF_EXIT_INSN(),
6516                },
6517                INTERNAL,
6518                { },
6519                { { 0, 1 } },
6520        },
6521        /* BPF_JMP | BPF_JSGE | BPF_K */
6522        {
6523                "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
6524                .u.insns_int = {
6525                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6526                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
6527                        BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
6528                        BPF_EXIT_INSN(),
6529                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6530                        BPF_EXIT_INSN(),
6531                },
6532                INTERNAL,
6533                { },
6534                { { 0, 1 } },
6535        },
6536        {
6537                "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
6538                .u.insns_int = {
6539                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6540                        BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
6541                        BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
6542                        BPF_EXIT_INSN(),
6543                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6544                        BPF_EXIT_INSN(),
6545                },
6546                INTERNAL,
6547                { },
6548                { { 0, 1 } },
6549        },
6550        {
6551                "JMP_JSGE_K: Signed jump: value walk 1",
6552                .u.insns_int = {
6553                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6554                        BPF_LD_IMM64(R1, -3),
6555                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
6556                        BPF_ALU64_IMM(BPF_ADD, R1, 1),
6557                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
6558                        BPF_ALU64_IMM(BPF_ADD, R1, 1),
6559                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
6560                        BPF_ALU64_IMM(BPF_ADD, R1, 1),
6561                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
6562                        BPF_EXIT_INSN(),                /* bad exit */
6563                        BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
6564                        BPF_EXIT_INSN(),
6565                },
6566                INTERNAL,
6567                { },
6568                { { 0, 1 } },
6569        },
6570        {
6571                "JMP_JSGE_K: Signed jump: value walk 2",
6572                .u.insns_int = {
6573                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6574                        BPF_LD_IMM64(R1, -3),
6575                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
6576                        BPF_ALU64_IMM(BPF_ADD, R1, 2),
6577                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
6578                        BPF_ALU64_IMM(BPF_ADD, R1, 2),
6579                        BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
6580                        BPF_EXIT_INSN(),                /* bad exit */
6581                        BPF_ALU32_IMM(BPF_MOV, R0, 1),  /* good exit */
6582                        BPF_EXIT_INSN(),
6583                },
6584                INTERNAL,
6585                { },
6586                { { 0, 1 } },
6587        },
6588        /* BPF_JMP | BPF_JGT | BPF_K */
6589        {
6590                "JMP_JGT_K: if (3 > 2) return 1",
6591                .u.insns_int = {
6592                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6593                        BPF_LD_IMM64(R1, 3),
6594                        BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
6595                        BPF_EXIT_INSN(),
6596                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6597                        BPF_EXIT_INSN(),
6598                },
6599                INTERNAL,
6600                { },
6601                { { 0, 1 } },
6602        },
6603        {
6604                "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
6605                .u.insns_int = {
6606                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6607                        BPF_LD_IMM64(R1, -1),
6608                        BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
6609                        BPF_EXIT_INSN(),
6610                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6611                        BPF_EXIT_INSN(),
6612                },
6613                INTERNAL,
6614                { },
6615                { { 0, 1 } },
6616        },
6617        /* BPF_JMP | BPF_JLT | BPF_K */
6618        {
6619                "JMP_JLT_K: if (2 < 3) return 1",
6620                .u.insns_int = {
6621                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6622                        BPF_LD_IMM64(R1, 2),
6623                        BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
6624                        BPF_EXIT_INSN(),
6625                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6626                        BPF_EXIT_INSN(),
6627                },
6628                INTERNAL,
6629                { },
6630                { { 0, 1 } },
6631        },
6632        {
6633                "JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
6634                .u.insns_int = {
6635                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6636                        BPF_LD_IMM64(R1, 1),
6637                        BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
6638                        BPF_EXIT_INSN(),
6639                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6640                        BPF_EXIT_INSN(),
6641                },
6642                INTERNAL,
6643                { },
6644                { { 0, 1 } },
6645        },
6646        /* BPF_JMP | BPF_JGE | BPF_K */
6647        {
6648                "JMP_JGE_K: if (3 >= 2) return 1",
6649                .u.insns_int = {
6650                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6651                        BPF_LD_IMM64(R1, 3),
6652                        BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
6653                        BPF_EXIT_INSN(),
6654                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6655                        BPF_EXIT_INSN(),
6656                },
6657                INTERNAL,
6658                { },
6659                { { 0, 1 } },
6660        },
6661        /* BPF_JMP | BPF_JLE | BPF_K */
6662        {
6663                "JMP_JLE_K: if (2 <= 3) return 1",
6664                .u.insns_int = {
6665                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6666                        BPF_LD_IMM64(R1, 2),
6667                        BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
6668                        BPF_EXIT_INSN(),
6669                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6670                        BPF_EXIT_INSN(),
6671                },
6672                INTERNAL,
6673                { },
6674                { { 0, 1 } },
6675        },
6676        /* BPF_JMP | BPF_JGT | BPF_K jump backwards */
6677        {
6678                "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
6679                .u.insns_int = {
6680                        BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
6681                        BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
6682                        BPF_EXIT_INSN(),
6683                        BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
6684                        BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
6685                        BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
6686                        BPF_EXIT_INSN(),
6687                },
6688                INTERNAL,
6689                { },
6690                { { 0, 1 } },
6691        },
6692        {
6693                "JMP_JGE_K: if (3 >= 3) return 1",
6694                .u.insns_int = {
6695                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6696                        BPF_LD_IMM64(R1, 3),
6697                        BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
6698                        BPF_EXIT_INSN(),
6699                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6700                        BPF_EXIT_INSN(),
6701                },
6702                INTERNAL,
6703                { },
6704                { { 0, 1 } },
6705        },
6706        /* BPF_JMP | BPF_JLT | BPF_K jump backwards */
6707        {
6708                "JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
6709                .u.insns_int = {
6710                        BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
6711                        BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
6712                        BPF_EXIT_INSN(),
6713                        BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
6714                        BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
6715                        BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
6716                        BPF_EXIT_INSN(),
6717                },
6718                INTERNAL,
6719                { },
6720                { { 0, 1 } },
6721        },
6722        {
6723                "JMP_JLE_K: if (3 <= 3) return 1",
6724                .u.insns_int = {
6725                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6726                        BPF_LD_IMM64(R1, 3),
6727                        BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
6728                        BPF_EXIT_INSN(),
6729                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6730                        BPF_EXIT_INSN(),
6731                },
6732                INTERNAL,
6733                { },
6734                { { 0, 1 } },
6735        },
6736        /* BPF_JMP | BPF_JNE | BPF_K */
6737        {
6738                "JMP_JNE_K: if (3 != 2) return 1",
6739                .u.insns_int = {
6740                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6741                        BPF_LD_IMM64(R1, 3),
6742                        BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
6743                        BPF_EXIT_INSN(),
6744                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6745                        BPF_EXIT_INSN(),
6746                },
6747                INTERNAL,
6748                { },
6749                { { 0, 1 } },
6750        },
6751        /* BPF_JMP | BPF_JEQ | BPF_K */
6752        {
6753                "JMP_JEQ_K: if (3 == 3) return 1",
6754                .u.insns_int = {
6755                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6756                        BPF_LD_IMM64(R1, 3),
6757                        BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
6758                        BPF_EXIT_INSN(),
6759                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6760                        BPF_EXIT_INSN(),
6761                },
6762                INTERNAL,
6763                { },
6764                { { 0, 1 } },
6765        },
6766        /* BPF_JMP | BPF_JSET | BPF_K */
6767        {
6768                "JMP_JSET_K: if (0x3 & 0x2) return 1",
6769                .u.insns_int = {
6770                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6771                        BPF_LD_IMM64(R1, 3),
6772                        BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
6773                        BPF_EXIT_INSN(),
6774                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6775                        BPF_EXIT_INSN(),
6776                },
6777                INTERNAL,
6778                { },
6779                { { 0, 1 } },
6780        },
6781        {
6782                "JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
6783                .u.insns_int = {
6784                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6785                        BPF_LD_IMM64(R1, 3),
6786                        BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
6787                        BPF_EXIT_INSN(),
6788                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6789                        BPF_EXIT_INSN(),
6790                },
6791                INTERNAL,
6792                { },
6793                { { 0, 1 } },
6794        },
6795        /* BPF_JMP | BPF_JSGT | BPF_X */
6796        {
6797                "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
6798                .u.insns_int = {
6799                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6800                        BPF_LD_IMM64(R1, -1),
6801                        BPF_LD_IMM64(R2, -2),
6802                        BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
6803                        BPF_EXIT_INSN(),
6804                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6805                        BPF_EXIT_INSN(),
6806                },
6807                INTERNAL,
6808                { },
6809                { { 0, 1 } },
6810        },
6811        {
6812                "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
6813                .u.insns_int = {
6814                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6815                        BPF_LD_IMM64(R1, -1),
6816                        BPF_LD_IMM64(R2, -1),
6817                        BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
6818                        BPF_EXIT_INSN(),
6819                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6820                        BPF_EXIT_INSN(),
6821                },
6822                INTERNAL,
6823                { },
6824                { { 0, 1 } },
6825        },
6826        /* BPF_JMP | BPF_JSLT | BPF_X */
6827        {
6828                "JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
6829                .u.insns_int = {
6830                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6831                        BPF_LD_IMM64(R1, -1),
6832                        BPF_LD_IMM64(R2, -2),
6833                        BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
6834                        BPF_EXIT_INSN(),
6835                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6836                        BPF_EXIT_INSN(),
6837                },
6838                INTERNAL,
6839                { },
6840                { { 0, 1 } },
6841        },
6842        {
6843                "JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
6844                .u.insns_int = {
6845                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6846                        BPF_LD_IMM64(R1, -1),
6847                        BPF_LD_IMM64(R2, -1),
6848                        BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
6849                        BPF_EXIT_INSN(),
6850                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6851                        BPF_EXIT_INSN(),
6852                },
6853                INTERNAL,
6854                { },
6855                { { 0, 1 } },
6856        },
6857        /* BPF_JMP | BPF_JSGE | BPF_X */
6858        {
6859                "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
6860                .u.insns_int = {
6861                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6862                        BPF_LD_IMM64(R1, -1),
6863                        BPF_LD_IMM64(R2, -2),
6864                        BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
6865                        BPF_EXIT_INSN(),
6866                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6867                        BPF_EXIT_INSN(),
6868                },
6869                INTERNAL,
6870                { },
6871                { { 0, 1 } },
6872        },
6873        {
6874                "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
6875                .u.insns_int = {
6876                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6877                        BPF_LD_IMM64(R1, -1),
6878                        BPF_LD_IMM64(R2, -1),
6879                        BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
6880                        BPF_EXIT_INSN(),
6881                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6882                        BPF_EXIT_INSN(),
6883                },
6884                INTERNAL,
6885                { },
6886                { { 0, 1 } },
6887        },
6888        /* BPF_JMP | BPF_JSLE | BPF_X */
6889        {
6890                "JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
6891                .u.insns_int = {
6892                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6893                        BPF_LD_IMM64(R1, -1),
6894                        BPF_LD_IMM64(R2, -2),
6895                        BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
6896                        BPF_EXIT_INSN(),
6897                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6898                        BPF_EXIT_INSN(),
6899                },
6900                INTERNAL,
6901                { },
6902                { { 0, 1 } },
6903        },
6904        {
6905                "JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
6906                .u.insns_int = {
6907                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6908                        BPF_LD_IMM64(R1, -1),
6909                        BPF_LD_IMM64(R2, -1),
6910                        BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
6911                        BPF_EXIT_INSN(),
6912                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6913                        BPF_EXIT_INSN(),
6914                },
6915                INTERNAL,
6916                { },
6917                { { 0, 1 } },
6918        },
6919        /* BPF_JMP | BPF_JGT | BPF_X */
6920        {
6921                "JMP_JGT_X: if (3 > 2) return 1",
6922                .u.insns_int = {
6923                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6924                        BPF_LD_IMM64(R1, 3),
6925                        BPF_LD_IMM64(R2, 2),
6926                        BPF_JMP_REG(BPF_JGT, R1, R2, 1),
6927                        BPF_EXIT_INSN(),
6928                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6929                        BPF_EXIT_INSN(),
6930                },
6931                INTERNAL,
6932                { },
6933                { { 0, 1 } },
6934        },
6935        {
6936                "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
6937                .u.insns_int = {
6938                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6939                        BPF_LD_IMM64(R1, -1),
6940                        BPF_LD_IMM64(R2, 1),
6941                        BPF_JMP_REG(BPF_JGT, R1, R2, 1),
6942                        BPF_EXIT_INSN(),
6943                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6944                        BPF_EXIT_INSN(),
6945                },
6946                INTERNAL,
6947                { },
6948                { { 0, 1 } },
6949        },
6950        /* BPF_JMP | BPF_JLT | BPF_X */
6951        {
6952                "JMP_JLT_X: if (2 < 3) return 1",
6953                .u.insns_int = {
6954                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6955                        BPF_LD_IMM64(R1, 3),
6956                        BPF_LD_IMM64(R2, 2),
6957                        BPF_JMP_REG(BPF_JLT, R2, R1, 1),
6958                        BPF_EXIT_INSN(),
6959                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6960                        BPF_EXIT_INSN(),
6961                },
6962                INTERNAL,
6963                { },
6964                { { 0, 1 } },
6965        },
6966        {
6967                "JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
6968                .u.insns_int = {
6969                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6970                        BPF_LD_IMM64(R1, -1),
6971                        BPF_LD_IMM64(R2, 1),
6972                        BPF_JMP_REG(BPF_JLT, R2, R1, 1),
6973                        BPF_EXIT_INSN(),
6974                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6975                        BPF_EXIT_INSN(),
6976                },
6977                INTERNAL,
6978                { },
6979                { { 0, 1 } },
6980        },
6981        /* BPF_JMP | BPF_JGE | BPF_X */
6982        {
6983                "JMP_JGE_X: if (3 >= 2) return 1",
6984                .u.insns_int = {
6985                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
6986                        BPF_LD_IMM64(R1, 3),
6987                        BPF_LD_IMM64(R2, 2),
6988                        BPF_JMP_REG(BPF_JGE, R1, R2, 1),
6989                        BPF_EXIT_INSN(),
6990                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
6991                        BPF_EXIT_INSN(),
6992                },
6993                INTERNAL,
6994                { },
6995                { { 0, 1 } },
6996        },
6997        {
6998                "JMP_JGE_X: if (3 >= 3) return 1",
6999                .u.insns_int = {
7000                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7001                        BPF_LD_IMM64(R1, 3),
7002                        BPF_LD_IMM64(R2, 3),
7003                        BPF_JMP_REG(BPF_JGE, R1, R2, 1),
7004                        BPF_EXIT_INSN(),
7005                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7006                        BPF_EXIT_INSN(),
7007                },
7008                INTERNAL,
7009                { },
7010                { { 0, 1 } },
7011        },
7012        /* BPF_JMP | BPF_JLE | BPF_X */
7013        {
7014                "JMP_JLE_X: if (2 <= 3) return 1",
7015                .u.insns_int = {
7016                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7017                        BPF_LD_IMM64(R1, 3),
7018                        BPF_LD_IMM64(R2, 2),
7019                        BPF_JMP_REG(BPF_JLE, R2, R1, 1),
7020                        BPF_EXIT_INSN(),
7021                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7022                        BPF_EXIT_INSN(),
7023                },
7024                INTERNAL,
7025                { },
7026                { { 0, 1 } },
7027        },
7028        {
7029                "JMP_JLE_X: if (3 <= 3) return 1",
7030                .u.insns_int = {
7031                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7032                        BPF_LD_IMM64(R1, 3),
7033                        BPF_LD_IMM64(R2, 3),
7034                        BPF_JMP_REG(BPF_JLE, R1, R2, 1),
7035                        BPF_EXIT_INSN(),
7036                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7037                        BPF_EXIT_INSN(),
7038                },
7039                INTERNAL,
7040                { },
7041                { { 0, 1 } },
7042        },
7043        {
7044                /* Mainly testing JIT + imm64 here. */
7045                "JMP_JGE_X: ldimm64 test 1",
7046                .u.insns_int = {
7047                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7048                        BPF_LD_IMM64(R1, 3),
7049                        BPF_LD_IMM64(R2, 2),
7050                        BPF_JMP_REG(BPF_JGE, R1, R2, 2),
7051                        BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
7052                        BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
7053                        BPF_EXIT_INSN(),
7054                },
7055                INTERNAL,
7056                { },
7057                { { 0, 0xeeeeeeeeU } },
7058        },
7059        {
7060                "JMP_JGE_X: ldimm64 test 2",
7061                .u.insns_int = {
7062                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7063                        BPF_LD_IMM64(R1, 3),
7064                        BPF_LD_IMM64(R2, 2),
7065                        BPF_JMP_REG(BPF_JGE, R1, R2, 0),
7066                        BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
7067                        BPF_EXIT_INSN(),
7068                },
7069                INTERNAL,
7070                { },
7071                { { 0, 0xffffffffU } },
7072        },
7073        {
7074                "JMP_JGE_X: ldimm64 test 3",
7075                .u.insns_int = {
7076                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7077                        BPF_LD_IMM64(R1, 3),
7078                        BPF_LD_IMM64(R2, 2),
7079                        BPF_JMP_REG(BPF_JGE, R1, R2, 4),
7080                        BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
7081                        BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
7082                        BPF_EXIT_INSN(),
7083                },
7084                INTERNAL,
7085                { },
7086                { { 0, 1 } },
7087        },
7088        {
7089                "JMP_JLE_X: ldimm64 test 1",
7090                .u.insns_int = {
7091                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7092                        BPF_LD_IMM64(R1, 3),
7093                        BPF_LD_IMM64(R2, 2),
7094                        BPF_JMP_REG(BPF_JLE, R2, R1, 2),
7095                        BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
7096                        BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
7097                        BPF_EXIT_INSN(),
7098                },
7099                INTERNAL,
7100                { },
7101                { { 0, 0xeeeeeeeeU } },
7102        },
7103        {
7104                "JMP_JLE_X: ldimm64 test 2",
7105                .u.insns_int = {
7106                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7107                        BPF_LD_IMM64(R1, 3),
7108                        BPF_LD_IMM64(R2, 2),
7109                        BPF_JMP_REG(BPF_JLE, R2, R1, 0),
7110                        BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
7111                        BPF_EXIT_INSN(),
7112                },
7113                INTERNAL,
7114                { },
7115                { { 0, 0xffffffffU } },
7116        },
7117        {
7118                "JMP_JLE_X: ldimm64 test 3",
7119                .u.insns_int = {
7120                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7121                        BPF_LD_IMM64(R1, 3),
7122                        BPF_LD_IMM64(R2, 2),
7123                        BPF_JMP_REG(BPF_JLE, R2, R1, 4),
7124                        BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
7125                        BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
7126                        BPF_EXIT_INSN(),
7127                },
7128                INTERNAL,
7129                { },
7130                { { 0, 1 } },
7131        },
7132        /* BPF_JMP | BPF_JNE | BPF_X */
7133        {
7134                "JMP_JNE_X: if (3 != 2) return 1",
7135                .u.insns_int = {
7136                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7137                        BPF_LD_IMM64(R1, 3),
7138                        BPF_LD_IMM64(R2, 2),
7139                        BPF_JMP_REG(BPF_JNE, R1, R2, 1),
7140                        BPF_EXIT_INSN(),
7141                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7142                        BPF_EXIT_INSN(),
7143                },
7144                INTERNAL,
7145                { },
7146                { { 0, 1 } },
7147        },
7148        /* BPF_JMP | BPF_JEQ | BPF_X */
7149        {
7150                "JMP_JEQ_X: if (3 == 3) return 1",
7151                .u.insns_int = {
7152                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7153                        BPF_LD_IMM64(R1, 3),
7154                        BPF_LD_IMM64(R2, 3),
7155                        BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
7156                        BPF_EXIT_INSN(),
7157                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7158                        BPF_EXIT_INSN(),
7159                },
7160                INTERNAL,
7161                { },
7162                { { 0, 1 } },
7163        },
7164        /* BPF_JMP | BPF_JSET | BPF_X */
7165        {
7166                "JMP_JSET_X: if (0x3 & 0x2) return 1",
7167                .u.insns_int = {
7168                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7169                        BPF_LD_IMM64(R1, 3),
7170                        BPF_LD_IMM64(R2, 2),
7171                        BPF_JMP_REG(BPF_JSET, R1, R2, 1),
7172                        BPF_EXIT_INSN(),
7173                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7174                        BPF_EXIT_INSN(),
7175                },
7176                INTERNAL,
7177                { },
7178                { { 0, 1 } },
7179        },
7180        {
7181                "JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
7182                .u.insns_int = {
7183                        BPF_ALU32_IMM(BPF_MOV, R0, 0),
7184                        BPF_LD_IMM64(R1, 3),
7185                        BPF_LD_IMM64(R2, 0xffffffff),
7186                        BPF_JMP_REG(BPF_JSET, R1, R2, 1),
7187                        BPF_EXIT_INSN(),
7188                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
7189                        BPF_EXIT_INSN(),
7190                },
7191                INTERNAL,
7192                { },
7193                { { 0, 1 } },
7194        },
7195        {       /* Mainly checking JIT here. */
7196                "BPF_MAXINSNS: Very long conditional jump",
7197                { },
7198                INTERNAL | FLAG_NO_DATA,
7199                { },
7200                { { 0, 1 } },
7201                .fill_helper = bpf_fill_long_jmp,
7202        },
7203        {
7204                "JMP_JA: Jump, gap, jump, ...",
7205                { },
7206                CLASSIC | FLAG_NO_DATA,
7207                { },
7208                { { 0, 0xababcbac } },
7209                .fill_helper = bpf_fill_ja,
7210        },
7211        {       /* Mainly checking JIT here. */
7212                "BPF_MAXINSNS: Maximum possible literals",
7213                { },
7214                CLASSIC | FLAG_NO_DATA,
7215                { },
7216                { { 0, 0xffffffff } },
7217                .fill_helper = bpf_fill_maxinsns1,
7218        },
7219        {       /* Mainly checking JIT here. */
7220                "BPF_MAXINSNS: Single literal",
7221                { },
7222                CLASSIC | FLAG_NO_DATA,
7223                { },
7224                { { 0, 0xfefefefe } },
7225                .fill_helper = bpf_fill_maxinsns2,
7226        },
7227        {       /* Mainly checking JIT here. */
7228                "BPF_MAXINSNS: Run/add until end",
7229                { },
7230                CLASSIC | FLAG_NO_DATA,
7231                { },
7232                { { 0, 0x947bf368 } },
7233                .fill_helper = bpf_fill_maxinsns3,
7234        },
7235        {
7236                "BPF_MAXINSNS: Too many instructions",
7237                { },
7238                CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
7239                { },
7240                { },
7241                .fill_helper = bpf_fill_maxinsns4,
7242                .expected_errcode = -EINVAL,
7243        },
7244        {       /* Mainly checking JIT here. */
7245                "BPF_MAXINSNS: Very long jump",
7246                { },
7247                CLASSIC | FLAG_NO_DATA,
7248                { },
7249                { { 0, 0xabababab } },
7250                .fill_helper = bpf_fill_maxinsns5,
7251        },
7252        {       /* Mainly checking JIT here. */
7253                "BPF_MAXINSNS: Ctx heavy transformations",
7254                { },
7255                CLASSIC,
7256                { },
7257                {
7258                        {  1, SKB_VLAN_PRESENT },
7259                        { 10, SKB_VLAN_PRESENT }
7260                },
7261                .fill_helper = bpf_fill_maxinsns6,
7262        },
7263        {       /* Mainly checking JIT here. */
7264                "BPF_MAXINSNS: Call heavy transformations",
7265                { },
7266                CLASSIC | FLAG_NO_DATA,
7267                { },
7268                { { 1, 0 }, { 10, 0 } },
7269                .fill_helper = bpf_fill_maxinsns7,
7270        },
7271        {       /* Mainly checking JIT here. */
7272                "BPF_MAXINSNS: Jump heavy test",
7273                { },
7274                CLASSIC | FLAG_NO_DATA,
7275                { },
7276                { { 0, 0xffffffff } },
7277                .fill_helper = bpf_fill_maxinsns8,
7278        },
7279        {       /* Mainly checking JIT here. */
7280                "BPF_MAXINSNS: Very long jump backwards",
7281                { },
7282                INTERNAL | FLAG_NO_DATA,
7283                { },
7284                { { 0, 0xcbababab } },
7285                .fill_helper = bpf_fill_maxinsns9,
7286        },
7287        {       /* Mainly checking JIT here. */
7288                "BPF_MAXINSNS: Edge hopping nuthouse",
7289                { },
7290                INTERNAL | FLAG_NO_DATA,
7291                { },
7292                { { 0, 0xabababac } },
7293                .fill_helper = bpf_fill_maxinsns10,
7294        },
7295        {
7296                "BPF_MAXINSNS: Jump, gap, jump, ...",
7297                { },
7298                CLASSIC | FLAG_NO_DATA,
7299                { },
7300                { { 0, 0xababcbac } },
7301                .fill_helper = bpf_fill_maxinsns11,
7302        },
7303        {
7304                "BPF_MAXINSNS: jump over MSH",
7305                { },
7306                CLASSIC | FLAG_EXPECTED_FAIL,
7307                { 0xfa, 0xfb, 0xfc, 0xfd, },
7308                { { 4, 0xabababab } },
7309                .fill_helper = bpf_fill_maxinsns12,
7310                .expected_errcode = -EINVAL,
7311        },
7312        {
7313                "BPF_MAXINSNS: exec all MSH",
7314                { },
7315                CLASSIC,
7316                { 0xfa, 0xfb, 0xfc, 0xfd, },
7317                { { 4, 0xababab83 } },
7318                .fill_helper = bpf_fill_maxinsns13,
7319        },
7320        {
7321                "BPF_MAXINSNS: ld_abs+get_processor_id",
7322                { },
7323                CLASSIC,
7324                { },
7325                { { 1, 0xbee } },
7326                .fill_helper = bpf_fill_ld_abs_get_processor_id,
7327        },
7328        /*
7329         * LD_IND / LD_ABS on fragmented SKBs
7330         */
7331        {
7332                "LD_IND byte frag",
7333                .u.insns = {
7334                        BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
7335                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
7336                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7337                },
7338                CLASSIC | FLAG_SKB_FRAG,
7339                { },
7340                { {0x40, 0x42} },
7341                .frag_data = {
7342                        0x42, 0x00, 0x00, 0x00,
7343                        0x43, 0x44, 0x00, 0x00,
7344                        0x21, 0x07, 0x19, 0x83,
7345                },
7346        },
7347        {
7348                "LD_IND halfword frag",
7349                .u.insns = {
7350                        BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
7351                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
7352                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7353                },
7354                CLASSIC | FLAG_SKB_FRAG,
7355                { },
7356                { {0x40, 0x4344} },
7357                .frag_data = {
7358                        0x42, 0x00, 0x00, 0x00,
7359                        0x43, 0x44, 0x00, 0x00,
7360                        0x21, 0x07, 0x19, 0x83,
7361                },
7362        },
7363        {
7364                "LD_IND word frag",
7365                .u.insns = {
7366                        BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
7367                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
7368                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7369                },
7370                CLASSIC | FLAG_SKB_FRAG,
7371                { },
7372                { {0x40, 0x21071983} },
7373                .frag_data = {
7374                        0x42, 0x00, 0x00, 0x00,
7375                        0x43, 0x44, 0x00, 0x00,
7376                        0x21, 0x07, 0x19, 0x83,
7377                },
7378        },
7379        {
7380                "LD_IND halfword mixed head/frag",
7381                .u.insns = {
7382                        BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
7383                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
7384                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7385                },
7386                CLASSIC | FLAG_SKB_FRAG,
7387                { [0x3e] = 0x25, [0x3f] = 0x05, },
7388                { {0x40, 0x0519} },
7389                .frag_data = { 0x19, 0x82 },
7390        },
7391        {
7392                "LD_IND word mixed head/frag",
7393                .u.insns = {
7394                        BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
7395                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
7396                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7397                },
7398                CLASSIC | FLAG_SKB_FRAG,
7399                { [0x3e] = 0x25, [0x3f] = 0x05, },
7400                { {0x40, 0x25051982} },
7401                .frag_data = { 0x19, 0x82 },
7402        },
7403        {
7404                "LD_ABS byte frag",
7405                .u.insns = {
7406                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
7407                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7408                },
7409                CLASSIC | FLAG_SKB_FRAG,
7410                { },
7411                { {0x40, 0x42} },
7412                .frag_data = {
7413                        0x42, 0x00, 0x00, 0x00,
7414                        0x43, 0x44, 0x00, 0x00,
7415                        0x21, 0x07, 0x19, 0x83,
7416                },
7417        },
7418        {
7419                "LD_ABS halfword frag",
7420                .u.insns = {
7421                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
7422                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7423                },
7424                CLASSIC | FLAG_SKB_FRAG,
7425                { },
7426                { {0x40, 0x4344} },
7427                .frag_data = {
7428                        0x42, 0x00, 0x00, 0x00,
7429                        0x43, 0x44, 0x00, 0x00,
7430                        0x21, 0x07, 0x19, 0x83,
7431                },
7432        },
7433        {
7434                "LD_ABS word frag",
7435                .u.insns = {
7436                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
7437                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7438                },
7439                CLASSIC | FLAG_SKB_FRAG,
7440                { },
7441                { {0x40, 0x21071983} },
7442                .frag_data = {
7443                        0x42, 0x00, 0x00, 0x00,
7444                        0x43, 0x44, 0x00, 0x00,
7445                        0x21, 0x07, 0x19, 0x83,
7446                },
7447        },
7448        {
7449                "LD_ABS halfword mixed head/frag",
7450                .u.insns = {
7451                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
7452                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7453                },
7454                CLASSIC | FLAG_SKB_FRAG,
7455                { [0x3e] = 0x25, [0x3f] = 0x05, },
7456                { {0x40, 0x0519} },
7457                .frag_data = { 0x19, 0x82 },
7458        },
7459        {
7460                "LD_ABS word mixed head/frag",
7461                .u.insns = {
7462                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
7463                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7464                },
7465                CLASSIC | FLAG_SKB_FRAG,
7466                { [0x3e] = 0x25, [0x3f] = 0x05, },
7467                { {0x40, 0x25051982} },
7468                .frag_data = { 0x19, 0x82 },
7469        },
7470        /*
7471         * LD_IND / LD_ABS on non fragmented SKBs
7472         */
7473        {
7474                /*
7475                 * this tests that the JIT/interpreter correctly resets X
7476                 * before using it in an LD_IND instruction.
7477                 */
7478                "LD_IND byte default X",
7479                .u.insns = {
7480                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
7481                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7482                },
7483                CLASSIC,
7484                { [0x1] = 0x42 },
7485                { {0x40, 0x42 } },
7486        },
7487        {
7488                "LD_IND byte positive offset",
7489                .u.insns = {
7490                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7491                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
7492                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7493                },
7494                CLASSIC,
7495                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7496                { {0x40, 0x82 } },
7497        },
7498        {
7499                "LD_IND byte negative offset",
7500                .u.insns = {
7501                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7502                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
7503                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7504                },
7505                CLASSIC,
7506                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7507                { {0x40, 0x05 } },
7508        },
7509        {
7510                "LD_IND byte positive offset, all ff",
7511                .u.insns = {
7512                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7513                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
7514                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7515                },
7516                CLASSIC,
7517                { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
7518                { {0x40, 0xff } },
7519        },
7520        {
7521                "LD_IND byte positive offset, out of bounds",
7522                .u.insns = {
7523                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7524                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
7525                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7526                },
7527                CLASSIC,
7528                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7529                { {0x3f, 0 }, },
7530        },
7531        {
7532                "LD_IND byte negative offset, out of bounds",
7533                .u.insns = {
7534                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7535                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
7536                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7537                },
7538                CLASSIC,
7539                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7540                { {0x3f, 0 } },
7541        },
7542        {
7543                "LD_IND byte negative offset, multiple calls",
7544                .u.insns = {
7545                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
7546                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
7547                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
7548                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
7549                        BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
7550                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7551                },
7552                CLASSIC,
7553                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7554                { {0x40, 0x82 }, },
7555        },
7556        {
7557                "LD_IND halfword positive offset",
7558                .u.insns = {
7559                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7560                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
7561                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7562                },
7563                CLASSIC,
7564                {
7565                        [0x1c] = 0xaa, [0x1d] = 0x55,
7566                        [0x1e] = 0xbb, [0x1f] = 0x66,
7567                        [0x20] = 0xcc, [0x21] = 0x77,
7568                        [0x22] = 0xdd, [0x23] = 0x88,
7569                },
7570                { {0x40, 0xdd88 } },
7571        },
7572        {
7573                "LD_IND halfword negative offset",
7574                .u.insns = {
7575                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7576                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
7577                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7578                },
7579                CLASSIC,
7580                {
7581                        [0x1c] = 0xaa, [0x1d] = 0x55,
7582                        [0x1e] = 0xbb, [0x1f] = 0x66,
7583                        [0x20] = 0xcc, [0x21] = 0x77,
7584                        [0x22] = 0xdd, [0x23] = 0x88,
7585                },
7586                { {0x40, 0xbb66 } },
7587        },
7588        {
7589                "LD_IND halfword unaligned",
7590                .u.insns = {
7591                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7592                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
7593                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7594                },
7595                CLASSIC,
7596                {
7597                        [0x1c] = 0xaa, [0x1d] = 0x55,
7598                        [0x1e] = 0xbb, [0x1f] = 0x66,
7599                        [0x20] = 0xcc, [0x21] = 0x77,
7600                        [0x22] = 0xdd, [0x23] = 0x88,
7601                },
7602                { {0x40, 0x66cc } },
7603        },
7604        {
7605                "LD_IND halfword positive offset, all ff",
7606                .u.insns = {
7607                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
7608                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
7609                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7610                },
7611                CLASSIC,
7612                { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
7613                { {0x40, 0xffff } },
7614        },
7615        {
7616                "LD_IND halfword positive offset, out of bounds",
7617                .u.insns = {
7618                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7619                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
7620                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7621                },
7622                CLASSIC,
7623                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7624                { {0x3f, 0 }, },
7625        },
7626        {
7627                "LD_IND halfword negative offset, out of bounds",
7628                .u.insns = {
7629                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7630                        BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
7631                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7632                },
7633                CLASSIC,
7634                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7635                { {0x3f, 0 } },
7636        },
7637        {
7638                "LD_IND word positive offset",
7639                .u.insns = {
7640                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7641                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
7642                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7643                },
7644                CLASSIC,
7645                {
7646                        [0x1c] = 0xaa, [0x1d] = 0x55,
7647                        [0x1e] = 0xbb, [0x1f] = 0x66,
7648                        [0x20] = 0xcc, [0x21] = 0x77,
7649                        [0x22] = 0xdd, [0x23] = 0x88,
7650                        [0x24] = 0xee, [0x25] = 0x99,
7651                        [0x26] = 0xff, [0x27] = 0xaa,
7652                },
7653                { {0x40, 0xee99ffaa } },
7654        },
7655        {
7656                "LD_IND word negative offset",
7657                .u.insns = {
7658                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7659                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
7660                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7661                },
7662                CLASSIC,
7663                {
7664                        [0x1c] = 0xaa, [0x1d] = 0x55,
7665                        [0x1e] = 0xbb, [0x1f] = 0x66,
7666                        [0x20] = 0xcc, [0x21] = 0x77,
7667                        [0x22] = 0xdd, [0x23] = 0x88,
7668                        [0x24] = 0xee, [0x25] = 0x99,
7669                        [0x26] = 0xff, [0x27] = 0xaa,
7670                },
7671                { {0x40, 0xaa55bb66 } },
7672        },
7673        {
7674                "LD_IND word unaligned (addr & 3 == 2)",
7675                .u.insns = {
7676                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7677                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
7678                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7679                },
7680                CLASSIC,
7681                {
7682                        [0x1c] = 0xaa, [0x1d] = 0x55,
7683                        [0x1e] = 0xbb, [0x1f] = 0x66,
7684                        [0x20] = 0xcc, [0x21] = 0x77,
7685                        [0x22] = 0xdd, [0x23] = 0x88,
7686                        [0x24] = 0xee, [0x25] = 0x99,
7687                        [0x26] = 0xff, [0x27] = 0xaa,
7688                },
7689                { {0x40, 0xbb66cc77 } },
7690        },
7691        {
7692                "LD_IND word unaligned (addr & 3 == 1)",
7693                .u.insns = {
7694                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7695                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
7696                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7697                },
7698                CLASSIC,
7699                {
7700                        [0x1c] = 0xaa, [0x1d] = 0x55,
7701                        [0x1e] = 0xbb, [0x1f] = 0x66,
7702                        [0x20] = 0xcc, [0x21] = 0x77,
7703                        [0x22] = 0xdd, [0x23] = 0x88,
7704                        [0x24] = 0xee, [0x25] = 0x99,
7705                        [0x26] = 0xff, [0x27] = 0xaa,
7706                },
7707                { {0x40, 0x55bb66cc } },
7708        },
7709        {
7710                "LD_IND word unaligned (addr & 3 == 3)",
7711                .u.insns = {
7712                        BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
7713                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
7714                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7715                },
7716                CLASSIC,
7717                {
7718                        [0x1c] = 0xaa, [0x1d] = 0x55,
7719                        [0x1e] = 0xbb, [0x1f] = 0x66,
7720                        [0x20] = 0xcc, [0x21] = 0x77,
7721                        [0x22] = 0xdd, [0x23] = 0x88,
7722                        [0x24] = 0xee, [0x25] = 0x99,
7723                        [0x26] = 0xff, [0x27] = 0xaa,
7724                },
7725                { {0x40, 0x66cc77dd } },
7726        },
7727        {
7728                "LD_IND word positive offset, all ff",
7729                .u.insns = {
7730                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
7731                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
7732                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7733                },
7734                CLASSIC,
7735                { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
7736                { {0x40, 0xffffffff } },
7737        },
7738        {
7739                "LD_IND word positive offset, out of bounds",
7740                .u.insns = {
7741                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7742                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
7743                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7744                },
7745                CLASSIC,
7746                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7747                { {0x3f, 0 }, },
7748        },
7749        {
7750                "LD_IND word negative offset, out of bounds",
7751                .u.insns = {
7752                        BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
7753                        BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
7754                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7755                },
7756                CLASSIC,
7757                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7758                { {0x3f, 0 } },
7759        },
7760        {
7761                "LD_ABS byte",
7762                .u.insns = {
7763                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
7764                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7765                },
7766                CLASSIC,
7767                {
7768                        [0x1c] = 0xaa, [0x1d] = 0x55,
7769                        [0x1e] = 0xbb, [0x1f] = 0x66,
7770                        [0x20] = 0xcc, [0x21] = 0x77,
7771                        [0x22] = 0xdd, [0x23] = 0x88,
7772                        [0x24] = 0xee, [0x25] = 0x99,
7773                        [0x26] = 0xff, [0x27] = 0xaa,
7774                },
7775                { {0x40, 0xcc } },
7776        },
7777        {
7778                "LD_ABS byte positive offset, all ff",
7779                .u.insns = {
7780                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
7781                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7782                },
7783                CLASSIC,
7784                { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
7785                { {0x40, 0xff } },
7786        },
7787        {
7788                "LD_ABS byte positive offset, out of bounds",
7789                .u.insns = {
7790                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
7791                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7792                },
7793                CLASSIC,
7794                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7795                { {0x3f, 0 }, },
7796        },
7797        {
7798                "LD_ABS byte negative offset, out of bounds load",
7799                .u.insns = {
7800                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
7801                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7802                },
7803                CLASSIC | FLAG_EXPECTED_FAIL,
7804                .expected_errcode = -EINVAL,
7805        },
7806        {
7807                "LD_ABS byte negative offset, in bounds",
7808                .u.insns = {
7809                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
7810                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7811                },
7812                CLASSIC,
7813                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7814                { {0x40, 0x82 }, },
7815        },
7816        {
7817                "LD_ABS byte negative offset, out of bounds",
7818                .u.insns = {
7819                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
7820                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7821                },
7822                CLASSIC,
7823                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7824                { {0x3f, 0 }, },
7825        },
7826        {
7827                "LD_ABS byte negative offset, multiple calls",
7828                .u.insns = {
7829                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
7830                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
7831                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
7832                        BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
7833                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7834                },
7835                CLASSIC,
7836                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7837                { {0x40, 0x82 }, },
7838        },
7839        {
7840                "LD_ABS halfword",
7841                .u.insns = {
7842                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
7843                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7844                },
7845                CLASSIC,
7846                {
7847                        [0x1c] = 0xaa, [0x1d] = 0x55,
7848                        [0x1e] = 0xbb, [0x1f] = 0x66,
7849                        [0x20] = 0xcc, [0x21] = 0x77,
7850                        [0x22] = 0xdd, [0x23] = 0x88,
7851                        [0x24] = 0xee, [0x25] = 0x99,
7852                        [0x26] = 0xff, [0x27] = 0xaa,
7853                },
7854                { {0x40, 0xdd88 } },
7855        },
7856        {
7857                "LD_ABS halfword unaligned",
7858                .u.insns = {
7859                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
7860                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7861                },
7862                CLASSIC,
7863                {
7864                        [0x1c] = 0xaa, [0x1d] = 0x55,
7865                        [0x1e] = 0xbb, [0x1f] = 0x66,
7866                        [0x20] = 0xcc, [0x21] = 0x77,
7867                        [0x22] = 0xdd, [0x23] = 0x88,
7868                        [0x24] = 0xee, [0x25] = 0x99,
7869                        [0x26] = 0xff, [0x27] = 0xaa,
7870                },
7871                { {0x40, 0x99ff } },
7872        },
7873        {
7874                "LD_ABS halfword positive offset, all ff",
7875                .u.insns = {
7876                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
7877                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7878                },
7879                CLASSIC,
7880                { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
7881                { {0x40, 0xffff } },
7882        },
7883        {
7884                "LD_ABS halfword positive offset, out of bounds",
7885                .u.insns = {
7886                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
7887                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7888                },
7889                CLASSIC,
7890                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7891                { {0x3f, 0 }, },
7892        },
7893        {
7894                "LD_ABS halfword negative offset, out of bounds load",
7895                .u.insns = {
7896                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
7897                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7898                },
7899                CLASSIC | FLAG_EXPECTED_FAIL,
7900                .expected_errcode = -EINVAL,
7901        },
7902        {
7903                "LD_ABS halfword negative offset, in bounds",
7904                .u.insns = {
7905                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
7906                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7907                },
7908                CLASSIC,
7909                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7910                { {0x40, 0x1982 }, },
7911        },
7912        {
7913                "LD_ABS halfword negative offset, out of bounds",
7914                .u.insns = {
7915                        BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
7916                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7917                },
7918                CLASSIC,
7919                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
7920                { {0x3f, 0 }, },
7921        },
7922        {
7923                "LD_ABS word",
7924                .u.insns = {
7925                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
7926                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7927                },
7928                CLASSIC,
7929                {
7930                        [0x1c] = 0xaa, [0x1d] = 0x55,
7931                        [0x1e] = 0xbb, [0x1f] = 0x66,
7932                        [0x20] = 0xcc, [0x21] = 0x77,
7933                        [0x22] = 0xdd, [0x23] = 0x88,
7934                        [0x24] = 0xee, [0x25] = 0x99,
7935                        [0x26] = 0xff, [0x27] = 0xaa,
7936                },
7937                { {0x40, 0xaa55bb66 } },
7938        },
7939        {
7940                "LD_ABS word unaligned (addr & 3 == 2)",
7941                .u.insns = {
7942                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
7943                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7944                },
7945                CLASSIC,
7946                {
7947                        [0x1c] = 0xaa, [0x1d] = 0x55,
7948                        [0x1e] = 0xbb, [0x1f] = 0x66,
7949                        [0x20] = 0xcc, [0x21] = 0x77,
7950                        [0x22] = 0xdd, [0x23] = 0x88,
7951                        [0x24] = 0xee, [0x25] = 0x99,
7952                        [0x26] = 0xff, [0x27] = 0xaa,
7953                },
7954                { {0x40, 0xdd88ee99 } },
7955        },
7956        {
7957                "LD_ABS word unaligned (addr & 3 == 1)",
7958                .u.insns = {
7959                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
7960                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7961                },
7962                CLASSIC,
7963                {
7964                        [0x1c] = 0xaa, [0x1d] = 0x55,
7965                        [0x1e] = 0xbb, [0x1f] = 0x66,
7966                        [0x20] = 0xcc, [0x21] = 0x77,
7967                        [0x22] = 0xdd, [0x23] = 0x88,
7968                        [0x24] = 0xee, [0x25] = 0x99,
7969                        [0x26] = 0xff, [0x27] = 0xaa,
7970                },
7971                { {0x40, 0x77dd88ee } },
7972        },
7973        {
7974                "LD_ABS word unaligned (addr & 3 == 3)",
7975                .u.insns = {
7976                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
7977                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7978                },
7979                CLASSIC,
7980                {
7981                        [0x1c] = 0xaa, [0x1d] = 0x55,
7982                        [0x1e] = 0xbb, [0x1f] = 0x66,
7983                        [0x20] = 0xcc, [0x21] = 0x77,
7984                        [0x22] = 0xdd, [0x23] = 0x88,
7985                        [0x24] = 0xee, [0x25] = 0x99,
7986                        [0x26] = 0xff, [0x27] = 0xaa,
7987                },
7988                { {0x40, 0x88ee99ff } },
7989        },
7990        {
7991                "LD_ABS word positive offset, all ff",
7992                .u.insns = {
7993                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
7994                        BPF_STMT(BPF_RET | BPF_A, 0x0),
7995                },
7996                CLASSIC,
7997                { [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
7998                { {0x40, 0xffffffff } },
7999        },
8000        {
8001                "LD_ABS word positive offset, out of bounds",
8002                .u.insns = {
8003                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
8004                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8005                },
8006                CLASSIC,
8007                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8008                { {0x3f, 0 }, },
8009        },
8010        {
8011                "LD_ABS word negative offset, out of bounds load",
8012                .u.insns = {
8013                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
8014                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8015                },
8016                CLASSIC | FLAG_EXPECTED_FAIL,
8017                .expected_errcode = -EINVAL,
8018        },
8019        {
8020                "LD_ABS word negative offset, in bounds",
8021                .u.insns = {
8022                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
8023                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8024                },
8025                CLASSIC,
8026                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8027                { {0x40, 0x25051982 }, },
8028        },
8029        {
8030                "LD_ABS word negative offset, out of bounds",
8031                .u.insns = {
8032                        BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
8033                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8034                },
8035                CLASSIC,
8036                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8037                { {0x3f, 0 }, },
8038        },
8039        {
8040                "LDX_MSH standalone, preserved A",
8041                .u.insns = {
8042                        BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
8043                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
8044                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8045                },
8046                CLASSIC,
8047                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8048                { {0x40, 0xffeebbaa }, },
8049        },
8050        {
8051                "LDX_MSH standalone, preserved A 2",
8052                .u.insns = {
8053                        BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
8054                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
8055                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
8056                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
8057                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
8058                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8059                },
8060                CLASSIC,
8061                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8062                { {0x40, 0x175e9d63 }, },
8063        },
8064        {
8065                "LDX_MSH standalone, test result 1",
8066                .u.insns = {
8067                        BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
8068                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
8069                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
8070                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8071                },
8072                CLASSIC,
8073                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8074                { {0x40, 0x14 }, },
8075        },
8076        {
8077                "LDX_MSH standalone, test result 2",
8078                .u.insns = {
8079                        BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
8080                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
8081                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
8082                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8083                },
8084                CLASSIC,
8085                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8086                { {0x40, 0x24 }, },
8087        },
8088        {
8089                "LDX_MSH standalone, negative offset",
8090                .u.insns = {
8091                        BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
8092                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
8093                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
8094                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8095                },
8096                CLASSIC,
8097                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8098                { {0x40, 0 }, },
8099        },
8100        {
8101                "LDX_MSH standalone, negative offset 2",
8102                .u.insns = {
8103                        BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
8104                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
8105                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
8106                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8107                },
8108                CLASSIC,
8109                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8110                { {0x40, 0x24 }, },
8111        },
8112        {
8113                "LDX_MSH standalone, out of bounds",
8114                .u.insns = {
8115                        BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
8116                        BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
8117                        BPF_STMT(BPF_MISC | BPF_TXA, 0),
8118                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8119                },
8120                CLASSIC,
8121                { [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
8122                { {0x40, 0 }, },
8123        },
8124        /*
8125         * verify that the interpreter or JIT correctly sets A and X
8126         * to 0.
8127         */
8128        {
8129                "ADD default X",
8130                .u.insns = {
8131                        /*
8132                         * A = 0x42
8133                         * A = A + X
8134                         * ret A
8135                         */
8136                        BPF_STMT(BPF_LD | BPF_IMM, 0x42),
8137                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
8138                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8139                },
8140                CLASSIC | FLAG_NO_DATA,
8141                {},
8142                { {0x1, 0x42 } },
8143        },
8144        {
8145                "ADD default A",
8146                .u.insns = {
8147                        /*
8148                         * A = A + 0x42
8149                         * ret A
8150                         */
8151                        BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
8152                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8153                },
8154                CLASSIC | FLAG_NO_DATA,
8155                {},
8156                { {0x1, 0x42 } },
8157        },
8158        {
8159                "SUB default X",
8160                .u.insns = {
8161                        /*
8162                         * A = 0x66
8163                         * A = A - X
8164                         * ret A
8165                         */
8166                        BPF_STMT(BPF_LD | BPF_IMM, 0x66),
8167                        BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
8168                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8169                },
8170                CLASSIC | FLAG_NO_DATA,
8171                {},
8172                { {0x1, 0x66 } },
8173        },
8174        {
8175                "SUB default A",
8176                .u.insns = {
8177                        /*
8178                         * A = A - -0x66
8179                         * ret A
8180                         */
8181                        BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
8182                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8183                },
8184                CLASSIC | FLAG_NO_DATA,
8185                {},
8186                { {0x1, 0x66 } },
8187        },
8188        {
8189                "MUL default X",
8190                .u.insns = {
8191                        /*
8192                         * A = 0x42
8193                         * A = A * X
8194                         * ret A
8195                         */
8196                        BPF_STMT(BPF_LD | BPF_IMM, 0x42),
8197                        BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
8198                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8199                },
8200                CLASSIC | FLAG_NO_DATA,
8201                {},
8202                { {0x1, 0x0 } },
8203        },
8204        {
8205                "MUL default A",
8206                .u.insns = {
8207                        /*
8208                         * A = A * 0x66
8209                         * ret A
8210                         */
8211                        BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
8212                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8213                },
8214                CLASSIC | FLAG_NO_DATA,
8215                {},
8216                { {0x1, 0x0 } },
8217        },
8218        {
8219                "DIV default X",
8220                .u.insns = {
8221                        /*
8222                         * A = 0x42
8223                         * A = A / X ; this halt the filter execution if X is 0
8224                         * ret 0x42
8225                         */
8226                        BPF_STMT(BPF_LD | BPF_IMM, 0x42),
8227                        BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
8228                        BPF_STMT(BPF_RET | BPF_K, 0x42),
8229                },
8230                CLASSIC | FLAG_NO_DATA,
8231                {},
8232                { {0x1, 0x0 } },
8233        },
8234        {
8235                "DIV default A",
8236                .u.insns = {
8237                        /*
8238                         * A = A / 1
8239                         * ret A
8240                         */
8241                        BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
8242                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8243                },
8244                CLASSIC | FLAG_NO_DATA,
8245                {},
8246                { {0x1, 0x0 } },
8247        },
8248        {
8249                "MOD default X",
8250                .u.insns = {
8251                        /*
8252                         * A = 0x42
8253                         * A = A mod X ; this halt the filter execution if X is 0
8254                         * ret 0x42
8255                         */
8256                        BPF_STMT(BPF_LD | BPF_IMM, 0x42),
8257                        BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
8258                        BPF_STMT(BPF_RET | BPF_K, 0x42),
8259                },
8260                CLASSIC | FLAG_NO_DATA,
8261                {},
8262                { {0x1, 0x0 } },
8263        },
8264        {
8265                "MOD default A",
8266                .u.insns = {
8267                        /*
8268                         * A = A mod 1
8269                         * ret A
8270                         */
8271                        BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
8272                        BPF_STMT(BPF_RET | BPF_A, 0x0),
8273                },
8274                CLASSIC | FLAG_NO_DATA,
8275                {},
8276                { {0x1, 0x0 } },
8277        },
8278        {
8279                "JMP EQ default A",
8280                .u.insns = {
8281                        /*
8282                         * cmp A, 0x0, 0, 1
8283                         * ret 0x42
8284                         * ret 0x66
8285                         */
8286                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
8287                        BPF_STMT(BPF_RET | BPF_K, 0x42),
8288                        BPF_STMT(BPF_RET | BPF_K, 0x66),
8289                },
8290                CLASSIC | FLAG_NO_DATA,
8291                {},
8292                { {0x1, 0x42 } },
8293        },
8294        {
8295                "JMP EQ default X",
8296                .u.insns = {
8297                        /*
8298                         * A = 0x0
8299                         * cmp A, X, 0, 1
8300                         * ret 0x42
8301                         * ret 0x66
8302                         */
8303                        BPF_STMT(BPF_LD | BPF_IMM, 0x0),
8304                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
8305                        BPF_STMT(BPF_RET | BPF_K, 0x42),
8306                        BPF_STMT(BPF_RET | BPF_K, 0x66),
8307                },
8308                CLASSIC | FLAG_NO_DATA,
8309                {},
8310                { {0x1, 0x42 } },
8311        },
8312        /* Checking interpreter vs JIT wrt signed extended imms. */
8313        {
8314                "JNE signed compare, test 1",
8315                .u.insns_int = {
8316                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
8317                        BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
8318                        BPF_MOV64_REG(R2, R1),
8319                        BPF_ALU64_REG(BPF_AND, R2, R3),
8320                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
8321                        BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
8322                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
8323                        BPF_EXIT_INSN(),
8324                },
8325                INTERNAL,
8326                { },
8327                { { 0, 1 } },
8328        },
8329        {
8330                "JNE signed compare, test 2",
8331                .u.insns_int = {
8332                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
8333                        BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
8334                        BPF_MOV64_REG(R2, R1),
8335                        BPF_ALU64_REG(BPF_AND, R2, R3),
8336                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
8337                        BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
8338                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
8339                        BPF_EXIT_INSN(),
8340                },
8341                INTERNAL,
8342                { },
8343                { { 0, 1 } },
8344        },
8345        {
8346                "JNE signed compare, test 3",
8347                .u.insns_int = {
8348                        BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
8349                        BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
8350                        BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
8351                        BPF_MOV64_REG(R2, R1),
8352                        BPF_ALU64_REG(BPF_AND, R2, R3),
8353                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
8354                        BPF_JMP_REG(BPF_JNE, R2, R4, 1),
8355                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
8356                        BPF_EXIT_INSN(),
8357                },
8358                INTERNAL,
8359                { },
8360                { { 0, 2 } },
8361        },
8362        {
8363                "JNE signed compare, test 4",
8364                .u.insns_int = {
8365                        BPF_LD_IMM64(R1, -17104896),
8366                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
8367                        BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
8368                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
8369                        BPF_EXIT_INSN(),
8370                },
8371                INTERNAL,
8372                { },
8373                { { 0, 2 } },
8374        },
8375        {
8376                "JNE signed compare, test 5",
8377                .u.insns_int = {
8378                        BPF_LD_IMM64(R1, 0xfefb0000),
8379                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
8380                        BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
8381                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
8382                        BPF_EXIT_INSN(),
8383                },
8384                INTERNAL,
8385                { },
8386                { { 0, 1 } },
8387        },
8388        {
8389                "JNE signed compare, test 6",
8390                .u.insns_int = {
8391                        BPF_LD_IMM64(R1, 0x7efb0000),
8392                        BPF_ALU32_IMM(BPF_MOV, R0, 1),
8393                        BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
8394                        BPF_ALU32_IMM(BPF_MOV, R0, 2),
8395                        BPF_EXIT_INSN(),
8396                },
8397                INTERNAL,
8398                { },
8399                { { 0, 2 } },
8400        },
8401        {
8402                "JNE signed compare, test 7",
8403                .u.insns = {
8404                        BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
8405                        BPF_STMT(BPF_MISC | BPF_TAX, 0),
8406                        BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
8407                        BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
8408                        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
8409                        BPF_STMT(BPF_RET | BPF_K, 1),
8410                        BPF_STMT(BPF_RET | BPF_K, 2),
8411                },
8412                CLASSIC | FLAG_NO_DATA,
8413                {},
8414                { { 0, 2 } },
8415        },
8416};
8417
8418static struct net_device dev;
8419
8420static struct sk_buff *populate_skb(char *buf, int size)
8421{
8422        struct sk_buff *skb;
8423
8424        if (size >= MAX_DATA)
8425                return NULL;
8426
8427        skb = alloc_skb(MAX_DATA, GFP_KERNEL);
8428        if (!skb)
8429                return NULL;
8430
8431        __skb_put_data(skb, buf, size);
8432
8433        /* Initialize a fake skb with test pattern. */
8434        skb_reset_mac_header(skb);
8435        skb->protocol = htons(ETH_P_IP);
8436        skb->pkt_type = SKB_TYPE;
8437        skb->mark = SKB_MARK;
8438        skb->hash = SKB_HASH;
8439        skb->queue_mapping = SKB_QUEUE_MAP;
8440        skb->vlan_tci = SKB_VLAN_TCI;
8441        skb->vlan_present = SKB_VLAN_PRESENT;
8442        skb->vlan_proto = htons(ETH_P_IP);
8443        dev_net_set(&dev, &init_net);
8444        skb->dev = &dev;
8445        skb->dev->ifindex = SKB_DEV_IFINDEX;
8446        skb->dev->type = SKB_DEV_TYPE;
8447        skb_set_network_header(skb, min(size, ETH_HLEN));
8448
8449        return skb;
8450}
8451
8452static void *generate_test_data(struct bpf_test *test, int sub)
8453{
8454        struct sk_buff *skb;
8455        struct page *page;
8456
8457        if (test->aux & FLAG_NO_DATA)
8458                return NULL;
8459
8460        /* Test case expects an skb, so populate one. Various
8461         * subtests generate skbs of different sizes based on
8462         * the same data.
8463         */
8464        skb = populate_skb(test->data, test->test[sub].data_size);
8465        if (!skb)
8466                return NULL;
8467
8468        if (test->aux & FLAG_SKB_FRAG) {
8469                /*
8470                 * when the test requires a fragmented skb, add a
8471                 * single fragment to the skb, filled with
8472                 * test->frag_data.
8473                 */
8474                void *ptr;
8475
8476                page = alloc_page(GFP_KERNEL);
8477
8478                if (!page)
8479                        goto err_kfree_skb;
8480
8481                ptr = kmap(page);
8482                if (!ptr)
8483                        goto err_free_page;
8484                memcpy(ptr, test->frag_data, MAX_DATA);
8485                kunmap(page);
8486                skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
8487        }
8488
8489        return skb;
8490
8491err_free_page:
8492        __free_page(page);
8493err_kfree_skb:
8494        kfree_skb(skb);
8495        return NULL;
8496}
8497
8498static void release_test_data(const struct bpf_test *test, void *data)
8499{
8500        if (test->aux & FLAG_NO_DATA)
8501                return;
8502
8503        kfree_skb(data);
8504}
8505
8506static int filter_length(int which)
8507{
8508        struct sock_filter *fp;
8509        int len;
8510
8511        if (tests[which].fill_helper)
8512                return tests[which].u.ptr.len;
8513
8514        fp = tests[which].u.insns;
8515        for (len = MAX_INSNS - 1; len > 0; --len)
8516                if (fp[len].code != 0 || fp[len].k != 0)
8517                        break;
8518
8519        return len + 1;
8520}
8521
8522static void *filter_pointer(int which)
8523{
8524        if (tests[which].fill_helper)
8525                return tests[which].u.ptr.insns;
8526        else
8527                return tests[which].u.insns;
8528}
8529
8530static struct bpf_prog *generate_filter(int which, int *err)
8531{
8532        __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
8533        unsigned int flen = filter_length(which);
8534        void *fptr = filter_pointer(which);
8535        struct sock_fprog_kern fprog;
8536        struct bpf_prog *fp;
8537
8538        switch (test_type) {
8539        case CLASSIC:
8540                fprog.filter = fptr;
8541                fprog.len = flen;
8542
8543                *err = bpf_prog_create(&fp, &fprog);
8544                if (tests[which].aux & FLAG_EXPECTED_FAIL) {
8545                        if (*err == tests[which].expected_errcode) {
8546                                pr_cont("PASS\n");
8547                                /* Verifier rejected filter as expected. */
8548                                *err = 0;
8549                                return NULL;
8550                        } else {
8551                                pr_cont("UNEXPECTED_PASS\n");
8552                                /* Verifier didn't reject the test that's
8553                                 * bad enough, just return!
8554                                 */
8555                                *err = -EINVAL;
8556                                return NULL;
8557                        }
8558                }
8559                if (*err) {
8560                        pr_cont("FAIL to prog_create err=%d len=%d\n",
8561                                *err, fprog.len);
8562                        return NULL;
8563                }
8564                break;
8565
8566        case INTERNAL:
8567                fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
8568                if (fp == NULL) {
8569                        pr_cont("UNEXPECTED_FAIL no memory left\n");
8570                        *err = -ENOMEM;
8571                        return NULL;
8572                }
8573
8574                fp->len = flen;
8575                /* Type doesn't really matter here as long as it's not unspec. */
8576                fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
8577                memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
8578                fp->aux->stack_depth = tests[which].stack_depth;
8579
8580                /* We cannot error here as we don't need type compatibility
8581                 * checks.
8582                 */
8583                fp = bpf_prog_select_runtime(fp, err);
8584                if (*err) {
8585                        pr_cont("FAIL to select_runtime err=%d\n", *err);
8586                        return NULL;
8587                }
8588                break;
8589        }
8590
8591        *err = 0;
8592        return fp;
8593}
8594
8595static void release_filter(struct bpf_prog *fp, int which)
8596{
8597        __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
8598
8599        switch (test_type) {
8600        case CLASSIC:
8601                bpf_prog_destroy(fp);
8602                break;
8603        case INTERNAL:
8604                bpf_prog_free(fp);
8605                break;
8606        }
8607}
8608
8609static int __run_one(const struct bpf_prog *fp, const void *data,
8610                     int runs, u64 *duration)
8611{
8612        u64 start, finish;
8613        int ret = 0, i;
8614
8615        migrate_disable();
8616        start = ktime_get_ns();
8617
8618        for (i = 0; i < runs; i++)
8619                ret = bpf_prog_run(fp, data);
8620
8621        finish = ktime_get_ns();
8622        migrate_enable();
8623
8624        *duration = finish - start;
8625        do_div(*duration, runs);
8626
8627        return ret;
8628}
8629
8630static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
8631{
8632        int err_cnt = 0, i, runs = MAX_TESTRUNS;
8633
8634        for (i = 0; i < MAX_SUBTESTS; i++) {
8635                void *data;
8636                u64 duration;
8637                u32 ret;
8638
8639                /*
8640                 * NOTE: Several sub-tests may be present, in which case
8641                 * a zero {data_size, result} tuple indicates the end of
8642                 * the sub-test array. The first test is always run,
8643                 * even if both data_size and result happen to be zero.
8644                 */
8645                if (i > 0 &&
8646                    test->test[i].data_size == 0 &&
8647                    test->test[i].result == 0)
8648                        break;
8649
8650                data = generate_test_data(test, i);
8651                if (!data && !(test->aux & FLAG_NO_DATA)) {
8652                        pr_cont("data generation failed ");
8653                        err_cnt++;
8654                        break;
8655                }
8656                ret = __run_one(fp, data, runs, &duration);
8657                release_test_data(test, data);
8658
8659                if (ret == test->test[i].result) {
8660                        pr_cont("%lld ", duration);
8661                } else {
8662                        pr_cont("ret %d != %d ", ret,
8663                                test->test[i].result);
8664                        err_cnt++;
8665                }
8666        }
8667
8668        return err_cnt;
8669}
8670
8671static char test_name[64];
8672module_param_string(test_name, test_name, sizeof(test_name), 0);
8673
8674static int test_id = -1;
8675module_param(test_id, int, 0);
8676
8677static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
8678module_param_array(test_range, int, NULL, 0);
8679
8680static __init int find_test_index(const char *test_name)
8681{
8682        int i;
8683
8684        for (i = 0; i < ARRAY_SIZE(tests); i++) {
8685                if (!strcmp(tests[i].descr, test_name))
8686                        return i;
8687        }
8688        return -1;
8689}
8690
8691static __init int prepare_bpf_tests(void)
8692{
8693        int i;
8694
8695        if (test_id >= 0) {
8696                /*
8697                 * if a test_id was specified, use test_range to
8698                 * cover only that test.
8699                 */
8700                if (test_id >= ARRAY_SIZE(tests)) {
8701                        pr_err("test_bpf: invalid test_id specified.\n");
8702                        return -EINVAL;
8703                }
8704
8705                test_range[0] = test_id;
8706                test_range[1] = test_id;
8707        } else if (*test_name) {
8708                /*
8709                 * if a test_name was specified, find it and setup
8710                 * test_range to cover only that test.
8711                 */
8712                int idx = find_test_index(test_name);
8713
8714                if (idx < 0) {
8715                        pr_err("test_bpf: no test named '%s' found.\n",
8716                               test_name);
8717                        return -EINVAL;
8718                }
8719                test_range[0] = idx;
8720                test_range[1] = idx;
8721        } else {
8722                /*
8723                 * check that the supplied test_range is valid.
8724                 */
8725                if (test_range[0] >= ARRAY_SIZE(tests) ||
8726                    test_range[1] >= ARRAY_SIZE(tests) ||
8727                    test_range[0] < 0 || test_range[1] < 0) {
8728                        pr_err("test_bpf: test_range is out of bound.\n");
8729                        return -EINVAL;
8730                }
8731
8732                if (test_range[1] < test_range[0]) {
8733                        pr_err("test_bpf: test_range is ending before it starts.\n");
8734                        return -EINVAL;
8735                }
8736        }
8737
8738        for (i = 0; i < ARRAY_SIZE(tests); i++) {
8739                if (tests[i].fill_helper &&
8740                    tests[i].fill_helper(&tests[i]) < 0)
8741                        return -ENOMEM;
8742        }
8743
8744        return 0;
8745}
8746
8747static __init void destroy_bpf_tests(void)
8748{
8749        int i;
8750
8751        for (i = 0; i < ARRAY_SIZE(tests); i++) {
8752                if (tests[i].fill_helper)
8753                        kfree(tests[i].u.ptr.insns);
8754        }
8755}
8756
8757static bool exclude_test(int test_id)
8758{
8759        return test_id < test_range[0] || test_id > test_range[1];
8760}
8761
8762static __init struct sk_buff *build_test_skb(void)
8763{
8764        u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
8765        struct sk_buff *skb[2];
8766        struct page *page[2];
8767        int i, data_size = 8;
8768
8769        for (i = 0; i < 2; i++) {
8770                page[i] = alloc_page(GFP_KERNEL);
8771                if (!page[i]) {
8772                        if (i == 0)
8773                                goto err_page0;
8774                        else
8775                                goto err_page1;
8776                }
8777
8778                /* this will set skb[i]->head_frag */
8779                skb[i] = dev_alloc_skb(headroom + data_size);
8780                if (!skb[i]) {
8781                        if (i == 0)
8782                                goto err_skb0;
8783                        else
8784                                goto err_skb1;
8785                }
8786
8787                skb_reserve(skb[i], headroom);
8788                skb_put(skb[i], data_size);
8789                skb[i]->protocol = htons(ETH_P_IP);
8790                skb_reset_network_header(skb[i]);
8791                skb_set_mac_header(skb[i], -ETH_HLEN);
8792
8793                skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
8794                // skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
8795        }
8796
8797        /* setup shinfo */
8798        skb_shinfo(skb[0])->gso_size = 1448;
8799        skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
8800        skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
8801        skb_shinfo(skb[0])->gso_segs = 0;
8802        skb_shinfo(skb[0])->frag_list = skb[1];
8803
8804        /* adjust skb[0]'s len */
8805        skb[0]->len += skb[1]->len;
8806        skb[0]->data_len += skb[1]->data_len;
8807        skb[0]->truesize += skb[1]->truesize;
8808
8809        return skb[0];
8810
8811err_skb1:
8812        __free_page(page[1]);
8813err_page1:
8814        kfree_skb(skb[0]);
8815err_skb0:
8816        __free_page(page[0]);
8817err_page0:
8818        return NULL;
8819}
8820
8821static __init struct sk_buff *build_test_skb_linear_no_head_frag(void)
8822{
8823        unsigned int alloc_size = 2000;
8824        unsigned int headroom = 102, doffset = 72, data_size = 1308;
8825        struct sk_buff *skb[2];
8826        int i;
8827
8828        /* skbs linked in a frag_list, both with linear data, with head_frag=0
8829         * (data allocated by kmalloc), both have tcp data of 1308 bytes
8830         * (total payload is 2616 bytes).
8831         * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom.
8832         */
8833        for (i = 0; i < 2; i++) {
8834                skb[i] = alloc_skb(alloc_size, GFP_KERNEL);
8835                if (!skb[i]) {
8836                        if (i == 0)
8837                                goto err_skb0;
8838                        else
8839                                goto err_skb1;
8840                }
8841
8842                skb[i]->protocol = htons(ETH_P_IPV6);
8843                skb_reserve(skb[i], headroom);
8844                skb_put(skb[i], doffset + data_size);
8845                skb_reset_network_header(skb[i]);
8846                if (i == 0)
8847                        skb_reset_mac_header(skb[i]);
8848                else
8849                        skb_set_mac_header(skb[i], -ETH_HLEN);
8850                __skb_pull(skb[i], doffset);
8851        }
8852
8853        /* setup shinfo.
8854         * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a
8855         * reduced gso_size.
8856         */
8857        skb_shinfo(skb[0])->gso_size = 1288;
8858        skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY;
8859        skb_shinfo(skb[0])->gso_segs = 0;
8860        skb_shinfo(skb[0])->frag_list = skb[1];
8861
8862        /* adjust skb[0]'s len */
8863        skb[0]->len += skb[1]->len;
8864        skb[0]->data_len += skb[1]->len;
8865        skb[0]->truesize += skb[1]->truesize;
8866
8867        return skb[0];
8868
8869err_skb1:
8870        kfree_skb(skb[0]);
8871err_skb0:
8872        return NULL;
8873}
8874
8875struct skb_segment_test {
8876        const char *descr;
8877        struct sk_buff *(*build_skb)(void);
8878        netdev_features_t features;
8879};
8880
8881static struct skb_segment_test skb_segment_tests[] __initconst = {
8882        {
8883                .descr = "gso_with_rx_frags",
8884                .build_skb = build_test_skb,
8885                .features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
8886                            NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM
8887        },
8888        {
8889                .descr = "gso_linear_no_head_frag",
8890                .build_skb = build_test_skb_linear_no_head_frag,
8891                .features = NETIF_F_SG | NETIF_F_FRAGLIST |
8892                            NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
8893                            NETIF_F_LLTX_BIT | NETIF_F_GRO |
8894                            NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
8895                            NETIF_F_HW_VLAN_STAG_TX_BIT
8896        }
8897};
8898
8899static __init int test_skb_segment_single(const struct skb_segment_test *test)
8900{
8901        struct sk_buff *skb, *segs;
8902        int ret = -1;
8903
8904        skb = test->build_skb();
8905        if (!skb) {
8906                pr_info("%s: failed to build_test_skb", __func__);
8907                goto done;
8908        }
8909
8910        segs = skb_segment(skb, test->features);
8911        if (!IS_ERR(segs)) {
8912                kfree_skb_list(segs);
8913                ret = 0;
8914        }
8915        kfree_skb(skb);
8916done:
8917        return ret;
8918}
8919
8920static __init int test_skb_segment(void)
8921{
8922        int i, err_cnt = 0, pass_cnt = 0;
8923
8924        for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
8925                const struct skb_segment_test *test = &skb_segment_tests[i];
8926
8927                pr_info("#%d %s ", i, test->descr);
8928
8929                if (test_skb_segment_single(test)) {
8930                        pr_cont("FAIL\n");
8931                        err_cnt++;
8932                } else {
8933                        pr_cont("PASS\n");
8934                        pass_cnt++;
8935                }
8936        }
8937
8938        pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__,
8939                pass_cnt, err_cnt);
8940        return err_cnt ? -EINVAL : 0;
8941}
8942
8943static __init int test_bpf(void)
8944{
8945        int i, err_cnt = 0, pass_cnt = 0;
8946        int jit_cnt = 0, run_cnt = 0;
8947
8948        for (i = 0; i < ARRAY_SIZE(tests); i++) {
8949                struct bpf_prog *fp;
8950                int err;
8951
8952                cond_resched();
8953                if (exclude_test(i))
8954                        continue;
8955
8956                pr_info("#%d %s ", i, tests[i].descr);
8957
8958                fp = generate_filter(i, &err);
8959                if (fp == NULL) {
8960                        if (err == 0) {
8961                                pass_cnt++;
8962                                continue;
8963                        }
8964                        err_cnt++;
8965                        continue;
8966                }
8967
8968                pr_cont("jited:%u ", fp->jited);
8969
8970                run_cnt++;
8971                if (fp->jited)
8972                        jit_cnt++;
8973
8974                err = run_one(fp, &tests[i]);
8975                release_filter(fp, i);
8976
8977                if (err) {
8978                        pr_cont("FAIL (%d times)\n", err);
8979                        err_cnt++;
8980                } else {
8981                        pr_cont("PASS\n");
8982                        pass_cnt++;
8983                }
8984        }
8985
8986        pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
8987                pass_cnt, err_cnt, jit_cnt, run_cnt);
8988
8989        return err_cnt ? -EINVAL : 0;
8990}
8991
8992struct tail_call_test {
8993        const char *descr;
8994        struct bpf_insn insns[MAX_INSNS];
8995        int result;
8996        int stack_depth;
8997};
8998
8999/*
9000 * Magic marker used in test snippets for tail calls below.
9001 * BPF_LD/MOV to R2 and R2 with this immediate value is replaced
9002 * with the proper values by the test runner.
9003 */
9004#define TAIL_CALL_MARKER 0x7a11ca11
9005
9006/* Special offset to indicate a NULL call target */
9007#define TAIL_CALL_NULL 0x7fff
9008
9009/* Special offset to indicate an out-of-range index */
9010#define TAIL_CALL_INVALID 0x7ffe
9011
9012#define TAIL_CALL(offset)                              \
9013        BPF_LD_IMM64(R2, TAIL_CALL_MARKER),            \
9014        BPF_RAW_INSN(BPF_ALU | BPF_MOV | BPF_K, R3, 0, \
9015                     offset, TAIL_CALL_MARKER),        \
9016        BPF_JMP_IMM(BPF_TAIL_CALL, 0, 0, 0)
9017
9018/*
9019 * Tail call tests. Each test case may call any other test in the table,
9020 * including itself, specified as a relative index offset from the calling
9021 * test. The index TAIL_CALL_NULL can be used to specify a NULL target
9022 * function to test the JIT error path. Similarly, the index TAIL_CALL_INVALID
9023 * results in a target index that is out of range.
9024 */
9025static struct tail_call_test tail_call_tests[] = {
9026        {
9027                "Tail call leaf",
9028                .insns = {
9029                        BPF_ALU64_REG(BPF_MOV, R0, R1),
9030                        BPF_ALU64_IMM(BPF_ADD, R0, 1),
9031                        BPF_EXIT_INSN(),
9032                },
9033                .result = 1,
9034        },
9035        {
9036                "Tail call 2",
9037                .insns = {
9038                        BPF_ALU64_IMM(BPF_ADD, R1, 2),
9039                        TAIL_CALL(-1),
9040                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
9041                        BPF_EXIT_INSN(),
9042                },
9043                .result = 3,
9044        },
9045        {
9046                "Tail call 3",
9047                .insns = {
9048                        BPF_ALU64_IMM(BPF_ADD, R1, 3),
9049                        TAIL_CALL(-1),
9050                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
9051                        BPF_EXIT_INSN(),
9052                },
9053                .result = 6,
9054        },
9055        {
9056                "Tail call 4",
9057                .insns = {
9058                        BPF_ALU64_IMM(BPF_ADD, R1, 4),
9059                        TAIL_CALL(-1),
9060                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
9061                        BPF_EXIT_INSN(),
9062                },
9063                .result = 10,
9064        },
9065        {
9066                "Tail call error path, max count reached",
9067                .insns = {
9068                        BPF_ALU64_IMM(BPF_ADD, R1, 1),
9069                        BPF_ALU64_REG(BPF_MOV, R0, R1),
9070                        TAIL_CALL(0),
9071                        BPF_EXIT_INSN(),
9072                },
9073                .result = MAX_TAIL_CALL_CNT + 1,
9074        },
9075        {
9076                "Tail call error path, NULL target",
9077                .insns = {
9078                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
9079                        TAIL_CALL(TAIL_CALL_NULL),
9080                        BPF_ALU64_IMM(BPF_MOV, R0, 1),
9081                        BPF_EXIT_INSN(),
9082                },
9083                .result = 1,
9084        },
9085        {
9086                "Tail call error path, index out of range",
9087                .insns = {
9088                        BPF_ALU64_IMM(BPF_MOV, R0, -1),
9089                        TAIL_CALL(TAIL_CALL_INVALID),
9090                        BPF_ALU64_IMM(BPF_MOV, R0, 1),
9091                        BPF_EXIT_INSN(),
9092                },
9093                .result = 1,
9094        },
9095};
9096
9097static void __init destroy_tail_call_tests(struct bpf_array *progs)
9098{
9099        int i;
9100
9101        for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++)
9102                if (progs->ptrs[i])
9103                        bpf_prog_free(progs->ptrs[i]);
9104        kfree(progs);
9105}
9106
9107static __init int prepare_tail_call_tests(struct bpf_array **pprogs)
9108{
9109        int ntests = ARRAY_SIZE(tail_call_tests);
9110        struct bpf_array *progs;
9111        int which, err;
9112
9113        /* Allocate the table of programs to be used for tall calls */
9114        progs = kzalloc(sizeof(*progs) + (ntests + 1) * sizeof(progs->ptrs[0]),
9115                        GFP_KERNEL);
9116        if (!progs)
9117                goto out_nomem;
9118
9119        /* Create all eBPF programs and populate the table */
9120        for (which = 0; which < ntests; which++) {
9121                struct tail_call_test *test = &tail_call_tests[which];
9122                struct bpf_prog *fp;
9123                int len, i;
9124
9125                /* Compute the number of program instructions */
9126                for (len = 0; len < MAX_INSNS; len++) {
9127                        struct bpf_insn *insn = &test->insns[len];
9128
9129                        if (len < MAX_INSNS - 1 &&
9130                            insn->code == (BPF_LD | BPF_DW | BPF_IMM))
9131                                len++;
9132                        if (insn->code == 0)
9133                                break;
9134                }
9135
9136                /* Allocate and initialize the program */
9137                fp = bpf_prog_alloc(bpf_prog_size(len), 0);
9138                if (!fp)
9139                        goto out_nomem;
9140
9141                fp->len = len;
9142                fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
9143                fp->aux->stack_depth = test->stack_depth;
9144                memcpy(fp->insnsi, test->insns, len * sizeof(struct bpf_insn));
9145
9146                /* Relocate runtime tail call offsets and addresses */
9147                for (i = 0; i < len; i++) {
9148                        struct bpf_insn *insn = &fp->insnsi[i];
9149
9150                        if (insn->imm != TAIL_CALL_MARKER)
9151                                continue;
9152
9153                        switch (insn->code) {
9154                        case BPF_LD | BPF_DW | BPF_IMM:
9155                                insn[0].imm = (u32)(long)progs;
9156                                insn[1].imm = ((u64)(long)progs) >> 32;
9157                                break;
9158
9159                        case BPF_ALU | BPF_MOV | BPF_K:
9160                                if (insn->off == TAIL_CALL_NULL)
9161                                        insn->imm = ntests;
9162                                else if (insn->off == TAIL_CALL_INVALID)
9163                                        insn->imm = ntests + 1;
9164                                else
9165                                        insn->imm = which + insn->off;
9166                                insn->off = 0;
9167                        }
9168                }
9169
9170                fp = bpf_prog_select_runtime(fp, &err);
9171                if (err)
9172                        goto out_err;
9173
9174                progs->ptrs[which] = fp;
9175        }
9176
9177        /* The last entry contains a NULL program pointer */
9178        progs->map.max_entries = ntests + 1;
9179        *pprogs = progs;
9180        return 0;
9181
9182out_nomem:
9183        err = -ENOMEM;
9184
9185out_err:
9186        if (progs)
9187                destroy_tail_call_tests(progs);
9188        return err;
9189}
9190
9191static __init int test_tail_calls(struct bpf_array *progs)
9192{
9193        int i, err_cnt = 0, pass_cnt = 0;
9194        int jit_cnt = 0, run_cnt = 0;
9195
9196        for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) {
9197                struct tail_call_test *test = &tail_call_tests[i];
9198                struct bpf_prog *fp = progs->ptrs[i];
9199                u64 duration;
9200                int ret;
9201
9202                cond_resched();
9203
9204                pr_info("#%d %s ", i, test->descr);
9205                if (!fp) {
9206                        err_cnt++;
9207                        continue;
9208                }
9209                pr_cont("jited:%u ", fp->jited);
9210
9211                run_cnt++;
9212                if (fp->jited)
9213                        jit_cnt++;
9214
9215                ret = __run_one(fp, NULL, MAX_TESTRUNS, &duration);
9216                if (ret == test->result) {
9217                        pr_cont("%lld PASS", duration);
9218                        pass_cnt++;
9219                } else {
9220                        pr_cont("ret %d != %d FAIL", ret, test->result);
9221                        err_cnt++;
9222                }
9223        }
9224
9225        pr_info("%s: Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
9226                __func__, pass_cnt, err_cnt, jit_cnt, run_cnt);
9227
9228        return err_cnt ? -EINVAL : 0;
9229}
9230
9231static int __init test_bpf_init(void)
9232{
9233        struct bpf_array *progs = NULL;
9234        int ret;
9235
9236        ret = prepare_bpf_tests();
9237        if (ret < 0)
9238                return ret;
9239
9240        ret = test_bpf();
9241        destroy_bpf_tests();
9242        if (ret)
9243                return ret;
9244
9245        ret = prepare_tail_call_tests(&progs);
9246        if (ret)
9247                return ret;
9248        ret = test_tail_calls(progs);
9249        destroy_tail_call_tests(progs);
9250        if (ret)
9251                return ret;
9252
9253        return test_skb_segment();
9254}
9255
9256static void __exit test_bpf_exit(void)
9257{
9258}
9259
9260module_init(test_bpf_init);
9261module_exit(test_bpf_exit);
9262
9263MODULE_LICENSE("GPL");
9264