1*4882a593Smuzhiyun { 2*4882a593Smuzhiyun "ld_abs: check calling conv, r1", 3*4882a593Smuzhiyun .insns = { 4*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 5*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 0), 6*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, -0x200000), 7*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 8*4882a593Smuzhiyun BPF_EXIT_INSN(), 9*4882a593Smuzhiyun }, 10*4882a593Smuzhiyun .errstr = "R1 !read_ok", 11*4882a593Smuzhiyun .result = REJECT, 12*4882a593Smuzhiyun }, 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun "ld_abs: check calling conv, r2", 15*4882a593Smuzhiyun .insns = { 16*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 17*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 0), 18*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, -0x200000), 19*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 20*4882a593Smuzhiyun BPF_EXIT_INSN(), 21*4882a593Smuzhiyun }, 22*4882a593Smuzhiyun .errstr = "R2 !read_ok", 23*4882a593Smuzhiyun .result = REJECT, 24*4882a593Smuzhiyun }, 25*4882a593Smuzhiyun { 26*4882a593Smuzhiyun "ld_abs: check calling conv, r3", 27*4882a593Smuzhiyun .insns = { 28*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 29*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_3, 0), 30*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, -0x200000), 31*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 32*4882a593Smuzhiyun BPF_EXIT_INSN(), 33*4882a593Smuzhiyun }, 34*4882a593Smuzhiyun .errstr = "R3 !read_ok", 35*4882a593Smuzhiyun .result = REJECT, 36*4882a593Smuzhiyun }, 37*4882a593Smuzhiyun { 38*4882a593Smuzhiyun "ld_abs: check calling conv, r4", 39*4882a593Smuzhiyun .insns = { 40*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 41*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_4, 0), 42*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, -0x200000), 43*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 44*4882a593Smuzhiyun BPF_EXIT_INSN(), 45*4882a593Smuzhiyun }, 46*4882a593Smuzhiyun .errstr = "R4 !read_ok", 47*4882a593Smuzhiyun .result = REJECT, 48*4882a593Smuzhiyun }, 49*4882a593Smuzhiyun { 50*4882a593Smuzhiyun "ld_abs: check calling conv, r5", 51*4882a593Smuzhiyun .insns = { 52*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 53*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_5, 0), 54*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, -0x200000), 55*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 56*4882a593Smuzhiyun BPF_EXIT_INSN(), 57*4882a593Smuzhiyun }, 58*4882a593Smuzhiyun .errstr = "R5 !read_ok", 59*4882a593Smuzhiyun .result = REJECT, 60*4882a593Smuzhiyun }, 61*4882a593Smuzhiyun { 62*4882a593Smuzhiyun "ld_abs: check calling conv, r7", 63*4882a593Smuzhiyun .insns = { 64*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 65*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_7, 0), 66*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, -0x200000), 67*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 68*4882a593Smuzhiyun BPF_EXIT_INSN(), 69*4882a593Smuzhiyun }, 70*4882a593Smuzhiyun .result = ACCEPT, 71*4882a593Smuzhiyun }, 72*4882a593Smuzhiyun { 73*4882a593Smuzhiyun "ld_abs: tests on r6 and skb data reload helper", 74*4882a593Smuzhiyun .insns = { 75*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 76*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 0), 77*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 0), 78*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, 0), 79*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 80*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_6, 0), 81*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 82*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1), 83*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_3, 2), 84*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_vlan_push), 85*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 86*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 0), 87*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 0), 88*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, 0), 89*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 42), 90*4882a593Smuzhiyun BPF_EXIT_INSN(), 91*4882a593Smuzhiyun }, 92*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 93*4882a593Smuzhiyun .result = ACCEPT, 94*4882a593Smuzhiyun .retval = 42 /* ultimate return value */, 95*4882a593Smuzhiyun }, 96*4882a593Smuzhiyun { 97*4882a593Smuzhiyun "ld_abs: invalid op 1", 98*4882a593Smuzhiyun .insns = { 99*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 100*4882a593Smuzhiyun BPF_LD_ABS(BPF_DW, 0), 101*4882a593Smuzhiyun BPF_EXIT_INSN(), 102*4882a593Smuzhiyun }, 103*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 104*4882a593Smuzhiyun .result = REJECT, 105*4882a593Smuzhiyun .errstr = "unknown opcode", 106*4882a593Smuzhiyun }, 107*4882a593Smuzhiyun { 108*4882a593Smuzhiyun "ld_abs: invalid op 2", 109*4882a593Smuzhiyun .insns = { 110*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 256), 111*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 112*4882a593Smuzhiyun BPF_LD_IND(BPF_DW, BPF_REG_0, 0), 113*4882a593Smuzhiyun BPF_EXIT_INSN(), 114*4882a593Smuzhiyun }, 115*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 116*4882a593Smuzhiyun .result = REJECT, 117*4882a593Smuzhiyun .errstr = "unknown opcode", 118*4882a593Smuzhiyun }, 119*4882a593Smuzhiyun { 120*4882a593Smuzhiyun "ld_abs: nmap reduced", 121*4882a593Smuzhiyun .insns = { 122*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 123*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 12), 124*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28), 125*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 12), 126*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26), 127*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 18), 128*4882a593Smuzhiyun BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64), 129*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64), 130*4882a593Smuzhiyun BPF_LD_IND(BPF_W, BPF_REG_7, 14), 131*4882a593Smuzhiyun BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60), 132*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 280971478), 133*4882a593Smuzhiyun BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 134*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 135*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60), 136*4882a593Smuzhiyun BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 137*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15), 138*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 12), 139*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13), 140*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 22), 141*4882a593Smuzhiyun BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 142*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 143*4882a593Smuzhiyun BPF_LD_IND(BPF_H, BPF_REG_7, 14), 144*4882a593Smuzhiyun BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52), 145*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 17366), 146*4882a593Smuzhiyun BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48), 147*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48), 148*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52), 149*4882a593Smuzhiyun BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 150*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 151*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 256), 152*4882a593Smuzhiyun BPF_EXIT_INSN(), 153*4882a593Smuzhiyun BPF_MOV32_IMM(BPF_REG_0, 0), 154*4882a593Smuzhiyun BPF_EXIT_INSN(), 155*4882a593Smuzhiyun }, 156*4882a593Smuzhiyun .data = { 157*4882a593Smuzhiyun 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 158*4882a593Smuzhiyun 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159*4882a593Smuzhiyun 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 160*4882a593Smuzhiyun }, 161*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 162*4882a593Smuzhiyun .result = ACCEPT, 163*4882a593Smuzhiyun .retval = 256, 164*4882a593Smuzhiyun }, 165*4882a593Smuzhiyun { 166*4882a593Smuzhiyun "ld_abs: div + abs, test 1", 167*4882a593Smuzhiyun .insns = { 168*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 169*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 3), 170*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 171*4882a593Smuzhiyun BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 172*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 173*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 4), 174*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 175*4882a593Smuzhiyun BPF_LD_IND(BPF_B, BPF_REG_8, -70), 176*4882a593Smuzhiyun BPF_EXIT_INSN(), 177*4882a593Smuzhiyun }, 178*4882a593Smuzhiyun .data = { 179*4882a593Smuzhiyun 10, 20, 30, 40, 50, 180*4882a593Smuzhiyun }, 181*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 182*4882a593Smuzhiyun .result = ACCEPT, 183*4882a593Smuzhiyun .retval = 10, 184*4882a593Smuzhiyun }, 185*4882a593Smuzhiyun { 186*4882a593Smuzhiyun "ld_abs: div + abs, test 2", 187*4882a593Smuzhiyun .insns = { 188*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 189*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 3), 190*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 191*4882a593Smuzhiyun BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 192*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 193*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 128), 194*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 195*4882a593Smuzhiyun BPF_LD_IND(BPF_B, BPF_REG_8, -70), 196*4882a593Smuzhiyun BPF_EXIT_INSN(), 197*4882a593Smuzhiyun }, 198*4882a593Smuzhiyun .data = { 199*4882a593Smuzhiyun 10, 20, 30, 40, 50, 200*4882a593Smuzhiyun }, 201*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 202*4882a593Smuzhiyun .result = ACCEPT, 203*4882a593Smuzhiyun .retval = 0, 204*4882a593Smuzhiyun }, 205*4882a593Smuzhiyun { 206*4882a593Smuzhiyun "ld_abs: div + abs, test 3", 207*4882a593Smuzhiyun .insns = { 208*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 209*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 210*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 3), 211*4882a593Smuzhiyun BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 212*4882a593Smuzhiyun BPF_EXIT_INSN(), 213*4882a593Smuzhiyun }, 214*4882a593Smuzhiyun .data = { 215*4882a593Smuzhiyun 10, 20, 30, 40, 50, 216*4882a593Smuzhiyun }, 217*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 218*4882a593Smuzhiyun .result = ACCEPT, 219*4882a593Smuzhiyun .retval = 0, 220*4882a593Smuzhiyun }, 221*4882a593Smuzhiyun { 222*4882a593Smuzhiyun "ld_abs: div + abs, test 4", 223*4882a593Smuzhiyun .insns = { 224*4882a593Smuzhiyun BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 225*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 226*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 256), 227*4882a593Smuzhiyun BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 228*4882a593Smuzhiyun BPF_EXIT_INSN(), 229*4882a593Smuzhiyun }, 230*4882a593Smuzhiyun .data = { 231*4882a593Smuzhiyun 10, 20, 30, 40, 50, 232*4882a593Smuzhiyun }, 233*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 234*4882a593Smuzhiyun .result = ACCEPT, 235*4882a593Smuzhiyun .retval = 0, 236*4882a593Smuzhiyun }, 237*4882a593Smuzhiyun { 238*4882a593Smuzhiyun "ld_abs: vlan + abs, test 1", 239*4882a593Smuzhiyun .insns = { }, 240*4882a593Smuzhiyun .data = { 241*4882a593Smuzhiyun 0x34, 242*4882a593Smuzhiyun }, 243*4882a593Smuzhiyun .fill_helper = bpf_fill_ld_abs_vlan_push_pop, 244*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 245*4882a593Smuzhiyun .result = ACCEPT, 246*4882a593Smuzhiyun .retval = 0xbef, 247*4882a593Smuzhiyun }, 248*4882a593Smuzhiyun { 249*4882a593Smuzhiyun "ld_abs: vlan + abs, test 2", 250*4882a593Smuzhiyun .insns = { 251*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 252*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 0), 253*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 0), 254*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, 0), 255*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 256*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_6, 0), 257*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 258*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 1), 259*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_3, 2), 260*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 261*4882a593Smuzhiyun BPF_FUNC_skb_vlan_push), 262*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 263*4882a593Smuzhiyun BPF_LD_ABS(BPF_B, 0), 264*4882a593Smuzhiyun BPF_LD_ABS(BPF_H, 0), 265*4882a593Smuzhiyun BPF_LD_ABS(BPF_W, 0), 266*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 42), 267*4882a593Smuzhiyun BPF_EXIT_INSN(), 268*4882a593Smuzhiyun }, 269*4882a593Smuzhiyun .data = { 270*4882a593Smuzhiyun 0x34, 271*4882a593Smuzhiyun }, 272*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 273*4882a593Smuzhiyun .result = ACCEPT, 274*4882a593Smuzhiyun .retval = 42, 275*4882a593Smuzhiyun }, 276*4882a593Smuzhiyun { 277*4882a593Smuzhiyun "ld_abs: jump around ld_abs", 278*4882a593Smuzhiyun .insns = { }, 279*4882a593Smuzhiyun .data = { 280*4882a593Smuzhiyun 10, 11, 281*4882a593Smuzhiyun }, 282*4882a593Smuzhiyun .fill_helper = bpf_fill_jump_around_ld_abs, 283*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 284*4882a593Smuzhiyun .result = ACCEPT, 285*4882a593Smuzhiyun .retval = 10, 286*4882a593Smuzhiyun }, 287