1*4882a593Smuzhiyun /* This file contains sub-register zero extension checks for insns defining 2*4882a593Smuzhiyun * sub-registers, meaning: 3*4882a593Smuzhiyun * - All insns under BPF_ALU class. Their BPF_ALU32 variants or narrow width 4*4882a593Smuzhiyun * forms (BPF_END) could define sub-registers. 5*4882a593Smuzhiyun * - Narrow direct loads, BPF_B/H/W | BPF_LDX. 6*4882a593Smuzhiyun * - BPF_LD is not exposed to JIT back-ends, so no need for testing. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * "get_prandom_u32" is used to initialize low 32-bit of some registers to 9*4882a593Smuzhiyun * prevent potential optimizations done by verifier or JIT back-ends which could 10*4882a593Smuzhiyun * optimize register back into constant when range info shows one register is a 11*4882a593Smuzhiyun * constant. 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun "add32 reg zero extend check", 15*4882a593Smuzhiyun .insns = { 16*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 17*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 18*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL), 19*4882a593Smuzhiyun BPF_ALU32_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 20*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 21*4882a593Smuzhiyun BPF_EXIT_INSN(), 22*4882a593Smuzhiyun }, 23*4882a593Smuzhiyun .result = ACCEPT, 24*4882a593Smuzhiyun .retval = 0, 25*4882a593Smuzhiyun }, 26*4882a593Smuzhiyun { 27*4882a593Smuzhiyun "add32 imm zero extend check", 28*4882a593Smuzhiyun .insns = { 29*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 30*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 31*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 32*4882a593Smuzhiyun /* An insn could have no effect on the low 32-bit, for example: 33*4882a593Smuzhiyun * a = a + 0 34*4882a593Smuzhiyun * a = a | 0 35*4882a593Smuzhiyun * a = a & -1 36*4882a593Smuzhiyun * But, they should still zero high 32-bit. 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0), 39*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 40*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 41*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 42*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 43*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 44*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, -2), 45*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 46*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 47*4882a593Smuzhiyun BPF_EXIT_INSN(), 48*4882a593Smuzhiyun }, 49*4882a593Smuzhiyun .result = ACCEPT, 50*4882a593Smuzhiyun .retval = 0, 51*4882a593Smuzhiyun }, 52*4882a593Smuzhiyun { 53*4882a593Smuzhiyun "sub32 reg zero extend check", 54*4882a593Smuzhiyun .insns = { 55*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 56*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 57*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x1ffffffffULL), 58*4882a593Smuzhiyun BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 59*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 60*4882a593Smuzhiyun BPF_EXIT_INSN(), 61*4882a593Smuzhiyun }, 62*4882a593Smuzhiyun .result = ACCEPT, 63*4882a593Smuzhiyun .retval = 0, 64*4882a593Smuzhiyun }, 65*4882a593Smuzhiyun { 66*4882a593Smuzhiyun "sub32 imm zero extend check", 67*4882a593Smuzhiyun .insns = { 68*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 69*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 70*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 71*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_SUB, BPF_REG_0, 0), 72*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 73*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 74*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 75*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 76*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 77*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_SUB, BPF_REG_0, 1), 78*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 79*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 80*4882a593Smuzhiyun BPF_EXIT_INSN(), 81*4882a593Smuzhiyun }, 82*4882a593Smuzhiyun .result = ACCEPT, 83*4882a593Smuzhiyun .retval = 0, 84*4882a593Smuzhiyun }, 85*4882a593Smuzhiyun { 86*4882a593Smuzhiyun "mul32 reg zero extend check", 87*4882a593Smuzhiyun .insns = { 88*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 89*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 90*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x100000001ULL), 91*4882a593Smuzhiyun BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 92*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 93*4882a593Smuzhiyun BPF_EXIT_INSN(), 94*4882a593Smuzhiyun }, 95*4882a593Smuzhiyun .result = ACCEPT, 96*4882a593Smuzhiyun .retval = 0, 97*4882a593Smuzhiyun }, 98*4882a593Smuzhiyun { 99*4882a593Smuzhiyun "mul32 imm zero extend check", 100*4882a593Smuzhiyun .insns = { 101*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 102*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 103*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 104*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, 1), 105*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 106*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 107*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 108*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 109*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 110*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, -1), 111*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 112*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 113*4882a593Smuzhiyun BPF_EXIT_INSN(), 114*4882a593Smuzhiyun }, 115*4882a593Smuzhiyun .result = ACCEPT, 116*4882a593Smuzhiyun .retval = 0, 117*4882a593Smuzhiyun }, 118*4882a593Smuzhiyun { 119*4882a593Smuzhiyun "div32 reg zero extend check", 120*4882a593Smuzhiyun .insns = { 121*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 122*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 123*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, -1), 124*4882a593Smuzhiyun BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 125*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 126*4882a593Smuzhiyun BPF_EXIT_INSN(), 127*4882a593Smuzhiyun }, 128*4882a593Smuzhiyun .result = ACCEPT, 129*4882a593Smuzhiyun .retval = 0, 130*4882a593Smuzhiyun }, 131*4882a593Smuzhiyun { 132*4882a593Smuzhiyun "div32 imm zero extend check", 133*4882a593Smuzhiyun .insns = { 134*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 135*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 136*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 137*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, 1), 138*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 139*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 140*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 141*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 142*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 143*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, 2), 144*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 145*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 146*4882a593Smuzhiyun BPF_EXIT_INSN(), 147*4882a593Smuzhiyun }, 148*4882a593Smuzhiyun .result = ACCEPT, 149*4882a593Smuzhiyun .retval = 0, 150*4882a593Smuzhiyun }, 151*4882a593Smuzhiyun { 152*4882a593Smuzhiyun "or32 reg zero extend check", 153*4882a593Smuzhiyun .insns = { 154*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 155*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 156*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x100000001ULL), 157*4882a593Smuzhiyun BPF_ALU32_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 158*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 159*4882a593Smuzhiyun BPF_EXIT_INSN(), 160*4882a593Smuzhiyun }, 161*4882a593Smuzhiyun .result = ACCEPT, 162*4882a593Smuzhiyun .retval = 0, 163*4882a593Smuzhiyun }, 164*4882a593Smuzhiyun { 165*4882a593Smuzhiyun "or32 imm zero extend check", 166*4882a593Smuzhiyun .insns = { 167*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 168*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 169*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 170*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_OR, BPF_REG_0, 0), 171*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 172*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 173*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 174*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 175*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 176*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_OR, BPF_REG_0, 1), 177*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 178*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 179*4882a593Smuzhiyun BPF_EXIT_INSN(), 180*4882a593Smuzhiyun }, 181*4882a593Smuzhiyun .result = ACCEPT, 182*4882a593Smuzhiyun .retval = 0, 183*4882a593Smuzhiyun }, 184*4882a593Smuzhiyun { 185*4882a593Smuzhiyun "and32 reg zero extend check", 186*4882a593Smuzhiyun .insns = { 187*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 188*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL), 189*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_1, BPF_REG_0), 190*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x1ffffffffULL), 191*4882a593Smuzhiyun BPF_ALU32_REG(BPF_AND, BPF_REG_0, BPF_REG_1), 192*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 193*4882a593Smuzhiyun BPF_EXIT_INSN(), 194*4882a593Smuzhiyun }, 195*4882a593Smuzhiyun .result = ACCEPT, 196*4882a593Smuzhiyun .retval = 0, 197*4882a593Smuzhiyun }, 198*4882a593Smuzhiyun { 199*4882a593Smuzhiyun "and32 imm zero extend check", 200*4882a593Smuzhiyun .insns = { 201*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 202*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 203*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 204*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_AND, BPF_REG_0, -1), 205*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 206*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 207*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 208*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 209*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 210*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_AND, BPF_REG_0, -2), 211*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 212*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 213*4882a593Smuzhiyun BPF_EXIT_INSN(), 214*4882a593Smuzhiyun }, 215*4882a593Smuzhiyun .result = ACCEPT, 216*4882a593Smuzhiyun .retval = 0, 217*4882a593Smuzhiyun }, 218*4882a593Smuzhiyun { 219*4882a593Smuzhiyun "lsh32 reg zero extend check", 220*4882a593Smuzhiyun .insns = { 221*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 222*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL), 223*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 224*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 1), 225*4882a593Smuzhiyun BPF_ALU32_REG(BPF_LSH, BPF_REG_0, BPF_REG_1), 226*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 227*4882a593Smuzhiyun BPF_EXIT_INSN(), 228*4882a593Smuzhiyun }, 229*4882a593Smuzhiyun .result = ACCEPT, 230*4882a593Smuzhiyun .retval = 0, 231*4882a593Smuzhiyun }, 232*4882a593Smuzhiyun { 233*4882a593Smuzhiyun "lsh32 imm zero extend check", 234*4882a593Smuzhiyun .insns = { 235*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 236*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 237*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 238*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_LSH, BPF_REG_0, 0), 239*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 240*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 241*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 242*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 243*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 244*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_LSH, BPF_REG_0, 1), 245*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 246*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 247*4882a593Smuzhiyun BPF_EXIT_INSN(), 248*4882a593Smuzhiyun }, 249*4882a593Smuzhiyun .result = ACCEPT, 250*4882a593Smuzhiyun .retval = 0, 251*4882a593Smuzhiyun }, 252*4882a593Smuzhiyun { 253*4882a593Smuzhiyun "rsh32 reg zero extend check", 254*4882a593Smuzhiyun .insns = { 255*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 256*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 257*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 258*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 1), 259*4882a593Smuzhiyun BPF_ALU32_REG(BPF_RSH, BPF_REG_0, BPF_REG_1), 260*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 261*4882a593Smuzhiyun BPF_EXIT_INSN(), 262*4882a593Smuzhiyun }, 263*4882a593Smuzhiyun .result = ACCEPT, 264*4882a593Smuzhiyun .retval = 0, 265*4882a593Smuzhiyun }, 266*4882a593Smuzhiyun { 267*4882a593Smuzhiyun "rsh32 imm zero extend check", 268*4882a593Smuzhiyun .insns = { 269*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 270*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 271*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 272*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_RSH, BPF_REG_0, 0), 273*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 274*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 275*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 276*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 277*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 278*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_RSH, BPF_REG_0, 1), 279*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 280*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 281*4882a593Smuzhiyun BPF_EXIT_INSN(), 282*4882a593Smuzhiyun }, 283*4882a593Smuzhiyun .result = ACCEPT, 284*4882a593Smuzhiyun .retval = 0, 285*4882a593Smuzhiyun }, 286*4882a593Smuzhiyun { 287*4882a593Smuzhiyun "neg32 reg zero extend check", 288*4882a593Smuzhiyun .insns = { 289*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 290*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 291*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 292*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_NEG, BPF_REG_0, 0), 293*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 294*4882a593Smuzhiyun BPF_EXIT_INSN(), 295*4882a593Smuzhiyun }, 296*4882a593Smuzhiyun .result = ACCEPT, 297*4882a593Smuzhiyun .retval = 0, 298*4882a593Smuzhiyun }, 299*4882a593Smuzhiyun { 300*4882a593Smuzhiyun "mod32 reg zero extend check", 301*4882a593Smuzhiyun .insns = { 302*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 303*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 304*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, -1), 305*4882a593Smuzhiyun BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 306*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 307*4882a593Smuzhiyun BPF_EXIT_INSN(), 308*4882a593Smuzhiyun }, 309*4882a593Smuzhiyun .result = ACCEPT, 310*4882a593Smuzhiyun .retval = 0, 311*4882a593Smuzhiyun }, 312*4882a593Smuzhiyun { 313*4882a593Smuzhiyun "mod32 imm zero extend check", 314*4882a593Smuzhiyun .insns = { 315*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 316*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 317*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 318*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, 1), 319*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 320*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 321*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 322*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 323*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 324*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, 2), 325*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 326*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 327*4882a593Smuzhiyun BPF_EXIT_INSN(), 328*4882a593Smuzhiyun }, 329*4882a593Smuzhiyun .result = ACCEPT, 330*4882a593Smuzhiyun .retval = 0, 331*4882a593Smuzhiyun }, 332*4882a593Smuzhiyun { 333*4882a593Smuzhiyun "xor32 reg zero extend check", 334*4882a593Smuzhiyun .insns = { 335*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 336*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 337*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL), 338*4882a593Smuzhiyun BPF_ALU32_REG(BPF_XOR, BPF_REG_0, BPF_REG_1), 339*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 340*4882a593Smuzhiyun BPF_EXIT_INSN(), 341*4882a593Smuzhiyun }, 342*4882a593Smuzhiyun .result = ACCEPT, 343*4882a593Smuzhiyun .retval = 0, 344*4882a593Smuzhiyun }, 345*4882a593Smuzhiyun { 346*4882a593Smuzhiyun "xor32 imm zero extend check", 347*4882a593Smuzhiyun .insns = { 348*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 349*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 350*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 351*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_XOR, BPF_REG_0, 1), 352*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 353*4882a593Smuzhiyun BPF_EXIT_INSN(), 354*4882a593Smuzhiyun }, 355*4882a593Smuzhiyun .result = ACCEPT, 356*4882a593Smuzhiyun .retval = 0, 357*4882a593Smuzhiyun }, 358*4882a593Smuzhiyun { 359*4882a593Smuzhiyun "mov32 reg zero extend check", 360*4882a593Smuzhiyun .insns = { 361*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 362*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL), 363*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_1, BPF_REG_0), 364*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL), 365*4882a593Smuzhiyun BPF_MOV32_REG(BPF_REG_0, BPF_REG_1), 366*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 367*4882a593Smuzhiyun BPF_EXIT_INSN(), 368*4882a593Smuzhiyun }, 369*4882a593Smuzhiyun .result = ACCEPT, 370*4882a593Smuzhiyun .retval = 0, 371*4882a593Smuzhiyun }, 372*4882a593Smuzhiyun { 373*4882a593Smuzhiyun "mov32 imm zero extend check", 374*4882a593Smuzhiyun .insns = { 375*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 376*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 377*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 378*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 0), 379*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 380*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 381*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 382*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 383*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 384*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 1), 385*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 386*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 387*4882a593Smuzhiyun BPF_EXIT_INSN(), 388*4882a593Smuzhiyun }, 389*4882a593Smuzhiyun .result = ACCEPT, 390*4882a593Smuzhiyun .retval = 0, 391*4882a593Smuzhiyun }, 392*4882a593Smuzhiyun { 393*4882a593Smuzhiyun "arsh32 reg zero extend check", 394*4882a593Smuzhiyun .insns = { 395*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 396*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 397*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 398*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 1), 399*4882a593Smuzhiyun BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 400*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 401*4882a593Smuzhiyun BPF_EXIT_INSN(), 402*4882a593Smuzhiyun }, 403*4882a593Smuzhiyun .result = ACCEPT, 404*4882a593Smuzhiyun .retval = 0, 405*4882a593Smuzhiyun }, 406*4882a593Smuzhiyun { 407*4882a593Smuzhiyun "arsh32 imm zero extend check", 408*4882a593Smuzhiyun .insns = { 409*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 410*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 411*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 412*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 0), 413*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 414*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 415*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 416*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 417*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 418*4882a593Smuzhiyun BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 1), 419*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 420*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 421*4882a593Smuzhiyun BPF_EXIT_INSN(), 422*4882a593Smuzhiyun }, 423*4882a593Smuzhiyun .result = ACCEPT, 424*4882a593Smuzhiyun .retval = 0, 425*4882a593Smuzhiyun }, 426*4882a593Smuzhiyun { 427*4882a593Smuzhiyun "end16 (to_le) reg zero extend check", 428*4882a593Smuzhiyun .insns = { 429*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 430*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 431*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32), 432*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 433*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 434*4882a593Smuzhiyun BPF_ENDIAN(BPF_TO_LE, BPF_REG_0, 16), 435*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 436*4882a593Smuzhiyun BPF_EXIT_INSN(), 437*4882a593Smuzhiyun }, 438*4882a593Smuzhiyun .result = ACCEPT, 439*4882a593Smuzhiyun .retval = 0, 440*4882a593Smuzhiyun }, 441*4882a593Smuzhiyun { 442*4882a593Smuzhiyun "end32 (to_le) reg zero extend check", 443*4882a593Smuzhiyun .insns = { 444*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 445*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 446*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32), 447*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 448*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 449*4882a593Smuzhiyun BPF_ENDIAN(BPF_TO_LE, BPF_REG_0, 32), 450*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 451*4882a593Smuzhiyun BPF_EXIT_INSN(), 452*4882a593Smuzhiyun }, 453*4882a593Smuzhiyun .result = ACCEPT, 454*4882a593Smuzhiyun .retval = 0, 455*4882a593Smuzhiyun }, 456*4882a593Smuzhiyun { 457*4882a593Smuzhiyun "end16 (to_be) reg zero extend check", 458*4882a593Smuzhiyun .insns = { 459*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 460*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 461*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32), 462*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 463*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 464*4882a593Smuzhiyun BPF_ENDIAN(BPF_TO_BE, BPF_REG_0, 16), 465*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 466*4882a593Smuzhiyun BPF_EXIT_INSN(), 467*4882a593Smuzhiyun }, 468*4882a593Smuzhiyun .result = ACCEPT, 469*4882a593Smuzhiyun .retval = 0, 470*4882a593Smuzhiyun }, 471*4882a593Smuzhiyun { 472*4882a593Smuzhiyun "end32 (to_be) reg zero extend check", 473*4882a593Smuzhiyun .insns = { 474*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 475*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 476*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32), 477*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 478*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6), 479*4882a593Smuzhiyun BPF_ENDIAN(BPF_TO_BE, BPF_REG_0, 32), 480*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 481*4882a593Smuzhiyun BPF_EXIT_INSN(), 482*4882a593Smuzhiyun }, 483*4882a593Smuzhiyun .result = ACCEPT, 484*4882a593Smuzhiyun .retval = 0, 485*4882a593Smuzhiyun }, 486*4882a593Smuzhiyun { 487*4882a593Smuzhiyun "ldx_b zero extend check", 488*4882a593Smuzhiyun .insns = { 489*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_10), 490*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4), 491*4882a593Smuzhiyun BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c), 492*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 493*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 494*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 495*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0), 496*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 497*4882a593Smuzhiyun BPF_EXIT_INSN(), 498*4882a593Smuzhiyun }, 499*4882a593Smuzhiyun .result = ACCEPT, 500*4882a593Smuzhiyun .retval = 0, 501*4882a593Smuzhiyun }, 502*4882a593Smuzhiyun { 503*4882a593Smuzhiyun "ldx_h zero extend check", 504*4882a593Smuzhiyun .insns = { 505*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_10), 506*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4), 507*4882a593Smuzhiyun BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c), 508*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 509*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 510*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 511*4882a593Smuzhiyun BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_6, 0), 512*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 513*4882a593Smuzhiyun BPF_EXIT_INSN(), 514*4882a593Smuzhiyun }, 515*4882a593Smuzhiyun .result = ACCEPT, 516*4882a593Smuzhiyun .retval = 0, 517*4882a593Smuzhiyun }, 518*4882a593Smuzhiyun { 519*4882a593Smuzhiyun "ldx_w zero extend check", 520*4882a593Smuzhiyun .insns = { 521*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_10), 522*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4), 523*4882a593Smuzhiyun BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c), 524*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 525*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL), 526*4882a593Smuzhiyun BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1), 527*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0), 528*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32), 529*4882a593Smuzhiyun BPF_EXIT_INSN(), 530*4882a593Smuzhiyun }, 531*4882a593Smuzhiyun .result = ACCEPT, 532*4882a593Smuzhiyun .retval = 0, 533*4882a593Smuzhiyun }, 534