1 {
2 	"helper access to map: full range",
3 	.insns = {
4 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
7 	BPF_LD_MAP_FD(BPF_REG_1, 0),
8 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
9 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
10 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
11 	BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
12 	BPF_MOV64_IMM(BPF_REG_3, 0),
13 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
14 	BPF_EXIT_INSN(),
15 	},
16 	.fixup_map_hash_48b = { 3 },
17 	.result = ACCEPT,
18 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
19 },
20 {
21 	"helper access to map: partial range",
22 	.insns = {
23 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
24 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
25 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
26 	BPF_LD_MAP_FD(BPF_REG_1, 0),
27 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
28 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
29 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
30 	BPF_MOV64_IMM(BPF_REG_2, 8),
31 	BPF_MOV64_IMM(BPF_REG_3, 0),
32 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
33 	BPF_EXIT_INSN(),
34 	},
35 	.fixup_map_hash_48b = { 3 },
36 	.result = ACCEPT,
37 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
38 },
39 {
40 	"helper access to map: empty range",
41 	.insns = {
42 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
43 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
44 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
45 	BPF_LD_MAP_FD(BPF_REG_1, 0),
46 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
47 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
48 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
49 	BPF_MOV64_IMM(BPF_REG_2, 0),
50 	BPF_EMIT_CALL(BPF_FUNC_trace_printk),
51 	BPF_EXIT_INSN(),
52 	},
53 	.fixup_map_hash_48b = { 3 },
54 	.errstr = "invalid access to map value, value_size=48 off=0 size=0",
55 	.result = REJECT,
56 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
57 },
58 {
59 	"helper access to map: out-of-bound range",
60 	.insns = {
61 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
62 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
63 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
64 	BPF_LD_MAP_FD(BPF_REG_1, 0),
65 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
66 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
67 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
68 	BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8),
69 	BPF_MOV64_IMM(BPF_REG_3, 0),
70 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
71 	BPF_EXIT_INSN(),
72 	},
73 	.fixup_map_hash_48b = { 3 },
74 	.errstr = "invalid access to map value, value_size=48 off=0 size=56",
75 	.result = REJECT,
76 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
77 },
78 {
79 	"helper access to map: negative range",
80 	.insns = {
81 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
82 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
83 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
84 	BPF_LD_MAP_FD(BPF_REG_1, 0),
85 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
86 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
87 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
88 	BPF_MOV64_IMM(BPF_REG_2, -8),
89 	BPF_MOV64_IMM(BPF_REG_3, 0),
90 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
91 	BPF_EXIT_INSN(),
92 	},
93 	.fixup_map_hash_48b = { 3 },
94 	.errstr = "R2 min value is negative",
95 	.result = REJECT,
96 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
97 },
98 {
99 	"helper access to adjusted map (via const imm): full range",
100 	.insns = {
101 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
102 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
103 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
104 	BPF_LD_MAP_FD(BPF_REG_1, 0),
105 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
106 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
107 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
108 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
109 	BPF_MOV64_IMM(BPF_REG_2,
110 		      sizeof(struct test_val) -	offsetof(struct test_val, foo)),
111 	BPF_MOV64_IMM(BPF_REG_3, 0),
112 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
113 	BPF_EXIT_INSN(),
114 	},
115 	.fixup_map_hash_48b = { 3 },
116 	.result = ACCEPT,
117 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
118 },
119 {
120 	"helper access to adjusted map (via const imm): partial range",
121 	.insns = {
122 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
123 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
124 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
125 	BPF_LD_MAP_FD(BPF_REG_1, 0),
126 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
127 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
128 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
129 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
130 	BPF_MOV64_IMM(BPF_REG_2, 8),
131 	BPF_MOV64_IMM(BPF_REG_3, 0),
132 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
133 	BPF_EXIT_INSN(),
134 	},
135 	.fixup_map_hash_48b = { 3 },
136 	.result = ACCEPT,
137 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
138 },
139 {
140 	"helper access to adjusted map (via const imm): empty range",
141 	.insns = {
142 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
143 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
144 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
145 	BPF_LD_MAP_FD(BPF_REG_1, 0),
146 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
147 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
148 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
149 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
150 	BPF_MOV64_IMM(BPF_REG_2, 0),
151 	BPF_EMIT_CALL(BPF_FUNC_trace_printk),
152 	BPF_EXIT_INSN(),
153 	},
154 	.fixup_map_hash_48b = { 3 },
155 	.errstr = "invalid access to map value, value_size=48 off=4 size=0",
156 	.result = REJECT,
157 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
158 },
159 {
160 	"helper access to adjusted map (via const imm): out-of-bound range",
161 	.insns = {
162 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
163 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
164 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
165 	BPF_LD_MAP_FD(BPF_REG_1, 0),
166 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
167 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
168 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
169 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
170 	BPF_MOV64_IMM(BPF_REG_2,
171 		      sizeof(struct test_val) - offsetof(struct test_val, foo) + 8),
172 	BPF_MOV64_IMM(BPF_REG_3, 0),
173 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
174 	BPF_EXIT_INSN(),
175 	},
176 	.fixup_map_hash_48b = { 3 },
177 	.errstr = "invalid access to map value, value_size=48 off=4 size=52",
178 	.result = REJECT,
179 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
180 },
181 {
182 	"helper access to adjusted map (via const imm): negative range (> adjustment)",
183 	.insns = {
184 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
185 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
186 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
187 	BPF_LD_MAP_FD(BPF_REG_1, 0),
188 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
189 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
190 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
191 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
192 	BPF_MOV64_IMM(BPF_REG_2, -8),
193 	BPF_MOV64_IMM(BPF_REG_3, 0),
194 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
195 	BPF_EXIT_INSN(),
196 	},
197 	.fixup_map_hash_48b = { 3 },
198 	.errstr = "R2 min value is negative",
199 	.result = REJECT,
200 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
201 },
202 {
203 	"helper access to adjusted map (via const imm): negative range (< adjustment)",
204 	.insns = {
205 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
206 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
207 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
208 	BPF_LD_MAP_FD(BPF_REG_1, 0),
209 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
210 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
211 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
212 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
213 	BPF_MOV64_IMM(BPF_REG_2, -1),
214 	BPF_MOV64_IMM(BPF_REG_3, 0),
215 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
216 	BPF_EXIT_INSN(),
217 	},
218 	.fixup_map_hash_48b = { 3 },
219 	.errstr = "R2 min value is negative",
220 	.result = REJECT,
221 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
222 },
223 {
224 	"helper access to adjusted map (via const reg): full range",
225 	.insns = {
226 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
227 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
228 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
229 	BPF_LD_MAP_FD(BPF_REG_1, 0),
230 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
231 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
232 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
233 	BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
234 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
235 	BPF_MOV64_IMM(BPF_REG_2,
236 		      sizeof(struct test_val) - offsetof(struct test_val, foo)),
237 	BPF_MOV64_IMM(BPF_REG_3, 0),
238 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
239 	BPF_EXIT_INSN(),
240 	},
241 	.fixup_map_hash_48b = { 3 },
242 	.result = ACCEPT,
243 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
244 },
245 {
246 	"helper access to adjusted map (via const reg): partial range",
247 	.insns = {
248 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
249 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
250 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
251 	BPF_LD_MAP_FD(BPF_REG_1, 0),
252 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
253 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
254 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
255 	BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
256 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
257 	BPF_MOV64_IMM(BPF_REG_2, 8),
258 	BPF_MOV64_IMM(BPF_REG_3, 0),
259 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
260 	BPF_EXIT_INSN(),
261 	},
262 	.fixup_map_hash_48b = { 3 },
263 	.result = ACCEPT,
264 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
265 },
266 {
267 	"helper access to adjusted map (via const reg): empty range",
268 	.insns = {
269 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
270 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
271 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
272 	BPF_LD_MAP_FD(BPF_REG_1, 0),
273 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
274 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
275 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
276 	BPF_MOV64_IMM(BPF_REG_3, 0),
277 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
278 	BPF_MOV64_IMM(BPF_REG_2, 0),
279 	BPF_EMIT_CALL(BPF_FUNC_trace_printk),
280 	BPF_EXIT_INSN(),
281 	},
282 	.fixup_map_hash_48b = { 3 },
283 	.errstr = "R1 min value is outside of the allowed memory range",
284 	.result = REJECT,
285 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
286 },
287 {
288 	"helper access to adjusted map (via const reg): out-of-bound range",
289 	.insns = {
290 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
291 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
292 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
293 	BPF_LD_MAP_FD(BPF_REG_1, 0),
294 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
295 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
296 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
297 	BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
298 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
299 	BPF_MOV64_IMM(BPF_REG_2,
300 		      sizeof(struct test_val) -
301 		      offsetof(struct test_val, foo) + 8),
302 	BPF_MOV64_IMM(BPF_REG_3, 0),
303 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
304 	BPF_EXIT_INSN(),
305 	},
306 	.fixup_map_hash_48b = { 3 },
307 	.errstr = "invalid access to map value, value_size=48 off=4 size=52",
308 	.result = REJECT,
309 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
310 },
311 {
312 	"helper access to adjusted map (via const reg): negative range (> adjustment)",
313 	.insns = {
314 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
315 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
316 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
317 	BPF_LD_MAP_FD(BPF_REG_1, 0),
318 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
319 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
320 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
321 	BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
322 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
323 	BPF_MOV64_IMM(BPF_REG_2, -8),
324 	BPF_MOV64_IMM(BPF_REG_3, 0),
325 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
326 	BPF_EXIT_INSN(),
327 	},
328 	.fixup_map_hash_48b = { 3 },
329 	.errstr = "R2 min value is negative",
330 	.result = REJECT,
331 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
332 },
333 {
334 	"helper access to adjusted map (via const reg): negative range (< adjustment)",
335 	.insns = {
336 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
337 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
338 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
339 	BPF_LD_MAP_FD(BPF_REG_1, 0),
340 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
341 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
342 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
343 	BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
344 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
345 	BPF_MOV64_IMM(BPF_REG_2, -1),
346 	BPF_MOV64_IMM(BPF_REG_3, 0),
347 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
348 	BPF_EXIT_INSN(),
349 	},
350 	.fixup_map_hash_48b = { 3 },
351 	.errstr = "R2 min value is negative",
352 	.result = REJECT,
353 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
354 },
355 {
356 	"helper access to adjusted map (via variable): full range",
357 	.insns = {
358 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
359 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
360 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
361 	BPF_LD_MAP_FD(BPF_REG_1, 0),
362 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
363 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
364 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
365 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
366 	BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
367 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
368 	BPF_MOV64_IMM(BPF_REG_2,
369 		      sizeof(struct test_val) - offsetof(struct test_val, foo)),
370 	BPF_MOV64_IMM(BPF_REG_3, 0),
371 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
372 	BPF_EXIT_INSN(),
373 	},
374 	.fixup_map_hash_48b = { 3 },
375 	.result = ACCEPT,
376 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
377 },
378 {
379 	"helper access to adjusted map (via variable): partial range",
380 	.insns = {
381 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
382 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
383 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
384 	BPF_LD_MAP_FD(BPF_REG_1, 0),
385 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
386 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
387 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
388 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
389 	BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
390 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
391 	BPF_MOV64_IMM(BPF_REG_2, 8),
392 	BPF_MOV64_IMM(BPF_REG_3, 0),
393 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
394 	BPF_EXIT_INSN(),
395 	},
396 	.fixup_map_hash_48b = { 3 },
397 	.result = ACCEPT,
398 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
399 },
400 {
401 	"helper access to adjusted map (via variable): empty range",
402 	.insns = {
403 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
404 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
405 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
406 	BPF_LD_MAP_FD(BPF_REG_1, 0),
407 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
408 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
409 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
410 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
411 	BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 3),
412 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
413 	BPF_MOV64_IMM(BPF_REG_2, 0),
414 	BPF_EMIT_CALL(BPF_FUNC_trace_printk),
415 	BPF_EXIT_INSN(),
416 	},
417 	.fixup_map_hash_48b = { 3 },
418 	.errstr = "R1 min value is outside of the allowed memory range",
419 	.result = REJECT,
420 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
421 },
422 {
423 	"helper access to adjusted map (via variable): no max check",
424 	.insns = {
425 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
426 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
427 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
428 	BPF_LD_MAP_FD(BPF_REG_1, 0),
429 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
430 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
431 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
432 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
433 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
434 	BPF_MOV64_IMM(BPF_REG_2, 1),
435 	BPF_MOV64_IMM(BPF_REG_3, 0),
436 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
437 	BPF_EXIT_INSN(),
438 	},
439 	.fixup_map_hash_48b = { 3 },
440 	.errstr = "R1 unbounded memory access",
441 	.result = REJECT,
442 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
443 },
444 {
445 	"helper access to adjusted map (via variable): wrong max check",
446 	.insns = {
447 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
448 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
449 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
450 	BPF_LD_MAP_FD(BPF_REG_1, 0),
451 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
452 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
453 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
454 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
455 	BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
456 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
457 	BPF_MOV64_IMM(BPF_REG_2,
458 		      sizeof(struct test_val) -
459 		      offsetof(struct test_val, foo) + 1),
460 	BPF_MOV64_IMM(BPF_REG_3, 0),
461 	BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
462 	BPF_EXIT_INSN(),
463 	},
464 	.fixup_map_hash_48b = { 3 },
465 	.errstr = "invalid access to map value, value_size=48 off=4 size=45",
466 	.result = REJECT,
467 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
468 },
469 {
470 	"helper access to map: bounds check using <, good access",
471 	.insns = {
472 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
473 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
474 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
475 	BPF_LD_MAP_FD(BPF_REG_1, 0),
476 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
477 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
478 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
479 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
480 	BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2),
481 	BPF_MOV64_IMM(BPF_REG_0, 0),
482 	BPF_EXIT_INSN(),
483 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
484 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
485 	BPF_MOV64_IMM(BPF_REG_0, 0),
486 	BPF_EXIT_INSN(),
487 	},
488 	.fixup_map_hash_48b = { 3 },
489 	.result = ACCEPT,
490 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
491 },
492 {
493 	"helper access to map: bounds check using <, bad access",
494 	.insns = {
495 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
496 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
497 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
498 	BPF_LD_MAP_FD(BPF_REG_1, 0),
499 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
500 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
501 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
502 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
503 	BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4),
504 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
505 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
506 	BPF_MOV64_IMM(BPF_REG_0, 0),
507 	BPF_EXIT_INSN(),
508 	BPF_MOV64_IMM(BPF_REG_0, 0),
509 	BPF_EXIT_INSN(),
510 	},
511 	.fixup_map_hash_48b = { 3 },
512 	.result = REJECT,
513 	.errstr = "R1 unbounded memory access",
514 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
515 },
516 {
517 	"helper access to map: bounds check using <=, good access",
518 	.insns = {
519 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
520 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
521 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
522 	BPF_LD_MAP_FD(BPF_REG_1, 0),
523 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
524 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
525 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
526 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
527 	BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2),
528 	BPF_MOV64_IMM(BPF_REG_0, 0),
529 	BPF_EXIT_INSN(),
530 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
531 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
532 	BPF_MOV64_IMM(BPF_REG_0, 0),
533 	BPF_EXIT_INSN(),
534 	},
535 	.fixup_map_hash_48b = { 3 },
536 	.result = ACCEPT,
537 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
538 },
539 {
540 	"helper access to map: bounds check using <=, bad access",
541 	.insns = {
542 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
543 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
544 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
545 	BPF_LD_MAP_FD(BPF_REG_1, 0),
546 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
547 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
548 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
549 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
550 	BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4),
551 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
552 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
553 	BPF_MOV64_IMM(BPF_REG_0, 0),
554 	BPF_EXIT_INSN(),
555 	BPF_MOV64_IMM(BPF_REG_0, 0),
556 	BPF_EXIT_INSN(),
557 	},
558 	.fixup_map_hash_48b = { 3 },
559 	.result = REJECT,
560 	.errstr = "R1 unbounded memory access",
561 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
562 },
563 {
564 	"helper access to map: bounds check using s<, good access",
565 	.insns = {
566 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
567 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
568 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
569 	BPF_LD_MAP_FD(BPF_REG_1, 0),
570 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
571 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
572 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
573 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
574 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
575 	BPF_MOV64_IMM(BPF_REG_0, 0),
576 	BPF_EXIT_INSN(),
577 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3),
578 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
579 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
580 	BPF_MOV64_IMM(BPF_REG_0, 0),
581 	BPF_EXIT_INSN(),
582 	},
583 	.fixup_map_hash_48b = { 3 },
584 	.result = ACCEPT,
585 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
586 },
587 {
588 	"helper access to map: bounds check using s<, good access 2",
589 	.insns = {
590 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
591 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
592 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
593 	BPF_LD_MAP_FD(BPF_REG_1, 0),
594 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
595 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
596 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
597 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
598 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
599 	BPF_MOV64_IMM(BPF_REG_0, 0),
600 	BPF_EXIT_INSN(),
601 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
602 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
603 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
604 	BPF_MOV64_IMM(BPF_REG_0, 0),
605 	BPF_EXIT_INSN(),
606 	},
607 	.fixup_map_hash_48b = { 3 },
608 	.result = ACCEPT,
609 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
610 },
611 {
612 	"helper access to map: bounds check using s<, bad access",
613 	.insns = {
614 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
615 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
616 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
617 	BPF_LD_MAP_FD(BPF_REG_1, 0),
618 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
619 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
620 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
621 	BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
622 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
623 	BPF_MOV64_IMM(BPF_REG_0, 0),
624 	BPF_EXIT_INSN(),
625 	BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
626 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
627 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
628 	BPF_MOV64_IMM(BPF_REG_0, 0),
629 	BPF_EXIT_INSN(),
630 	},
631 	.fixup_map_hash_48b = { 3 },
632 	.result = REJECT,
633 	.errstr = "R1 min value is negative",
634 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
635 },
636 {
637 	"helper access to map: bounds check using s<=, good access",
638 	.insns = {
639 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
640 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
641 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
642 	BPF_LD_MAP_FD(BPF_REG_1, 0),
643 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
644 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
645 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
646 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
647 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
648 	BPF_MOV64_IMM(BPF_REG_0, 0),
649 	BPF_EXIT_INSN(),
650 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3),
651 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
652 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
653 	BPF_MOV64_IMM(BPF_REG_0, 0),
654 	BPF_EXIT_INSN(),
655 	},
656 	.fixup_map_hash_48b = { 3 },
657 	.result = ACCEPT,
658 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
659 },
660 {
661 	"helper access to map: bounds check using s<=, good access 2",
662 	.insns = {
663 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
664 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
665 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
666 	BPF_LD_MAP_FD(BPF_REG_1, 0),
667 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
668 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
669 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
670 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
671 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
672 	BPF_MOV64_IMM(BPF_REG_0, 0),
673 	BPF_EXIT_INSN(),
674 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
675 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
676 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
677 	BPF_MOV64_IMM(BPF_REG_0, 0),
678 	BPF_EXIT_INSN(),
679 	},
680 	.fixup_map_hash_48b = { 3 },
681 	.result = ACCEPT,
682 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
683 },
684 {
685 	"helper access to map: bounds check using s<=, bad access",
686 	.insns = {
687 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
688 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
689 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
690 	BPF_LD_MAP_FD(BPF_REG_1, 0),
691 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
692 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
693 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
694 	BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
695 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
696 	BPF_MOV64_IMM(BPF_REG_0, 0),
697 	BPF_EXIT_INSN(),
698 	BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
699 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
700 	BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
701 	BPF_MOV64_IMM(BPF_REG_0, 0),
702 	BPF_EXIT_INSN(),
703 	},
704 	.fixup_map_hash_48b = { 3 },
705 	.result = REJECT,
706 	.errstr = "R1 min value is negative",
707 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
708 },
709 {
710 	"map lookup helper access to map",
711 	.insns = {
712 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
713 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
714 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
715 	BPF_LD_MAP_FD(BPF_REG_1, 0),
716 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
717 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
718 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
719 	BPF_LD_MAP_FD(BPF_REG_1, 0),
720 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
721 	BPF_EXIT_INSN(),
722 	},
723 	.fixup_map_hash_16b = { 3, 8 },
724 	.result = ACCEPT,
725 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
726 },
727 {
728 	"map update helper access to map",
729 	.insns = {
730 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
731 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
732 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
733 	BPF_LD_MAP_FD(BPF_REG_1, 0),
734 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
735 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
736 	BPF_MOV64_IMM(BPF_REG_4, 0),
737 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
738 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
739 	BPF_LD_MAP_FD(BPF_REG_1, 0),
740 	BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
741 	BPF_EXIT_INSN(),
742 	},
743 	.fixup_map_hash_16b = { 3, 10 },
744 	.result = ACCEPT,
745 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
746 },
747 {
748 	"map update helper access to map: wrong size",
749 	.insns = {
750 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
751 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
752 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
753 	BPF_LD_MAP_FD(BPF_REG_1, 0),
754 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
755 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
756 	BPF_MOV64_IMM(BPF_REG_4, 0),
757 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
758 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
759 	BPF_LD_MAP_FD(BPF_REG_1, 0),
760 	BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
761 	BPF_EXIT_INSN(),
762 	},
763 	.fixup_map_hash_8b = { 3 },
764 	.fixup_map_hash_16b = { 10 },
765 	.result = REJECT,
766 	.errstr = "invalid access to map value, value_size=8 off=0 size=16",
767 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
768 },
769 {
770 	"map helper access to adjusted map (via const imm)",
771 	.insns = {
772 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
773 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
774 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
775 	BPF_LD_MAP_FD(BPF_REG_1, 0),
776 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
777 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
778 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
779 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, offsetof(struct other_val, bar)),
780 	BPF_LD_MAP_FD(BPF_REG_1, 0),
781 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
782 	BPF_EXIT_INSN(),
783 	},
784 	.fixup_map_hash_16b = { 3, 9 },
785 	.result = ACCEPT,
786 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
787 },
788 {
789 	"map helper access to adjusted map (via const imm): out-of-bound 1",
790 	.insns = {
791 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
792 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
793 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
794 	BPF_LD_MAP_FD(BPF_REG_1, 0),
795 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
796 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
797 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
798 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, sizeof(struct other_val) - 4),
799 	BPF_LD_MAP_FD(BPF_REG_1, 0),
800 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
801 	BPF_EXIT_INSN(),
802 	},
803 	.fixup_map_hash_16b = { 3, 9 },
804 	.result = REJECT,
805 	.errstr = "invalid access to map value, value_size=16 off=12 size=8",
806 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
807 },
808 {
809 	"map helper access to adjusted map (via const imm): out-of-bound 2",
810 	.insns = {
811 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
812 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
813 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
814 	BPF_LD_MAP_FD(BPF_REG_1, 0),
815 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
816 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
817 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
818 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
819 	BPF_LD_MAP_FD(BPF_REG_1, 0),
820 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
821 	BPF_EXIT_INSN(),
822 	},
823 	.fixup_map_hash_16b = { 3, 9 },
824 	.result = REJECT,
825 	.errstr = "invalid access to map value, value_size=16 off=-4 size=8",
826 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
827 },
828 {
829 	"map helper access to adjusted map (via const reg)",
830 	.insns = {
831 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
832 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
833 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
834 	BPF_LD_MAP_FD(BPF_REG_1, 0),
835 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
836 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
837 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
838 	BPF_MOV64_IMM(BPF_REG_3, offsetof(struct other_val, bar)),
839 	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
840 	BPF_LD_MAP_FD(BPF_REG_1, 0),
841 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
842 	BPF_EXIT_INSN(),
843 	},
844 	.fixup_map_hash_16b = { 3, 10 },
845 	.result = ACCEPT,
846 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
847 },
848 {
849 	"map helper access to adjusted map (via const reg): out-of-bound 1",
850 	.insns = {
851 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
852 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
853 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
854 	BPF_LD_MAP_FD(BPF_REG_1, 0),
855 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
856 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
857 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
858 	BPF_MOV64_IMM(BPF_REG_3, sizeof(struct other_val) - 4),
859 	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
860 	BPF_LD_MAP_FD(BPF_REG_1, 0),
861 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
862 	BPF_EXIT_INSN(),
863 	},
864 	.fixup_map_hash_16b = { 3, 10 },
865 	.result = REJECT,
866 	.errstr = "invalid access to map value, value_size=16 off=12 size=8",
867 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
868 },
869 {
870 	"map helper access to adjusted map (via const reg): out-of-bound 2",
871 	.insns = {
872 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
873 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
874 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
875 	BPF_LD_MAP_FD(BPF_REG_1, 0),
876 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
877 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
878 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
879 	BPF_MOV64_IMM(BPF_REG_3, -4),
880 	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
881 	BPF_LD_MAP_FD(BPF_REG_1, 0),
882 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
883 	BPF_EXIT_INSN(),
884 	},
885 	.fixup_map_hash_16b = { 3, 10 },
886 	.result = REJECT,
887 	.errstr = "invalid access to map value, value_size=16 off=-4 size=8",
888 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
889 },
890 {
891 	"map helper access to adjusted map (via variable)",
892 	.insns = {
893 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
894 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
895 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
896 	BPF_LD_MAP_FD(BPF_REG_1, 0),
897 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
898 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
899 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
900 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
901 	BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct other_val, bar), 4),
902 	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
903 	BPF_LD_MAP_FD(BPF_REG_1, 0),
904 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
905 	BPF_EXIT_INSN(),
906 	},
907 	.fixup_map_hash_16b = { 3, 11 },
908 	.result = ACCEPT,
909 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
910 },
911 {
912 	"map helper access to adjusted map (via variable): no max check",
913 	.insns = {
914 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
915 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
916 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
917 	BPF_LD_MAP_FD(BPF_REG_1, 0),
918 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
919 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
920 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
921 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
922 	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
923 	BPF_LD_MAP_FD(BPF_REG_1, 0),
924 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
925 	BPF_EXIT_INSN(),
926 	},
927 	.fixup_map_hash_16b = { 3, 10 },
928 	.result = REJECT,
929 	.errstr = "R2 unbounded memory access, make sure to bounds check any such access",
930 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
931 },
932 {
933 	"map helper access to adjusted map (via variable): wrong max check",
934 	.insns = {
935 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
936 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
937 	BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
938 	BPF_LD_MAP_FD(BPF_REG_1, 0),
939 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
940 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
941 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
942 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
943 	BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct other_val, bar) + 1, 4),
944 	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
945 	BPF_LD_MAP_FD(BPF_REG_1, 0),
946 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
947 	BPF_EXIT_INSN(),
948 	},
949 	.fixup_map_hash_16b = { 3, 11 },
950 	.result = REJECT,
951 	.errstr = "invalid access to map value, value_size=16 off=9 size=8",
952 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
953 },
954