1 /*
2  * Testsuite for eBPF verifier
3  *
4  * Copyright (c) 2014 PLUMgrid, http://plumgrid.com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  */
10 
11 #include <asm/types.h>
12 #include <linux/types.h>
13 #include <stdint.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <unistd.h>
17 #include <errno.h>
18 #include <string.h>
19 #include <stddef.h>
20 #include <stdbool.h>
21 #include <sched.h>
22 
23 #include <sys/capability.h>
24 #include <sys/resource.h>
25 
26 #include <linux/unistd.h>
27 #include <linux/filter.h>
28 #include <linux/bpf_perf_event.h>
29 #include <linux/bpf.h>
30 
31 #include <bpf/bpf.h>
32 
33 #ifdef HAVE_GENHDR
34 # include "autoconf.h"
35 #else
36 # if defined(__i386) || defined(__x86_64) || defined(__s390x__) || defined(__aarch64__)
37 #  define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1
38 # endif
39 #endif
40 
41 #include "../../../include/linux/filter.h"
42 
43 #ifndef ARRAY_SIZE
44 # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
45 #endif
46 
47 #define MAX_INSNS	512
48 #define MAX_FIXUPS	8
49 #define MAX_NR_MAPS	4
50 
51 #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS	(1 << 0)
52 
53 struct bpf_test {
54 	const char *descr;
55 	struct bpf_insn	insns[MAX_INSNS];
56 	int fixup_map1[MAX_FIXUPS];
57 	int fixup_map2[MAX_FIXUPS];
58 	int fixup_prog[MAX_FIXUPS];
59 	int fixup_map_in_map[MAX_FIXUPS];
60 	const char *errstr;
61 	const char *errstr_unpriv;
62 	enum {
63 		UNDEF,
64 		ACCEPT,
65 		REJECT
66 	} result, result_unpriv;
67 	enum bpf_prog_type prog_type;
68 	uint8_t flags;
69 };
70 
71 /* Note we want this to be 64 bit aligned so that the end of our array is
72  * actually the end of the structure.
73  */
74 #define MAX_ENTRIES 11
75 
76 struct test_val {
77 	unsigned int index;
78 	int foo[MAX_ENTRIES];
79 };
80 
81 static struct bpf_test tests[] = {
82 	{
83 		"add+sub+mul",
84 		.insns = {
85 			BPF_MOV64_IMM(BPF_REG_1, 1),
86 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2),
87 			BPF_MOV64_IMM(BPF_REG_2, 3),
88 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2),
89 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1),
90 			BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3),
91 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
92 			BPF_EXIT_INSN(),
93 		},
94 		.result = ACCEPT,
95 	},
96 	{
97 		"unreachable",
98 		.insns = {
99 			BPF_EXIT_INSN(),
100 			BPF_EXIT_INSN(),
101 		},
102 		.errstr = "unreachable",
103 		.result = REJECT,
104 	},
105 	{
106 		"unreachable2",
107 		.insns = {
108 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
109 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
110 			BPF_EXIT_INSN(),
111 		},
112 		.errstr = "unreachable",
113 		.result = REJECT,
114 	},
115 	{
116 		"out of range jump",
117 		.insns = {
118 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
119 			BPF_EXIT_INSN(),
120 		},
121 		.errstr = "jump out of range",
122 		.result = REJECT,
123 	},
124 	{
125 		"out of range jump2",
126 		.insns = {
127 			BPF_JMP_IMM(BPF_JA, 0, 0, -2),
128 			BPF_EXIT_INSN(),
129 		},
130 		.errstr = "jump out of range",
131 		.result = REJECT,
132 	},
133 	{
134 		"test1 ld_imm64",
135 		.insns = {
136 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
137 			BPF_LD_IMM64(BPF_REG_0, 0),
138 			BPF_LD_IMM64(BPF_REG_0, 0),
139 			BPF_LD_IMM64(BPF_REG_0, 1),
140 			BPF_LD_IMM64(BPF_REG_0, 1),
141 			BPF_MOV64_IMM(BPF_REG_0, 2),
142 			BPF_EXIT_INSN(),
143 		},
144 		.errstr = "invalid BPF_LD_IMM insn",
145 		.errstr_unpriv = "R1 pointer comparison",
146 		.result = REJECT,
147 	},
148 	{
149 		"test2 ld_imm64",
150 		.insns = {
151 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
152 			BPF_LD_IMM64(BPF_REG_0, 0),
153 			BPF_LD_IMM64(BPF_REG_0, 0),
154 			BPF_LD_IMM64(BPF_REG_0, 1),
155 			BPF_LD_IMM64(BPF_REG_0, 1),
156 			BPF_EXIT_INSN(),
157 		},
158 		.errstr = "invalid BPF_LD_IMM insn",
159 		.errstr_unpriv = "R1 pointer comparison",
160 		.result = REJECT,
161 	},
162 	{
163 		"test3 ld_imm64",
164 		.insns = {
165 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
166 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
167 			BPF_LD_IMM64(BPF_REG_0, 0),
168 			BPF_LD_IMM64(BPF_REG_0, 0),
169 			BPF_LD_IMM64(BPF_REG_0, 1),
170 			BPF_LD_IMM64(BPF_REG_0, 1),
171 			BPF_EXIT_INSN(),
172 		},
173 		.errstr = "invalid bpf_ld_imm64 insn",
174 		.result = REJECT,
175 	},
176 	{
177 		"test4 ld_imm64",
178 		.insns = {
179 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
180 			BPF_EXIT_INSN(),
181 		},
182 		.errstr = "invalid bpf_ld_imm64 insn",
183 		.result = REJECT,
184 	},
185 	{
186 		"test5 ld_imm64",
187 		.insns = {
188 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
189 		},
190 		.errstr = "invalid bpf_ld_imm64 insn",
191 		.result = REJECT,
192 	},
193 	{
194 		"test6 ld_imm64",
195 		.insns = {
196 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
197 			BPF_RAW_INSN(0, 0, 0, 0, 0),
198 			BPF_EXIT_INSN(),
199 		},
200 		.result = ACCEPT,
201 	},
202 	{
203 		"test7 ld_imm64",
204 		.insns = {
205 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
206 			BPF_RAW_INSN(0, 0, 0, 0, 1),
207 			BPF_EXIT_INSN(),
208 		},
209 		.result = ACCEPT,
210 	},
211 	{
212 		"test8 ld_imm64",
213 		.insns = {
214 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 1, 1),
215 			BPF_RAW_INSN(0, 0, 0, 0, 1),
216 			BPF_EXIT_INSN(),
217 		},
218 		.errstr = "uses reserved fields",
219 		.result = REJECT,
220 	},
221 	{
222 		"test9 ld_imm64",
223 		.insns = {
224 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
225 			BPF_RAW_INSN(0, 0, 0, 1, 1),
226 			BPF_EXIT_INSN(),
227 		},
228 		.errstr = "invalid bpf_ld_imm64 insn",
229 		.result = REJECT,
230 	},
231 	{
232 		"test10 ld_imm64",
233 		.insns = {
234 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
235 			BPF_RAW_INSN(0, BPF_REG_1, 0, 0, 1),
236 			BPF_EXIT_INSN(),
237 		},
238 		.errstr = "invalid bpf_ld_imm64 insn",
239 		.result = REJECT,
240 	},
241 	{
242 		"test11 ld_imm64",
243 		.insns = {
244 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
245 			BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1),
246 			BPF_EXIT_INSN(),
247 		},
248 		.errstr = "invalid bpf_ld_imm64 insn",
249 		.result = REJECT,
250 	},
251 	{
252 		"test12 ld_imm64",
253 		.insns = {
254 			BPF_MOV64_IMM(BPF_REG_1, 0),
255 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1),
256 			BPF_RAW_INSN(0, 0, 0, 0, 1),
257 			BPF_EXIT_INSN(),
258 		},
259 		.errstr = "not pointing to valid bpf_map",
260 		.result = REJECT,
261 	},
262 	{
263 		"test13 ld_imm64",
264 		.insns = {
265 			BPF_MOV64_IMM(BPF_REG_1, 0),
266 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1),
267 			BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1),
268 			BPF_EXIT_INSN(),
269 		},
270 		.errstr = "invalid bpf_ld_imm64 insn",
271 		.result = REJECT,
272 	},
273 	{
274 		"no bpf_exit",
275 		.insns = {
276 			BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2),
277 		},
278 		.errstr = "jump out of range",
279 		.result = REJECT,
280 	},
281 	{
282 		"loop (back-edge)",
283 		.insns = {
284 			BPF_JMP_IMM(BPF_JA, 0, 0, -1),
285 			BPF_EXIT_INSN(),
286 		},
287 		.errstr = "back-edge",
288 		.result = REJECT,
289 	},
290 	{
291 		"loop2 (back-edge)",
292 		.insns = {
293 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
294 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
295 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
296 			BPF_JMP_IMM(BPF_JA, 0, 0, -4),
297 			BPF_EXIT_INSN(),
298 		},
299 		.errstr = "back-edge",
300 		.result = REJECT,
301 	},
302 	{
303 		"conditional loop",
304 		.insns = {
305 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
306 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
307 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
308 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3),
309 			BPF_EXIT_INSN(),
310 		},
311 		.errstr = "back-edge",
312 		.result = REJECT,
313 	},
314 	{
315 		"read uninitialized register",
316 		.insns = {
317 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
318 			BPF_EXIT_INSN(),
319 		},
320 		.errstr = "R2 !read_ok",
321 		.result = REJECT,
322 	},
323 	{
324 		"read invalid register",
325 		.insns = {
326 			BPF_MOV64_REG(BPF_REG_0, -1),
327 			BPF_EXIT_INSN(),
328 		},
329 		.errstr = "R15 is invalid",
330 		.result = REJECT,
331 	},
332 	{
333 		"program doesn't init R0 before exit",
334 		.insns = {
335 			BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
336 			BPF_EXIT_INSN(),
337 		},
338 		.errstr = "R0 !read_ok",
339 		.result = REJECT,
340 	},
341 	{
342 		"program doesn't init R0 before exit in all branches",
343 		.insns = {
344 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
345 			BPF_MOV64_IMM(BPF_REG_0, 1),
346 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
347 			BPF_EXIT_INSN(),
348 		},
349 		.errstr = "R0 !read_ok",
350 		.errstr_unpriv = "R1 pointer comparison",
351 		.result = REJECT,
352 	},
353 	{
354 		"stack out of bounds",
355 		.insns = {
356 			BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0),
357 			BPF_EXIT_INSN(),
358 		},
359 		.errstr = "invalid stack",
360 		.result = REJECT,
361 	},
362 	{
363 		"invalid call insn1",
364 		.insns = {
365 			BPF_RAW_INSN(BPF_JMP | BPF_CALL | BPF_X, 0, 0, 0, 0),
366 			BPF_EXIT_INSN(),
367 		},
368 		.errstr = "BPF_CALL uses reserved",
369 		.result = REJECT,
370 	},
371 	{
372 		"invalid call insn2",
373 		.insns = {
374 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 1, 0),
375 			BPF_EXIT_INSN(),
376 		},
377 		.errstr = "BPF_CALL uses reserved",
378 		.result = REJECT,
379 	},
380 	{
381 		"invalid function call",
382 		.insns = {
383 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1234567),
384 			BPF_EXIT_INSN(),
385 		},
386 		.errstr = "invalid func unknown#1234567",
387 		.result = REJECT,
388 	},
389 	{
390 		"uninitialized stack1",
391 		.insns = {
392 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
393 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
394 			BPF_LD_MAP_FD(BPF_REG_1, 0),
395 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
396 				     BPF_FUNC_map_lookup_elem),
397 			BPF_EXIT_INSN(),
398 		},
399 		.fixup_map1 = { 2 },
400 		.errstr = "invalid indirect read from stack",
401 		.result = REJECT,
402 	},
403 	{
404 		"uninitialized stack2",
405 		.insns = {
406 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
407 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -8),
408 			BPF_EXIT_INSN(),
409 		},
410 		.errstr = "invalid read from stack",
411 		.result = REJECT,
412 	},
413 	{
414 		"invalid fp arithmetic",
415 		/* If this gets ever changed, make sure JITs can deal with it. */
416 		.insns = {
417 			BPF_MOV64_IMM(BPF_REG_0, 0),
418 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
419 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 8),
420 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
421 			BPF_EXIT_INSN(),
422 		},
423 		.errstr_unpriv = "R1 pointer arithmetic",
424 		.result_unpriv = REJECT,
425 		.errstr = "R1 invalid mem access",
426 		.result = REJECT,
427 	},
428 	{
429 		"non-invalid fp arithmetic",
430 		.insns = {
431 			BPF_MOV64_IMM(BPF_REG_0, 0),
432 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
433 			BPF_EXIT_INSN(),
434 		},
435 		.result = ACCEPT,
436 	},
437 	{
438 		"invalid argument register",
439 		.insns = {
440 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
441 				     BPF_FUNC_get_cgroup_classid),
442 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
443 				     BPF_FUNC_get_cgroup_classid),
444 			BPF_EXIT_INSN(),
445 		},
446 		.errstr = "R1 !read_ok",
447 		.result = REJECT,
448 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
449 	},
450 	{
451 		"non-invalid argument register",
452 		.insns = {
453 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
454 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
455 				     BPF_FUNC_get_cgroup_classid),
456 			BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_6),
457 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
458 				     BPF_FUNC_get_cgroup_classid),
459 			BPF_EXIT_INSN(),
460 		},
461 		.result = ACCEPT,
462 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
463 	},
464 	{
465 		"check valid spill/fill",
466 		.insns = {
467 			/* spill R1(ctx) into stack */
468 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
469 			/* fill it back into R2 */
470 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8),
471 			/* should be able to access R0 = *(R2 + 8) */
472 			/* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */
473 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
474 			BPF_EXIT_INSN(),
475 		},
476 		.errstr_unpriv = "R0 leaks addr",
477 		.result = ACCEPT,
478 		.result_unpriv = REJECT,
479 	},
480 	{
481 		"check valid spill/fill, skb mark",
482 		.insns = {
483 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
484 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8),
485 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
486 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
487 				    offsetof(struct __sk_buff, mark)),
488 			BPF_EXIT_INSN(),
489 		},
490 		.result = ACCEPT,
491 		.result_unpriv = ACCEPT,
492 	},
493 	{
494 		"check corrupted spill/fill",
495 		.insns = {
496 			/* spill R1(ctx) into stack */
497 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
498 			/* mess up with R1 pointer on stack */
499 			BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23),
500 			/* fill back into R0 should fail */
501 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
502 			BPF_EXIT_INSN(),
503 		},
504 		.errstr_unpriv = "attempt to corrupt spilled",
505 		.errstr = "corrupted spill",
506 		.result = REJECT,
507 	},
508 	{
509 		"invalid src register in STX",
510 		.insns = {
511 			BPF_STX_MEM(BPF_B, BPF_REG_10, -1, -1),
512 			BPF_EXIT_INSN(),
513 		},
514 		.errstr = "R15 is invalid",
515 		.result = REJECT,
516 	},
517 	{
518 		"invalid dst register in STX",
519 		.insns = {
520 			BPF_STX_MEM(BPF_B, 14, BPF_REG_10, -1),
521 			BPF_EXIT_INSN(),
522 		},
523 		.errstr = "R14 is invalid",
524 		.result = REJECT,
525 	},
526 	{
527 		"invalid dst register in ST",
528 		.insns = {
529 			BPF_ST_MEM(BPF_B, 14, -1, -1),
530 			BPF_EXIT_INSN(),
531 		},
532 		.errstr = "R14 is invalid",
533 		.result = REJECT,
534 	},
535 	{
536 		"invalid src register in LDX",
537 		.insns = {
538 			BPF_LDX_MEM(BPF_B, BPF_REG_0, 12, 0),
539 			BPF_EXIT_INSN(),
540 		},
541 		.errstr = "R12 is invalid",
542 		.result = REJECT,
543 	},
544 	{
545 		"invalid dst register in LDX",
546 		.insns = {
547 			BPF_LDX_MEM(BPF_B, 11, BPF_REG_1, 0),
548 			BPF_EXIT_INSN(),
549 		},
550 		.errstr = "R11 is invalid",
551 		.result = REJECT,
552 	},
553 	{
554 		"junk insn",
555 		.insns = {
556 			BPF_RAW_INSN(0, 0, 0, 0, 0),
557 			BPF_EXIT_INSN(),
558 		},
559 		.errstr = "invalid BPF_LD_IMM",
560 		.result = REJECT,
561 	},
562 	{
563 		"junk insn2",
564 		.insns = {
565 			BPF_RAW_INSN(1, 0, 0, 0, 0),
566 			BPF_EXIT_INSN(),
567 		},
568 		.errstr = "BPF_LDX uses reserved fields",
569 		.result = REJECT,
570 	},
571 	{
572 		"junk insn3",
573 		.insns = {
574 			BPF_RAW_INSN(-1, 0, 0, 0, 0),
575 			BPF_EXIT_INSN(),
576 		},
577 		.errstr = "invalid BPF_ALU opcode f0",
578 		.result = REJECT,
579 	},
580 	{
581 		"junk insn4",
582 		.insns = {
583 			BPF_RAW_INSN(-1, -1, -1, -1, -1),
584 			BPF_EXIT_INSN(),
585 		},
586 		.errstr = "invalid BPF_ALU opcode f0",
587 		.result = REJECT,
588 	},
589 	{
590 		"junk insn5",
591 		.insns = {
592 			BPF_RAW_INSN(0x7f, -1, -1, -1, -1),
593 			BPF_EXIT_INSN(),
594 		},
595 		.errstr = "BPF_ALU uses reserved fields",
596 		.result = REJECT,
597 	},
598 	{
599 		"misaligned read from stack",
600 		.insns = {
601 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
602 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -4),
603 			BPF_EXIT_INSN(),
604 		},
605 		.errstr = "misaligned access",
606 		.result = REJECT,
607 	},
608 	{
609 		"invalid map_fd for function call",
610 		.insns = {
611 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
612 			BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10),
613 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
614 			BPF_LD_MAP_FD(BPF_REG_1, 0),
615 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
616 				     BPF_FUNC_map_delete_elem),
617 			BPF_EXIT_INSN(),
618 		},
619 		.errstr = "fd 0 is not pointing to valid bpf_map",
620 		.result = REJECT,
621 	},
622 	{
623 		"don't check return value before access",
624 		.insns = {
625 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
626 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
627 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
628 			BPF_LD_MAP_FD(BPF_REG_1, 0),
629 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
630 				     BPF_FUNC_map_lookup_elem),
631 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
632 			BPF_EXIT_INSN(),
633 		},
634 		.fixup_map1 = { 3 },
635 		.errstr = "R0 invalid mem access 'map_value_or_null'",
636 		.result = REJECT,
637 	},
638 	{
639 		"access memory with incorrect alignment",
640 		.insns = {
641 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
642 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
643 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
644 			BPF_LD_MAP_FD(BPF_REG_1, 0),
645 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
646 				     BPF_FUNC_map_lookup_elem),
647 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
648 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0),
649 			BPF_EXIT_INSN(),
650 		},
651 		.fixup_map1 = { 3 },
652 		.errstr = "misaligned access",
653 		.result = REJECT,
654 	},
655 	{
656 		"sometimes access memory with incorrect alignment",
657 		.insns = {
658 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
659 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
660 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
661 			BPF_LD_MAP_FD(BPF_REG_1, 0),
662 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
663 				     BPF_FUNC_map_lookup_elem),
664 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
665 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
666 			BPF_EXIT_INSN(),
667 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1),
668 			BPF_EXIT_INSN(),
669 		},
670 		.fixup_map1 = { 3 },
671 		.errstr = "R0 invalid mem access",
672 		.errstr_unpriv = "R0 leaks addr",
673 		.result = REJECT,
674 	},
675 	{
676 		"jump test 1",
677 		.insns = {
678 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
679 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -8),
680 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
681 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0),
682 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1),
683 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 1),
684 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 1),
685 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 2),
686 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 1),
687 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 3),
688 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 1),
689 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 4),
690 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1),
691 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 5),
692 			BPF_MOV64_IMM(BPF_REG_0, 0),
693 			BPF_EXIT_INSN(),
694 		},
695 		.errstr_unpriv = "R1 pointer comparison",
696 		.result_unpriv = REJECT,
697 		.result = ACCEPT,
698 	},
699 	{
700 		"jump test 2",
701 		.insns = {
702 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
703 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2),
704 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0),
705 			BPF_JMP_IMM(BPF_JA, 0, 0, 14),
706 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2),
707 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0),
708 			BPF_JMP_IMM(BPF_JA, 0, 0, 11),
709 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 2),
710 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0),
711 			BPF_JMP_IMM(BPF_JA, 0, 0, 8),
712 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2),
713 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0),
714 			BPF_JMP_IMM(BPF_JA, 0, 0, 5),
715 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 2),
716 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0),
717 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
718 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1),
719 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0),
720 			BPF_MOV64_IMM(BPF_REG_0, 0),
721 			BPF_EXIT_INSN(),
722 		},
723 		.errstr_unpriv = "R1 pointer comparison",
724 		.result_unpriv = REJECT,
725 		.result = ACCEPT,
726 	},
727 	{
728 		"jump test 3",
729 		.insns = {
730 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
731 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
732 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0),
733 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
734 			BPF_JMP_IMM(BPF_JA, 0, 0, 19),
735 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 3),
736 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0),
737 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
738 			BPF_JMP_IMM(BPF_JA, 0, 0, 15),
739 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 3),
740 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0),
741 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32),
742 			BPF_JMP_IMM(BPF_JA, 0, 0, 11),
743 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 3),
744 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0),
745 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -40),
746 			BPF_JMP_IMM(BPF_JA, 0, 0, 7),
747 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 3),
748 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0),
749 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48),
750 			BPF_JMP_IMM(BPF_JA, 0, 0, 3),
751 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 0),
752 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0),
753 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -56),
754 			BPF_LD_MAP_FD(BPF_REG_1, 0),
755 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
756 				     BPF_FUNC_map_delete_elem),
757 			BPF_EXIT_INSN(),
758 		},
759 		.fixup_map1 = { 24 },
760 		.errstr_unpriv = "R1 pointer comparison",
761 		.result_unpriv = REJECT,
762 		.result = ACCEPT,
763 	},
764 	{
765 		"jump test 4",
766 		.insns = {
767 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
768 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
769 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
770 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
771 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
772 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
773 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
774 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
775 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
776 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
777 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
778 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
779 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
780 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
781 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
782 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
783 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
784 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
785 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
786 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
787 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
788 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
789 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
790 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
791 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
792 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
793 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
794 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
795 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
796 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
797 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
798 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
799 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
800 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
801 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
802 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
803 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
804 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
805 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
806 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
807 			BPF_MOV64_IMM(BPF_REG_0, 0),
808 			BPF_EXIT_INSN(),
809 		},
810 		.errstr_unpriv = "R1 pointer comparison",
811 		.result_unpriv = REJECT,
812 		.result = ACCEPT,
813 	},
814 	{
815 		"jump test 5",
816 		.insns = {
817 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
818 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
819 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
820 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
821 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
822 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
823 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
824 			BPF_MOV64_IMM(BPF_REG_0, 0),
825 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
826 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
827 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
828 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
829 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
830 			BPF_MOV64_IMM(BPF_REG_0, 0),
831 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
832 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
833 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
834 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
835 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
836 			BPF_MOV64_IMM(BPF_REG_0, 0),
837 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
838 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
839 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
840 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
841 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
842 			BPF_MOV64_IMM(BPF_REG_0, 0),
843 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
844 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
845 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
846 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
847 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
848 			BPF_MOV64_IMM(BPF_REG_0, 0),
849 			BPF_EXIT_INSN(),
850 		},
851 		.errstr_unpriv = "R1 pointer comparison",
852 		.result_unpriv = REJECT,
853 		.result = ACCEPT,
854 	},
855 	{
856 		"access skb fields ok",
857 		.insns = {
858 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
859 				    offsetof(struct __sk_buff, len)),
860 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
861 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
862 				    offsetof(struct __sk_buff, mark)),
863 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
864 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
865 				    offsetof(struct __sk_buff, pkt_type)),
866 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
867 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
868 				    offsetof(struct __sk_buff, queue_mapping)),
869 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
870 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
871 				    offsetof(struct __sk_buff, protocol)),
872 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
873 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
874 				    offsetof(struct __sk_buff, vlan_present)),
875 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
876 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
877 				    offsetof(struct __sk_buff, vlan_tci)),
878 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
879 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
880 				    offsetof(struct __sk_buff, napi_id)),
881 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
882 			BPF_EXIT_INSN(),
883 		},
884 		.result = ACCEPT,
885 	},
886 	{
887 		"access skb fields bad1",
888 		.insns = {
889 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -4),
890 			BPF_EXIT_INSN(),
891 		},
892 		.errstr = "invalid bpf_context access",
893 		.result = REJECT,
894 	},
895 	{
896 		"access skb fields bad2",
897 		.insns = {
898 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 9),
899 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
900 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
901 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
902 			BPF_LD_MAP_FD(BPF_REG_1, 0),
903 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
904 				     BPF_FUNC_map_lookup_elem),
905 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
906 			BPF_EXIT_INSN(),
907 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
908 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
909 				    offsetof(struct __sk_buff, pkt_type)),
910 			BPF_EXIT_INSN(),
911 		},
912 		.fixup_map1 = { 4 },
913 		.errstr = "different pointers",
914 		.errstr_unpriv = "R1 pointer comparison",
915 		.result = REJECT,
916 	},
917 	{
918 		"access skb fields bad3",
919 		.insns = {
920 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
921 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
922 				    offsetof(struct __sk_buff, pkt_type)),
923 			BPF_EXIT_INSN(),
924 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
925 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
926 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
927 			BPF_LD_MAP_FD(BPF_REG_1, 0),
928 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
929 				     BPF_FUNC_map_lookup_elem),
930 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
931 			BPF_EXIT_INSN(),
932 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
933 			BPF_JMP_IMM(BPF_JA, 0, 0, -12),
934 		},
935 		.fixup_map1 = { 6 },
936 		.errstr = "different pointers",
937 		.errstr_unpriv = "R1 pointer comparison",
938 		.result = REJECT,
939 	},
940 	{
941 		"access skb fields bad4",
942 		.insns = {
943 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 3),
944 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
945 				    offsetof(struct __sk_buff, len)),
946 			BPF_MOV64_IMM(BPF_REG_0, 0),
947 			BPF_EXIT_INSN(),
948 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
949 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
950 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
951 			BPF_LD_MAP_FD(BPF_REG_1, 0),
952 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
953 				     BPF_FUNC_map_lookup_elem),
954 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
955 			BPF_EXIT_INSN(),
956 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
957 			BPF_JMP_IMM(BPF_JA, 0, 0, -13),
958 		},
959 		.fixup_map1 = { 7 },
960 		.errstr = "different pointers",
961 		.errstr_unpriv = "R1 pointer comparison",
962 		.result = REJECT,
963 	},
964 	{
965 		"check skb->mark is not writeable by sockets",
966 		.insns = {
967 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
968 				    offsetof(struct __sk_buff, mark)),
969 			BPF_EXIT_INSN(),
970 		},
971 		.errstr = "invalid bpf_context access",
972 		.errstr_unpriv = "R1 leaks addr",
973 		.result = REJECT,
974 	},
975 	{
976 		"check skb->tc_index is not writeable by sockets",
977 		.insns = {
978 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
979 				    offsetof(struct __sk_buff, tc_index)),
980 			BPF_EXIT_INSN(),
981 		},
982 		.errstr = "invalid bpf_context access",
983 		.errstr_unpriv = "R1 leaks addr",
984 		.result = REJECT,
985 	},
986 	{
987 		"check cb access: byte",
988 		.insns = {
989 			BPF_MOV64_IMM(BPF_REG_0, 0),
990 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
991 				    offsetof(struct __sk_buff, cb[0])),
992 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
993 				    offsetof(struct __sk_buff, cb[0]) + 1),
994 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
995 				    offsetof(struct __sk_buff, cb[0]) + 2),
996 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
997 				    offsetof(struct __sk_buff, cb[0]) + 3),
998 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
999 				    offsetof(struct __sk_buff, cb[1])),
1000 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1001 				    offsetof(struct __sk_buff, cb[1]) + 1),
1002 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1003 				    offsetof(struct __sk_buff, cb[1]) + 2),
1004 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1005 				    offsetof(struct __sk_buff, cb[1]) + 3),
1006 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1007 				    offsetof(struct __sk_buff, cb[2])),
1008 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1009 				    offsetof(struct __sk_buff, cb[2]) + 1),
1010 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1011 				    offsetof(struct __sk_buff, cb[2]) + 2),
1012 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1013 				    offsetof(struct __sk_buff, cb[2]) + 3),
1014 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1015 				    offsetof(struct __sk_buff, cb[3])),
1016 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1017 				    offsetof(struct __sk_buff, cb[3]) + 1),
1018 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1019 				    offsetof(struct __sk_buff, cb[3]) + 2),
1020 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1021 				    offsetof(struct __sk_buff, cb[3]) + 3),
1022 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1023 				    offsetof(struct __sk_buff, cb[4])),
1024 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1025 				    offsetof(struct __sk_buff, cb[4]) + 1),
1026 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1027 				    offsetof(struct __sk_buff, cb[4]) + 2),
1028 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1029 				    offsetof(struct __sk_buff, cb[4]) + 3),
1030 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1031 				    offsetof(struct __sk_buff, cb[0])),
1032 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1033 				    offsetof(struct __sk_buff, cb[0]) + 1),
1034 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1035 				    offsetof(struct __sk_buff, cb[0]) + 2),
1036 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1037 				    offsetof(struct __sk_buff, cb[0]) + 3),
1038 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1039 				    offsetof(struct __sk_buff, cb[1])),
1040 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1041 				    offsetof(struct __sk_buff, cb[1]) + 1),
1042 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1043 				    offsetof(struct __sk_buff, cb[1]) + 2),
1044 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1045 				    offsetof(struct __sk_buff, cb[1]) + 3),
1046 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1047 				    offsetof(struct __sk_buff, cb[2])),
1048 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1049 				    offsetof(struct __sk_buff, cb[2]) + 1),
1050 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1051 				    offsetof(struct __sk_buff, cb[2]) + 2),
1052 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1053 				    offsetof(struct __sk_buff, cb[2]) + 3),
1054 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1055 				    offsetof(struct __sk_buff, cb[3])),
1056 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1057 				    offsetof(struct __sk_buff, cb[3]) + 1),
1058 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1059 				    offsetof(struct __sk_buff, cb[3]) + 2),
1060 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1061 				    offsetof(struct __sk_buff, cb[3]) + 3),
1062 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1063 				    offsetof(struct __sk_buff, cb[4])),
1064 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1065 				    offsetof(struct __sk_buff, cb[4]) + 1),
1066 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1067 				    offsetof(struct __sk_buff, cb[4]) + 2),
1068 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1069 				    offsetof(struct __sk_buff, cb[4]) + 3),
1070 			BPF_EXIT_INSN(),
1071 		},
1072 		.result = ACCEPT,
1073 	},
1074 	{
1075 		"check cb access: byte, oob 1",
1076 		.insns = {
1077 			BPF_MOV64_IMM(BPF_REG_0, 0),
1078 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1079 				    offsetof(struct __sk_buff, cb[4]) + 4),
1080 			BPF_EXIT_INSN(),
1081 		},
1082 		.errstr = "invalid bpf_context access",
1083 		.result = REJECT,
1084 	},
1085 	{
1086 		"check cb access: byte, oob 2",
1087 		.insns = {
1088 			BPF_MOV64_IMM(BPF_REG_0, 0),
1089 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1090 				    offsetof(struct __sk_buff, cb[0]) - 1),
1091 			BPF_EXIT_INSN(),
1092 		},
1093 		.errstr = "invalid bpf_context access",
1094 		.result = REJECT,
1095 	},
1096 	{
1097 		"check cb access: byte, oob 3",
1098 		.insns = {
1099 			BPF_MOV64_IMM(BPF_REG_0, 0),
1100 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1101 				    offsetof(struct __sk_buff, cb[4]) + 4),
1102 			BPF_EXIT_INSN(),
1103 		},
1104 		.errstr = "invalid bpf_context access",
1105 		.result = REJECT,
1106 	},
1107 	{
1108 		"check cb access: byte, oob 4",
1109 		.insns = {
1110 			BPF_MOV64_IMM(BPF_REG_0, 0),
1111 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1112 				    offsetof(struct __sk_buff, cb[0]) - 1),
1113 			BPF_EXIT_INSN(),
1114 		},
1115 		.errstr = "invalid bpf_context access",
1116 		.result = REJECT,
1117 	},
1118 	{
1119 		"check cb access: byte, wrong type",
1120 		.insns = {
1121 			BPF_MOV64_IMM(BPF_REG_0, 0),
1122 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1123 				    offsetof(struct __sk_buff, cb[0])),
1124 			BPF_EXIT_INSN(),
1125 		},
1126 		.errstr = "invalid bpf_context access",
1127 		.result = REJECT,
1128 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
1129 	},
1130 	{
1131 		"check cb access: half",
1132 		.insns = {
1133 			BPF_MOV64_IMM(BPF_REG_0, 0),
1134 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1135 				    offsetof(struct __sk_buff, cb[0])),
1136 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1137 				    offsetof(struct __sk_buff, cb[0]) + 2),
1138 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1139 				    offsetof(struct __sk_buff, cb[1])),
1140 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1141 				    offsetof(struct __sk_buff, cb[1]) + 2),
1142 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1143 				    offsetof(struct __sk_buff, cb[2])),
1144 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1145 				    offsetof(struct __sk_buff, cb[2]) + 2),
1146 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1147 				    offsetof(struct __sk_buff, cb[3])),
1148 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1149 				    offsetof(struct __sk_buff, cb[3]) + 2),
1150 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1151 				    offsetof(struct __sk_buff, cb[4])),
1152 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1153 				    offsetof(struct __sk_buff, cb[4]) + 2),
1154 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1155 				    offsetof(struct __sk_buff, cb[0])),
1156 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1157 				    offsetof(struct __sk_buff, cb[0]) + 2),
1158 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1159 				    offsetof(struct __sk_buff, cb[1])),
1160 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1161 				    offsetof(struct __sk_buff, cb[1]) + 2),
1162 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1163 				    offsetof(struct __sk_buff, cb[2])),
1164 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1165 				    offsetof(struct __sk_buff, cb[2]) + 2),
1166 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1167 				    offsetof(struct __sk_buff, cb[3])),
1168 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1169 				    offsetof(struct __sk_buff, cb[3]) + 2),
1170 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1171 				    offsetof(struct __sk_buff, cb[4])),
1172 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1173 				    offsetof(struct __sk_buff, cb[4]) + 2),
1174 			BPF_EXIT_INSN(),
1175 		},
1176 		.result = ACCEPT,
1177 	},
1178 	{
1179 		"check cb access: half, unaligned",
1180 		.insns = {
1181 			BPF_MOV64_IMM(BPF_REG_0, 0),
1182 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1183 				    offsetof(struct __sk_buff, cb[0]) + 1),
1184 			BPF_EXIT_INSN(),
1185 		},
1186 		.errstr = "misaligned access",
1187 		.result = REJECT,
1188 	},
1189 	{
1190 		"check cb access: half, oob 1",
1191 		.insns = {
1192 			BPF_MOV64_IMM(BPF_REG_0, 0),
1193 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1194 				    offsetof(struct __sk_buff, cb[4]) + 4),
1195 			BPF_EXIT_INSN(),
1196 		},
1197 		.errstr = "invalid bpf_context access",
1198 		.result = REJECT,
1199 	},
1200 	{
1201 		"check cb access: half, oob 2",
1202 		.insns = {
1203 			BPF_MOV64_IMM(BPF_REG_0, 0),
1204 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1205 				    offsetof(struct __sk_buff, cb[0]) - 2),
1206 			BPF_EXIT_INSN(),
1207 		},
1208 		.errstr = "invalid bpf_context access",
1209 		.result = REJECT,
1210 	},
1211 	{
1212 		"check cb access: half, oob 3",
1213 		.insns = {
1214 			BPF_MOV64_IMM(BPF_REG_0, 0),
1215 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1216 				    offsetof(struct __sk_buff, cb[4]) + 4),
1217 			BPF_EXIT_INSN(),
1218 		},
1219 		.errstr = "invalid bpf_context access",
1220 		.result = REJECT,
1221 	},
1222 	{
1223 		"check cb access: half, oob 4",
1224 		.insns = {
1225 			BPF_MOV64_IMM(BPF_REG_0, 0),
1226 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1227 				    offsetof(struct __sk_buff, cb[0]) - 2),
1228 			BPF_EXIT_INSN(),
1229 		},
1230 		.errstr = "invalid bpf_context access",
1231 		.result = REJECT,
1232 	},
1233 	{
1234 		"check cb access: half, wrong type",
1235 		.insns = {
1236 			BPF_MOV64_IMM(BPF_REG_0, 0),
1237 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1238 				    offsetof(struct __sk_buff, cb[0])),
1239 			BPF_EXIT_INSN(),
1240 		},
1241 		.errstr = "invalid bpf_context access",
1242 		.result = REJECT,
1243 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
1244 	},
1245 	{
1246 		"check cb access: word",
1247 		.insns = {
1248 			BPF_MOV64_IMM(BPF_REG_0, 0),
1249 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1250 				    offsetof(struct __sk_buff, cb[0])),
1251 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1252 				    offsetof(struct __sk_buff, cb[1])),
1253 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1254 				    offsetof(struct __sk_buff, cb[2])),
1255 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1256 				    offsetof(struct __sk_buff, cb[3])),
1257 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1258 				    offsetof(struct __sk_buff, cb[4])),
1259 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1260 				    offsetof(struct __sk_buff, cb[0])),
1261 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1262 				    offsetof(struct __sk_buff, cb[1])),
1263 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1264 				    offsetof(struct __sk_buff, cb[2])),
1265 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1266 				    offsetof(struct __sk_buff, cb[3])),
1267 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1268 				    offsetof(struct __sk_buff, cb[4])),
1269 			BPF_EXIT_INSN(),
1270 		},
1271 		.result = ACCEPT,
1272 	},
1273 	{
1274 		"check cb access: word, unaligned 1",
1275 		.insns = {
1276 			BPF_MOV64_IMM(BPF_REG_0, 0),
1277 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1278 				    offsetof(struct __sk_buff, cb[0]) + 2),
1279 			BPF_EXIT_INSN(),
1280 		},
1281 		.errstr = "misaligned access",
1282 		.result = REJECT,
1283 	},
1284 	{
1285 		"check cb access: word, unaligned 2",
1286 		.insns = {
1287 			BPF_MOV64_IMM(BPF_REG_0, 0),
1288 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1289 				    offsetof(struct __sk_buff, cb[4]) + 1),
1290 			BPF_EXIT_INSN(),
1291 		},
1292 		.errstr = "misaligned access",
1293 		.result = REJECT,
1294 	},
1295 	{
1296 		"check cb access: word, unaligned 3",
1297 		.insns = {
1298 			BPF_MOV64_IMM(BPF_REG_0, 0),
1299 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1300 				    offsetof(struct __sk_buff, cb[4]) + 2),
1301 			BPF_EXIT_INSN(),
1302 		},
1303 		.errstr = "misaligned access",
1304 		.result = REJECT,
1305 	},
1306 	{
1307 		"check cb access: word, unaligned 4",
1308 		.insns = {
1309 			BPF_MOV64_IMM(BPF_REG_0, 0),
1310 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1311 				    offsetof(struct __sk_buff, cb[4]) + 3),
1312 			BPF_EXIT_INSN(),
1313 		},
1314 		.errstr = "misaligned access",
1315 		.result = REJECT,
1316 	},
1317 	{
1318 		"check cb access: double",
1319 		.insns = {
1320 			BPF_MOV64_IMM(BPF_REG_0, 0),
1321 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1322 				    offsetof(struct __sk_buff, cb[0])),
1323 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1324 				    offsetof(struct __sk_buff, cb[2])),
1325 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1326 				    offsetof(struct __sk_buff, cb[0])),
1327 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1328 				    offsetof(struct __sk_buff, cb[2])),
1329 			BPF_EXIT_INSN(),
1330 		},
1331 		.result = ACCEPT,
1332 	},
1333 	{
1334 		"check cb access: double, unaligned 1",
1335 		.insns = {
1336 			BPF_MOV64_IMM(BPF_REG_0, 0),
1337 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1338 				    offsetof(struct __sk_buff, cb[1])),
1339 			BPF_EXIT_INSN(),
1340 		},
1341 		.errstr = "misaligned access",
1342 		.result = REJECT,
1343 	},
1344 	{
1345 		"check cb access: double, unaligned 2",
1346 		.insns = {
1347 			BPF_MOV64_IMM(BPF_REG_0, 0),
1348 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1349 				    offsetof(struct __sk_buff, cb[3])),
1350 			BPF_EXIT_INSN(),
1351 		},
1352 		.errstr = "misaligned access",
1353 		.result = REJECT,
1354 	},
1355 	{
1356 		"check cb access: double, oob 1",
1357 		.insns = {
1358 			BPF_MOV64_IMM(BPF_REG_0, 0),
1359 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1360 				    offsetof(struct __sk_buff, cb[4])),
1361 			BPF_EXIT_INSN(),
1362 		},
1363 		.errstr = "invalid bpf_context access",
1364 		.result = REJECT,
1365 	},
1366 	{
1367 		"check cb access: double, oob 2",
1368 		.insns = {
1369 			BPF_MOV64_IMM(BPF_REG_0, 0),
1370 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1371 				    offsetof(struct __sk_buff, cb[4]) + 8),
1372 			BPF_EXIT_INSN(),
1373 		},
1374 		.errstr = "invalid bpf_context access",
1375 		.result = REJECT,
1376 	},
1377 	{
1378 		"check cb access: double, oob 3",
1379 		.insns = {
1380 			BPF_MOV64_IMM(BPF_REG_0, 0),
1381 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1382 				    offsetof(struct __sk_buff, cb[0]) - 8),
1383 			BPF_EXIT_INSN(),
1384 		},
1385 		.errstr = "invalid bpf_context access",
1386 		.result = REJECT,
1387 	},
1388 	{
1389 		"check cb access: double, oob 4",
1390 		.insns = {
1391 			BPF_MOV64_IMM(BPF_REG_0, 0),
1392 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1393 				    offsetof(struct __sk_buff, cb[4])),
1394 			BPF_EXIT_INSN(),
1395 		},
1396 		.errstr = "invalid bpf_context access",
1397 		.result = REJECT,
1398 	},
1399 	{
1400 		"check cb access: double, oob 5",
1401 		.insns = {
1402 			BPF_MOV64_IMM(BPF_REG_0, 0),
1403 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1404 				    offsetof(struct __sk_buff, cb[4]) + 8),
1405 			BPF_EXIT_INSN(),
1406 		},
1407 		.errstr = "invalid bpf_context access",
1408 		.result = REJECT,
1409 	},
1410 	{
1411 		"check cb access: double, oob 6",
1412 		.insns = {
1413 			BPF_MOV64_IMM(BPF_REG_0, 0),
1414 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1415 				    offsetof(struct __sk_buff, cb[0]) - 8),
1416 			BPF_EXIT_INSN(),
1417 		},
1418 		.errstr = "invalid bpf_context access",
1419 		.result = REJECT,
1420 	},
1421 	{
1422 		"check cb access: double, wrong type",
1423 		.insns = {
1424 			BPF_MOV64_IMM(BPF_REG_0, 0),
1425 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1426 				    offsetof(struct __sk_buff, cb[0])),
1427 			BPF_EXIT_INSN(),
1428 		},
1429 		.errstr = "invalid bpf_context access",
1430 		.result = REJECT,
1431 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
1432 	},
1433 	{
1434 		"check out of range skb->cb access",
1435 		.insns = {
1436 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1437 				    offsetof(struct __sk_buff, cb[0]) + 256),
1438 			BPF_EXIT_INSN(),
1439 		},
1440 		.errstr = "invalid bpf_context access",
1441 		.errstr_unpriv = "",
1442 		.result = REJECT,
1443 		.prog_type = BPF_PROG_TYPE_SCHED_ACT,
1444 	},
1445 	{
1446 		"write skb fields from socket prog",
1447 		.insns = {
1448 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1449 				    offsetof(struct __sk_buff, cb[4])),
1450 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
1451 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1452 				    offsetof(struct __sk_buff, mark)),
1453 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1454 				    offsetof(struct __sk_buff, tc_index)),
1455 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
1456 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
1457 				    offsetof(struct __sk_buff, cb[0])),
1458 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
1459 				    offsetof(struct __sk_buff, cb[2])),
1460 			BPF_EXIT_INSN(),
1461 		},
1462 		.result = ACCEPT,
1463 		.errstr_unpriv = "R1 leaks addr",
1464 		.result_unpriv = REJECT,
1465 	},
1466 	{
1467 		"write skb fields from tc_cls_act prog",
1468 		.insns = {
1469 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1470 				    offsetof(struct __sk_buff, cb[0])),
1471 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1472 				    offsetof(struct __sk_buff, mark)),
1473 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1474 				    offsetof(struct __sk_buff, tc_index)),
1475 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1476 				    offsetof(struct __sk_buff, tc_index)),
1477 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1478 				    offsetof(struct __sk_buff, cb[3])),
1479 			BPF_EXIT_INSN(),
1480 		},
1481 		.errstr_unpriv = "",
1482 		.result_unpriv = REJECT,
1483 		.result = ACCEPT,
1484 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1485 	},
1486 	{
1487 		"PTR_TO_STACK store/load",
1488 		.insns = {
1489 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
1490 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10),
1491 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c),
1492 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2),
1493 			BPF_EXIT_INSN(),
1494 		},
1495 		.result = ACCEPT,
1496 	},
1497 	{
1498 		"PTR_TO_STACK store/load - bad alignment on off",
1499 		.insns = {
1500 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
1501 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
1502 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c),
1503 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2),
1504 			BPF_EXIT_INSN(),
1505 		},
1506 		.result = REJECT,
1507 		.errstr = "misaligned access off -6 size 8",
1508 	},
1509 	{
1510 		"PTR_TO_STACK store/load - bad alignment on reg",
1511 		.insns = {
1512 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
1513 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10),
1514 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
1515 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
1516 			BPF_EXIT_INSN(),
1517 		},
1518 		.result = REJECT,
1519 		.errstr = "misaligned access off -2 size 8",
1520 	},
1521 	{
1522 		"PTR_TO_STACK store/load - out of bounds low",
1523 		.insns = {
1524 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
1525 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000),
1526 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
1527 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
1528 			BPF_EXIT_INSN(),
1529 		},
1530 		.result = REJECT,
1531 		.errstr = "invalid stack off=-79992 size=8",
1532 	},
1533 	{
1534 		"PTR_TO_STACK store/load - out of bounds high",
1535 		.insns = {
1536 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
1537 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
1538 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
1539 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
1540 			BPF_EXIT_INSN(),
1541 		},
1542 		.result = REJECT,
1543 		.errstr = "invalid stack off=0 size=8",
1544 	},
1545 	{
1546 		"unpriv: return pointer",
1547 		.insns = {
1548 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
1549 			BPF_EXIT_INSN(),
1550 		},
1551 		.result = ACCEPT,
1552 		.result_unpriv = REJECT,
1553 		.errstr_unpriv = "R0 leaks addr",
1554 	},
1555 	{
1556 		"unpriv: add const to pointer",
1557 		.insns = {
1558 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1559 			BPF_MOV64_IMM(BPF_REG_0, 0),
1560 			BPF_EXIT_INSN(),
1561 		},
1562 		.result = ACCEPT,
1563 		.result_unpriv = REJECT,
1564 		.errstr_unpriv = "R1 pointer arithmetic",
1565 	},
1566 	{
1567 		"unpriv: add pointer to pointer",
1568 		.insns = {
1569 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10),
1570 			BPF_MOV64_IMM(BPF_REG_0, 0),
1571 			BPF_EXIT_INSN(),
1572 		},
1573 		.result = ACCEPT,
1574 		.result_unpriv = REJECT,
1575 		.errstr_unpriv = "R1 pointer arithmetic",
1576 	},
1577 	{
1578 		"unpriv: neg pointer",
1579 		.insns = {
1580 			BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0),
1581 			BPF_MOV64_IMM(BPF_REG_0, 0),
1582 			BPF_EXIT_INSN(),
1583 		},
1584 		.result = ACCEPT,
1585 		.result_unpriv = REJECT,
1586 		.errstr_unpriv = "R1 pointer arithmetic",
1587 	},
1588 	{
1589 		"unpriv: cmp pointer with const",
1590 		.insns = {
1591 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
1592 			BPF_MOV64_IMM(BPF_REG_0, 0),
1593 			BPF_EXIT_INSN(),
1594 		},
1595 		.result = ACCEPT,
1596 		.result_unpriv = REJECT,
1597 		.errstr_unpriv = "R1 pointer comparison",
1598 	},
1599 	{
1600 		"unpriv: cmp pointer with pointer",
1601 		.insns = {
1602 			BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
1603 			BPF_MOV64_IMM(BPF_REG_0, 0),
1604 			BPF_EXIT_INSN(),
1605 		},
1606 		.result = ACCEPT,
1607 		.result_unpriv = REJECT,
1608 		.errstr_unpriv = "R10 pointer comparison",
1609 	},
1610 	{
1611 		"unpriv: check that printk is disallowed",
1612 		.insns = {
1613 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1614 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
1615 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
1616 			BPF_MOV64_IMM(BPF_REG_2, 8),
1617 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_1),
1618 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1619 				     BPF_FUNC_trace_printk),
1620 			BPF_MOV64_IMM(BPF_REG_0, 0),
1621 			BPF_EXIT_INSN(),
1622 		},
1623 		.errstr_unpriv = "unknown func bpf_trace_printk#6",
1624 		.result_unpriv = REJECT,
1625 		.result = ACCEPT,
1626 	},
1627 	{
1628 		"unpriv: pass pointer to helper function",
1629 		.insns = {
1630 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1631 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1632 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1633 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1634 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
1635 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
1636 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1637 				     BPF_FUNC_map_update_elem),
1638 			BPF_MOV64_IMM(BPF_REG_0, 0),
1639 			BPF_EXIT_INSN(),
1640 		},
1641 		.fixup_map1 = { 3 },
1642 		.errstr_unpriv = "R4 leaks addr",
1643 		.result_unpriv = REJECT,
1644 		.result = ACCEPT,
1645 	},
1646 	{
1647 		"unpriv: indirectly pass pointer on stack to helper function",
1648 		.insns = {
1649 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
1650 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1651 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1652 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1653 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1654 				     BPF_FUNC_map_lookup_elem),
1655 			BPF_MOV64_IMM(BPF_REG_0, 0),
1656 			BPF_EXIT_INSN(),
1657 		},
1658 		.fixup_map1 = { 3 },
1659 		.errstr = "invalid indirect read from stack off -8+0 size 8",
1660 		.result = REJECT,
1661 	},
1662 	{
1663 		"unpriv: mangle pointer on stack 1",
1664 		.insns = {
1665 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
1666 			BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0),
1667 			BPF_MOV64_IMM(BPF_REG_0, 0),
1668 			BPF_EXIT_INSN(),
1669 		},
1670 		.errstr_unpriv = "attempt to corrupt spilled",
1671 		.result_unpriv = REJECT,
1672 		.result = ACCEPT,
1673 	},
1674 	{
1675 		"unpriv: mangle pointer on stack 2",
1676 		.insns = {
1677 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
1678 			BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0),
1679 			BPF_MOV64_IMM(BPF_REG_0, 0),
1680 			BPF_EXIT_INSN(),
1681 		},
1682 		.errstr_unpriv = "attempt to corrupt spilled",
1683 		.result_unpriv = REJECT,
1684 		.result = ACCEPT,
1685 	},
1686 	{
1687 		"unpriv: read pointer from stack in small chunks",
1688 		.insns = {
1689 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
1690 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8),
1691 			BPF_MOV64_IMM(BPF_REG_0, 0),
1692 			BPF_EXIT_INSN(),
1693 		},
1694 		.errstr = "invalid size",
1695 		.result = REJECT,
1696 	},
1697 	{
1698 		"unpriv: write pointer into ctx",
1699 		.insns = {
1700 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0),
1701 			BPF_MOV64_IMM(BPF_REG_0, 0),
1702 			BPF_EXIT_INSN(),
1703 		},
1704 		.errstr_unpriv = "R1 leaks addr",
1705 		.result_unpriv = REJECT,
1706 		.errstr = "invalid bpf_context access",
1707 		.result = REJECT,
1708 	},
1709 	{
1710 		"unpriv: spill/fill of ctx",
1711 		.insns = {
1712 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1713 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1714 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
1715 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
1716 			BPF_MOV64_IMM(BPF_REG_0, 0),
1717 			BPF_EXIT_INSN(),
1718 		},
1719 		.result = ACCEPT,
1720 	},
1721 	{
1722 		"unpriv: spill/fill of ctx 2",
1723 		.insns = {
1724 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1725 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1726 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
1727 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
1728 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1729 				     BPF_FUNC_get_hash_recalc),
1730 			BPF_EXIT_INSN(),
1731 		},
1732 		.result = ACCEPT,
1733 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1734 	},
1735 	{
1736 		"unpriv: spill/fill of ctx 3",
1737 		.insns = {
1738 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1739 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1740 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
1741 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0),
1742 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
1743 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1744 				     BPF_FUNC_get_hash_recalc),
1745 			BPF_EXIT_INSN(),
1746 		},
1747 		.result = REJECT,
1748 		.errstr = "R1 type=fp expected=ctx",
1749 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1750 	},
1751 	{
1752 		"unpriv: spill/fill of ctx 4",
1753 		.insns = {
1754 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1755 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1756 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
1757 			BPF_MOV64_IMM(BPF_REG_0, 1),
1758 			BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10,
1759 				     BPF_REG_0, -8, 0),
1760 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
1761 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1762 				     BPF_FUNC_get_hash_recalc),
1763 			BPF_EXIT_INSN(),
1764 		},
1765 		.result = REJECT,
1766 		.errstr = "R1 type=inv expected=ctx",
1767 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1768 	},
1769 	{
1770 		"unpriv: spill/fill of different pointers stx",
1771 		.insns = {
1772 			BPF_MOV64_IMM(BPF_REG_3, 42),
1773 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1774 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1775 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
1776 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1777 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
1778 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0),
1779 			BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
1780 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
1781 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
1782 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3,
1783 				    offsetof(struct __sk_buff, mark)),
1784 			BPF_MOV64_IMM(BPF_REG_0, 0),
1785 			BPF_EXIT_INSN(),
1786 		},
1787 		.result = REJECT,
1788 		.errstr = "same insn cannot be used with different pointers",
1789 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1790 	},
1791 	{
1792 		"unpriv: spill/fill of different pointers ldx",
1793 		.insns = {
1794 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1795 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1796 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
1797 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1798 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2,
1799 				      -(__s32)offsetof(struct bpf_perf_event_data,
1800 						       sample_period) - 8),
1801 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0),
1802 			BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
1803 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
1804 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
1805 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1,
1806 				    offsetof(struct bpf_perf_event_data,
1807 					     sample_period)),
1808 			BPF_MOV64_IMM(BPF_REG_0, 0),
1809 			BPF_EXIT_INSN(),
1810 		},
1811 		.result = REJECT,
1812 		.errstr = "same insn cannot be used with different pointers",
1813 		.prog_type = BPF_PROG_TYPE_PERF_EVENT,
1814 	},
1815 	{
1816 		"unpriv: write pointer into map elem value",
1817 		.insns = {
1818 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1819 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1820 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1821 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1822 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1823 				     BPF_FUNC_map_lookup_elem),
1824 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
1825 			BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
1826 			BPF_EXIT_INSN(),
1827 		},
1828 		.fixup_map1 = { 3 },
1829 		.errstr_unpriv = "R0 leaks addr",
1830 		.result_unpriv = REJECT,
1831 		.result = ACCEPT,
1832 	},
1833 	{
1834 		"unpriv: partial copy of pointer",
1835 		.insns = {
1836 			BPF_MOV32_REG(BPF_REG_1, BPF_REG_10),
1837 			BPF_MOV64_IMM(BPF_REG_0, 0),
1838 			BPF_EXIT_INSN(),
1839 		},
1840 		.errstr_unpriv = "R10 partial copy",
1841 		.result_unpriv = REJECT,
1842 		.result = ACCEPT,
1843 	},
1844 	{
1845 		"unpriv: pass pointer to tail_call",
1846 		.insns = {
1847 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_1),
1848 			BPF_LD_MAP_FD(BPF_REG_2, 0),
1849 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1850 				     BPF_FUNC_tail_call),
1851 			BPF_MOV64_IMM(BPF_REG_0, 0),
1852 			BPF_EXIT_INSN(),
1853 		},
1854 		.fixup_prog = { 1 },
1855 		.errstr_unpriv = "R3 leaks addr into helper",
1856 		.result_unpriv = REJECT,
1857 		.result = ACCEPT,
1858 	},
1859 	{
1860 		"unpriv: cmp map pointer with zero",
1861 		.insns = {
1862 			BPF_MOV64_IMM(BPF_REG_1, 0),
1863 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1864 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
1865 			BPF_MOV64_IMM(BPF_REG_0, 0),
1866 			BPF_EXIT_INSN(),
1867 		},
1868 		.fixup_map1 = { 1 },
1869 		.errstr_unpriv = "R1 pointer comparison",
1870 		.result_unpriv = REJECT,
1871 		.result = ACCEPT,
1872 	},
1873 	{
1874 		"unpriv: write into frame pointer",
1875 		.insns = {
1876 			BPF_MOV64_REG(BPF_REG_10, BPF_REG_1),
1877 			BPF_MOV64_IMM(BPF_REG_0, 0),
1878 			BPF_EXIT_INSN(),
1879 		},
1880 		.errstr = "frame pointer is read only",
1881 		.result = REJECT,
1882 	},
1883 	{
1884 		"unpriv: spill/fill frame pointer",
1885 		.insns = {
1886 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1887 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1888 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0),
1889 			BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0),
1890 			BPF_MOV64_IMM(BPF_REG_0, 0),
1891 			BPF_EXIT_INSN(),
1892 		},
1893 		.errstr = "frame pointer is read only",
1894 		.result = REJECT,
1895 	},
1896 	{
1897 		"unpriv: cmp of frame pointer",
1898 		.insns = {
1899 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0),
1900 			BPF_MOV64_IMM(BPF_REG_0, 0),
1901 			BPF_EXIT_INSN(),
1902 		},
1903 		.errstr_unpriv = "R10 pointer comparison",
1904 		.result_unpriv = REJECT,
1905 		.result = ACCEPT,
1906 	},
1907 	{
1908 		"unpriv: adding of fp",
1909 		.insns = {
1910 			BPF_MOV64_IMM(BPF_REG_0, 0),
1911 			BPF_MOV64_IMM(BPF_REG_1, 0),
1912 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10),
1913 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
1914 			BPF_EXIT_INSN(),
1915 		},
1916 		.errstr_unpriv = "pointer arithmetic prohibited",
1917 		.result_unpriv = REJECT,
1918 		.errstr = "R1 invalid mem access",
1919 		.result = REJECT,
1920 	},
1921 	{
1922 		"unpriv: cmp of stack pointer",
1923 		.insns = {
1924 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1925 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1926 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0),
1927 			BPF_MOV64_IMM(BPF_REG_0, 0),
1928 			BPF_EXIT_INSN(),
1929 		},
1930 		.errstr_unpriv = "R2 pointer comparison",
1931 		.result_unpriv = REJECT,
1932 		.result = ACCEPT,
1933 	},
1934 	{
1935 		"stack pointer arithmetic",
1936 		.insns = {
1937 			BPF_MOV64_IMM(BPF_REG_1, 4),
1938 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
1939 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
1940 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10),
1941 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10),
1942 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
1943 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1),
1944 			BPF_ST_MEM(0, BPF_REG_2, 4, 0),
1945 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
1946 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
1947 			BPF_ST_MEM(0, BPF_REG_2, 4, 0),
1948 			BPF_MOV64_IMM(BPF_REG_0, 0),
1949 			BPF_EXIT_INSN(),
1950 		},
1951 		.result = ACCEPT,
1952 	},
1953 	{
1954 		"raw_stack: no skb_load_bytes",
1955 		.insns = {
1956 			BPF_MOV64_IMM(BPF_REG_2, 4),
1957 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1958 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1959 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
1960 			BPF_MOV64_IMM(BPF_REG_4, 8),
1961 			/* Call to skb_load_bytes() omitted. */
1962 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
1963 			BPF_EXIT_INSN(),
1964 		},
1965 		.result = REJECT,
1966 		.errstr = "invalid read from stack off -8+0 size 8",
1967 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1968 	},
1969 	{
1970 		"raw_stack: skb_load_bytes, negative len",
1971 		.insns = {
1972 			BPF_MOV64_IMM(BPF_REG_2, 4),
1973 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1974 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1975 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
1976 			BPF_MOV64_IMM(BPF_REG_4, -8),
1977 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1978 				     BPF_FUNC_skb_load_bytes),
1979 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
1980 			BPF_EXIT_INSN(),
1981 		},
1982 		.result = REJECT,
1983 		.errstr = "invalid stack type R3",
1984 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1985 	},
1986 	{
1987 		"raw_stack: skb_load_bytes, negative len 2",
1988 		.insns = {
1989 			BPF_MOV64_IMM(BPF_REG_2, 4),
1990 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
1991 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
1992 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
1993 			BPF_MOV64_IMM(BPF_REG_4, ~0),
1994 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1995 				     BPF_FUNC_skb_load_bytes),
1996 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
1997 			BPF_EXIT_INSN(),
1998 		},
1999 		.result = REJECT,
2000 		.errstr = "invalid stack type R3",
2001 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2002 	},
2003 	{
2004 		"raw_stack: skb_load_bytes, zero len",
2005 		.insns = {
2006 			BPF_MOV64_IMM(BPF_REG_2, 4),
2007 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2008 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2009 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2010 			BPF_MOV64_IMM(BPF_REG_4, 0),
2011 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2012 				     BPF_FUNC_skb_load_bytes),
2013 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2014 			BPF_EXIT_INSN(),
2015 		},
2016 		.result = REJECT,
2017 		.errstr = "invalid stack type R3",
2018 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2019 	},
2020 	{
2021 		"raw_stack: skb_load_bytes, no init",
2022 		.insns = {
2023 			BPF_MOV64_IMM(BPF_REG_2, 4),
2024 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2025 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2026 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2027 			BPF_MOV64_IMM(BPF_REG_4, 8),
2028 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2029 				     BPF_FUNC_skb_load_bytes),
2030 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2031 			BPF_EXIT_INSN(),
2032 		},
2033 		.result = ACCEPT,
2034 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2035 	},
2036 	{
2037 		"raw_stack: skb_load_bytes, init",
2038 		.insns = {
2039 			BPF_MOV64_IMM(BPF_REG_2, 4),
2040 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2041 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2042 			BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe),
2043 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2044 			BPF_MOV64_IMM(BPF_REG_4, 8),
2045 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2046 				     BPF_FUNC_skb_load_bytes),
2047 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2048 			BPF_EXIT_INSN(),
2049 		},
2050 		.result = ACCEPT,
2051 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2052 	},
2053 	{
2054 		"raw_stack: skb_load_bytes, spilled regs around bounds",
2055 		.insns = {
2056 			BPF_MOV64_IMM(BPF_REG_2, 4),
2057 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2058 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16),
2059 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8),
2060 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  8),
2061 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2062 			BPF_MOV64_IMM(BPF_REG_4, 8),
2063 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2064 				     BPF_FUNC_skb_load_bytes),
2065 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8),
2066 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6,  8),
2067 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2068 				    offsetof(struct __sk_buff, mark)),
2069 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2,
2070 				    offsetof(struct __sk_buff, priority)),
2071 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
2072 			BPF_EXIT_INSN(),
2073 		},
2074 		.result = ACCEPT,
2075 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2076 	},
2077 	{
2078 		"raw_stack: skb_load_bytes, spilled regs corruption",
2079 		.insns = {
2080 			BPF_MOV64_IMM(BPF_REG_2, 4),
2081 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2082 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2083 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2084 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2085 			BPF_MOV64_IMM(BPF_REG_4, 8),
2086 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2087 				     BPF_FUNC_skb_load_bytes),
2088 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2089 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2090 				    offsetof(struct __sk_buff, mark)),
2091 			BPF_EXIT_INSN(),
2092 		},
2093 		.result = REJECT,
2094 		.errstr = "R0 invalid mem access 'inv'",
2095 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2096 	},
2097 	{
2098 		"raw_stack: skb_load_bytes, spilled regs corruption 2",
2099 		.insns = {
2100 			BPF_MOV64_IMM(BPF_REG_2, 4),
2101 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2102 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16),
2103 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8),
2104 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  0),
2105 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  8),
2106 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2107 			BPF_MOV64_IMM(BPF_REG_4, 8),
2108 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2109 				     BPF_FUNC_skb_load_bytes),
2110 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8),
2111 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6,  8),
2112 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6,  0),
2113 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2114 				    offsetof(struct __sk_buff, mark)),
2115 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2,
2116 				    offsetof(struct __sk_buff, priority)),
2117 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
2118 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3,
2119 				    offsetof(struct __sk_buff, pkt_type)),
2120 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
2121 			BPF_EXIT_INSN(),
2122 		},
2123 		.result = REJECT,
2124 		.errstr = "R3 invalid mem access 'inv'",
2125 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2126 	},
2127 	{
2128 		"raw_stack: skb_load_bytes, spilled regs + data",
2129 		.insns = {
2130 			BPF_MOV64_IMM(BPF_REG_2, 4),
2131 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2132 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16),
2133 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8),
2134 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  0),
2135 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  8),
2136 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2137 			BPF_MOV64_IMM(BPF_REG_4, 8),
2138 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2139 				     BPF_FUNC_skb_load_bytes),
2140 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8),
2141 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6,  8),
2142 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6,  0),
2143 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2144 				    offsetof(struct __sk_buff, mark)),
2145 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2,
2146 				    offsetof(struct __sk_buff, priority)),
2147 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
2148 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
2149 			BPF_EXIT_INSN(),
2150 		},
2151 		.result = ACCEPT,
2152 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2153 	},
2154 	{
2155 		"raw_stack: skb_load_bytes, invalid access 1",
2156 		.insns = {
2157 			BPF_MOV64_IMM(BPF_REG_2, 4),
2158 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2159 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513),
2160 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2161 			BPF_MOV64_IMM(BPF_REG_4, 8),
2162 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2163 				     BPF_FUNC_skb_load_bytes),
2164 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2165 			BPF_EXIT_INSN(),
2166 		},
2167 		.result = REJECT,
2168 		.errstr = "invalid stack type R3 off=-513 access_size=8",
2169 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2170 	},
2171 	{
2172 		"raw_stack: skb_load_bytes, invalid access 2",
2173 		.insns = {
2174 			BPF_MOV64_IMM(BPF_REG_2, 4),
2175 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2176 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1),
2177 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2178 			BPF_MOV64_IMM(BPF_REG_4, 8),
2179 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2180 				     BPF_FUNC_skb_load_bytes),
2181 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2182 			BPF_EXIT_INSN(),
2183 		},
2184 		.result = REJECT,
2185 		.errstr = "invalid stack type R3 off=-1 access_size=8",
2186 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2187 	},
2188 	{
2189 		"raw_stack: skb_load_bytes, invalid access 3",
2190 		.insns = {
2191 			BPF_MOV64_IMM(BPF_REG_2, 4),
2192 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2193 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff),
2194 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2195 			BPF_MOV64_IMM(BPF_REG_4, 0xffffffff),
2196 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2197 				     BPF_FUNC_skb_load_bytes),
2198 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2199 			BPF_EXIT_INSN(),
2200 		},
2201 		.result = REJECT,
2202 		.errstr = "invalid stack type R3 off=-1 access_size=-1",
2203 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2204 	},
2205 	{
2206 		"raw_stack: skb_load_bytes, invalid access 4",
2207 		.insns = {
2208 			BPF_MOV64_IMM(BPF_REG_2, 4),
2209 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2210 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1),
2211 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2212 			BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff),
2213 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2214 				     BPF_FUNC_skb_load_bytes),
2215 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2216 			BPF_EXIT_INSN(),
2217 		},
2218 		.result = REJECT,
2219 		.errstr = "invalid stack type R3 off=-1 access_size=2147483647",
2220 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2221 	},
2222 	{
2223 		"raw_stack: skb_load_bytes, invalid access 5",
2224 		.insns = {
2225 			BPF_MOV64_IMM(BPF_REG_2, 4),
2226 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2227 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512),
2228 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2229 			BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff),
2230 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2231 				     BPF_FUNC_skb_load_bytes),
2232 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2233 			BPF_EXIT_INSN(),
2234 		},
2235 		.result = REJECT,
2236 		.errstr = "invalid stack type R3 off=-512 access_size=2147483647",
2237 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2238 	},
2239 	{
2240 		"raw_stack: skb_load_bytes, invalid access 6",
2241 		.insns = {
2242 			BPF_MOV64_IMM(BPF_REG_2, 4),
2243 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2244 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512),
2245 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2246 			BPF_MOV64_IMM(BPF_REG_4, 0),
2247 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2248 				     BPF_FUNC_skb_load_bytes),
2249 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2250 			BPF_EXIT_INSN(),
2251 		},
2252 		.result = REJECT,
2253 		.errstr = "invalid stack type R3 off=-512 access_size=0",
2254 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2255 	},
2256 	{
2257 		"raw_stack: skb_load_bytes, large access",
2258 		.insns = {
2259 			BPF_MOV64_IMM(BPF_REG_2, 4),
2260 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2261 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512),
2262 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2263 			BPF_MOV64_IMM(BPF_REG_4, 512),
2264 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2265 				     BPF_FUNC_skb_load_bytes),
2266 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2267 			BPF_EXIT_INSN(),
2268 		},
2269 		.result = ACCEPT,
2270 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2271 	},
2272 	{
2273 		"direct packet access: test1",
2274 		.insns = {
2275 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2276 				    offsetof(struct __sk_buff, data)),
2277 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2278 				    offsetof(struct __sk_buff, data_end)),
2279 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2280 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2281 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
2282 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2283 			BPF_MOV64_IMM(BPF_REG_0, 0),
2284 			BPF_EXIT_INSN(),
2285 		},
2286 		.result = ACCEPT,
2287 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2288 	},
2289 	{
2290 		"direct packet access: test2",
2291 		.insns = {
2292 			BPF_MOV64_IMM(BPF_REG_0, 1),
2293 			BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
2294 				    offsetof(struct __sk_buff, data_end)),
2295 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2296 				    offsetof(struct __sk_buff, data)),
2297 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
2298 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14),
2299 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15),
2300 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7),
2301 			BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12),
2302 			BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14),
2303 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2304 				    offsetof(struct __sk_buff, data)),
2305 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4),
2306 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_1),
2307 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 48),
2308 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 48),
2309 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
2310 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_3),
2311 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
2312 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
2313 				    offsetof(struct __sk_buff, data_end)),
2314 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
2315 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4),
2316 			BPF_MOV64_IMM(BPF_REG_0, 0),
2317 			BPF_EXIT_INSN(),
2318 		},
2319 		.result = ACCEPT,
2320 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2321 	},
2322 	{
2323 		"direct packet access: test3",
2324 		.insns = {
2325 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2326 				    offsetof(struct __sk_buff, data)),
2327 			BPF_MOV64_IMM(BPF_REG_0, 0),
2328 			BPF_EXIT_INSN(),
2329 		},
2330 		.errstr = "invalid bpf_context access off=76",
2331 		.result = REJECT,
2332 		.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
2333 	},
2334 	{
2335 		"direct packet access: test4 (write)",
2336 		.insns = {
2337 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2338 				    offsetof(struct __sk_buff, data)),
2339 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2340 				    offsetof(struct __sk_buff, data_end)),
2341 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2342 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2343 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
2344 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
2345 			BPF_MOV64_IMM(BPF_REG_0, 0),
2346 			BPF_EXIT_INSN(),
2347 		},
2348 		.result = ACCEPT,
2349 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2350 	},
2351 	{
2352 		"direct packet access: test5 (pkt_end >= reg, good access)",
2353 		.insns = {
2354 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2355 				    offsetof(struct __sk_buff, data)),
2356 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2357 				    offsetof(struct __sk_buff, data_end)),
2358 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2359 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2360 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2),
2361 			BPF_MOV64_IMM(BPF_REG_0, 1),
2362 			BPF_EXIT_INSN(),
2363 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2364 			BPF_MOV64_IMM(BPF_REG_0, 0),
2365 			BPF_EXIT_INSN(),
2366 		},
2367 		.result = ACCEPT,
2368 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2369 	},
2370 	{
2371 		"direct packet access: test6 (pkt_end >= reg, bad access)",
2372 		.insns = {
2373 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2374 				    offsetof(struct __sk_buff, data)),
2375 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2376 				    offsetof(struct __sk_buff, data_end)),
2377 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2378 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2379 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3),
2380 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2381 			BPF_MOV64_IMM(BPF_REG_0, 1),
2382 			BPF_EXIT_INSN(),
2383 			BPF_MOV64_IMM(BPF_REG_0, 0),
2384 			BPF_EXIT_INSN(),
2385 		},
2386 		.errstr = "invalid access to packet",
2387 		.result = REJECT,
2388 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2389 	},
2390 	{
2391 		"direct packet access: test7 (pkt_end >= reg, both accesses)",
2392 		.insns = {
2393 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2394 				    offsetof(struct __sk_buff, data)),
2395 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2396 				    offsetof(struct __sk_buff, data_end)),
2397 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2398 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2399 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3),
2400 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2401 			BPF_MOV64_IMM(BPF_REG_0, 1),
2402 			BPF_EXIT_INSN(),
2403 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2404 			BPF_MOV64_IMM(BPF_REG_0, 0),
2405 			BPF_EXIT_INSN(),
2406 		},
2407 		.errstr = "invalid access to packet",
2408 		.result = REJECT,
2409 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2410 	},
2411 	{
2412 		"direct packet access: test8 (double test, variant 1)",
2413 		.insns = {
2414 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2415 				    offsetof(struct __sk_buff, data)),
2416 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2417 				    offsetof(struct __sk_buff, data_end)),
2418 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2419 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2420 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4),
2421 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
2422 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2423 			BPF_MOV64_IMM(BPF_REG_0, 1),
2424 			BPF_EXIT_INSN(),
2425 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2426 			BPF_MOV64_IMM(BPF_REG_0, 0),
2427 			BPF_EXIT_INSN(),
2428 		},
2429 		.result = ACCEPT,
2430 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2431 	},
2432 	{
2433 		"direct packet access: test9 (double test, variant 2)",
2434 		.insns = {
2435 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2436 				    offsetof(struct __sk_buff, data)),
2437 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2438 				    offsetof(struct __sk_buff, data_end)),
2439 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2440 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2441 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2),
2442 			BPF_MOV64_IMM(BPF_REG_0, 1),
2443 			BPF_EXIT_INSN(),
2444 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
2445 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2446 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
2447 			BPF_MOV64_IMM(BPF_REG_0, 0),
2448 			BPF_EXIT_INSN(),
2449 		},
2450 		.result = ACCEPT,
2451 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2452 	},
2453 	{
2454 		"direct packet access: test10 (write invalid)",
2455 		.insns = {
2456 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2457 				    offsetof(struct __sk_buff, data)),
2458 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2459 				    offsetof(struct __sk_buff, data_end)),
2460 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2461 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2462 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
2463 			BPF_MOV64_IMM(BPF_REG_0, 0),
2464 			BPF_EXIT_INSN(),
2465 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
2466 			BPF_MOV64_IMM(BPF_REG_0, 0),
2467 			BPF_EXIT_INSN(),
2468 		},
2469 		.errstr = "invalid access to packet",
2470 		.result = REJECT,
2471 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2472 	},
2473 	{
2474 		"direct packet access: test11 (shift, good access)",
2475 		.insns = {
2476 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2477 				    offsetof(struct __sk_buff, data)),
2478 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2479 				    offsetof(struct __sk_buff, data_end)),
2480 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2481 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
2482 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
2483 			BPF_MOV64_IMM(BPF_REG_3, 144),
2484 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
2485 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
2486 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3),
2487 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
2488 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
2489 			BPF_MOV64_IMM(BPF_REG_0, 1),
2490 			BPF_EXIT_INSN(),
2491 			BPF_MOV64_IMM(BPF_REG_0, 0),
2492 			BPF_EXIT_INSN(),
2493 		},
2494 		.result = ACCEPT,
2495 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2496 	},
2497 	{
2498 		"direct packet access: test12 (and, good access)",
2499 		.insns = {
2500 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2501 				    offsetof(struct __sk_buff, data)),
2502 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2503 				    offsetof(struct __sk_buff, data_end)),
2504 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2505 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
2506 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
2507 			BPF_MOV64_IMM(BPF_REG_3, 144),
2508 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
2509 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
2510 			BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15),
2511 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
2512 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
2513 			BPF_MOV64_IMM(BPF_REG_0, 1),
2514 			BPF_EXIT_INSN(),
2515 			BPF_MOV64_IMM(BPF_REG_0, 0),
2516 			BPF_EXIT_INSN(),
2517 		},
2518 		.result = ACCEPT,
2519 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2520 	},
2521 	{
2522 		"direct packet access: test13 (branches, good access)",
2523 		.insns = {
2524 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2525 				    offsetof(struct __sk_buff, data)),
2526 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2527 				    offsetof(struct __sk_buff, data_end)),
2528 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2529 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
2530 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13),
2531 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2532 				    offsetof(struct __sk_buff, mark)),
2533 			BPF_MOV64_IMM(BPF_REG_4, 1),
2534 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2),
2535 			BPF_MOV64_IMM(BPF_REG_3, 14),
2536 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
2537 			BPF_MOV64_IMM(BPF_REG_3, 24),
2538 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
2539 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
2540 			BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15),
2541 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
2542 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
2543 			BPF_MOV64_IMM(BPF_REG_0, 1),
2544 			BPF_EXIT_INSN(),
2545 			BPF_MOV64_IMM(BPF_REG_0, 0),
2546 			BPF_EXIT_INSN(),
2547 		},
2548 		.result = ACCEPT,
2549 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2550 	},
2551 	{
2552 		"direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)",
2553 		.insns = {
2554 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2555 				    offsetof(struct __sk_buff, data)),
2556 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2557 				    offsetof(struct __sk_buff, data_end)),
2558 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2559 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
2560 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7),
2561 			BPF_MOV64_IMM(BPF_REG_5, 12),
2562 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4),
2563 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
2564 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
2565 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
2566 			BPF_MOV64_IMM(BPF_REG_0, 1),
2567 			BPF_EXIT_INSN(),
2568 			BPF_MOV64_IMM(BPF_REG_0, 0),
2569 			BPF_EXIT_INSN(),
2570 		},
2571 		.result = ACCEPT,
2572 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2573 	},
2574 	{
2575 		"direct packet access: test15 (spill with xadd)",
2576 		.insns = {
2577 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2578 				    offsetof(struct __sk_buff, data)),
2579 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2580 				    offsetof(struct __sk_buff, data_end)),
2581 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2582 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2583 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
2584 			BPF_MOV64_IMM(BPF_REG_5, 4096),
2585 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
2586 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
2587 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
2588 			BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0),
2589 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
2590 			BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0),
2591 			BPF_MOV64_IMM(BPF_REG_0, 0),
2592 			BPF_EXIT_INSN(),
2593 		},
2594 		.errstr = "R2 invalid mem access 'inv'",
2595 		.result = REJECT,
2596 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2597 	},
2598 	{
2599 		"direct packet access: test16 (arith on data_end)",
2600 		.insns = {
2601 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2602 				    offsetof(struct __sk_buff, data)),
2603 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2604 				    offsetof(struct __sk_buff, data_end)),
2605 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
2606 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
2607 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16),
2608 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
2609 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
2610 			BPF_MOV64_IMM(BPF_REG_0, 0),
2611 			BPF_EXIT_INSN(),
2612 		},
2613 		.errstr = "invalid access to packet",
2614 		.result = REJECT,
2615 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2616 	},
2617 	{
2618 		"helper access to packet: test1, valid packet_ptr range",
2619 		.insns = {
2620 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2621 				    offsetof(struct xdp_md, data)),
2622 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2623 				    offsetof(struct xdp_md, data_end)),
2624 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
2625 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
2626 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5),
2627 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2628 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
2629 			BPF_MOV64_IMM(BPF_REG_4, 0),
2630 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2631 				     BPF_FUNC_map_update_elem),
2632 			BPF_MOV64_IMM(BPF_REG_0, 0),
2633 			BPF_EXIT_INSN(),
2634 		},
2635 		.fixup_map1 = { 5 },
2636 		.result_unpriv = ACCEPT,
2637 		.result = ACCEPT,
2638 		.prog_type = BPF_PROG_TYPE_XDP,
2639 	},
2640 	{
2641 		"helper access to packet: test2, unchecked packet_ptr",
2642 		.insns = {
2643 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2644 				    offsetof(struct xdp_md, data)),
2645 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2646 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2647 				     BPF_FUNC_map_lookup_elem),
2648 			BPF_MOV64_IMM(BPF_REG_0, 0),
2649 			BPF_EXIT_INSN(),
2650 		},
2651 		.fixup_map1 = { 1 },
2652 		.result = REJECT,
2653 		.errstr = "invalid access to packet",
2654 		.prog_type = BPF_PROG_TYPE_XDP,
2655 	},
2656 	{
2657 		"helper access to packet: test3, variable add",
2658 		.insns = {
2659 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2660 					offsetof(struct xdp_md, data)),
2661 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2662 					offsetof(struct xdp_md, data_end)),
2663 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2664 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
2665 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10),
2666 			BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0),
2667 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2668 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5),
2669 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
2670 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8),
2671 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4),
2672 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2673 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_4),
2674 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2675 				     BPF_FUNC_map_lookup_elem),
2676 			BPF_MOV64_IMM(BPF_REG_0, 0),
2677 			BPF_EXIT_INSN(),
2678 		},
2679 		.fixup_map1 = { 11 },
2680 		.result = ACCEPT,
2681 		.prog_type = BPF_PROG_TYPE_XDP,
2682 	},
2683 	{
2684 		"helper access to packet: test4, packet_ptr with bad range",
2685 		.insns = {
2686 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2687 				    offsetof(struct xdp_md, data)),
2688 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2689 				    offsetof(struct xdp_md, data_end)),
2690 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2691 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4),
2692 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2),
2693 			BPF_MOV64_IMM(BPF_REG_0, 0),
2694 			BPF_EXIT_INSN(),
2695 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2696 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2697 				     BPF_FUNC_map_lookup_elem),
2698 			BPF_MOV64_IMM(BPF_REG_0, 0),
2699 			BPF_EXIT_INSN(),
2700 		},
2701 		.fixup_map1 = { 7 },
2702 		.result = REJECT,
2703 		.errstr = "invalid access to packet",
2704 		.prog_type = BPF_PROG_TYPE_XDP,
2705 	},
2706 	{
2707 		"helper access to packet: test5, packet_ptr with too short range",
2708 		.insns = {
2709 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2710 				    offsetof(struct xdp_md, data)),
2711 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2712 				    offsetof(struct xdp_md, data_end)),
2713 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
2714 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2715 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7),
2716 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3),
2717 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2718 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2719 				     BPF_FUNC_map_lookup_elem),
2720 			BPF_MOV64_IMM(BPF_REG_0, 0),
2721 			BPF_EXIT_INSN(),
2722 		},
2723 		.fixup_map1 = { 6 },
2724 		.result = REJECT,
2725 		.errstr = "invalid access to packet",
2726 		.prog_type = BPF_PROG_TYPE_XDP,
2727 	},
2728 	{
2729 		"helper access to packet: test6, cls valid packet_ptr range",
2730 		.insns = {
2731 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2732 				    offsetof(struct __sk_buff, data)),
2733 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2734 				    offsetof(struct __sk_buff, data_end)),
2735 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
2736 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
2737 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5),
2738 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2739 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
2740 			BPF_MOV64_IMM(BPF_REG_4, 0),
2741 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2742 				     BPF_FUNC_map_update_elem),
2743 			BPF_MOV64_IMM(BPF_REG_0, 0),
2744 			BPF_EXIT_INSN(),
2745 		},
2746 		.fixup_map1 = { 5 },
2747 		.result = ACCEPT,
2748 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2749 	},
2750 	{
2751 		"helper access to packet: test7, cls unchecked packet_ptr",
2752 		.insns = {
2753 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2754 				    offsetof(struct __sk_buff, data)),
2755 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2756 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2757 				     BPF_FUNC_map_lookup_elem),
2758 			BPF_MOV64_IMM(BPF_REG_0, 0),
2759 			BPF_EXIT_INSN(),
2760 		},
2761 		.fixup_map1 = { 1 },
2762 		.result = REJECT,
2763 		.errstr = "invalid access to packet",
2764 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2765 	},
2766 	{
2767 		"helper access to packet: test8, cls variable add",
2768 		.insns = {
2769 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2770 					offsetof(struct __sk_buff, data)),
2771 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2772 					offsetof(struct __sk_buff, data_end)),
2773 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2774 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
2775 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10),
2776 			BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0),
2777 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2778 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5),
2779 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
2780 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8),
2781 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4),
2782 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2783 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_4),
2784 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2785 				     BPF_FUNC_map_lookup_elem),
2786 			BPF_MOV64_IMM(BPF_REG_0, 0),
2787 			BPF_EXIT_INSN(),
2788 		},
2789 		.fixup_map1 = { 11 },
2790 		.result = ACCEPT,
2791 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2792 	},
2793 	{
2794 		"helper access to packet: test9, cls packet_ptr with bad range",
2795 		.insns = {
2796 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2797 				    offsetof(struct __sk_buff, data)),
2798 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2799 				    offsetof(struct __sk_buff, data_end)),
2800 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2801 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4),
2802 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2),
2803 			BPF_MOV64_IMM(BPF_REG_0, 0),
2804 			BPF_EXIT_INSN(),
2805 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2806 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2807 				     BPF_FUNC_map_lookup_elem),
2808 			BPF_MOV64_IMM(BPF_REG_0, 0),
2809 			BPF_EXIT_INSN(),
2810 		},
2811 		.fixup_map1 = { 7 },
2812 		.result = REJECT,
2813 		.errstr = "invalid access to packet",
2814 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2815 	},
2816 	{
2817 		"helper access to packet: test10, cls packet_ptr with too short range",
2818 		.insns = {
2819 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
2820 				    offsetof(struct __sk_buff, data)),
2821 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
2822 				    offsetof(struct __sk_buff, data_end)),
2823 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
2824 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2825 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7),
2826 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3),
2827 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2828 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2829 				     BPF_FUNC_map_lookup_elem),
2830 			BPF_MOV64_IMM(BPF_REG_0, 0),
2831 			BPF_EXIT_INSN(),
2832 		},
2833 		.fixup_map1 = { 6 },
2834 		.result = REJECT,
2835 		.errstr = "invalid access to packet",
2836 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2837 	},
2838 	{
2839 		"helper access to packet: test11, cls unsuitable helper 1",
2840 		.insns = {
2841 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2842 				    offsetof(struct __sk_buff, data)),
2843 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2844 				    offsetof(struct __sk_buff, data_end)),
2845 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
2846 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2847 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 7),
2848 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_7, 4),
2849 			BPF_MOV64_IMM(BPF_REG_2, 0),
2850 			BPF_MOV64_IMM(BPF_REG_4, 42),
2851 			BPF_MOV64_IMM(BPF_REG_5, 0),
2852 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2853 				     BPF_FUNC_skb_store_bytes),
2854 			BPF_MOV64_IMM(BPF_REG_0, 0),
2855 			BPF_EXIT_INSN(),
2856 		},
2857 		.result = REJECT,
2858 		.errstr = "helper access to the packet",
2859 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2860 	},
2861 	{
2862 		"helper access to packet: test12, cls unsuitable helper 2",
2863 		.insns = {
2864 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2865 				    offsetof(struct __sk_buff, data)),
2866 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2867 				    offsetof(struct __sk_buff, data_end)),
2868 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2869 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8),
2870 			BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 3),
2871 			BPF_MOV64_IMM(BPF_REG_2, 0),
2872 			BPF_MOV64_IMM(BPF_REG_4, 4),
2873 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2874 				     BPF_FUNC_skb_load_bytes),
2875 			BPF_MOV64_IMM(BPF_REG_0, 0),
2876 			BPF_EXIT_INSN(),
2877 		},
2878 		.result = REJECT,
2879 		.errstr = "helper access to the packet",
2880 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2881 	},
2882 	{
2883 		"helper access to packet: test13, cls helper ok",
2884 		.insns = {
2885 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2886 				    offsetof(struct __sk_buff, data)),
2887 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2888 				    offsetof(struct __sk_buff, data_end)),
2889 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
2890 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2891 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
2892 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
2893 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2894 			BPF_MOV64_IMM(BPF_REG_2, 4),
2895 			BPF_MOV64_IMM(BPF_REG_3, 0),
2896 			BPF_MOV64_IMM(BPF_REG_4, 0),
2897 			BPF_MOV64_IMM(BPF_REG_5, 0),
2898 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2899 				     BPF_FUNC_csum_diff),
2900 			BPF_MOV64_IMM(BPF_REG_0, 0),
2901 			BPF_EXIT_INSN(),
2902 		},
2903 		.result = ACCEPT,
2904 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2905 	},
2906 	{
2907 		"helper access to packet: test14, cls helper fail sub",
2908 		.insns = {
2909 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2910 				    offsetof(struct __sk_buff, data)),
2911 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2912 				    offsetof(struct __sk_buff, data_end)),
2913 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
2914 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2915 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
2916 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
2917 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 4),
2918 			BPF_MOV64_IMM(BPF_REG_2, 4),
2919 			BPF_MOV64_IMM(BPF_REG_3, 0),
2920 			BPF_MOV64_IMM(BPF_REG_4, 0),
2921 			BPF_MOV64_IMM(BPF_REG_5, 0),
2922 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2923 				     BPF_FUNC_csum_diff),
2924 			BPF_MOV64_IMM(BPF_REG_0, 0),
2925 			BPF_EXIT_INSN(),
2926 		},
2927 		.result = REJECT,
2928 		.errstr = "type=inv expected=fp",
2929 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2930 	},
2931 	{
2932 		"helper access to packet: test15, cls helper fail range 1",
2933 		.insns = {
2934 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2935 				    offsetof(struct __sk_buff, data)),
2936 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2937 				    offsetof(struct __sk_buff, data_end)),
2938 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
2939 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2940 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
2941 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
2942 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2943 			BPF_MOV64_IMM(BPF_REG_2, 8),
2944 			BPF_MOV64_IMM(BPF_REG_3, 0),
2945 			BPF_MOV64_IMM(BPF_REG_4, 0),
2946 			BPF_MOV64_IMM(BPF_REG_5, 0),
2947 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2948 				     BPF_FUNC_csum_diff),
2949 			BPF_MOV64_IMM(BPF_REG_0, 0),
2950 			BPF_EXIT_INSN(),
2951 		},
2952 		.result = REJECT,
2953 		.errstr = "invalid access to packet",
2954 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2955 	},
2956 	{
2957 		"helper access to packet: test16, cls helper fail range 2",
2958 		.insns = {
2959 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2960 				    offsetof(struct __sk_buff, data)),
2961 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2962 				    offsetof(struct __sk_buff, data_end)),
2963 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
2964 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2965 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
2966 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
2967 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2968 			BPF_MOV64_IMM(BPF_REG_2, -9),
2969 			BPF_MOV64_IMM(BPF_REG_3, 0),
2970 			BPF_MOV64_IMM(BPF_REG_4, 0),
2971 			BPF_MOV64_IMM(BPF_REG_5, 0),
2972 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2973 				     BPF_FUNC_csum_diff),
2974 			BPF_MOV64_IMM(BPF_REG_0, 0),
2975 			BPF_EXIT_INSN(),
2976 		},
2977 		.result = REJECT,
2978 		.errstr = "invalid access to packet",
2979 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2980 	},
2981 	{
2982 		"helper access to packet: test17, cls helper fail range 3",
2983 		.insns = {
2984 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
2985 				    offsetof(struct __sk_buff, data)),
2986 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
2987 				    offsetof(struct __sk_buff, data_end)),
2988 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
2989 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2990 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
2991 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
2992 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2993 			BPF_MOV64_IMM(BPF_REG_2, ~0),
2994 			BPF_MOV64_IMM(BPF_REG_3, 0),
2995 			BPF_MOV64_IMM(BPF_REG_4, 0),
2996 			BPF_MOV64_IMM(BPF_REG_5, 0),
2997 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2998 				     BPF_FUNC_csum_diff),
2999 			BPF_MOV64_IMM(BPF_REG_0, 0),
3000 			BPF_EXIT_INSN(),
3001 		},
3002 		.result = REJECT,
3003 		.errstr = "invalid access to packet",
3004 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3005 	},
3006 	{
3007 		"helper access to packet: test18, cls helper fail range zero",
3008 		.insns = {
3009 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
3010 				    offsetof(struct __sk_buff, data)),
3011 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
3012 				    offsetof(struct __sk_buff, data_end)),
3013 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
3014 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
3015 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
3016 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
3017 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
3018 			BPF_MOV64_IMM(BPF_REG_2, 0),
3019 			BPF_MOV64_IMM(BPF_REG_3, 0),
3020 			BPF_MOV64_IMM(BPF_REG_4, 0),
3021 			BPF_MOV64_IMM(BPF_REG_5, 0),
3022 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3023 				     BPF_FUNC_csum_diff),
3024 			BPF_MOV64_IMM(BPF_REG_0, 0),
3025 			BPF_EXIT_INSN(),
3026 		},
3027 		.result = REJECT,
3028 		.errstr = "invalid access to packet",
3029 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3030 	},
3031 	{
3032 		"helper access to packet: test19, pkt end as input",
3033 		.insns = {
3034 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
3035 				    offsetof(struct __sk_buff, data)),
3036 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
3037 				    offsetof(struct __sk_buff, data_end)),
3038 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
3039 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
3040 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
3041 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
3042 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
3043 			BPF_MOV64_IMM(BPF_REG_2, 4),
3044 			BPF_MOV64_IMM(BPF_REG_3, 0),
3045 			BPF_MOV64_IMM(BPF_REG_4, 0),
3046 			BPF_MOV64_IMM(BPF_REG_5, 0),
3047 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3048 				     BPF_FUNC_csum_diff),
3049 			BPF_MOV64_IMM(BPF_REG_0, 0),
3050 			BPF_EXIT_INSN(),
3051 		},
3052 		.result = REJECT,
3053 		.errstr = "R1 type=pkt_end expected=fp",
3054 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3055 	},
3056 	{
3057 		"helper access to packet: test20, wrong reg",
3058 		.insns = {
3059 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
3060 				    offsetof(struct __sk_buff, data)),
3061 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
3062 				    offsetof(struct __sk_buff, data_end)),
3063 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
3064 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
3065 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
3066 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
3067 			BPF_MOV64_IMM(BPF_REG_2, 4),
3068 			BPF_MOV64_IMM(BPF_REG_3, 0),
3069 			BPF_MOV64_IMM(BPF_REG_4, 0),
3070 			BPF_MOV64_IMM(BPF_REG_5, 0),
3071 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3072 				     BPF_FUNC_csum_diff),
3073 			BPF_MOV64_IMM(BPF_REG_0, 0),
3074 			BPF_EXIT_INSN(),
3075 		},
3076 		.result = REJECT,
3077 		.errstr = "invalid access to packet",
3078 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3079 	},
3080 	{
3081 		"valid map access into an array with a constant",
3082 		.insns = {
3083 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3084 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3085 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3086 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3087 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3088 				     BPF_FUNC_map_lookup_elem),
3089 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3090 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3091 				   offsetof(struct test_val, foo)),
3092 			BPF_EXIT_INSN(),
3093 		},
3094 		.fixup_map2 = { 3 },
3095 		.errstr_unpriv = "R0 leaks addr",
3096 		.result_unpriv = REJECT,
3097 		.result = ACCEPT,
3098 	},
3099 	{
3100 		"valid map access into an array with a register",
3101 		.insns = {
3102 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3103 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3104 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3105 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3106 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3107 				     BPF_FUNC_map_lookup_elem),
3108 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3109 			BPF_MOV64_IMM(BPF_REG_1, 4),
3110 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
3111 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3112 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3113 				   offsetof(struct test_val, foo)),
3114 			BPF_EXIT_INSN(),
3115 		},
3116 		.fixup_map2 = { 3 },
3117 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3118 		.result_unpriv = REJECT,
3119 		.result = ACCEPT,
3120 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3121 	},
3122 	{
3123 		"valid map access into an array with a variable",
3124 		.insns = {
3125 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3126 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3127 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3128 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3129 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3130 				     BPF_FUNC_map_lookup_elem),
3131 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3132 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
3133 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3),
3134 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
3135 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3136 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3137 				   offsetof(struct test_val, foo)),
3138 			BPF_EXIT_INSN(),
3139 		},
3140 		.fixup_map2 = { 3 },
3141 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3142 		.result_unpriv = REJECT,
3143 		.result = ACCEPT,
3144 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3145 	},
3146 	{
3147 		"valid map access into an array with a signed variable",
3148 		.insns = {
3149 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3150 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3151 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3152 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3153 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3154 				     BPF_FUNC_map_lookup_elem),
3155 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
3156 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
3157 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1),
3158 			BPF_MOV32_IMM(BPF_REG_1, 0),
3159 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
3160 			BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
3161 			BPF_MOV32_IMM(BPF_REG_1, 0),
3162 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
3163 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3164 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3165 				   offsetof(struct test_val, foo)),
3166 			BPF_EXIT_INSN(),
3167 		},
3168 		.fixup_map2 = { 3 },
3169 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3170 		.result_unpriv = REJECT,
3171 		.result = ACCEPT,
3172 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3173 	},
3174 	{
3175 		"invalid map access into an array with a constant",
3176 		.insns = {
3177 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3178 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3179 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3180 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3181 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3182 				     BPF_FUNC_map_lookup_elem),
3183 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3184 			BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2,
3185 				   offsetof(struct test_val, foo)),
3186 			BPF_EXIT_INSN(),
3187 		},
3188 		.fixup_map2 = { 3 },
3189 		.errstr = "invalid access to map value, value_size=48 off=48 size=8",
3190 		.result = REJECT,
3191 	},
3192 	{
3193 		"invalid map access into an array with a register",
3194 		.insns = {
3195 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3196 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3197 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3198 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3199 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3200 				     BPF_FUNC_map_lookup_elem),
3201 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3202 			BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1),
3203 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
3204 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3205 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3206 				   offsetof(struct test_val, foo)),
3207 			BPF_EXIT_INSN(),
3208 		},
3209 		.fixup_map2 = { 3 },
3210 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3211 		.errstr = "R0 min value is outside of the array range",
3212 		.result_unpriv = REJECT,
3213 		.result = REJECT,
3214 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3215 	},
3216 	{
3217 		"invalid map access into an array with a variable",
3218 		.insns = {
3219 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3220 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3221 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3222 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3223 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3224 				     BPF_FUNC_map_lookup_elem),
3225 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3226 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
3227 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
3228 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3229 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3230 				   offsetof(struct test_val, foo)),
3231 			BPF_EXIT_INSN(),
3232 		},
3233 		.fixup_map2 = { 3 },
3234 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3235 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
3236 		.result_unpriv = REJECT,
3237 		.result = REJECT,
3238 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3239 	},
3240 	{
3241 		"invalid map access into an array with no floor check",
3242 		.insns = {
3243 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3244 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3245 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3246 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3247 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3248 				     BPF_FUNC_map_lookup_elem),
3249 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
3250 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
3251 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
3252 			BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
3253 			BPF_MOV32_IMM(BPF_REG_1, 0),
3254 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
3255 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3256 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3257 				   offsetof(struct test_val, foo)),
3258 			BPF_EXIT_INSN(),
3259 		},
3260 		.fixup_map2 = { 3 },
3261 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3262 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
3263 		.result_unpriv = REJECT,
3264 		.result = REJECT,
3265 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3266 	},
3267 	{
3268 		"invalid map access into an array with a invalid max check",
3269 		.insns = {
3270 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3271 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3272 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3273 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3274 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3275 				     BPF_FUNC_map_lookup_elem),
3276 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
3277 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
3278 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1),
3279 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
3280 			BPF_MOV32_IMM(BPF_REG_1, 0),
3281 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
3282 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3283 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
3284 				   offsetof(struct test_val, foo)),
3285 			BPF_EXIT_INSN(),
3286 		},
3287 		.fixup_map2 = { 3 },
3288 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3289 		.errstr = "invalid access to map value, value_size=48 off=44 size=8",
3290 		.result_unpriv = REJECT,
3291 		.result = REJECT,
3292 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3293 	},
3294 	{
3295 		"invalid map access into an array with a invalid max check",
3296 		.insns = {
3297 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3298 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3299 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3300 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3301 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3302 				     BPF_FUNC_map_lookup_elem),
3303 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
3304 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
3305 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3306 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3307 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3308 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3309 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3310 				     BPF_FUNC_map_lookup_elem),
3311 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
3312 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8),
3313 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
3314 				    offsetof(struct test_val, foo)),
3315 			BPF_EXIT_INSN(),
3316 		},
3317 		.fixup_map2 = { 3, 11 },
3318 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3319 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
3320 		.result_unpriv = REJECT,
3321 		.result = REJECT,
3322 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3323 	},
3324 	{
3325 		"multiple registers share map_lookup_elem result",
3326 		.insns = {
3327 			BPF_MOV64_IMM(BPF_REG_1, 10),
3328 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
3329 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3330 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3331 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3332 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3333 				     BPF_FUNC_map_lookup_elem),
3334 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3335 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3336 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
3337 			BPF_EXIT_INSN(),
3338 		},
3339 		.fixup_map1 = { 4 },
3340 		.result = ACCEPT,
3341 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
3342 	},
3343 	{
3344 		"invalid memory access with multiple map_lookup_elem calls",
3345 		.insns = {
3346 			BPF_MOV64_IMM(BPF_REG_1, 10),
3347 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
3348 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3349 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3350 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3351 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
3352 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
3353 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3354 				     BPF_FUNC_map_lookup_elem),
3355 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3356 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
3357 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
3358 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3359 				     BPF_FUNC_map_lookup_elem),
3360 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3361 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
3362 			BPF_EXIT_INSN(),
3363 		},
3364 		.fixup_map1 = { 4 },
3365 		.result = REJECT,
3366 		.errstr = "R4 !read_ok",
3367 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
3368 	},
3369 	{
3370 		"valid indirect map_lookup_elem access with 2nd lookup in branch",
3371 		.insns = {
3372 			BPF_MOV64_IMM(BPF_REG_1, 10),
3373 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
3374 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3375 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3376 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3377 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
3378 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
3379 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3380 				     BPF_FUNC_map_lookup_elem),
3381 			BPF_MOV64_IMM(BPF_REG_2, 10),
3382 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3),
3383 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
3384 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
3385 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3386 				     BPF_FUNC_map_lookup_elem),
3387 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3388 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3389 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
3390 			BPF_EXIT_INSN(),
3391 		},
3392 		.fixup_map1 = { 4 },
3393 		.result = ACCEPT,
3394 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
3395 	},
3396 	{
3397 		"multiple registers share map_lookup_elem bad reg type",
3398 		.insns = {
3399 			BPF_MOV64_IMM(BPF_REG_1, 10),
3400 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
3401 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3402 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3403 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3404 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3405 				     BPF_FUNC_map_lookup_elem),
3406 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
3407 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
3408 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3409 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_0),
3410 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3411 			BPF_MOV64_IMM(BPF_REG_1, 1),
3412 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3413 			BPF_MOV64_IMM(BPF_REG_1, 2),
3414 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0, 1),
3415 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 0),
3416 			BPF_MOV64_IMM(BPF_REG_1, 3),
3417 			BPF_EXIT_INSN(),
3418 		},
3419 		.fixup_map1 = { 4 },
3420 		.result = REJECT,
3421 		.errstr = "R3 invalid mem access 'inv'",
3422 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
3423 	},
3424 	{
3425 		"invalid map access from else condition",
3426 		.insns = {
3427 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3428 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3429 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3430 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3431 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
3432 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
3433 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
3434 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1),
3435 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1),
3436 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
3437 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
3438 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
3439 			BPF_EXIT_INSN(),
3440 		},
3441 		.fixup_map2 = { 3 },
3442 		.errstr = "R0 unbounded memory access, make sure to bounds check any array access into a map",
3443 		.result = REJECT,
3444 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
3445 		.result_unpriv = REJECT,
3446 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3447 	},
3448 	{
3449 		"constant register |= constant should keep constant type",
3450 		.insns = {
3451 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
3452 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
3453 			BPF_MOV64_IMM(BPF_REG_2, 34),
3454 			BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13),
3455 			BPF_MOV64_IMM(BPF_REG_3, 0),
3456 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3457 			BPF_EXIT_INSN(),
3458 		},
3459 		.result = ACCEPT,
3460 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3461 	},
3462 	{
3463 		"constant register |= constant should not bypass stack boundary checks",
3464 		.insns = {
3465 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
3466 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
3467 			BPF_MOV64_IMM(BPF_REG_2, 34),
3468 			BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24),
3469 			BPF_MOV64_IMM(BPF_REG_3, 0),
3470 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3471 			BPF_EXIT_INSN(),
3472 		},
3473 		.errstr = "invalid stack type R1 off=-48 access_size=58",
3474 		.result = REJECT,
3475 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3476 	},
3477 	{
3478 		"constant register |= constant register should keep constant type",
3479 		.insns = {
3480 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
3481 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
3482 			BPF_MOV64_IMM(BPF_REG_2, 34),
3483 			BPF_MOV64_IMM(BPF_REG_4, 13),
3484 			BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4),
3485 			BPF_MOV64_IMM(BPF_REG_3, 0),
3486 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3487 			BPF_EXIT_INSN(),
3488 		},
3489 		.result = ACCEPT,
3490 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3491 	},
3492 	{
3493 		"constant register |= constant register should not bypass stack boundary checks",
3494 		.insns = {
3495 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
3496 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
3497 			BPF_MOV64_IMM(BPF_REG_2, 34),
3498 			BPF_MOV64_IMM(BPF_REG_4, 24),
3499 			BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4),
3500 			BPF_MOV64_IMM(BPF_REG_3, 0),
3501 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3502 			BPF_EXIT_INSN(),
3503 		},
3504 		.errstr = "invalid stack type R1 off=-48 access_size=58",
3505 		.result = REJECT,
3506 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3507 	},
3508 	{
3509 		"invalid direct packet write for LWT_IN",
3510 		.insns = {
3511 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3512 				    offsetof(struct __sk_buff, data)),
3513 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3514 				    offsetof(struct __sk_buff, data_end)),
3515 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3516 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3517 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3518 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3519 			BPF_MOV64_IMM(BPF_REG_0, 0),
3520 			BPF_EXIT_INSN(),
3521 		},
3522 		.errstr = "cannot write into packet",
3523 		.result = REJECT,
3524 		.prog_type = BPF_PROG_TYPE_LWT_IN,
3525 	},
3526 	{
3527 		"invalid direct packet write for LWT_OUT",
3528 		.insns = {
3529 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3530 				    offsetof(struct __sk_buff, data)),
3531 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3532 				    offsetof(struct __sk_buff, data_end)),
3533 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3534 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3535 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3536 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3537 			BPF_MOV64_IMM(BPF_REG_0, 0),
3538 			BPF_EXIT_INSN(),
3539 		},
3540 		.errstr = "cannot write into packet",
3541 		.result = REJECT,
3542 		.prog_type = BPF_PROG_TYPE_LWT_OUT,
3543 	},
3544 	{
3545 		"direct packet write for LWT_XMIT",
3546 		.insns = {
3547 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3548 				    offsetof(struct __sk_buff, data)),
3549 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3550 				    offsetof(struct __sk_buff, data_end)),
3551 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3552 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3553 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3554 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3555 			BPF_MOV64_IMM(BPF_REG_0, 0),
3556 			BPF_EXIT_INSN(),
3557 		},
3558 		.result = ACCEPT,
3559 		.prog_type = BPF_PROG_TYPE_LWT_XMIT,
3560 	},
3561 	{
3562 		"direct packet read for LWT_IN",
3563 		.insns = {
3564 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3565 				    offsetof(struct __sk_buff, data)),
3566 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3567 				    offsetof(struct __sk_buff, data_end)),
3568 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3569 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3570 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3571 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3572 			BPF_MOV64_IMM(BPF_REG_0, 0),
3573 			BPF_EXIT_INSN(),
3574 		},
3575 		.result = ACCEPT,
3576 		.prog_type = BPF_PROG_TYPE_LWT_IN,
3577 	},
3578 	{
3579 		"direct packet read for LWT_OUT",
3580 		.insns = {
3581 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3582 				    offsetof(struct __sk_buff, data)),
3583 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3584 				    offsetof(struct __sk_buff, data_end)),
3585 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3586 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3587 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3588 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3589 			BPF_MOV64_IMM(BPF_REG_0, 0),
3590 			BPF_EXIT_INSN(),
3591 		},
3592 		.result = ACCEPT,
3593 		.prog_type = BPF_PROG_TYPE_LWT_OUT,
3594 	},
3595 	{
3596 		"direct packet read for LWT_XMIT",
3597 		.insns = {
3598 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3599 				    offsetof(struct __sk_buff, data)),
3600 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3601 				    offsetof(struct __sk_buff, data_end)),
3602 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3603 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3604 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3605 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3606 			BPF_MOV64_IMM(BPF_REG_0, 0),
3607 			BPF_EXIT_INSN(),
3608 		},
3609 		.result = ACCEPT,
3610 		.prog_type = BPF_PROG_TYPE_LWT_XMIT,
3611 	},
3612 	{
3613 		"overlapping checks for direct packet access",
3614 		.insns = {
3615 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3616 				    offsetof(struct __sk_buff, data)),
3617 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3618 				    offsetof(struct __sk_buff, data_end)),
3619 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3620 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3621 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
3622 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
3623 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
3624 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
3625 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
3626 			BPF_MOV64_IMM(BPF_REG_0, 0),
3627 			BPF_EXIT_INSN(),
3628 		},
3629 		.result = ACCEPT,
3630 		.prog_type = BPF_PROG_TYPE_LWT_XMIT,
3631 	},
3632 	{
3633 		"invalid access of tc_classid for LWT_IN",
3634 		.insns = {
3635 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
3636 				    offsetof(struct __sk_buff, tc_classid)),
3637 			BPF_EXIT_INSN(),
3638 		},
3639 		.result = REJECT,
3640 		.errstr = "invalid bpf_context access",
3641 	},
3642 	{
3643 		"invalid access of tc_classid for LWT_OUT",
3644 		.insns = {
3645 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
3646 				    offsetof(struct __sk_buff, tc_classid)),
3647 			BPF_EXIT_INSN(),
3648 		},
3649 		.result = REJECT,
3650 		.errstr = "invalid bpf_context access",
3651 	},
3652 	{
3653 		"invalid access of tc_classid for LWT_XMIT",
3654 		.insns = {
3655 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
3656 				    offsetof(struct __sk_buff, tc_classid)),
3657 			BPF_EXIT_INSN(),
3658 		},
3659 		.result = REJECT,
3660 		.errstr = "invalid bpf_context access",
3661 	},
3662 	{
3663 		"helper access to map: full range",
3664 		.insns = {
3665 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3666 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3667 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3668 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3669 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3670 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3671 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3672 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
3673 			BPF_MOV64_IMM(BPF_REG_3, 0),
3674 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3675 			BPF_EXIT_INSN(),
3676 		},
3677 		.fixup_map2 = { 3 },
3678 		.result = ACCEPT,
3679 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3680 	},
3681 	{
3682 		"helper access to map: partial range",
3683 		.insns = {
3684 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3685 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3686 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3687 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3688 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3689 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3690 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3691 			BPF_MOV64_IMM(BPF_REG_2, 8),
3692 			BPF_MOV64_IMM(BPF_REG_3, 0),
3693 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3694 			BPF_EXIT_INSN(),
3695 		},
3696 		.fixup_map2 = { 3 },
3697 		.result = ACCEPT,
3698 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3699 	},
3700 	{
3701 		"helper access to map: empty range",
3702 		.insns = {
3703 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3704 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3705 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3706 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3707 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3708 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3709 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3710 			BPF_MOV64_IMM(BPF_REG_2, 0),
3711 			BPF_MOV64_IMM(BPF_REG_3, 0),
3712 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3713 			BPF_EXIT_INSN(),
3714 		},
3715 		.fixup_map2 = { 3 },
3716 		.errstr = "invalid access to map value, value_size=48 off=0 size=0",
3717 		.result = REJECT,
3718 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3719 	},
3720 	{
3721 		"helper access to map: out-of-bound range",
3722 		.insns = {
3723 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3724 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3725 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3726 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3727 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3728 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3729 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3730 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8),
3731 			BPF_MOV64_IMM(BPF_REG_3, 0),
3732 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3733 			BPF_EXIT_INSN(),
3734 		},
3735 		.fixup_map2 = { 3 },
3736 		.errstr = "invalid access to map value, value_size=48 off=0 size=56",
3737 		.result = REJECT,
3738 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3739 	},
3740 	{
3741 		"helper access to map: negative range",
3742 		.insns = {
3743 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3744 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3745 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3746 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3747 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3748 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
3749 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3750 			BPF_MOV64_IMM(BPF_REG_2, -8),
3751 			BPF_MOV64_IMM(BPF_REG_3, 0),
3752 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3753 			BPF_EXIT_INSN(),
3754 		},
3755 		.fixup_map2 = { 3 },
3756 		.errstr = "invalid access to map value, value_size=48 off=0 size=-8",
3757 		.result = REJECT,
3758 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3759 	},
3760 	{
3761 		"helper access to adjusted map (via const imm): full range",
3762 		.insns = {
3763 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3764 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3765 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3766 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3767 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3768 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3769 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3770 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
3771 				offsetof(struct test_val, foo)),
3772 			BPF_MOV64_IMM(BPF_REG_2,
3773 				sizeof(struct test_val) -
3774 				offsetof(struct test_val, foo)),
3775 			BPF_MOV64_IMM(BPF_REG_3, 0),
3776 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3777 			BPF_EXIT_INSN(),
3778 		},
3779 		.fixup_map2 = { 3 },
3780 		.result = ACCEPT,
3781 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3782 	},
3783 	{
3784 		"helper access to adjusted map (via const imm): partial range",
3785 		.insns = {
3786 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3787 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3788 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3789 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3790 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3791 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3792 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3793 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
3794 				offsetof(struct test_val, foo)),
3795 			BPF_MOV64_IMM(BPF_REG_2, 8),
3796 			BPF_MOV64_IMM(BPF_REG_3, 0),
3797 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3798 			BPF_EXIT_INSN(),
3799 		},
3800 		.fixup_map2 = { 3 },
3801 		.result = ACCEPT,
3802 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3803 	},
3804 	{
3805 		"helper access to adjusted map (via const imm): empty range",
3806 		.insns = {
3807 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3808 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3809 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3810 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3811 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3812 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3813 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3814 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
3815 				offsetof(struct test_val, foo)),
3816 			BPF_MOV64_IMM(BPF_REG_2, 0),
3817 			BPF_MOV64_IMM(BPF_REG_3, 0),
3818 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3819 			BPF_EXIT_INSN(),
3820 		},
3821 		.fixup_map2 = { 3 },
3822 		.errstr = "R1 min value is outside of the array range",
3823 		.result = REJECT,
3824 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3825 	},
3826 	{
3827 		"helper access to adjusted map (via const imm): out-of-bound range",
3828 		.insns = {
3829 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3830 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3831 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3832 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3833 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3834 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3835 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3836 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
3837 				offsetof(struct test_val, foo)),
3838 			BPF_MOV64_IMM(BPF_REG_2,
3839 				sizeof(struct test_val) -
3840 				offsetof(struct test_val, foo) + 8),
3841 			BPF_MOV64_IMM(BPF_REG_3, 0),
3842 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3843 			BPF_EXIT_INSN(),
3844 		},
3845 		.fixup_map2 = { 3 },
3846 		.errstr = "invalid access to map value, value_size=48 off=4 size=52",
3847 		.result = REJECT,
3848 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3849 	},
3850 	{
3851 		"helper access to adjusted map (via const imm): negative range (> adjustment)",
3852 		.insns = {
3853 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3854 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3855 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3856 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3857 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3858 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3859 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3860 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
3861 				offsetof(struct test_val, foo)),
3862 			BPF_MOV64_IMM(BPF_REG_2, -8),
3863 			BPF_MOV64_IMM(BPF_REG_3, 0),
3864 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3865 			BPF_EXIT_INSN(),
3866 		},
3867 		.fixup_map2 = { 3 },
3868 		.errstr = "invalid access to map value, value_size=48 off=4 size=-8",
3869 		.result = REJECT,
3870 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3871 	},
3872 	{
3873 		"helper access to adjusted map (via const imm): negative range (< adjustment)",
3874 		.insns = {
3875 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3876 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3877 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3878 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3879 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3880 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
3881 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3882 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
3883 				offsetof(struct test_val, foo)),
3884 			BPF_MOV64_IMM(BPF_REG_2, -1),
3885 			BPF_MOV64_IMM(BPF_REG_3, 0),
3886 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3887 			BPF_EXIT_INSN(),
3888 		},
3889 		.fixup_map2 = { 3 },
3890 		.errstr = "R1 min value is outside of the array range",
3891 		.result = REJECT,
3892 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3893 	},
3894 	{
3895 		"helper access to adjusted map (via const reg): full range",
3896 		.insns = {
3897 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3898 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3899 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3900 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3901 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3902 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
3903 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3904 			BPF_MOV64_IMM(BPF_REG_3,
3905 				offsetof(struct test_val, foo)),
3906 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
3907 			BPF_MOV64_IMM(BPF_REG_2,
3908 				sizeof(struct test_val) -
3909 				offsetof(struct test_val, foo)),
3910 			BPF_MOV64_IMM(BPF_REG_3, 0),
3911 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3912 			BPF_EXIT_INSN(),
3913 		},
3914 		.fixup_map2 = { 3 },
3915 		.result = ACCEPT,
3916 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3917 	},
3918 	{
3919 		"helper access to adjusted map (via const reg): partial range",
3920 		.insns = {
3921 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3922 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3923 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3924 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3925 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3926 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
3927 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3928 			BPF_MOV64_IMM(BPF_REG_3,
3929 				offsetof(struct test_val, foo)),
3930 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
3931 			BPF_MOV64_IMM(BPF_REG_2, 8),
3932 			BPF_MOV64_IMM(BPF_REG_3, 0),
3933 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3934 			BPF_EXIT_INSN(),
3935 		},
3936 		.fixup_map2 = { 3 },
3937 		.result = ACCEPT,
3938 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3939 	},
3940 	{
3941 		"helper access to adjusted map (via const reg): empty range",
3942 		.insns = {
3943 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3944 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3945 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3946 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3947 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3948 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
3949 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3950 			BPF_MOV64_IMM(BPF_REG_3, 0),
3951 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
3952 			BPF_MOV64_IMM(BPF_REG_2, 0),
3953 			BPF_MOV64_IMM(BPF_REG_3, 0),
3954 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3955 			BPF_EXIT_INSN(),
3956 		},
3957 		.fixup_map2 = { 3 },
3958 		.errstr = "R1 min value is outside of the array range",
3959 		.result = REJECT,
3960 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3961 	},
3962 	{
3963 		"helper access to adjusted map (via const reg): out-of-bound range",
3964 		.insns = {
3965 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3966 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3967 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3968 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3969 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3970 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
3971 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3972 			BPF_MOV64_IMM(BPF_REG_3,
3973 				offsetof(struct test_val, foo)),
3974 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
3975 			BPF_MOV64_IMM(BPF_REG_2,
3976 				sizeof(struct test_val) -
3977 				offsetof(struct test_val, foo) + 8),
3978 			BPF_MOV64_IMM(BPF_REG_3, 0),
3979 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
3980 			BPF_EXIT_INSN(),
3981 		},
3982 		.fixup_map2 = { 3 },
3983 		.errstr = "invalid access to map value, value_size=48 off=4 size=52",
3984 		.result = REJECT,
3985 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3986 	},
3987 	{
3988 		"helper access to adjusted map (via const reg): negative range (> adjustment)",
3989 		.insns = {
3990 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3991 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3992 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
3993 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3994 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3995 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
3996 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3997 			BPF_MOV64_IMM(BPF_REG_3,
3998 				offsetof(struct test_val, foo)),
3999 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4000 			BPF_MOV64_IMM(BPF_REG_2, -8),
4001 			BPF_MOV64_IMM(BPF_REG_3, 0),
4002 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4003 			BPF_EXIT_INSN(),
4004 		},
4005 		.fixup_map2 = { 3 },
4006 		.errstr = "invalid access to map value, value_size=48 off=4 size=-8",
4007 		.result = REJECT,
4008 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4009 	},
4010 	{
4011 		"helper access to adjusted map (via const reg): negative range (< adjustment)",
4012 		.insns = {
4013 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4014 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4015 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4016 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4017 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4018 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
4019 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4020 			BPF_MOV64_IMM(BPF_REG_3,
4021 				offsetof(struct test_val, foo)),
4022 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4023 			BPF_MOV64_IMM(BPF_REG_2, -1),
4024 			BPF_MOV64_IMM(BPF_REG_3, 0),
4025 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4026 			BPF_EXIT_INSN(),
4027 		},
4028 		.fixup_map2 = { 3 },
4029 		.errstr = "R1 min value is outside of the array range",
4030 		.result = REJECT,
4031 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4032 	},
4033 	{
4034 		"helper access to adjusted map (via variable): full range",
4035 		.insns = {
4036 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4037 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4038 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4039 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4040 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4041 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4042 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4043 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
4044 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
4045 				offsetof(struct test_val, foo), 4),
4046 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4047 			BPF_MOV64_IMM(BPF_REG_2,
4048 				sizeof(struct test_val) -
4049 				offsetof(struct test_val, foo)),
4050 			BPF_MOV64_IMM(BPF_REG_3, 0),
4051 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4052 			BPF_EXIT_INSN(),
4053 		},
4054 		.fixup_map2 = { 3 },
4055 		.result = ACCEPT,
4056 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4057 	},
4058 	{
4059 		"helper access to adjusted map (via variable): partial range",
4060 		.insns = {
4061 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4062 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4063 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4064 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4065 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4066 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4067 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4068 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
4069 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
4070 				offsetof(struct test_val, foo), 4),
4071 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4072 			BPF_MOV64_IMM(BPF_REG_2, 8),
4073 			BPF_MOV64_IMM(BPF_REG_3, 0),
4074 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4075 			BPF_EXIT_INSN(),
4076 		},
4077 		.fixup_map2 = { 3 },
4078 		.result = ACCEPT,
4079 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4080 	},
4081 	{
4082 		"helper access to adjusted map (via variable): empty range",
4083 		.insns = {
4084 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4085 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4086 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4087 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4088 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4089 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4090 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4091 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
4092 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
4093 				offsetof(struct test_val, foo), 4),
4094 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4095 			BPF_MOV64_IMM(BPF_REG_2, 0),
4096 			BPF_MOV64_IMM(BPF_REG_3, 0),
4097 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4098 			BPF_EXIT_INSN(),
4099 		},
4100 		.fixup_map2 = { 3 },
4101 		.errstr = "R1 min value is outside of the array range",
4102 		.result = REJECT,
4103 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4104 	},
4105 	{
4106 		"helper access to adjusted map (via variable): no max check",
4107 		.insns = {
4108 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4109 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4110 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4111 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4112 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4113 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
4114 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4115 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
4116 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4117 			BPF_MOV64_IMM(BPF_REG_2, 0),
4118 			BPF_MOV64_IMM(BPF_REG_3, 0),
4119 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4120 			BPF_EXIT_INSN(),
4121 		},
4122 		.fixup_map2 = { 3 },
4123 		.errstr = "R1 min value is negative, either use unsigned index or do a if (index >=0) check",
4124 		.result = REJECT,
4125 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4126 	},
4127 	{
4128 		"helper access to adjusted map (via variable): wrong max check",
4129 		.insns = {
4130 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4131 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4132 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4133 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4134 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4135 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4136 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4137 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
4138 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
4139 				offsetof(struct test_val, foo), 4),
4140 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
4141 			BPF_MOV64_IMM(BPF_REG_2,
4142 				sizeof(struct test_val) -
4143 				offsetof(struct test_val, foo) + 1),
4144 			BPF_MOV64_IMM(BPF_REG_3, 0),
4145 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4146 			BPF_EXIT_INSN(),
4147 		},
4148 		.fixup_map2 = { 3 },
4149 		.errstr = "invalid access to map value, value_size=48 off=4 size=45",
4150 		.result = REJECT,
4151 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4152 	},
4153 	{
4154 		"map element value is preserved across register spilling",
4155 		.insns = {
4156 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4157 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4158 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4159 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4160 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4161 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
4162 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
4163 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4164 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184),
4165 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
4166 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0),
4167 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42),
4168 			BPF_EXIT_INSN(),
4169 		},
4170 		.fixup_map2 = { 3 },
4171 		.errstr_unpriv = "R0 leaks addr",
4172 		.result = ACCEPT,
4173 		.result_unpriv = REJECT,
4174 	},
4175 	{
4176 		"map element value or null is marked on register spilling",
4177 		.insns = {
4178 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4179 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4180 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4181 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4182 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4183 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4184 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -152),
4185 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
4186 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
4187 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0),
4188 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42),
4189 			BPF_EXIT_INSN(),
4190 		},
4191 		.fixup_map2 = { 3 },
4192 		.errstr_unpriv = "R0 leaks addr",
4193 		.result = ACCEPT,
4194 		.result_unpriv = REJECT,
4195 	},
4196 	{
4197 		"map element value store of cleared call register",
4198 		.insns = {
4199 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4200 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4201 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4202 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4203 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4204 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4205 			BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
4206 			BPF_EXIT_INSN(),
4207 		},
4208 		.fixup_map2 = { 3 },
4209 		.errstr_unpriv = "R1 !read_ok",
4210 		.errstr = "R1 !read_ok",
4211 		.result = REJECT,
4212 		.result_unpriv = REJECT,
4213 	},
4214 	{
4215 		"map element value with unaligned store",
4216 		.insns = {
4217 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4218 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4219 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4220 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4221 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4222 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 17),
4223 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3),
4224 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
4225 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 43),
4226 			BPF_ST_MEM(BPF_DW, BPF_REG_0, -2, 44),
4227 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
4228 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 32),
4229 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 2, 33),
4230 			BPF_ST_MEM(BPF_DW, BPF_REG_8, -2, 34),
4231 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 5),
4232 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 22),
4233 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 4, 23),
4234 			BPF_ST_MEM(BPF_DW, BPF_REG_8, -7, 24),
4235 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_8),
4236 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 3),
4237 			BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 22),
4238 			BPF_ST_MEM(BPF_DW, BPF_REG_7, 4, 23),
4239 			BPF_ST_MEM(BPF_DW, BPF_REG_7, -4, 24),
4240 			BPF_EXIT_INSN(),
4241 		},
4242 		.fixup_map2 = { 3 },
4243 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4244 		.result = ACCEPT,
4245 		.result_unpriv = REJECT,
4246 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4247 	},
4248 	{
4249 		"map element value with unaligned load",
4250 		.insns = {
4251 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4252 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4253 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4254 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4255 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4256 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
4257 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4258 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 9),
4259 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3),
4260 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
4261 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 2),
4262 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
4263 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 0),
4264 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 2),
4265 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 5),
4266 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
4267 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4),
4268 			BPF_EXIT_INSN(),
4269 		},
4270 		.fixup_map2 = { 3 },
4271 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4272 		.result = ACCEPT,
4273 		.result_unpriv = REJECT,
4274 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4275 	},
4276 	{
4277 		"map element value illegal alu op, 1",
4278 		.insns = {
4279 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4280 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4281 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4282 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4283 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4284 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
4285 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 8),
4286 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
4287 			BPF_EXIT_INSN(),
4288 		},
4289 		.fixup_map2 = { 3 },
4290 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4291 		.errstr = "invalid mem access 'inv'",
4292 		.result = REJECT,
4293 		.result_unpriv = REJECT,
4294 	},
4295 	{
4296 		"map element value illegal alu op, 2",
4297 		.insns = {
4298 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4299 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4300 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4301 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4302 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4303 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
4304 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0),
4305 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
4306 			BPF_EXIT_INSN(),
4307 		},
4308 		.fixup_map2 = { 3 },
4309 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4310 		.errstr = "invalid mem access 'inv'",
4311 		.result = REJECT,
4312 		.result_unpriv = REJECT,
4313 	},
4314 	{
4315 		"map element value illegal alu op, 3",
4316 		.insns = {
4317 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4318 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4319 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4320 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4321 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4322 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
4323 			BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, 42),
4324 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
4325 			BPF_EXIT_INSN(),
4326 		},
4327 		.fixup_map2 = { 3 },
4328 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4329 		.errstr = "invalid mem access 'inv'",
4330 		.result = REJECT,
4331 		.result_unpriv = REJECT,
4332 	},
4333 	{
4334 		"map element value illegal alu op, 4",
4335 		.insns = {
4336 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4337 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4338 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4339 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4340 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4341 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
4342 			BPF_ENDIAN(BPF_FROM_BE, BPF_REG_0, 64),
4343 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
4344 			BPF_EXIT_INSN(),
4345 		},
4346 		.fixup_map2 = { 3 },
4347 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4348 		.errstr = "invalid mem access 'inv'",
4349 		.result = REJECT,
4350 		.result_unpriv = REJECT,
4351 	},
4352 	{
4353 		"map element value illegal alu op, 5",
4354 		.insns = {
4355 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4356 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4357 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4358 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4359 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4360 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4361 			BPF_MOV64_IMM(BPF_REG_3, 4096),
4362 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4363 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4364 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
4365 			BPF_STX_XADD(BPF_DW, BPF_REG_2, BPF_REG_3, 0),
4366 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0),
4367 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
4368 			BPF_EXIT_INSN(),
4369 		},
4370 		.fixup_map2 = { 3 },
4371 		.errstr_unpriv = "R0 invalid mem access 'inv'",
4372 		.errstr = "R0 invalid mem access 'inv'",
4373 		.result = REJECT,
4374 		.result_unpriv = REJECT,
4375 	},
4376 	{
4377 		"map element value is preserved across register spilling",
4378 		.insns = {
4379 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4380 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4381 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4382 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4383 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4384 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4385 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0,
4386 				offsetof(struct test_val, foo)),
4387 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
4388 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4389 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184),
4390 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
4391 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0),
4392 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42),
4393 			BPF_EXIT_INSN(),
4394 		},
4395 		.fixup_map2 = { 3 },
4396 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4397 		.result = ACCEPT,
4398 		.result_unpriv = REJECT,
4399 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4400 	},
4401 	{
4402 		"helper access to variable memory: stack, bitwise AND + JMP, correct bounds",
4403 		.insns = {
4404 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4405 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4406 			BPF_MOV64_IMM(BPF_REG_0, 0),
4407 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
4408 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
4409 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
4410 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
4411 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
4412 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
4413 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
4414 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
4415 			BPF_MOV64_IMM(BPF_REG_2, 16),
4416 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4417 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4418 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
4419 			BPF_MOV64_IMM(BPF_REG_4, 0),
4420 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4421 			BPF_MOV64_IMM(BPF_REG_3, 0),
4422 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4423 			BPF_MOV64_IMM(BPF_REG_0, 0),
4424 			BPF_EXIT_INSN(),
4425 		},
4426 		.result = ACCEPT,
4427 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4428 	},
4429 	{
4430 		"helper access to variable memory: stack, bitwise AND, zero included",
4431 		.insns = {
4432 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4433 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4434 			BPF_MOV64_IMM(BPF_REG_2, 16),
4435 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4436 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4437 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
4438 			BPF_MOV64_IMM(BPF_REG_3, 0),
4439 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4440 			BPF_EXIT_INSN(),
4441 		},
4442 		.errstr = "invalid stack type R1 off=-64 access_size=0",
4443 		.result = REJECT,
4444 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4445 	},
4446 	{
4447 		"helper access to variable memory: stack, bitwise AND + JMP, wrong max",
4448 		.insns = {
4449 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4450 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4451 			BPF_MOV64_IMM(BPF_REG_2, 16),
4452 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4453 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4454 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65),
4455 			BPF_MOV64_IMM(BPF_REG_4, 0),
4456 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4457 			BPF_MOV64_IMM(BPF_REG_3, 0),
4458 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4459 			BPF_MOV64_IMM(BPF_REG_0, 0),
4460 			BPF_EXIT_INSN(),
4461 		},
4462 		.errstr = "invalid stack type R1 off=-64 access_size=65",
4463 		.result = REJECT,
4464 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4465 	},
4466 	{
4467 		"helper access to variable memory: stack, JMP, correct bounds",
4468 		.insns = {
4469 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4470 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4471 			BPF_MOV64_IMM(BPF_REG_0, 0),
4472 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
4473 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
4474 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
4475 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
4476 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
4477 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
4478 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
4479 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
4480 			BPF_MOV64_IMM(BPF_REG_2, 16),
4481 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4482 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4483 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4),
4484 			BPF_MOV64_IMM(BPF_REG_4, 0),
4485 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4486 			BPF_MOV64_IMM(BPF_REG_3, 0),
4487 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4488 			BPF_MOV64_IMM(BPF_REG_0, 0),
4489 			BPF_EXIT_INSN(),
4490 		},
4491 		.result = ACCEPT,
4492 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4493 	},
4494 	{
4495 		"helper access to variable memory: stack, JMP (signed), correct bounds",
4496 		.insns = {
4497 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4498 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4499 			BPF_MOV64_IMM(BPF_REG_0, 0),
4500 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
4501 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
4502 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
4503 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
4504 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
4505 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
4506 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
4507 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
4508 			BPF_MOV64_IMM(BPF_REG_2, 16),
4509 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4510 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4511 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4),
4512 			BPF_MOV64_IMM(BPF_REG_4, 0),
4513 			BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
4514 			BPF_MOV64_IMM(BPF_REG_3, 0),
4515 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4516 			BPF_MOV64_IMM(BPF_REG_0, 0),
4517 			BPF_EXIT_INSN(),
4518 		},
4519 		.result = ACCEPT,
4520 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4521 	},
4522 	{
4523 		"helper access to variable memory: stack, JMP, bounds + offset",
4524 		.insns = {
4525 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4526 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4527 			BPF_MOV64_IMM(BPF_REG_2, 16),
4528 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4529 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4530 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5),
4531 			BPF_MOV64_IMM(BPF_REG_4, 0),
4532 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3),
4533 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
4534 			BPF_MOV64_IMM(BPF_REG_3, 0),
4535 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4536 			BPF_MOV64_IMM(BPF_REG_0, 0),
4537 			BPF_EXIT_INSN(),
4538 		},
4539 		.errstr = "invalid stack type R1 off=-64 access_size=65",
4540 		.result = REJECT,
4541 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4542 	},
4543 	{
4544 		"helper access to variable memory: stack, JMP, wrong max",
4545 		.insns = {
4546 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4547 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4548 			BPF_MOV64_IMM(BPF_REG_2, 16),
4549 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4550 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4551 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4),
4552 			BPF_MOV64_IMM(BPF_REG_4, 0),
4553 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4554 			BPF_MOV64_IMM(BPF_REG_3, 0),
4555 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4556 			BPF_MOV64_IMM(BPF_REG_0, 0),
4557 			BPF_EXIT_INSN(),
4558 		},
4559 		.errstr = "invalid stack type R1 off=-64 access_size=65",
4560 		.result = REJECT,
4561 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4562 	},
4563 	{
4564 		"helper access to variable memory: stack, JMP, no max check",
4565 		.insns = {
4566 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4567 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4568 			BPF_MOV64_IMM(BPF_REG_2, 16),
4569 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4570 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4571 			BPF_MOV64_IMM(BPF_REG_4, 0),
4572 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4573 			BPF_MOV64_IMM(BPF_REG_3, 0),
4574 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4575 			BPF_MOV64_IMM(BPF_REG_0, 0),
4576 			BPF_EXIT_INSN(),
4577 		},
4578 		.errstr = "R2 unbounded memory access",
4579 		.result = REJECT,
4580 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4581 	},
4582 	{
4583 		"helper access to variable memory: stack, JMP, no min check",
4584 		.insns = {
4585 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4586 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4587 			BPF_MOV64_IMM(BPF_REG_2, 16),
4588 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4589 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4590 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3),
4591 			BPF_MOV64_IMM(BPF_REG_3, 0),
4592 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4593 			BPF_MOV64_IMM(BPF_REG_0, 0),
4594 			BPF_EXIT_INSN(),
4595 		},
4596 		.errstr = "invalid stack type R1 off=-64 access_size=0",
4597 		.result = REJECT,
4598 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4599 	},
4600 	{
4601 		"helper access to variable memory: stack, JMP (signed), no min check",
4602 		.insns = {
4603 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4604 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4605 			BPF_MOV64_IMM(BPF_REG_2, 16),
4606 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
4607 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
4608 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3),
4609 			BPF_MOV64_IMM(BPF_REG_3, 0),
4610 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4611 			BPF_MOV64_IMM(BPF_REG_0, 0),
4612 			BPF_EXIT_INSN(),
4613 		},
4614 		.errstr = "R2 min value is negative",
4615 		.result = REJECT,
4616 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4617 	},
4618 	{
4619 		"helper access to variable memory: map, JMP, correct bounds",
4620 		.insns = {
4621 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4622 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4623 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4624 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4625 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4626 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
4627 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4628 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
4629 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
4630 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
4631 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
4632 				sizeof(struct test_val), 4),
4633 			BPF_MOV64_IMM(BPF_REG_4, 0),
4634 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4635 			BPF_MOV64_IMM(BPF_REG_3, 0),
4636 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4637 			BPF_MOV64_IMM(BPF_REG_0, 0),
4638 			BPF_EXIT_INSN(),
4639 		},
4640 		.fixup_map2 = { 3 },
4641 		.result = ACCEPT,
4642 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4643 	},
4644 	{
4645 		"helper access to variable memory: map, JMP, wrong max",
4646 		.insns = {
4647 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4648 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4649 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4650 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4651 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4652 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
4653 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4654 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
4655 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
4656 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
4657 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
4658 				sizeof(struct test_val) + 1, 4),
4659 			BPF_MOV64_IMM(BPF_REG_4, 0),
4660 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4661 			BPF_MOV64_IMM(BPF_REG_3, 0),
4662 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4663 			BPF_MOV64_IMM(BPF_REG_0, 0),
4664 			BPF_EXIT_INSN(),
4665 		},
4666 		.fixup_map2 = { 3 },
4667 		.errstr = "invalid access to map value, value_size=48 off=0 size=49",
4668 		.result = REJECT,
4669 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4670 	},
4671 	{
4672 		"helper access to variable memory: map adjusted, JMP, correct bounds",
4673 		.insns = {
4674 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4675 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4676 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4677 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4678 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4679 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
4680 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4681 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
4682 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
4683 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
4684 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
4685 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
4686 				sizeof(struct test_val) - 20, 4),
4687 			BPF_MOV64_IMM(BPF_REG_4, 0),
4688 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4689 			BPF_MOV64_IMM(BPF_REG_3, 0),
4690 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4691 			BPF_MOV64_IMM(BPF_REG_0, 0),
4692 			BPF_EXIT_INSN(),
4693 		},
4694 		.fixup_map2 = { 3 },
4695 		.result = ACCEPT,
4696 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4697 	},
4698 	{
4699 		"helper access to variable memory: map adjusted, JMP, wrong max",
4700 		.insns = {
4701 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4702 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4703 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4704 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4705 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4706 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
4707 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4708 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
4709 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
4710 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
4711 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
4712 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
4713 				sizeof(struct test_val) - 19, 4),
4714 			BPF_MOV64_IMM(BPF_REG_4, 0),
4715 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
4716 			BPF_MOV64_IMM(BPF_REG_3, 0),
4717 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4718 			BPF_MOV64_IMM(BPF_REG_0, 0),
4719 			BPF_EXIT_INSN(),
4720 		},
4721 		.fixup_map2 = { 3 },
4722 		.errstr = "R1 min value is outside of the array range",
4723 		.result = REJECT,
4724 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4725 	},
4726 	{
4727 		"helper access to variable memory: size > 0 not allowed on NULL",
4728 		.insns = {
4729 			BPF_MOV64_IMM(BPF_REG_1, 0),
4730 			BPF_MOV64_IMM(BPF_REG_2, 0),
4731 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
4732 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
4733 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
4734 			BPF_MOV64_IMM(BPF_REG_3, 0),
4735 			BPF_MOV64_IMM(BPF_REG_4, 0),
4736 			BPF_MOV64_IMM(BPF_REG_5, 0),
4737 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
4738 			BPF_EXIT_INSN(),
4739 		},
4740 		.errstr = "R1 type=imm expected=fp",
4741 		.result = REJECT,
4742 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4743 	},
4744 	{
4745 		"helper access to variable memory: size = 0 not allowed on != NULL",
4746 		.insns = {
4747 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4748 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
4749 			BPF_MOV64_IMM(BPF_REG_2, 0),
4750 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0),
4751 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8),
4752 			BPF_MOV64_IMM(BPF_REG_3, 0),
4753 			BPF_MOV64_IMM(BPF_REG_4, 0),
4754 			BPF_MOV64_IMM(BPF_REG_5, 0),
4755 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
4756 			BPF_EXIT_INSN(),
4757 		},
4758 		.errstr = "invalid stack type R1 off=-8 access_size=0",
4759 		.result = REJECT,
4760 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4761 	},
4762 	{
4763 		"helper access to variable memory: 8 bytes leak",
4764 		.insns = {
4765 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4766 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4767 			BPF_MOV64_IMM(BPF_REG_0, 0),
4768 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
4769 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
4770 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
4771 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
4772 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
4773 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
4774 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
4775 			BPF_MOV64_IMM(BPF_REG_2, 0),
4776 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
4777 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
4778 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63),
4779 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
4780 			BPF_MOV64_IMM(BPF_REG_3, 0),
4781 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4782 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
4783 			BPF_EXIT_INSN(),
4784 		},
4785 		.errstr = "invalid indirect read from stack off -64+32 size 64",
4786 		.result = REJECT,
4787 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4788 	},
4789 	{
4790 		"helper access to variable memory: 8 bytes no leak (init memory)",
4791 		.insns = {
4792 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4793 			BPF_MOV64_IMM(BPF_REG_0, 0),
4794 			BPF_MOV64_IMM(BPF_REG_0, 0),
4795 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
4796 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
4797 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
4798 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
4799 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
4800 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
4801 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
4802 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
4803 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
4804 			BPF_MOV64_IMM(BPF_REG_2, 0),
4805 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32),
4806 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32),
4807 			BPF_MOV64_IMM(BPF_REG_3, 0),
4808 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4809 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
4810 			BPF_EXIT_INSN(),
4811 		},
4812 		.result = ACCEPT,
4813 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4814 	},
4815 	{
4816 		"invalid and of negative number",
4817 		.insns = {
4818 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4819 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4820 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4821 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4822 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4823 				     BPF_FUNC_map_lookup_elem),
4824 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
4825 			BPF_MOV64_IMM(BPF_REG_1, 6),
4826 			BPF_ALU64_IMM(BPF_AND, BPF_REG_1, -4),
4827 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
4828 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4829 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4830 				   offsetof(struct test_val, foo)),
4831 			BPF_EXIT_INSN(),
4832 		},
4833 		.fixup_map2 = { 3 },
4834 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4835 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
4836 		.result = REJECT,
4837 		.result_unpriv = REJECT,
4838 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4839 	},
4840 	{
4841 		"invalid range check",
4842 		.insns = {
4843 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4844 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4845 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4846 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4847 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4848 				     BPF_FUNC_map_lookup_elem),
4849 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 12),
4850 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4851 			BPF_MOV64_IMM(BPF_REG_9, 1),
4852 			BPF_ALU32_IMM(BPF_MOD, BPF_REG_1, 2),
4853 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1),
4854 			BPF_ALU32_REG(BPF_AND, BPF_REG_9, BPF_REG_1),
4855 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_9, 1),
4856 			BPF_ALU32_IMM(BPF_RSH, BPF_REG_9, 1),
4857 			BPF_MOV32_IMM(BPF_REG_3, 1),
4858 			BPF_ALU32_REG(BPF_SUB, BPF_REG_3, BPF_REG_9),
4859 			BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0x10000000),
4860 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
4861 			BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_3, 0),
4862 			BPF_MOV64_REG(BPF_REG_0, 0),
4863 			BPF_EXIT_INSN(),
4864 		},
4865 		.fixup_map2 = { 3 },
4866 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
4867 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
4868 		.result = REJECT,
4869 		.result_unpriv = REJECT,
4870 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4871 	},
4872 	{
4873 		"map in map access",
4874 		.insns = {
4875 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
4876 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4877 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
4878 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4879 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4880 				     BPF_FUNC_map_lookup_elem),
4881 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
4882 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
4883 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4884 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
4885 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4886 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4887 				     BPF_FUNC_map_lookup_elem),
4888 			BPF_MOV64_REG(BPF_REG_0, 0),
4889 			BPF_EXIT_INSN(),
4890 		},
4891 		.fixup_map_in_map = { 3 },
4892 		.result = ACCEPT,
4893 	},
4894 	{
4895 		"invalid inner map pointer",
4896 		.insns = {
4897 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
4898 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4899 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
4900 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4901 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4902 				     BPF_FUNC_map_lookup_elem),
4903 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
4904 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
4905 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4906 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
4907 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4908 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
4909 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4910 				     BPF_FUNC_map_lookup_elem),
4911 			BPF_MOV64_REG(BPF_REG_0, 0),
4912 			BPF_EXIT_INSN(),
4913 		},
4914 		.fixup_map_in_map = { 3 },
4915 		.errstr = "R1 type=inv expected=map_ptr",
4916 		.errstr_unpriv = "R1 pointer arithmetic prohibited",
4917 		.result = REJECT,
4918 	},
4919 	{
4920 		"forgot null checking on the inner map pointer",
4921 		.insns = {
4922 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
4923 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4924 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
4925 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4926 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4927 				     BPF_FUNC_map_lookup_elem),
4928 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
4929 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4930 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
4931 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4932 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4933 				     BPF_FUNC_map_lookup_elem),
4934 			BPF_MOV64_REG(BPF_REG_0, 0),
4935 			BPF_EXIT_INSN(),
4936 		},
4937 		.fixup_map_in_map = { 3 },
4938 		.errstr = "R1 type=map_value_or_null expected=map_ptr",
4939 		.result = REJECT,
4940 	}
4941 };
4942 
4943 static int probe_filter_length(const struct bpf_insn *fp)
4944 {
4945 	int len;
4946 
4947 	for (len = MAX_INSNS - 1; len > 0; --len)
4948 		if (fp[len].code != 0 || fp[len].imm != 0)
4949 			break;
4950 	return len + 1;
4951 }
4952 
4953 static int create_map(uint32_t size_value, uint32_t max_elem)
4954 {
4955 	int fd;
4956 
4957 	fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(long long),
4958 			    size_value, max_elem, BPF_F_NO_PREALLOC);
4959 	if (fd < 0)
4960 		printf("Failed to create hash map '%s'!\n", strerror(errno));
4961 
4962 	return fd;
4963 }
4964 
4965 static int create_prog_array(void)
4966 {
4967 	int fd;
4968 
4969 	fd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, sizeof(int),
4970 			    sizeof(int), 4, 0);
4971 	if (fd < 0)
4972 		printf("Failed to create prog array '%s'!\n", strerror(errno));
4973 
4974 	return fd;
4975 }
4976 
4977 static int create_map_in_map(void)
4978 {
4979 	int inner_map_fd, outer_map_fd;
4980 
4981 	inner_map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int),
4982 				      sizeof(int), 1, 0);
4983 	if (inner_map_fd < 0) {
4984 		printf("Failed to create array '%s'!\n", strerror(errno));
4985 		return inner_map_fd;
4986 	}
4987 
4988 	outer_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS,
4989 					     sizeof(int), inner_map_fd, 1, 0);
4990 	if (outer_map_fd < 0)
4991 		printf("Failed to create array of maps '%s'!\n",
4992 		       strerror(errno));
4993 
4994 	close(inner_map_fd);
4995 
4996 	return outer_map_fd;
4997 }
4998 
4999 static char bpf_vlog[32768];
5000 
5001 static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog,
5002 			  int *map_fds)
5003 {
5004 	int *fixup_map1 = test->fixup_map1;
5005 	int *fixup_map2 = test->fixup_map2;
5006 	int *fixup_prog = test->fixup_prog;
5007 	int *fixup_map_in_map = test->fixup_map_in_map;
5008 
5009 	/* Allocating HTs with 1 elem is fine here, since we only test
5010 	 * for verifier and not do a runtime lookup, so the only thing
5011 	 * that really matters is value size in this case.
5012 	 */
5013 	if (*fixup_map1) {
5014 		map_fds[0] = create_map(sizeof(long long), 1);
5015 		do {
5016 			prog[*fixup_map1].imm = map_fds[0];
5017 			fixup_map1++;
5018 		} while (*fixup_map1);
5019 	}
5020 
5021 	if (*fixup_map2) {
5022 		map_fds[1] = create_map(sizeof(struct test_val), 1);
5023 		do {
5024 			prog[*fixup_map2].imm = map_fds[1];
5025 			fixup_map2++;
5026 		} while (*fixup_map2);
5027 	}
5028 
5029 	if (*fixup_prog) {
5030 		map_fds[2] = create_prog_array();
5031 		do {
5032 			prog[*fixup_prog].imm = map_fds[2];
5033 			fixup_prog++;
5034 		} while (*fixup_prog);
5035 	}
5036 
5037 	if (*fixup_map_in_map) {
5038 		map_fds[3] = create_map_in_map();
5039 		do {
5040 			prog[*fixup_map_in_map].imm = map_fds[3];
5041 			fixup_map_in_map++;
5042 		} while (*fixup_map_in_map);
5043 	}
5044 }
5045 
5046 static void do_test_single(struct bpf_test *test, bool unpriv,
5047 			   int *passes, int *errors)
5048 {
5049 	int fd_prog, expected_ret, reject_from_alignment;
5050 	struct bpf_insn *prog = test->insns;
5051 	int prog_len = probe_filter_length(prog);
5052 	int prog_type = test->prog_type;
5053 	int map_fds[MAX_NR_MAPS];
5054 	const char *expected_err;
5055 	int i;
5056 
5057 	for (i = 0; i < MAX_NR_MAPS; i++)
5058 		map_fds[i] = -1;
5059 
5060 	do_test_fixup(test, prog, map_fds);
5061 
5062 	fd_prog = bpf_load_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
5063 				   prog, prog_len, "GPL", 0, bpf_vlog,
5064 				   sizeof(bpf_vlog));
5065 
5066 	expected_ret = unpriv && test->result_unpriv != UNDEF ?
5067 		       test->result_unpriv : test->result;
5068 	expected_err = unpriv && test->errstr_unpriv ?
5069 		       test->errstr_unpriv : test->errstr;
5070 
5071 	reject_from_alignment = fd_prog < 0 &&
5072 				(test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) &&
5073 				strstr(bpf_vlog, "Unknown alignment.");
5074 #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
5075 	if (reject_from_alignment) {
5076 		printf("FAIL\nFailed due to alignment despite having efficient unaligned access: '%s'!\n",
5077 		       strerror(errno));
5078 		goto fail_log;
5079 	}
5080 #endif
5081 	if (expected_ret == ACCEPT) {
5082 		if (fd_prog < 0 && !reject_from_alignment) {
5083 			printf("FAIL\nFailed to load prog '%s'!\n",
5084 			       strerror(errno));
5085 			goto fail_log;
5086 		}
5087 	} else {
5088 		if (fd_prog >= 0) {
5089 			printf("FAIL\nUnexpected success to load!\n");
5090 			goto fail_log;
5091 		}
5092 		if (!strstr(bpf_vlog, expected_err) && !reject_from_alignment) {
5093 			printf("FAIL\nUnexpected error message!\n");
5094 			goto fail_log;
5095 		}
5096 	}
5097 
5098 	(*passes)++;
5099 	printf("OK%s\n", reject_from_alignment ?
5100 	       " (NOTE: reject due to unknown alignment)" : "");
5101 close_fds:
5102 	close(fd_prog);
5103 	for (i = 0; i < MAX_NR_MAPS; i++)
5104 		close(map_fds[i]);
5105 	sched_yield();
5106 	return;
5107 fail_log:
5108 	(*errors)++;
5109 	printf("%s", bpf_vlog);
5110 	goto close_fds;
5111 }
5112 
5113 static bool is_admin(void)
5114 {
5115 	cap_t caps;
5116 	cap_flag_value_t sysadmin = CAP_CLEAR;
5117 	const cap_value_t cap_val = CAP_SYS_ADMIN;
5118 
5119 #ifdef CAP_IS_SUPPORTED
5120 	if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) {
5121 		perror("cap_get_flag");
5122 		return false;
5123 	}
5124 #endif
5125 	caps = cap_get_proc();
5126 	if (!caps) {
5127 		perror("cap_get_proc");
5128 		return false;
5129 	}
5130 	if (cap_get_flag(caps, cap_val, CAP_EFFECTIVE, &sysadmin))
5131 		perror("cap_get_flag");
5132 	if (cap_free(caps))
5133 		perror("cap_free");
5134 	return (sysadmin == CAP_SET);
5135 }
5136 
5137 static int set_admin(bool admin)
5138 {
5139 	cap_t caps;
5140 	const cap_value_t cap_val = CAP_SYS_ADMIN;
5141 	int ret = -1;
5142 
5143 	caps = cap_get_proc();
5144 	if (!caps) {
5145 		perror("cap_get_proc");
5146 		return -1;
5147 	}
5148 	if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val,
5149 				admin ? CAP_SET : CAP_CLEAR)) {
5150 		perror("cap_set_flag");
5151 		goto out;
5152 	}
5153 	if (cap_set_proc(caps)) {
5154 		perror("cap_set_proc");
5155 		goto out;
5156 	}
5157 	ret = 0;
5158 out:
5159 	if (cap_free(caps))
5160 		perror("cap_free");
5161 	return ret;
5162 }
5163 
5164 static int do_test(bool unpriv, unsigned int from, unsigned int to)
5165 {
5166 	int i, passes = 0, errors = 0;
5167 
5168 	for (i = from; i < to; i++) {
5169 		struct bpf_test *test = &tests[i];
5170 
5171 		/* Program types that are not supported by non-root we
5172 		 * skip right away.
5173 		 */
5174 		if (!test->prog_type) {
5175 			if (!unpriv)
5176 				set_admin(false);
5177 			printf("#%d/u %s ", i, test->descr);
5178 			do_test_single(test, true, &passes, &errors);
5179 			if (!unpriv)
5180 				set_admin(true);
5181 		}
5182 
5183 		if (!unpriv) {
5184 			printf("#%d/p %s ", i, test->descr);
5185 			do_test_single(test, false, &passes, &errors);
5186 		}
5187 	}
5188 
5189 	printf("Summary: %d PASSED, %d FAILED\n", passes, errors);
5190 	return errors ? -errors : 0;
5191 }
5192 
5193 int main(int argc, char **argv)
5194 {
5195 	struct rlimit rinf = { RLIM_INFINITY, RLIM_INFINITY };
5196 	struct rlimit rlim = { 1 << 20, 1 << 20 };
5197 	unsigned int from = 0, to = ARRAY_SIZE(tests);
5198 	bool unpriv = !is_admin();
5199 
5200 	if (argc == 3) {
5201 		unsigned int l = atoi(argv[argc - 2]);
5202 		unsigned int u = atoi(argv[argc - 1]);
5203 
5204 		if (l < to && u < to) {
5205 			from = l;
5206 			to   = u + 1;
5207 		}
5208 	} else if (argc == 2) {
5209 		unsigned int t = atoi(argv[argc - 1]);
5210 
5211 		if (t < to) {
5212 			from = t;
5213 			to   = t + 1;
5214 		}
5215 	}
5216 
5217 	setrlimit(RLIMIT_MEMLOCK, unpriv ? &rlim : &rinf);
5218 	return do_test(unpriv, from, to);
5219 }
5220