1*4882a593Smuzhiyun { 2*4882a593Smuzhiyun "add+sub+mul", 3*4882a593Smuzhiyun .insns = { 4*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 1), 5*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 6*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 3), 7*4882a593Smuzhiyun BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 8*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 9*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 10*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11*4882a593Smuzhiyun BPF_EXIT_INSN(), 12*4882a593Smuzhiyun }, 13*4882a593Smuzhiyun .result = ACCEPT, 14*4882a593Smuzhiyun .retval = -3, 15*4882a593Smuzhiyun }, 16*4882a593Smuzhiyun { 17*4882a593Smuzhiyun "xor32 zero extend check", 18*4882a593Smuzhiyun .insns = { 19*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_2, -1), 20*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 21*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 22*4882a593Smuzhiyun BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 23*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 2), 24*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 25*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 1), 26*4882a593Smuzhiyun BPF_EXIT_INSN(), 27*4882a593Smuzhiyun }, 28*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 29*4882a593Smuzhiyun .result = ACCEPT, 30*4882a593Smuzhiyun .retval = 1, 31*4882a593Smuzhiyun }, 32*4882a593Smuzhiyun { 33*4882a593Smuzhiyun "arsh32 on imm", 34*4882a593Smuzhiyun .insns = { 35*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1), 36*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 37*4882a593Smuzhiyun BPF_EXIT_INSN(), 38*4882a593Smuzhiyun }, 39*4882a593Smuzhiyun .result = ACCEPT, 40*4882a593Smuzhiyun .retval = 0, 41*4882a593Smuzhiyun }, 42*4882a593Smuzhiyun { 43*4882a593Smuzhiyun "arsh32 on imm 2", 44*4882a593Smuzhiyun .insns = { 45*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 46*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 47*4882a593Smuzhiyun BPF_EXIT_INSN(), 48*4882a593Smuzhiyun }, 49*4882a593Smuzhiyun .result = ACCEPT, 50*4882a593Smuzhiyun .retval = -16069393, 51*4882a593Smuzhiyun }, 52*4882a593Smuzhiyun { 53*4882a593Smuzhiyun "arsh32 on reg", 54*4882a593Smuzhiyun .insns = { 55*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1), 56*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 5), 57*4882a593Smuzhiyun BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 58*4882a593Smuzhiyun BPF_EXIT_INSN(), 59*4882a593Smuzhiyun }, 60*4882a593Smuzhiyun .result = ACCEPT, 61*4882a593Smuzhiyun .retval = 0, 62*4882a593Smuzhiyun }, 63*4882a593Smuzhiyun { 64*4882a593Smuzhiyun "arsh32 on reg 2", 65*4882a593Smuzhiyun .insns = { 66*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 67*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 15), 68*4882a593Smuzhiyun BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 69*4882a593Smuzhiyun BPF_EXIT_INSN(), 70*4882a593Smuzhiyun }, 71*4882a593Smuzhiyun .result = ACCEPT, 72*4882a593Smuzhiyun .retval = 43724, 73*4882a593Smuzhiyun }, 74*4882a593Smuzhiyun { 75*4882a593Smuzhiyun "arsh64 on imm", 76*4882a593Smuzhiyun .insns = { 77*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1), 78*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 79*4882a593Smuzhiyun BPF_EXIT_INSN(), 80*4882a593Smuzhiyun }, 81*4882a593Smuzhiyun .result = ACCEPT, 82*4882a593Smuzhiyun }, 83*4882a593Smuzhiyun { 84*4882a593Smuzhiyun "arsh64 on reg", 85*4882a593Smuzhiyun .insns = { 86*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1), 87*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 5), 88*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 89*4882a593Smuzhiyun BPF_EXIT_INSN(), 90*4882a593Smuzhiyun }, 91*4882a593Smuzhiyun .result = ACCEPT, 92*4882a593Smuzhiyun }, 93*4882a593Smuzhiyun { 94*4882a593Smuzhiyun "lsh64 by 0 imm", 95*4882a593Smuzhiyun .insns = { 96*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1), 97*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 1), 98*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0), 99*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 100*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 101*4882a593Smuzhiyun BPF_EXIT_INSN(), 102*4882a593Smuzhiyun }, 103*4882a593Smuzhiyun .result = ACCEPT, 104*4882a593Smuzhiyun .retval = 1, 105*4882a593Smuzhiyun }, 106*4882a593Smuzhiyun { 107*4882a593Smuzhiyun "rsh64 by 0 imm", 108*4882a593Smuzhiyun .insns = { 109*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1), 110*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 111*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 112*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0), 113*4882a593Smuzhiyun BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 114*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 115*4882a593Smuzhiyun BPF_EXIT_INSN(), 116*4882a593Smuzhiyun }, 117*4882a593Smuzhiyun .result = ACCEPT, 118*4882a593Smuzhiyun .retval = 1, 119*4882a593Smuzhiyun }, 120*4882a593Smuzhiyun { 121*4882a593Smuzhiyun "arsh64 by 0 imm", 122*4882a593Smuzhiyun .insns = { 123*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1), 124*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 125*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 126*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0), 127*4882a593Smuzhiyun BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 128*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 129*4882a593Smuzhiyun BPF_EXIT_INSN(), 130*4882a593Smuzhiyun }, 131*4882a593Smuzhiyun .result = ACCEPT, 132*4882a593Smuzhiyun .retval = 1, 133*4882a593Smuzhiyun }, 134*4882a593Smuzhiyun { 135*4882a593Smuzhiyun "lsh64 by 0 reg", 136*4882a593Smuzhiyun .insns = { 137*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1), 138*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 1), 139*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_2, 0), 140*4882a593Smuzhiyun BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 141*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 142*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 143*4882a593Smuzhiyun BPF_EXIT_INSN(), 144*4882a593Smuzhiyun }, 145*4882a593Smuzhiyun .result = ACCEPT, 146*4882a593Smuzhiyun .retval = 1, 147*4882a593Smuzhiyun }, 148*4882a593Smuzhiyun { 149*4882a593Smuzhiyun "rsh64 by 0 reg", 150*4882a593Smuzhiyun .insns = { 151*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1), 152*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 153*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 154*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_3, 0), 155*4882a593Smuzhiyun BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3), 156*4882a593Smuzhiyun BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 157*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 158*4882a593Smuzhiyun BPF_EXIT_INSN(), 159*4882a593Smuzhiyun }, 160*4882a593Smuzhiyun .result = ACCEPT, 161*4882a593Smuzhiyun .retval = 1, 162*4882a593Smuzhiyun }, 163*4882a593Smuzhiyun { 164*4882a593Smuzhiyun "arsh64 by 0 reg", 165*4882a593Smuzhiyun .insns = { 166*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 1), 167*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 168*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 169*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_3, 0), 170*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3), 171*4882a593Smuzhiyun BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 172*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 173*4882a593Smuzhiyun BPF_EXIT_INSN(), 174*4882a593Smuzhiyun }, 175*4882a593Smuzhiyun .result = ACCEPT, 176*4882a593Smuzhiyun .retval = 1, 177*4882a593Smuzhiyun }, 178*4882a593Smuzhiyun { 179*4882a593Smuzhiyun "invalid 64-bit BPF_END", 180*4882a593Smuzhiyun .insns = { 181*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 0), 182*4882a593Smuzhiyun { 183*4882a593Smuzhiyun .code = BPF_ALU64 | BPF_END | BPF_TO_LE, 184*4882a593Smuzhiyun .dst_reg = BPF_REG_0, 185*4882a593Smuzhiyun .src_reg = 0, 186*4882a593Smuzhiyun .off = 0, 187*4882a593Smuzhiyun .imm = 32, 188*4882a593Smuzhiyun }, 189*4882a593Smuzhiyun BPF_EXIT_INSN(), 190*4882a593Smuzhiyun }, 191*4882a593Smuzhiyun .errstr = "unknown opcode d7", 192*4882a593Smuzhiyun .result = REJECT, 193*4882a593Smuzhiyun }, 194*4882a593Smuzhiyun { 195*4882a593Smuzhiyun "mov64 src == dst", 196*4882a593Smuzhiyun .insns = { 197*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 0), 198*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 199*4882a593Smuzhiyun // Check bounds are OK 200*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 201*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 202*4882a593Smuzhiyun BPF_EXIT_INSN(), 203*4882a593Smuzhiyun }, 204*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 205*4882a593Smuzhiyun .result = ACCEPT, 206*4882a593Smuzhiyun }, 207*4882a593Smuzhiyun { 208*4882a593Smuzhiyun "mov64 src != dst", 209*4882a593Smuzhiyun .insns = { 210*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_3, 0), 211*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 212*4882a593Smuzhiyun // Check bounds are OK 213*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 214*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 215*4882a593Smuzhiyun BPF_EXIT_INSN(), 216*4882a593Smuzhiyun }, 217*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 218*4882a593Smuzhiyun .result = ACCEPT, 219*4882a593Smuzhiyun }, 220