0001 {
0002 "ld_abs: check calling conv, r1",
0003 .insns = {
0004 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0005 BPF_MOV64_IMM(BPF_REG_1, 0),
0006 BPF_LD_ABS(BPF_W, -0x200000),
0007 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
0008 BPF_EXIT_INSN(),
0009 },
0010 .errstr = "R1 !read_ok",
0011 .result = REJECT,
0012 },
0013 {
0014 "ld_abs: check calling conv, r2",
0015 .insns = {
0016 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0017 BPF_MOV64_IMM(BPF_REG_2, 0),
0018 BPF_LD_ABS(BPF_W, -0x200000),
0019 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
0020 BPF_EXIT_INSN(),
0021 },
0022 .errstr = "R2 !read_ok",
0023 .result = REJECT,
0024 },
0025 {
0026 "ld_abs: check calling conv, r3",
0027 .insns = {
0028 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0029 BPF_MOV64_IMM(BPF_REG_3, 0),
0030 BPF_LD_ABS(BPF_W, -0x200000),
0031 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
0032 BPF_EXIT_INSN(),
0033 },
0034 .errstr = "R3 !read_ok",
0035 .result = REJECT,
0036 },
0037 {
0038 "ld_abs: check calling conv, r4",
0039 .insns = {
0040 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0041 BPF_MOV64_IMM(BPF_REG_4, 0),
0042 BPF_LD_ABS(BPF_W, -0x200000),
0043 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
0044 BPF_EXIT_INSN(),
0045 },
0046 .errstr = "R4 !read_ok",
0047 .result = REJECT,
0048 },
0049 {
0050 "ld_abs: check calling conv, r5",
0051 .insns = {
0052 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0053 BPF_MOV64_IMM(BPF_REG_5, 0),
0054 BPF_LD_ABS(BPF_W, -0x200000),
0055 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
0056 BPF_EXIT_INSN(),
0057 },
0058 .errstr = "R5 !read_ok",
0059 .result = REJECT,
0060 },
0061 {
0062 "ld_abs: check calling conv, r7",
0063 .insns = {
0064 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0065 BPF_MOV64_IMM(BPF_REG_7, 0),
0066 BPF_LD_ABS(BPF_W, -0x200000),
0067 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
0068 BPF_EXIT_INSN(),
0069 },
0070 .result = ACCEPT,
0071 },
0072 {
0073 "ld_abs: tests on r6 and skb data reload helper",
0074 .insns = {
0075 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0076 BPF_LD_ABS(BPF_B, 0),
0077 BPF_LD_ABS(BPF_H, 0),
0078 BPF_LD_ABS(BPF_W, 0),
0079 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
0080 BPF_MOV64_IMM(BPF_REG_6, 0),
0081 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
0082 BPF_MOV64_IMM(BPF_REG_2, 1),
0083 BPF_MOV64_IMM(BPF_REG_3, 2),
0084 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_vlan_push),
0085 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
0086 BPF_LD_ABS(BPF_B, 0),
0087 BPF_LD_ABS(BPF_H, 0),
0088 BPF_LD_ABS(BPF_W, 0),
0089 BPF_MOV64_IMM(BPF_REG_0, 42),
0090 BPF_EXIT_INSN(),
0091 },
0092 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0093 .result = ACCEPT,
0094 .retval = 42 ,
0095 },
0096 {
0097 "ld_abs: invalid op 1",
0098 .insns = {
0099 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0100 BPF_LD_ABS(BPF_DW, 0),
0101 BPF_EXIT_INSN(),
0102 },
0103 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0104 .result = REJECT,
0105 .errstr = "unknown opcode",
0106 },
0107 {
0108 "ld_abs: invalid op 2",
0109 .insns = {
0110 BPF_MOV32_IMM(BPF_REG_0, 256),
0111 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0112 BPF_LD_IND(BPF_DW, BPF_REG_0, 0),
0113 BPF_EXIT_INSN(),
0114 },
0115 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0116 .result = REJECT,
0117 .errstr = "unknown opcode",
0118 },
0119 {
0120 "ld_abs: nmap reduced",
0121 .insns = {
0122 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0123 BPF_LD_ABS(BPF_H, 12),
0124 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28),
0125 BPF_LD_ABS(BPF_H, 12),
0126 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26),
0127 BPF_MOV32_IMM(BPF_REG_0, 18),
0128 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64),
0129 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64),
0130 BPF_LD_IND(BPF_W, BPF_REG_7, 14),
0131 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60),
0132 BPF_MOV32_IMM(BPF_REG_0, 280971478),
0133 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56),
0134 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56),
0135 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60),
0136 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
0137 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15),
0138 BPF_LD_ABS(BPF_H, 12),
0139 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13),
0140 BPF_MOV32_IMM(BPF_REG_0, 22),
0141 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56),
0142 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56),
0143 BPF_LD_IND(BPF_H, BPF_REG_7, 14),
0144 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52),
0145 BPF_MOV32_IMM(BPF_REG_0, 17366),
0146 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48),
0147 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48),
0148 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52),
0149 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
0150 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0151 BPF_MOV32_IMM(BPF_REG_0, 256),
0152 BPF_EXIT_INSN(),
0153 BPF_MOV32_IMM(BPF_REG_0, 0),
0154 BPF_EXIT_INSN(),
0155 },
0156 .data = {
0157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0,
0158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0159 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
0160 },
0161 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0162 .result = ACCEPT,
0163 .retval = 256,
0164 },
0165 {
0166 "ld_abs: div + abs, test 1",
0167 .insns = {
0168 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
0169 BPF_LD_ABS(BPF_B, 3),
0170 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2),
0171 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2),
0172 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0),
0173 BPF_LD_ABS(BPF_B, 4),
0174 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
0175 BPF_LD_IND(BPF_B, BPF_REG_8, -70),
0176 BPF_EXIT_INSN(),
0177 },
0178 .data = {
0179 10, 20, 30, 40, 50,
0180 },
0181 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0182 .result = ACCEPT,
0183 .retval = 10,
0184 },
0185 {
0186 "ld_abs: div + abs, test 2",
0187 .insns = {
0188 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
0189 BPF_LD_ABS(BPF_B, 3),
0190 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2),
0191 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2),
0192 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0),
0193 BPF_LD_ABS(BPF_B, 128),
0194 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
0195 BPF_LD_IND(BPF_B, BPF_REG_8, -70),
0196 BPF_EXIT_INSN(),
0197 },
0198 .data = {
0199 10, 20, 30, 40, 50,
0200 },
0201 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0202 .result = ACCEPT,
0203 .retval = 0,
0204 },
0205 {
0206 "ld_abs: div + abs, test 3",
0207 .insns = {
0208 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
0209 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0),
0210 BPF_LD_ABS(BPF_B, 3),
0211 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7),
0212 BPF_EXIT_INSN(),
0213 },
0214 .data = {
0215 10, 20, 30, 40, 50,
0216 },
0217 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0218 .result = ACCEPT,
0219 .retval = 0,
0220 },
0221 {
0222 "ld_abs: div + abs, test 4",
0223 .insns = {
0224 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
0225 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0),
0226 BPF_LD_ABS(BPF_B, 256),
0227 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7),
0228 BPF_EXIT_INSN(),
0229 },
0230 .data = {
0231 10, 20, 30, 40, 50,
0232 },
0233 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0234 .result = ACCEPT,
0235 .retval = 0,
0236 },
0237 {
0238 "ld_abs: vlan + abs, test 1",
0239 .insns = { },
0240 .data = {
0241 0x34,
0242 },
0243 .fill_helper = bpf_fill_ld_abs_vlan_push_pop,
0244 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0245 .result = ACCEPT,
0246 .retval = 0xbef,
0247 },
0248 {
0249 "ld_abs: vlan + abs, test 2",
0250 .insns = {
0251 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0252 BPF_LD_ABS(BPF_B, 0),
0253 BPF_LD_ABS(BPF_H, 0),
0254 BPF_LD_ABS(BPF_W, 0),
0255 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
0256 BPF_MOV64_IMM(BPF_REG_6, 0),
0257 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
0258 BPF_MOV64_IMM(BPF_REG_2, 1),
0259 BPF_MOV64_IMM(BPF_REG_3, 2),
0260 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
0261 BPF_FUNC_skb_vlan_push),
0262 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
0263 BPF_LD_ABS(BPF_B, 0),
0264 BPF_LD_ABS(BPF_H, 0),
0265 BPF_LD_ABS(BPF_W, 0),
0266 BPF_MOV64_IMM(BPF_REG_0, 42),
0267 BPF_EXIT_INSN(),
0268 },
0269 .data = {
0270 0x34,
0271 },
0272 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0273 .result = ACCEPT,
0274 .retval = 42,
0275 },
0276 {
0277 "ld_abs: jump around ld_abs",
0278 .insns = { },
0279 .data = {
0280 10, 11,
0281 },
0282 .fill_helper = bpf_fill_jump_around_ld_abs,
0283 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0284 .result = ACCEPT,
0285 .retval = 10,
0286 },