140f2fbd5SJakub Kicinski { 240f2fbd5SJakub Kicinski "add+sub+mul", 340f2fbd5SJakub Kicinski .insns = { 440f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_1, 1), 540f2fbd5SJakub Kicinski BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 640f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_2, 3), 740f2fbd5SJakub Kicinski BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 840f2fbd5SJakub Kicinski BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 940f2fbd5SJakub Kicinski BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 1040f2fbd5SJakub Kicinski BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 1140f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 1240f2fbd5SJakub Kicinski }, 1340f2fbd5SJakub Kicinski .result = ACCEPT, 1440f2fbd5SJakub Kicinski .retval = -3, 1540f2fbd5SJakub Kicinski }, 1640f2fbd5SJakub Kicinski { 1740f2fbd5SJakub Kicinski "xor32 zero extend check", 1840f2fbd5SJakub Kicinski .insns = { 1940f2fbd5SJakub Kicinski BPF_MOV32_IMM(BPF_REG_2, -1), 2040f2fbd5SJakub Kicinski BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 2140f2fbd5SJakub Kicinski BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 2240f2fbd5SJakub Kicinski BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 2340f2fbd5SJakub Kicinski BPF_MOV32_IMM(BPF_REG_0, 2), 2440f2fbd5SJakub Kicinski BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 2540f2fbd5SJakub Kicinski BPF_MOV32_IMM(BPF_REG_0, 1), 2640f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 2740f2fbd5SJakub Kicinski }, 2840f2fbd5SJakub Kicinski .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2940f2fbd5SJakub Kicinski .result = ACCEPT, 3040f2fbd5SJakub Kicinski .retval = 1, 3140f2fbd5SJakub Kicinski }, 3240f2fbd5SJakub Kicinski { 3340f2fbd5SJakub Kicinski "arsh32 on imm", 3440f2fbd5SJakub Kicinski .insns = { 3540f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_0, 1), 3640f2fbd5SJakub Kicinski BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 3740f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 3840f2fbd5SJakub Kicinski }, 3940f2fbd5SJakub Kicinski .result = ACCEPT, 4040f2fbd5SJakub Kicinski .retval = 0, 4140f2fbd5SJakub Kicinski }, 4240f2fbd5SJakub Kicinski { 4340f2fbd5SJakub Kicinski "arsh32 on imm 2", 4440f2fbd5SJakub Kicinski .insns = { 4540f2fbd5SJakub Kicinski BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 4640f2fbd5SJakub Kicinski BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 4740f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 4840f2fbd5SJakub Kicinski }, 4940f2fbd5SJakub Kicinski .result = ACCEPT, 5040f2fbd5SJakub Kicinski .retval = -16069393, 5140f2fbd5SJakub Kicinski }, 5240f2fbd5SJakub Kicinski { 5340f2fbd5SJakub Kicinski "arsh32 on reg", 5440f2fbd5SJakub Kicinski .insns = { 5540f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_0, 1), 5640f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_1, 5), 5740f2fbd5SJakub Kicinski BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 5840f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 5940f2fbd5SJakub Kicinski }, 6040f2fbd5SJakub Kicinski .result = ACCEPT, 6140f2fbd5SJakub Kicinski .retval = 0, 6240f2fbd5SJakub Kicinski }, 6340f2fbd5SJakub Kicinski { 6440f2fbd5SJakub Kicinski "arsh32 on reg 2", 6540f2fbd5SJakub Kicinski .insns = { 6640f2fbd5SJakub Kicinski BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 6740f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_1, 15), 6840f2fbd5SJakub Kicinski BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 6940f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 7040f2fbd5SJakub Kicinski }, 7140f2fbd5SJakub Kicinski .result = ACCEPT, 7240f2fbd5SJakub Kicinski .retval = 43724, 7340f2fbd5SJakub Kicinski }, 7440f2fbd5SJakub Kicinski { 7540f2fbd5SJakub Kicinski "arsh64 on imm", 7640f2fbd5SJakub Kicinski .insns = { 7740f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_0, 1), 7840f2fbd5SJakub Kicinski BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 7940f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 8040f2fbd5SJakub Kicinski }, 8140f2fbd5SJakub Kicinski .result = ACCEPT, 8240f2fbd5SJakub Kicinski }, 8340f2fbd5SJakub Kicinski { 8440f2fbd5SJakub Kicinski "arsh64 on reg", 8540f2fbd5SJakub Kicinski .insns = { 8640f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_0, 1), 8740f2fbd5SJakub Kicinski BPF_MOV64_IMM(BPF_REG_1, 5), 8840f2fbd5SJakub Kicinski BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 8940f2fbd5SJakub Kicinski BPF_EXIT_INSN(), 9040f2fbd5SJakub Kicinski }, 9140f2fbd5SJakub Kicinski .result = ACCEPT, 9240f2fbd5SJakub Kicinski }, 9348729226SJakub Kicinski { 94ac8786c7SLuke Nelson "lsh64 by 0 imm", 95ac8786c7SLuke Nelson .insns = { 96ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_0, 1), 97ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_1, 1), 98ac8786c7SLuke Nelson BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0), 99ac8786c7SLuke Nelson BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 100ac8786c7SLuke Nelson BPF_MOV64_IMM(BPF_REG_0, 2), 101ac8786c7SLuke Nelson BPF_EXIT_INSN(), 102ac8786c7SLuke Nelson }, 103ac8786c7SLuke Nelson .result = ACCEPT, 104ac8786c7SLuke Nelson .retval = 1, 105ac8786c7SLuke Nelson }, 106ac8786c7SLuke Nelson { 107ac8786c7SLuke Nelson "rsh64 by 0 imm", 108ac8786c7SLuke Nelson .insns = { 109ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_0, 1), 110ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 111ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 112ac8786c7SLuke Nelson BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0), 113ac8786c7SLuke Nelson BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 114ac8786c7SLuke Nelson BPF_MOV64_IMM(BPF_REG_0, 2), 115ac8786c7SLuke Nelson BPF_EXIT_INSN(), 116ac8786c7SLuke Nelson }, 117ac8786c7SLuke Nelson .result = ACCEPT, 118ac8786c7SLuke Nelson .retval = 1, 119ac8786c7SLuke Nelson }, 120ac8786c7SLuke Nelson { 121ac8786c7SLuke Nelson "arsh64 by 0 imm", 122ac8786c7SLuke Nelson .insns = { 123ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_0, 1), 124ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 125ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 126ac8786c7SLuke Nelson BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0), 127ac8786c7SLuke Nelson BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 128ac8786c7SLuke Nelson BPF_MOV64_IMM(BPF_REG_0, 2), 129ac8786c7SLuke Nelson BPF_EXIT_INSN(), 130ac8786c7SLuke Nelson }, 131ac8786c7SLuke Nelson .result = ACCEPT, 132ac8786c7SLuke Nelson .retval = 1, 133ac8786c7SLuke Nelson }, 134ac8786c7SLuke Nelson { 135ac8786c7SLuke Nelson "lsh64 by 0 reg", 136ac8786c7SLuke Nelson .insns = { 137ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_0, 1), 138ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_1, 1), 139ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_2, 0), 140ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 141ac8786c7SLuke Nelson BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 142ac8786c7SLuke Nelson BPF_MOV64_IMM(BPF_REG_0, 2), 143ac8786c7SLuke Nelson BPF_EXIT_INSN(), 144ac8786c7SLuke Nelson }, 145ac8786c7SLuke Nelson .result = ACCEPT, 146ac8786c7SLuke Nelson .retval = 1, 147ac8786c7SLuke Nelson }, 148ac8786c7SLuke Nelson { 149ac8786c7SLuke Nelson "rsh64 by 0 reg", 150ac8786c7SLuke Nelson .insns = { 151ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_0, 1), 152ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 153ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 154ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_3, 0), 155ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3), 156ac8786c7SLuke Nelson BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 157ac8786c7SLuke Nelson BPF_MOV64_IMM(BPF_REG_0, 2), 158ac8786c7SLuke Nelson BPF_EXIT_INSN(), 159ac8786c7SLuke Nelson }, 160ac8786c7SLuke Nelson .result = ACCEPT, 161ac8786c7SLuke Nelson .retval = 1, 162ac8786c7SLuke Nelson }, 163ac8786c7SLuke Nelson { 164ac8786c7SLuke Nelson "arsh64 by 0 reg", 165ac8786c7SLuke Nelson .insns = { 166ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_0, 1), 167ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 168ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 169ac8786c7SLuke Nelson BPF_LD_IMM64(BPF_REG_3, 0), 170ac8786c7SLuke Nelson BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3), 171ac8786c7SLuke Nelson BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 172ac8786c7SLuke Nelson BPF_MOV64_IMM(BPF_REG_0, 2), 173ac8786c7SLuke Nelson BPF_EXIT_INSN(), 174ac8786c7SLuke Nelson }, 175ac8786c7SLuke Nelson .result = ACCEPT, 176ac8786c7SLuke Nelson .retval = 1, 177ac8786c7SLuke Nelson }, 178ac8786c7SLuke Nelson { 179*86180493SYonghong Song "invalid 64-bit BPF_END with BPF_TO_BE", 18048729226SJakub Kicinski .insns = { 18148729226SJakub Kicinski BPF_MOV32_IMM(BPF_REG_0, 0), 18248729226SJakub Kicinski { 183*86180493SYonghong Song .code = BPF_ALU64 | BPF_END | BPF_TO_BE, 18448729226SJakub Kicinski .dst_reg = BPF_REG_0, 18548729226SJakub Kicinski .src_reg = 0, 18648729226SJakub Kicinski .off = 0, 18748729226SJakub Kicinski .imm = 32, 18848729226SJakub Kicinski }, 18948729226SJakub Kicinski BPF_EXIT_INSN(), 19048729226SJakub Kicinski }, 191*86180493SYonghong Song .errstr = "unknown opcode df", 19248729226SJakub Kicinski .result = REJECT, 19348729226SJakub Kicinski }, 19448729226SJakub Kicinski { 19548729226SJakub Kicinski "mov64 src == dst", 19648729226SJakub Kicinski .insns = { 19748729226SJakub Kicinski BPF_MOV64_IMM(BPF_REG_2, 0), 19848729226SJakub Kicinski BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 19948729226SJakub Kicinski // Check bounds are OK 20048729226SJakub Kicinski BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 20148729226SJakub Kicinski BPF_MOV64_IMM(BPF_REG_0, 0), 20248729226SJakub Kicinski BPF_EXIT_INSN(), 20348729226SJakub Kicinski }, 20448729226SJakub Kicinski .prog_type = BPF_PROG_TYPE_SCHED_CLS, 20548729226SJakub Kicinski .result = ACCEPT, 20648729226SJakub Kicinski }, 20748729226SJakub Kicinski { 20848729226SJakub Kicinski "mov64 src != dst", 20948729226SJakub Kicinski .insns = { 21048729226SJakub Kicinski BPF_MOV64_IMM(BPF_REG_3, 0), 21148729226SJakub Kicinski BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 21248729226SJakub Kicinski // Check bounds are OK 21348729226SJakub Kicinski BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 21448729226SJakub Kicinski BPF_MOV64_IMM(BPF_REG_0, 0), 21548729226SJakub Kicinski BPF_EXIT_INSN(), 21648729226SJakub Kicinski }, 21748729226SJakub Kicinski .prog_type = BPF_PROG_TYPE_SCHED_CLS, 21848729226SJakub Kicinski .result = ACCEPT, 21948729226SJakub Kicinski }, 220