0001 {
0002 "regalloc basic",
0003 .insns = {
0004 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0005 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0006 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0007 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0008 BPF_LD_MAP_FD(BPF_REG_1, 0),
0009 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0010 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
0011 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0012 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0013 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0014 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 20, 4),
0015 BPF_JMP_IMM(BPF_JSLT, BPF_REG_2, 0, 3),
0016 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
0017 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_2),
0018 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0019 BPF_EXIT_INSN(),
0020 },
0021 .fixup_map_hash_48b = { 4 },
0022 .result = ACCEPT,
0023 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0024 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0025 },
0026 {
0027 "regalloc negative",
0028 .insns = {
0029 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0030 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0031 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0032 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0033 BPF_LD_MAP_FD(BPF_REG_1, 0),
0034 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0035 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
0036 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0037 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0038 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0039 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 24, 4),
0040 BPF_JMP_IMM(BPF_JSLT, BPF_REG_2, 0, 3),
0041 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
0042 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_2),
0043 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_7, 0),
0044 BPF_EXIT_INSN(),
0045 },
0046 .fixup_map_hash_48b = { 4 },
0047 .result = REJECT,
0048 .errstr = "invalid access to map value, value_size=48 off=48 size=1",
0049 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0050 },
0051 {
0052 "regalloc src_reg mark",
0053 .insns = {
0054 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0055 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0056 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0057 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0058 BPF_LD_MAP_FD(BPF_REG_1, 0),
0059 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0060 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
0061 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0062 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0063 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0064 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 20, 5),
0065 BPF_MOV64_IMM(BPF_REG_3, 0),
0066 BPF_JMP_REG(BPF_JSGE, BPF_REG_3, BPF_REG_2, 3),
0067 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
0068 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_2),
0069 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0070 BPF_EXIT_INSN(),
0071 },
0072 .fixup_map_hash_48b = { 4 },
0073 .result = ACCEPT,
0074 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0075 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0076 },
0077 {
0078 "regalloc src_reg negative",
0079 .insns = {
0080 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0081 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0082 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0083 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0084 BPF_LD_MAP_FD(BPF_REG_1, 0),
0085 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0086 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
0087 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0088 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0089 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0090 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 22, 5),
0091 BPF_MOV64_IMM(BPF_REG_3, 0),
0092 BPF_JMP_REG(BPF_JSGE, BPF_REG_3, BPF_REG_2, 3),
0093 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
0094 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_2),
0095 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0096 BPF_EXIT_INSN(),
0097 },
0098 .fixup_map_hash_48b = { 4 },
0099 .result = REJECT,
0100 .errstr = "invalid access to map value, value_size=48 off=44 size=8",
0101 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0102 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0103 },
0104 {
0105 "regalloc and spill",
0106 .insns = {
0107 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0108 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0109 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0110 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0111 BPF_LD_MAP_FD(BPF_REG_1, 0),
0112 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0113 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
0114 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0115 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0116 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0117 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 20, 7),
0118
0119 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
0120 BPF_MOV64_IMM(BPF_REG_0, 0),
0121 BPF_MOV64_IMM(BPF_REG_2, 0),
0122 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -8),
0123 BPF_JMP_REG(BPF_JSGE, BPF_REG_0, BPF_REG_3, 2),
0124
0125 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_3),
0126 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0127 BPF_EXIT_INSN(),
0128 },
0129 .fixup_map_hash_48b = { 4 },
0130 .result = ACCEPT,
0131 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0132 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0133 },
0134 {
0135 "regalloc and spill negative",
0136 .insns = {
0137 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0138 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0139 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0140 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0141 BPF_LD_MAP_FD(BPF_REG_1, 0),
0142 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0143 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
0144 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0145 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0146 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0147 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 48, 7),
0148
0149 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
0150 BPF_MOV64_IMM(BPF_REG_0, 0),
0151 BPF_MOV64_IMM(BPF_REG_2, 0),
0152 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -8),
0153 BPF_JMP_REG(BPF_JSGE, BPF_REG_0, BPF_REG_3, 2),
0154
0155 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_3),
0156 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0157 BPF_EXIT_INSN(),
0158 },
0159 .fixup_map_hash_48b = { 4 },
0160 .result = REJECT,
0161 .errstr = "invalid access to map value, value_size=48 off=48 size=8",
0162 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0163 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0164 },
0165 {
0166 "regalloc three regs",
0167 .insns = {
0168 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0169 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0170 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0171 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0172 BPF_LD_MAP_FD(BPF_REG_1, 0),
0173 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0174 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
0175 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0176 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0177 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0178 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
0179 BPF_JMP_IMM(BPF_JSGT, BPF_REG_0, 12, 5),
0180 BPF_JMP_IMM(BPF_JSLT, BPF_REG_2, 0, 4),
0181 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
0182 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_2),
0183 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_4),
0184 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0185 BPF_EXIT_INSN(),
0186 },
0187 .fixup_map_hash_48b = { 4 },
0188 .result = ACCEPT,
0189 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0190 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0191 },
0192 {
0193 "regalloc after call",
0194 .insns = {
0195 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0196 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0197 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0198 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0199 BPF_LD_MAP_FD(BPF_REG_1, 0),
0200 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0201 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
0202 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0203 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0204 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
0205 BPF_MOV64_REG(BPF_REG_9, BPF_REG_0),
0206 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
0207 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 20, 4),
0208 BPF_JMP_IMM(BPF_JSLT, BPF_REG_9, 0, 3),
0209 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_8),
0210 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_9),
0211 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
0212 BPF_EXIT_INSN(),
0213 BPF_MOV64_IMM(BPF_REG_0, 0),
0214 BPF_EXIT_INSN(),
0215 },
0216 .fixup_map_hash_48b = { 4 },
0217 .result = ACCEPT,
0218 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0219 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0220 },
0221 {
0222 "regalloc in callee",
0223 .insns = {
0224 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0225 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0226 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0227 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0228 BPF_LD_MAP_FD(BPF_REG_1, 0),
0229 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0230 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0231 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0232 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0233 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0234 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0235 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
0236 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
0237 BPF_EXIT_INSN(),
0238 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 20, 5),
0239 BPF_JMP_IMM(BPF_JSLT, BPF_REG_2, 0, 4),
0240 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1),
0241 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
0242 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
0243 BPF_EXIT_INSN(),
0244 BPF_MOV64_IMM(BPF_REG_0, 0),
0245 BPF_EXIT_INSN(),
0246 },
0247 .fixup_map_hash_48b = { 4 },
0248 .result = ACCEPT,
0249 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0250 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0251 },
0252 {
0253 "regalloc, spill, JEQ",
0254 .insns = {
0255 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0256 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0257 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0258 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0259 BPF_LD_MAP_FD(BPF_REG_1, 0),
0260 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0261 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
0262 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 0),
0263
0264 BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
0265 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0266 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 20, 0),
0267
0268 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -8),
0269 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0, 1),
0270
0271 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
0272 BPF_EXIT_INSN(),
0273 },
0274 .fixup_map_hash_48b = { 4 },
0275 .result = ACCEPT,
0276 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0277 },