xref: /openbmc/linux/tools/testing/selftests/bpf/test_verifier.c (revision c4c8f39a57bf5057fc51a848d42b7e348ecfa31d)
1 /*
2  * Testsuite for eBPF verifier
3  *
4  * Copyright (c) 2014 PLUMgrid, http://plumgrid.com
5  * Copyright (c) 2017 Facebook
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of version 2 of the GNU General Public
9  * License as published by the Free Software Foundation.
10  */
11 
12 #include <endian.h>
13 #include <asm/types.h>
14 #include <linux/types.h>
15 #include <stdint.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19 #include <errno.h>
20 #include <string.h>
21 #include <stddef.h>
22 #include <stdbool.h>
23 #include <sched.h>
24 #include <limits.h>
25 
26 #include <sys/capability.h>
27 
28 #include <linux/unistd.h>
29 #include <linux/filter.h>
30 #include <linux/bpf_perf_event.h>
31 #include <linux/bpf.h>
32 #include <linux/if_ether.h>
33 
34 #include <bpf/bpf.h>
35 
36 #ifdef HAVE_GENHDR
37 # include "autoconf.h"
38 #else
39 # if defined(__i386) || defined(__x86_64) || defined(__s390x__) || defined(__aarch64__)
40 #  define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1
41 # endif
42 #endif
43 #include "bpf_rlimit.h"
44 #include "bpf_rand.h"
45 #include "../../../include/linux/filter.h"
46 
47 #ifndef ARRAY_SIZE
48 # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
49 #endif
50 
51 #define MAX_INSNS	BPF_MAXINSNS
52 #define MAX_FIXUPS	8
53 #define MAX_NR_MAPS	4
54 #define POINTER_VALUE	0xcafe4all
55 #define TEST_DATA_LEN	64
56 
57 #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS	(1 << 0)
58 #define F_LOAD_WITH_STRICT_ALIGNMENT		(1 << 1)
59 
60 #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled"
61 static bool unpriv_disabled = false;
62 
63 struct bpf_test {
64 	const char *descr;
65 	struct bpf_insn	insns[MAX_INSNS];
66 	int fixup_map1[MAX_FIXUPS];
67 	int fixup_map2[MAX_FIXUPS];
68 	int fixup_map3[MAX_FIXUPS];
69 	int fixup_prog[MAX_FIXUPS];
70 	int fixup_map_in_map[MAX_FIXUPS];
71 	const char *errstr;
72 	const char *errstr_unpriv;
73 	uint32_t retval;
74 	enum {
75 		UNDEF,
76 		ACCEPT,
77 		REJECT
78 	} result, result_unpriv;
79 	enum bpf_prog_type prog_type;
80 	uint8_t flags;
81 	__u8 data[TEST_DATA_LEN];
82 	void (*fill_helper)(struct bpf_test *self);
83 };
84 
85 /* Note we want this to be 64 bit aligned so that the end of our array is
86  * actually the end of the structure.
87  */
88 #define MAX_ENTRIES 11
89 
90 struct test_val {
91 	unsigned int index;
92 	int foo[MAX_ENTRIES];
93 };
94 
95 struct other_val {
96 	long long foo;
97 	long long bar;
98 };
99 
100 static void bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self)
101 {
102 	/* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */
103 #define PUSH_CNT 51
104 	unsigned int len = BPF_MAXINSNS;
105 	struct bpf_insn *insn = self->insns;
106 	int i = 0, j, k = 0;
107 
108 	insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1);
109 loop:
110 	for (j = 0; j < PUSH_CNT; j++) {
111 		insn[i++] = BPF_LD_ABS(BPF_B, 0);
112 		insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2);
113 		i++;
114 		insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6);
115 		insn[i++] = BPF_MOV64_IMM(BPF_REG_2, 1);
116 		insn[i++] = BPF_MOV64_IMM(BPF_REG_3, 2);
117 		insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
118 					 BPF_FUNC_skb_vlan_push),
119 		insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2);
120 		i++;
121 	}
122 
123 	for (j = 0; j < PUSH_CNT; j++) {
124 		insn[i++] = BPF_LD_ABS(BPF_B, 0);
125 		insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2);
126 		i++;
127 		insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6);
128 		insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
129 					 BPF_FUNC_skb_vlan_pop),
130 		insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2);
131 		i++;
132 	}
133 	if (++k < 5)
134 		goto loop;
135 
136 	for (; i < len - 1; i++)
137 		insn[i] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 0xbef);
138 	insn[len - 1] = BPF_EXIT_INSN();
139 }
140 
141 static void bpf_fill_jump_around_ld_abs(struct bpf_test *self)
142 {
143 	struct bpf_insn *insn = self->insns;
144 	unsigned int len = BPF_MAXINSNS;
145 	int i = 0;
146 
147 	insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1);
148 	insn[i++] = BPF_LD_ABS(BPF_B, 0);
149 	insn[i] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 10, len - i - 2);
150 	i++;
151 	while (i < len - 1)
152 		insn[i++] = BPF_LD_ABS(BPF_B, 1);
153 	insn[i] = BPF_EXIT_INSN();
154 }
155 
156 static void bpf_fill_rand_ld_dw(struct bpf_test *self)
157 {
158 	struct bpf_insn *insn = self->insns;
159 	uint64_t res = 0;
160 	int i = 0;
161 
162 	insn[i++] = BPF_MOV32_IMM(BPF_REG_0, 0);
163 	while (i < self->retval) {
164 		uint64_t val = bpf_semi_rand_get();
165 		struct bpf_insn tmp[2] = { BPF_LD_IMM64(BPF_REG_1, val) };
166 
167 		res ^= val;
168 		insn[i++] = tmp[0];
169 		insn[i++] = tmp[1];
170 		insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1);
171 	}
172 	insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_0);
173 	insn[i++] = BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32);
174 	insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1);
175 	insn[i] = BPF_EXIT_INSN();
176 	res ^= (res >> 32);
177 	self->retval = (uint32_t)res;
178 }
179 
180 static struct bpf_test tests[] = {
181 	{
182 		"add+sub+mul",
183 		.insns = {
184 			BPF_MOV64_IMM(BPF_REG_1, 1),
185 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2),
186 			BPF_MOV64_IMM(BPF_REG_2, 3),
187 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2),
188 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1),
189 			BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3),
190 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
191 			BPF_EXIT_INSN(),
192 		},
193 		.result = ACCEPT,
194 		.retval = -3,
195 	},
196 	{
197 		"DIV32 by 0, zero check 1",
198 		.insns = {
199 			BPF_MOV32_IMM(BPF_REG_0, 42),
200 			BPF_MOV32_IMM(BPF_REG_1, 0),
201 			BPF_MOV32_IMM(BPF_REG_2, 1),
202 			BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1),
203 			BPF_EXIT_INSN(),
204 		},
205 		.result = ACCEPT,
206 		.retval = 42,
207 	},
208 	{
209 		"DIV32 by 0, zero check 2",
210 		.insns = {
211 			BPF_MOV32_IMM(BPF_REG_0, 42),
212 			BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL),
213 			BPF_MOV32_IMM(BPF_REG_2, 1),
214 			BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1),
215 			BPF_EXIT_INSN(),
216 		},
217 		.result = ACCEPT,
218 		.retval = 42,
219 	},
220 	{
221 		"DIV64 by 0, zero check",
222 		.insns = {
223 			BPF_MOV32_IMM(BPF_REG_0, 42),
224 			BPF_MOV32_IMM(BPF_REG_1, 0),
225 			BPF_MOV32_IMM(BPF_REG_2, 1),
226 			BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1),
227 			BPF_EXIT_INSN(),
228 		},
229 		.result = ACCEPT,
230 		.retval = 42,
231 	},
232 	{
233 		"MOD32 by 0, zero check 1",
234 		.insns = {
235 			BPF_MOV32_IMM(BPF_REG_0, 42),
236 			BPF_MOV32_IMM(BPF_REG_1, 0),
237 			BPF_MOV32_IMM(BPF_REG_2, 1),
238 			BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
239 			BPF_EXIT_INSN(),
240 		},
241 		.result = ACCEPT,
242 		.retval = 42,
243 	},
244 	{
245 		"MOD32 by 0, zero check 2",
246 		.insns = {
247 			BPF_MOV32_IMM(BPF_REG_0, 42),
248 			BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL),
249 			BPF_MOV32_IMM(BPF_REG_2, 1),
250 			BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
251 			BPF_EXIT_INSN(),
252 		},
253 		.result = ACCEPT,
254 		.retval = 42,
255 	},
256 	{
257 		"MOD64 by 0, zero check",
258 		.insns = {
259 			BPF_MOV32_IMM(BPF_REG_0, 42),
260 			BPF_MOV32_IMM(BPF_REG_1, 0),
261 			BPF_MOV32_IMM(BPF_REG_2, 1),
262 			BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
263 			BPF_EXIT_INSN(),
264 		},
265 		.result = ACCEPT,
266 		.retval = 42,
267 	},
268 	{
269 		"DIV32 by 0, zero check ok, cls",
270 		.insns = {
271 			BPF_MOV32_IMM(BPF_REG_0, 42),
272 			BPF_MOV32_IMM(BPF_REG_1, 2),
273 			BPF_MOV32_IMM(BPF_REG_2, 16),
274 			BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1),
275 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
276 			BPF_EXIT_INSN(),
277 		},
278 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
279 		.result = ACCEPT,
280 		.retval = 8,
281 	},
282 	{
283 		"DIV32 by 0, zero check 1, cls",
284 		.insns = {
285 			BPF_MOV32_IMM(BPF_REG_1, 0),
286 			BPF_MOV32_IMM(BPF_REG_0, 1),
287 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
288 			BPF_EXIT_INSN(),
289 		},
290 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
291 		.result = ACCEPT,
292 		.retval = 0,
293 	},
294 	{
295 		"DIV32 by 0, zero check 2, cls",
296 		.insns = {
297 			BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL),
298 			BPF_MOV32_IMM(BPF_REG_0, 1),
299 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
300 			BPF_EXIT_INSN(),
301 		},
302 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
303 		.result = ACCEPT,
304 		.retval = 0,
305 	},
306 	{
307 		"DIV64 by 0, zero check, cls",
308 		.insns = {
309 			BPF_MOV32_IMM(BPF_REG_1, 0),
310 			BPF_MOV32_IMM(BPF_REG_0, 1),
311 			BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
312 			BPF_EXIT_INSN(),
313 		},
314 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
315 		.result = ACCEPT,
316 		.retval = 0,
317 	},
318 	{
319 		"MOD32 by 0, zero check ok, cls",
320 		.insns = {
321 			BPF_MOV32_IMM(BPF_REG_0, 42),
322 			BPF_MOV32_IMM(BPF_REG_1, 3),
323 			BPF_MOV32_IMM(BPF_REG_2, 5),
324 			BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
325 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
326 			BPF_EXIT_INSN(),
327 		},
328 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
329 		.result = ACCEPT,
330 		.retval = 2,
331 	},
332 	{
333 		"MOD32 by 0, zero check 1, cls",
334 		.insns = {
335 			BPF_MOV32_IMM(BPF_REG_1, 0),
336 			BPF_MOV32_IMM(BPF_REG_0, 1),
337 			BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
338 			BPF_EXIT_INSN(),
339 		},
340 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
341 		.result = ACCEPT,
342 		.retval = 1,
343 	},
344 	{
345 		"MOD32 by 0, zero check 2, cls",
346 		.insns = {
347 			BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL),
348 			BPF_MOV32_IMM(BPF_REG_0, 1),
349 			BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
350 			BPF_EXIT_INSN(),
351 		},
352 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
353 		.result = ACCEPT,
354 		.retval = 1,
355 	},
356 	{
357 		"MOD64 by 0, zero check 1, cls",
358 		.insns = {
359 			BPF_MOV32_IMM(BPF_REG_1, 0),
360 			BPF_MOV32_IMM(BPF_REG_0, 2),
361 			BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
362 			BPF_EXIT_INSN(),
363 		},
364 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
365 		.result = ACCEPT,
366 		.retval = 2,
367 	},
368 	{
369 		"MOD64 by 0, zero check 2, cls",
370 		.insns = {
371 			BPF_MOV32_IMM(BPF_REG_1, 0),
372 			BPF_MOV32_IMM(BPF_REG_0, -1),
373 			BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
374 			BPF_EXIT_INSN(),
375 		},
376 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
377 		.result = ACCEPT,
378 		.retval = -1,
379 	},
380 	/* Just make sure that JITs used udiv/umod as otherwise we get
381 	 * an exception from INT_MIN/-1 overflow similarly as with div
382 	 * by zero.
383 	 */
384 	{
385 		"DIV32 overflow, check 1",
386 		.insns = {
387 			BPF_MOV32_IMM(BPF_REG_1, -1),
388 			BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
389 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
390 			BPF_EXIT_INSN(),
391 		},
392 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
393 		.result = ACCEPT,
394 		.retval = 0,
395 	},
396 	{
397 		"DIV32 overflow, check 2",
398 		.insns = {
399 			BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
400 			BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1),
401 			BPF_EXIT_INSN(),
402 		},
403 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
404 		.result = ACCEPT,
405 		.retval = 0,
406 	},
407 	{
408 		"DIV64 overflow, check 1",
409 		.insns = {
410 			BPF_MOV64_IMM(BPF_REG_1, -1),
411 			BPF_LD_IMM64(BPF_REG_0, LLONG_MIN),
412 			BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
413 			BPF_EXIT_INSN(),
414 		},
415 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
416 		.result = ACCEPT,
417 		.retval = 0,
418 	},
419 	{
420 		"DIV64 overflow, check 2",
421 		.insns = {
422 			BPF_LD_IMM64(BPF_REG_0, LLONG_MIN),
423 			BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, -1),
424 			BPF_EXIT_INSN(),
425 		},
426 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
427 		.result = ACCEPT,
428 		.retval = 0,
429 	},
430 	{
431 		"MOD32 overflow, check 1",
432 		.insns = {
433 			BPF_MOV32_IMM(BPF_REG_1, -1),
434 			BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
435 			BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
436 			BPF_EXIT_INSN(),
437 		},
438 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
439 		.result = ACCEPT,
440 		.retval = INT_MIN,
441 	},
442 	{
443 		"MOD32 overflow, check 2",
444 		.insns = {
445 			BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
446 			BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1),
447 			BPF_EXIT_INSN(),
448 		},
449 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
450 		.result = ACCEPT,
451 		.retval = INT_MIN,
452 	},
453 	{
454 		"MOD64 overflow, check 1",
455 		.insns = {
456 			BPF_MOV64_IMM(BPF_REG_1, -1),
457 			BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
458 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
459 			BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
460 			BPF_MOV32_IMM(BPF_REG_0, 0),
461 			BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1),
462 			BPF_MOV32_IMM(BPF_REG_0, 1),
463 			BPF_EXIT_INSN(),
464 		},
465 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
466 		.result = ACCEPT,
467 		.retval = 1,
468 	},
469 	{
470 		"MOD64 overflow, check 2",
471 		.insns = {
472 			BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
473 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
474 			BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1),
475 			BPF_MOV32_IMM(BPF_REG_0, 0),
476 			BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1),
477 			BPF_MOV32_IMM(BPF_REG_0, 1),
478 			BPF_EXIT_INSN(),
479 		},
480 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
481 		.result = ACCEPT,
482 		.retval = 1,
483 	},
484 	{
485 		"xor32 zero extend check",
486 		.insns = {
487 			BPF_MOV32_IMM(BPF_REG_2, -1),
488 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32),
489 			BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff),
490 			BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2),
491 			BPF_MOV32_IMM(BPF_REG_0, 2),
492 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
493 			BPF_MOV32_IMM(BPF_REG_0, 1),
494 			BPF_EXIT_INSN(),
495 		},
496 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
497 		.result = ACCEPT,
498 		.retval = 1,
499 	},
500 	{
501 		"empty prog",
502 		.insns = {
503 		},
504 		.errstr = "unknown opcode 00",
505 		.result = REJECT,
506 	},
507 	{
508 		"only exit insn",
509 		.insns = {
510 			BPF_EXIT_INSN(),
511 		},
512 		.errstr = "R0 !read_ok",
513 		.result = REJECT,
514 	},
515 	{
516 		"unreachable",
517 		.insns = {
518 			BPF_EXIT_INSN(),
519 			BPF_EXIT_INSN(),
520 		},
521 		.errstr = "unreachable",
522 		.result = REJECT,
523 	},
524 	{
525 		"unreachable2",
526 		.insns = {
527 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
528 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
529 			BPF_EXIT_INSN(),
530 		},
531 		.errstr = "unreachable",
532 		.result = REJECT,
533 	},
534 	{
535 		"out of range jump",
536 		.insns = {
537 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
538 			BPF_EXIT_INSN(),
539 		},
540 		.errstr = "jump out of range",
541 		.result = REJECT,
542 	},
543 	{
544 		"out of range jump2",
545 		.insns = {
546 			BPF_JMP_IMM(BPF_JA, 0, 0, -2),
547 			BPF_EXIT_INSN(),
548 		},
549 		.errstr = "jump out of range",
550 		.result = REJECT,
551 	},
552 	{
553 		"test1 ld_imm64",
554 		.insns = {
555 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
556 			BPF_LD_IMM64(BPF_REG_0, 0),
557 			BPF_LD_IMM64(BPF_REG_0, 0),
558 			BPF_LD_IMM64(BPF_REG_0, 1),
559 			BPF_LD_IMM64(BPF_REG_0, 1),
560 			BPF_MOV64_IMM(BPF_REG_0, 2),
561 			BPF_EXIT_INSN(),
562 		},
563 		.errstr = "invalid BPF_LD_IMM insn",
564 		.errstr_unpriv = "R1 pointer comparison",
565 		.result = REJECT,
566 	},
567 	{
568 		"test2 ld_imm64",
569 		.insns = {
570 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
571 			BPF_LD_IMM64(BPF_REG_0, 0),
572 			BPF_LD_IMM64(BPF_REG_0, 0),
573 			BPF_LD_IMM64(BPF_REG_0, 1),
574 			BPF_LD_IMM64(BPF_REG_0, 1),
575 			BPF_EXIT_INSN(),
576 		},
577 		.errstr = "invalid BPF_LD_IMM insn",
578 		.errstr_unpriv = "R1 pointer comparison",
579 		.result = REJECT,
580 	},
581 	{
582 		"test3 ld_imm64",
583 		.insns = {
584 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
585 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
586 			BPF_LD_IMM64(BPF_REG_0, 0),
587 			BPF_LD_IMM64(BPF_REG_0, 0),
588 			BPF_LD_IMM64(BPF_REG_0, 1),
589 			BPF_LD_IMM64(BPF_REG_0, 1),
590 			BPF_EXIT_INSN(),
591 		},
592 		.errstr = "invalid bpf_ld_imm64 insn",
593 		.result = REJECT,
594 	},
595 	{
596 		"test4 ld_imm64",
597 		.insns = {
598 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
599 			BPF_EXIT_INSN(),
600 		},
601 		.errstr = "invalid bpf_ld_imm64 insn",
602 		.result = REJECT,
603 	},
604 	{
605 		"test5 ld_imm64",
606 		.insns = {
607 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
608 		},
609 		.errstr = "invalid bpf_ld_imm64 insn",
610 		.result = REJECT,
611 	},
612 	{
613 		"test6 ld_imm64",
614 		.insns = {
615 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
616 			BPF_RAW_INSN(0, 0, 0, 0, 0),
617 			BPF_EXIT_INSN(),
618 		},
619 		.result = ACCEPT,
620 	},
621 	{
622 		"test7 ld_imm64",
623 		.insns = {
624 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
625 			BPF_RAW_INSN(0, 0, 0, 0, 1),
626 			BPF_EXIT_INSN(),
627 		},
628 		.result = ACCEPT,
629 		.retval = 1,
630 	},
631 	{
632 		"test8 ld_imm64",
633 		.insns = {
634 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 1, 1),
635 			BPF_RAW_INSN(0, 0, 0, 0, 1),
636 			BPF_EXIT_INSN(),
637 		},
638 		.errstr = "uses reserved fields",
639 		.result = REJECT,
640 	},
641 	{
642 		"test9 ld_imm64",
643 		.insns = {
644 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
645 			BPF_RAW_INSN(0, 0, 0, 1, 1),
646 			BPF_EXIT_INSN(),
647 		},
648 		.errstr = "invalid bpf_ld_imm64 insn",
649 		.result = REJECT,
650 	},
651 	{
652 		"test10 ld_imm64",
653 		.insns = {
654 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
655 			BPF_RAW_INSN(0, BPF_REG_1, 0, 0, 1),
656 			BPF_EXIT_INSN(),
657 		},
658 		.errstr = "invalid bpf_ld_imm64 insn",
659 		.result = REJECT,
660 	},
661 	{
662 		"test11 ld_imm64",
663 		.insns = {
664 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1),
665 			BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1),
666 			BPF_EXIT_INSN(),
667 		},
668 		.errstr = "invalid bpf_ld_imm64 insn",
669 		.result = REJECT,
670 	},
671 	{
672 		"test12 ld_imm64",
673 		.insns = {
674 			BPF_MOV64_IMM(BPF_REG_1, 0),
675 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1),
676 			BPF_RAW_INSN(0, 0, 0, 0, 1),
677 			BPF_EXIT_INSN(),
678 		},
679 		.errstr = "not pointing to valid bpf_map",
680 		.result = REJECT,
681 	},
682 	{
683 		"test13 ld_imm64",
684 		.insns = {
685 			BPF_MOV64_IMM(BPF_REG_1, 0),
686 			BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1),
687 			BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1),
688 			BPF_EXIT_INSN(),
689 		},
690 		.errstr = "invalid bpf_ld_imm64 insn",
691 		.result = REJECT,
692 	},
693 	{
694 		"arsh32 on imm",
695 		.insns = {
696 			BPF_MOV64_IMM(BPF_REG_0, 1),
697 			BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5),
698 			BPF_EXIT_INSN(),
699 		},
700 		.result = REJECT,
701 		.errstr = "unknown opcode c4",
702 	},
703 	{
704 		"arsh32 on reg",
705 		.insns = {
706 			BPF_MOV64_IMM(BPF_REG_0, 1),
707 			BPF_MOV64_IMM(BPF_REG_1, 5),
708 			BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
709 			BPF_EXIT_INSN(),
710 		},
711 		.result = REJECT,
712 		.errstr = "unknown opcode cc",
713 	},
714 	{
715 		"arsh64 on imm",
716 		.insns = {
717 			BPF_MOV64_IMM(BPF_REG_0, 1),
718 			BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5),
719 			BPF_EXIT_INSN(),
720 		},
721 		.result = ACCEPT,
722 	},
723 	{
724 		"arsh64 on reg",
725 		.insns = {
726 			BPF_MOV64_IMM(BPF_REG_0, 1),
727 			BPF_MOV64_IMM(BPF_REG_1, 5),
728 			BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
729 			BPF_EXIT_INSN(),
730 		},
731 		.result = ACCEPT,
732 	},
733 	{
734 		"no bpf_exit",
735 		.insns = {
736 			BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2),
737 		},
738 		.errstr = "not an exit",
739 		.result = REJECT,
740 	},
741 	{
742 		"loop (back-edge)",
743 		.insns = {
744 			BPF_JMP_IMM(BPF_JA, 0, 0, -1),
745 			BPF_EXIT_INSN(),
746 		},
747 		.errstr = "back-edge",
748 		.result = REJECT,
749 	},
750 	{
751 		"loop2 (back-edge)",
752 		.insns = {
753 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
754 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
755 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
756 			BPF_JMP_IMM(BPF_JA, 0, 0, -4),
757 			BPF_EXIT_INSN(),
758 		},
759 		.errstr = "back-edge",
760 		.result = REJECT,
761 	},
762 	{
763 		"conditional loop",
764 		.insns = {
765 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
766 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
767 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
768 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3),
769 			BPF_EXIT_INSN(),
770 		},
771 		.errstr = "back-edge",
772 		.result = REJECT,
773 	},
774 	{
775 		"read uninitialized register",
776 		.insns = {
777 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
778 			BPF_EXIT_INSN(),
779 		},
780 		.errstr = "R2 !read_ok",
781 		.result = REJECT,
782 	},
783 	{
784 		"read invalid register",
785 		.insns = {
786 			BPF_MOV64_REG(BPF_REG_0, -1),
787 			BPF_EXIT_INSN(),
788 		},
789 		.errstr = "R15 is invalid",
790 		.result = REJECT,
791 	},
792 	{
793 		"program doesn't init R0 before exit",
794 		.insns = {
795 			BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
796 			BPF_EXIT_INSN(),
797 		},
798 		.errstr = "R0 !read_ok",
799 		.result = REJECT,
800 	},
801 	{
802 		"program doesn't init R0 before exit in all branches",
803 		.insns = {
804 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
805 			BPF_MOV64_IMM(BPF_REG_0, 1),
806 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
807 			BPF_EXIT_INSN(),
808 		},
809 		.errstr = "R0 !read_ok",
810 		.errstr_unpriv = "R1 pointer comparison",
811 		.result = REJECT,
812 	},
813 	{
814 		"stack out of bounds",
815 		.insns = {
816 			BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0),
817 			BPF_EXIT_INSN(),
818 		},
819 		.errstr = "invalid stack",
820 		.result = REJECT,
821 	},
822 	{
823 		"invalid call insn1",
824 		.insns = {
825 			BPF_RAW_INSN(BPF_JMP | BPF_CALL | BPF_X, 0, 0, 0, 0),
826 			BPF_EXIT_INSN(),
827 		},
828 		.errstr = "unknown opcode 8d",
829 		.result = REJECT,
830 	},
831 	{
832 		"invalid call insn2",
833 		.insns = {
834 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 1, 0),
835 			BPF_EXIT_INSN(),
836 		},
837 		.errstr = "BPF_CALL uses reserved",
838 		.result = REJECT,
839 	},
840 	{
841 		"invalid function call",
842 		.insns = {
843 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1234567),
844 			BPF_EXIT_INSN(),
845 		},
846 		.errstr = "invalid func unknown#1234567",
847 		.result = REJECT,
848 	},
849 	{
850 		"uninitialized stack1",
851 		.insns = {
852 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
853 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
854 			BPF_LD_MAP_FD(BPF_REG_1, 0),
855 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
856 				     BPF_FUNC_map_lookup_elem),
857 			BPF_EXIT_INSN(),
858 		},
859 		.fixup_map1 = { 2 },
860 		.errstr = "invalid indirect read from stack",
861 		.result = REJECT,
862 	},
863 	{
864 		"uninitialized stack2",
865 		.insns = {
866 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
867 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -8),
868 			BPF_EXIT_INSN(),
869 		},
870 		.errstr = "invalid read from stack",
871 		.result = REJECT,
872 	},
873 	{
874 		"invalid fp arithmetic",
875 		/* If this gets ever changed, make sure JITs can deal with it. */
876 		.insns = {
877 			BPF_MOV64_IMM(BPF_REG_0, 0),
878 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
879 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 8),
880 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
881 			BPF_EXIT_INSN(),
882 		},
883 		.errstr = "R1 subtraction from stack pointer",
884 		.result = REJECT,
885 	},
886 	{
887 		"non-invalid fp arithmetic",
888 		.insns = {
889 			BPF_MOV64_IMM(BPF_REG_0, 0),
890 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
891 			BPF_EXIT_INSN(),
892 		},
893 		.result = ACCEPT,
894 	},
895 	{
896 		"invalid argument register",
897 		.insns = {
898 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
899 				     BPF_FUNC_get_cgroup_classid),
900 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
901 				     BPF_FUNC_get_cgroup_classid),
902 			BPF_EXIT_INSN(),
903 		},
904 		.errstr = "R1 !read_ok",
905 		.result = REJECT,
906 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
907 	},
908 	{
909 		"non-invalid argument register",
910 		.insns = {
911 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
912 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
913 				     BPF_FUNC_get_cgroup_classid),
914 			BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_6),
915 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
916 				     BPF_FUNC_get_cgroup_classid),
917 			BPF_EXIT_INSN(),
918 		},
919 		.result = ACCEPT,
920 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
921 	},
922 	{
923 		"check valid spill/fill",
924 		.insns = {
925 			/* spill R1(ctx) into stack */
926 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
927 			/* fill it back into R2 */
928 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8),
929 			/* should be able to access R0 = *(R2 + 8) */
930 			/* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */
931 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
932 			BPF_EXIT_INSN(),
933 		},
934 		.errstr_unpriv = "R0 leaks addr",
935 		.result = ACCEPT,
936 		.result_unpriv = REJECT,
937 		.retval = POINTER_VALUE,
938 	},
939 	{
940 		"check valid spill/fill, skb mark",
941 		.insns = {
942 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
943 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8),
944 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
945 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
946 				    offsetof(struct __sk_buff, mark)),
947 			BPF_EXIT_INSN(),
948 		},
949 		.result = ACCEPT,
950 		.result_unpriv = ACCEPT,
951 	},
952 	{
953 		"check corrupted spill/fill",
954 		.insns = {
955 			/* spill R1(ctx) into stack */
956 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
957 			/* mess up with R1 pointer on stack */
958 			BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23),
959 			/* fill back into R0 should fail */
960 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
961 			BPF_EXIT_INSN(),
962 		},
963 		.errstr_unpriv = "attempt to corrupt spilled",
964 		.errstr = "corrupted spill",
965 		.result = REJECT,
966 	},
967 	{
968 		"invalid src register in STX",
969 		.insns = {
970 			BPF_STX_MEM(BPF_B, BPF_REG_10, -1, -1),
971 			BPF_EXIT_INSN(),
972 		},
973 		.errstr = "R15 is invalid",
974 		.result = REJECT,
975 	},
976 	{
977 		"invalid dst register in STX",
978 		.insns = {
979 			BPF_STX_MEM(BPF_B, 14, BPF_REG_10, -1),
980 			BPF_EXIT_INSN(),
981 		},
982 		.errstr = "R14 is invalid",
983 		.result = REJECT,
984 	},
985 	{
986 		"invalid dst register in ST",
987 		.insns = {
988 			BPF_ST_MEM(BPF_B, 14, -1, -1),
989 			BPF_EXIT_INSN(),
990 		},
991 		.errstr = "R14 is invalid",
992 		.result = REJECT,
993 	},
994 	{
995 		"invalid src register in LDX",
996 		.insns = {
997 			BPF_LDX_MEM(BPF_B, BPF_REG_0, 12, 0),
998 			BPF_EXIT_INSN(),
999 		},
1000 		.errstr = "R12 is invalid",
1001 		.result = REJECT,
1002 	},
1003 	{
1004 		"invalid dst register in LDX",
1005 		.insns = {
1006 			BPF_LDX_MEM(BPF_B, 11, BPF_REG_1, 0),
1007 			BPF_EXIT_INSN(),
1008 		},
1009 		.errstr = "R11 is invalid",
1010 		.result = REJECT,
1011 	},
1012 	{
1013 		"junk insn",
1014 		.insns = {
1015 			BPF_RAW_INSN(0, 0, 0, 0, 0),
1016 			BPF_EXIT_INSN(),
1017 		},
1018 		.errstr = "unknown opcode 00",
1019 		.result = REJECT,
1020 	},
1021 	{
1022 		"junk insn2",
1023 		.insns = {
1024 			BPF_RAW_INSN(1, 0, 0, 0, 0),
1025 			BPF_EXIT_INSN(),
1026 		},
1027 		.errstr = "BPF_LDX uses reserved fields",
1028 		.result = REJECT,
1029 	},
1030 	{
1031 		"junk insn3",
1032 		.insns = {
1033 			BPF_RAW_INSN(-1, 0, 0, 0, 0),
1034 			BPF_EXIT_INSN(),
1035 		},
1036 		.errstr = "unknown opcode ff",
1037 		.result = REJECT,
1038 	},
1039 	{
1040 		"junk insn4",
1041 		.insns = {
1042 			BPF_RAW_INSN(-1, -1, -1, -1, -1),
1043 			BPF_EXIT_INSN(),
1044 		},
1045 		.errstr = "unknown opcode ff",
1046 		.result = REJECT,
1047 	},
1048 	{
1049 		"junk insn5",
1050 		.insns = {
1051 			BPF_RAW_INSN(0x7f, -1, -1, -1, -1),
1052 			BPF_EXIT_INSN(),
1053 		},
1054 		.errstr = "BPF_ALU uses reserved fields",
1055 		.result = REJECT,
1056 	},
1057 	{
1058 		"misaligned read from stack",
1059 		.insns = {
1060 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1061 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -4),
1062 			BPF_EXIT_INSN(),
1063 		},
1064 		.errstr = "misaligned stack access",
1065 		.result = REJECT,
1066 	},
1067 	{
1068 		"invalid map_fd for function call",
1069 		.insns = {
1070 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1071 			BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10),
1072 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1073 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1074 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1075 				     BPF_FUNC_map_delete_elem),
1076 			BPF_EXIT_INSN(),
1077 		},
1078 		.errstr = "fd 0 is not pointing to valid bpf_map",
1079 		.result = REJECT,
1080 	},
1081 	{
1082 		"don't check return value before access",
1083 		.insns = {
1084 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1085 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1086 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1087 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1088 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1089 				     BPF_FUNC_map_lookup_elem),
1090 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
1091 			BPF_EXIT_INSN(),
1092 		},
1093 		.fixup_map1 = { 3 },
1094 		.errstr = "R0 invalid mem access 'map_value_or_null'",
1095 		.result = REJECT,
1096 	},
1097 	{
1098 		"access memory with incorrect alignment",
1099 		.insns = {
1100 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1101 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1102 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1103 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1104 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1105 				     BPF_FUNC_map_lookup_elem),
1106 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
1107 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0),
1108 			BPF_EXIT_INSN(),
1109 		},
1110 		.fixup_map1 = { 3 },
1111 		.errstr = "misaligned value access",
1112 		.result = REJECT,
1113 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
1114 	},
1115 	{
1116 		"sometimes access memory with incorrect alignment",
1117 		.insns = {
1118 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1119 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1120 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1121 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1122 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1123 				     BPF_FUNC_map_lookup_elem),
1124 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
1125 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
1126 			BPF_EXIT_INSN(),
1127 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1),
1128 			BPF_EXIT_INSN(),
1129 		},
1130 		.fixup_map1 = { 3 },
1131 		.errstr = "R0 invalid mem access",
1132 		.errstr_unpriv = "R0 leaks addr",
1133 		.result = REJECT,
1134 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
1135 	},
1136 	{
1137 		"jump test 1",
1138 		.insns = {
1139 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1140 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -8),
1141 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
1142 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0),
1143 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1),
1144 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 1),
1145 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 1),
1146 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 2),
1147 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 1),
1148 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 3),
1149 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 1),
1150 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 4),
1151 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1),
1152 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 5),
1153 			BPF_MOV64_IMM(BPF_REG_0, 0),
1154 			BPF_EXIT_INSN(),
1155 		},
1156 		.errstr_unpriv = "R1 pointer comparison",
1157 		.result_unpriv = REJECT,
1158 		.result = ACCEPT,
1159 	},
1160 	{
1161 		"jump test 2",
1162 		.insns = {
1163 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1164 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2),
1165 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0),
1166 			BPF_JMP_IMM(BPF_JA, 0, 0, 14),
1167 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2),
1168 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0),
1169 			BPF_JMP_IMM(BPF_JA, 0, 0, 11),
1170 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 2),
1171 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0),
1172 			BPF_JMP_IMM(BPF_JA, 0, 0, 8),
1173 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2),
1174 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0),
1175 			BPF_JMP_IMM(BPF_JA, 0, 0, 5),
1176 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 2),
1177 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0),
1178 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
1179 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1),
1180 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0),
1181 			BPF_MOV64_IMM(BPF_REG_0, 0),
1182 			BPF_EXIT_INSN(),
1183 		},
1184 		.errstr_unpriv = "R1 pointer comparison",
1185 		.result_unpriv = REJECT,
1186 		.result = ACCEPT,
1187 	},
1188 	{
1189 		"jump test 3",
1190 		.insns = {
1191 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1192 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
1193 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0),
1194 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1195 			BPF_JMP_IMM(BPF_JA, 0, 0, 19),
1196 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 3),
1197 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0),
1198 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
1199 			BPF_JMP_IMM(BPF_JA, 0, 0, 15),
1200 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 3),
1201 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0),
1202 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32),
1203 			BPF_JMP_IMM(BPF_JA, 0, 0, 11),
1204 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 3),
1205 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0),
1206 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -40),
1207 			BPF_JMP_IMM(BPF_JA, 0, 0, 7),
1208 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 3),
1209 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0),
1210 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48),
1211 			BPF_JMP_IMM(BPF_JA, 0, 0, 3),
1212 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 0),
1213 			BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0),
1214 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -56),
1215 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1216 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1217 				     BPF_FUNC_map_delete_elem),
1218 			BPF_EXIT_INSN(),
1219 		},
1220 		.fixup_map1 = { 24 },
1221 		.errstr_unpriv = "R1 pointer comparison",
1222 		.result_unpriv = REJECT,
1223 		.result = ACCEPT,
1224 		.retval = -ENOENT,
1225 	},
1226 	{
1227 		"jump test 4",
1228 		.insns = {
1229 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1230 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1231 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1232 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1233 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1234 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1235 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1236 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1237 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1238 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1239 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1240 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1241 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1242 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1243 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1244 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1245 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1246 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1247 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1248 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1249 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1250 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1251 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1252 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1253 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1254 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1255 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1256 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1257 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1258 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1259 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1260 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1261 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1),
1262 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2),
1263 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3),
1264 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4),
1265 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
1266 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
1267 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
1268 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
1269 			BPF_MOV64_IMM(BPF_REG_0, 0),
1270 			BPF_EXIT_INSN(),
1271 		},
1272 		.errstr_unpriv = "R1 pointer comparison",
1273 		.result_unpriv = REJECT,
1274 		.result = ACCEPT,
1275 	},
1276 	{
1277 		"jump test 5",
1278 		.insns = {
1279 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1280 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
1281 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
1282 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
1283 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
1284 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
1285 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
1286 			BPF_MOV64_IMM(BPF_REG_0, 0),
1287 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
1288 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
1289 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
1290 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
1291 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
1292 			BPF_MOV64_IMM(BPF_REG_0, 0),
1293 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
1294 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
1295 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
1296 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
1297 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
1298 			BPF_MOV64_IMM(BPF_REG_0, 0),
1299 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
1300 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
1301 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
1302 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
1303 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
1304 			BPF_MOV64_IMM(BPF_REG_0, 0),
1305 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
1306 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8),
1307 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
1308 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8),
1309 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
1310 			BPF_MOV64_IMM(BPF_REG_0, 0),
1311 			BPF_EXIT_INSN(),
1312 		},
1313 		.errstr_unpriv = "R1 pointer comparison",
1314 		.result_unpriv = REJECT,
1315 		.result = ACCEPT,
1316 	},
1317 	{
1318 		"access skb fields ok",
1319 		.insns = {
1320 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1321 				    offsetof(struct __sk_buff, len)),
1322 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
1323 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1324 				    offsetof(struct __sk_buff, mark)),
1325 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
1326 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1327 				    offsetof(struct __sk_buff, pkt_type)),
1328 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
1329 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1330 				    offsetof(struct __sk_buff, queue_mapping)),
1331 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
1332 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1333 				    offsetof(struct __sk_buff, protocol)),
1334 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
1335 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1336 				    offsetof(struct __sk_buff, vlan_present)),
1337 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
1338 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1339 				    offsetof(struct __sk_buff, vlan_tci)),
1340 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
1341 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1342 				    offsetof(struct __sk_buff, napi_id)),
1343 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0),
1344 			BPF_EXIT_INSN(),
1345 		},
1346 		.result = ACCEPT,
1347 	},
1348 	{
1349 		"access skb fields bad1",
1350 		.insns = {
1351 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -4),
1352 			BPF_EXIT_INSN(),
1353 		},
1354 		.errstr = "invalid bpf_context access",
1355 		.result = REJECT,
1356 	},
1357 	{
1358 		"access skb fields bad2",
1359 		.insns = {
1360 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 9),
1361 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1362 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1363 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1364 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1365 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1366 				     BPF_FUNC_map_lookup_elem),
1367 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
1368 			BPF_EXIT_INSN(),
1369 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
1370 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1371 				    offsetof(struct __sk_buff, pkt_type)),
1372 			BPF_EXIT_INSN(),
1373 		},
1374 		.fixup_map1 = { 4 },
1375 		.errstr = "different pointers",
1376 		.errstr_unpriv = "R1 pointer comparison",
1377 		.result = REJECT,
1378 	},
1379 	{
1380 		"access skb fields bad3",
1381 		.insns = {
1382 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2),
1383 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1384 				    offsetof(struct __sk_buff, pkt_type)),
1385 			BPF_EXIT_INSN(),
1386 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1387 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1388 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1389 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1390 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1391 				     BPF_FUNC_map_lookup_elem),
1392 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
1393 			BPF_EXIT_INSN(),
1394 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
1395 			BPF_JMP_IMM(BPF_JA, 0, 0, -12),
1396 		},
1397 		.fixup_map1 = { 6 },
1398 		.errstr = "different pointers",
1399 		.errstr_unpriv = "R1 pointer comparison",
1400 		.result = REJECT,
1401 	},
1402 	{
1403 		"access skb fields bad4",
1404 		.insns = {
1405 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 3),
1406 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
1407 				    offsetof(struct __sk_buff, len)),
1408 			BPF_MOV64_IMM(BPF_REG_0, 0),
1409 			BPF_EXIT_INSN(),
1410 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1411 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
1412 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
1413 			BPF_LD_MAP_FD(BPF_REG_1, 0),
1414 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
1415 				     BPF_FUNC_map_lookup_elem),
1416 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
1417 			BPF_EXIT_INSN(),
1418 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
1419 			BPF_JMP_IMM(BPF_JA, 0, 0, -13),
1420 		},
1421 		.fixup_map1 = { 7 },
1422 		.errstr = "different pointers",
1423 		.errstr_unpriv = "R1 pointer comparison",
1424 		.result = REJECT,
1425 	},
1426 	{
1427 		"invalid access __sk_buff family",
1428 		.insns = {
1429 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1430 				    offsetof(struct __sk_buff, family)),
1431 			BPF_EXIT_INSN(),
1432 		},
1433 		.errstr = "invalid bpf_context access",
1434 		.result = REJECT,
1435 	},
1436 	{
1437 		"invalid access __sk_buff remote_ip4",
1438 		.insns = {
1439 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1440 				    offsetof(struct __sk_buff, remote_ip4)),
1441 			BPF_EXIT_INSN(),
1442 		},
1443 		.errstr = "invalid bpf_context access",
1444 		.result = REJECT,
1445 	},
1446 	{
1447 		"invalid access __sk_buff local_ip4",
1448 		.insns = {
1449 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1450 				    offsetof(struct __sk_buff, local_ip4)),
1451 			BPF_EXIT_INSN(),
1452 		},
1453 		.errstr = "invalid bpf_context access",
1454 		.result = REJECT,
1455 	},
1456 	{
1457 		"invalid access __sk_buff remote_ip6",
1458 		.insns = {
1459 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1460 				    offsetof(struct __sk_buff, remote_ip6)),
1461 			BPF_EXIT_INSN(),
1462 		},
1463 		.errstr = "invalid bpf_context access",
1464 		.result = REJECT,
1465 	},
1466 	{
1467 		"invalid access __sk_buff local_ip6",
1468 		.insns = {
1469 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1470 				    offsetof(struct __sk_buff, local_ip6)),
1471 			BPF_EXIT_INSN(),
1472 		},
1473 		.errstr = "invalid bpf_context access",
1474 		.result = REJECT,
1475 	},
1476 	{
1477 		"invalid access __sk_buff remote_port",
1478 		.insns = {
1479 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1480 				    offsetof(struct __sk_buff, remote_port)),
1481 			BPF_EXIT_INSN(),
1482 		},
1483 		.errstr = "invalid bpf_context access",
1484 		.result = REJECT,
1485 	},
1486 	{
1487 		"invalid access __sk_buff remote_port",
1488 		.insns = {
1489 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1490 				    offsetof(struct __sk_buff, local_port)),
1491 			BPF_EXIT_INSN(),
1492 		},
1493 		.errstr = "invalid bpf_context access",
1494 		.result = REJECT,
1495 	},
1496 	{
1497 		"valid access __sk_buff family",
1498 		.insns = {
1499 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1500 				    offsetof(struct __sk_buff, family)),
1501 			BPF_EXIT_INSN(),
1502 		},
1503 		.result = ACCEPT,
1504 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1505 	},
1506 	{
1507 		"valid access __sk_buff remote_ip4",
1508 		.insns = {
1509 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1510 				    offsetof(struct __sk_buff, remote_ip4)),
1511 			BPF_EXIT_INSN(),
1512 		},
1513 		.result = ACCEPT,
1514 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1515 	},
1516 	{
1517 		"valid access __sk_buff local_ip4",
1518 		.insns = {
1519 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1520 				    offsetof(struct __sk_buff, local_ip4)),
1521 			BPF_EXIT_INSN(),
1522 		},
1523 		.result = ACCEPT,
1524 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1525 	},
1526 	{
1527 		"valid access __sk_buff remote_ip6",
1528 		.insns = {
1529 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1530 				    offsetof(struct __sk_buff, remote_ip6[0])),
1531 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1532 				    offsetof(struct __sk_buff, remote_ip6[1])),
1533 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1534 				    offsetof(struct __sk_buff, remote_ip6[2])),
1535 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1536 				    offsetof(struct __sk_buff, remote_ip6[3])),
1537 			BPF_EXIT_INSN(),
1538 		},
1539 		.result = ACCEPT,
1540 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1541 	},
1542 	{
1543 		"valid access __sk_buff local_ip6",
1544 		.insns = {
1545 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1546 				    offsetof(struct __sk_buff, local_ip6[0])),
1547 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1548 				    offsetof(struct __sk_buff, local_ip6[1])),
1549 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1550 				    offsetof(struct __sk_buff, local_ip6[2])),
1551 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1552 				    offsetof(struct __sk_buff, local_ip6[3])),
1553 			BPF_EXIT_INSN(),
1554 		},
1555 		.result = ACCEPT,
1556 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1557 	},
1558 	{
1559 		"valid access __sk_buff remote_port",
1560 		.insns = {
1561 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1562 				    offsetof(struct __sk_buff, remote_port)),
1563 			BPF_EXIT_INSN(),
1564 		},
1565 		.result = ACCEPT,
1566 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1567 	},
1568 	{
1569 		"valid access __sk_buff remote_port",
1570 		.insns = {
1571 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1572 				    offsetof(struct __sk_buff, local_port)),
1573 			BPF_EXIT_INSN(),
1574 		},
1575 		.result = ACCEPT,
1576 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1577 	},
1578 	{
1579 		"invalid access of tc_classid for SK_SKB",
1580 		.insns = {
1581 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1582 				    offsetof(struct __sk_buff, tc_classid)),
1583 			BPF_EXIT_INSN(),
1584 		},
1585 		.result = REJECT,
1586 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1587 		.errstr = "invalid bpf_context access",
1588 	},
1589 	{
1590 		"invalid access of skb->mark for SK_SKB",
1591 		.insns = {
1592 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1593 				    offsetof(struct __sk_buff, mark)),
1594 			BPF_EXIT_INSN(),
1595 		},
1596 		.result =  REJECT,
1597 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1598 		.errstr = "invalid bpf_context access",
1599 	},
1600 	{
1601 		"check skb->mark is not writeable by SK_SKB",
1602 		.insns = {
1603 			BPF_MOV64_IMM(BPF_REG_0, 0),
1604 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1605 				    offsetof(struct __sk_buff, mark)),
1606 			BPF_EXIT_INSN(),
1607 		},
1608 		.result =  REJECT,
1609 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1610 		.errstr = "invalid bpf_context access",
1611 	},
1612 	{
1613 		"check skb->tc_index is writeable by SK_SKB",
1614 		.insns = {
1615 			BPF_MOV64_IMM(BPF_REG_0, 0),
1616 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1617 				    offsetof(struct __sk_buff, tc_index)),
1618 			BPF_EXIT_INSN(),
1619 		},
1620 		.result = ACCEPT,
1621 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1622 	},
1623 	{
1624 		"check skb->priority is writeable by SK_SKB",
1625 		.insns = {
1626 			BPF_MOV64_IMM(BPF_REG_0, 0),
1627 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
1628 				    offsetof(struct __sk_buff, priority)),
1629 			BPF_EXIT_INSN(),
1630 		},
1631 		.result = ACCEPT,
1632 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1633 	},
1634 	{
1635 		"direct packet read for SK_SKB",
1636 		.insns = {
1637 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1638 				    offsetof(struct __sk_buff, data)),
1639 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
1640 				    offsetof(struct __sk_buff, data_end)),
1641 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1642 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1643 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
1644 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
1645 			BPF_MOV64_IMM(BPF_REG_0, 0),
1646 			BPF_EXIT_INSN(),
1647 		},
1648 		.result = ACCEPT,
1649 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1650 	},
1651 	{
1652 		"direct packet write for SK_SKB",
1653 		.insns = {
1654 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1655 				    offsetof(struct __sk_buff, data)),
1656 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
1657 				    offsetof(struct __sk_buff, data_end)),
1658 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1659 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1660 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
1661 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
1662 			BPF_MOV64_IMM(BPF_REG_0, 0),
1663 			BPF_EXIT_INSN(),
1664 		},
1665 		.result = ACCEPT,
1666 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1667 	},
1668 	{
1669 		"overlapping checks for direct packet access SK_SKB",
1670 		.insns = {
1671 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1672 				    offsetof(struct __sk_buff, data)),
1673 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
1674 				    offsetof(struct __sk_buff, data_end)),
1675 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1676 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1677 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
1678 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1679 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
1680 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
1681 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
1682 			BPF_MOV64_IMM(BPF_REG_0, 0),
1683 			BPF_EXIT_INSN(),
1684 		},
1685 		.result = ACCEPT,
1686 		.prog_type = BPF_PROG_TYPE_SK_SKB,
1687 	},
1688 	{
1689 		"direct packet read for SK_MSG",
1690 		.insns = {
1691 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
1692 				    offsetof(struct sk_msg_md, data)),
1693 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1,
1694 				    offsetof(struct sk_msg_md, data_end)),
1695 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1696 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1697 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
1698 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
1699 			BPF_MOV64_IMM(BPF_REG_0, 0),
1700 			BPF_EXIT_INSN(),
1701 		},
1702 		.result = ACCEPT,
1703 		.prog_type = BPF_PROG_TYPE_SK_MSG,
1704 	},
1705 	{
1706 		"direct packet write for SK_MSG",
1707 		.insns = {
1708 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
1709 				    offsetof(struct sk_msg_md, data)),
1710 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1,
1711 				    offsetof(struct sk_msg_md, data_end)),
1712 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1713 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1714 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
1715 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
1716 			BPF_MOV64_IMM(BPF_REG_0, 0),
1717 			BPF_EXIT_INSN(),
1718 		},
1719 		.result = ACCEPT,
1720 		.prog_type = BPF_PROG_TYPE_SK_MSG,
1721 	},
1722 	{
1723 		"overlapping checks for direct packet access SK_MSG",
1724 		.insns = {
1725 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
1726 				    offsetof(struct sk_msg_md, data)),
1727 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1,
1728 				    offsetof(struct sk_msg_md, data_end)),
1729 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1730 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1731 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
1732 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1733 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
1734 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
1735 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
1736 			BPF_MOV64_IMM(BPF_REG_0, 0),
1737 			BPF_EXIT_INSN(),
1738 		},
1739 		.result = ACCEPT,
1740 		.prog_type = BPF_PROG_TYPE_SK_MSG,
1741 	},
1742 	{
1743 		"check skb->mark is not writeable by sockets",
1744 		.insns = {
1745 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
1746 				    offsetof(struct __sk_buff, mark)),
1747 			BPF_EXIT_INSN(),
1748 		},
1749 		.errstr = "invalid bpf_context access",
1750 		.errstr_unpriv = "R1 leaks addr",
1751 		.result = REJECT,
1752 	},
1753 	{
1754 		"check skb->tc_index is not writeable by sockets",
1755 		.insns = {
1756 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
1757 				    offsetof(struct __sk_buff, tc_index)),
1758 			BPF_EXIT_INSN(),
1759 		},
1760 		.errstr = "invalid bpf_context access",
1761 		.errstr_unpriv = "R1 leaks addr",
1762 		.result = REJECT,
1763 	},
1764 	{
1765 		"check cb access: byte",
1766 		.insns = {
1767 			BPF_MOV64_IMM(BPF_REG_0, 0),
1768 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1769 				    offsetof(struct __sk_buff, cb[0])),
1770 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1771 				    offsetof(struct __sk_buff, cb[0]) + 1),
1772 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1773 				    offsetof(struct __sk_buff, cb[0]) + 2),
1774 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1775 				    offsetof(struct __sk_buff, cb[0]) + 3),
1776 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1777 				    offsetof(struct __sk_buff, cb[1])),
1778 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1779 				    offsetof(struct __sk_buff, cb[1]) + 1),
1780 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1781 				    offsetof(struct __sk_buff, cb[1]) + 2),
1782 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1783 				    offsetof(struct __sk_buff, cb[1]) + 3),
1784 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1785 				    offsetof(struct __sk_buff, cb[2])),
1786 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1787 				    offsetof(struct __sk_buff, cb[2]) + 1),
1788 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1789 				    offsetof(struct __sk_buff, cb[2]) + 2),
1790 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1791 				    offsetof(struct __sk_buff, cb[2]) + 3),
1792 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1793 				    offsetof(struct __sk_buff, cb[3])),
1794 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1795 				    offsetof(struct __sk_buff, cb[3]) + 1),
1796 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1797 				    offsetof(struct __sk_buff, cb[3]) + 2),
1798 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1799 				    offsetof(struct __sk_buff, cb[3]) + 3),
1800 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1801 				    offsetof(struct __sk_buff, cb[4])),
1802 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1803 				    offsetof(struct __sk_buff, cb[4]) + 1),
1804 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1805 				    offsetof(struct __sk_buff, cb[4]) + 2),
1806 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1807 				    offsetof(struct __sk_buff, cb[4]) + 3),
1808 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1809 				    offsetof(struct __sk_buff, cb[0])),
1810 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1811 				    offsetof(struct __sk_buff, cb[0]) + 1),
1812 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1813 				    offsetof(struct __sk_buff, cb[0]) + 2),
1814 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1815 				    offsetof(struct __sk_buff, cb[0]) + 3),
1816 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1817 				    offsetof(struct __sk_buff, cb[1])),
1818 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1819 				    offsetof(struct __sk_buff, cb[1]) + 1),
1820 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1821 				    offsetof(struct __sk_buff, cb[1]) + 2),
1822 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1823 				    offsetof(struct __sk_buff, cb[1]) + 3),
1824 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1825 				    offsetof(struct __sk_buff, cb[2])),
1826 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1827 				    offsetof(struct __sk_buff, cb[2]) + 1),
1828 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1829 				    offsetof(struct __sk_buff, cb[2]) + 2),
1830 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1831 				    offsetof(struct __sk_buff, cb[2]) + 3),
1832 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1833 				    offsetof(struct __sk_buff, cb[3])),
1834 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1835 				    offsetof(struct __sk_buff, cb[3]) + 1),
1836 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1837 				    offsetof(struct __sk_buff, cb[3]) + 2),
1838 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1839 				    offsetof(struct __sk_buff, cb[3]) + 3),
1840 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1841 				    offsetof(struct __sk_buff, cb[4])),
1842 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1843 				    offsetof(struct __sk_buff, cb[4]) + 1),
1844 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1845 				    offsetof(struct __sk_buff, cb[4]) + 2),
1846 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1847 				    offsetof(struct __sk_buff, cb[4]) + 3),
1848 			BPF_EXIT_INSN(),
1849 		},
1850 		.result = ACCEPT,
1851 	},
1852 	{
1853 		"__sk_buff->hash, offset 0, byte store not permitted",
1854 		.insns = {
1855 			BPF_MOV64_IMM(BPF_REG_0, 0),
1856 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1857 				    offsetof(struct __sk_buff, hash)),
1858 			BPF_EXIT_INSN(),
1859 		},
1860 		.errstr = "invalid bpf_context access",
1861 		.result = REJECT,
1862 	},
1863 	{
1864 		"__sk_buff->tc_index, offset 3, byte store not permitted",
1865 		.insns = {
1866 			BPF_MOV64_IMM(BPF_REG_0, 0),
1867 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1868 				    offsetof(struct __sk_buff, tc_index) + 3),
1869 			BPF_EXIT_INSN(),
1870 		},
1871 		.errstr = "invalid bpf_context access",
1872 		.result = REJECT,
1873 	},
1874 	{
1875 		"check skb->hash byte load permitted",
1876 		.insns = {
1877 			BPF_MOV64_IMM(BPF_REG_0, 0),
1878 #if __BYTE_ORDER == __LITTLE_ENDIAN
1879 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1880 				    offsetof(struct __sk_buff, hash)),
1881 #else
1882 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1883 				    offsetof(struct __sk_buff, hash) + 3),
1884 #endif
1885 			BPF_EXIT_INSN(),
1886 		},
1887 		.result = ACCEPT,
1888 	},
1889 	{
1890 		"check skb->hash byte load not permitted 1",
1891 		.insns = {
1892 			BPF_MOV64_IMM(BPF_REG_0, 0),
1893 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1894 				    offsetof(struct __sk_buff, hash) + 1),
1895 			BPF_EXIT_INSN(),
1896 		},
1897 		.errstr = "invalid bpf_context access",
1898 		.result = REJECT,
1899 	},
1900 	{
1901 		"check skb->hash byte load not permitted 2",
1902 		.insns = {
1903 			BPF_MOV64_IMM(BPF_REG_0, 0),
1904 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1905 				    offsetof(struct __sk_buff, hash) + 2),
1906 			BPF_EXIT_INSN(),
1907 		},
1908 		.errstr = "invalid bpf_context access",
1909 		.result = REJECT,
1910 	},
1911 	{
1912 		"check skb->hash byte load not permitted 3",
1913 		.insns = {
1914 			BPF_MOV64_IMM(BPF_REG_0, 0),
1915 #if __BYTE_ORDER == __LITTLE_ENDIAN
1916 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1917 				    offsetof(struct __sk_buff, hash) + 3),
1918 #else
1919 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
1920 				    offsetof(struct __sk_buff, hash)),
1921 #endif
1922 			BPF_EXIT_INSN(),
1923 		},
1924 		.errstr = "invalid bpf_context access",
1925 		.result = REJECT,
1926 	},
1927 	{
1928 		"check cb access: byte, wrong type",
1929 		.insns = {
1930 			BPF_MOV64_IMM(BPF_REG_0, 0),
1931 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
1932 				    offsetof(struct __sk_buff, cb[0])),
1933 			BPF_EXIT_INSN(),
1934 		},
1935 		.errstr = "invalid bpf_context access",
1936 		.result = REJECT,
1937 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
1938 	},
1939 	{
1940 		"check cb access: half",
1941 		.insns = {
1942 			BPF_MOV64_IMM(BPF_REG_0, 0),
1943 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1944 				    offsetof(struct __sk_buff, cb[0])),
1945 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1946 				    offsetof(struct __sk_buff, cb[0]) + 2),
1947 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1948 				    offsetof(struct __sk_buff, cb[1])),
1949 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1950 				    offsetof(struct __sk_buff, cb[1]) + 2),
1951 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1952 				    offsetof(struct __sk_buff, cb[2])),
1953 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1954 				    offsetof(struct __sk_buff, cb[2]) + 2),
1955 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1956 				    offsetof(struct __sk_buff, cb[3])),
1957 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1958 				    offsetof(struct __sk_buff, cb[3]) + 2),
1959 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1960 				    offsetof(struct __sk_buff, cb[4])),
1961 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1962 				    offsetof(struct __sk_buff, cb[4]) + 2),
1963 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1964 				    offsetof(struct __sk_buff, cb[0])),
1965 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1966 				    offsetof(struct __sk_buff, cb[0]) + 2),
1967 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1968 				    offsetof(struct __sk_buff, cb[1])),
1969 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1970 				    offsetof(struct __sk_buff, cb[1]) + 2),
1971 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1972 				    offsetof(struct __sk_buff, cb[2])),
1973 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1974 				    offsetof(struct __sk_buff, cb[2]) + 2),
1975 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1976 				    offsetof(struct __sk_buff, cb[3])),
1977 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1978 				    offsetof(struct __sk_buff, cb[3]) + 2),
1979 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1980 				    offsetof(struct __sk_buff, cb[4])),
1981 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1982 				    offsetof(struct __sk_buff, cb[4]) + 2),
1983 			BPF_EXIT_INSN(),
1984 		},
1985 		.result = ACCEPT,
1986 	},
1987 	{
1988 		"check cb access: half, unaligned",
1989 		.insns = {
1990 			BPF_MOV64_IMM(BPF_REG_0, 0),
1991 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
1992 				    offsetof(struct __sk_buff, cb[0]) + 1),
1993 			BPF_EXIT_INSN(),
1994 		},
1995 		.errstr = "misaligned context access",
1996 		.result = REJECT,
1997 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
1998 	},
1999 	{
2000 		"check __sk_buff->hash, offset 0, half store not permitted",
2001 		.insns = {
2002 			BPF_MOV64_IMM(BPF_REG_0, 0),
2003 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
2004 				    offsetof(struct __sk_buff, hash)),
2005 			BPF_EXIT_INSN(),
2006 		},
2007 		.errstr = "invalid bpf_context access",
2008 		.result = REJECT,
2009 	},
2010 	{
2011 		"check __sk_buff->tc_index, offset 2, half store not permitted",
2012 		.insns = {
2013 			BPF_MOV64_IMM(BPF_REG_0, 0),
2014 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
2015 				    offsetof(struct __sk_buff, tc_index) + 2),
2016 			BPF_EXIT_INSN(),
2017 		},
2018 		.errstr = "invalid bpf_context access",
2019 		.result = REJECT,
2020 	},
2021 	{
2022 		"check skb->hash half load permitted",
2023 		.insns = {
2024 			BPF_MOV64_IMM(BPF_REG_0, 0),
2025 #if __BYTE_ORDER == __LITTLE_ENDIAN
2026 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
2027 				    offsetof(struct __sk_buff, hash)),
2028 #else
2029 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
2030 				    offsetof(struct __sk_buff, hash) + 2),
2031 #endif
2032 			BPF_EXIT_INSN(),
2033 		},
2034 		.result = ACCEPT,
2035 	},
2036 	{
2037 		"check skb->hash half load not permitted",
2038 		.insns = {
2039 			BPF_MOV64_IMM(BPF_REG_0, 0),
2040 #if __BYTE_ORDER == __LITTLE_ENDIAN
2041 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
2042 				    offsetof(struct __sk_buff, hash) + 2),
2043 #else
2044 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
2045 				    offsetof(struct __sk_buff, hash)),
2046 #endif
2047 			BPF_EXIT_INSN(),
2048 		},
2049 		.errstr = "invalid bpf_context access",
2050 		.result = REJECT,
2051 	},
2052 	{
2053 		"check cb access: half, wrong type",
2054 		.insns = {
2055 			BPF_MOV64_IMM(BPF_REG_0, 0),
2056 			BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
2057 				    offsetof(struct __sk_buff, cb[0])),
2058 			BPF_EXIT_INSN(),
2059 		},
2060 		.errstr = "invalid bpf_context access",
2061 		.result = REJECT,
2062 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
2063 	},
2064 	{
2065 		"check cb access: word",
2066 		.insns = {
2067 			BPF_MOV64_IMM(BPF_REG_0, 0),
2068 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2069 				    offsetof(struct __sk_buff, cb[0])),
2070 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2071 				    offsetof(struct __sk_buff, cb[1])),
2072 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2073 				    offsetof(struct __sk_buff, cb[2])),
2074 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2075 				    offsetof(struct __sk_buff, cb[3])),
2076 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2077 				    offsetof(struct __sk_buff, cb[4])),
2078 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2079 				    offsetof(struct __sk_buff, cb[0])),
2080 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2081 				    offsetof(struct __sk_buff, cb[1])),
2082 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2083 				    offsetof(struct __sk_buff, cb[2])),
2084 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2085 				    offsetof(struct __sk_buff, cb[3])),
2086 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2087 				    offsetof(struct __sk_buff, cb[4])),
2088 			BPF_EXIT_INSN(),
2089 		},
2090 		.result = ACCEPT,
2091 	},
2092 	{
2093 		"check cb access: word, unaligned 1",
2094 		.insns = {
2095 			BPF_MOV64_IMM(BPF_REG_0, 0),
2096 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2097 				    offsetof(struct __sk_buff, cb[0]) + 2),
2098 			BPF_EXIT_INSN(),
2099 		},
2100 		.errstr = "misaligned context access",
2101 		.result = REJECT,
2102 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
2103 	},
2104 	{
2105 		"check cb access: word, unaligned 2",
2106 		.insns = {
2107 			BPF_MOV64_IMM(BPF_REG_0, 0),
2108 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2109 				    offsetof(struct __sk_buff, cb[4]) + 1),
2110 			BPF_EXIT_INSN(),
2111 		},
2112 		.errstr = "misaligned context access",
2113 		.result = REJECT,
2114 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
2115 	},
2116 	{
2117 		"check cb access: word, unaligned 3",
2118 		.insns = {
2119 			BPF_MOV64_IMM(BPF_REG_0, 0),
2120 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2121 				    offsetof(struct __sk_buff, cb[4]) + 2),
2122 			BPF_EXIT_INSN(),
2123 		},
2124 		.errstr = "misaligned context access",
2125 		.result = REJECT,
2126 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
2127 	},
2128 	{
2129 		"check cb access: word, unaligned 4",
2130 		.insns = {
2131 			BPF_MOV64_IMM(BPF_REG_0, 0),
2132 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2133 				    offsetof(struct __sk_buff, cb[4]) + 3),
2134 			BPF_EXIT_INSN(),
2135 		},
2136 		.errstr = "misaligned context access",
2137 		.result = REJECT,
2138 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
2139 	},
2140 	{
2141 		"check cb access: double",
2142 		.insns = {
2143 			BPF_MOV64_IMM(BPF_REG_0, 0),
2144 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2145 				    offsetof(struct __sk_buff, cb[0])),
2146 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2147 				    offsetof(struct __sk_buff, cb[2])),
2148 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
2149 				    offsetof(struct __sk_buff, cb[0])),
2150 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
2151 				    offsetof(struct __sk_buff, cb[2])),
2152 			BPF_EXIT_INSN(),
2153 		},
2154 		.result = ACCEPT,
2155 	},
2156 	{
2157 		"check cb access: double, unaligned 1",
2158 		.insns = {
2159 			BPF_MOV64_IMM(BPF_REG_0, 0),
2160 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2161 				    offsetof(struct __sk_buff, cb[1])),
2162 			BPF_EXIT_INSN(),
2163 		},
2164 		.errstr = "misaligned context access",
2165 		.result = REJECT,
2166 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
2167 	},
2168 	{
2169 		"check cb access: double, unaligned 2",
2170 		.insns = {
2171 			BPF_MOV64_IMM(BPF_REG_0, 0),
2172 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2173 				    offsetof(struct __sk_buff, cb[3])),
2174 			BPF_EXIT_INSN(),
2175 		},
2176 		.errstr = "misaligned context access",
2177 		.result = REJECT,
2178 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
2179 	},
2180 	{
2181 		"check cb access: double, oob 1",
2182 		.insns = {
2183 			BPF_MOV64_IMM(BPF_REG_0, 0),
2184 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2185 				    offsetof(struct __sk_buff, cb[4])),
2186 			BPF_EXIT_INSN(),
2187 		},
2188 		.errstr = "invalid bpf_context access",
2189 		.result = REJECT,
2190 	},
2191 	{
2192 		"check cb access: double, oob 2",
2193 		.insns = {
2194 			BPF_MOV64_IMM(BPF_REG_0, 0),
2195 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
2196 				    offsetof(struct __sk_buff, cb[4])),
2197 			BPF_EXIT_INSN(),
2198 		},
2199 		.errstr = "invalid bpf_context access",
2200 		.result = REJECT,
2201 	},
2202 	{
2203 		"check __sk_buff->ifindex dw store not permitted",
2204 		.insns = {
2205 			BPF_MOV64_IMM(BPF_REG_0, 0),
2206 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2207 				    offsetof(struct __sk_buff, ifindex)),
2208 			BPF_EXIT_INSN(),
2209 		},
2210 		.errstr = "invalid bpf_context access",
2211 		.result = REJECT,
2212 	},
2213 	{
2214 		"check __sk_buff->ifindex dw load not permitted",
2215 		.insns = {
2216 			BPF_MOV64_IMM(BPF_REG_0, 0),
2217 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
2218 				    offsetof(struct __sk_buff, ifindex)),
2219 			BPF_EXIT_INSN(),
2220 		},
2221 		.errstr = "invalid bpf_context access",
2222 		.result = REJECT,
2223 	},
2224 	{
2225 		"check cb access: double, wrong type",
2226 		.insns = {
2227 			BPF_MOV64_IMM(BPF_REG_0, 0),
2228 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
2229 				    offsetof(struct __sk_buff, cb[0])),
2230 			BPF_EXIT_INSN(),
2231 		},
2232 		.errstr = "invalid bpf_context access",
2233 		.result = REJECT,
2234 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
2235 	},
2236 	{
2237 		"check out of range skb->cb access",
2238 		.insns = {
2239 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2240 				    offsetof(struct __sk_buff, cb[0]) + 256),
2241 			BPF_EXIT_INSN(),
2242 		},
2243 		.errstr = "invalid bpf_context access",
2244 		.errstr_unpriv = "",
2245 		.result = REJECT,
2246 		.prog_type = BPF_PROG_TYPE_SCHED_ACT,
2247 	},
2248 	{
2249 		"write skb fields from socket prog",
2250 		.insns = {
2251 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2252 				    offsetof(struct __sk_buff, cb[4])),
2253 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
2254 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2255 				    offsetof(struct __sk_buff, mark)),
2256 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2257 				    offsetof(struct __sk_buff, tc_index)),
2258 			BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
2259 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
2260 				    offsetof(struct __sk_buff, cb[0])),
2261 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
2262 				    offsetof(struct __sk_buff, cb[2])),
2263 			BPF_EXIT_INSN(),
2264 		},
2265 		.result = ACCEPT,
2266 		.errstr_unpriv = "R1 leaks addr",
2267 		.result_unpriv = REJECT,
2268 	},
2269 	{
2270 		"write skb fields from tc_cls_act prog",
2271 		.insns = {
2272 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2273 				    offsetof(struct __sk_buff, cb[0])),
2274 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2275 				    offsetof(struct __sk_buff, mark)),
2276 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2277 				    offsetof(struct __sk_buff, tc_index)),
2278 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2279 				    offsetof(struct __sk_buff, tc_index)),
2280 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
2281 				    offsetof(struct __sk_buff, cb[3])),
2282 			BPF_EXIT_INSN(),
2283 		},
2284 		.errstr_unpriv = "",
2285 		.result_unpriv = REJECT,
2286 		.result = ACCEPT,
2287 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2288 	},
2289 	{
2290 		"PTR_TO_STACK store/load",
2291 		.insns = {
2292 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2293 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10),
2294 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c),
2295 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2),
2296 			BPF_EXIT_INSN(),
2297 		},
2298 		.result = ACCEPT,
2299 		.retval = 0xfaceb00c,
2300 	},
2301 	{
2302 		"PTR_TO_STACK store/load - bad alignment on off",
2303 		.insns = {
2304 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2305 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
2306 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c),
2307 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2),
2308 			BPF_EXIT_INSN(),
2309 		},
2310 		.result = REJECT,
2311 		.errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8",
2312 	},
2313 	{
2314 		"PTR_TO_STACK store/load - bad alignment on reg",
2315 		.insns = {
2316 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2317 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10),
2318 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
2319 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
2320 			BPF_EXIT_INSN(),
2321 		},
2322 		.result = REJECT,
2323 		.errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8",
2324 	},
2325 	{
2326 		"PTR_TO_STACK store/load - out of bounds low",
2327 		.insns = {
2328 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2329 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000),
2330 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
2331 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
2332 			BPF_EXIT_INSN(),
2333 		},
2334 		.result = REJECT,
2335 		.errstr = "invalid stack off=-79992 size=8",
2336 	},
2337 	{
2338 		"PTR_TO_STACK store/load - out of bounds high",
2339 		.insns = {
2340 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2341 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
2342 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
2343 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
2344 			BPF_EXIT_INSN(),
2345 		},
2346 		.result = REJECT,
2347 		.errstr = "invalid stack off=0 size=8",
2348 	},
2349 	{
2350 		"unpriv: return pointer",
2351 		.insns = {
2352 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
2353 			BPF_EXIT_INSN(),
2354 		},
2355 		.result = ACCEPT,
2356 		.result_unpriv = REJECT,
2357 		.errstr_unpriv = "R0 leaks addr",
2358 		.retval = POINTER_VALUE,
2359 	},
2360 	{
2361 		"unpriv: add const to pointer",
2362 		.insns = {
2363 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
2364 			BPF_MOV64_IMM(BPF_REG_0, 0),
2365 			BPF_EXIT_INSN(),
2366 		},
2367 		.result = ACCEPT,
2368 	},
2369 	{
2370 		"unpriv: add pointer to pointer",
2371 		.insns = {
2372 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10),
2373 			BPF_MOV64_IMM(BPF_REG_0, 0),
2374 			BPF_EXIT_INSN(),
2375 		},
2376 		.result = REJECT,
2377 		.errstr = "R1 pointer += pointer",
2378 	},
2379 	{
2380 		"unpriv: neg pointer",
2381 		.insns = {
2382 			BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0),
2383 			BPF_MOV64_IMM(BPF_REG_0, 0),
2384 			BPF_EXIT_INSN(),
2385 		},
2386 		.result = ACCEPT,
2387 		.result_unpriv = REJECT,
2388 		.errstr_unpriv = "R1 pointer arithmetic",
2389 	},
2390 	{
2391 		"unpriv: cmp pointer with const",
2392 		.insns = {
2393 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
2394 			BPF_MOV64_IMM(BPF_REG_0, 0),
2395 			BPF_EXIT_INSN(),
2396 		},
2397 		.result = ACCEPT,
2398 		.result_unpriv = REJECT,
2399 		.errstr_unpriv = "R1 pointer comparison",
2400 	},
2401 	{
2402 		"unpriv: cmp pointer with pointer",
2403 		.insns = {
2404 			BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0),
2405 			BPF_MOV64_IMM(BPF_REG_0, 0),
2406 			BPF_EXIT_INSN(),
2407 		},
2408 		.result = ACCEPT,
2409 		.result_unpriv = REJECT,
2410 		.errstr_unpriv = "R10 pointer comparison",
2411 	},
2412 	{
2413 		"unpriv: check that printk is disallowed",
2414 		.insns = {
2415 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
2416 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2417 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
2418 			BPF_MOV64_IMM(BPF_REG_2, 8),
2419 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_1),
2420 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2421 				     BPF_FUNC_trace_printk),
2422 			BPF_MOV64_IMM(BPF_REG_0, 0),
2423 			BPF_EXIT_INSN(),
2424 		},
2425 		.errstr_unpriv = "unknown func bpf_trace_printk#6",
2426 		.result_unpriv = REJECT,
2427 		.result = ACCEPT,
2428 	},
2429 	{
2430 		"unpriv: pass pointer to helper function",
2431 		.insns = {
2432 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
2433 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
2434 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
2435 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2436 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
2437 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
2438 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2439 				     BPF_FUNC_map_update_elem),
2440 			BPF_MOV64_IMM(BPF_REG_0, 0),
2441 			BPF_EXIT_INSN(),
2442 		},
2443 		.fixup_map1 = { 3 },
2444 		.errstr_unpriv = "R4 leaks addr",
2445 		.result_unpriv = REJECT,
2446 		.result = ACCEPT,
2447 	},
2448 	{
2449 		"unpriv: indirectly pass pointer on stack to helper function",
2450 		.insns = {
2451 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
2452 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
2453 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
2454 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2455 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2456 				     BPF_FUNC_map_lookup_elem),
2457 			BPF_MOV64_IMM(BPF_REG_0, 0),
2458 			BPF_EXIT_INSN(),
2459 		},
2460 		.fixup_map1 = { 3 },
2461 		.errstr = "invalid indirect read from stack off -8+0 size 8",
2462 		.result = REJECT,
2463 	},
2464 	{
2465 		"unpriv: mangle pointer on stack 1",
2466 		.insns = {
2467 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
2468 			BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0),
2469 			BPF_MOV64_IMM(BPF_REG_0, 0),
2470 			BPF_EXIT_INSN(),
2471 		},
2472 		.errstr_unpriv = "attempt to corrupt spilled",
2473 		.result_unpriv = REJECT,
2474 		.result = ACCEPT,
2475 	},
2476 	{
2477 		"unpriv: mangle pointer on stack 2",
2478 		.insns = {
2479 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
2480 			BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0),
2481 			BPF_MOV64_IMM(BPF_REG_0, 0),
2482 			BPF_EXIT_INSN(),
2483 		},
2484 		.errstr_unpriv = "attempt to corrupt spilled",
2485 		.result_unpriv = REJECT,
2486 		.result = ACCEPT,
2487 	},
2488 	{
2489 		"unpriv: read pointer from stack in small chunks",
2490 		.insns = {
2491 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8),
2492 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8),
2493 			BPF_MOV64_IMM(BPF_REG_0, 0),
2494 			BPF_EXIT_INSN(),
2495 		},
2496 		.errstr = "invalid size",
2497 		.result = REJECT,
2498 	},
2499 	{
2500 		"unpriv: write pointer into ctx",
2501 		.insns = {
2502 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0),
2503 			BPF_MOV64_IMM(BPF_REG_0, 0),
2504 			BPF_EXIT_INSN(),
2505 		},
2506 		.errstr_unpriv = "R1 leaks addr",
2507 		.result_unpriv = REJECT,
2508 		.errstr = "invalid bpf_context access",
2509 		.result = REJECT,
2510 	},
2511 	{
2512 		"unpriv: spill/fill of ctx",
2513 		.insns = {
2514 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2515 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2516 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2517 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
2518 			BPF_MOV64_IMM(BPF_REG_0, 0),
2519 			BPF_EXIT_INSN(),
2520 		},
2521 		.result = ACCEPT,
2522 	},
2523 	{
2524 		"unpriv: spill/fill of ctx 2",
2525 		.insns = {
2526 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2527 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2528 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2529 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
2530 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2531 				     BPF_FUNC_get_hash_recalc),
2532 			BPF_MOV64_IMM(BPF_REG_0, 0),
2533 			BPF_EXIT_INSN(),
2534 		},
2535 		.result = ACCEPT,
2536 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2537 	},
2538 	{
2539 		"unpriv: spill/fill of ctx 3",
2540 		.insns = {
2541 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2542 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2543 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2544 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0),
2545 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
2546 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2547 				     BPF_FUNC_get_hash_recalc),
2548 			BPF_EXIT_INSN(),
2549 		},
2550 		.result = REJECT,
2551 		.errstr = "R1 type=fp expected=ctx",
2552 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2553 	},
2554 	{
2555 		"unpriv: spill/fill of ctx 4",
2556 		.insns = {
2557 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2558 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2559 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2560 			BPF_MOV64_IMM(BPF_REG_0, 1),
2561 			BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10,
2562 				     BPF_REG_0, -8, 0),
2563 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
2564 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2565 				     BPF_FUNC_get_hash_recalc),
2566 			BPF_EXIT_INSN(),
2567 		},
2568 		.result = REJECT,
2569 		.errstr = "R1 type=inv expected=ctx",
2570 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2571 	},
2572 	{
2573 		"unpriv: spill/fill of different pointers stx",
2574 		.insns = {
2575 			BPF_MOV64_IMM(BPF_REG_3, 42),
2576 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2577 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2578 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
2579 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
2580 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
2581 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0),
2582 			BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
2583 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2584 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
2585 			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3,
2586 				    offsetof(struct __sk_buff, mark)),
2587 			BPF_MOV64_IMM(BPF_REG_0, 0),
2588 			BPF_EXIT_INSN(),
2589 		},
2590 		.result = REJECT,
2591 		.errstr = "same insn cannot be used with different pointers",
2592 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2593 	},
2594 	{
2595 		"unpriv: spill/fill of different pointers ldx",
2596 		.insns = {
2597 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2598 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2599 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
2600 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
2601 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2,
2602 				      -(__s32)offsetof(struct bpf_perf_event_data,
2603 						       sample_period) - 8),
2604 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0),
2605 			BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
2606 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2607 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0),
2608 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1,
2609 				    offsetof(struct bpf_perf_event_data,
2610 					     sample_period)),
2611 			BPF_MOV64_IMM(BPF_REG_0, 0),
2612 			BPF_EXIT_INSN(),
2613 		},
2614 		.result = REJECT,
2615 		.errstr = "same insn cannot be used with different pointers",
2616 		.prog_type = BPF_PROG_TYPE_PERF_EVENT,
2617 	},
2618 	{
2619 		"unpriv: write pointer into map elem value",
2620 		.insns = {
2621 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
2622 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
2623 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
2624 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2625 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2626 				     BPF_FUNC_map_lookup_elem),
2627 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
2628 			BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
2629 			BPF_EXIT_INSN(),
2630 		},
2631 		.fixup_map1 = { 3 },
2632 		.errstr_unpriv = "R0 leaks addr",
2633 		.result_unpriv = REJECT,
2634 		.result = ACCEPT,
2635 	},
2636 	{
2637 		"unpriv: partial copy of pointer",
2638 		.insns = {
2639 			BPF_MOV32_REG(BPF_REG_1, BPF_REG_10),
2640 			BPF_MOV64_IMM(BPF_REG_0, 0),
2641 			BPF_EXIT_INSN(),
2642 		},
2643 		.errstr_unpriv = "R10 partial copy",
2644 		.result_unpriv = REJECT,
2645 		.result = ACCEPT,
2646 	},
2647 	{
2648 		"unpriv: pass pointer to tail_call",
2649 		.insns = {
2650 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_1),
2651 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2652 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2653 				     BPF_FUNC_tail_call),
2654 			BPF_MOV64_IMM(BPF_REG_0, 0),
2655 			BPF_EXIT_INSN(),
2656 		},
2657 		.fixup_prog = { 1 },
2658 		.errstr_unpriv = "R3 leaks addr into helper",
2659 		.result_unpriv = REJECT,
2660 		.result = ACCEPT,
2661 	},
2662 	{
2663 		"unpriv: cmp map pointer with zero",
2664 		.insns = {
2665 			BPF_MOV64_IMM(BPF_REG_1, 0),
2666 			BPF_LD_MAP_FD(BPF_REG_1, 0),
2667 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
2668 			BPF_MOV64_IMM(BPF_REG_0, 0),
2669 			BPF_EXIT_INSN(),
2670 		},
2671 		.fixup_map1 = { 1 },
2672 		.errstr_unpriv = "R1 pointer comparison",
2673 		.result_unpriv = REJECT,
2674 		.result = ACCEPT,
2675 	},
2676 	{
2677 		"unpriv: write into frame pointer",
2678 		.insns = {
2679 			BPF_MOV64_REG(BPF_REG_10, BPF_REG_1),
2680 			BPF_MOV64_IMM(BPF_REG_0, 0),
2681 			BPF_EXIT_INSN(),
2682 		},
2683 		.errstr = "frame pointer is read only",
2684 		.result = REJECT,
2685 	},
2686 	{
2687 		"unpriv: spill/fill frame pointer",
2688 		.insns = {
2689 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2690 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2691 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0),
2692 			BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0),
2693 			BPF_MOV64_IMM(BPF_REG_0, 0),
2694 			BPF_EXIT_INSN(),
2695 		},
2696 		.errstr = "frame pointer is read only",
2697 		.result = REJECT,
2698 	},
2699 	{
2700 		"unpriv: cmp of frame pointer",
2701 		.insns = {
2702 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0),
2703 			BPF_MOV64_IMM(BPF_REG_0, 0),
2704 			BPF_EXIT_INSN(),
2705 		},
2706 		.errstr_unpriv = "R10 pointer comparison",
2707 		.result_unpriv = REJECT,
2708 		.result = ACCEPT,
2709 	},
2710 	{
2711 		"unpriv: adding of fp",
2712 		.insns = {
2713 			BPF_MOV64_IMM(BPF_REG_0, 0),
2714 			BPF_MOV64_IMM(BPF_REG_1, 0),
2715 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10),
2716 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
2717 			BPF_EXIT_INSN(),
2718 		},
2719 		.result = ACCEPT,
2720 	},
2721 	{
2722 		"unpriv: cmp of stack pointer",
2723 		.insns = {
2724 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
2725 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
2726 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0),
2727 			BPF_MOV64_IMM(BPF_REG_0, 0),
2728 			BPF_EXIT_INSN(),
2729 		},
2730 		.errstr_unpriv = "R2 pointer comparison",
2731 		.result_unpriv = REJECT,
2732 		.result = ACCEPT,
2733 	},
2734 	{
2735 		"runtime/jit: tail_call within bounds, prog once",
2736 		.insns = {
2737 			BPF_MOV64_IMM(BPF_REG_3, 0),
2738 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2739 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2740 				     BPF_FUNC_tail_call),
2741 			BPF_MOV64_IMM(BPF_REG_0, 1),
2742 			BPF_EXIT_INSN(),
2743 		},
2744 		.fixup_prog = { 1 },
2745 		.result = ACCEPT,
2746 		.retval = 42,
2747 	},
2748 	{
2749 		"runtime/jit: tail_call within bounds, prog loop",
2750 		.insns = {
2751 			BPF_MOV64_IMM(BPF_REG_3, 1),
2752 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2753 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2754 				     BPF_FUNC_tail_call),
2755 			BPF_MOV64_IMM(BPF_REG_0, 1),
2756 			BPF_EXIT_INSN(),
2757 		},
2758 		.fixup_prog = { 1 },
2759 		.result = ACCEPT,
2760 		.retval = 41,
2761 	},
2762 	{
2763 		"runtime/jit: tail_call within bounds, no prog",
2764 		.insns = {
2765 			BPF_MOV64_IMM(BPF_REG_3, 2),
2766 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2767 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2768 				     BPF_FUNC_tail_call),
2769 			BPF_MOV64_IMM(BPF_REG_0, 1),
2770 			BPF_EXIT_INSN(),
2771 		},
2772 		.fixup_prog = { 1 },
2773 		.result = ACCEPT,
2774 		.retval = 1,
2775 	},
2776 	{
2777 		"runtime/jit: tail_call out of bounds",
2778 		.insns = {
2779 			BPF_MOV64_IMM(BPF_REG_3, 256),
2780 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2781 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2782 				     BPF_FUNC_tail_call),
2783 			BPF_MOV64_IMM(BPF_REG_0, 2),
2784 			BPF_EXIT_INSN(),
2785 		},
2786 		.fixup_prog = { 1 },
2787 		.result = ACCEPT,
2788 		.retval = 2,
2789 	},
2790 	{
2791 		"runtime/jit: pass negative index to tail_call",
2792 		.insns = {
2793 			BPF_MOV64_IMM(BPF_REG_3, -1),
2794 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2795 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2796 				     BPF_FUNC_tail_call),
2797 			BPF_MOV64_IMM(BPF_REG_0, 2),
2798 			BPF_EXIT_INSN(),
2799 		},
2800 		.fixup_prog = { 1 },
2801 		.result = ACCEPT,
2802 		.retval = 2,
2803 	},
2804 	{
2805 		"runtime/jit: pass > 32bit index to tail_call",
2806 		.insns = {
2807 			BPF_LD_IMM64(BPF_REG_3, 0x100000000ULL),
2808 			BPF_LD_MAP_FD(BPF_REG_2, 0),
2809 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2810 				     BPF_FUNC_tail_call),
2811 			BPF_MOV64_IMM(BPF_REG_0, 2),
2812 			BPF_EXIT_INSN(),
2813 		},
2814 		.fixup_prog = { 2 },
2815 		.result = ACCEPT,
2816 		.retval = 42,
2817 	},
2818 	{
2819 		"stack pointer arithmetic",
2820 		.insns = {
2821 			BPF_MOV64_IMM(BPF_REG_1, 4),
2822 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
2823 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
2824 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10),
2825 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10),
2826 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
2827 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1),
2828 			BPF_ST_MEM(0, BPF_REG_2, 4, 0),
2829 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
2830 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
2831 			BPF_ST_MEM(0, BPF_REG_2, 4, 0),
2832 			BPF_MOV64_IMM(BPF_REG_0, 0),
2833 			BPF_EXIT_INSN(),
2834 		},
2835 		.result = ACCEPT,
2836 	},
2837 	{
2838 		"raw_stack: no skb_load_bytes",
2839 		.insns = {
2840 			BPF_MOV64_IMM(BPF_REG_2, 4),
2841 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2842 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2843 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2844 			BPF_MOV64_IMM(BPF_REG_4, 8),
2845 			/* Call to skb_load_bytes() omitted. */
2846 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2847 			BPF_EXIT_INSN(),
2848 		},
2849 		.result = REJECT,
2850 		.errstr = "invalid read from stack off -8+0 size 8",
2851 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2852 	},
2853 	{
2854 		"raw_stack: skb_load_bytes, negative len",
2855 		.insns = {
2856 			BPF_MOV64_IMM(BPF_REG_2, 4),
2857 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2858 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2859 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2860 			BPF_MOV64_IMM(BPF_REG_4, -8),
2861 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2862 				     BPF_FUNC_skb_load_bytes),
2863 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2864 			BPF_EXIT_INSN(),
2865 		},
2866 		.result = REJECT,
2867 		.errstr = "R4 min value is negative",
2868 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2869 	},
2870 	{
2871 		"raw_stack: skb_load_bytes, negative len 2",
2872 		.insns = {
2873 			BPF_MOV64_IMM(BPF_REG_2, 4),
2874 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2875 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2876 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2877 			BPF_MOV64_IMM(BPF_REG_4, ~0),
2878 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2879 				     BPF_FUNC_skb_load_bytes),
2880 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2881 			BPF_EXIT_INSN(),
2882 		},
2883 		.result = REJECT,
2884 		.errstr = "R4 min value is negative",
2885 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2886 	},
2887 	{
2888 		"raw_stack: skb_load_bytes, zero len",
2889 		.insns = {
2890 			BPF_MOV64_IMM(BPF_REG_2, 4),
2891 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2892 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2893 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2894 			BPF_MOV64_IMM(BPF_REG_4, 0),
2895 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2896 				     BPF_FUNC_skb_load_bytes),
2897 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2898 			BPF_EXIT_INSN(),
2899 		},
2900 		.result = REJECT,
2901 		.errstr = "invalid stack type R3",
2902 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2903 	},
2904 	{
2905 		"raw_stack: skb_load_bytes, no init",
2906 		.insns = {
2907 			BPF_MOV64_IMM(BPF_REG_2, 4),
2908 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2909 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2910 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2911 			BPF_MOV64_IMM(BPF_REG_4, 8),
2912 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2913 				     BPF_FUNC_skb_load_bytes),
2914 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2915 			BPF_EXIT_INSN(),
2916 		},
2917 		.result = ACCEPT,
2918 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2919 	},
2920 	{
2921 		"raw_stack: skb_load_bytes, init",
2922 		.insns = {
2923 			BPF_MOV64_IMM(BPF_REG_2, 4),
2924 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2925 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2926 			BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe),
2927 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2928 			BPF_MOV64_IMM(BPF_REG_4, 8),
2929 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2930 				     BPF_FUNC_skb_load_bytes),
2931 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2932 			BPF_EXIT_INSN(),
2933 		},
2934 		.result = ACCEPT,
2935 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2936 	},
2937 	{
2938 		"raw_stack: skb_load_bytes, spilled regs around bounds",
2939 		.insns = {
2940 			BPF_MOV64_IMM(BPF_REG_2, 4),
2941 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2942 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16),
2943 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8),
2944 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  8),
2945 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2946 			BPF_MOV64_IMM(BPF_REG_4, 8),
2947 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2948 				     BPF_FUNC_skb_load_bytes),
2949 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8),
2950 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6,  8),
2951 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2952 				    offsetof(struct __sk_buff, mark)),
2953 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2,
2954 				    offsetof(struct __sk_buff, priority)),
2955 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
2956 			BPF_EXIT_INSN(),
2957 		},
2958 		.result = ACCEPT,
2959 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2960 	},
2961 	{
2962 		"raw_stack: skb_load_bytes, spilled regs corruption",
2963 		.insns = {
2964 			BPF_MOV64_IMM(BPF_REG_2, 4),
2965 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2966 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8),
2967 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
2968 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2969 			BPF_MOV64_IMM(BPF_REG_4, 8),
2970 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2971 				     BPF_FUNC_skb_load_bytes),
2972 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
2973 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2974 				    offsetof(struct __sk_buff, mark)),
2975 			BPF_EXIT_INSN(),
2976 		},
2977 		.result = REJECT,
2978 		.errstr = "R0 invalid mem access 'inv'",
2979 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2980 	},
2981 	{
2982 		"raw_stack: skb_load_bytes, spilled regs corruption 2",
2983 		.insns = {
2984 			BPF_MOV64_IMM(BPF_REG_2, 4),
2985 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
2986 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16),
2987 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8),
2988 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  0),
2989 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  8),
2990 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
2991 			BPF_MOV64_IMM(BPF_REG_4, 8),
2992 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2993 				     BPF_FUNC_skb_load_bytes),
2994 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8),
2995 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6,  8),
2996 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6,  0),
2997 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
2998 				    offsetof(struct __sk_buff, mark)),
2999 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2,
3000 				    offsetof(struct __sk_buff, priority)),
3001 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
3002 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3,
3003 				    offsetof(struct __sk_buff, pkt_type)),
3004 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
3005 			BPF_EXIT_INSN(),
3006 		},
3007 		.result = REJECT,
3008 		.errstr = "R3 invalid mem access 'inv'",
3009 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3010 	},
3011 	{
3012 		"raw_stack: skb_load_bytes, spilled regs + data",
3013 		.insns = {
3014 			BPF_MOV64_IMM(BPF_REG_2, 4),
3015 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3016 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16),
3017 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8),
3018 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  0),
3019 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1,  8),
3020 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3021 			BPF_MOV64_IMM(BPF_REG_4, 8),
3022 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3023 				     BPF_FUNC_skb_load_bytes),
3024 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8),
3025 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6,  8),
3026 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6,  0),
3027 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
3028 				    offsetof(struct __sk_buff, mark)),
3029 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2,
3030 				    offsetof(struct __sk_buff, priority)),
3031 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
3032 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
3033 			BPF_EXIT_INSN(),
3034 		},
3035 		.result = ACCEPT,
3036 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3037 	},
3038 	{
3039 		"raw_stack: skb_load_bytes, invalid access 1",
3040 		.insns = {
3041 			BPF_MOV64_IMM(BPF_REG_2, 4),
3042 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3043 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513),
3044 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3045 			BPF_MOV64_IMM(BPF_REG_4, 8),
3046 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3047 				     BPF_FUNC_skb_load_bytes),
3048 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3049 			BPF_EXIT_INSN(),
3050 		},
3051 		.result = REJECT,
3052 		.errstr = "invalid stack type R3 off=-513 access_size=8",
3053 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3054 	},
3055 	{
3056 		"raw_stack: skb_load_bytes, invalid access 2",
3057 		.insns = {
3058 			BPF_MOV64_IMM(BPF_REG_2, 4),
3059 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3060 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1),
3061 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3062 			BPF_MOV64_IMM(BPF_REG_4, 8),
3063 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3064 				     BPF_FUNC_skb_load_bytes),
3065 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3066 			BPF_EXIT_INSN(),
3067 		},
3068 		.result = REJECT,
3069 		.errstr = "invalid stack type R3 off=-1 access_size=8",
3070 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3071 	},
3072 	{
3073 		"raw_stack: skb_load_bytes, invalid access 3",
3074 		.insns = {
3075 			BPF_MOV64_IMM(BPF_REG_2, 4),
3076 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3077 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff),
3078 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3079 			BPF_MOV64_IMM(BPF_REG_4, 0xffffffff),
3080 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3081 				     BPF_FUNC_skb_load_bytes),
3082 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3083 			BPF_EXIT_INSN(),
3084 		},
3085 		.result = REJECT,
3086 		.errstr = "R4 min value is negative",
3087 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3088 	},
3089 	{
3090 		"raw_stack: skb_load_bytes, invalid access 4",
3091 		.insns = {
3092 			BPF_MOV64_IMM(BPF_REG_2, 4),
3093 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3094 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1),
3095 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3096 			BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff),
3097 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3098 				     BPF_FUNC_skb_load_bytes),
3099 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3100 			BPF_EXIT_INSN(),
3101 		},
3102 		.result = REJECT,
3103 		.errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'",
3104 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3105 	},
3106 	{
3107 		"raw_stack: skb_load_bytes, invalid access 5",
3108 		.insns = {
3109 			BPF_MOV64_IMM(BPF_REG_2, 4),
3110 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3111 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512),
3112 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3113 			BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff),
3114 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3115 				     BPF_FUNC_skb_load_bytes),
3116 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3117 			BPF_EXIT_INSN(),
3118 		},
3119 		.result = REJECT,
3120 		.errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'",
3121 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3122 	},
3123 	{
3124 		"raw_stack: skb_load_bytes, invalid access 6",
3125 		.insns = {
3126 			BPF_MOV64_IMM(BPF_REG_2, 4),
3127 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3128 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512),
3129 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3130 			BPF_MOV64_IMM(BPF_REG_4, 0),
3131 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3132 				     BPF_FUNC_skb_load_bytes),
3133 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3134 			BPF_EXIT_INSN(),
3135 		},
3136 		.result = REJECT,
3137 		.errstr = "invalid stack type R3 off=-512 access_size=0",
3138 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3139 	},
3140 	{
3141 		"raw_stack: skb_load_bytes, large access",
3142 		.insns = {
3143 			BPF_MOV64_IMM(BPF_REG_2, 4),
3144 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10),
3145 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512),
3146 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
3147 			BPF_MOV64_IMM(BPF_REG_4, 512),
3148 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3149 				     BPF_FUNC_skb_load_bytes),
3150 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3151 			BPF_EXIT_INSN(),
3152 		},
3153 		.result = ACCEPT,
3154 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3155 	},
3156 	{
3157 		"context stores via ST",
3158 		.insns = {
3159 			BPF_MOV64_IMM(BPF_REG_0, 0),
3160 			BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0),
3161 			BPF_EXIT_INSN(),
3162 		},
3163 		.errstr = "BPF_ST stores into R1 context is not allowed",
3164 		.result = REJECT,
3165 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3166 	},
3167 	{
3168 		"context stores via XADD",
3169 		.insns = {
3170 			BPF_MOV64_IMM(BPF_REG_0, 0),
3171 			BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_W, BPF_REG_1,
3172 				     BPF_REG_0, offsetof(struct __sk_buff, mark), 0),
3173 			BPF_EXIT_INSN(),
3174 		},
3175 		.errstr = "BPF_XADD stores into R1 context is not allowed",
3176 		.result = REJECT,
3177 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3178 	},
3179 	{
3180 		"direct packet access: test1",
3181 		.insns = {
3182 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3183 				    offsetof(struct __sk_buff, data)),
3184 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3185 				    offsetof(struct __sk_buff, data_end)),
3186 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3187 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3188 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3189 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3190 			BPF_MOV64_IMM(BPF_REG_0, 0),
3191 			BPF_EXIT_INSN(),
3192 		},
3193 		.result = ACCEPT,
3194 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3195 	},
3196 	{
3197 		"direct packet access: test2",
3198 		.insns = {
3199 			BPF_MOV64_IMM(BPF_REG_0, 1),
3200 			BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
3201 				    offsetof(struct __sk_buff, data_end)),
3202 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3203 				    offsetof(struct __sk_buff, data)),
3204 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
3205 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14),
3206 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15),
3207 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7),
3208 			BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12),
3209 			BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14),
3210 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3211 				    offsetof(struct __sk_buff, data)),
3212 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4),
3213 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3214 				    offsetof(struct __sk_buff, len)),
3215 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49),
3216 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49),
3217 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
3218 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_3),
3219 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
3220 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
3221 				    offsetof(struct __sk_buff, data_end)),
3222 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
3223 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4),
3224 			BPF_MOV64_IMM(BPF_REG_0, 0),
3225 			BPF_EXIT_INSN(),
3226 		},
3227 		.result = ACCEPT,
3228 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3229 	},
3230 	{
3231 		"direct packet access: test3",
3232 		.insns = {
3233 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3234 				    offsetof(struct __sk_buff, data)),
3235 			BPF_MOV64_IMM(BPF_REG_0, 0),
3236 			BPF_EXIT_INSN(),
3237 		},
3238 		.errstr = "invalid bpf_context access off=76",
3239 		.result = REJECT,
3240 		.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
3241 	},
3242 	{
3243 		"direct packet access: test4 (write)",
3244 		.insns = {
3245 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3246 				    offsetof(struct __sk_buff, data)),
3247 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3248 				    offsetof(struct __sk_buff, data_end)),
3249 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3250 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3251 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3252 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3253 			BPF_MOV64_IMM(BPF_REG_0, 0),
3254 			BPF_EXIT_INSN(),
3255 		},
3256 		.result = ACCEPT,
3257 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3258 	},
3259 	{
3260 		"direct packet access: test5 (pkt_end >= reg, good access)",
3261 		.insns = {
3262 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3263 				    offsetof(struct __sk_buff, data)),
3264 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3265 				    offsetof(struct __sk_buff, data_end)),
3266 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3267 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3268 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2),
3269 			BPF_MOV64_IMM(BPF_REG_0, 1),
3270 			BPF_EXIT_INSN(),
3271 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3272 			BPF_MOV64_IMM(BPF_REG_0, 0),
3273 			BPF_EXIT_INSN(),
3274 		},
3275 		.result = ACCEPT,
3276 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3277 	},
3278 	{
3279 		"direct packet access: test6 (pkt_end >= reg, bad access)",
3280 		.insns = {
3281 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3282 				    offsetof(struct __sk_buff, data)),
3283 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3284 				    offsetof(struct __sk_buff, data_end)),
3285 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3286 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3287 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3),
3288 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3289 			BPF_MOV64_IMM(BPF_REG_0, 1),
3290 			BPF_EXIT_INSN(),
3291 			BPF_MOV64_IMM(BPF_REG_0, 0),
3292 			BPF_EXIT_INSN(),
3293 		},
3294 		.errstr = "invalid access to packet",
3295 		.result = REJECT,
3296 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3297 	},
3298 	{
3299 		"direct packet access: test7 (pkt_end >= reg, both accesses)",
3300 		.insns = {
3301 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3302 				    offsetof(struct __sk_buff, data)),
3303 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3304 				    offsetof(struct __sk_buff, data_end)),
3305 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3306 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3307 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3),
3308 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3309 			BPF_MOV64_IMM(BPF_REG_0, 1),
3310 			BPF_EXIT_INSN(),
3311 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3312 			BPF_MOV64_IMM(BPF_REG_0, 0),
3313 			BPF_EXIT_INSN(),
3314 		},
3315 		.errstr = "invalid access to packet",
3316 		.result = REJECT,
3317 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3318 	},
3319 	{
3320 		"direct packet access: test8 (double test, variant 1)",
3321 		.insns = {
3322 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3323 				    offsetof(struct __sk_buff, data)),
3324 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3325 				    offsetof(struct __sk_buff, data_end)),
3326 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3327 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3328 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4),
3329 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3330 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3331 			BPF_MOV64_IMM(BPF_REG_0, 1),
3332 			BPF_EXIT_INSN(),
3333 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3334 			BPF_MOV64_IMM(BPF_REG_0, 0),
3335 			BPF_EXIT_INSN(),
3336 		},
3337 		.result = ACCEPT,
3338 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3339 	},
3340 	{
3341 		"direct packet access: test9 (double test, variant 2)",
3342 		.insns = {
3343 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3344 				    offsetof(struct __sk_buff, data)),
3345 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3346 				    offsetof(struct __sk_buff, data_end)),
3347 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3348 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3349 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2),
3350 			BPF_MOV64_IMM(BPF_REG_0, 1),
3351 			BPF_EXIT_INSN(),
3352 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3353 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3354 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3355 			BPF_MOV64_IMM(BPF_REG_0, 0),
3356 			BPF_EXIT_INSN(),
3357 		},
3358 		.result = ACCEPT,
3359 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3360 	},
3361 	{
3362 		"direct packet access: test10 (write invalid)",
3363 		.insns = {
3364 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3365 				    offsetof(struct __sk_buff, data)),
3366 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3367 				    offsetof(struct __sk_buff, data_end)),
3368 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3369 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3370 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
3371 			BPF_MOV64_IMM(BPF_REG_0, 0),
3372 			BPF_EXIT_INSN(),
3373 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3374 			BPF_MOV64_IMM(BPF_REG_0, 0),
3375 			BPF_EXIT_INSN(),
3376 		},
3377 		.errstr = "invalid access to packet",
3378 		.result = REJECT,
3379 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3380 	},
3381 	{
3382 		"direct packet access: test11 (shift, good access)",
3383 		.insns = {
3384 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3385 				    offsetof(struct __sk_buff, data)),
3386 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3387 				    offsetof(struct __sk_buff, data_end)),
3388 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3389 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
3390 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
3391 			BPF_MOV64_IMM(BPF_REG_3, 144),
3392 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
3393 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
3394 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3),
3395 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
3396 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
3397 			BPF_MOV64_IMM(BPF_REG_0, 1),
3398 			BPF_EXIT_INSN(),
3399 			BPF_MOV64_IMM(BPF_REG_0, 0),
3400 			BPF_EXIT_INSN(),
3401 		},
3402 		.result = ACCEPT,
3403 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3404 		.retval = 1,
3405 	},
3406 	{
3407 		"direct packet access: test12 (and, good access)",
3408 		.insns = {
3409 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3410 				    offsetof(struct __sk_buff, data)),
3411 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3412 				    offsetof(struct __sk_buff, data_end)),
3413 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3414 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
3415 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
3416 			BPF_MOV64_IMM(BPF_REG_3, 144),
3417 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
3418 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
3419 			BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15),
3420 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
3421 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
3422 			BPF_MOV64_IMM(BPF_REG_0, 1),
3423 			BPF_EXIT_INSN(),
3424 			BPF_MOV64_IMM(BPF_REG_0, 0),
3425 			BPF_EXIT_INSN(),
3426 		},
3427 		.result = ACCEPT,
3428 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3429 		.retval = 1,
3430 	},
3431 	{
3432 		"direct packet access: test13 (branches, good access)",
3433 		.insns = {
3434 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3435 				    offsetof(struct __sk_buff, data)),
3436 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3437 				    offsetof(struct __sk_buff, data_end)),
3438 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3439 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
3440 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13),
3441 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3442 				    offsetof(struct __sk_buff, mark)),
3443 			BPF_MOV64_IMM(BPF_REG_4, 1),
3444 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2),
3445 			BPF_MOV64_IMM(BPF_REG_3, 14),
3446 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
3447 			BPF_MOV64_IMM(BPF_REG_3, 24),
3448 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
3449 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
3450 			BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15),
3451 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
3452 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
3453 			BPF_MOV64_IMM(BPF_REG_0, 1),
3454 			BPF_EXIT_INSN(),
3455 			BPF_MOV64_IMM(BPF_REG_0, 0),
3456 			BPF_EXIT_INSN(),
3457 		},
3458 		.result = ACCEPT,
3459 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3460 		.retval = 1,
3461 	},
3462 	{
3463 		"direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)",
3464 		.insns = {
3465 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3466 				    offsetof(struct __sk_buff, data)),
3467 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3468 				    offsetof(struct __sk_buff, data_end)),
3469 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3470 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
3471 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7),
3472 			BPF_MOV64_IMM(BPF_REG_5, 12),
3473 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4),
3474 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
3475 			BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
3476 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
3477 			BPF_MOV64_IMM(BPF_REG_0, 1),
3478 			BPF_EXIT_INSN(),
3479 			BPF_MOV64_IMM(BPF_REG_0, 0),
3480 			BPF_EXIT_INSN(),
3481 		},
3482 		.result = ACCEPT,
3483 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3484 		.retval = 1,
3485 	},
3486 	{
3487 		"direct packet access: test15 (spill with xadd)",
3488 		.insns = {
3489 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3490 				    offsetof(struct __sk_buff, data)),
3491 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3492 				    offsetof(struct __sk_buff, data_end)),
3493 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3494 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3495 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
3496 			BPF_MOV64_IMM(BPF_REG_5, 4096),
3497 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
3498 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
3499 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
3500 			BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0),
3501 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
3502 			BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0),
3503 			BPF_MOV64_IMM(BPF_REG_0, 0),
3504 			BPF_EXIT_INSN(),
3505 		},
3506 		.errstr = "R2 invalid mem access 'inv'",
3507 		.result = REJECT,
3508 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3509 	},
3510 	{
3511 		"direct packet access: test16 (arith on data_end)",
3512 		.insns = {
3513 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3514 				    offsetof(struct __sk_buff, data)),
3515 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3516 				    offsetof(struct __sk_buff, data_end)),
3517 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3518 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3519 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16),
3520 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3521 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3522 			BPF_MOV64_IMM(BPF_REG_0, 0),
3523 			BPF_EXIT_INSN(),
3524 		},
3525 		.errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END",
3526 		.result = REJECT,
3527 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3528 	},
3529 	{
3530 		"direct packet access: test17 (pruning, alignment)",
3531 		.insns = {
3532 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3533 				    offsetof(struct __sk_buff, data)),
3534 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3535 				    offsetof(struct __sk_buff, data_end)),
3536 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
3537 				    offsetof(struct __sk_buff, mark)),
3538 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3539 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 14),
3540 			BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 1, 4),
3541 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3542 			BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, -4),
3543 			BPF_MOV64_IMM(BPF_REG_0, 0),
3544 			BPF_EXIT_INSN(),
3545 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
3546 			BPF_JMP_A(-6),
3547 		},
3548 		.errstr = "misaligned packet access off 2+(0x0; 0x0)+15+-4 size 4",
3549 		.result = REJECT,
3550 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3551 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
3552 	},
3553 	{
3554 		"direct packet access: test18 (imm += pkt_ptr, 1)",
3555 		.insns = {
3556 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3557 				    offsetof(struct __sk_buff, data)),
3558 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3559 				    offsetof(struct __sk_buff, data_end)),
3560 			BPF_MOV64_IMM(BPF_REG_0, 8),
3561 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
3562 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3563 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
3564 			BPF_MOV64_IMM(BPF_REG_0, 0),
3565 			BPF_EXIT_INSN(),
3566 		},
3567 		.result = ACCEPT,
3568 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3569 	},
3570 	{
3571 		"direct packet access: test19 (imm += pkt_ptr, 2)",
3572 		.insns = {
3573 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3574 				    offsetof(struct __sk_buff, data)),
3575 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3576 				    offsetof(struct __sk_buff, data_end)),
3577 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3578 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3579 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
3580 			BPF_MOV64_IMM(BPF_REG_4, 4),
3581 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
3582 			BPF_STX_MEM(BPF_B, BPF_REG_4, BPF_REG_4, 0),
3583 			BPF_MOV64_IMM(BPF_REG_0, 0),
3584 			BPF_EXIT_INSN(),
3585 		},
3586 		.result = ACCEPT,
3587 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3588 	},
3589 	{
3590 		"direct packet access: test20 (x += pkt_ptr, 1)",
3591 		.insns = {
3592 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3593 				    offsetof(struct __sk_buff, data)),
3594 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3595 				    offsetof(struct __sk_buff, data_end)),
3596 			BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
3597 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
3598 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
3599 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0x7fff),
3600 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3601 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
3602 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
3603 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1),
3604 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
3605 			BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0),
3606 			BPF_MOV64_IMM(BPF_REG_0, 0),
3607 			BPF_EXIT_INSN(),
3608 		},
3609 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3610 		.result = ACCEPT,
3611 	},
3612 	{
3613 		"direct packet access: test21 (x += pkt_ptr, 2)",
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, 9),
3622 			BPF_MOV64_IMM(BPF_REG_4, 0xffffffff),
3623 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -8),
3624 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
3625 			BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 0x7fff),
3626 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
3627 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
3628 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1),
3629 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
3630 			BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0),
3631 			BPF_MOV64_IMM(BPF_REG_0, 0),
3632 			BPF_EXIT_INSN(),
3633 		},
3634 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3635 		.result = ACCEPT,
3636 	},
3637 	{
3638 		"direct packet access: test22 (x += pkt_ptr, 3)",
3639 		.insns = {
3640 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3641 				    offsetof(struct __sk_buff, data)),
3642 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3643 				    offsetof(struct __sk_buff, data_end)),
3644 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3645 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3646 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
3647 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_3, -16),
3648 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -16),
3649 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 11),
3650 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8),
3651 			BPF_MOV64_IMM(BPF_REG_4, 0xffffffff),
3652 			BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_4, -8),
3653 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
3654 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_4, 49),
3655 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
3656 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
3657 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
3658 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
3659 			BPF_MOV64_IMM(BPF_REG_2, 1),
3660 			BPF_STX_MEM(BPF_H, BPF_REG_4, BPF_REG_2, 0),
3661 			BPF_MOV64_IMM(BPF_REG_0, 0),
3662 			BPF_EXIT_INSN(),
3663 		},
3664 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3665 		.result = ACCEPT,
3666 	},
3667 	{
3668 		"direct packet access: test23 (x += pkt_ptr, 4)",
3669 		.insns = {
3670 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3671 				    offsetof(struct __sk_buff, data)),
3672 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3673 				    offsetof(struct __sk_buff, data_end)),
3674 			BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
3675 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
3676 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
3677 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff),
3678 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3679 			BPF_MOV64_IMM(BPF_REG_0, 31),
3680 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4),
3681 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
3682 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_0),
3683 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0xffff - 1),
3684 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3685 			BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0),
3686 			BPF_MOV64_IMM(BPF_REG_0, 0),
3687 			BPF_EXIT_INSN(),
3688 		},
3689 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3690 		.result = REJECT,
3691 		.errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)",
3692 	},
3693 	{
3694 		"direct packet access: test24 (x += pkt_ptr, 5)",
3695 		.insns = {
3696 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3697 				    offsetof(struct __sk_buff, data)),
3698 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3699 				    offsetof(struct __sk_buff, data_end)),
3700 			BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
3701 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
3702 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
3703 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xff),
3704 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
3705 			BPF_MOV64_IMM(BPF_REG_0, 64),
3706 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4),
3707 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
3708 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_0),
3709 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7fff - 1),
3710 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
3711 			BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0),
3712 			BPF_MOV64_IMM(BPF_REG_0, 0),
3713 			BPF_EXIT_INSN(),
3714 		},
3715 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3716 		.result = ACCEPT,
3717 	},
3718 	{
3719 		"direct packet access: test25 (marking on <, good access)",
3720 		.insns = {
3721 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3722 				    offsetof(struct __sk_buff, data)),
3723 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3724 				    offsetof(struct __sk_buff, data_end)),
3725 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3726 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3727 			BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 2),
3728 			BPF_MOV64_IMM(BPF_REG_0, 0),
3729 			BPF_EXIT_INSN(),
3730 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3731 			BPF_JMP_IMM(BPF_JA, 0, 0, -4),
3732 		},
3733 		.result = ACCEPT,
3734 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3735 	},
3736 	{
3737 		"direct packet access: test26 (marking on <, bad access)",
3738 		.insns = {
3739 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3740 				    offsetof(struct __sk_buff, data)),
3741 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3742 				    offsetof(struct __sk_buff, data_end)),
3743 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3744 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3745 			BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 3),
3746 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3747 			BPF_MOV64_IMM(BPF_REG_0, 0),
3748 			BPF_EXIT_INSN(),
3749 			BPF_JMP_IMM(BPF_JA, 0, 0, -3),
3750 		},
3751 		.result = REJECT,
3752 		.errstr = "invalid access to packet",
3753 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3754 	},
3755 	{
3756 		"direct packet access: test27 (marking on <=, good access)",
3757 		.insns = {
3758 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3759 				    offsetof(struct __sk_buff, data)),
3760 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3761 				    offsetof(struct __sk_buff, data_end)),
3762 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3763 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3764 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 1),
3765 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3766 			BPF_MOV64_IMM(BPF_REG_0, 1),
3767 			BPF_EXIT_INSN(),
3768 		},
3769 		.result = ACCEPT,
3770 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3771 		.retval = 1,
3772 	},
3773 	{
3774 		"direct packet access: test28 (marking on <=, bad access)",
3775 		.insns = {
3776 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3777 				    offsetof(struct __sk_buff, data)),
3778 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3779 				    offsetof(struct __sk_buff, data_end)),
3780 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3781 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
3782 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 2),
3783 			BPF_MOV64_IMM(BPF_REG_0, 1),
3784 			BPF_EXIT_INSN(),
3785 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
3786 			BPF_JMP_IMM(BPF_JA, 0, 0, -4),
3787 		},
3788 		.result = REJECT,
3789 		.errstr = "invalid access to packet",
3790 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3791 	},
3792 	{
3793 		"helper access to packet: test1, valid packet_ptr range",
3794 		.insns = {
3795 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3796 				    offsetof(struct xdp_md, data)),
3797 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3798 				    offsetof(struct xdp_md, data_end)),
3799 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
3800 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
3801 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5),
3802 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3803 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
3804 			BPF_MOV64_IMM(BPF_REG_4, 0),
3805 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3806 				     BPF_FUNC_map_update_elem),
3807 			BPF_MOV64_IMM(BPF_REG_0, 0),
3808 			BPF_EXIT_INSN(),
3809 		},
3810 		.fixup_map1 = { 5 },
3811 		.result_unpriv = ACCEPT,
3812 		.result = ACCEPT,
3813 		.prog_type = BPF_PROG_TYPE_XDP,
3814 	},
3815 	{
3816 		"helper access to packet: test2, unchecked packet_ptr",
3817 		.insns = {
3818 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3819 				    offsetof(struct xdp_md, data)),
3820 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3821 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3822 				     BPF_FUNC_map_lookup_elem),
3823 			BPF_MOV64_IMM(BPF_REG_0, 0),
3824 			BPF_EXIT_INSN(),
3825 		},
3826 		.fixup_map1 = { 1 },
3827 		.result = REJECT,
3828 		.errstr = "invalid access to packet",
3829 		.prog_type = BPF_PROG_TYPE_XDP,
3830 	},
3831 	{
3832 		"helper access to packet: test3, variable add",
3833 		.insns = {
3834 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3835 					offsetof(struct xdp_md, data)),
3836 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3837 					offsetof(struct xdp_md, data_end)),
3838 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3839 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
3840 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10),
3841 			BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0),
3842 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3843 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5),
3844 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
3845 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8),
3846 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4),
3847 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3848 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_4),
3849 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3850 				     BPF_FUNC_map_lookup_elem),
3851 			BPF_MOV64_IMM(BPF_REG_0, 0),
3852 			BPF_EXIT_INSN(),
3853 		},
3854 		.fixup_map1 = { 11 },
3855 		.result = ACCEPT,
3856 		.prog_type = BPF_PROG_TYPE_XDP,
3857 	},
3858 	{
3859 		"helper access to packet: test4, packet_ptr with bad range",
3860 		.insns = {
3861 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3862 				    offsetof(struct xdp_md, data)),
3863 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3864 				    offsetof(struct xdp_md, data_end)),
3865 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3866 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4),
3867 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2),
3868 			BPF_MOV64_IMM(BPF_REG_0, 0),
3869 			BPF_EXIT_INSN(),
3870 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3871 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3872 				     BPF_FUNC_map_lookup_elem),
3873 			BPF_MOV64_IMM(BPF_REG_0, 0),
3874 			BPF_EXIT_INSN(),
3875 		},
3876 		.fixup_map1 = { 7 },
3877 		.result = REJECT,
3878 		.errstr = "invalid access to packet",
3879 		.prog_type = BPF_PROG_TYPE_XDP,
3880 	},
3881 	{
3882 		"helper access to packet: test5, packet_ptr with too short range",
3883 		.insns = {
3884 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3885 				    offsetof(struct xdp_md, data)),
3886 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3887 				    offsetof(struct xdp_md, data_end)),
3888 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
3889 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3890 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7),
3891 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3),
3892 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3893 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3894 				     BPF_FUNC_map_lookup_elem),
3895 			BPF_MOV64_IMM(BPF_REG_0, 0),
3896 			BPF_EXIT_INSN(),
3897 		},
3898 		.fixup_map1 = { 6 },
3899 		.result = REJECT,
3900 		.errstr = "invalid access to packet",
3901 		.prog_type = BPF_PROG_TYPE_XDP,
3902 	},
3903 	{
3904 		"helper access to packet: test6, cls valid packet_ptr range",
3905 		.insns = {
3906 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3907 				    offsetof(struct __sk_buff, data)),
3908 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3909 				    offsetof(struct __sk_buff, data_end)),
3910 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
3911 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
3912 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5),
3913 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3914 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
3915 			BPF_MOV64_IMM(BPF_REG_4, 0),
3916 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3917 				     BPF_FUNC_map_update_elem),
3918 			BPF_MOV64_IMM(BPF_REG_0, 0),
3919 			BPF_EXIT_INSN(),
3920 		},
3921 		.fixup_map1 = { 5 },
3922 		.result = ACCEPT,
3923 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3924 	},
3925 	{
3926 		"helper access to packet: test7, cls unchecked packet_ptr",
3927 		.insns = {
3928 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3929 				    offsetof(struct __sk_buff, data)),
3930 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3931 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3932 				     BPF_FUNC_map_lookup_elem),
3933 			BPF_MOV64_IMM(BPF_REG_0, 0),
3934 			BPF_EXIT_INSN(),
3935 		},
3936 		.fixup_map1 = { 1 },
3937 		.result = REJECT,
3938 		.errstr = "invalid access to packet",
3939 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3940 	},
3941 	{
3942 		"helper access to packet: test8, cls variable add",
3943 		.insns = {
3944 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3945 					offsetof(struct __sk_buff, data)),
3946 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3947 					offsetof(struct __sk_buff, data_end)),
3948 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3949 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
3950 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10),
3951 			BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0),
3952 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3953 			BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5),
3954 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
3955 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8),
3956 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4),
3957 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3958 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_4),
3959 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3960 				     BPF_FUNC_map_lookup_elem),
3961 			BPF_MOV64_IMM(BPF_REG_0, 0),
3962 			BPF_EXIT_INSN(),
3963 		},
3964 		.fixup_map1 = { 11 },
3965 		.result = ACCEPT,
3966 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3967 	},
3968 	{
3969 		"helper access to packet: test9, cls packet_ptr with bad range",
3970 		.insns = {
3971 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3972 				    offsetof(struct __sk_buff, data)),
3973 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3974 				    offsetof(struct __sk_buff, data_end)),
3975 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
3976 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4),
3977 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2),
3978 			BPF_MOV64_IMM(BPF_REG_0, 0),
3979 			BPF_EXIT_INSN(),
3980 			BPF_LD_MAP_FD(BPF_REG_1, 0),
3981 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
3982 				     BPF_FUNC_map_lookup_elem),
3983 			BPF_MOV64_IMM(BPF_REG_0, 0),
3984 			BPF_EXIT_INSN(),
3985 		},
3986 		.fixup_map1 = { 7 },
3987 		.result = REJECT,
3988 		.errstr = "invalid access to packet",
3989 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3990 	},
3991 	{
3992 		"helper access to packet: test10, cls packet_ptr with too short range",
3993 		.insns = {
3994 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
3995 				    offsetof(struct __sk_buff, data)),
3996 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
3997 				    offsetof(struct __sk_buff, data_end)),
3998 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
3999 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
4000 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7),
4001 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3),
4002 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4003 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4004 				     BPF_FUNC_map_lookup_elem),
4005 			BPF_MOV64_IMM(BPF_REG_0, 0),
4006 			BPF_EXIT_INSN(),
4007 		},
4008 		.fixup_map1 = { 6 },
4009 		.result = REJECT,
4010 		.errstr = "invalid access to packet",
4011 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4012 	},
4013 	{
4014 		"helper access to packet: test11, cls unsuitable helper 1",
4015 		.insns = {
4016 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4017 				    offsetof(struct __sk_buff, data)),
4018 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4019 				    offsetof(struct __sk_buff, data_end)),
4020 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4021 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
4022 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 7),
4023 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_7, 4),
4024 			BPF_MOV64_IMM(BPF_REG_2, 0),
4025 			BPF_MOV64_IMM(BPF_REG_4, 42),
4026 			BPF_MOV64_IMM(BPF_REG_5, 0),
4027 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4028 				     BPF_FUNC_skb_store_bytes),
4029 			BPF_MOV64_IMM(BPF_REG_0, 0),
4030 			BPF_EXIT_INSN(),
4031 		},
4032 		.result = REJECT,
4033 		.errstr = "helper access to the packet",
4034 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4035 	},
4036 	{
4037 		"helper access to packet: test12, cls unsuitable helper 2",
4038 		.insns = {
4039 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4040 				    offsetof(struct __sk_buff, data)),
4041 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4042 				    offsetof(struct __sk_buff, data_end)),
4043 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
4044 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8),
4045 			BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 3),
4046 			BPF_MOV64_IMM(BPF_REG_2, 0),
4047 			BPF_MOV64_IMM(BPF_REG_4, 4),
4048 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4049 				     BPF_FUNC_skb_load_bytes),
4050 			BPF_MOV64_IMM(BPF_REG_0, 0),
4051 			BPF_EXIT_INSN(),
4052 		},
4053 		.result = REJECT,
4054 		.errstr = "helper access to the packet",
4055 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4056 	},
4057 	{
4058 		"helper access to packet: test13, cls helper ok",
4059 		.insns = {
4060 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4061 				    offsetof(struct __sk_buff, data)),
4062 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4063 				    offsetof(struct __sk_buff, data_end)),
4064 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4065 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4066 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4067 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4068 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4069 			BPF_MOV64_IMM(BPF_REG_2, 4),
4070 			BPF_MOV64_IMM(BPF_REG_3, 0),
4071 			BPF_MOV64_IMM(BPF_REG_4, 0),
4072 			BPF_MOV64_IMM(BPF_REG_5, 0),
4073 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4074 				     BPF_FUNC_csum_diff),
4075 			BPF_MOV64_IMM(BPF_REG_0, 0),
4076 			BPF_EXIT_INSN(),
4077 		},
4078 		.result = ACCEPT,
4079 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4080 	},
4081 	{
4082 		"helper access to packet: test14, cls helper ok sub",
4083 		.insns = {
4084 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4085 				    offsetof(struct __sk_buff, data)),
4086 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4087 				    offsetof(struct __sk_buff, data_end)),
4088 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4089 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4090 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4091 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4092 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 4),
4093 			BPF_MOV64_IMM(BPF_REG_2, 4),
4094 			BPF_MOV64_IMM(BPF_REG_3, 0),
4095 			BPF_MOV64_IMM(BPF_REG_4, 0),
4096 			BPF_MOV64_IMM(BPF_REG_5, 0),
4097 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4098 				     BPF_FUNC_csum_diff),
4099 			BPF_MOV64_IMM(BPF_REG_0, 0),
4100 			BPF_EXIT_INSN(),
4101 		},
4102 		.result = ACCEPT,
4103 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4104 	},
4105 	{
4106 		"helper access to packet: test15, cls helper fail sub",
4107 		.insns = {
4108 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4109 				    offsetof(struct __sk_buff, data)),
4110 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4111 				    offsetof(struct __sk_buff, data_end)),
4112 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4113 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4114 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4115 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4116 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 12),
4117 			BPF_MOV64_IMM(BPF_REG_2, 4),
4118 			BPF_MOV64_IMM(BPF_REG_3, 0),
4119 			BPF_MOV64_IMM(BPF_REG_4, 0),
4120 			BPF_MOV64_IMM(BPF_REG_5, 0),
4121 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4122 				     BPF_FUNC_csum_diff),
4123 			BPF_MOV64_IMM(BPF_REG_0, 0),
4124 			BPF_EXIT_INSN(),
4125 		},
4126 		.result = REJECT,
4127 		.errstr = "invalid access to packet",
4128 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4129 	},
4130 	{
4131 		"helper access to packet: test16, cls helper fail range 1",
4132 		.insns = {
4133 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4134 				    offsetof(struct __sk_buff, data)),
4135 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4136 				    offsetof(struct __sk_buff, data_end)),
4137 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4138 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4139 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4140 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4141 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4142 			BPF_MOV64_IMM(BPF_REG_2, 8),
4143 			BPF_MOV64_IMM(BPF_REG_3, 0),
4144 			BPF_MOV64_IMM(BPF_REG_4, 0),
4145 			BPF_MOV64_IMM(BPF_REG_5, 0),
4146 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4147 				     BPF_FUNC_csum_diff),
4148 			BPF_MOV64_IMM(BPF_REG_0, 0),
4149 			BPF_EXIT_INSN(),
4150 		},
4151 		.result = REJECT,
4152 		.errstr = "invalid access to packet",
4153 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4154 	},
4155 	{
4156 		"helper access to packet: test17, cls helper fail range 2",
4157 		.insns = {
4158 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4159 				    offsetof(struct __sk_buff, data)),
4160 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4161 				    offsetof(struct __sk_buff, data_end)),
4162 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4163 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4164 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4165 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4166 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4167 			BPF_MOV64_IMM(BPF_REG_2, -9),
4168 			BPF_MOV64_IMM(BPF_REG_3, 0),
4169 			BPF_MOV64_IMM(BPF_REG_4, 0),
4170 			BPF_MOV64_IMM(BPF_REG_5, 0),
4171 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4172 				     BPF_FUNC_csum_diff),
4173 			BPF_MOV64_IMM(BPF_REG_0, 0),
4174 			BPF_EXIT_INSN(),
4175 		},
4176 		.result = REJECT,
4177 		.errstr = "R2 min value is negative",
4178 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4179 	},
4180 	{
4181 		"helper access to packet: test18, cls helper fail range 3",
4182 		.insns = {
4183 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4184 				    offsetof(struct __sk_buff, data)),
4185 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4186 				    offsetof(struct __sk_buff, data_end)),
4187 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4188 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4189 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4190 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4191 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4192 			BPF_MOV64_IMM(BPF_REG_2, ~0),
4193 			BPF_MOV64_IMM(BPF_REG_3, 0),
4194 			BPF_MOV64_IMM(BPF_REG_4, 0),
4195 			BPF_MOV64_IMM(BPF_REG_5, 0),
4196 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4197 				     BPF_FUNC_csum_diff),
4198 			BPF_MOV64_IMM(BPF_REG_0, 0),
4199 			BPF_EXIT_INSN(),
4200 		},
4201 		.result = REJECT,
4202 		.errstr = "R2 min value is negative",
4203 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4204 	},
4205 	{
4206 		"helper access to packet: test19, cls helper range zero",
4207 		.insns = {
4208 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4209 				    offsetof(struct __sk_buff, data)),
4210 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4211 				    offsetof(struct __sk_buff, data_end)),
4212 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4213 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4214 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4215 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4216 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4217 			BPF_MOV64_IMM(BPF_REG_2, 0),
4218 			BPF_MOV64_IMM(BPF_REG_3, 0),
4219 			BPF_MOV64_IMM(BPF_REG_4, 0),
4220 			BPF_MOV64_IMM(BPF_REG_5, 0),
4221 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4222 				     BPF_FUNC_csum_diff),
4223 			BPF_MOV64_IMM(BPF_REG_0, 0),
4224 			BPF_EXIT_INSN(),
4225 		},
4226 		.result = ACCEPT,
4227 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4228 	},
4229 	{
4230 		"helper access to packet: test20, pkt end as input",
4231 		.insns = {
4232 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4233 				    offsetof(struct __sk_buff, data)),
4234 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4235 				    offsetof(struct __sk_buff, data_end)),
4236 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4237 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4238 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4239 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4240 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
4241 			BPF_MOV64_IMM(BPF_REG_2, 4),
4242 			BPF_MOV64_IMM(BPF_REG_3, 0),
4243 			BPF_MOV64_IMM(BPF_REG_4, 0),
4244 			BPF_MOV64_IMM(BPF_REG_5, 0),
4245 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4246 				     BPF_FUNC_csum_diff),
4247 			BPF_MOV64_IMM(BPF_REG_0, 0),
4248 			BPF_EXIT_INSN(),
4249 		},
4250 		.result = REJECT,
4251 		.errstr = "R1 type=pkt_end expected=fp",
4252 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4253 	},
4254 	{
4255 		"helper access to packet: test21, wrong reg",
4256 		.insns = {
4257 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
4258 				    offsetof(struct __sk_buff, data)),
4259 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
4260 				    offsetof(struct __sk_buff, data_end)),
4261 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1),
4262 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4263 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
4264 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6),
4265 			BPF_MOV64_IMM(BPF_REG_2, 4),
4266 			BPF_MOV64_IMM(BPF_REG_3, 0),
4267 			BPF_MOV64_IMM(BPF_REG_4, 0),
4268 			BPF_MOV64_IMM(BPF_REG_5, 0),
4269 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4270 				     BPF_FUNC_csum_diff),
4271 			BPF_MOV64_IMM(BPF_REG_0, 0),
4272 			BPF_EXIT_INSN(),
4273 		},
4274 		.result = REJECT,
4275 		.errstr = "invalid access to packet",
4276 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4277 	},
4278 	{
4279 		"valid map access into an array with a constant",
4280 		.insns = {
4281 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4282 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4283 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4284 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4285 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4286 				     BPF_FUNC_map_lookup_elem),
4287 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4288 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4289 				   offsetof(struct test_val, foo)),
4290 			BPF_EXIT_INSN(),
4291 		},
4292 		.fixup_map2 = { 3 },
4293 		.errstr_unpriv = "R0 leaks addr",
4294 		.result_unpriv = REJECT,
4295 		.result = ACCEPT,
4296 	},
4297 	{
4298 		"valid map access into an array with a register",
4299 		.insns = {
4300 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4301 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4302 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4303 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4304 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4305 				     BPF_FUNC_map_lookup_elem),
4306 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
4307 			BPF_MOV64_IMM(BPF_REG_1, 4),
4308 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
4309 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4310 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4311 				   offsetof(struct test_val, foo)),
4312 			BPF_EXIT_INSN(),
4313 		},
4314 		.fixup_map2 = { 3 },
4315 		.errstr_unpriv = "R0 leaks addr",
4316 		.result_unpriv = REJECT,
4317 		.result = ACCEPT,
4318 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4319 	},
4320 	{
4321 		"valid map access into an array with a variable",
4322 		.insns = {
4323 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4324 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4325 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4326 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4327 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4328 				     BPF_FUNC_map_lookup_elem),
4329 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
4330 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4331 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3),
4332 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
4333 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4334 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4335 				   offsetof(struct test_val, foo)),
4336 			BPF_EXIT_INSN(),
4337 		},
4338 		.fixup_map2 = { 3 },
4339 		.errstr_unpriv = "R0 leaks addr",
4340 		.result_unpriv = REJECT,
4341 		.result = ACCEPT,
4342 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4343 	},
4344 	{
4345 		"valid map access into an array with a signed variable",
4346 		.insns = {
4347 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4348 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4349 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4350 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4351 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4352 				     BPF_FUNC_map_lookup_elem),
4353 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
4354 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4355 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1),
4356 			BPF_MOV32_IMM(BPF_REG_1, 0),
4357 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
4358 			BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
4359 			BPF_MOV32_IMM(BPF_REG_1, 0),
4360 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
4361 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4362 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4363 				   offsetof(struct test_val, foo)),
4364 			BPF_EXIT_INSN(),
4365 		},
4366 		.fixup_map2 = { 3 },
4367 		.errstr_unpriv = "R0 leaks addr",
4368 		.result_unpriv = REJECT,
4369 		.result = ACCEPT,
4370 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4371 	},
4372 	{
4373 		"invalid map access into an array with a constant",
4374 		.insns = {
4375 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4376 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4377 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4378 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4379 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4380 				     BPF_FUNC_map_lookup_elem),
4381 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4382 			BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2,
4383 				   offsetof(struct test_val, foo)),
4384 			BPF_EXIT_INSN(),
4385 		},
4386 		.fixup_map2 = { 3 },
4387 		.errstr = "invalid access to map value, value_size=48 off=48 size=8",
4388 		.result = REJECT,
4389 	},
4390 	{
4391 		"invalid map access into an array with a register",
4392 		.insns = {
4393 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4394 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4395 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4396 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4397 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4398 				     BPF_FUNC_map_lookup_elem),
4399 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
4400 			BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1),
4401 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
4402 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4403 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4404 				   offsetof(struct test_val, foo)),
4405 			BPF_EXIT_INSN(),
4406 		},
4407 		.fixup_map2 = { 3 },
4408 		.errstr = "R0 min value is outside of the array range",
4409 		.result = REJECT,
4410 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4411 	},
4412 	{
4413 		"invalid map access into an array with a variable",
4414 		.insns = {
4415 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4416 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4417 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4418 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4419 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4420 				     BPF_FUNC_map_lookup_elem),
4421 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
4422 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4423 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
4424 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4425 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4426 				   offsetof(struct test_val, foo)),
4427 			BPF_EXIT_INSN(),
4428 		},
4429 		.fixup_map2 = { 3 },
4430 		.errstr = "R0 unbounded memory access, make sure to bounds check any array access into a map",
4431 		.result = REJECT,
4432 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4433 	},
4434 	{
4435 		"invalid map access into an array with no floor check",
4436 		.insns = {
4437 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4438 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4439 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4440 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4441 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4442 				     BPF_FUNC_map_lookup_elem),
4443 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4444 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
4445 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
4446 			BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
4447 			BPF_MOV32_IMM(BPF_REG_1, 0),
4448 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
4449 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4450 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4451 				   offsetof(struct test_val, foo)),
4452 			BPF_EXIT_INSN(),
4453 		},
4454 		.fixup_map2 = { 3 },
4455 		.errstr_unpriv = "R0 leaks addr",
4456 		.errstr = "R0 unbounded memory access",
4457 		.result_unpriv = REJECT,
4458 		.result = REJECT,
4459 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4460 	},
4461 	{
4462 		"invalid map access into an array with a invalid max check",
4463 		.insns = {
4464 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4465 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4466 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4467 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4468 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4469 				     BPF_FUNC_map_lookup_elem),
4470 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
4471 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4472 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1),
4473 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
4474 			BPF_MOV32_IMM(BPF_REG_1, 0),
4475 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
4476 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4477 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
4478 				   offsetof(struct test_val, foo)),
4479 			BPF_EXIT_INSN(),
4480 		},
4481 		.fixup_map2 = { 3 },
4482 		.errstr_unpriv = "R0 leaks addr",
4483 		.errstr = "invalid access to map value, value_size=48 off=44 size=8",
4484 		.result_unpriv = REJECT,
4485 		.result = REJECT,
4486 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4487 	},
4488 	{
4489 		"invalid map access into an array with a invalid max check",
4490 		.insns = {
4491 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4492 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4493 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4494 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4495 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4496 				     BPF_FUNC_map_lookup_elem),
4497 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
4498 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
4499 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4500 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4501 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4502 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4503 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4504 				     BPF_FUNC_map_lookup_elem),
4505 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
4506 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8),
4507 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
4508 				    offsetof(struct test_val, foo)),
4509 			BPF_EXIT_INSN(),
4510 		},
4511 		.fixup_map2 = { 3, 11 },
4512 		.errstr = "R0 pointer += pointer",
4513 		.result = REJECT,
4514 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4515 	},
4516 	{
4517 		"multiple registers share map_lookup_elem result",
4518 		.insns = {
4519 			BPF_MOV64_IMM(BPF_REG_1, 10),
4520 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
4521 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4522 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4523 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4524 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4525 				     BPF_FUNC_map_lookup_elem),
4526 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
4527 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4528 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
4529 			BPF_EXIT_INSN(),
4530 		},
4531 		.fixup_map1 = { 4 },
4532 		.result = ACCEPT,
4533 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
4534 	},
4535 	{
4536 		"alu ops on ptr_to_map_value_or_null, 1",
4537 		.insns = {
4538 			BPF_MOV64_IMM(BPF_REG_1, 10),
4539 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
4540 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4541 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4542 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4543 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4544 				     BPF_FUNC_map_lookup_elem),
4545 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
4546 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -2),
4547 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 2),
4548 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4549 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
4550 			BPF_EXIT_INSN(),
4551 		},
4552 		.fixup_map1 = { 4 },
4553 		.errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL",
4554 		.result = REJECT,
4555 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
4556 	},
4557 	{
4558 		"alu ops on ptr_to_map_value_or_null, 2",
4559 		.insns = {
4560 			BPF_MOV64_IMM(BPF_REG_1, 10),
4561 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
4562 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4563 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4564 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4565 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4566 				     BPF_FUNC_map_lookup_elem),
4567 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
4568 			BPF_ALU64_IMM(BPF_AND, BPF_REG_4, -1),
4569 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4570 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
4571 			BPF_EXIT_INSN(),
4572 		},
4573 		.fixup_map1 = { 4 },
4574 		.errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL",
4575 		.result = REJECT,
4576 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
4577 	},
4578 	{
4579 		"alu ops on ptr_to_map_value_or_null, 3",
4580 		.insns = {
4581 			BPF_MOV64_IMM(BPF_REG_1, 10),
4582 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
4583 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4584 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4585 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4586 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4587 				     BPF_FUNC_map_lookup_elem),
4588 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
4589 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_4, 1),
4590 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4591 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
4592 			BPF_EXIT_INSN(),
4593 		},
4594 		.fixup_map1 = { 4 },
4595 		.errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL",
4596 		.result = REJECT,
4597 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
4598 	},
4599 	{
4600 		"invalid memory access with multiple map_lookup_elem calls",
4601 		.insns = {
4602 			BPF_MOV64_IMM(BPF_REG_1, 10),
4603 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
4604 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4605 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4606 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4607 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
4608 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
4609 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4610 				     BPF_FUNC_map_lookup_elem),
4611 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
4612 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
4613 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
4614 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4615 				     BPF_FUNC_map_lookup_elem),
4616 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4617 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
4618 			BPF_EXIT_INSN(),
4619 		},
4620 		.fixup_map1 = { 4 },
4621 		.result = REJECT,
4622 		.errstr = "R4 !read_ok",
4623 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
4624 	},
4625 	{
4626 		"valid indirect map_lookup_elem access with 2nd lookup in branch",
4627 		.insns = {
4628 			BPF_MOV64_IMM(BPF_REG_1, 10),
4629 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
4630 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4631 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4632 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4633 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
4634 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
4635 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4636 				     BPF_FUNC_map_lookup_elem),
4637 			BPF_MOV64_IMM(BPF_REG_2, 10),
4638 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3),
4639 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
4640 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
4641 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4642 				     BPF_FUNC_map_lookup_elem),
4643 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
4644 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
4645 			BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
4646 			BPF_EXIT_INSN(),
4647 		},
4648 		.fixup_map1 = { 4 },
4649 		.result = ACCEPT,
4650 		.prog_type = BPF_PROG_TYPE_SCHED_CLS
4651 	},
4652 	{
4653 		"invalid map access from else condition",
4654 		.insns = {
4655 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4656 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4657 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4658 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4659 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
4660 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
4661 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
4662 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1),
4663 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1),
4664 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
4665 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
4666 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
4667 			BPF_EXIT_INSN(),
4668 		},
4669 		.fixup_map2 = { 3 },
4670 		.errstr = "R0 unbounded memory access",
4671 		.result = REJECT,
4672 		.errstr_unpriv = "R0 leaks addr",
4673 		.result_unpriv = REJECT,
4674 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
4675 	},
4676 	{
4677 		"constant register |= constant should keep constant type",
4678 		.insns = {
4679 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4680 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
4681 			BPF_MOV64_IMM(BPF_REG_2, 34),
4682 			BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13),
4683 			BPF_MOV64_IMM(BPF_REG_3, 0),
4684 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4685 			BPF_EXIT_INSN(),
4686 		},
4687 		.result = ACCEPT,
4688 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4689 	},
4690 	{
4691 		"constant register |= constant should not bypass stack boundary checks",
4692 		.insns = {
4693 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4694 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
4695 			BPF_MOV64_IMM(BPF_REG_2, 34),
4696 			BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24),
4697 			BPF_MOV64_IMM(BPF_REG_3, 0),
4698 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4699 			BPF_EXIT_INSN(),
4700 		},
4701 		.errstr = "invalid stack type R1 off=-48 access_size=58",
4702 		.result = REJECT,
4703 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4704 	},
4705 	{
4706 		"constant register |= constant register should keep constant type",
4707 		.insns = {
4708 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4709 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
4710 			BPF_MOV64_IMM(BPF_REG_2, 34),
4711 			BPF_MOV64_IMM(BPF_REG_4, 13),
4712 			BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4),
4713 			BPF_MOV64_IMM(BPF_REG_3, 0),
4714 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4715 			BPF_EXIT_INSN(),
4716 		},
4717 		.result = ACCEPT,
4718 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4719 	},
4720 	{
4721 		"constant register |= constant register should not bypass stack boundary checks",
4722 		.insns = {
4723 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4724 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
4725 			BPF_MOV64_IMM(BPF_REG_2, 34),
4726 			BPF_MOV64_IMM(BPF_REG_4, 24),
4727 			BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4),
4728 			BPF_MOV64_IMM(BPF_REG_3, 0),
4729 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4730 			BPF_EXIT_INSN(),
4731 		},
4732 		.errstr = "invalid stack type R1 off=-48 access_size=58",
4733 		.result = REJECT,
4734 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4735 	},
4736 	{
4737 		"invalid direct packet write for LWT_IN",
4738 		.insns = {
4739 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4740 				    offsetof(struct __sk_buff, data)),
4741 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4742 				    offsetof(struct __sk_buff, data_end)),
4743 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4744 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4745 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
4746 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
4747 			BPF_MOV64_IMM(BPF_REG_0, 0),
4748 			BPF_EXIT_INSN(),
4749 		},
4750 		.errstr = "cannot write into packet",
4751 		.result = REJECT,
4752 		.prog_type = BPF_PROG_TYPE_LWT_IN,
4753 	},
4754 	{
4755 		"invalid direct packet write for LWT_OUT",
4756 		.insns = {
4757 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4758 				    offsetof(struct __sk_buff, data)),
4759 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4760 				    offsetof(struct __sk_buff, data_end)),
4761 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4762 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4763 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
4764 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
4765 			BPF_MOV64_IMM(BPF_REG_0, 0),
4766 			BPF_EXIT_INSN(),
4767 		},
4768 		.errstr = "cannot write into packet",
4769 		.result = REJECT,
4770 		.prog_type = BPF_PROG_TYPE_LWT_OUT,
4771 	},
4772 	{
4773 		"direct packet write for LWT_XMIT",
4774 		.insns = {
4775 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4776 				    offsetof(struct __sk_buff, data)),
4777 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4778 				    offsetof(struct __sk_buff, data_end)),
4779 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4780 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4781 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
4782 			BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
4783 			BPF_MOV64_IMM(BPF_REG_0, 0),
4784 			BPF_EXIT_INSN(),
4785 		},
4786 		.result = ACCEPT,
4787 		.prog_type = BPF_PROG_TYPE_LWT_XMIT,
4788 	},
4789 	{
4790 		"direct packet read for LWT_IN",
4791 		.insns = {
4792 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4793 				    offsetof(struct __sk_buff, data)),
4794 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4795 				    offsetof(struct __sk_buff, data_end)),
4796 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4797 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4798 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
4799 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
4800 			BPF_MOV64_IMM(BPF_REG_0, 0),
4801 			BPF_EXIT_INSN(),
4802 		},
4803 		.result = ACCEPT,
4804 		.prog_type = BPF_PROG_TYPE_LWT_IN,
4805 	},
4806 	{
4807 		"direct packet read for LWT_OUT",
4808 		.insns = {
4809 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4810 				    offsetof(struct __sk_buff, data)),
4811 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4812 				    offsetof(struct __sk_buff, data_end)),
4813 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4814 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4815 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
4816 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
4817 			BPF_MOV64_IMM(BPF_REG_0, 0),
4818 			BPF_EXIT_INSN(),
4819 		},
4820 		.result = ACCEPT,
4821 		.prog_type = BPF_PROG_TYPE_LWT_OUT,
4822 	},
4823 	{
4824 		"direct packet read for LWT_XMIT",
4825 		.insns = {
4826 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4827 				    offsetof(struct __sk_buff, data)),
4828 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4829 				    offsetof(struct __sk_buff, data_end)),
4830 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4831 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4832 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
4833 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
4834 			BPF_MOV64_IMM(BPF_REG_0, 0),
4835 			BPF_EXIT_INSN(),
4836 		},
4837 		.result = ACCEPT,
4838 		.prog_type = BPF_PROG_TYPE_LWT_XMIT,
4839 	},
4840 	{
4841 		"overlapping checks for direct packet access",
4842 		.insns = {
4843 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
4844 				    offsetof(struct __sk_buff, data)),
4845 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
4846 				    offsetof(struct __sk_buff, data_end)),
4847 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
4848 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
4849 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
4850 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
4851 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
4852 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
4853 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
4854 			BPF_MOV64_IMM(BPF_REG_0, 0),
4855 			BPF_EXIT_INSN(),
4856 		},
4857 		.result = ACCEPT,
4858 		.prog_type = BPF_PROG_TYPE_LWT_XMIT,
4859 	},
4860 	{
4861 		"invalid access of tc_classid for LWT_IN",
4862 		.insns = {
4863 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
4864 				    offsetof(struct __sk_buff, tc_classid)),
4865 			BPF_EXIT_INSN(),
4866 		},
4867 		.result = REJECT,
4868 		.errstr = "invalid bpf_context access",
4869 	},
4870 	{
4871 		"invalid access of tc_classid for LWT_OUT",
4872 		.insns = {
4873 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
4874 				    offsetof(struct __sk_buff, tc_classid)),
4875 			BPF_EXIT_INSN(),
4876 		},
4877 		.result = REJECT,
4878 		.errstr = "invalid bpf_context access",
4879 	},
4880 	{
4881 		"invalid access of tc_classid for LWT_XMIT",
4882 		.insns = {
4883 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
4884 				    offsetof(struct __sk_buff, tc_classid)),
4885 			BPF_EXIT_INSN(),
4886 		},
4887 		.result = REJECT,
4888 		.errstr = "invalid bpf_context access",
4889 	},
4890 	{
4891 		"leak pointer into ctx 1",
4892 		.insns = {
4893 			BPF_MOV64_IMM(BPF_REG_0, 0),
4894 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
4895 				    offsetof(struct __sk_buff, cb[0])),
4896 			BPF_LD_MAP_FD(BPF_REG_2, 0),
4897 			BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_2,
4898 				      offsetof(struct __sk_buff, cb[0])),
4899 			BPF_EXIT_INSN(),
4900 		},
4901 		.fixup_map1 = { 2 },
4902 		.errstr_unpriv = "R2 leaks addr into mem",
4903 		.result_unpriv = REJECT,
4904 		.result = REJECT,
4905 		.errstr = "BPF_XADD stores into R1 context is not allowed",
4906 	},
4907 	{
4908 		"leak pointer into ctx 2",
4909 		.insns = {
4910 			BPF_MOV64_IMM(BPF_REG_0, 0),
4911 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
4912 				    offsetof(struct __sk_buff, cb[0])),
4913 			BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_10,
4914 				      offsetof(struct __sk_buff, cb[0])),
4915 			BPF_EXIT_INSN(),
4916 		},
4917 		.errstr_unpriv = "R10 leaks addr into mem",
4918 		.result_unpriv = REJECT,
4919 		.result = REJECT,
4920 		.errstr = "BPF_XADD stores into R1 context is not allowed",
4921 	},
4922 	{
4923 		"leak pointer into ctx 3",
4924 		.insns = {
4925 			BPF_MOV64_IMM(BPF_REG_0, 0),
4926 			BPF_LD_MAP_FD(BPF_REG_2, 0),
4927 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2,
4928 				      offsetof(struct __sk_buff, cb[0])),
4929 			BPF_EXIT_INSN(),
4930 		},
4931 		.fixup_map1 = { 1 },
4932 		.errstr_unpriv = "R2 leaks addr into ctx",
4933 		.result_unpriv = REJECT,
4934 		.result = ACCEPT,
4935 	},
4936 	{
4937 		"leak pointer into map val",
4938 		.insns = {
4939 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
4940 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
4941 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4942 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4943 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4944 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
4945 				     BPF_FUNC_map_lookup_elem),
4946 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
4947 			BPF_MOV64_IMM(BPF_REG_3, 0),
4948 			BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
4949 			BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
4950 			BPF_MOV64_IMM(BPF_REG_0, 0),
4951 			BPF_EXIT_INSN(),
4952 		},
4953 		.fixup_map1 = { 4 },
4954 		.errstr_unpriv = "R6 leaks addr into mem",
4955 		.result_unpriv = REJECT,
4956 		.result = ACCEPT,
4957 	},
4958 	{
4959 		"helper access to map: full range",
4960 		.insns = {
4961 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4962 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4963 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4964 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4965 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4966 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
4967 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4968 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
4969 			BPF_MOV64_IMM(BPF_REG_3, 0),
4970 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4971 			BPF_EXIT_INSN(),
4972 		},
4973 		.fixup_map2 = { 3 },
4974 		.result = ACCEPT,
4975 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4976 	},
4977 	{
4978 		"helper access to map: partial range",
4979 		.insns = {
4980 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4981 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
4982 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
4983 			BPF_LD_MAP_FD(BPF_REG_1, 0),
4984 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
4985 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
4986 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
4987 			BPF_MOV64_IMM(BPF_REG_2, 8),
4988 			BPF_MOV64_IMM(BPF_REG_3, 0),
4989 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
4990 			BPF_EXIT_INSN(),
4991 		},
4992 		.fixup_map2 = { 3 },
4993 		.result = ACCEPT,
4994 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
4995 	},
4996 	{
4997 		"helper access to map: empty range",
4998 		.insns = {
4999 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5000 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5001 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5002 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5003 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5004 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
5005 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5006 			BPF_MOV64_IMM(BPF_REG_2, 0),
5007 			BPF_EMIT_CALL(BPF_FUNC_trace_printk),
5008 			BPF_EXIT_INSN(),
5009 		},
5010 		.fixup_map2 = { 3 },
5011 		.errstr = "invalid access to map value, value_size=48 off=0 size=0",
5012 		.result = REJECT,
5013 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5014 	},
5015 	{
5016 		"helper access to map: out-of-bound range",
5017 		.insns = {
5018 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5019 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5020 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5021 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5022 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5023 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5024 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5025 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8),
5026 			BPF_MOV64_IMM(BPF_REG_3, 0),
5027 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5028 			BPF_EXIT_INSN(),
5029 		},
5030 		.fixup_map2 = { 3 },
5031 		.errstr = "invalid access to map value, value_size=48 off=0 size=56",
5032 		.result = REJECT,
5033 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5034 	},
5035 	{
5036 		"helper access to map: negative range",
5037 		.insns = {
5038 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5039 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5040 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5041 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5042 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5043 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5044 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5045 			BPF_MOV64_IMM(BPF_REG_2, -8),
5046 			BPF_MOV64_IMM(BPF_REG_3, 0),
5047 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5048 			BPF_EXIT_INSN(),
5049 		},
5050 		.fixup_map2 = { 3 },
5051 		.errstr = "R2 min value is negative",
5052 		.result = REJECT,
5053 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5054 	},
5055 	{
5056 		"helper access to adjusted map (via const imm): full range",
5057 		.insns = {
5058 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5059 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5060 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5061 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5062 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5063 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5064 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5065 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
5066 				offsetof(struct test_val, foo)),
5067 			BPF_MOV64_IMM(BPF_REG_2,
5068 				sizeof(struct test_val) -
5069 				offsetof(struct test_val, foo)),
5070 			BPF_MOV64_IMM(BPF_REG_3, 0),
5071 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5072 			BPF_EXIT_INSN(),
5073 		},
5074 		.fixup_map2 = { 3 },
5075 		.result = ACCEPT,
5076 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5077 	},
5078 	{
5079 		"helper access to adjusted map (via const imm): partial range",
5080 		.insns = {
5081 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5082 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5083 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5084 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5085 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5086 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5087 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5088 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
5089 				offsetof(struct test_val, foo)),
5090 			BPF_MOV64_IMM(BPF_REG_2, 8),
5091 			BPF_MOV64_IMM(BPF_REG_3, 0),
5092 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5093 			BPF_EXIT_INSN(),
5094 		},
5095 		.fixup_map2 = { 3 },
5096 		.result = ACCEPT,
5097 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5098 	},
5099 	{
5100 		"helper access to adjusted map (via const imm): empty range",
5101 		.insns = {
5102 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5103 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5104 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5105 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5106 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5107 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5108 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5109 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
5110 				offsetof(struct test_val, foo)),
5111 			BPF_MOV64_IMM(BPF_REG_2, 0),
5112 			BPF_EMIT_CALL(BPF_FUNC_trace_printk),
5113 			BPF_EXIT_INSN(),
5114 		},
5115 		.fixup_map2 = { 3 },
5116 		.errstr = "invalid access to map value, value_size=48 off=4 size=0",
5117 		.result = REJECT,
5118 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5119 	},
5120 	{
5121 		"helper access to adjusted map (via const imm): out-of-bound range",
5122 		.insns = {
5123 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5124 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5125 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5126 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5127 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5128 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5129 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5130 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
5131 				offsetof(struct test_val, foo)),
5132 			BPF_MOV64_IMM(BPF_REG_2,
5133 				sizeof(struct test_val) -
5134 				offsetof(struct test_val, foo) + 8),
5135 			BPF_MOV64_IMM(BPF_REG_3, 0),
5136 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5137 			BPF_EXIT_INSN(),
5138 		},
5139 		.fixup_map2 = { 3 },
5140 		.errstr = "invalid access to map value, value_size=48 off=4 size=52",
5141 		.result = REJECT,
5142 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5143 	},
5144 	{
5145 		"helper access to adjusted map (via const imm): negative range (> adjustment)",
5146 		.insns = {
5147 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5148 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5149 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5150 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5151 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5152 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5153 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5154 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
5155 				offsetof(struct test_val, foo)),
5156 			BPF_MOV64_IMM(BPF_REG_2, -8),
5157 			BPF_MOV64_IMM(BPF_REG_3, 0),
5158 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5159 			BPF_EXIT_INSN(),
5160 		},
5161 		.fixup_map2 = { 3 },
5162 		.errstr = "R2 min value is negative",
5163 		.result = REJECT,
5164 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5165 	},
5166 	{
5167 		"helper access to adjusted map (via const imm): negative range (< adjustment)",
5168 		.insns = {
5169 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5170 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5171 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5172 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5173 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5174 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5175 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5176 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
5177 				offsetof(struct test_val, foo)),
5178 			BPF_MOV64_IMM(BPF_REG_2, -1),
5179 			BPF_MOV64_IMM(BPF_REG_3, 0),
5180 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5181 			BPF_EXIT_INSN(),
5182 		},
5183 		.fixup_map2 = { 3 },
5184 		.errstr = "R2 min value is negative",
5185 		.result = REJECT,
5186 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5187 	},
5188 	{
5189 		"helper access to adjusted map (via const reg): full range",
5190 		.insns = {
5191 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5192 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5193 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5194 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5195 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5196 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5197 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5198 			BPF_MOV64_IMM(BPF_REG_3,
5199 				offsetof(struct test_val, foo)),
5200 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5201 			BPF_MOV64_IMM(BPF_REG_2,
5202 				sizeof(struct test_val) -
5203 				offsetof(struct test_val, foo)),
5204 			BPF_MOV64_IMM(BPF_REG_3, 0),
5205 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5206 			BPF_EXIT_INSN(),
5207 		},
5208 		.fixup_map2 = { 3 },
5209 		.result = ACCEPT,
5210 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5211 	},
5212 	{
5213 		"helper access to adjusted map (via const reg): partial range",
5214 		.insns = {
5215 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5216 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5217 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5218 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5219 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5220 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5221 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5222 			BPF_MOV64_IMM(BPF_REG_3,
5223 				offsetof(struct test_val, foo)),
5224 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5225 			BPF_MOV64_IMM(BPF_REG_2, 8),
5226 			BPF_MOV64_IMM(BPF_REG_3, 0),
5227 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5228 			BPF_EXIT_INSN(),
5229 		},
5230 		.fixup_map2 = { 3 },
5231 		.result = ACCEPT,
5232 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5233 	},
5234 	{
5235 		"helper access to adjusted map (via const reg): empty range",
5236 		.insns = {
5237 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5238 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5239 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5240 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5241 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5242 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5243 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5244 			BPF_MOV64_IMM(BPF_REG_3, 0),
5245 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5246 			BPF_MOV64_IMM(BPF_REG_2, 0),
5247 			BPF_EMIT_CALL(BPF_FUNC_trace_printk),
5248 			BPF_EXIT_INSN(),
5249 		},
5250 		.fixup_map2 = { 3 },
5251 		.errstr = "R1 min value is outside of the array range",
5252 		.result = REJECT,
5253 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5254 	},
5255 	{
5256 		"helper access to adjusted map (via const reg): out-of-bound range",
5257 		.insns = {
5258 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5259 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5260 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5261 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5262 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5263 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5264 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5265 			BPF_MOV64_IMM(BPF_REG_3,
5266 				offsetof(struct test_val, foo)),
5267 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5268 			BPF_MOV64_IMM(BPF_REG_2,
5269 				sizeof(struct test_val) -
5270 				offsetof(struct test_val, foo) + 8),
5271 			BPF_MOV64_IMM(BPF_REG_3, 0),
5272 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5273 			BPF_EXIT_INSN(),
5274 		},
5275 		.fixup_map2 = { 3 },
5276 		.errstr = "invalid access to map value, value_size=48 off=4 size=52",
5277 		.result = REJECT,
5278 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5279 	},
5280 	{
5281 		"helper access to adjusted map (via const reg): negative range (> adjustment)",
5282 		.insns = {
5283 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5284 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5285 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5286 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5287 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5288 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5289 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5290 			BPF_MOV64_IMM(BPF_REG_3,
5291 				offsetof(struct test_val, foo)),
5292 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5293 			BPF_MOV64_IMM(BPF_REG_2, -8),
5294 			BPF_MOV64_IMM(BPF_REG_3, 0),
5295 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5296 			BPF_EXIT_INSN(),
5297 		},
5298 		.fixup_map2 = { 3 },
5299 		.errstr = "R2 min value is negative",
5300 		.result = REJECT,
5301 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5302 	},
5303 	{
5304 		"helper access to adjusted map (via const reg): negative range (< adjustment)",
5305 		.insns = {
5306 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5307 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5308 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5309 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5310 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5311 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5312 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5313 			BPF_MOV64_IMM(BPF_REG_3,
5314 				offsetof(struct test_val, foo)),
5315 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5316 			BPF_MOV64_IMM(BPF_REG_2, -1),
5317 			BPF_MOV64_IMM(BPF_REG_3, 0),
5318 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5319 			BPF_EXIT_INSN(),
5320 		},
5321 		.fixup_map2 = { 3 },
5322 		.errstr = "R2 min value is negative",
5323 		.result = REJECT,
5324 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5325 	},
5326 	{
5327 		"helper access to adjusted map (via variable): full range",
5328 		.insns = {
5329 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5330 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5331 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5332 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5333 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5334 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
5335 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5336 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5337 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
5338 				offsetof(struct test_val, foo), 4),
5339 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5340 			BPF_MOV64_IMM(BPF_REG_2,
5341 				sizeof(struct test_val) -
5342 				offsetof(struct test_val, foo)),
5343 			BPF_MOV64_IMM(BPF_REG_3, 0),
5344 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5345 			BPF_EXIT_INSN(),
5346 		},
5347 		.fixup_map2 = { 3 },
5348 		.result = ACCEPT,
5349 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5350 	},
5351 	{
5352 		"helper access to adjusted map (via variable): partial range",
5353 		.insns = {
5354 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5355 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5356 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5357 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5358 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5359 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
5360 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5361 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5362 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
5363 				offsetof(struct test_val, foo), 4),
5364 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5365 			BPF_MOV64_IMM(BPF_REG_2, 8),
5366 			BPF_MOV64_IMM(BPF_REG_3, 0),
5367 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5368 			BPF_EXIT_INSN(),
5369 		},
5370 		.fixup_map2 = { 3 },
5371 		.result = ACCEPT,
5372 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5373 	},
5374 	{
5375 		"helper access to adjusted map (via variable): empty range",
5376 		.insns = {
5377 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5378 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5379 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5380 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5381 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5382 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5383 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5384 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5385 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
5386 				offsetof(struct test_val, foo), 3),
5387 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5388 			BPF_MOV64_IMM(BPF_REG_2, 0),
5389 			BPF_EMIT_CALL(BPF_FUNC_trace_printk),
5390 			BPF_EXIT_INSN(),
5391 		},
5392 		.fixup_map2 = { 3 },
5393 		.errstr = "R1 min value is outside of the array range",
5394 		.result = REJECT,
5395 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5396 	},
5397 	{
5398 		"helper access to adjusted map (via variable): no max check",
5399 		.insns = {
5400 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5401 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5402 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5403 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5404 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5405 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5406 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5407 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5408 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5409 			BPF_MOV64_IMM(BPF_REG_2, 1),
5410 			BPF_MOV64_IMM(BPF_REG_3, 0),
5411 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5412 			BPF_EXIT_INSN(),
5413 		},
5414 		.fixup_map2 = { 3 },
5415 		.errstr = "R1 unbounded memory access",
5416 		.result = REJECT,
5417 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5418 	},
5419 	{
5420 		"helper access to adjusted map (via variable): wrong max check",
5421 		.insns = {
5422 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5423 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5424 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5425 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5426 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5427 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
5428 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5429 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5430 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
5431 				offsetof(struct test_val, foo), 4),
5432 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5433 			BPF_MOV64_IMM(BPF_REG_2,
5434 				sizeof(struct test_val) -
5435 				offsetof(struct test_val, foo) + 1),
5436 			BPF_MOV64_IMM(BPF_REG_3, 0),
5437 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
5438 			BPF_EXIT_INSN(),
5439 		},
5440 		.fixup_map2 = { 3 },
5441 		.errstr = "invalid access to map value, value_size=48 off=4 size=45",
5442 		.result = REJECT,
5443 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5444 	},
5445 	{
5446 		"helper access to map: bounds check using <, good access",
5447 		.insns = {
5448 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5449 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5450 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5451 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5452 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5453 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5454 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5455 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5456 			BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2),
5457 			BPF_MOV64_IMM(BPF_REG_0, 0),
5458 			BPF_EXIT_INSN(),
5459 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5460 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5461 			BPF_MOV64_IMM(BPF_REG_0, 0),
5462 			BPF_EXIT_INSN(),
5463 		},
5464 		.fixup_map2 = { 3 },
5465 		.result = ACCEPT,
5466 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5467 	},
5468 	{
5469 		"helper access to map: bounds check using <, bad access",
5470 		.insns = {
5471 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5472 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5473 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5474 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5475 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5476 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5477 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5478 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5479 			BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4),
5480 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5481 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5482 			BPF_MOV64_IMM(BPF_REG_0, 0),
5483 			BPF_EXIT_INSN(),
5484 			BPF_MOV64_IMM(BPF_REG_0, 0),
5485 			BPF_EXIT_INSN(),
5486 		},
5487 		.fixup_map2 = { 3 },
5488 		.result = REJECT,
5489 		.errstr = "R1 unbounded memory access",
5490 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5491 	},
5492 	{
5493 		"helper access to map: bounds check using <=, good access",
5494 		.insns = {
5495 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5496 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5497 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5498 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5499 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5500 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5501 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5502 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5503 			BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2),
5504 			BPF_MOV64_IMM(BPF_REG_0, 0),
5505 			BPF_EXIT_INSN(),
5506 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5507 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5508 			BPF_MOV64_IMM(BPF_REG_0, 0),
5509 			BPF_EXIT_INSN(),
5510 		},
5511 		.fixup_map2 = { 3 },
5512 		.result = ACCEPT,
5513 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5514 	},
5515 	{
5516 		"helper access to map: bounds check using <=, bad access",
5517 		.insns = {
5518 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5519 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5520 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5521 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5522 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5523 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5524 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5525 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5526 			BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4),
5527 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5528 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5529 			BPF_MOV64_IMM(BPF_REG_0, 0),
5530 			BPF_EXIT_INSN(),
5531 			BPF_MOV64_IMM(BPF_REG_0, 0),
5532 			BPF_EXIT_INSN(),
5533 		},
5534 		.fixup_map2 = { 3 },
5535 		.result = REJECT,
5536 		.errstr = "R1 unbounded memory access",
5537 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5538 	},
5539 	{
5540 		"helper access to map: bounds check using s<, good access",
5541 		.insns = {
5542 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5543 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5544 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5545 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5546 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5547 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5548 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5549 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5550 			BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
5551 			BPF_MOV64_IMM(BPF_REG_0, 0),
5552 			BPF_EXIT_INSN(),
5553 			BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3),
5554 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5555 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5556 			BPF_MOV64_IMM(BPF_REG_0, 0),
5557 			BPF_EXIT_INSN(),
5558 		},
5559 		.fixup_map2 = { 3 },
5560 		.result = ACCEPT,
5561 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5562 	},
5563 	{
5564 		"helper access to map: bounds check using s<, good access 2",
5565 		.insns = {
5566 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5567 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5568 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5569 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5570 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5571 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5572 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5573 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5574 			BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
5575 			BPF_MOV64_IMM(BPF_REG_0, 0),
5576 			BPF_EXIT_INSN(),
5577 			BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
5578 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5579 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5580 			BPF_MOV64_IMM(BPF_REG_0, 0),
5581 			BPF_EXIT_INSN(),
5582 		},
5583 		.fixup_map2 = { 3 },
5584 		.result = ACCEPT,
5585 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5586 	},
5587 	{
5588 		"helper access to map: bounds check using s<, bad access",
5589 		.insns = {
5590 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5591 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5592 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5593 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5594 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5595 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5596 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5597 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
5598 			BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
5599 			BPF_MOV64_IMM(BPF_REG_0, 0),
5600 			BPF_EXIT_INSN(),
5601 			BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
5602 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5603 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5604 			BPF_MOV64_IMM(BPF_REG_0, 0),
5605 			BPF_EXIT_INSN(),
5606 		},
5607 		.fixup_map2 = { 3 },
5608 		.result = REJECT,
5609 		.errstr = "R1 min value is negative",
5610 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5611 	},
5612 	{
5613 		"helper access to map: bounds check using s<=, good access",
5614 		.insns = {
5615 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5616 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5617 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5618 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5619 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5620 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5621 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5622 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5623 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
5624 			BPF_MOV64_IMM(BPF_REG_0, 0),
5625 			BPF_EXIT_INSN(),
5626 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3),
5627 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5628 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5629 			BPF_MOV64_IMM(BPF_REG_0, 0),
5630 			BPF_EXIT_INSN(),
5631 		},
5632 		.fixup_map2 = { 3 },
5633 		.result = ACCEPT,
5634 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5635 	},
5636 	{
5637 		"helper access to map: bounds check using s<=, good access 2",
5638 		.insns = {
5639 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5640 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5641 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5642 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5643 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5644 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5645 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5646 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5647 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
5648 			BPF_MOV64_IMM(BPF_REG_0, 0),
5649 			BPF_EXIT_INSN(),
5650 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
5651 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5652 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5653 			BPF_MOV64_IMM(BPF_REG_0, 0),
5654 			BPF_EXIT_INSN(),
5655 		},
5656 		.fixup_map2 = { 3 },
5657 		.result = ACCEPT,
5658 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5659 	},
5660 	{
5661 		"helper access to map: bounds check using s<=, bad access",
5662 		.insns = {
5663 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5664 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5665 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5666 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5667 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5668 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5669 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
5670 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
5671 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
5672 			BPF_MOV64_IMM(BPF_REG_0, 0),
5673 			BPF_EXIT_INSN(),
5674 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
5675 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
5676 			BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
5677 			BPF_MOV64_IMM(BPF_REG_0, 0),
5678 			BPF_EXIT_INSN(),
5679 		},
5680 		.fixup_map2 = { 3 },
5681 		.result = REJECT,
5682 		.errstr = "R1 min value is negative",
5683 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5684 	},
5685 	{
5686 		"map lookup helper access to map",
5687 		.insns = {
5688 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5689 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5690 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5691 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5692 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5693 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
5694 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5695 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5696 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5697 			BPF_EXIT_INSN(),
5698 		},
5699 		.fixup_map3 = { 3, 8 },
5700 		.result = ACCEPT,
5701 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5702 	},
5703 	{
5704 		"map update helper access to map",
5705 		.insns = {
5706 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5707 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5708 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5709 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5710 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5711 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5712 			BPF_MOV64_IMM(BPF_REG_4, 0),
5713 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
5714 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5715 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5716 			BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
5717 			BPF_EXIT_INSN(),
5718 		},
5719 		.fixup_map3 = { 3, 10 },
5720 		.result = ACCEPT,
5721 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5722 	},
5723 	{
5724 		"map update helper access to map: wrong size",
5725 		.insns = {
5726 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5727 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5728 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5729 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5730 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5731 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5732 			BPF_MOV64_IMM(BPF_REG_4, 0),
5733 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
5734 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5735 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5736 			BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
5737 			BPF_EXIT_INSN(),
5738 		},
5739 		.fixup_map1 = { 3 },
5740 		.fixup_map3 = { 10 },
5741 		.result = REJECT,
5742 		.errstr = "invalid access to map value, value_size=8 off=0 size=16",
5743 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5744 	},
5745 	{
5746 		"map helper access to adjusted map (via const imm)",
5747 		.insns = {
5748 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5749 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5750 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5751 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5752 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5753 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5754 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5755 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2,
5756 				      offsetof(struct other_val, bar)),
5757 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5758 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5759 			BPF_EXIT_INSN(),
5760 		},
5761 		.fixup_map3 = { 3, 9 },
5762 		.result = ACCEPT,
5763 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5764 	},
5765 	{
5766 		"map helper access to adjusted map (via const imm): out-of-bound 1",
5767 		.insns = {
5768 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5769 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5770 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5771 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5772 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5773 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5774 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5775 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2,
5776 				      sizeof(struct other_val) - 4),
5777 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5778 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5779 			BPF_EXIT_INSN(),
5780 		},
5781 		.fixup_map3 = { 3, 9 },
5782 		.result = REJECT,
5783 		.errstr = "invalid access to map value, value_size=16 off=12 size=8",
5784 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5785 	},
5786 	{
5787 		"map helper access to adjusted map (via const imm): out-of-bound 2",
5788 		.insns = {
5789 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5790 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5791 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5792 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5793 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5794 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
5795 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5796 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
5797 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5798 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5799 			BPF_EXIT_INSN(),
5800 		},
5801 		.fixup_map3 = { 3, 9 },
5802 		.result = REJECT,
5803 		.errstr = "invalid access to map value, value_size=16 off=-4 size=8",
5804 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5805 	},
5806 	{
5807 		"map helper access to adjusted map (via const reg)",
5808 		.insns = {
5809 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5810 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5811 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5812 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5813 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5814 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5815 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5816 			BPF_MOV64_IMM(BPF_REG_3,
5817 				      offsetof(struct other_val, bar)),
5818 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
5819 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5820 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5821 			BPF_EXIT_INSN(),
5822 		},
5823 		.fixup_map3 = { 3, 10 },
5824 		.result = ACCEPT,
5825 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5826 	},
5827 	{
5828 		"map helper access to adjusted map (via const reg): out-of-bound 1",
5829 		.insns = {
5830 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5831 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5832 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5833 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5834 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5835 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5836 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5837 			BPF_MOV64_IMM(BPF_REG_3,
5838 				      sizeof(struct other_val) - 4),
5839 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
5840 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5841 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5842 			BPF_EXIT_INSN(),
5843 		},
5844 		.fixup_map3 = { 3, 10 },
5845 		.result = REJECT,
5846 		.errstr = "invalid access to map value, value_size=16 off=12 size=8",
5847 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5848 	},
5849 	{
5850 		"map helper access to adjusted map (via const reg): out-of-bound 2",
5851 		.insns = {
5852 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5853 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5854 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5855 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5856 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5857 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5858 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5859 			BPF_MOV64_IMM(BPF_REG_3, -4),
5860 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
5861 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5862 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5863 			BPF_EXIT_INSN(),
5864 		},
5865 		.fixup_map3 = { 3, 10 },
5866 		.result = REJECT,
5867 		.errstr = "invalid access to map value, value_size=16 off=-4 size=8",
5868 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5869 	},
5870 	{
5871 		"map helper access to adjusted map (via variable)",
5872 		.insns = {
5873 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5874 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5875 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5876 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5877 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5878 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
5879 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5880 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5881 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
5882 				    offsetof(struct other_val, bar), 4),
5883 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
5884 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5885 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5886 			BPF_EXIT_INSN(),
5887 		},
5888 		.fixup_map3 = { 3, 11 },
5889 		.result = ACCEPT,
5890 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5891 	},
5892 	{
5893 		"map helper access to adjusted map (via variable): no max check",
5894 		.insns = {
5895 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5896 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5897 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5898 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5899 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5900 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5901 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5902 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5903 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
5904 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5905 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5906 			BPF_EXIT_INSN(),
5907 		},
5908 		.fixup_map3 = { 3, 10 },
5909 		.result = REJECT,
5910 		.errstr = "R2 unbounded memory access, make sure to bounds check any array access into a map",
5911 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5912 	},
5913 	{
5914 		"map helper access to adjusted map (via variable): wrong max check",
5915 		.insns = {
5916 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5917 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5918 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5919 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5920 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5921 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
5922 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
5923 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
5924 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3,
5925 				    offsetof(struct other_val, bar) + 1, 4),
5926 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
5927 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5928 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5929 			BPF_EXIT_INSN(),
5930 		},
5931 		.fixup_map3 = { 3, 11 },
5932 		.result = REJECT,
5933 		.errstr = "invalid access to map value, value_size=16 off=9 size=8",
5934 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5935 	},
5936 	{
5937 		"map element value is preserved across register spilling",
5938 		.insns = {
5939 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5940 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5941 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5942 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5943 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5944 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
5945 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
5946 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
5947 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184),
5948 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
5949 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0),
5950 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42),
5951 			BPF_EXIT_INSN(),
5952 		},
5953 		.fixup_map2 = { 3 },
5954 		.errstr_unpriv = "R0 leaks addr",
5955 		.result = ACCEPT,
5956 		.result_unpriv = REJECT,
5957 	},
5958 	{
5959 		"map element value or null is marked on register spilling",
5960 		.insns = {
5961 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5962 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5963 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5964 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5965 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5966 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
5967 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -152),
5968 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
5969 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
5970 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0),
5971 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42),
5972 			BPF_EXIT_INSN(),
5973 		},
5974 		.fixup_map2 = { 3 },
5975 		.errstr_unpriv = "R0 leaks addr",
5976 		.result = ACCEPT,
5977 		.result_unpriv = REJECT,
5978 	},
5979 	{
5980 		"map element value store of cleared call register",
5981 		.insns = {
5982 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5983 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
5984 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
5985 			BPF_LD_MAP_FD(BPF_REG_1, 0),
5986 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
5987 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
5988 			BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
5989 			BPF_EXIT_INSN(),
5990 		},
5991 		.fixup_map2 = { 3 },
5992 		.errstr_unpriv = "R1 !read_ok",
5993 		.errstr = "R1 !read_ok",
5994 		.result = REJECT,
5995 		.result_unpriv = REJECT,
5996 	},
5997 	{
5998 		"map element value with unaligned store",
5999 		.insns = {
6000 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6001 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6002 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6003 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6004 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6005 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 17),
6006 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3),
6007 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
6008 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 43),
6009 			BPF_ST_MEM(BPF_DW, BPF_REG_0, -2, 44),
6010 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
6011 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 32),
6012 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 2, 33),
6013 			BPF_ST_MEM(BPF_DW, BPF_REG_8, -2, 34),
6014 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 5),
6015 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 22),
6016 			BPF_ST_MEM(BPF_DW, BPF_REG_8, 4, 23),
6017 			BPF_ST_MEM(BPF_DW, BPF_REG_8, -7, 24),
6018 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_8),
6019 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 3),
6020 			BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 22),
6021 			BPF_ST_MEM(BPF_DW, BPF_REG_7, 4, 23),
6022 			BPF_ST_MEM(BPF_DW, BPF_REG_7, -4, 24),
6023 			BPF_EXIT_INSN(),
6024 		},
6025 		.fixup_map2 = { 3 },
6026 		.errstr_unpriv = "R0 leaks addr",
6027 		.result = ACCEPT,
6028 		.result_unpriv = REJECT,
6029 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
6030 	},
6031 	{
6032 		"map element value with unaligned load",
6033 		.insns = {
6034 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6035 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6036 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6037 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6038 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6039 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
6040 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
6041 			BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 9),
6042 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3),
6043 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
6044 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 2),
6045 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
6046 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 0),
6047 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 2),
6048 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 5),
6049 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
6050 			BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4),
6051 			BPF_EXIT_INSN(),
6052 		},
6053 		.fixup_map2 = { 3 },
6054 		.errstr_unpriv = "R0 leaks addr",
6055 		.result = ACCEPT,
6056 		.result_unpriv = REJECT,
6057 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
6058 	},
6059 	{
6060 		"map element value illegal alu op, 1",
6061 		.insns = {
6062 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6063 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6064 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6065 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6066 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6067 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
6068 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 8),
6069 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
6070 			BPF_EXIT_INSN(),
6071 		},
6072 		.fixup_map2 = { 3 },
6073 		.errstr = "R0 bitwise operator &= on pointer",
6074 		.result = REJECT,
6075 	},
6076 	{
6077 		"map element value illegal alu op, 2",
6078 		.insns = {
6079 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6080 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6081 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6082 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6083 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6084 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
6085 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0),
6086 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
6087 			BPF_EXIT_INSN(),
6088 		},
6089 		.fixup_map2 = { 3 },
6090 		.errstr = "R0 32-bit pointer arithmetic prohibited",
6091 		.result = REJECT,
6092 	},
6093 	{
6094 		"map element value illegal alu op, 3",
6095 		.insns = {
6096 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6097 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6098 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6099 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6100 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6101 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
6102 			BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, 42),
6103 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
6104 			BPF_EXIT_INSN(),
6105 		},
6106 		.fixup_map2 = { 3 },
6107 		.errstr = "R0 pointer arithmetic with /= operator",
6108 		.result = REJECT,
6109 	},
6110 	{
6111 		"map element value illegal alu op, 4",
6112 		.insns = {
6113 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6114 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6115 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6116 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6117 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6118 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
6119 			BPF_ENDIAN(BPF_FROM_BE, BPF_REG_0, 64),
6120 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
6121 			BPF_EXIT_INSN(),
6122 		},
6123 		.fixup_map2 = { 3 },
6124 		.errstr_unpriv = "R0 pointer arithmetic prohibited",
6125 		.errstr = "invalid mem access 'inv'",
6126 		.result = REJECT,
6127 		.result_unpriv = REJECT,
6128 	},
6129 	{
6130 		"map element value illegal alu op, 5",
6131 		.insns = {
6132 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6133 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6134 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6135 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6136 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6137 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
6138 			BPF_MOV64_IMM(BPF_REG_3, 4096),
6139 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6140 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6141 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
6142 			BPF_STX_XADD(BPF_DW, BPF_REG_2, BPF_REG_3, 0),
6143 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0),
6144 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22),
6145 			BPF_EXIT_INSN(),
6146 		},
6147 		.fixup_map2 = { 3 },
6148 		.errstr = "R0 invalid mem access 'inv'",
6149 		.result = REJECT,
6150 	},
6151 	{
6152 		"map element value is preserved across register spilling",
6153 		.insns = {
6154 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6155 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6156 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6157 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6158 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6159 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
6160 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0,
6161 				offsetof(struct test_val, foo)),
6162 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
6163 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6164 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184),
6165 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
6166 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0),
6167 			BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42),
6168 			BPF_EXIT_INSN(),
6169 		},
6170 		.fixup_map2 = { 3 },
6171 		.errstr_unpriv = "R0 leaks addr",
6172 		.result = ACCEPT,
6173 		.result_unpriv = REJECT,
6174 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
6175 	},
6176 	{
6177 		"helper access to variable memory: stack, bitwise AND + JMP, correct bounds",
6178 		.insns = {
6179 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6180 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6181 			BPF_MOV64_IMM(BPF_REG_0, 0),
6182 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
6183 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
6184 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
6185 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
6186 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
6187 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
6188 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
6189 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
6190 			BPF_MOV64_IMM(BPF_REG_2, 16),
6191 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6192 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6193 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
6194 			BPF_MOV64_IMM(BPF_REG_4, 0),
6195 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
6196 			BPF_MOV64_IMM(BPF_REG_3, 0),
6197 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6198 			BPF_MOV64_IMM(BPF_REG_0, 0),
6199 			BPF_EXIT_INSN(),
6200 		},
6201 		.result = ACCEPT,
6202 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6203 	},
6204 	{
6205 		"helper access to variable memory: stack, bitwise AND, zero included",
6206 		.insns = {
6207 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6208 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6209 			BPF_MOV64_IMM(BPF_REG_2, 16),
6210 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6211 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6212 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
6213 			BPF_MOV64_IMM(BPF_REG_3, 0),
6214 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6215 			BPF_EXIT_INSN(),
6216 		},
6217 		.errstr = "invalid indirect read from stack off -64+0 size 64",
6218 		.result = REJECT,
6219 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6220 	},
6221 	{
6222 		"helper access to variable memory: stack, bitwise AND + JMP, wrong max",
6223 		.insns = {
6224 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6225 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6226 			BPF_MOV64_IMM(BPF_REG_2, 16),
6227 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6228 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6229 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65),
6230 			BPF_MOV64_IMM(BPF_REG_4, 0),
6231 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
6232 			BPF_MOV64_IMM(BPF_REG_3, 0),
6233 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6234 			BPF_MOV64_IMM(BPF_REG_0, 0),
6235 			BPF_EXIT_INSN(),
6236 		},
6237 		.errstr = "invalid stack type R1 off=-64 access_size=65",
6238 		.result = REJECT,
6239 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6240 	},
6241 	{
6242 		"helper access to variable memory: stack, JMP, correct bounds",
6243 		.insns = {
6244 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6245 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6246 			BPF_MOV64_IMM(BPF_REG_0, 0),
6247 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
6248 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
6249 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
6250 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
6251 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
6252 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
6253 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
6254 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
6255 			BPF_MOV64_IMM(BPF_REG_2, 16),
6256 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6257 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6258 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4),
6259 			BPF_MOV64_IMM(BPF_REG_4, 0),
6260 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
6261 			BPF_MOV64_IMM(BPF_REG_3, 0),
6262 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6263 			BPF_MOV64_IMM(BPF_REG_0, 0),
6264 			BPF_EXIT_INSN(),
6265 		},
6266 		.result = ACCEPT,
6267 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6268 	},
6269 	{
6270 		"helper access to variable memory: stack, JMP (signed), correct bounds",
6271 		.insns = {
6272 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6273 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6274 			BPF_MOV64_IMM(BPF_REG_0, 0),
6275 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
6276 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
6277 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
6278 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
6279 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
6280 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
6281 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
6282 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
6283 			BPF_MOV64_IMM(BPF_REG_2, 16),
6284 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6285 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6286 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4),
6287 			BPF_MOV64_IMM(BPF_REG_4, 0),
6288 			BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
6289 			BPF_MOV64_IMM(BPF_REG_3, 0),
6290 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6291 			BPF_MOV64_IMM(BPF_REG_0, 0),
6292 			BPF_EXIT_INSN(),
6293 		},
6294 		.result = ACCEPT,
6295 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6296 	},
6297 	{
6298 		"helper access to variable memory: stack, JMP, bounds + offset",
6299 		.insns = {
6300 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6301 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6302 			BPF_MOV64_IMM(BPF_REG_2, 16),
6303 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6304 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6305 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5),
6306 			BPF_MOV64_IMM(BPF_REG_4, 0),
6307 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3),
6308 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
6309 			BPF_MOV64_IMM(BPF_REG_3, 0),
6310 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6311 			BPF_MOV64_IMM(BPF_REG_0, 0),
6312 			BPF_EXIT_INSN(),
6313 		},
6314 		.errstr = "invalid stack type R1 off=-64 access_size=65",
6315 		.result = REJECT,
6316 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6317 	},
6318 	{
6319 		"helper access to variable memory: stack, JMP, wrong max",
6320 		.insns = {
6321 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6322 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6323 			BPF_MOV64_IMM(BPF_REG_2, 16),
6324 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6325 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6326 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4),
6327 			BPF_MOV64_IMM(BPF_REG_4, 0),
6328 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
6329 			BPF_MOV64_IMM(BPF_REG_3, 0),
6330 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6331 			BPF_MOV64_IMM(BPF_REG_0, 0),
6332 			BPF_EXIT_INSN(),
6333 		},
6334 		.errstr = "invalid stack type R1 off=-64 access_size=65",
6335 		.result = REJECT,
6336 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6337 	},
6338 	{
6339 		"helper access to variable memory: stack, JMP, no max check",
6340 		.insns = {
6341 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6342 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6343 			BPF_MOV64_IMM(BPF_REG_2, 16),
6344 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6345 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6346 			BPF_MOV64_IMM(BPF_REG_4, 0),
6347 			BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
6348 			BPF_MOV64_IMM(BPF_REG_3, 0),
6349 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6350 			BPF_MOV64_IMM(BPF_REG_0, 0),
6351 			BPF_EXIT_INSN(),
6352 		},
6353 		/* because max wasn't checked, signed min is negative */
6354 		.errstr = "R2 min value is negative, either use unsigned or 'var &= const'",
6355 		.result = REJECT,
6356 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6357 	},
6358 	{
6359 		"helper access to variable memory: stack, JMP, no min check",
6360 		.insns = {
6361 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6362 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6363 			BPF_MOV64_IMM(BPF_REG_2, 16),
6364 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6365 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6366 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3),
6367 			BPF_MOV64_IMM(BPF_REG_3, 0),
6368 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6369 			BPF_MOV64_IMM(BPF_REG_0, 0),
6370 			BPF_EXIT_INSN(),
6371 		},
6372 		.errstr = "invalid indirect read from stack off -64+0 size 64",
6373 		.result = REJECT,
6374 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6375 	},
6376 	{
6377 		"helper access to variable memory: stack, JMP (signed), no min check",
6378 		.insns = {
6379 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6380 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6381 			BPF_MOV64_IMM(BPF_REG_2, 16),
6382 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
6383 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
6384 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3),
6385 			BPF_MOV64_IMM(BPF_REG_3, 0),
6386 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6387 			BPF_MOV64_IMM(BPF_REG_0, 0),
6388 			BPF_EXIT_INSN(),
6389 		},
6390 		.errstr = "R2 min value is negative",
6391 		.result = REJECT,
6392 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6393 	},
6394 	{
6395 		"helper access to variable memory: map, JMP, correct bounds",
6396 		.insns = {
6397 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6398 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6399 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6400 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6401 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6402 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
6403 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6404 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
6405 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
6406 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
6407 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
6408 				sizeof(struct test_val), 4),
6409 			BPF_MOV64_IMM(BPF_REG_4, 0),
6410 			BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
6411 			BPF_MOV64_IMM(BPF_REG_3, 0),
6412 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6413 			BPF_MOV64_IMM(BPF_REG_0, 0),
6414 			BPF_EXIT_INSN(),
6415 		},
6416 		.fixup_map2 = { 3 },
6417 		.result = ACCEPT,
6418 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6419 	},
6420 	{
6421 		"helper access to variable memory: map, JMP, wrong max",
6422 		.insns = {
6423 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6424 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6425 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6426 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6427 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6428 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
6429 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6430 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
6431 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
6432 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
6433 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
6434 				sizeof(struct test_val) + 1, 4),
6435 			BPF_MOV64_IMM(BPF_REG_4, 0),
6436 			BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
6437 			BPF_MOV64_IMM(BPF_REG_3, 0),
6438 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6439 			BPF_MOV64_IMM(BPF_REG_0, 0),
6440 			BPF_EXIT_INSN(),
6441 		},
6442 		.fixup_map2 = { 3 },
6443 		.errstr = "invalid access to map value, value_size=48 off=0 size=49",
6444 		.result = REJECT,
6445 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6446 	},
6447 	{
6448 		"helper access to variable memory: map adjusted, JMP, correct bounds",
6449 		.insns = {
6450 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6451 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6452 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6453 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6454 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6455 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
6456 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6457 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
6458 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
6459 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
6460 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
6461 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
6462 				sizeof(struct test_val) - 20, 4),
6463 			BPF_MOV64_IMM(BPF_REG_4, 0),
6464 			BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
6465 			BPF_MOV64_IMM(BPF_REG_3, 0),
6466 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6467 			BPF_MOV64_IMM(BPF_REG_0, 0),
6468 			BPF_EXIT_INSN(),
6469 		},
6470 		.fixup_map2 = { 3 },
6471 		.result = ACCEPT,
6472 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6473 	},
6474 	{
6475 		"helper access to variable memory: map adjusted, JMP, wrong max",
6476 		.insns = {
6477 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6478 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6479 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
6480 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6481 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6482 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
6483 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6484 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
6485 			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
6486 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
6487 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
6488 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
6489 				sizeof(struct test_val) - 19, 4),
6490 			BPF_MOV64_IMM(BPF_REG_4, 0),
6491 			BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
6492 			BPF_MOV64_IMM(BPF_REG_3, 0),
6493 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6494 			BPF_MOV64_IMM(BPF_REG_0, 0),
6495 			BPF_EXIT_INSN(),
6496 		},
6497 		.fixup_map2 = { 3 },
6498 		.errstr = "R1 min value is outside of the array range",
6499 		.result = REJECT,
6500 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6501 	},
6502 	{
6503 		"helper access to variable memory: size = 0 allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)",
6504 		.insns = {
6505 			BPF_MOV64_IMM(BPF_REG_1, 0),
6506 			BPF_MOV64_IMM(BPF_REG_2, 0),
6507 			BPF_MOV64_IMM(BPF_REG_3, 0),
6508 			BPF_MOV64_IMM(BPF_REG_4, 0),
6509 			BPF_MOV64_IMM(BPF_REG_5, 0),
6510 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6511 			BPF_EXIT_INSN(),
6512 		},
6513 		.result = ACCEPT,
6514 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6515 	},
6516 	{
6517 		"helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)",
6518 		.insns = {
6519 			BPF_MOV64_IMM(BPF_REG_1, 0),
6520 			BPF_MOV64_IMM(BPF_REG_2, 1),
6521 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
6522 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
6523 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
6524 			BPF_MOV64_IMM(BPF_REG_3, 0),
6525 			BPF_MOV64_IMM(BPF_REG_4, 0),
6526 			BPF_MOV64_IMM(BPF_REG_5, 0),
6527 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6528 			BPF_EXIT_INSN(),
6529 		},
6530 		.errstr = "R1 type=inv expected=fp",
6531 		.result = REJECT,
6532 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6533 	},
6534 	{
6535 		"helper access to variable memory: size = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)",
6536 		.insns = {
6537 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6538 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
6539 			BPF_MOV64_IMM(BPF_REG_2, 0),
6540 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0),
6541 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8),
6542 			BPF_MOV64_IMM(BPF_REG_3, 0),
6543 			BPF_MOV64_IMM(BPF_REG_4, 0),
6544 			BPF_MOV64_IMM(BPF_REG_5, 0),
6545 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6546 			BPF_EXIT_INSN(),
6547 		},
6548 		.result = ACCEPT,
6549 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6550 	},
6551 	{
6552 		"helper access to variable memory: size = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)",
6553 		.insns = {
6554 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6555 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6556 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6557 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6558 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6559 				     BPF_FUNC_map_lookup_elem),
6560 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
6561 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6562 			BPF_MOV64_IMM(BPF_REG_2, 0),
6563 			BPF_MOV64_IMM(BPF_REG_3, 0),
6564 			BPF_MOV64_IMM(BPF_REG_4, 0),
6565 			BPF_MOV64_IMM(BPF_REG_5, 0),
6566 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6567 			BPF_EXIT_INSN(),
6568 		},
6569 		.fixup_map1 = { 3 },
6570 		.result = ACCEPT,
6571 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6572 	},
6573 	{
6574 		"helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)",
6575 		.insns = {
6576 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6577 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6578 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6579 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6580 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6581 				     BPF_FUNC_map_lookup_elem),
6582 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
6583 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
6584 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 7),
6585 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6586 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
6587 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0),
6588 			BPF_MOV64_IMM(BPF_REG_3, 0),
6589 			BPF_MOV64_IMM(BPF_REG_4, 0),
6590 			BPF_MOV64_IMM(BPF_REG_5, 0),
6591 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6592 			BPF_EXIT_INSN(),
6593 		},
6594 		.fixup_map1 = { 3 },
6595 		.result = ACCEPT,
6596 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6597 	},
6598 	{
6599 		"helper access to variable memory: size possible = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)",
6600 		.insns = {
6601 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6602 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6603 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6604 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6605 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6606 				     BPF_FUNC_map_lookup_elem),
6607 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
6608 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6609 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
6610 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4),
6611 			BPF_MOV64_IMM(BPF_REG_3, 0),
6612 			BPF_MOV64_IMM(BPF_REG_4, 0),
6613 			BPF_MOV64_IMM(BPF_REG_5, 0),
6614 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6615 			BPF_EXIT_INSN(),
6616 		},
6617 		.fixup_map1 = { 3 },
6618 		.result = ACCEPT,
6619 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6620 	},
6621 	{
6622 		"helper access to variable memory: size possible = 0 allowed on != NULL packet pointer (ARG_PTR_TO_MEM_OR_NULL)",
6623 		.insns = {
6624 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
6625 				    offsetof(struct __sk_buff, data)),
6626 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
6627 				    offsetof(struct __sk_buff, data_end)),
6628 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_6),
6629 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
6630 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7),
6631 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
6632 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0),
6633 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4),
6634 			BPF_MOV64_IMM(BPF_REG_3, 0),
6635 			BPF_MOV64_IMM(BPF_REG_4, 0),
6636 			BPF_MOV64_IMM(BPF_REG_5, 0),
6637 			BPF_EMIT_CALL(BPF_FUNC_csum_diff),
6638 			BPF_EXIT_INSN(),
6639 		},
6640 		.result = ACCEPT,
6641 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6642 		.retval = 0 /* csum_diff of 64-byte packet */,
6643 	},
6644 	{
6645 		"helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)",
6646 		.insns = {
6647 			BPF_MOV64_IMM(BPF_REG_1, 0),
6648 			BPF_MOV64_IMM(BPF_REG_2, 0),
6649 			BPF_MOV64_IMM(BPF_REG_3, 0),
6650 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6651 			BPF_EXIT_INSN(),
6652 		},
6653 		.errstr = "R1 type=inv expected=fp",
6654 		.result = REJECT,
6655 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6656 	},
6657 	{
6658 		"helper access to variable memory: size > 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)",
6659 		.insns = {
6660 			BPF_MOV64_IMM(BPF_REG_1, 0),
6661 			BPF_MOV64_IMM(BPF_REG_2, 1),
6662 			BPF_MOV64_IMM(BPF_REG_3, 0),
6663 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6664 			BPF_EXIT_INSN(),
6665 		},
6666 		.errstr = "R1 type=inv expected=fp",
6667 		.result = REJECT,
6668 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6669 	},
6670 	{
6671 		"helper access to variable memory: size = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)",
6672 		.insns = {
6673 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6674 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
6675 			BPF_MOV64_IMM(BPF_REG_2, 0),
6676 			BPF_MOV64_IMM(BPF_REG_3, 0),
6677 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6678 			BPF_EXIT_INSN(),
6679 		},
6680 		.result = ACCEPT,
6681 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6682 	},
6683 	{
6684 		"helper access to variable memory: size = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)",
6685 		.insns = {
6686 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6687 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6688 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6689 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6690 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6691 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
6692 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6693 			BPF_MOV64_IMM(BPF_REG_2, 0),
6694 			BPF_MOV64_IMM(BPF_REG_3, 0),
6695 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6696 			BPF_EXIT_INSN(),
6697 		},
6698 		.fixup_map1 = { 3 },
6699 		.result = ACCEPT,
6700 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6701 	},
6702 	{
6703 		"helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)",
6704 		.insns = {
6705 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6706 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6707 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6708 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6709 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6710 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
6711 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
6712 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4),
6713 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6714 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
6715 			BPF_MOV64_IMM(BPF_REG_3, 0),
6716 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6717 			BPF_EXIT_INSN(),
6718 		},
6719 		.fixup_map1 = { 3 },
6720 		.result = ACCEPT,
6721 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6722 	},
6723 	{
6724 		"helper access to variable memory: size possible = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)",
6725 		.insns = {
6726 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6727 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6728 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6729 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6730 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
6731 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
6732 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6733 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
6734 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 2),
6735 			BPF_MOV64_IMM(BPF_REG_3, 0),
6736 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6737 			BPF_EXIT_INSN(),
6738 		},
6739 		.fixup_map1 = { 3 },
6740 		.result = ACCEPT,
6741 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6742 	},
6743 	{
6744 		"helper access to variable memory: 8 bytes leak",
6745 		.insns = {
6746 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6747 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6748 			BPF_MOV64_IMM(BPF_REG_0, 0),
6749 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
6750 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
6751 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
6752 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
6753 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
6754 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
6755 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
6756 			BPF_MOV64_IMM(BPF_REG_2, 1),
6757 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
6758 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
6759 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63),
6760 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
6761 			BPF_MOV64_IMM(BPF_REG_3, 0),
6762 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6763 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
6764 			BPF_EXIT_INSN(),
6765 		},
6766 		.errstr = "invalid indirect read from stack off -64+32 size 64",
6767 		.result = REJECT,
6768 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6769 	},
6770 	{
6771 		"helper access to variable memory: 8 bytes no leak (init memory)",
6772 		.insns = {
6773 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6774 			BPF_MOV64_IMM(BPF_REG_0, 0),
6775 			BPF_MOV64_IMM(BPF_REG_0, 0),
6776 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
6777 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
6778 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
6779 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
6780 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
6781 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
6782 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
6783 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
6784 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6785 			BPF_MOV64_IMM(BPF_REG_2, 0),
6786 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32),
6787 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32),
6788 			BPF_MOV64_IMM(BPF_REG_3, 0),
6789 			BPF_EMIT_CALL(BPF_FUNC_probe_read),
6790 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
6791 			BPF_EXIT_INSN(),
6792 		},
6793 		.result = ACCEPT,
6794 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6795 	},
6796 	{
6797 		"invalid and of negative number",
6798 		.insns = {
6799 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6800 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6801 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6802 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6803 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6804 				     BPF_FUNC_map_lookup_elem),
6805 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
6806 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
6807 			BPF_ALU64_IMM(BPF_AND, BPF_REG_1, -4),
6808 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
6809 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
6810 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
6811 				   offsetof(struct test_val, foo)),
6812 			BPF_EXIT_INSN(),
6813 		},
6814 		.fixup_map2 = { 3 },
6815 		.errstr = "R0 max value is outside of the array range",
6816 		.result = REJECT,
6817 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
6818 	},
6819 	{
6820 		"invalid range check",
6821 		.insns = {
6822 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6823 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6824 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6825 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6826 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6827 				     BPF_FUNC_map_lookup_elem),
6828 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 12),
6829 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
6830 			BPF_MOV64_IMM(BPF_REG_9, 1),
6831 			BPF_ALU32_IMM(BPF_MOD, BPF_REG_1, 2),
6832 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1),
6833 			BPF_ALU32_REG(BPF_AND, BPF_REG_9, BPF_REG_1),
6834 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_9, 1),
6835 			BPF_ALU32_IMM(BPF_RSH, BPF_REG_9, 1),
6836 			BPF_MOV32_IMM(BPF_REG_3, 1),
6837 			BPF_ALU32_REG(BPF_SUB, BPF_REG_3, BPF_REG_9),
6838 			BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0x10000000),
6839 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
6840 			BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_3, 0),
6841 			BPF_MOV64_REG(BPF_REG_0, 0),
6842 			BPF_EXIT_INSN(),
6843 		},
6844 		.fixup_map2 = { 3 },
6845 		.errstr = "R0 max value is outside of the array range",
6846 		.result = REJECT,
6847 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
6848 	},
6849 	{
6850 		"map in map access",
6851 		.insns = {
6852 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
6853 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6854 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
6855 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6856 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6857 				     BPF_FUNC_map_lookup_elem),
6858 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
6859 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
6860 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6861 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
6862 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6863 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6864 				     BPF_FUNC_map_lookup_elem),
6865 			BPF_MOV64_REG(BPF_REG_0, 0),
6866 			BPF_EXIT_INSN(),
6867 		},
6868 		.fixup_map_in_map = { 3 },
6869 		.result = ACCEPT,
6870 	},
6871 	{
6872 		"invalid inner map pointer",
6873 		.insns = {
6874 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
6875 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6876 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
6877 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6878 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6879 				     BPF_FUNC_map_lookup_elem),
6880 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
6881 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
6882 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6883 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
6884 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6885 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
6886 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6887 				     BPF_FUNC_map_lookup_elem),
6888 			BPF_MOV64_REG(BPF_REG_0, 0),
6889 			BPF_EXIT_INSN(),
6890 		},
6891 		.fixup_map_in_map = { 3 },
6892 		.errstr = "R1 pointer arithmetic on CONST_PTR_TO_MAP prohibited",
6893 		.result = REJECT,
6894 	},
6895 	{
6896 		"forgot null checking on the inner map pointer",
6897 		.insns = {
6898 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
6899 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6900 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
6901 			BPF_LD_MAP_FD(BPF_REG_1, 0),
6902 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6903 				     BPF_FUNC_map_lookup_elem),
6904 			BPF_ST_MEM(0, BPF_REG_10, -4, 0),
6905 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6906 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
6907 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
6908 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
6909 				     BPF_FUNC_map_lookup_elem),
6910 			BPF_MOV64_REG(BPF_REG_0, 0),
6911 			BPF_EXIT_INSN(),
6912 		},
6913 		.fixup_map_in_map = { 3 },
6914 		.errstr = "R1 type=map_value_or_null expected=map_ptr",
6915 		.result = REJECT,
6916 	},
6917 	{
6918 		"ld_abs: check calling conv, r1",
6919 		.insns = {
6920 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6921 			BPF_MOV64_IMM(BPF_REG_1, 0),
6922 			BPF_LD_ABS(BPF_W, -0x200000),
6923 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
6924 			BPF_EXIT_INSN(),
6925 		},
6926 		.errstr = "R1 !read_ok",
6927 		.result = REJECT,
6928 	},
6929 	{
6930 		"ld_abs: check calling conv, r2",
6931 		.insns = {
6932 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6933 			BPF_MOV64_IMM(BPF_REG_2, 0),
6934 			BPF_LD_ABS(BPF_W, -0x200000),
6935 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
6936 			BPF_EXIT_INSN(),
6937 		},
6938 		.errstr = "R2 !read_ok",
6939 		.result = REJECT,
6940 	},
6941 	{
6942 		"ld_abs: check calling conv, r3",
6943 		.insns = {
6944 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6945 			BPF_MOV64_IMM(BPF_REG_3, 0),
6946 			BPF_LD_ABS(BPF_W, -0x200000),
6947 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
6948 			BPF_EXIT_INSN(),
6949 		},
6950 		.errstr = "R3 !read_ok",
6951 		.result = REJECT,
6952 	},
6953 	{
6954 		"ld_abs: check calling conv, r4",
6955 		.insns = {
6956 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6957 			BPF_MOV64_IMM(BPF_REG_4, 0),
6958 			BPF_LD_ABS(BPF_W, -0x200000),
6959 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
6960 			BPF_EXIT_INSN(),
6961 		},
6962 		.errstr = "R4 !read_ok",
6963 		.result = REJECT,
6964 	},
6965 	{
6966 		"ld_abs: check calling conv, r5",
6967 		.insns = {
6968 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6969 			BPF_MOV64_IMM(BPF_REG_5, 0),
6970 			BPF_LD_ABS(BPF_W, -0x200000),
6971 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
6972 			BPF_EXIT_INSN(),
6973 		},
6974 		.errstr = "R5 !read_ok",
6975 		.result = REJECT,
6976 	},
6977 	{
6978 		"ld_abs: check calling conv, r7",
6979 		.insns = {
6980 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6981 			BPF_MOV64_IMM(BPF_REG_7, 0),
6982 			BPF_LD_ABS(BPF_W, -0x200000),
6983 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
6984 			BPF_EXIT_INSN(),
6985 		},
6986 		.result = ACCEPT,
6987 	},
6988 	{
6989 		"ld_abs: tests on r6 and skb data reload helper",
6990 		.insns = {
6991 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6992 			BPF_LD_ABS(BPF_B, 0),
6993 			BPF_LD_ABS(BPF_H, 0),
6994 			BPF_LD_ABS(BPF_W, 0),
6995 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
6996 			BPF_MOV64_IMM(BPF_REG_6, 0),
6997 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
6998 			BPF_MOV64_IMM(BPF_REG_2, 1),
6999 			BPF_MOV64_IMM(BPF_REG_3, 2),
7000 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7001 				     BPF_FUNC_skb_vlan_push),
7002 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
7003 			BPF_LD_ABS(BPF_B, 0),
7004 			BPF_LD_ABS(BPF_H, 0),
7005 			BPF_LD_ABS(BPF_W, 0),
7006 			BPF_MOV64_IMM(BPF_REG_0, 42),
7007 			BPF_EXIT_INSN(),
7008 		},
7009 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
7010 		.result = ACCEPT,
7011 		.retval = 42 /* ultimate return value */,
7012 	},
7013 	{
7014 		"ld_ind: check calling conv, r1",
7015 		.insns = {
7016 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7017 			BPF_MOV64_IMM(BPF_REG_1, 1),
7018 			BPF_LD_IND(BPF_W, BPF_REG_1, -0x200000),
7019 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
7020 			BPF_EXIT_INSN(),
7021 		},
7022 		.errstr = "R1 !read_ok",
7023 		.result = REJECT,
7024 	},
7025 	{
7026 		"ld_ind: check calling conv, r2",
7027 		.insns = {
7028 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7029 			BPF_MOV64_IMM(BPF_REG_2, 1),
7030 			BPF_LD_IND(BPF_W, BPF_REG_2, -0x200000),
7031 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
7032 			BPF_EXIT_INSN(),
7033 		},
7034 		.errstr = "R2 !read_ok",
7035 		.result = REJECT,
7036 	},
7037 	{
7038 		"ld_ind: check calling conv, r3",
7039 		.insns = {
7040 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7041 			BPF_MOV64_IMM(BPF_REG_3, 1),
7042 			BPF_LD_IND(BPF_W, BPF_REG_3, -0x200000),
7043 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
7044 			BPF_EXIT_INSN(),
7045 		},
7046 		.errstr = "R3 !read_ok",
7047 		.result = REJECT,
7048 	},
7049 	{
7050 		"ld_ind: check calling conv, r4",
7051 		.insns = {
7052 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7053 			BPF_MOV64_IMM(BPF_REG_4, 1),
7054 			BPF_LD_IND(BPF_W, BPF_REG_4, -0x200000),
7055 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
7056 			BPF_EXIT_INSN(),
7057 		},
7058 		.errstr = "R4 !read_ok",
7059 		.result = REJECT,
7060 	},
7061 	{
7062 		"ld_ind: check calling conv, r5",
7063 		.insns = {
7064 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7065 			BPF_MOV64_IMM(BPF_REG_5, 1),
7066 			BPF_LD_IND(BPF_W, BPF_REG_5, -0x200000),
7067 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
7068 			BPF_EXIT_INSN(),
7069 		},
7070 		.errstr = "R5 !read_ok",
7071 		.result = REJECT,
7072 	},
7073 	{
7074 		"ld_ind: check calling conv, r7",
7075 		.insns = {
7076 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7077 			BPF_MOV64_IMM(BPF_REG_7, 1),
7078 			BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000),
7079 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
7080 			BPF_EXIT_INSN(),
7081 		},
7082 		.result = ACCEPT,
7083 		.retval = 1,
7084 	},
7085 	{
7086 		"check bpf_perf_event_data->sample_period byte load permitted",
7087 		.insns = {
7088 			BPF_MOV64_IMM(BPF_REG_0, 0),
7089 #if __BYTE_ORDER == __LITTLE_ENDIAN
7090 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
7091 				    offsetof(struct bpf_perf_event_data, sample_period)),
7092 #else
7093 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
7094 				    offsetof(struct bpf_perf_event_data, sample_period) + 7),
7095 #endif
7096 			BPF_EXIT_INSN(),
7097 		},
7098 		.result = ACCEPT,
7099 		.prog_type = BPF_PROG_TYPE_PERF_EVENT,
7100 	},
7101 	{
7102 		"check bpf_perf_event_data->sample_period half load permitted",
7103 		.insns = {
7104 			BPF_MOV64_IMM(BPF_REG_0, 0),
7105 #if __BYTE_ORDER == __LITTLE_ENDIAN
7106 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
7107 				    offsetof(struct bpf_perf_event_data, sample_period)),
7108 #else
7109 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
7110 				    offsetof(struct bpf_perf_event_data, sample_period) + 6),
7111 #endif
7112 			BPF_EXIT_INSN(),
7113 		},
7114 		.result = ACCEPT,
7115 		.prog_type = BPF_PROG_TYPE_PERF_EVENT,
7116 	},
7117 	{
7118 		"check bpf_perf_event_data->sample_period word load permitted",
7119 		.insns = {
7120 			BPF_MOV64_IMM(BPF_REG_0, 0),
7121 #if __BYTE_ORDER == __LITTLE_ENDIAN
7122 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
7123 				    offsetof(struct bpf_perf_event_data, sample_period)),
7124 #else
7125 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
7126 				    offsetof(struct bpf_perf_event_data, sample_period) + 4),
7127 #endif
7128 			BPF_EXIT_INSN(),
7129 		},
7130 		.result = ACCEPT,
7131 		.prog_type = BPF_PROG_TYPE_PERF_EVENT,
7132 	},
7133 	{
7134 		"check bpf_perf_event_data->sample_period dword load permitted",
7135 		.insns = {
7136 			BPF_MOV64_IMM(BPF_REG_0, 0),
7137 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
7138 				    offsetof(struct bpf_perf_event_data, sample_period)),
7139 			BPF_EXIT_INSN(),
7140 		},
7141 		.result = ACCEPT,
7142 		.prog_type = BPF_PROG_TYPE_PERF_EVENT,
7143 	},
7144 	{
7145 		"check skb->data half load not permitted",
7146 		.insns = {
7147 			BPF_MOV64_IMM(BPF_REG_0, 0),
7148 #if __BYTE_ORDER == __LITTLE_ENDIAN
7149 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
7150 				    offsetof(struct __sk_buff, data)),
7151 #else
7152 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
7153 				    offsetof(struct __sk_buff, data) + 2),
7154 #endif
7155 			BPF_EXIT_INSN(),
7156 		},
7157 		.result = REJECT,
7158 		.errstr = "invalid bpf_context access",
7159 	},
7160 	{
7161 		"check skb->tc_classid half load not permitted for lwt prog",
7162 		.insns = {
7163 			BPF_MOV64_IMM(BPF_REG_0, 0),
7164 #if __BYTE_ORDER == __LITTLE_ENDIAN
7165 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
7166 				    offsetof(struct __sk_buff, tc_classid)),
7167 #else
7168 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
7169 				    offsetof(struct __sk_buff, tc_classid) + 2),
7170 #endif
7171 			BPF_EXIT_INSN(),
7172 		},
7173 		.result = REJECT,
7174 		.errstr = "invalid bpf_context access",
7175 		.prog_type = BPF_PROG_TYPE_LWT_IN,
7176 	},
7177 	{
7178 		"bounds checks mixing signed and unsigned, positive bounds",
7179 		.insns = {
7180 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7181 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7182 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7183 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7184 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7185 				     BPF_FUNC_map_lookup_elem),
7186 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
7187 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7188 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7189 			BPF_MOV64_IMM(BPF_REG_2, 2),
7190 			BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 3),
7191 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 4, 2),
7192 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7193 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7194 			BPF_MOV64_IMM(BPF_REG_0, 0),
7195 			BPF_EXIT_INSN(),
7196 		},
7197 		.fixup_map1 = { 3 },
7198 		.errstr = "unbounded min value",
7199 		.result = REJECT,
7200 	},
7201 	{
7202 		"bounds checks mixing signed and unsigned",
7203 		.insns = {
7204 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7205 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7206 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7207 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7208 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7209 				     BPF_FUNC_map_lookup_elem),
7210 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
7211 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7212 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7213 			BPF_MOV64_IMM(BPF_REG_2, -1),
7214 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3),
7215 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7216 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7217 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7218 			BPF_MOV64_IMM(BPF_REG_0, 0),
7219 			BPF_EXIT_INSN(),
7220 		},
7221 		.fixup_map1 = { 3 },
7222 		.errstr = "unbounded min value",
7223 		.result = REJECT,
7224 	},
7225 	{
7226 		"bounds checks mixing signed and unsigned, variant 2",
7227 		.insns = {
7228 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7229 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7230 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7231 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7232 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7233 				     BPF_FUNC_map_lookup_elem),
7234 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7235 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7236 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7237 			BPF_MOV64_IMM(BPF_REG_2, -1),
7238 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5),
7239 			BPF_MOV64_IMM(BPF_REG_8, 0),
7240 			BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_1),
7241 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2),
7242 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8),
7243 			BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
7244 			BPF_MOV64_IMM(BPF_REG_0, 0),
7245 			BPF_EXIT_INSN(),
7246 		},
7247 		.fixup_map1 = { 3 },
7248 		.errstr = "unbounded min value",
7249 		.result = REJECT,
7250 	},
7251 	{
7252 		"bounds checks mixing signed and unsigned, variant 3",
7253 		.insns = {
7254 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7255 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7256 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7257 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7258 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7259 				     BPF_FUNC_map_lookup_elem),
7260 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
7261 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7262 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7263 			BPF_MOV64_IMM(BPF_REG_2, -1),
7264 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 4),
7265 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
7266 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2),
7267 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8),
7268 			BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
7269 			BPF_MOV64_IMM(BPF_REG_0, 0),
7270 			BPF_EXIT_INSN(),
7271 		},
7272 		.fixup_map1 = { 3 },
7273 		.errstr = "unbounded min value",
7274 		.result = REJECT,
7275 	},
7276 	{
7277 		"bounds checks mixing signed and unsigned, variant 4",
7278 		.insns = {
7279 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7280 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7281 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7282 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7283 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7284 				     BPF_FUNC_map_lookup_elem),
7285 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
7286 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7287 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7288 			BPF_MOV64_IMM(BPF_REG_2, 1),
7289 			BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2),
7290 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7291 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7292 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7293 			BPF_MOV64_IMM(BPF_REG_0, 0),
7294 			BPF_EXIT_INSN(),
7295 		},
7296 		.fixup_map1 = { 3 },
7297 		.result = ACCEPT,
7298 	},
7299 	{
7300 		"bounds checks mixing signed and unsigned, variant 5",
7301 		.insns = {
7302 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7303 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7304 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7305 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7306 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7307 				     BPF_FUNC_map_lookup_elem),
7308 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7309 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7310 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7311 			BPF_MOV64_IMM(BPF_REG_2, -1),
7312 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5),
7313 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 4),
7314 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 4),
7315 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
7316 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7317 			BPF_MOV64_IMM(BPF_REG_0, 0),
7318 			BPF_EXIT_INSN(),
7319 		},
7320 		.fixup_map1 = { 3 },
7321 		.errstr = "unbounded min value",
7322 		.result = REJECT,
7323 	},
7324 	{
7325 		"bounds checks mixing signed and unsigned, variant 6",
7326 		.insns = {
7327 			BPF_MOV64_IMM(BPF_REG_2, 0),
7328 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
7329 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -512),
7330 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7331 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -16),
7332 			BPF_MOV64_IMM(BPF_REG_6, -1),
7333 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_6, 5),
7334 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_4, 1, 4),
7335 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1),
7336 			BPF_MOV64_IMM(BPF_REG_5, 0),
7337 			BPF_ST_MEM(BPF_H, BPF_REG_10, -512, 0),
7338 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7339 				     BPF_FUNC_skb_load_bytes),
7340 			BPF_MOV64_IMM(BPF_REG_0, 0),
7341 			BPF_EXIT_INSN(),
7342 		},
7343 		.errstr = "R4 min value is negative, either use unsigned",
7344 		.result = REJECT,
7345 	},
7346 	{
7347 		"bounds checks mixing signed and unsigned, variant 7",
7348 		.insns = {
7349 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7350 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7351 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7352 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7353 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7354 				     BPF_FUNC_map_lookup_elem),
7355 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
7356 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7357 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7358 			BPF_MOV64_IMM(BPF_REG_2, 1024 * 1024 * 1024),
7359 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3),
7360 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7361 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7362 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7363 			BPF_MOV64_IMM(BPF_REG_0, 0),
7364 			BPF_EXIT_INSN(),
7365 		},
7366 		.fixup_map1 = { 3 },
7367 		.result = ACCEPT,
7368 	},
7369 	{
7370 		"bounds checks mixing signed and unsigned, variant 8",
7371 		.insns = {
7372 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7373 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7374 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7375 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7376 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7377 				     BPF_FUNC_map_lookup_elem),
7378 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7379 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7380 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7381 			BPF_MOV64_IMM(BPF_REG_2, -1),
7382 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2),
7383 			BPF_MOV64_IMM(BPF_REG_0, 0),
7384 			BPF_EXIT_INSN(),
7385 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7386 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7387 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7388 			BPF_MOV64_IMM(BPF_REG_0, 0),
7389 			BPF_EXIT_INSN(),
7390 		},
7391 		.fixup_map1 = { 3 },
7392 		.errstr = "unbounded min value",
7393 		.result = REJECT,
7394 	},
7395 	{
7396 		"bounds checks mixing signed and unsigned, variant 9",
7397 		.insns = {
7398 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7399 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7400 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7401 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7402 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7403 				     BPF_FUNC_map_lookup_elem),
7404 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
7405 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7406 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7407 			BPF_LD_IMM64(BPF_REG_2, -9223372036854775808ULL),
7408 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2),
7409 			BPF_MOV64_IMM(BPF_REG_0, 0),
7410 			BPF_EXIT_INSN(),
7411 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7412 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7413 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7414 			BPF_MOV64_IMM(BPF_REG_0, 0),
7415 			BPF_EXIT_INSN(),
7416 		},
7417 		.fixup_map1 = { 3 },
7418 		.result = ACCEPT,
7419 	},
7420 	{
7421 		"bounds checks mixing signed and unsigned, variant 10",
7422 		.insns = {
7423 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7424 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7425 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7426 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7427 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7428 				     BPF_FUNC_map_lookup_elem),
7429 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7430 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7431 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7432 			BPF_MOV64_IMM(BPF_REG_2, 0),
7433 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2),
7434 			BPF_MOV64_IMM(BPF_REG_0, 0),
7435 			BPF_EXIT_INSN(),
7436 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7437 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7438 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7439 			BPF_MOV64_IMM(BPF_REG_0, 0),
7440 			BPF_EXIT_INSN(),
7441 		},
7442 		.fixup_map1 = { 3 },
7443 		.errstr = "unbounded min value",
7444 		.result = REJECT,
7445 	},
7446 	{
7447 		"bounds checks mixing signed and unsigned, variant 11",
7448 		.insns = {
7449 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7450 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7451 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7452 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7453 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7454 				     BPF_FUNC_map_lookup_elem),
7455 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7456 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7457 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7458 			BPF_MOV64_IMM(BPF_REG_2, -1),
7459 			BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2),
7460 			/* Dead branch. */
7461 			BPF_MOV64_IMM(BPF_REG_0, 0),
7462 			BPF_EXIT_INSN(),
7463 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7464 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7465 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7466 			BPF_MOV64_IMM(BPF_REG_0, 0),
7467 			BPF_EXIT_INSN(),
7468 		},
7469 		.fixup_map1 = { 3 },
7470 		.errstr = "unbounded min value",
7471 		.result = REJECT,
7472 	},
7473 	{
7474 		"bounds checks mixing signed and unsigned, variant 12",
7475 		.insns = {
7476 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7477 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7478 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7479 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7480 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7481 				     BPF_FUNC_map_lookup_elem),
7482 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7483 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7484 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7485 			BPF_MOV64_IMM(BPF_REG_2, -6),
7486 			BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2),
7487 			BPF_MOV64_IMM(BPF_REG_0, 0),
7488 			BPF_EXIT_INSN(),
7489 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7490 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7491 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7492 			BPF_MOV64_IMM(BPF_REG_0, 0),
7493 			BPF_EXIT_INSN(),
7494 		},
7495 		.fixup_map1 = { 3 },
7496 		.errstr = "unbounded min value",
7497 		.result = REJECT,
7498 	},
7499 	{
7500 		"bounds checks mixing signed and unsigned, variant 13",
7501 		.insns = {
7502 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7503 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7504 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7505 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7506 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7507 				     BPF_FUNC_map_lookup_elem),
7508 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
7509 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7510 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7511 			BPF_MOV64_IMM(BPF_REG_2, 2),
7512 			BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2),
7513 			BPF_MOV64_IMM(BPF_REG_7, 1),
7514 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 0, 2),
7515 			BPF_MOV64_IMM(BPF_REG_0, 0),
7516 			BPF_EXIT_INSN(),
7517 			BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_1),
7518 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 4, 2),
7519 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_7),
7520 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7521 			BPF_MOV64_IMM(BPF_REG_0, 0),
7522 			BPF_EXIT_INSN(),
7523 		},
7524 		.fixup_map1 = { 3 },
7525 		.errstr = "unbounded min value",
7526 		.result = REJECT,
7527 	},
7528 	{
7529 		"bounds checks mixing signed and unsigned, variant 14",
7530 		.insns = {
7531 			BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1,
7532 				    offsetof(struct __sk_buff, mark)),
7533 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7534 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7535 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7536 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7537 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7538 				     BPF_FUNC_map_lookup_elem),
7539 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
7540 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7541 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7542 			BPF_MOV64_IMM(BPF_REG_2, -1),
7543 			BPF_MOV64_IMM(BPF_REG_8, 2),
7544 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_9, 42, 6),
7545 			BPF_JMP_REG(BPF_JSGT, BPF_REG_8, BPF_REG_1, 3),
7546 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2),
7547 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7548 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7549 			BPF_MOV64_IMM(BPF_REG_0, 0),
7550 			BPF_EXIT_INSN(),
7551 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, -3),
7552 			BPF_JMP_IMM(BPF_JA, 0, 0, -7),
7553 		},
7554 		.fixup_map1 = { 4 },
7555 		.errstr = "R0 invalid mem access 'inv'",
7556 		.result = REJECT,
7557 	},
7558 	{
7559 		"bounds checks mixing signed and unsigned, variant 15",
7560 		.insns = {
7561 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7562 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7563 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7564 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7565 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7566 				     BPF_FUNC_map_lookup_elem),
7567 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
7568 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8),
7569 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
7570 			BPF_MOV64_IMM(BPF_REG_2, -6),
7571 			BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2),
7572 			BPF_MOV64_IMM(BPF_REG_0, 0),
7573 			BPF_EXIT_INSN(),
7574 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7575 			BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 1, 2),
7576 			BPF_MOV64_IMM(BPF_REG_0, 0),
7577 			BPF_EXIT_INSN(),
7578 			BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0),
7579 			BPF_MOV64_IMM(BPF_REG_0, 0),
7580 			BPF_EXIT_INSN(),
7581 		},
7582 		.fixup_map1 = { 3 },
7583 		.errstr = "unbounded min value",
7584 		.result = REJECT,
7585 		.result_unpriv = REJECT,
7586 	},
7587 	{
7588 		"subtraction bounds (map value) variant 1",
7589 		.insns = {
7590 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7591 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7592 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7593 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7594 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7595 				     BPF_FUNC_map_lookup_elem),
7596 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7597 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
7598 			BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 7),
7599 			BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1),
7600 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 5),
7601 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3),
7602 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 56),
7603 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7604 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7605 			BPF_EXIT_INSN(),
7606 			BPF_MOV64_IMM(BPF_REG_0, 0),
7607 			BPF_EXIT_INSN(),
7608 		},
7609 		.fixup_map1 = { 3 },
7610 		.errstr = "R0 max value is outside of the array range",
7611 		.result = REJECT,
7612 	},
7613 	{
7614 		"subtraction bounds (map value) variant 2",
7615 		.insns = {
7616 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7617 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7618 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7619 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7620 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7621 				     BPF_FUNC_map_lookup_elem),
7622 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
7623 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
7624 			BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 6),
7625 			BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1),
7626 			BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 4),
7627 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3),
7628 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7629 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7630 			BPF_EXIT_INSN(),
7631 			BPF_MOV64_IMM(BPF_REG_0, 0),
7632 			BPF_EXIT_INSN(),
7633 		},
7634 		.fixup_map1 = { 3 },
7635 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
7636 		.result = REJECT,
7637 	},
7638 	{
7639 		"bounds check based on zero-extended MOV",
7640 		.insns = {
7641 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7642 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7643 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7644 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7645 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7646 				     BPF_FUNC_map_lookup_elem),
7647 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
7648 			/* r2 = 0x0000'0000'ffff'ffff */
7649 			BPF_MOV32_IMM(BPF_REG_2, 0xffffffff),
7650 			/* r2 = 0 */
7651 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32),
7652 			/* no-op */
7653 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
7654 			/* access at offset 0 */
7655 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7656 			/* exit */
7657 			BPF_MOV64_IMM(BPF_REG_0, 0),
7658 			BPF_EXIT_INSN(),
7659 		},
7660 		.fixup_map1 = { 3 },
7661 		.result = ACCEPT
7662 	},
7663 	{
7664 		"bounds check based on sign-extended MOV. test1",
7665 		.insns = {
7666 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7667 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7668 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7669 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7670 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7671 				     BPF_FUNC_map_lookup_elem),
7672 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
7673 			/* r2 = 0xffff'ffff'ffff'ffff */
7674 			BPF_MOV64_IMM(BPF_REG_2, 0xffffffff),
7675 			/* r2 = 0xffff'ffff */
7676 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32),
7677 			/* r0 = <oob pointer> */
7678 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
7679 			/* access to OOB pointer */
7680 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7681 			/* exit */
7682 			BPF_MOV64_IMM(BPF_REG_0, 0),
7683 			BPF_EXIT_INSN(),
7684 		},
7685 		.fixup_map1 = { 3 },
7686 		.errstr = "map_value pointer and 4294967295",
7687 		.result = REJECT
7688 	},
7689 	{
7690 		"bounds check based on sign-extended MOV. test2",
7691 		.insns = {
7692 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7693 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7694 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7695 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7696 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7697 				     BPF_FUNC_map_lookup_elem),
7698 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
7699 			/* r2 = 0xffff'ffff'ffff'ffff */
7700 			BPF_MOV64_IMM(BPF_REG_2, 0xffffffff),
7701 			/* r2 = 0xfff'ffff */
7702 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 36),
7703 			/* r0 = <oob pointer> */
7704 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
7705 			/* access to OOB pointer */
7706 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7707 			/* exit */
7708 			BPF_MOV64_IMM(BPF_REG_0, 0),
7709 			BPF_EXIT_INSN(),
7710 		},
7711 		.fixup_map1 = { 3 },
7712 		.errstr = "R0 min value is outside of the array range",
7713 		.result = REJECT
7714 	},
7715 	{
7716 		"bounds check based on reg_off + var_off + insn_off. test1",
7717 		.insns = {
7718 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
7719 				    offsetof(struct __sk_buff, mark)),
7720 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7721 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7722 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7723 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7724 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7725 				     BPF_FUNC_map_lookup_elem),
7726 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
7727 			BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1),
7728 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 29) - 1),
7729 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6),
7730 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1),
7731 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3),
7732 			BPF_MOV64_IMM(BPF_REG_0, 0),
7733 			BPF_EXIT_INSN(),
7734 		},
7735 		.fixup_map1 = { 4 },
7736 		.errstr = "value_size=8 off=1073741825",
7737 		.result = REJECT,
7738 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
7739 	},
7740 	{
7741 		"bounds check based on reg_off + var_off + insn_off. test2",
7742 		.insns = {
7743 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
7744 				    offsetof(struct __sk_buff, mark)),
7745 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7746 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7747 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7748 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7749 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7750 				     BPF_FUNC_map_lookup_elem),
7751 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
7752 			BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1),
7753 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 30) - 1),
7754 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6),
7755 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1),
7756 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3),
7757 			BPF_MOV64_IMM(BPF_REG_0, 0),
7758 			BPF_EXIT_INSN(),
7759 		},
7760 		.fixup_map1 = { 4 },
7761 		.errstr = "value 1073741823",
7762 		.result = REJECT,
7763 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
7764 	},
7765 	{
7766 		"bounds check after truncation of non-boundary-crossing range",
7767 		.insns = {
7768 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7769 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7770 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7771 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7772 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7773 				     BPF_FUNC_map_lookup_elem),
7774 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7775 			/* r1 = [0x00, 0xff] */
7776 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
7777 			BPF_MOV64_IMM(BPF_REG_2, 1),
7778 			/* r2 = 0x10'0000'0000 */
7779 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 36),
7780 			/* r1 = [0x10'0000'0000, 0x10'0000'00ff] */
7781 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
7782 			/* r1 = [0x10'7fff'ffff, 0x10'8000'00fe] */
7783 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff),
7784 			/* r1 = [0x00, 0xff] */
7785 			BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 0x7fffffff),
7786 			/* r1 = 0 */
7787 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
7788 			/* no-op */
7789 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7790 			/* access at offset 0 */
7791 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7792 			/* exit */
7793 			BPF_MOV64_IMM(BPF_REG_0, 0),
7794 			BPF_EXIT_INSN(),
7795 		},
7796 		.fixup_map1 = { 3 },
7797 		.result = ACCEPT
7798 	},
7799 	{
7800 		"bounds check after truncation of boundary-crossing range (1)",
7801 		.insns = {
7802 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7803 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7804 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7805 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7806 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7807 				     BPF_FUNC_map_lookup_elem),
7808 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7809 			/* r1 = [0x00, 0xff] */
7810 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
7811 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1),
7812 			/* r1 = [0xffff'ff80, 0x1'0000'007f] */
7813 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1),
7814 			/* r1 = [0xffff'ff80, 0xffff'ffff] or
7815 			 *      [0x0000'0000, 0x0000'007f]
7816 			 */
7817 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 0),
7818 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1),
7819 			/* r1 = [0x00, 0xff] or
7820 			 *      [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff]
7821 			 */
7822 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1),
7823 			/* r1 = 0 or
7824 			 *      [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff]
7825 			 */
7826 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
7827 			/* no-op or OOB pointer computation */
7828 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7829 			/* potentially OOB access */
7830 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7831 			/* exit */
7832 			BPF_MOV64_IMM(BPF_REG_0, 0),
7833 			BPF_EXIT_INSN(),
7834 		},
7835 		.fixup_map1 = { 3 },
7836 		/* not actually fully unbounded, but the bound is very high */
7837 		.errstr = "R0 unbounded memory access",
7838 		.result = REJECT
7839 	},
7840 	{
7841 		"bounds check after truncation of boundary-crossing range (2)",
7842 		.insns = {
7843 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7844 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7845 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7846 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7847 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7848 				     BPF_FUNC_map_lookup_elem),
7849 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
7850 			/* r1 = [0x00, 0xff] */
7851 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
7852 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1),
7853 			/* r1 = [0xffff'ff80, 0x1'0000'007f] */
7854 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1),
7855 			/* r1 = [0xffff'ff80, 0xffff'ffff] or
7856 			 *      [0x0000'0000, 0x0000'007f]
7857 			 * difference to previous test: truncation via MOV32
7858 			 * instead of ALU32.
7859 			 */
7860 			BPF_MOV32_REG(BPF_REG_1, BPF_REG_1),
7861 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1),
7862 			/* r1 = [0x00, 0xff] or
7863 			 *      [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff]
7864 			 */
7865 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1),
7866 			/* r1 = 0 or
7867 			 *      [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff]
7868 			 */
7869 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
7870 			/* no-op or OOB pointer computation */
7871 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7872 			/* potentially OOB access */
7873 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7874 			/* exit */
7875 			BPF_MOV64_IMM(BPF_REG_0, 0),
7876 			BPF_EXIT_INSN(),
7877 		},
7878 		.fixup_map1 = { 3 },
7879 		/* not actually fully unbounded, but the bound is very high */
7880 		.errstr = "R0 unbounded memory access",
7881 		.result = REJECT
7882 	},
7883 	{
7884 		"bounds check after wrapping 32-bit addition",
7885 		.insns = {
7886 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7887 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7888 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7889 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7890 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7891 				     BPF_FUNC_map_lookup_elem),
7892 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
7893 			/* r1 = 0x7fff'ffff */
7894 			BPF_MOV64_IMM(BPF_REG_1, 0x7fffffff),
7895 			/* r1 = 0xffff'fffe */
7896 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff),
7897 			/* r1 = 0 */
7898 			BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 2),
7899 			/* no-op */
7900 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7901 			/* access at offset 0 */
7902 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7903 			/* exit */
7904 			BPF_MOV64_IMM(BPF_REG_0, 0),
7905 			BPF_EXIT_INSN(),
7906 		},
7907 		.fixup_map1 = { 3 },
7908 		.result = ACCEPT
7909 	},
7910 	{
7911 		"bounds check after shift with oversized count operand",
7912 		.insns = {
7913 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7914 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7915 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7916 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7917 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7918 				     BPF_FUNC_map_lookup_elem),
7919 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
7920 			BPF_MOV64_IMM(BPF_REG_2, 32),
7921 			BPF_MOV64_IMM(BPF_REG_1, 1),
7922 			/* r1 = (u32)1 << (u32)32 = ? */
7923 			BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_2),
7924 			/* r1 = [0x0000, 0xffff] */
7925 			BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xffff),
7926 			/* computes unknown pointer, potentially OOB */
7927 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7928 			/* potentially OOB access */
7929 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7930 			/* exit */
7931 			BPF_MOV64_IMM(BPF_REG_0, 0),
7932 			BPF_EXIT_INSN(),
7933 		},
7934 		.fixup_map1 = { 3 },
7935 		.errstr = "R0 max value is outside of the array range",
7936 		.result = REJECT
7937 	},
7938 	{
7939 		"bounds check after right shift of maybe-negative number",
7940 		.insns = {
7941 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7942 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7943 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7944 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7945 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7946 				     BPF_FUNC_map_lookup_elem),
7947 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
7948 			/* r1 = [0x00, 0xff] */
7949 			BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
7950 			/* r1 = [-0x01, 0xfe] */
7951 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1),
7952 			/* r1 = 0 or 0xff'ffff'ffff'ffff */
7953 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
7954 			/* r1 = 0 or 0xffff'ffff'ffff */
7955 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
7956 			/* computes unknown pointer, potentially OOB */
7957 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
7958 			/* potentially OOB access */
7959 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
7960 			/* exit */
7961 			BPF_MOV64_IMM(BPF_REG_0, 0),
7962 			BPF_EXIT_INSN(),
7963 		},
7964 		.fixup_map1 = { 3 },
7965 		.errstr = "R0 unbounded memory access",
7966 		.result = REJECT
7967 	},
7968 	{
7969 		"bounds check map access with off+size signed 32bit overflow. test1",
7970 		.insns = {
7971 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7972 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7973 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7974 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7975 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7976 				     BPF_FUNC_map_lookup_elem),
7977 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
7978 			BPF_EXIT_INSN(),
7979 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7ffffffe),
7980 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
7981 			BPF_JMP_A(0),
7982 			BPF_EXIT_INSN(),
7983 		},
7984 		.fixup_map1 = { 3 },
7985 		.errstr = "map_value pointer and 2147483646",
7986 		.result = REJECT
7987 	},
7988 	{
7989 		"bounds check map access with off+size signed 32bit overflow. test2",
7990 		.insns = {
7991 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7992 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7993 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
7994 			BPF_LD_MAP_FD(BPF_REG_1, 0),
7995 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
7996 				     BPF_FUNC_map_lookup_elem),
7997 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
7998 			BPF_EXIT_INSN(),
7999 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff),
8000 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff),
8001 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff),
8002 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
8003 			BPF_JMP_A(0),
8004 			BPF_EXIT_INSN(),
8005 		},
8006 		.fixup_map1 = { 3 },
8007 		.errstr = "pointer offset 1073741822",
8008 		.result = REJECT
8009 	},
8010 	{
8011 		"bounds check map access with off+size signed 32bit overflow. test3",
8012 		.insns = {
8013 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8014 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
8015 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
8016 			BPF_LD_MAP_FD(BPF_REG_1, 0),
8017 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8018 				     BPF_FUNC_map_lookup_elem),
8019 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
8020 			BPF_EXIT_INSN(),
8021 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff),
8022 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff),
8023 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2),
8024 			BPF_JMP_A(0),
8025 			BPF_EXIT_INSN(),
8026 		},
8027 		.fixup_map1 = { 3 },
8028 		.errstr = "pointer offset -1073741822",
8029 		.result = REJECT
8030 	},
8031 	{
8032 		"bounds check map access with off+size signed 32bit overflow. test4",
8033 		.insns = {
8034 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8035 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
8036 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
8037 			BPF_LD_MAP_FD(BPF_REG_1, 0),
8038 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8039 				     BPF_FUNC_map_lookup_elem),
8040 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
8041 			BPF_EXIT_INSN(),
8042 			BPF_MOV64_IMM(BPF_REG_1, 1000000),
8043 			BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 1000000),
8044 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
8045 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2),
8046 			BPF_JMP_A(0),
8047 			BPF_EXIT_INSN(),
8048 		},
8049 		.fixup_map1 = { 3 },
8050 		.errstr = "map_value pointer and 1000000000000",
8051 		.result = REJECT
8052 	},
8053 	{
8054 		"pointer/scalar confusion in state equality check (way 1)",
8055 		.insns = {
8056 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8057 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
8058 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
8059 			BPF_LD_MAP_FD(BPF_REG_1, 0),
8060 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8061 				     BPF_FUNC_map_lookup_elem),
8062 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
8063 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
8064 			BPF_JMP_A(1),
8065 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
8066 			BPF_JMP_A(0),
8067 			BPF_EXIT_INSN(),
8068 		},
8069 		.fixup_map1 = { 3 },
8070 		.result = ACCEPT,
8071 		.retval = POINTER_VALUE,
8072 		.result_unpriv = REJECT,
8073 		.errstr_unpriv = "R0 leaks addr as return value"
8074 	},
8075 	{
8076 		"pointer/scalar confusion in state equality check (way 2)",
8077 		.insns = {
8078 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8079 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
8080 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
8081 			BPF_LD_MAP_FD(BPF_REG_1, 0),
8082 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8083 				     BPF_FUNC_map_lookup_elem),
8084 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
8085 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
8086 			BPF_JMP_A(1),
8087 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
8088 			BPF_EXIT_INSN(),
8089 		},
8090 		.fixup_map1 = { 3 },
8091 		.result = ACCEPT,
8092 		.retval = POINTER_VALUE,
8093 		.result_unpriv = REJECT,
8094 		.errstr_unpriv = "R0 leaks addr as return value"
8095 	},
8096 	{
8097 		"variable-offset ctx access",
8098 		.insns = {
8099 			/* Get an unknown value */
8100 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
8101 			/* Make it small and 4-byte aligned */
8102 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
8103 			/* add it to skb.  We now have either &skb->len or
8104 			 * &skb->pkt_type, but we don't know which
8105 			 */
8106 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
8107 			/* dereference it */
8108 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
8109 			BPF_EXIT_INSN(),
8110 		},
8111 		.errstr = "variable ctx access var_off=(0x0; 0x4)",
8112 		.result = REJECT,
8113 		.prog_type = BPF_PROG_TYPE_LWT_IN,
8114 	},
8115 	{
8116 		"variable-offset stack access",
8117 		.insns = {
8118 			/* Fill the top 8 bytes of the stack */
8119 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8120 			/* Get an unknown value */
8121 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
8122 			/* Make it small and 4-byte aligned */
8123 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
8124 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8),
8125 			/* add it to fp.  We now have either fp-4 or fp-8, but
8126 			 * we don't know which
8127 			 */
8128 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
8129 			/* dereference it */
8130 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0),
8131 			BPF_EXIT_INSN(),
8132 		},
8133 		.errstr = "variable stack access var_off=(0xfffffffffffffff8; 0x4)",
8134 		.result = REJECT,
8135 		.prog_type = BPF_PROG_TYPE_LWT_IN,
8136 	},
8137 	{
8138 		"indirect variable-offset stack access",
8139 		.insns = {
8140 			/* Fill the top 8 bytes of the stack */
8141 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8142 			/* Get an unknown value */
8143 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
8144 			/* Make it small and 4-byte aligned */
8145 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
8146 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8),
8147 			/* add it to fp.  We now have either fp-4 or fp-8, but
8148 			 * we don't know which
8149 			 */
8150 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
8151 			/* dereference it indirectly */
8152 			BPF_LD_MAP_FD(BPF_REG_1, 0),
8153 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8154 				     BPF_FUNC_map_lookup_elem),
8155 			BPF_MOV64_IMM(BPF_REG_0, 0),
8156 			BPF_EXIT_INSN(),
8157 		},
8158 		.fixup_map1 = { 5 },
8159 		.errstr = "variable stack read R2",
8160 		.result = REJECT,
8161 		.prog_type = BPF_PROG_TYPE_LWT_IN,
8162 	},
8163 	{
8164 		"direct stack access with 32-bit wraparound. test1",
8165 		.insns = {
8166 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
8167 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff),
8168 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff),
8169 			BPF_MOV32_IMM(BPF_REG_0, 0),
8170 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
8171 			BPF_EXIT_INSN()
8172 		},
8173 		.errstr = "fp pointer and 2147483647",
8174 		.result = REJECT
8175 	},
8176 	{
8177 		"direct stack access with 32-bit wraparound. test2",
8178 		.insns = {
8179 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
8180 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff),
8181 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff),
8182 			BPF_MOV32_IMM(BPF_REG_0, 0),
8183 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
8184 			BPF_EXIT_INSN()
8185 		},
8186 		.errstr = "fp pointer and 1073741823",
8187 		.result = REJECT
8188 	},
8189 	{
8190 		"direct stack access with 32-bit wraparound. test3",
8191 		.insns = {
8192 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
8193 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff),
8194 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff),
8195 			BPF_MOV32_IMM(BPF_REG_0, 0),
8196 			BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
8197 			BPF_EXIT_INSN()
8198 		},
8199 		.errstr = "fp pointer offset 1073741822",
8200 		.result = REJECT
8201 	},
8202 	{
8203 		"liveness pruning and write screening",
8204 		.insns = {
8205 			/* Get an unknown value */
8206 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
8207 			/* branch conditions teach us nothing about R2 */
8208 			BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
8209 			BPF_MOV64_IMM(BPF_REG_0, 0),
8210 			BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
8211 			BPF_MOV64_IMM(BPF_REG_0, 0),
8212 			BPF_EXIT_INSN(),
8213 		},
8214 		.errstr = "R0 !read_ok",
8215 		.result = REJECT,
8216 		.prog_type = BPF_PROG_TYPE_LWT_IN,
8217 	},
8218 	{
8219 		"varlen_map_value_access pruning",
8220 		.insns = {
8221 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
8222 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
8223 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
8224 			BPF_LD_MAP_FD(BPF_REG_1, 0),
8225 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8226 				     BPF_FUNC_map_lookup_elem),
8227 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
8228 			BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
8229 			BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
8230 			BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
8231 			BPF_MOV32_IMM(BPF_REG_1, 0),
8232 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
8233 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
8234 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
8235 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0,
8236 				   offsetof(struct test_val, foo)),
8237 			BPF_EXIT_INSN(),
8238 		},
8239 		.fixup_map2 = { 3 },
8240 		.errstr_unpriv = "R0 leaks addr",
8241 		.errstr = "R0 unbounded memory access",
8242 		.result_unpriv = REJECT,
8243 		.result = REJECT,
8244 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8245 	},
8246 	{
8247 		"invalid 64-bit BPF_END",
8248 		.insns = {
8249 			BPF_MOV32_IMM(BPF_REG_0, 0),
8250 			{
8251 				.code  = BPF_ALU64 | BPF_END | BPF_TO_LE,
8252 				.dst_reg = BPF_REG_0,
8253 				.src_reg = 0,
8254 				.off   = 0,
8255 				.imm   = 32,
8256 			},
8257 			BPF_EXIT_INSN(),
8258 		},
8259 		.errstr = "unknown opcode d7",
8260 		.result = REJECT,
8261 	},
8262 	{
8263 		"XDP, using ifindex from netdev",
8264 		.insns = {
8265 			BPF_MOV64_IMM(BPF_REG_0, 0),
8266 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8267 				    offsetof(struct xdp_md, ingress_ifindex)),
8268 			BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 1, 1),
8269 			BPF_MOV64_IMM(BPF_REG_0, 1),
8270 			BPF_EXIT_INSN(),
8271 		},
8272 		.result = ACCEPT,
8273 		.prog_type = BPF_PROG_TYPE_XDP,
8274 		.retval = 1,
8275 	},
8276 	{
8277 		"meta access, test1",
8278 		.insns = {
8279 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8280 				    offsetof(struct xdp_md, data_meta)),
8281 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8282 				    offsetof(struct xdp_md, data)),
8283 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
8284 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
8285 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
8286 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8287 			BPF_MOV64_IMM(BPF_REG_0, 0),
8288 			BPF_EXIT_INSN(),
8289 		},
8290 		.result = ACCEPT,
8291 		.prog_type = BPF_PROG_TYPE_XDP,
8292 	},
8293 	{
8294 		"meta access, test2",
8295 		.insns = {
8296 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8297 				    offsetof(struct xdp_md, data_meta)),
8298 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8299 				    offsetof(struct xdp_md, data)),
8300 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
8301 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 8),
8302 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
8303 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
8304 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
8305 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
8306 			BPF_MOV64_IMM(BPF_REG_0, 0),
8307 			BPF_EXIT_INSN(),
8308 		},
8309 		.result = REJECT,
8310 		.errstr = "invalid access to packet, off=-8",
8311 		.prog_type = BPF_PROG_TYPE_XDP,
8312 	},
8313 	{
8314 		"meta access, test3",
8315 		.insns = {
8316 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8317 				    offsetof(struct xdp_md, data_meta)),
8318 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8319 				    offsetof(struct xdp_md, data_end)),
8320 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
8321 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
8322 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
8323 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8324 			BPF_MOV64_IMM(BPF_REG_0, 0),
8325 			BPF_EXIT_INSN(),
8326 		},
8327 		.result = REJECT,
8328 		.errstr = "invalid access to packet",
8329 		.prog_type = BPF_PROG_TYPE_XDP,
8330 	},
8331 	{
8332 		"meta access, test4",
8333 		.insns = {
8334 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8335 				    offsetof(struct xdp_md, data_meta)),
8336 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8337 				    offsetof(struct xdp_md, data_end)),
8338 			BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
8339 				    offsetof(struct xdp_md, data)),
8340 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
8341 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
8342 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
8343 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8344 			BPF_MOV64_IMM(BPF_REG_0, 0),
8345 			BPF_EXIT_INSN(),
8346 		},
8347 		.result = REJECT,
8348 		.errstr = "invalid access to packet",
8349 		.prog_type = BPF_PROG_TYPE_XDP,
8350 	},
8351 	{
8352 		"meta access, test5",
8353 		.insns = {
8354 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8355 				    offsetof(struct xdp_md, data_meta)),
8356 			BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
8357 				    offsetof(struct xdp_md, data)),
8358 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
8359 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
8360 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_4, 3),
8361 			BPF_MOV64_IMM(BPF_REG_2, -8),
8362 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
8363 				     BPF_FUNC_xdp_adjust_meta),
8364 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0),
8365 			BPF_MOV64_IMM(BPF_REG_0, 0),
8366 			BPF_EXIT_INSN(),
8367 		},
8368 		.result = REJECT,
8369 		.errstr = "R3 !read_ok",
8370 		.prog_type = BPF_PROG_TYPE_XDP,
8371 	},
8372 	{
8373 		"meta access, test6",
8374 		.insns = {
8375 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8376 				    offsetof(struct xdp_md, data_meta)),
8377 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8378 				    offsetof(struct xdp_md, data)),
8379 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
8380 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
8381 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
8382 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
8383 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 1),
8384 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8385 			BPF_MOV64_IMM(BPF_REG_0, 0),
8386 			BPF_EXIT_INSN(),
8387 		},
8388 		.result = REJECT,
8389 		.errstr = "invalid access to packet",
8390 		.prog_type = BPF_PROG_TYPE_XDP,
8391 	},
8392 	{
8393 		"meta access, test7",
8394 		.insns = {
8395 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8396 				    offsetof(struct xdp_md, data_meta)),
8397 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8398 				    offsetof(struct xdp_md, data)),
8399 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
8400 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
8401 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
8402 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
8403 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
8404 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8405 			BPF_MOV64_IMM(BPF_REG_0, 0),
8406 			BPF_EXIT_INSN(),
8407 		},
8408 		.result = ACCEPT,
8409 		.prog_type = BPF_PROG_TYPE_XDP,
8410 	},
8411 	{
8412 		"meta access, test8",
8413 		.insns = {
8414 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8415 				    offsetof(struct xdp_md, data_meta)),
8416 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8417 				    offsetof(struct xdp_md, data)),
8418 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
8419 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF),
8420 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
8421 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8422 			BPF_MOV64_IMM(BPF_REG_0, 0),
8423 			BPF_EXIT_INSN(),
8424 		},
8425 		.result = ACCEPT,
8426 		.prog_type = BPF_PROG_TYPE_XDP,
8427 	},
8428 	{
8429 		"meta access, test9",
8430 		.insns = {
8431 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8432 				    offsetof(struct xdp_md, data_meta)),
8433 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8434 				    offsetof(struct xdp_md, data)),
8435 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
8436 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF),
8437 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1),
8438 			BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
8439 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8440 			BPF_MOV64_IMM(BPF_REG_0, 0),
8441 			BPF_EXIT_INSN(),
8442 		},
8443 		.result = REJECT,
8444 		.errstr = "invalid access to packet",
8445 		.prog_type = BPF_PROG_TYPE_XDP,
8446 	},
8447 	{
8448 		"meta access, test10",
8449 		.insns = {
8450 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8451 				    offsetof(struct xdp_md, data_meta)),
8452 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8453 				    offsetof(struct xdp_md, data)),
8454 			BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
8455 				    offsetof(struct xdp_md, data_end)),
8456 			BPF_MOV64_IMM(BPF_REG_5, 42),
8457 			BPF_MOV64_IMM(BPF_REG_6, 24),
8458 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8),
8459 			BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8),
8460 			BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8),
8461 			BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6),
8462 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_5),
8463 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
8464 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
8465 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8),
8466 			BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_5, 1),
8467 			BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
8468 			BPF_MOV64_IMM(BPF_REG_0, 0),
8469 			BPF_EXIT_INSN(),
8470 		},
8471 		.result = REJECT,
8472 		.errstr = "invalid access to packet",
8473 		.prog_type = BPF_PROG_TYPE_XDP,
8474 	},
8475 	{
8476 		"meta access, test11",
8477 		.insns = {
8478 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8479 				    offsetof(struct xdp_md, data_meta)),
8480 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8481 				    offsetof(struct xdp_md, data)),
8482 			BPF_MOV64_IMM(BPF_REG_5, 42),
8483 			BPF_MOV64_IMM(BPF_REG_6, 24),
8484 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8),
8485 			BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8),
8486 			BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8),
8487 			BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6),
8488 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_5),
8489 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_2),
8490 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
8491 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8),
8492 			BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_3, 1),
8493 			BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_5, 0),
8494 			BPF_MOV64_IMM(BPF_REG_0, 0),
8495 			BPF_EXIT_INSN(),
8496 		},
8497 		.result = ACCEPT,
8498 		.prog_type = BPF_PROG_TYPE_XDP,
8499 	},
8500 	{
8501 		"meta access, test12",
8502 		.insns = {
8503 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8504 				    offsetof(struct xdp_md, data_meta)),
8505 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8506 				    offsetof(struct xdp_md, data)),
8507 			BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
8508 				    offsetof(struct xdp_md, data_end)),
8509 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
8510 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16),
8511 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 5),
8512 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0),
8513 			BPF_MOV64_REG(BPF_REG_5, BPF_REG_2),
8514 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16),
8515 			BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 1),
8516 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
8517 			BPF_MOV64_IMM(BPF_REG_0, 0),
8518 			BPF_EXIT_INSN(),
8519 		},
8520 		.result = ACCEPT,
8521 		.prog_type = BPF_PROG_TYPE_XDP,
8522 	},
8523 	{
8524 		"arithmetic ops make PTR_TO_CTX unusable",
8525 		.insns = {
8526 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
8527 				      offsetof(struct __sk_buff, data) -
8528 				      offsetof(struct __sk_buff, mark)),
8529 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
8530 				    offsetof(struct __sk_buff, mark)),
8531 			BPF_EXIT_INSN(),
8532 		},
8533 		.errstr = "dereference of modified ctx ptr R1 off=68+8, ctx+const is allowed, ctx+const+const is not",
8534 		.result = REJECT,
8535 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
8536 	},
8537 	{
8538 		"pkt_end - pkt_start is allowed",
8539 		.insns = {
8540 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
8541 				    offsetof(struct __sk_buff, data_end)),
8542 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8543 				    offsetof(struct __sk_buff, data)),
8544 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2),
8545 			BPF_EXIT_INSN(),
8546 		},
8547 		.result = ACCEPT,
8548 		.retval = TEST_DATA_LEN,
8549 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
8550 	},
8551 	{
8552 		"XDP pkt read, pkt_end mangling, bad access 1",
8553 		.insns = {
8554 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8555 				    offsetof(struct xdp_md, data)),
8556 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8557 				    offsetof(struct xdp_md, data_end)),
8558 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8559 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8560 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8),
8561 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
8562 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8563 			BPF_MOV64_IMM(BPF_REG_0, 0),
8564 			BPF_EXIT_INSN(),
8565 		},
8566 		.errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END",
8567 		.result = REJECT,
8568 		.prog_type = BPF_PROG_TYPE_XDP,
8569 	},
8570 	{
8571 		"XDP pkt read, pkt_end mangling, bad access 2",
8572 		.insns = {
8573 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8574 				    offsetof(struct xdp_md, data)),
8575 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8576 				    offsetof(struct xdp_md, data_end)),
8577 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8578 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8579 			BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8),
8580 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
8581 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8582 			BPF_MOV64_IMM(BPF_REG_0, 0),
8583 			BPF_EXIT_INSN(),
8584 		},
8585 		.errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END",
8586 		.result = REJECT,
8587 		.prog_type = BPF_PROG_TYPE_XDP,
8588 	},
8589 	{
8590 		"XDP pkt read, pkt_data' > pkt_end, good access",
8591 		.insns = {
8592 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8593 				    offsetof(struct xdp_md, data)),
8594 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8595 				    offsetof(struct xdp_md, data_end)),
8596 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8597 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8598 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
8599 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8600 			BPF_MOV64_IMM(BPF_REG_0, 0),
8601 			BPF_EXIT_INSN(),
8602 		},
8603 		.result = ACCEPT,
8604 		.prog_type = BPF_PROG_TYPE_XDP,
8605 	},
8606 	{
8607 		"XDP pkt read, pkt_data' > pkt_end, bad access 1",
8608 		.insns = {
8609 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8610 				    offsetof(struct xdp_md, data)),
8611 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8612 				    offsetof(struct xdp_md, data_end)),
8613 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8614 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8615 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
8616 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
8617 			BPF_MOV64_IMM(BPF_REG_0, 0),
8618 			BPF_EXIT_INSN(),
8619 		},
8620 		.errstr = "R1 offset is outside of the packet",
8621 		.result = REJECT,
8622 		.prog_type = BPF_PROG_TYPE_XDP,
8623 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8624 	},
8625 	{
8626 		"XDP pkt read, pkt_data' > pkt_end, bad access 2",
8627 		.insns = {
8628 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8629 				    offsetof(struct xdp_md, data)),
8630 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8631 				    offsetof(struct xdp_md, data_end)),
8632 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8633 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8634 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0),
8635 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8636 			BPF_MOV64_IMM(BPF_REG_0, 0),
8637 			BPF_EXIT_INSN(),
8638 		},
8639 		.errstr = "R1 offset is outside of the packet",
8640 		.result = REJECT,
8641 		.prog_type = BPF_PROG_TYPE_XDP,
8642 	},
8643 	{
8644 		"XDP pkt read, pkt_end > pkt_data', good access",
8645 		.insns = {
8646 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8647 				    offsetof(struct xdp_md, data)),
8648 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8649 				    offsetof(struct xdp_md, data_end)),
8650 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8651 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8652 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
8653 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8654 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
8655 			BPF_MOV64_IMM(BPF_REG_0, 0),
8656 			BPF_EXIT_INSN(),
8657 		},
8658 		.result = ACCEPT,
8659 		.prog_type = BPF_PROG_TYPE_XDP,
8660 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8661 	},
8662 	{
8663 		"XDP pkt read, pkt_end > pkt_data', bad access 1",
8664 		.insns = {
8665 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8666 				    offsetof(struct xdp_md, data)),
8667 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8668 				    offsetof(struct xdp_md, data_end)),
8669 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8670 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8671 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
8672 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8673 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8674 			BPF_MOV64_IMM(BPF_REG_0, 0),
8675 			BPF_EXIT_INSN(),
8676 		},
8677 		.errstr = "R1 offset is outside of the packet",
8678 		.result = REJECT,
8679 		.prog_type = BPF_PROG_TYPE_XDP,
8680 	},
8681 	{
8682 		"XDP pkt read, pkt_end > pkt_data', bad access 2",
8683 		.insns = {
8684 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8685 				    offsetof(struct xdp_md, data)),
8686 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8687 				    offsetof(struct xdp_md, data_end)),
8688 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8689 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8690 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
8691 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8692 			BPF_MOV64_IMM(BPF_REG_0, 0),
8693 			BPF_EXIT_INSN(),
8694 		},
8695 		.errstr = "R1 offset is outside of the packet",
8696 		.result = REJECT,
8697 		.prog_type = BPF_PROG_TYPE_XDP,
8698 	},
8699 	{
8700 		"XDP pkt read, pkt_data' < pkt_end, good access",
8701 		.insns = {
8702 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8703 				    offsetof(struct xdp_md, data)),
8704 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8705 				    offsetof(struct xdp_md, data_end)),
8706 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8707 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8708 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
8709 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8710 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
8711 			BPF_MOV64_IMM(BPF_REG_0, 0),
8712 			BPF_EXIT_INSN(),
8713 		},
8714 		.result = ACCEPT,
8715 		.prog_type = BPF_PROG_TYPE_XDP,
8716 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8717 	},
8718 	{
8719 		"XDP pkt read, pkt_data' < pkt_end, bad access 1",
8720 		.insns = {
8721 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8722 				    offsetof(struct xdp_md, data)),
8723 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8724 				    offsetof(struct xdp_md, data_end)),
8725 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8726 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8727 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
8728 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8729 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8730 			BPF_MOV64_IMM(BPF_REG_0, 0),
8731 			BPF_EXIT_INSN(),
8732 		},
8733 		.errstr = "R1 offset is outside of the packet",
8734 		.result = REJECT,
8735 		.prog_type = BPF_PROG_TYPE_XDP,
8736 	},
8737 	{
8738 		"XDP pkt read, pkt_data' < pkt_end, bad access 2",
8739 		.insns = {
8740 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8741 				    offsetof(struct xdp_md, data)),
8742 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8743 				    offsetof(struct xdp_md, data_end)),
8744 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8745 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8746 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
8747 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8748 			BPF_MOV64_IMM(BPF_REG_0, 0),
8749 			BPF_EXIT_INSN(),
8750 		},
8751 		.errstr = "R1 offset is outside of the packet",
8752 		.result = REJECT,
8753 		.prog_type = BPF_PROG_TYPE_XDP,
8754 	},
8755 	{
8756 		"XDP pkt read, pkt_end < pkt_data', good access",
8757 		.insns = {
8758 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8759 				    offsetof(struct xdp_md, data)),
8760 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8761 				    offsetof(struct xdp_md, data_end)),
8762 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8763 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8764 			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
8765 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8766 			BPF_MOV64_IMM(BPF_REG_0, 0),
8767 			BPF_EXIT_INSN(),
8768 		},
8769 		.result = ACCEPT,
8770 		.prog_type = BPF_PROG_TYPE_XDP,
8771 	},
8772 	{
8773 		"XDP pkt read, pkt_end < pkt_data', bad access 1",
8774 		.insns = {
8775 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8776 				    offsetof(struct xdp_md, data)),
8777 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8778 				    offsetof(struct xdp_md, data_end)),
8779 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8780 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8781 			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
8782 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
8783 			BPF_MOV64_IMM(BPF_REG_0, 0),
8784 			BPF_EXIT_INSN(),
8785 		},
8786 		.errstr = "R1 offset is outside of the packet",
8787 		.result = REJECT,
8788 		.prog_type = BPF_PROG_TYPE_XDP,
8789 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8790 	},
8791 	{
8792 		"XDP pkt read, pkt_end < pkt_data', bad access 2",
8793 		.insns = {
8794 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8795 				    offsetof(struct xdp_md, data)),
8796 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8797 				    offsetof(struct xdp_md, data_end)),
8798 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8799 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8800 			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0),
8801 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8802 			BPF_MOV64_IMM(BPF_REG_0, 0),
8803 			BPF_EXIT_INSN(),
8804 		},
8805 		.errstr = "R1 offset is outside of the packet",
8806 		.result = REJECT,
8807 		.prog_type = BPF_PROG_TYPE_XDP,
8808 	},
8809 	{
8810 		"XDP pkt read, pkt_data' >= pkt_end, good access",
8811 		.insns = {
8812 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8813 				    offsetof(struct xdp_md, data)),
8814 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8815 				    offsetof(struct xdp_md, data_end)),
8816 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8817 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8818 			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
8819 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
8820 			BPF_MOV64_IMM(BPF_REG_0, 0),
8821 			BPF_EXIT_INSN(),
8822 		},
8823 		.result = ACCEPT,
8824 		.prog_type = BPF_PROG_TYPE_XDP,
8825 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8826 	},
8827 	{
8828 		"XDP pkt read, pkt_data' >= pkt_end, bad access 1",
8829 		.insns = {
8830 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8831 				    offsetof(struct xdp_md, data)),
8832 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8833 				    offsetof(struct xdp_md, data_end)),
8834 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8835 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8836 			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
8837 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8838 			BPF_MOV64_IMM(BPF_REG_0, 0),
8839 			BPF_EXIT_INSN(),
8840 		},
8841 		.errstr = "R1 offset is outside of the packet",
8842 		.result = REJECT,
8843 		.prog_type = BPF_PROG_TYPE_XDP,
8844 	},
8845 	{
8846 		"XDP pkt read, pkt_data' >= pkt_end, bad access 2",
8847 		.insns = {
8848 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8849 				    offsetof(struct xdp_md, data)),
8850 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8851 				    offsetof(struct xdp_md, data_end)),
8852 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8853 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8854 			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0),
8855 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
8856 			BPF_MOV64_IMM(BPF_REG_0, 0),
8857 			BPF_EXIT_INSN(),
8858 		},
8859 		.errstr = "R1 offset is outside of the packet",
8860 		.result = REJECT,
8861 		.prog_type = BPF_PROG_TYPE_XDP,
8862 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8863 	},
8864 	{
8865 		"XDP pkt read, pkt_end >= pkt_data', good access",
8866 		.insns = {
8867 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8868 				    offsetof(struct xdp_md, data)),
8869 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8870 				    offsetof(struct xdp_md, data_end)),
8871 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8872 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8873 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
8874 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8875 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8876 			BPF_MOV64_IMM(BPF_REG_0, 0),
8877 			BPF_EXIT_INSN(),
8878 		},
8879 		.result = ACCEPT,
8880 		.prog_type = BPF_PROG_TYPE_XDP,
8881 	},
8882 	{
8883 		"XDP pkt read, pkt_end >= pkt_data', bad access 1",
8884 		.insns = {
8885 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8886 				    offsetof(struct xdp_md, data)),
8887 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8888 				    offsetof(struct xdp_md, data_end)),
8889 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8890 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8891 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
8892 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8893 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
8894 			BPF_MOV64_IMM(BPF_REG_0, 0),
8895 			BPF_EXIT_INSN(),
8896 		},
8897 		.errstr = "R1 offset is outside of the packet",
8898 		.result = REJECT,
8899 		.prog_type = BPF_PROG_TYPE_XDP,
8900 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8901 	},
8902 	{
8903 		"XDP pkt read, pkt_end >= pkt_data', bad access 2",
8904 		.insns = {
8905 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8906 				    offsetof(struct xdp_md, data)),
8907 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8908 				    offsetof(struct xdp_md, data_end)),
8909 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8910 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8911 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
8912 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8913 			BPF_MOV64_IMM(BPF_REG_0, 0),
8914 			BPF_EXIT_INSN(),
8915 		},
8916 		.errstr = "R1 offset is outside of the packet",
8917 		.result = REJECT,
8918 		.prog_type = BPF_PROG_TYPE_XDP,
8919 	},
8920 	{
8921 		"XDP pkt read, pkt_data' <= pkt_end, good access",
8922 		.insns = {
8923 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8924 				    offsetof(struct xdp_md, data)),
8925 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8926 				    offsetof(struct xdp_md, data_end)),
8927 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8928 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8929 			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
8930 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8931 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8932 			BPF_MOV64_IMM(BPF_REG_0, 0),
8933 			BPF_EXIT_INSN(),
8934 		},
8935 		.result = ACCEPT,
8936 		.prog_type = BPF_PROG_TYPE_XDP,
8937 	},
8938 	{
8939 		"XDP pkt read, pkt_data' <= pkt_end, bad access 1",
8940 		.insns = {
8941 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8942 				    offsetof(struct xdp_md, data)),
8943 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8944 				    offsetof(struct xdp_md, data_end)),
8945 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8946 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8947 			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
8948 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
8949 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
8950 			BPF_MOV64_IMM(BPF_REG_0, 0),
8951 			BPF_EXIT_INSN(),
8952 		},
8953 		.errstr = "R1 offset is outside of the packet",
8954 		.result = REJECT,
8955 		.prog_type = BPF_PROG_TYPE_XDP,
8956 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8957 	},
8958 	{
8959 		"XDP pkt read, pkt_data' <= pkt_end, bad access 2",
8960 		.insns = {
8961 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8962 				    offsetof(struct xdp_md, data)),
8963 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8964 				    offsetof(struct xdp_md, data_end)),
8965 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8966 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8967 			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
8968 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
8969 			BPF_MOV64_IMM(BPF_REG_0, 0),
8970 			BPF_EXIT_INSN(),
8971 		},
8972 		.errstr = "R1 offset is outside of the packet",
8973 		.result = REJECT,
8974 		.prog_type = BPF_PROG_TYPE_XDP,
8975 	},
8976 	{
8977 		"XDP pkt read, pkt_end <= pkt_data', good access",
8978 		.insns = {
8979 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8980 				    offsetof(struct xdp_md, data)),
8981 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
8982 				    offsetof(struct xdp_md, data_end)),
8983 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
8984 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
8985 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
8986 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
8987 			BPF_MOV64_IMM(BPF_REG_0, 0),
8988 			BPF_EXIT_INSN(),
8989 		},
8990 		.result = ACCEPT,
8991 		.prog_type = BPF_PROG_TYPE_XDP,
8992 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
8993 	},
8994 	{
8995 		"XDP pkt read, pkt_end <= pkt_data', bad access 1",
8996 		.insns = {
8997 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
8998 				    offsetof(struct xdp_md, data)),
8999 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9000 				    offsetof(struct xdp_md, data_end)),
9001 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9002 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9003 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
9004 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9005 			BPF_MOV64_IMM(BPF_REG_0, 0),
9006 			BPF_EXIT_INSN(),
9007 		},
9008 		.errstr = "R1 offset is outside of the packet",
9009 		.result = REJECT,
9010 		.prog_type = BPF_PROG_TYPE_XDP,
9011 	},
9012 	{
9013 		"XDP pkt read, pkt_end <= pkt_data', bad access 2",
9014 		.insns = {
9015 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9016 				    offsetof(struct xdp_md, data)),
9017 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9018 				    offsetof(struct xdp_md, data_end)),
9019 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9020 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9021 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0),
9022 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9023 			BPF_MOV64_IMM(BPF_REG_0, 0),
9024 			BPF_EXIT_INSN(),
9025 		},
9026 		.errstr = "R1 offset is outside of the packet",
9027 		.result = REJECT,
9028 		.prog_type = BPF_PROG_TYPE_XDP,
9029 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9030 	},
9031 	{
9032 		"XDP pkt read, pkt_meta' > pkt_data, good access",
9033 		.insns = {
9034 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9035 				    offsetof(struct xdp_md, data_meta)),
9036 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9037 				    offsetof(struct xdp_md, data)),
9038 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9039 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9040 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
9041 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9042 			BPF_MOV64_IMM(BPF_REG_0, 0),
9043 			BPF_EXIT_INSN(),
9044 		},
9045 		.result = ACCEPT,
9046 		.prog_type = BPF_PROG_TYPE_XDP,
9047 	},
9048 	{
9049 		"XDP pkt read, pkt_meta' > pkt_data, bad access 1",
9050 		.insns = {
9051 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9052 				    offsetof(struct xdp_md, data_meta)),
9053 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9054 				    offsetof(struct xdp_md, data)),
9055 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9056 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9057 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
9058 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
9059 			BPF_MOV64_IMM(BPF_REG_0, 0),
9060 			BPF_EXIT_INSN(),
9061 		},
9062 		.errstr = "R1 offset is outside of the packet",
9063 		.result = REJECT,
9064 		.prog_type = BPF_PROG_TYPE_XDP,
9065 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9066 	},
9067 	{
9068 		"XDP pkt read, pkt_meta' > pkt_data, bad access 2",
9069 		.insns = {
9070 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9071 				    offsetof(struct xdp_md, data_meta)),
9072 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9073 				    offsetof(struct xdp_md, data)),
9074 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9075 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9076 			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0),
9077 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9078 			BPF_MOV64_IMM(BPF_REG_0, 0),
9079 			BPF_EXIT_INSN(),
9080 		},
9081 		.errstr = "R1 offset is outside of the packet",
9082 		.result = REJECT,
9083 		.prog_type = BPF_PROG_TYPE_XDP,
9084 	},
9085 	{
9086 		"XDP pkt read, pkt_data > pkt_meta', good access",
9087 		.insns = {
9088 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9089 				    offsetof(struct xdp_md, data_meta)),
9090 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9091 				    offsetof(struct xdp_md, data)),
9092 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9093 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9094 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
9095 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9096 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9097 			BPF_MOV64_IMM(BPF_REG_0, 0),
9098 			BPF_EXIT_INSN(),
9099 		},
9100 		.result = ACCEPT,
9101 		.prog_type = BPF_PROG_TYPE_XDP,
9102 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9103 	},
9104 	{
9105 		"XDP pkt read, pkt_data > pkt_meta', bad access 1",
9106 		.insns = {
9107 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9108 				    offsetof(struct xdp_md, data_meta)),
9109 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9110 				    offsetof(struct xdp_md, data)),
9111 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9112 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9113 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
9114 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9115 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9116 			BPF_MOV64_IMM(BPF_REG_0, 0),
9117 			BPF_EXIT_INSN(),
9118 		},
9119 		.errstr = "R1 offset is outside of the packet",
9120 		.result = REJECT,
9121 		.prog_type = BPF_PROG_TYPE_XDP,
9122 	},
9123 	{
9124 		"XDP pkt read, pkt_data > pkt_meta', bad access 2",
9125 		.insns = {
9126 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9127 				    offsetof(struct xdp_md, data_meta)),
9128 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9129 				    offsetof(struct xdp_md, data)),
9130 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9131 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9132 			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
9133 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9134 			BPF_MOV64_IMM(BPF_REG_0, 0),
9135 			BPF_EXIT_INSN(),
9136 		},
9137 		.errstr = "R1 offset is outside of the packet",
9138 		.result = REJECT,
9139 		.prog_type = BPF_PROG_TYPE_XDP,
9140 	},
9141 	{
9142 		"XDP pkt read, pkt_meta' < pkt_data, good access",
9143 		.insns = {
9144 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9145 				    offsetof(struct xdp_md, data_meta)),
9146 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9147 				    offsetof(struct xdp_md, data)),
9148 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9149 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9150 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
9151 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9152 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9153 			BPF_MOV64_IMM(BPF_REG_0, 0),
9154 			BPF_EXIT_INSN(),
9155 		},
9156 		.result = ACCEPT,
9157 		.prog_type = BPF_PROG_TYPE_XDP,
9158 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9159 	},
9160 	{
9161 		"XDP pkt read, pkt_meta' < pkt_data, bad access 1",
9162 		.insns = {
9163 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9164 				    offsetof(struct xdp_md, data_meta)),
9165 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9166 				    offsetof(struct xdp_md, data)),
9167 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9168 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9169 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
9170 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9171 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9172 			BPF_MOV64_IMM(BPF_REG_0, 0),
9173 			BPF_EXIT_INSN(),
9174 		},
9175 		.errstr = "R1 offset is outside of the packet",
9176 		.result = REJECT,
9177 		.prog_type = BPF_PROG_TYPE_XDP,
9178 	},
9179 	{
9180 		"XDP pkt read, pkt_meta' < pkt_data, bad access 2",
9181 		.insns = {
9182 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9183 				    offsetof(struct xdp_md, data_meta)),
9184 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9185 				    offsetof(struct xdp_md, data)),
9186 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9187 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9188 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
9189 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9190 			BPF_MOV64_IMM(BPF_REG_0, 0),
9191 			BPF_EXIT_INSN(),
9192 		},
9193 		.errstr = "R1 offset is outside of the packet",
9194 		.result = REJECT,
9195 		.prog_type = BPF_PROG_TYPE_XDP,
9196 	},
9197 	{
9198 		"XDP pkt read, pkt_data < pkt_meta', good access",
9199 		.insns = {
9200 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9201 				    offsetof(struct xdp_md, data_meta)),
9202 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9203 				    offsetof(struct xdp_md, data)),
9204 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9205 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9206 			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
9207 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9208 			BPF_MOV64_IMM(BPF_REG_0, 0),
9209 			BPF_EXIT_INSN(),
9210 		},
9211 		.result = ACCEPT,
9212 		.prog_type = BPF_PROG_TYPE_XDP,
9213 	},
9214 	{
9215 		"XDP pkt read, pkt_data < pkt_meta', bad access 1",
9216 		.insns = {
9217 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9218 				    offsetof(struct xdp_md, data_meta)),
9219 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9220 				    offsetof(struct xdp_md, data)),
9221 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9222 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9223 			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
9224 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
9225 			BPF_MOV64_IMM(BPF_REG_0, 0),
9226 			BPF_EXIT_INSN(),
9227 		},
9228 		.errstr = "R1 offset is outside of the packet",
9229 		.result = REJECT,
9230 		.prog_type = BPF_PROG_TYPE_XDP,
9231 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9232 	},
9233 	{
9234 		"XDP pkt read, pkt_data < pkt_meta', bad access 2",
9235 		.insns = {
9236 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9237 				    offsetof(struct xdp_md, data_meta)),
9238 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9239 				    offsetof(struct xdp_md, data)),
9240 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9241 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9242 			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0),
9243 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9244 			BPF_MOV64_IMM(BPF_REG_0, 0),
9245 			BPF_EXIT_INSN(),
9246 		},
9247 		.errstr = "R1 offset is outside of the packet",
9248 		.result = REJECT,
9249 		.prog_type = BPF_PROG_TYPE_XDP,
9250 	},
9251 	{
9252 		"XDP pkt read, pkt_meta' >= pkt_data, good access",
9253 		.insns = {
9254 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9255 				    offsetof(struct xdp_md, data_meta)),
9256 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9257 				    offsetof(struct xdp_md, data)),
9258 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9259 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9260 			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
9261 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9262 			BPF_MOV64_IMM(BPF_REG_0, 0),
9263 			BPF_EXIT_INSN(),
9264 		},
9265 		.result = ACCEPT,
9266 		.prog_type = BPF_PROG_TYPE_XDP,
9267 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9268 	},
9269 	{
9270 		"XDP pkt read, pkt_meta' >= pkt_data, bad access 1",
9271 		.insns = {
9272 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9273 				    offsetof(struct xdp_md, data_meta)),
9274 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9275 				    offsetof(struct xdp_md, data)),
9276 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9277 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9278 			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
9279 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9280 			BPF_MOV64_IMM(BPF_REG_0, 0),
9281 			BPF_EXIT_INSN(),
9282 		},
9283 		.errstr = "R1 offset is outside of the packet",
9284 		.result = REJECT,
9285 		.prog_type = BPF_PROG_TYPE_XDP,
9286 	},
9287 	{
9288 		"XDP pkt read, pkt_meta' >= pkt_data, bad access 2",
9289 		.insns = {
9290 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9291 				    offsetof(struct xdp_md, data_meta)),
9292 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9293 				    offsetof(struct xdp_md, data)),
9294 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9295 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9296 			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0),
9297 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9298 			BPF_MOV64_IMM(BPF_REG_0, 0),
9299 			BPF_EXIT_INSN(),
9300 		},
9301 		.errstr = "R1 offset is outside of the packet",
9302 		.result = REJECT,
9303 		.prog_type = BPF_PROG_TYPE_XDP,
9304 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9305 	},
9306 	{
9307 		"XDP pkt read, pkt_data >= pkt_meta', good access",
9308 		.insns = {
9309 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9310 				    offsetof(struct xdp_md, data_meta)),
9311 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9312 				    offsetof(struct xdp_md, data)),
9313 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9314 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9315 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
9316 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9317 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9318 			BPF_MOV64_IMM(BPF_REG_0, 0),
9319 			BPF_EXIT_INSN(),
9320 		},
9321 		.result = ACCEPT,
9322 		.prog_type = BPF_PROG_TYPE_XDP,
9323 	},
9324 	{
9325 		"XDP pkt read, pkt_data >= pkt_meta', bad access 1",
9326 		.insns = {
9327 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9328 				    offsetof(struct xdp_md, data_meta)),
9329 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9330 				    offsetof(struct xdp_md, data)),
9331 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9332 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9333 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
9334 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9335 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
9336 			BPF_MOV64_IMM(BPF_REG_0, 0),
9337 			BPF_EXIT_INSN(),
9338 		},
9339 		.errstr = "R1 offset is outside of the packet",
9340 		.result = REJECT,
9341 		.prog_type = BPF_PROG_TYPE_XDP,
9342 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9343 	},
9344 	{
9345 		"XDP pkt read, pkt_data >= pkt_meta', bad access 2",
9346 		.insns = {
9347 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9348 				    offsetof(struct xdp_md, data_meta)),
9349 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9350 				    offsetof(struct xdp_md, data)),
9351 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9352 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9353 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
9354 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9355 			BPF_MOV64_IMM(BPF_REG_0, 0),
9356 			BPF_EXIT_INSN(),
9357 		},
9358 		.errstr = "R1 offset is outside of the packet",
9359 		.result = REJECT,
9360 		.prog_type = BPF_PROG_TYPE_XDP,
9361 	},
9362 	{
9363 		"XDP pkt read, pkt_meta' <= pkt_data, good access",
9364 		.insns = {
9365 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9366 				    offsetof(struct xdp_md, data_meta)),
9367 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9368 				    offsetof(struct xdp_md, data)),
9369 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9370 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9371 			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
9372 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9373 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9374 			BPF_MOV64_IMM(BPF_REG_0, 0),
9375 			BPF_EXIT_INSN(),
9376 		},
9377 		.result = ACCEPT,
9378 		.prog_type = BPF_PROG_TYPE_XDP,
9379 	},
9380 	{
9381 		"XDP pkt read, pkt_meta' <= pkt_data, bad access 1",
9382 		.insns = {
9383 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9384 				    offsetof(struct xdp_md, data_meta)),
9385 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9386 				    offsetof(struct xdp_md, data)),
9387 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9388 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9389 			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
9390 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
9391 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
9392 			BPF_MOV64_IMM(BPF_REG_0, 0),
9393 			BPF_EXIT_INSN(),
9394 		},
9395 		.errstr = "R1 offset is outside of the packet",
9396 		.result = REJECT,
9397 		.prog_type = BPF_PROG_TYPE_XDP,
9398 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9399 	},
9400 	{
9401 		"XDP pkt read, pkt_meta' <= pkt_data, bad access 2",
9402 		.insns = {
9403 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9404 				    offsetof(struct xdp_md, data_meta)),
9405 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9406 				    offsetof(struct xdp_md, data)),
9407 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9408 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9409 			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
9410 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9411 			BPF_MOV64_IMM(BPF_REG_0, 0),
9412 			BPF_EXIT_INSN(),
9413 		},
9414 		.errstr = "R1 offset is outside of the packet",
9415 		.result = REJECT,
9416 		.prog_type = BPF_PROG_TYPE_XDP,
9417 	},
9418 	{
9419 		"XDP pkt read, pkt_data <= pkt_meta', good access",
9420 		.insns = {
9421 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9422 				    offsetof(struct xdp_md, data_meta)),
9423 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9424 				    offsetof(struct xdp_md, data)),
9425 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9426 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9427 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
9428 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9429 			BPF_MOV64_IMM(BPF_REG_0, 0),
9430 			BPF_EXIT_INSN(),
9431 		},
9432 		.result = ACCEPT,
9433 		.prog_type = BPF_PROG_TYPE_XDP,
9434 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9435 	},
9436 	{
9437 		"XDP pkt read, pkt_data <= pkt_meta', bad access 1",
9438 		.insns = {
9439 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9440 				    offsetof(struct xdp_md, data_meta)),
9441 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9442 				    offsetof(struct xdp_md, data)),
9443 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9444 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9445 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
9446 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
9447 			BPF_MOV64_IMM(BPF_REG_0, 0),
9448 			BPF_EXIT_INSN(),
9449 		},
9450 		.errstr = "R1 offset is outside of the packet",
9451 		.result = REJECT,
9452 		.prog_type = BPF_PROG_TYPE_XDP,
9453 	},
9454 	{
9455 		"XDP pkt read, pkt_data <= pkt_meta', bad access 2",
9456 		.insns = {
9457 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
9458 				    offsetof(struct xdp_md, data_meta)),
9459 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
9460 				    offsetof(struct xdp_md, data)),
9461 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
9462 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
9463 			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0),
9464 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
9465 			BPF_MOV64_IMM(BPF_REG_0, 0),
9466 			BPF_EXIT_INSN(),
9467 		},
9468 		.errstr = "R1 offset is outside of the packet",
9469 		.result = REJECT,
9470 		.prog_type = BPF_PROG_TYPE_XDP,
9471 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
9472 	},
9473 	{
9474 		"check deducing bounds from const, 1",
9475 		.insns = {
9476 			BPF_MOV64_IMM(BPF_REG_0, 1),
9477 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 0),
9478 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
9479 			BPF_EXIT_INSN(),
9480 		},
9481 		.result = REJECT,
9482 		.errstr = "R0 tried to subtract pointer from scalar",
9483 	},
9484 	{
9485 		"check deducing bounds from const, 2",
9486 		.insns = {
9487 			BPF_MOV64_IMM(BPF_REG_0, 1),
9488 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1),
9489 			BPF_EXIT_INSN(),
9490 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 1, 1),
9491 			BPF_EXIT_INSN(),
9492 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
9493 			BPF_EXIT_INSN(),
9494 		},
9495 		.result = ACCEPT,
9496 		.retval = 1,
9497 	},
9498 	{
9499 		"check deducing bounds from const, 3",
9500 		.insns = {
9501 			BPF_MOV64_IMM(BPF_REG_0, 0),
9502 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0),
9503 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
9504 			BPF_EXIT_INSN(),
9505 		},
9506 		.result = REJECT,
9507 		.errstr = "R0 tried to subtract pointer from scalar",
9508 	},
9509 	{
9510 		"check deducing bounds from const, 4",
9511 		.insns = {
9512 			BPF_MOV64_IMM(BPF_REG_0, 0),
9513 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1),
9514 			BPF_EXIT_INSN(),
9515 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
9516 			BPF_EXIT_INSN(),
9517 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
9518 			BPF_EXIT_INSN(),
9519 		},
9520 		.result = ACCEPT,
9521 	},
9522 	{
9523 		"check deducing bounds from const, 5",
9524 		.insns = {
9525 			BPF_MOV64_IMM(BPF_REG_0, 0),
9526 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
9527 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
9528 			BPF_EXIT_INSN(),
9529 		},
9530 		.result = REJECT,
9531 		.errstr = "R0 tried to subtract pointer from scalar",
9532 	},
9533 	{
9534 		"check deducing bounds from const, 6",
9535 		.insns = {
9536 			BPF_MOV64_IMM(BPF_REG_0, 0),
9537 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
9538 			BPF_EXIT_INSN(),
9539 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
9540 			BPF_EXIT_INSN(),
9541 		},
9542 		.result = REJECT,
9543 		.errstr = "R0 tried to subtract pointer from scalar",
9544 	},
9545 	{
9546 		"check deducing bounds from const, 7",
9547 		.insns = {
9548 			BPF_MOV64_IMM(BPF_REG_0, ~0),
9549 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0),
9550 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
9551 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9552 				    offsetof(struct __sk_buff, mark)),
9553 			BPF_EXIT_INSN(),
9554 		},
9555 		.result = REJECT,
9556 		.errstr = "dereference of modified ctx ptr",
9557 	},
9558 	{
9559 		"check deducing bounds from const, 8",
9560 		.insns = {
9561 			BPF_MOV64_IMM(BPF_REG_0, ~0),
9562 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
9563 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
9564 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9565 				    offsetof(struct __sk_buff, mark)),
9566 			BPF_EXIT_INSN(),
9567 		},
9568 		.result = REJECT,
9569 		.errstr = "dereference of modified ctx ptr",
9570 	},
9571 	{
9572 		"check deducing bounds from const, 9",
9573 		.insns = {
9574 			BPF_MOV64_IMM(BPF_REG_0, 0),
9575 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0),
9576 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
9577 			BPF_EXIT_INSN(),
9578 		},
9579 		.result = REJECT,
9580 		.errstr = "R0 tried to subtract pointer from scalar",
9581 	},
9582 	{
9583 		"check deducing bounds from const, 10",
9584 		.insns = {
9585 			BPF_MOV64_IMM(BPF_REG_0, 0),
9586 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0),
9587 			/* Marks reg as unknown. */
9588 			BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0),
9589 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
9590 			BPF_EXIT_INSN(),
9591 		},
9592 		.result = REJECT,
9593 		.errstr = "math between ctx pointer and register with unbounded min value is not allowed",
9594 	},
9595 	{
9596 		"bpf_exit with invalid return code. test1",
9597 		.insns = {
9598 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
9599 			BPF_EXIT_INSN(),
9600 		},
9601 		.errstr = "R0 has value (0x0; 0xffffffff)",
9602 		.result = REJECT,
9603 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9604 	},
9605 	{
9606 		"bpf_exit with invalid return code. test2",
9607 		.insns = {
9608 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
9609 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1),
9610 			BPF_EXIT_INSN(),
9611 		},
9612 		.result = ACCEPT,
9613 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9614 	},
9615 	{
9616 		"bpf_exit with invalid return code. test3",
9617 		.insns = {
9618 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
9619 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 3),
9620 			BPF_EXIT_INSN(),
9621 		},
9622 		.errstr = "R0 has value (0x0; 0x3)",
9623 		.result = REJECT,
9624 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9625 	},
9626 	{
9627 		"bpf_exit with invalid return code. test4",
9628 		.insns = {
9629 			BPF_MOV64_IMM(BPF_REG_0, 1),
9630 			BPF_EXIT_INSN(),
9631 		},
9632 		.result = ACCEPT,
9633 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9634 	},
9635 	{
9636 		"bpf_exit with invalid return code. test5",
9637 		.insns = {
9638 			BPF_MOV64_IMM(BPF_REG_0, 2),
9639 			BPF_EXIT_INSN(),
9640 		},
9641 		.errstr = "R0 has value (0x2; 0x0)",
9642 		.result = REJECT,
9643 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9644 	},
9645 	{
9646 		"bpf_exit with invalid return code. test6",
9647 		.insns = {
9648 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
9649 			BPF_EXIT_INSN(),
9650 		},
9651 		.errstr = "R0 is not a known value (ctx)",
9652 		.result = REJECT,
9653 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9654 	},
9655 	{
9656 		"bpf_exit with invalid return code. test7",
9657 		.insns = {
9658 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
9659 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4),
9660 			BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_2),
9661 			BPF_EXIT_INSN(),
9662 		},
9663 		.errstr = "R0 has unknown scalar value",
9664 		.result = REJECT,
9665 		.prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
9666 	},
9667 	{
9668 		"calls: basic sanity",
9669 		.insns = {
9670 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
9671 			BPF_MOV64_IMM(BPF_REG_0, 1),
9672 			BPF_EXIT_INSN(),
9673 			BPF_MOV64_IMM(BPF_REG_0, 2),
9674 			BPF_EXIT_INSN(),
9675 		},
9676 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9677 		.result = ACCEPT,
9678 	},
9679 	{
9680 		"calls: not on unpriviledged",
9681 		.insns = {
9682 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
9683 			BPF_MOV64_IMM(BPF_REG_0, 1),
9684 			BPF_EXIT_INSN(),
9685 			BPF_MOV64_IMM(BPF_REG_0, 2),
9686 			BPF_EXIT_INSN(),
9687 		},
9688 		.errstr_unpriv = "function calls to other bpf functions are allowed for root only",
9689 		.result_unpriv = REJECT,
9690 		.result = ACCEPT,
9691 		.retval = 1,
9692 	},
9693 	{
9694 		"calls: div by 0 in subprog",
9695 		.insns = {
9696 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
9697 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
9698 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
9699 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
9700 				    offsetof(struct __sk_buff, data_end)),
9701 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
9702 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
9703 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
9704 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
9705 			BPF_MOV64_IMM(BPF_REG_0, 1),
9706 			BPF_EXIT_INSN(),
9707 			BPF_MOV32_IMM(BPF_REG_2, 0),
9708 			BPF_MOV32_IMM(BPF_REG_3, 1),
9709 			BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2),
9710 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9711 				    offsetof(struct __sk_buff, data)),
9712 			BPF_EXIT_INSN(),
9713 		},
9714 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
9715 		.result = ACCEPT,
9716 		.retval = 1,
9717 	},
9718 	{
9719 		"calls: multiple ret types in subprog 1",
9720 		.insns = {
9721 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
9722 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
9723 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
9724 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
9725 				    offsetof(struct __sk_buff, data_end)),
9726 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
9727 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
9728 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
9729 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
9730 			BPF_MOV64_IMM(BPF_REG_0, 1),
9731 			BPF_EXIT_INSN(),
9732 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9733 				    offsetof(struct __sk_buff, data)),
9734 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
9735 			BPF_MOV32_IMM(BPF_REG_0, 42),
9736 			BPF_EXIT_INSN(),
9737 		},
9738 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
9739 		.result = REJECT,
9740 		.errstr = "R0 invalid mem access 'inv'",
9741 	},
9742 	{
9743 		"calls: multiple ret types in subprog 2",
9744 		.insns = {
9745 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
9746 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
9747 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
9748 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
9749 				    offsetof(struct __sk_buff, data_end)),
9750 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
9751 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
9752 			BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
9753 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
9754 			BPF_MOV64_IMM(BPF_REG_0, 1),
9755 			BPF_EXIT_INSN(),
9756 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9757 				    offsetof(struct __sk_buff, data)),
9758 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
9759 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9),
9760 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
9761 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
9762 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
9763 			BPF_LD_MAP_FD(BPF_REG_1, 0),
9764 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
9765 				     BPF_FUNC_map_lookup_elem),
9766 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
9767 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6,
9768 				    offsetof(struct __sk_buff, data)),
9769 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64),
9770 			BPF_EXIT_INSN(),
9771 		},
9772 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
9773 		.fixup_map1 = { 16 },
9774 		.result = REJECT,
9775 		.errstr = "R0 min value is outside of the array range",
9776 	},
9777 	{
9778 		"calls: overlapping caller/callee",
9779 		.insns = {
9780 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0),
9781 			BPF_MOV64_IMM(BPF_REG_0, 1),
9782 			BPF_EXIT_INSN(),
9783 		},
9784 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9785 		.errstr = "last insn is not an exit or jmp",
9786 		.result = REJECT,
9787 	},
9788 	{
9789 		"calls: wrong recursive calls",
9790 		.insns = {
9791 			BPF_JMP_IMM(BPF_JA, 0, 0, 4),
9792 			BPF_JMP_IMM(BPF_JA, 0, 0, 4),
9793 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
9794 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
9795 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
9796 			BPF_MOV64_IMM(BPF_REG_0, 1),
9797 			BPF_EXIT_INSN(),
9798 		},
9799 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9800 		.errstr = "jump out of range",
9801 		.result = REJECT,
9802 	},
9803 	{
9804 		"calls: wrong src reg",
9805 		.insns = {
9806 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0),
9807 			BPF_MOV64_IMM(BPF_REG_0, 1),
9808 			BPF_EXIT_INSN(),
9809 		},
9810 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9811 		.errstr = "BPF_CALL uses reserved fields",
9812 		.result = REJECT,
9813 	},
9814 	{
9815 		"calls: wrong off value",
9816 		.insns = {
9817 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2),
9818 			BPF_MOV64_IMM(BPF_REG_0, 1),
9819 			BPF_EXIT_INSN(),
9820 			BPF_MOV64_IMM(BPF_REG_0, 2),
9821 			BPF_EXIT_INSN(),
9822 		},
9823 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9824 		.errstr = "BPF_CALL uses reserved fields",
9825 		.result = REJECT,
9826 	},
9827 	{
9828 		"calls: jump back loop",
9829 		.insns = {
9830 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1),
9831 			BPF_MOV64_IMM(BPF_REG_0, 1),
9832 			BPF_EXIT_INSN(),
9833 		},
9834 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9835 		.errstr = "back-edge from insn 0 to 0",
9836 		.result = REJECT,
9837 	},
9838 	{
9839 		"calls: conditional call",
9840 		.insns = {
9841 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9842 				    offsetof(struct __sk_buff, mark)),
9843 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
9844 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
9845 			BPF_MOV64_IMM(BPF_REG_0, 1),
9846 			BPF_EXIT_INSN(),
9847 			BPF_MOV64_IMM(BPF_REG_0, 2),
9848 			BPF_EXIT_INSN(),
9849 		},
9850 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9851 		.errstr = "jump out of range",
9852 		.result = REJECT,
9853 	},
9854 	{
9855 		"calls: conditional call 2",
9856 		.insns = {
9857 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9858 				    offsetof(struct __sk_buff, mark)),
9859 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
9860 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
9861 			BPF_MOV64_IMM(BPF_REG_0, 1),
9862 			BPF_EXIT_INSN(),
9863 			BPF_MOV64_IMM(BPF_REG_0, 2),
9864 			BPF_EXIT_INSN(),
9865 			BPF_MOV64_IMM(BPF_REG_0, 3),
9866 			BPF_EXIT_INSN(),
9867 		},
9868 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9869 		.result = ACCEPT,
9870 	},
9871 	{
9872 		"calls: conditional call 3",
9873 		.insns = {
9874 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9875 				    offsetof(struct __sk_buff, mark)),
9876 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
9877 			BPF_JMP_IMM(BPF_JA, 0, 0, 4),
9878 			BPF_MOV64_IMM(BPF_REG_0, 1),
9879 			BPF_EXIT_INSN(),
9880 			BPF_MOV64_IMM(BPF_REG_0, 1),
9881 			BPF_JMP_IMM(BPF_JA, 0, 0, -6),
9882 			BPF_MOV64_IMM(BPF_REG_0, 3),
9883 			BPF_JMP_IMM(BPF_JA, 0, 0, -6),
9884 		},
9885 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9886 		.errstr = "back-edge from insn",
9887 		.result = REJECT,
9888 	},
9889 	{
9890 		"calls: conditional call 4",
9891 		.insns = {
9892 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9893 				    offsetof(struct __sk_buff, mark)),
9894 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
9895 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
9896 			BPF_MOV64_IMM(BPF_REG_0, 1),
9897 			BPF_EXIT_INSN(),
9898 			BPF_MOV64_IMM(BPF_REG_0, 1),
9899 			BPF_JMP_IMM(BPF_JA, 0, 0, -5),
9900 			BPF_MOV64_IMM(BPF_REG_0, 3),
9901 			BPF_EXIT_INSN(),
9902 		},
9903 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9904 		.result = ACCEPT,
9905 	},
9906 	{
9907 		"calls: conditional call 5",
9908 		.insns = {
9909 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9910 				    offsetof(struct __sk_buff, mark)),
9911 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
9912 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
9913 			BPF_MOV64_IMM(BPF_REG_0, 1),
9914 			BPF_EXIT_INSN(),
9915 			BPF_MOV64_IMM(BPF_REG_0, 1),
9916 			BPF_JMP_IMM(BPF_JA, 0, 0, -6),
9917 			BPF_MOV64_IMM(BPF_REG_0, 3),
9918 			BPF_EXIT_INSN(),
9919 		},
9920 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9921 		.errstr = "back-edge from insn",
9922 		.result = REJECT,
9923 	},
9924 	{
9925 		"calls: conditional call 6",
9926 		.insns = {
9927 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
9928 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -2),
9929 			BPF_EXIT_INSN(),
9930 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9931 				    offsetof(struct __sk_buff, mark)),
9932 			BPF_EXIT_INSN(),
9933 		},
9934 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9935 		.errstr = "back-edge from insn",
9936 		.result = REJECT,
9937 	},
9938 	{
9939 		"calls: using r0 returned by callee",
9940 		.insns = {
9941 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
9942 			BPF_EXIT_INSN(),
9943 			BPF_MOV64_IMM(BPF_REG_0, 2),
9944 			BPF_EXIT_INSN(),
9945 		},
9946 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9947 		.result = ACCEPT,
9948 	},
9949 	{
9950 		"calls: using uninit r0 from callee",
9951 		.insns = {
9952 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
9953 			BPF_EXIT_INSN(),
9954 			BPF_EXIT_INSN(),
9955 		},
9956 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9957 		.errstr = "!read_ok",
9958 		.result = REJECT,
9959 	},
9960 	{
9961 		"calls: callee is using r1",
9962 		.insns = {
9963 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
9964 			BPF_EXIT_INSN(),
9965 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
9966 				    offsetof(struct __sk_buff, len)),
9967 			BPF_EXIT_INSN(),
9968 		},
9969 		.prog_type = BPF_PROG_TYPE_SCHED_ACT,
9970 		.result = ACCEPT,
9971 		.retval = TEST_DATA_LEN,
9972 	},
9973 	{
9974 		"calls: callee using args1",
9975 		.insns = {
9976 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
9977 			BPF_EXIT_INSN(),
9978 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
9979 			BPF_EXIT_INSN(),
9980 		},
9981 		.errstr_unpriv = "allowed for root only",
9982 		.result_unpriv = REJECT,
9983 		.result = ACCEPT,
9984 		.retval = POINTER_VALUE,
9985 	},
9986 	{
9987 		"calls: callee using wrong args2",
9988 		.insns = {
9989 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
9990 			BPF_EXIT_INSN(),
9991 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
9992 			BPF_EXIT_INSN(),
9993 		},
9994 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
9995 		.errstr = "R2 !read_ok",
9996 		.result = REJECT,
9997 	},
9998 	{
9999 		"calls: callee using two args",
10000 		.insns = {
10001 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10002 			BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6,
10003 				    offsetof(struct __sk_buff, len)),
10004 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6,
10005 				    offsetof(struct __sk_buff, len)),
10006 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10007 			BPF_EXIT_INSN(),
10008 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
10009 			BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
10010 			BPF_EXIT_INSN(),
10011 		},
10012 		.errstr_unpriv = "allowed for root only",
10013 		.result_unpriv = REJECT,
10014 		.result = ACCEPT,
10015 		.retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN,
10016 	},
10017 	{
10018 		"calls: callee changing pkt pointers",
10019 		.insns = {
10020 			BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
10021 				    offsetof(struct xdp_md, data)),
10022 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
10023 				    offsetof(struct xdp_md, data_end)),
10024 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_6),
10025 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8),
10026 			BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2),
10027 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10028 			/* clear_all_pkt_pointers() has to walk all frames
10029 			 * to make sure that pkt pointers in the caller
10030 			 * are cleared when callee is calling a helper that
10031 			 * adjusts packet size
10032 			 */
10033 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
10034 			BPF_MOV32_IMM(BPF_REG_0, 0),
10035 			BPF_EXIT_INSN(),
10036 			BPF_MOV64_IMM(BPF_REG_2, 0),
10037 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10038 				     BPF_FUNC_xdp_adjust_head),
10039 			BPF_EXIT_INSN(),
10040 		},
10041 		.result = REJECT,
10042 		.errstr = "R6 invalid mem access 'inv'",
10043 		.prog_type = BPF_PROG_TYPE_XDP,
10044 	},
10045 	{
10046 		"calls: two calls with args",
10047 		.insns = {
10048 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10049 			BPF_EXIT_INSN(),
10050 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10051 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
10052 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
10053 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10054 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10055 			BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
10056 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
10057 			BPF_EXIT_INSN(),
10058 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
10059 				    offsetof(struct __sk_buff, len)),
10060 			BPF_EXIT_INSN(),
10061 		},
10062 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10063 		.result = ACCEPT,
10064 		.retval = TEST_DATA_LEN + TEST_DATA_LEN,
10065 	},
10066 	{
10067 		"calls: calls with stack arith",
10068 		.insns = {
10069 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10070 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
10071 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10072 			BPF_EXIT_INSN(),
10073 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
10074 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10075 			BPF_EXIT_INSN(),
10076 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
10077 			BPF_MOV64_IMM(BPF_REG_0, 42),
10078 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
10079 			BPF_EXIT_INSN(),
10080 		},
10081 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10082 		.result = ACCEPT,
10083 		.retval = 42,
10084 	},
10085 	{
10086 		"calls: calls with misaligned stack access",
10087 		.insns = {
10088 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10089 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63),
10090 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10091 			BPF_EXIT_INSN(),
10092 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61),
10093 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10094 			BPF_EXIT_INSN(),
10095 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63),
10096 			BPF_MOV64_IMM(BPF_REG_0, 42),
10097 			BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
10098 			BPF_EXIT_INSN(),
10099 		},
10100 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10101 		.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
10102 		.errstr = "misaligned stack access",
10103 		.result = REJECT,
10104 	},
10105 	{
10106 		"calls: calls control flow, jump test",
10107 		.insns = {
10108 			BPF_MOV64_IMM(BPF_REG_0, 42),
10109 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
10110 			BPF_MOV64_IMM(BPF_REG_0, 43),
10111 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
10112 			BPF_JMP_IMM(BPF_JA, 0, 0, -3),
10113 			BPF_EXIT_INSN(),
10114 		},
10115 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10116 		.result = ACCEPT,
10117 		.retval = 43,
10118 	},
10119 	{
10120 		"calls: calls control flow, jump test 2",
10121 		.insns = {
10122 			BPF_MOV64_IMM(BPF_REG_0, 42),
10123 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
10124 			BPF_MOV64_IMM(BPF_REG_0, 43),
10125 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
10126 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3),
10127 			BPF_EXIT_INSN(),
10128 		},
10129 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10130 		.errstr = "jump out of range from insn 1 to 4",
10131 		.result = REJECT,
10132 	},
10133 	{
10134 		"calls: two calls with bad jump",
10135 		.insns = {
10136 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10137 			BPF_EXIT_INSN(),
10138 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10139 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
10140 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
10141 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10142 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10143 			BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
10144 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
10145 			BPF_EXIT_INSN(),
10146 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
10147 				    offsetof(struct __sk_buff, len)),
10148 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3),
10149 			BPF_EXIT_INSN(),
10150 		},
10151 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10152 		.errstr = "jump out of range from insn 11 to 9",
10153 		.result = REJECT,
10154 	},
10155 	{
10156 		"calls: recursive call. test1",
10157 		.insns = {
10158 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10159 			BPF_EXIT_INSN(),
10160 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1),
10161 			BPF_EXIT_INSN(),
10162 		},
10163 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10164 		.errstr = "back-edge",
10165 		.result = REJECT,
10166 	},
10167 	{
10168 		"calls: recursive call. test2",
10169 		.insns = {
10170 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10171 			BPF_EXIT_INSN(),
10172 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3),
10173 			BPF_EXIT_INSN(),
10174 		},
10175 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10176 		.errstr = "back-edge",
10177 		.result = REJECT,
10178 	},
10179 	{
10180 		"calls: unreachable code",
10181 		.insns = {
10182 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10183 			BPF_EXIT_INSN(),
10184 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10185 			BPF_EXIT_INSN(),
10186 			BPF_MOV64_IMM(BPF_REG_0, 0),
10187 			BPF_EXIT_INSN(),
10188 			BPF_MOV64_IMM(BPF_REG_0, 0),
10189 			BPF_EXIT_INSN(),
10190 		},
10191 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10192 		.errstr = "unreachable insn 6",
10193 		.result = REJECT,
10194 	},
10195 	{
10196 		"calls: invalid call",
10197 		.insns = {
10198 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10199 			BPF_EXIT_INSN(),
10200 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4),
10201 			BPF_EXIT_INSN(),
10202 		},
10203 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10204 		.errstr = "invalid destination",
10205 		.result = REJECT,
10206 	},
10207 	{
10208 		"calls: invalid call 2",
10209 		.insns = {
10210 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10211 			BPF_EXIT_INSN(),
10212 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff),
10213 			BPF_EXIT_INSN(),
10214 		},
10215 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10216 		.errstr = "invalid destination",
10217 		.result = REJECT,
10218 	},
10219 	{
10220 		"calls: jumping across function bodies. test1",
10221 		.insns = {
10222 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10223 			BPF_MOV64_IMM(BPF_REG_0, 0),
10224 			BPF_EXIT_INSN(),
10225 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3),
10226 			BPF_EXIT_INSN(),
10227 		},
10228 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10229 		.errstr = "jump out of range",
10230 		.result = REJECT,
10231 	},
10232 	{
10233 		"calls: jumping across function bodies. test2",
10234 		.insns = {
10235 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
10236 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10237 			BPF_MOV64_IMM(BPF_REG_0, 0),
10238 			BPF_EXIT_INSN(),
10239 			BPF_EXIT_INSN(),
10240 		},
10241 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10242 		.errstr = "jump out of range",
10243 		.result = REJECT,
10244 	},
10245 	{
10246 		"calls: call without exit",
10247 		.insns = {
10248 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10249 			BPF_EXIT_INSN(),
10250 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10251 			BPF_EXIT_INSN(),
10252 			BPF_MOV64_IMM(BPF_REG_0, 0),
10253 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2),
10254 		},
10255 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10256 		.errstr = "not an exit",
10257 		.result = REJECT,
10258 	},
10259 	{
10260 		"calls: call into middle of ld_imm64",
10261 		.insns = {
10262 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10263 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10264 			BPF_MOV64_IMM(BPF_REG_0, 0),
10265 			BPF_EXIT_INSN(),
10266 			BPF_LD_IMM64(BPF_REG_0, 0),
10267 			BPF_EXIT_INSN(),
10268 		},
10269 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10270 		.errstr = "last insn",
10271 		.result = REJECT,
10272 	},
10273 	{
10274 		"calls: call into middle of other call",
10275 		.insns = {
10276 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10277 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10278 			BPF_MOV64_IMM(BPF_REG_0, 0),
10279 			BPF_EXIT_INSN(),
10280 			BPF_MOV64_IMM(BPF_REG_0, 0),
10281 			BPF_MOV64_IMM(BPF_REG_0, 0),
10282 			BPF_EXIT_INSN(),
10283 		},
10284 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10285 		.errstr = "last insn",
10286 		.result = REJECT,
10287 	},
10288 	{
10289 		"calls: ld_abs with changing ctx data in callee",
10290 		.insns = {
10291 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10292 			BPF_LD_ABS(BPF_B, 0),
10293 			BPF_LD_ABS(BPF_H, 0),
10294 			BPF_LD_ABS(BPF_W, 0),
10295 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
10296 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
10297 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
10298 			BPF_LD_ABS(BPF_B, 0),
10299 			BPF_LD_ABS(BPF_H, 0),
10300 			BPF_LD_ABS(BPF_W, 0),
10301 			BPF_EXIT_INSN(),
10302 			BPF_MOV64_IMM(BPF_REG_2, 1),
10303 			BPF_MOV64_IMM(BPF_REG_3, 2),
10304 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10305 				     BPF_FUNC_skb_vlan_push),
10306 			BPF_EXIT_INSN(),
10307 		},
10308 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10309 		.errstr = "BPF_LD_[ABS|IND] instructions cannot be mixed",
10310 		.result = REJECT,
10311 	},
10312 	{
10313 		"calls: two calls with bad fallthrough",
10314 		.insns = {
10315 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10316 			BPF_EXIT_INSN(),
10317 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10318 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
10319 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
10320 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10321 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10322 			BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
10323 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
10324 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_0),
10325 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
10326 				    offsetof(struct __sk_buff, len)),
10327 			BPF_EXIT_INSN(),
10328 		},
10329 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
10330 		.errstr = "not an exit",
10331 		.result = REJECT,
10332 	},
10333 	{
10334 		"calls: two calls with stack read",
10335 		.insns = {
10336 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10337 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10338 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10339 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10340 			BPF_EXIT_INSN(),
10341 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10342 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
10343 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
10344 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10345 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10346 			BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
10347 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
10348 			BPF_EXIT_INSN(),
10349 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
10350 			BPF_EXIT_INSN(),
10351 		},
10352 		.prog_type = BPF_PROG_TYPE_XDP,
10353 		.result = ACCEPT,
10354 	},
10355 	{
10356 		"calls: two calls with stack write",
10357 		.insns = {
10358 			/* main prog */
10359 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10360 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10361 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10362 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10363 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10364 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10365 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
10366 			BPF_EXIT_INSN(),
10367 
10368 			/* subprog 1 */
10369 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10370 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10371 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7),
10372 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
10373 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10374 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
10375 			BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
10376 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_8),
10377 			/* write into stack frame of main prog */
10378 			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
10379 			BPF_EXIT_INSN(),
10380 
10381 			/* subprog 2 */
10382 			/* read from stack frame of main prog */
10383 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
10384 			BPF_EXIT_INSN(),
10385 		},
10386 		.prog_type = BPF_PROG_TYPE_XDP,
10387 		.result = ACCEPT,
10388 	},
10389 	{
10390 		"calls: stack overflow using two frames (pre-call access)",
10391 		.insns = {
10392 			/* prog 1 */
10393 			BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
10394 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1),
10395 			BPF_EXIT_INSN(),
10396 
10397 			/* prog 2 */
10398 			BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
10399 			BPF_MOV64_IMM(BPF_REG_0, 0),
10400 			BPF_EXIT_INSN(),
10401 		},
10402 		.prog_type = BPF_PROG_TYPE_XDP,
10403 		.errstr = "combined stack size",
10404 		.result = REJECT,
10405 	},
10406 	{
10407 		"calls: stack overflow using two frames (post-call access)",
10408 		.insns = {
10409 			/* prog 1 */
10410 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2),
10411 			BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
10412 			BPF_EXIT_INSN(),
10413 
10414 			/* prog 2 */
10415 			BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
10416 			BPF_MOV64_IMM(BPF_REG_0, 0),
10417 			BPF_EXIT_INSN(),
10418 		},
10419 		.prog_type = BPF_PROG_TYPE_XDP,
10420 		.errstr = "combined stack size",
10421 		.result = REJECT,
10422 	},
10423 	{
10424 		"calls: stack depth check using three frames. test1",
10425 		.insns = {
10426 			/* main */
10427 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
10428 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */
10429 			BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0),
10430 			BPF_MOV64_IMM(BPF_REG_0, 0),
10431 			BPF_EXIT_INSN(),
10432 			/* A */
10433 			BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
10434 			BPF_EXIT_INSN(),
10435 			/* B */
10436 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */
10437 			BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
10438 			BPF_EXIT_INSN(),
10439 		},
10440 		.prog_type = BPF_PROG_TYPE_XDP,
10441 		/* stack_main=32, stack_A=256, stack_B=64
10442 		 * and max(main+A, main+A+B) < 512
10443 		 */
10444 		.result = ACCEPT,
10445 	},
10446 	{
10447 		"calls: stack depth check using three frames. test2",
10448 		.insns = {
10449 			/* main */
10450 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
10451 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */
10452 			BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0),
10453 			BPF_MOV64_IMM(BPF_REG_0, 0),
10454 			BPF_EXIT_INSN(),
10455 			/* A */
10456 			BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
10457 			BPF_EXIT_INSN(),
10458 			/* B */
10459 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */
10460 			BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
10461 			BPF_EXIT_INSN(),
10462 		},
10463 		.prog_type = BPF_PROG_TYPE_XDP,
10464 		/* stack_main=32, stack_A=64, stack_B=256
10465 		 * and max(main+A, main+A+B) < 512
10466 		 */
10467 		.result = ACCEPT,
10468 	},
10469 	{
10470 		"calls: stack depth check using three frames. test3",
10471 		.insns = {
10472 			/* main */
10473 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10474 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */
10475 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10476 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */
10477 			BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1),
10478 			BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
10479 			BPF_MOV64_IMM(BPF_REG_0, 0),
10480 			BPF_EXIT_INSN(),
10481 			/* A */
10482 			BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1),
10483 			BPF_EXIT_INSN(),
10484 			BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0),
10485 			BPF_JMP_IMM(BPF_JA, 0, 0, -3),
10486 			/* B */
10487 			BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1),
10488 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */
10489 			BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
10490 			BPF_EXIT_INSN(),
10491 		},
10492 		.prog_type = BPF_PROG_TYPE_XDP,
10493 		/* stack_main=64, stack_A=224, stack_B=256
10494 		 * and max(main+A, main+A+B) > 512
10495 		 */
10496 		.errstr = "combined stack",
10497 		.result = REJECT,
10498 	},
10499 	{
10500 		"calls: stack depth check using three frames. test4",
10501 		/* void main(void) {
10502 		 *   func1(0);
10503 		 *   func1(1);
10504 		 *   func2(1);
10505 		 * }
10506 		 * void func1(int alloc_or_recurse) {
10507 		 *   if (alloc_or_recurse) {
10508 		 *     frame_pointer[-300] = 1;
10509 		 *   } else {
10510 		 *     func2(alloc_or_recurse);
10511 		 *   }
10512 		 * }
10513 		 * void func2(int alloc_or_recurse) {
10514 		 *   if (alloc_or_recurse) {
10515 		 *     frame_pointer[-300] = 1;
10516 		 *   }
10517 		 * }
10518 		 */
10519 		.insns = {
10520 			/* main */
10521 			BPF_MOV64_IMM(BPF_REG_1, 0),
10522 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */
10523 			BPF_MOV64_IMM(BPF_REG_1, 1),
10524 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
10525 			BPF_MOV64_IMM(BPF_REG_1, 1),
10526 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */
10527 			BPF_MOV64_IMM(BPF_REG_0, 0),
10528 			BPF_EXIT_INSN(),
10529 			/* A */
10530 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2),
10531 			BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
10532 			BPF_EXIT_INSN(),
10533 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */
10534 			BPF_EXIT_INSN(),
10535 			/* B */
10536 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
10537 			BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
10538 			BPF_EXIT_INSN(),
10539 		},
10540 		.prog_type = BPF_PROG_TYPE_XDP,
10541 		.result = REJECT,
10542 		.errstr = "combined stack",
10543 	},
10544 	{
10545 		"calls: stack depth check using three frames. test5",
10546 		.insns = {
10547 			/* main */
10548 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */
10549 			BPF_EXIT_INSN(),
10550 			/* A */
10551 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */
10552 			BPF_EXIT_INSN(),
10553 			/* B */
10554 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */
10555 			BPF_EXIT_INSN(),
10556 			/* C */
10557 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */
10558 			BPF_EXIT_INSN(),
10559 			/* D */
10560 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */
10561 			BPF_EXIT_INSN(),
10562 			/* E */
10563 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */
10564 			BPF_EXIT_INSN(),
10565 			/* F */
10566 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */
10567 			BPF_EXIT_INSN(),
10568 			/* G */
10569 			BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */
10570 			BPF_EXIT_INSN(),
10571 			/* H */
10572 			BPF_MOV64_IMM(BPF_REG_0, 0),
10573 			BPF_EXIT_INSN(),
10574 		},
10575 		.prog_type = BPF_PROG_TYPE_XDP,
10576 		.errstr = "call stack",
10577 		.result = REJECT,
10578 	},
10579 	{
10580 		"calls: spill into caller stack frame",
10581 		.insns = {
10582 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10583 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10584 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10585 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10586 			BPF_EXIT_INSN(),
10587 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0),
10588 			BPF_MOV64_IMM(BPF_REG_0, 0),
10589 			BPF_EXIT_INSN(),
10590 		},
10591 		.prog_type = BPF_PROG_TYPE_XDP,
10592 		.errstr = "cannot spill",
10593 		.result = REJECT,
10594 	},
10595 	{
10596 		"calls: write into caller stack frame",
10597 		.insns = {
10598 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10599 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10600 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10601 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10602 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
10603 			BPF_EXIT_INSN(),
10604 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42),
10605 			BPF_MOV64_IMM(BPF_REG_0, 0),
10606 			BPF_EXIT_INSN(),
10607 		},
10608 		.prog_type = BPF_PROG_TYPE_XDP,
10609 		.result = ACCEPT,
10610 		.retval = 42,
10611 	},
10612 	{
10613 		"calls: write into callee stack frame",
10614 		.insns = {
10615 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10616 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
10617 			BPF_EXIT_INSN(),
10618 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
10619 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8),
10620 			BPF_EXIT_INSN(),
10621 		},
10622 		.prog_type = BPF_PROG_TYPE_XDP,
10623 		.errstr = "cannot return stack pointer",
10624 		.result = REJECT,
10625 	},
10626 	{
10627 		"calls: two calls with stack write and void return",
10628 		.insns = {
10629 			/* main prog */
10630 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10631 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10632 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10633 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10634 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10635 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10636 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
10637 			BPF_EXIT_INSN(),
10638 
10639 			/* subprog 1 */
10640 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10641 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10642 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10643 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
10644 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10645 			BPF_EXIT_INSN(),
10646 
10647 			/* subprog 2 */
10648 			/* write into stack frame of main prog */
10649 			BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
10650 			BPF_EXIT_INSN(), /* void return */
10651 		},
10652 		.prog_type = BPF_PROG_TYPE_XDP,
10653 		.result = ACCEPT,
10654 	},
10655 	{
10656 		"calls: ambiguous return value",
10657 		.insns = {
10658 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10659 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
10660 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
10661 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10662 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10663 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
10664 			BPF_EXIT_INSN(),
10665 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
10666 			BPF_MOV64_IMM(BPF_REG_0, 0),
10667 			BPF_EXIT_INSN(),
10668 		},
10669 		.errstr_unpriv = "allowed for root only",
10670 		.result_unpriv = REJECT,
10671 		.errstr = "R0 !read_ok",
10672 		.result = REJECT,
10673 	},
10674 	{
10675 		"calls: two calls that return map_value",
10676 		.insns = {
10677 			/* main prog */
10678 			/* pass fp-16, fp-8 into a function */
10679 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10680 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10681 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10682 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10683 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
10684 
10685 			/* fetch map_value_ptr from the stack of this function */
10686 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
10687 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
10688 			/* write into map value */
10689 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10690 			/* fetch secound map_value_ptr from the stack */
10691 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
10692 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
10693 			/* write into map value */
10694 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10695 			BPF_MOV64_IMM(BPF_REG_0, 0),
10696 			BPF_EXIT_INSN(),
10697 
10698 			/* subprog 1 */
10699 			/* call 3rd function twice */
10700 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10701 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10702 			/* first time with fp-8 */
10703 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10704 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
10705 			/* second time with fp-16 */
10706 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10707 			BPF_EXIT_INSN(),
10708 
10709 			/* subprog 2 */
10710 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10711 			/* lookup from map */
10712 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10713 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10714 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10715 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10716 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10717 				     BPF_FUNC_map_lookup_elem),
10718 			/* write map_value_ptr into stack frame of main prog */
10719 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
10720 			BPF_MOV64_IMM(BPF_REG_0, 0),
10721 			BPF_EXIT_INSN(), /* return 0 */
10722 		},
10723 		.prog_type = BPF_PROG_TYPE_XDP,
10724 		.fixup_map1 = { 23 },
10725 		.result = ACCEPT,
10726 	},
10727 	{
10728 		"calls: two calls that return map_value with bool condition",
10729 		.insns = {
10730 			/* main prog */
10731 			/* pass fp-16, fp-8 into a function */
10732 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10733 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10734 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10735 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10736 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10737 			BPF_MOV64_IMM(BPF_REG_0, 0),
10738 			BPF_EXIT_INSN(),
10739 
10740 			/* subprog 1 */
10741 			/* call 3rd function twice */
10742 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10743 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10744 			/* first time with fp-8 */
10745 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9),
10746 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
10747 			/* fetch map_value_ptr from the stack of this function */
10748 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
10749 			/* write into map value */
10750 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10751 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
10752 			/* second time with fp-16 */
10753 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
10754 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
10755 			/* fetch secound map_value_ptr from the stack */
10756 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
10757 			/* write into map value */
10758 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10759 			BPF_EXIT_INSN(),
10760 
10761 			/* subprog 2 */
10762 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10763 			/* lookup from map */
10764 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10765 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10766 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10767 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10768 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10769 				     BPF_FUNC_map_lookup_elem),
10770 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10771 			BPF_MOV64_IMM(BPF_REG_0, 0),
10772 			BPF_EXIT_INSN(), /* return 0 */
10773 			/* write map_value_ptr into stack frame of main prog */
10774 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
10775 			BPF_MOV64_IMM(BPF_REG_0, 1),
10776 			BPF_EXIT_INSN(), /* return 1 */
10777 		},
10778 		.prog_type = BPF_PROG_TYPE_XDP,
10779 		.fixup_map1 = { 23 },
10780 		.result = ACCEPT,
10781 	},
10782 	{
10783 		"calls: two calls that return map_value with incorrect bool check",
10784 		.insns = {
10785 			/* main prog */
10786 			/* pass fp-16, fp-8 into a function */
10787 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10788 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10789 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10790 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10791 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10792 			BPF_MOV64_IMM(BPF_REG_0, 0),
10793 			BPF_EXIT_INSN(),
10794 
10795 			/* subprog 1 */
10796 			/* call 3rd function twice */
10797 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10798 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10799 			/* first time with fp-8 */
10800 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9),
10801 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
10802 			/* fetch map_value_ptr from the stack of this function */
10803 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
10804 			/* write into map value */
10805 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10806 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
10807 			/* second time with fp-16 */
10808 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
10809 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10810 			/* fetch secound map_value_ptr from the stack */
10811 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
10812 			/* write into map value */
10813 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10814 			BPF_EXIT_INSN(),
10815 
10816 			/* subprog 2 */
10817 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10818 			/* lookup from map */
10819 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10820 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10821 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10822 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10823 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10824 				     BPF_FUNC_map_lookup_elem),
10825 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10826 			BPF_MOV64_IMM(BPF_REG_0, 0),
10827 			BPF_EXIT_INSN(), /* return 0 */
10828 			/* write map_value_ptr into stack frame of main prog */
10829 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
10830 			BPF_MOV64_IMM(BPF_REG_0, 1),
10831 			BPF_EXIT_INSN(), /* return 1 */
10832 		},
10833 		.prog_type = BPF_PROG_TYPE_XDP,
10834 		.fixup_map1 = { 23 },
10835 		.result = REJECT,
10836 		.errstr = "invalid read from stack off -16+0 size 8",
10837 	},
10838 	{
10839 		"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1",
10840 		.insns = {
10841 			/* main prog */
10842 			/* pass fp-16, fp-8 into a function */
10843 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10844 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10845 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10846 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10847 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10848 			BPF_MOV64_IMM(BPF_REG_0, 0),
10849 			BPF_EXIT_INSN(),
10850 
10851 			/* subprog 1 */
10852 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10853 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10854 			/* 1st lookup from map */
10855 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10856 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10857 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10858 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10859 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10860 				     BPF_FUNC_map_lookup_elem),
10861 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10862 			BPF_MOV64_IMM(BPF_REG_8, 0),
10863 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
10864 			/* write map_value_ptr into stack frame of main prog at fp-8 */
10865 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
10866 			BPF_MOV64_IMM(BPF_REG_8, 1),
10867 
10868 			/* 2nd lookup from map */
10869 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */
10870 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10871 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10872 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */
10873 				     BPF_FUNC_map_lookup_elem),
10874 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10875 			BPF_MOV64_IMM(BPF_REG_9, 0),
10876 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
10877 			/* write map_value_ptr into stack frame of main prog at fp-16 */
10878 			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
10879 			BPF_MOV64_IMM(BPF_REG_9, 1),
10880 
10881 			/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
10882 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */
10883 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
10884 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
10885 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
10886 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),  /* 34 */
10887 			BPF_EXIT_INSN(),
10888 
10889 			/* subprog 2 */
10890 			/* if arg2 == 1 do *arg1 = 0 */
10891 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
10892 			/* fetch map_value_ptr from the stack of this function */
10893 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
10894 			/* write into map value */
10895 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10896 
10897 			/* if arg4 == 1 do *arg3 = 0 */
10898 			BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
10899 			/* fetch map_value_ptr from the stack of this function */
10900 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
10901 			/* write into map value */
10902 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0),
10903 			BPF_EXIT_INSN(),
10904 		},
10905 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10906 		.fixup_map1 = { 12, 22 },
10907 		.result = REJECT,
10908 		.errstr = "invalid access to map value, value_size=8 off=2 size=8",
10909 	},
10910 	{
10911 		"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2",
10912 		.insns = {
10913 			/* main prog */
10914 			/* pass fp-16, fp-8 into a function */
10915 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10916 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10917 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10918 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10919 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10920 			BPF_MOV64_IMM(BPF_REG_0, 0),
10921 			BPF_EXIT_INSN(),
10922 
10923 			/* subprog 1 */
10924 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10925 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10926 			/* 1st lookup from map */
10927 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10928 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10929 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10930 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10931 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
10932 				     BPF_FUNC_map_lookup_elem),
10933 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10934 			BPF_MOV64_IMM(BPF_REG_8, 0),
10935 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
10936 			/* write map_value_ptr into stack frame of main prog at fp-8 */
10937 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
10938 			BPF_MOV64_IMM(BPF_REG_8, 1),
10939 
10940 			/* 2nd lookup from map */
10941 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */
10942 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
10943 			BPF_LD_MAP_FD(BPF_REG_1, 0),
10944 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */
10945 				     BPF_FUNC_map_lookup_elem),
10946 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
10947 			BPF_MOV64_IMM(BPF_REG_9, 0),
10948 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
10949 			/* write map_value_ptr into stack frame of main prog at fp-16 */
10950 			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
10951 			BPF_MOV64_IMM(BPF_REG_9, 1),
10952 
10953 			/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
10954 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */
10955 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
10956 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
10957 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
10958 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),  /* 34 */
10959 			BPF_EXIT_INSN(),
10960 
10961 			/* subprog 2 */
10962 			/* if arg2 == 1 do *arg1 = 0 */
10963 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
10964 			/* fetch map_value_ptr from the stack of this function */
10965 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
10966 			/* write into map value */
10967 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10968 
10969 			/* if arg4 == 1 do *arg3 = 0 */
10970 			BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
10971 			/* fetch map_value_ptr from the stack of this function */
10972 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
10973 			/* write into map value */
10974 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10975 			BPF_EXIT_INSN(),
10976 		},
10977 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10978 		.fixup_map1 = { 12, 22 },
10979 		.result = ACCEPT,
10980 	},
10981 	{
10982 		"calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3",
10983 		.insns = {
10984 			/* main prog */
10985 			/* pass fp-16, fp-8 into a function */
10986 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10987 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10988 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10989 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10990 			BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
10991 			BPF_MOV64_IMM(BPF_REG_0, 0),
10992 			BPF_EXIT_INSN(),
10993 
10994 			/* subprog 1 */
10995 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10996 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10997 			/* 1st lookup from map */
10998 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0),
10999 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11000 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24),
11001 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11002 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11003 				     BPF_FUNC_map_lookup_elem),
11004 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11005 			BPF_MOV64_IMM(BPF_REG_8, 0),
11006 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
11007 			/* write map_value_ptr into stack frame of main prog at fp-8 */
11008 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
11009 			BPF_MOV64_IMM(BPF_REG_8, 1),
11010 
11011 			/* 2nd lookup from map */
11012 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11013 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24),
11014 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11015 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11016 				     BPF_FUNC_map_lookup_elem),
11017 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11018 			BPF_MOV64_IMM(BPF_REG_9, 0),  // 26
11019 			BPF_JMP_IMM(BPF_JA, 0, 0, 2),
11020 			/* write map_value_ptr into stack frame of main prog at fp-16 */
11021 			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
11022 			BPF_MOV64_IMM(BPF_REG_9, 1),
11023 
11024 			/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
11025 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30
11026 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
11027 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
11028 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
11029 			BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34
11030 			BPF_JMP_IMM(BPF_JA, 0, 0, -30),
11031 
11032 			/* subprog 2 */
11033 			/* if arg2 == 1 do *arg1 = 0 */
11034 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
11035 			/* fetch map_value_ptr from the stack of this function */
11036 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
11037 			/* write into map value */
11038 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11039 
11040 			/* if arg4 == 1 do *arg3 = 0 */
11041 			BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
11042 			/* fetch map_value_ptr from the stack of this function */
11043 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
11044 			/* write into map value */
11045 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0),
11046 			BPF_JMP_IMM(BPF_JA, 0, 0, -8),
11047 		},
11048 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11049 		.fixup_map1 = { 12, 22 },
11050 		.result = REJECT,
11051 		.errstr = "invalid access to map value, value_size=8 off=2 size=8",
11052 	},
11053 	{
11054 		"calls: two calls that receive map_value_ptr_or_null via arg. test1",
11055 		.insns = {
11056 			/* main prog */
11057 			/* pass fp-16, fp-8 into a function */
11058 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
11059 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
11060 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11061 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
11062 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
11063 			BPF_MOV64_IMM(BPF_REG_0, 0),
11064 			BPF_EXIT_INSN(),
11065 
11066 			/* subprog 1 */
11067 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11068 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
11069 			/* 1st lookup from map */
11070 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11071 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11072 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11073 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11074 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11075 				     BPF_FUNC_map_lookup_elem),
11076 			/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
11077 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
11078 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11079 			BPF_MOV64_IMM(BPF_REG_8, 0),
11080 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
11081 			BPF_MOV64_IMM(BPF_REG_8, 1),
11082 
11083 			/* 2nd lookup from map */
11084 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11085 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11086 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11087 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11088 				     BPF_FUNC_map_lookup_elem),
11089 			/* write map_value_ptr_or_null into stack frame of main prog at fp-16 */
11090 			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
11091 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11092 			BPF_MOV64_IMM(BPF_REG_9, 0),
11093 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
11094 			BPF_MOV64_IMM(BPF_REG_9, 1),
11095 
11096 			/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
11097 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
11098 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
11099 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
11100 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
11101 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
11102 			BPF_EXIT_INSN(),
11103 
11104 			/* subprog 2 */
11105 			/* if arg2 == 1 do *arg1 = 0 */
11106 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
11107 			/* fetch map_value_ptr from the stack of this function */
11108 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
11109 			/* write into map value */
11110 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11111 
11112 			/* if arg4 == 1 do *arg3 = 0 */
11113 			BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
11114 			/* fetch map_value_ptr from the stack of this function */
11115 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
11116 			/* write into map value */
11117 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11118 			BPF_EXIT_INSN(),
11119 		},
11120 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11121 		.fixup_map1 = { 12, 22 },
11122 		.result = ACCEPT,
11123 	},
11124 	{
11125 		"calls: two calls that receive map_value_ptr_or_null via arg. test2",
11126 		.insns = {
11127 			/* main prog */
11128 			/* pass fp-16, fp-8 into a function */
11129 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
11130 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
11131 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11132 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
11133 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
11134 			BPF_MOV64_IMM(BPF_REG_0, 0),
11135 			BPF_EXIT_INSN(),
11136 
11137 			/* subprog 1 */
11138 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11139 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
11140 			/* 1st lookup from map */
11141 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11142 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11143 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11144 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11145 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11146 				     BPF_FUNC_map_lookup_elem),
11147 			/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
11148 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
11149 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11150 			BPF_MOV64_IMM(BPF_REG_8, 0),
11151 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
11152 			BPF_MOV64_IMM(BPF_REG_8, 1),
11153 
11154 			/* 2nd lookup from map */
11155 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11156 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11157 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11158 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11159 				     BPF_FUNC_map_lookup_elem),
11160 			/* write map_value_ptr_or_null into stack frame of main prog at fp-16 */
11161 			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
11162 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11163 			BPF_MOV64_IMM(BPF_REG_9, 0),
11164 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
11165 			BPF_MOV64_IMM(BPF_REG_9, 1),
11166 
11167 			/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
11168 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
11169 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
11170 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
11171 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
11172 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
11173 			BPF_EXIT_INSN(),
11174 
11175 			/* subprog 2 */
11176 			/* if arg2 == 1 do *arg1 = 0 */
11177 			BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
11178 			/* fetch map_value_ptr from the stack of this function */
11179 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
11180 			/* write into map value */
11181 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11182 
11183 			/* if arg4 == 0 do *arg3 = 0 */
11184 			BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2),
11185 			/* fetch map_value_ptr from the stack of this function */
11186 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
11187 			/* write into map value */
11188 			BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11189 			BPF_EXIT_INSN(),
11190 		},
11191 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11192 		.fixup_map1 = { 12, 22 },
11193 		.result = REJECT,
11194 		.errstr = "R0 invalid mem access 'inv'",
11195 	},
11196 	{
11197 		"calls: pkt_ptr spill into caller stack",
11198 		.insns = {
11199 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11200 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11201 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
11202 			BPF_EXIT_INSN(),
11203 
11204 			/* subprog 1 */
11205 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11206 				    offsetof(struct __sk_buff, data)),
11207 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11208 				    offsetof(struct __sk_buff, data_end)),
11209 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11210 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11211 			/* spill unchecked pkt_ptr into stack of caller */
11212 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11213 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
11214 			/* now the pkt range is verified, read pkt_ptr from stack */
11215 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
11216 			/* write 4 bytes into packet */
11217 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11218 			BPF_EXIT_INSN(),
11219 		},
11220 		.result = ACCEPT,
11221 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11222 		.retval = POINTER_VALUE,
11223 	},
11224 	{
11225 		"calls: pkt_ptr spill into caller stack 2",
11226 		.insns = {
11227 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11228 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11229 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11230 			/* Marking is still kept, but not in all cases safe. */
11231 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11232 			BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
11233 			BPF_EXIT_INSN(),
11234 
11235 			/* subprog 1 */
11236 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11237 				    offsetof(struct __sk_buff, data)),
11238 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11239 				    offsetof(struct __sk_buff, data_end)),
11240 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11241 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11242 			/* spill unchecked pkt_ptr into stack of caller */
11243 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11244 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
11245 			/* now the pkt range is verified, read pkt_ptr from stack */
11246 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
11247 			/* write 4 bytes into packet */
11248 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11249 			BPF_EXIT_INSN(),
11250 		},
11251 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11252 		.errstr = "invalid access to packet",
11253 		.result = REJECT,
11254 	},
11255 	{
11256 		"calls: pkt_ptr spill into caller stack 3",
11257 		.insns = {
11258 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11259 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11260 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
11261 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
11262 			/* Marking is still kept and safe here. */
11263 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11264 			BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
11265 			BPF_EXIT_INSN(),
11266 
11267 			/* subprog 1 */
11268 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11269 				    offsetof(struct __sk_buff, data)),
11270 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11271 				    offsetof(struct __sk_buff, data_end)),
11272 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11273 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11274 			/* spill unchecked pkt_ptr into stack of caller */
11275 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11276 			BPF_MOV64_IMM(BPF_REG_5, 0),
11277 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
11278 			BPF_MOV64_IMM(BPF_REG_5, 1),
11279 			/* now the pkt range is verified, read pkt_ptr from stack */
11280 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
11281 			/* write 4 bytes into packet */
11282 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11283 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11284 			BPF_EXIT_INSN(),
11285 		},
11286 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11287 		.result = ACCEPT,
11288 		.retval = 1,
11289 	},
11290 	{
11291 		"calls: pkt_ptr spill into caller stack 4",
11292 		.insns = {
11293 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11294 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11295 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
11296 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
11297 			/* Check marking propagated. */
11298 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11299 			BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
11300 			BPF_EXIT_INSN(),
11301 
11302 			/* subprog 1 */
11303 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11304 				    offsetof(struct __sk_buff, data)),
11305 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11306 				    offsetof(struct __sk_buff, data_end)),
11307 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11308 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11309 			/* spill unchecked pkt_ptr into stack of caller */
11310 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11311 			BPF_MOV64_IMM(BPF_REG_5, 0),
11312 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
11313 			BPF_MOV64_IMM(BPF_REG_5, 1),
11314 			/* don't read back pkt_ptr from stack here */
11315 			/* write 4 bytes into packet */
11316 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11317 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11318 			BPF_EXIT_INSN(),
11319 		},
11320 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11321 		.result = ACCEPT,
11322 		.retval = 1,
11323 	},
11324 	{
11325 		"calls: pkt_ptr spill into caller stack 5",
11326 		.insns = {
11327 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11328 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11329 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0),
11330 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11331 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11332 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
11333 			BPF_EXIT_INSN(),
11334 
11335 			/* subprog 1 */
11336 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11337 				    offsetof(struct __sk_buff, data)),
11338 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11339 				    offsetof(struct __sk_buff, data_end)),
11340 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11341 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11342 			BPF_MOV64_IMM(BPF_REG_5, 0),
11343 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
11344 			/* spill checked pkt_ptr into stack of caller */
11345 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11346 			BPF_MOV64_IMM(BPF_REG_5, 1),
11347 			/* don't read back pkt_ptr from stack here */
11348 			/* write 4 bytes into packet */
11349 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11350 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11351 			BPF_EXIT_INSN(),
11352 		},
11353 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11354 		.errstr = "same insn cannot be used with different",
11355 		.result = REJECT,
11356 	},
11357 	{
11358 		"calls: pkt_ptr spill into caller stack 6",
11359 		.insns = {
11360 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11361 				    offsetof(struct __sk_buff, data_end)),
11362 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11363 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11364 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11365 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11366 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11367 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
11368 			BPF_EXIT_INSN(),
11369 
11370 			/* subprog 1 */
11371 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11372 				    offsetof(struct __sk_buff, data)),
11373 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11374 				    offsetof(struct __sk_buff, data_end)),
11375 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11376 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11377 			BPF_MOV64_IMM(BPF_REG_5, 0),
11378 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
11379 			/* spill checked pkt_ptr into stack of caller */
11380 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11381 			BPF_MOV64_IMM(BPF_REG_5, 1),
11382 			/* don't read back pkt_ptr from stack here */
11383 			/* write 4 bytes into packet */
11384 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11385 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11386 			BPF_EXIT_INSN(),
11387 		},
11388 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11389 		.errstr = "R4 invalid mem access",
11390 		.result = REJECT,
11391 	},
11392 	{
11393 		"calls: pkt_ptr spill into caller stack 7",
11394 		.insns = {
11395 			BPF_MOV64_IMM(BPF_REG_2, 0),
11396 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11397 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11398 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11399 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11400 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11401 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
11402 			BPF_EXIT_INSN(),
11403 
11404 			/* subprog 1 */
11405 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11406 				    offsetof(struct __sk_buff, data)),
11407 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11408 				    offsetof(struct __sk_buff, data_end)),
11409 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11410 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11411 			BPF_MOV64_IMM(BPF_REG_5, 0),
11412 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
11413 			/* spill checked pkt_ptr into stack of caller */
11414 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11415 			BPF_MOV64_IMM(BPF_REG_5, 1),
11416 			/* don't read back pkt_ptr from stack here */
11417 			/* write 4 bytes into packet */
11418 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11419 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11420 			BPF_EXIT_INSN(),
11421 		},
11422 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11423 		.errstr = "R4 invalid mem access",
11424 		.result = REJECT,
11425 	},
11426 	{
11427 		"calls: pkt_ptr spill into caller stack 8",
11428 		.insns = {
11429 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11430 				    offsetof(struct __sk_buff, data)),
11431 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11432 				    offsetof(struct __sk_buff, data_end)),
11433 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11434 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11435 			BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1),
11436 			BPF_EXIT_INSN(),
11437 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11438 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11439 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11440 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11441 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11442 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
11443 			BPF_EXIT_INSN(),
11444 
11445 			/* subprog 1 */
11446 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11447 				    offsetof(struct __sk_buff, data)),
11448 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11449 				    offsetof(struct __sk_buff, data_end)),
11450 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11451 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11452 			BPF_MOV64_IMM(BPF_REG_5, 0),
11453 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
11454 			/* spill checked pkt_ptr into stack of caller */
11455 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11456 			BPF_MOV64_IMM(BPF_REG_5, 1),
11457 			/* don't read back pkt_ptr from stack here */
11458 			/* write 4 bytes into packet */
11459 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11460 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11461 			BPF_EXIT_INSN(),
11462 		},
11463 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11464 		.result = ACCEPT,
11465 	},
11466 	{
11467 		"calls: pkt_ptr spill into caller stack 9",
11468 		.insns = {
11469 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11470 				    offsetof(struct __sk_buff, data)),
11471 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11472 				    offsetof(struct __sk_buff, data_end)),
11473 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11474 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11475 			BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1),
11476 			BPF_EXIT_INSN(),
11477 			BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
11478 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
11479 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11480 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11481 			BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
11482 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
11483 			BPF_EXIT_INSN(),
11484 
11485 			/* subprog 1 */
11486 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11487 				    offsetof(struct __sk_buff, data)),
11488 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11489 				    offsetof(struct __sk_buff, data_end)),
11490 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
11491 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
11492 			BPF_MOV64_IMM(BPF_REG_5, 0),
11493 			/* spill unchecked pkt_ptr into stack of caller */
11494 			BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
11495 			BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
11496 			BPF_MOV64_IMM(BPF_REG_5, 1),
11497 			/* don't read back pkt_ptr from stack here */
11498 			/* write 4 bytes into packet */
11499 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11500 			BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
11501 			BPF_EXIT_INSN(),
11502 		},
11503 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11504 		.errstr = "invalid access to packet",
11505 		.result = REJECT,
11506 	},
11507 	{
11508 		"calls: caller stack init to zero or map_value_or_null",
11509 		.insns = {
11510 			BPF_MOV64_IMM(BPF_REG_0, 0),
11511 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
11512 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11513 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11514 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
11515 			/* fetch map_value_or_null or const_zero from stack */
11516 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
11517 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
11518 			/* store into map_value */
11519 			BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0),
11520 			BPF_EXIT_INSN(),
11521 
11522 			/* subprog 1 */
11523 			/* if (ctx == 0) return; */
11524 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8),
11525 			/* else bpf_map_lookup() and *(fp - 8) = r0 */
11526 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
11527 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11528 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11529 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11530 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11531 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11532 				     BPF_FUNC_map_lookup_elem),
11533 			/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
11534 			BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
11535 			BPF_EXIT_INSN(),
11536 		},
11537 		.fixup_map1 = { 13 },
11538 		.result = ACCEPT,
11539 		.prog_type = BPF_PROG_TYPE_XDP,
11540 	},
11541 	{
11542 		"calls: stack init to zero and pruning",
11543 		.insns = {
11544 			/* first make allocated_stack 16 byte */
11545 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
11546 			/* now fork the execution such that the false branch
11547 			 * of JGT insn will be verified second and it skisp zero
11548 			 * init of fp-8 stack slot. If stack liveness marking
11549 			 * is missing live_read marks from call map_lookup
11550 			 * processing then pruning will incorrectly assume
11551 			 * that fp-8 stack slot was unused in the fall-through
11552 			 * branch and will accept the program incorrectly
11553 			 */
11554 			BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2),
11555 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11556 			BPF_JMP_IMM(BPF_JA, 0, 0, 0),
11557 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11558 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11559 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11560 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11561 				     BPF_FUNC_map_lookup_elem),
11562 			BPF_EXIT_INSN(),
11563 		},
11564 		.fixup_map2 = { 6 },
11565 		.errstr = "invalid indirect read from stack off -8+0 size 8",
11566 		.result = REJECT,
11567 		.prog_type = BPF_PROG_TYPE_XDP,
11568 	},
11569 	{
11570 		"search pruning: all branches should be verified (nop operation)",
11571 		.insns = {
11572 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11573 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11574 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
11575 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11576 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
11577 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
11578 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
11579 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2),
11580 			BPF_MOV64_IMM(BPF_REG_4, 0),
11581 			BPF_JMP_A(1),
11582 			BPF_MOV64_IMM(BPF_REG_4, 1),
11583 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16),
11584 			BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns),
11585 			BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16),
11586 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_5, 0, 2),
11587 			BPF_MOV64_IMM(BPF_REG_6, 0),
11588 			BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xdead),
11589 			BPF_EXIT_INSN(),
11590 		},
11591 		.fixup_map1 = { 3 },
11592 		.errstr = "R6 invalid mem access 'inv'",
11593 		.result = REJECT,
11594 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
11595 	},
11596 	{
11597 		"search pruning: all branches should be verified (invalid stack access)",
11598 		.insns = {
11599 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11600 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11601 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
11602 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11603 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
11604 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
11605 			BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
11606 			BPF_MOV64_IMM(BPF_REG_4, 0),
11607 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2),
11608 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16),
11609 			BPF_JMP_A(1),
11610 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -24),
11611 			BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns),
11612 			BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16),
11613 			BPF_EXIT_INSN(),
11614 		},
11615 		.fixup_map1 = { 3 },
11616 		.errstr = "invalid read from stack off -16+0 size 8",
11617 		.result = REJECT,
11618 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
11619 	},
11620 	{
11621 		"jit: lsh, rsh, arsh by 1",
11622 		.insns = {
11623 			BPF_MOV64_IMM(BPF_REG_0, 1),
11624 			BPF_MOV64_IMM(BPF_REG_1, 0xff),
11625 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1),
11626 			BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1),
11627 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1),
11628 			BPF_EXIT_INSN(),
11629 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1),
11630 			BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1),
11631 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1),
11632 			BPF_EXIT_INSN(),
11633 			BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1),
11634 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1),
11635 			BPF_EXIT_INSN(),
11636 			BPF_MOV64_IMM(BPF_REG_0, 2),
11637 			BPF_EXIT_INSN(),
11638 		},
11639 		.result = ACCEPT,
11640 		.retval = 2,
11641 	},
11642 	{
11643 		"jit: mov32 for ldimm64, 1",
11644 		.insns = {
11645 			BPF_MOV64_IMM(BPF_REG_0, 2),
11646 			BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL),
11647 			BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32),
11648 			BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL),
11649 			BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
11650 			BPF_MOV64_IMM(BPF_REG_0, 1),
11651 			BPF_EXIT_INSN(),
11652 		},
11653 		.result = ACCEPT,
11654 		.retval = 2,
11655 	},
11656 	{
11657 		"jit: mov32 for ldimm64, 2",
11658 		.insns = {
11659 			BPF_MOV64_IMM(BPF_REG_0, 1),
11660 			BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL),
11661 			BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL),
11662 			BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
11663 			BPF_MOV64_IMM(BPF_REG_0, 2),
11664 			BPF_EXIT_INSN(),
11665 		},
11666 		.result = ACCEPT,
11667 		.retval = 2,
11668 	},
11669 	{
11670 		"jit: various mul tests",
11671 		.insns = {
11672 			BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL),
11673 			BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
11674 			BPF_LD_IMM64(BPF_REG_1, 0xefefefULL),
11675 			BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
11676 			BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
11677 			BPF_MOV64_IMM(BPF_REG_0, 1),
11678 			BPF_EXIT_INSN(),
11679 			BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
11680 			BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
11681 			BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
11682 			BPF_MOV64_IMM(BPF_REG_0, 1),
11683 			BPF_EXIT_INSN(),
11684 			BPF_MOV32_REG(BPF_REG_2, BPF_REG_2),
11685 			BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
11686 			BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
11687 			BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
11688 			BPF_MOV64_IMM(BPF_REG_0, 1),
11689 			BPF_EXIT_INSN(),
11690 			BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
11691 			BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
11692 			BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
11693 			BPF_MOV64_IMM(BPF_REG_0, 1),
11694 			BPF_EXIT_INSN(),
11695 			BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL),
11696 			BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL),
11697 			BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL),
11698 			BPF_ALU32_REG(BPF_MUL, BPF_REG_2, BPF_REG_1),
11699 			BPF_JMP_REG(BPF_JEQ, BPF_REG_2, BPF_REG_0, 2),
11700 			BPF_MOV64_IMM(BPF_REG_0, 1),
11701 			BPF_EXIT_INSN(),
11702 			BPF_MOV64_IMM(BPF_REG_0, 2),
11703 			BPF_EXIT_INSN(),
11704 		},
11705 		.result = ACCEPT,
11706 		.retval = 2,
11707 	},
11708 	{
11709 		"xadd/w check unaligned stack",
11710 		.insns = {
11711 			BPF_MOV64_IMM(BPF_REG_0, 1),
11712 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
11713 			BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -7),
11714 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
11715 			BPF_EXIT_INSN(),
11716 		},
11717 		.result = REJECT,
11718 		.errstr = "misaligned stack access off",
11719 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11720 	},
11721 	{
11722 		"xadd/w check unaligned map",
11723 		.insns = {
11724 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11725 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11726 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11727 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11728 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11729 				     BPF_FUNC_map_lookup_elem),
11730 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
11731 			BPF_EXIT_INSN(),
11732 			BPF_MOV64_IMM(BPF_REG_1, 1),
11733 			BPF_STX_XADD(BPF_W, BPF_REG_0, BPF_REG_1, 3),
11734 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3),
11735 			BPF_EXIT_INSN(),
11736 		},
11737 		.fixup_map1 = { 3 },
11738 		.result = REJECT,
11739 		.errstr = "misaligned value access off",
11740 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11741 	},
11742 	{
11743 		"xadd/w check unaligned pkt",
11744 		.insns = {
11745 			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
11746 				    offsetof(struct xdp_md, data)),
11747 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
11748 				    offsetof(struct xdp_md, data_end)),
11749 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
11750 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
11751 			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 2),
11752 			BPF_MOV64_IMM(BPF_REG_0, 99),
11753 			BPF_JMP_IMM(BPF_JA, 0, 0, 6),
11754 			BPF_MOV64_IMM(BPF_REG_0, 1),
11755 			BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11756 			BPF_ST_MEM(BPF_W, BPF_REG_2, 3, 0),
11757 			BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 1),
11758 			BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 2),
11759 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 1),
11760 			BPF_EXIT_INSN(),
11761 		},
11762 		.result = REJECT,
11763 		.errstr = "BPF_XADD stores into R2 packet",
11764 		.prog_type = BPF_PROG_TYPE_XDP,
11765 	},
11766 	{
11767 		"bpf_get_stack return R0 within range",
11768 		.insns = {
11769 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11770 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11771 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11772 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11773 			BPF_LD_MAP_FD(BPF_REG_1, 0),
11774 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11775 				     BPF_FUNC_map_lookup_elem),
11776 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 28),
11777 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
11778 			BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)),
11779 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
11780 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
11781 			BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)),
11782 			BPF_MOV64_IMM(BPF_REG_4, 256),
11783 			BPF_EMIT_CALL(BPF_FUNC_get_stack),
11784 			BPF_MOV64_IMM(BPF_REG_1, 0),
11785 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
11786 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32),
11787 			BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32),
11788 			BPF_JMP_REG(BPF_JSLT, BPF_REG_1, BPF_REG_8, 16),
11789 			BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8),
11790 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
11791 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8),
11792 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_9),
11793 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32),
11794 			BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 32),
11795 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
11796 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1),
11797 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
11798 			BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)),
11799 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_5),
11800 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 4),
11801 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
11802 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_9),
11803 			BPF_MOV64_IMM(BPF_REG_4, 0),
11804 			BPF_EMIT_CALL(BPF_FUNC_get_stack),
11805 			BPF_EXIT_INSN(),
11806 		},
11807 		.fixup_map2 = { 4 },
11808 		.result = ACCEPT,
11809 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
11810 	},
11811 	{
11812 		"ld_abs: invalid op 1",
11813 		.insns = {
11814 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11815 			BPF_LD_ABS(BPF_DW, 0),
11816 			BPF_EXIT_INSN(),
11817 		},
11818 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11819 		.result = REJECT,
11820 		.errstr = "unknown opcode",
11821 	},
11822 	{
11823 		"ld_abs: invalid op 2",
11824 		.insns = {
11825 			BPF_MOV32_IMM(BPF_REG_0, 256),
11826 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11827 			BPF_LD_IND(BPF_DW, BPF_REG_0, 0),
11828 			BPF_EXIT_INSN(),
11829 		},
11830 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11831 		.result = REJECT,
11832 		.errstr = "unknown opcode",
11833 	},
11834 	{
11835 		"ld_abs: nmap reduced",
11836 		.insns = {
11837 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11838 			BPF_LD_ABS(BPF_H, 12),
11839 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28),
11840 			BPF_LD_ABS(BPF_H, 12),
11841 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26),
11842 			BPF_MOV32_IMM(BPF_REG_0, 18),
11843 			BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64),
11844 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64),
11845 			BPF_LD_IND(BPF_W, BPF_REG_7, 14),
11846 			BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60),
11847 			BPF_MOV32_IMM(BPF_REG_0, 280971478),
11848 			BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56),
11849 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56),
11850 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60),
11851 			BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
11852 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15),
11853 			BPF_LD_ABS(BPF_H, 12),
11854 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13),
11855 			BPF_MOV32_IMM(BPF_REG_0, 22),
11856 			BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56),
11857 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56),
11858 			BPF_LD_IND(BPF_H, BPF_REG_7, 14),
11859 			BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52),
11860 			BPF_MOV32_IMM(BPF_REG_0, 17366),
11861 			BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48),
11862 			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48),
11863 			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52),
11864 			BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
11865 			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11866 			BPF_MOV32_IMM(BPF_REG_0, 256),
11867 			BPF_EXIT_INSN(),
11868 			BPF_MOV32_IMM(BPF_REG_0, 0),
11869 			BPF_EXIT_INSN(),
11870 		},
11871 		.data = {
11872 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0,
11873 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11874 			0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
11875 		},
11876 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11877 		.result = ACCEPT,
11878 		.retval = 256,
11879 	},
11880 	{
11881 		"ld_abs: div + abs, test 1",
11882 		.insns = {
11883 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
11884 			BPF_LD_ABS(BPF_B, 3),
11885 			BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2),
11886 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2),
11887 			BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0),
11888 			BPF_LD_ABS(BPF_B, 4),
11889 			BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
11890 			BPF_LD_IND(BPF_B, BPF_REG_8, -70),
11891 			BPF_EXIT_INSN(),
11892 		},
11893 		.data = {
11894 			10, 20, 30, 40, 50,
11895 		},
11896 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11897 		.result = ACCEPT,
11898 		.retval = 10,
11899 	},
11900 	{
11901 		"ld_abs: div + abs, test 2",
11902 		.insns = {
11903 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
11904 			BPF_LD_ABS(BPF_B, 3),
11905 			BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2),
11906 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2),
11907 			BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0),
11908 			BPF_LD_ABS(BPF_B, 128),
11909 			BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
11910 			BPF_LD_IND(BPF_B, BPF_REG_8, -70),
11911 			BPF_EXIT_INSN(),
11912 		},
11913 		.data = {
11914 			10, 20, 30, 40, 50,
11915 		},
11916 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11917 		.result = ACCEPT,
11918 		.retval = 0,
11919 	},
11920 	{
11921 		"ld_abs: div + abs, test 3",
11922 		.insns = {
11923 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
11924 			BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0),
11925 			BPF_LD_ABS(BPF_B, 3),
11926 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7),
11927 			BPF_EXIT_INSN(),
11928 		},
11929 		.data = {
11930 			10, 20, 30, 40, 50,
11931 		},
11932 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11933 		.result = ACCEPT,
11934 		.retval = 0,
11935 	},
11936 	{
11937 		"ld_abs: div + abs, test 4",
11938 		.insns = {
11939 			BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
11940 			BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0),
11941 			BPF_LD_ABS(BPF_B, 256),
11942 			BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7),
11943 			BPF_EXIT_INSN(),
11944 		},
11945 		.data = {
11946 			10, 20, 30, 40, 50,
11947 		},
11948 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11949 		.result = ACCEPT,
11950 		.retval = 0,
11951 	},
11952 	{
11953 		"ld_abs: vlan + abs, test 1",
11954 		.insns = { },
11955 		.data = {
11956 			0x34,
11957 		},
11958 		.fill_helper = bpf_fill_ld_abs_vlan_push_pop,
11959 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11960 		.result = ACCEPT,
11961 		.retval = 0xbef,
11962 	},
11963 	{
11964 		"ld_abs: vlan + abs, test 2",
11965 		.insns = {
11966 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11967 			BPF_LD_ABS(BPF_B, 0),
11968 			BPF_LD_ABS(BPF_H, 0),
11969 			BPF_LD_ABS(BPF_W, 0),
11970 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
11971 			BPF_MOV64_IMM(BPF_REG_6, 0),
11972 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
11973 			BPF_MOV64_IMM(BPF_REG_2, 1),
11974 			BPF_MOV64_IMM(BPF_REG_3, 2),
11975 			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
11976 				     BPF_FUNC_skb_vlan_push),
11977 			BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
11978 			BPF_LD_ABS(BPF_B, 0),
11979 			BPF_LD_ABS(BPF_H, 0),
11980 			BPF_LD_ABS(BPF_W, 0),
11981 			BPF_MOV64_IMM(BPF_REG_0, 42),
11982 			BPF_EXIT_INSN(),
11983 		},
11984 		.data = {
11985 			0x34,
11986 		},
11987 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11988 		.result = ACCEPT,
11989 		.retval = 42,
11990 	},
11991 	{
11992 		"ld_abs: jump around ld_abs",
11993 		.insns = { },
11994 		.data = {
11995 			10, 11,
11996 		},
11997 		.fill_helper = bpf_fill_jump_around_ld_abs,
11998 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11999 		.result = ACCEPT,
12000 		.retval = 10,
12001 	},
12002 	{
12003 		"ld_dw: xor semi-random 64 bit imms, test 1",
12004 		.insns = { },
12005 		.data = { },
12006 		.fill_helper = bpf_fill_rand_ld_dw,
12007 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
12008 		.result = ACCEPT,
12009 		.retval = 4090,
12010 	},
12011 	{
12012 		"ld_dw: xor semi-random 64 bit imms, test 2",
12013 		.insns = { },
12014 		.data = { },
12015 		.fill_helper = bpf_fill_rand_ld_dw,
12016 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
12017 		.result = ACCEPT,
12018 		.retval = 2047,
12019 	},
12020 	{
12021 		"ld_dw: xor semi-random 64 bit imms, test 3",
12022 		.insns = { },
12023 		.data = { },
12024 		.fill_helper = bpf_fill_rand_ld_dw,
12025 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
12026 		.result = ACCEPT,
12027 		.retval = 511,
12028 	},
12029 	{
12030 		"ld_dw: xor semi-random 64 bit imms, test 4",
12031 		.insns = { },
12032 		.data = { },
12033 		.fill_helper = bpf_fill_rand_ld_dw,
12034 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
12035 		.result = ACCEPT,
12036 		.retval = 5,
12037 	},
12038 };
12039 
12040 static int probe_filter_length(const struct bpf_insn *fp)
12041 {
12042 	int len;
12043 
12044 	for (len = MAX_INSNS - 1; len > 0; --len)
12045 		if (fp[len].code != 0 || fp[len].imm != 0)
12046 			break;
12047 	return len + 1;
12048 }
12049 
12050 static int create_map(uint32_t size_value, uint32_t max_elem)
12051 {
12052 	int fd;
12053 
12054 	fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(long long),
12055 			    size_value, max_elem, BPF_F_NO_PREALLOC);
12056 	if (fd < 0)
12057 		printf("Failed to create hash map '%s'!\n", strerror(errno));
12058 
12059 	return fd;
12060 }
12061 
12062 static int create_prog_dummy1(void)
12063 {
12064 	struct bpf_insn prog[] = {
12065 		BPF_MOV64_IMM(BPF_REG_0, 42),
12066 		BPF_EXIT_INSN(),
12067 	};
12068 
12069 	return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog,
12070 				ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
12071 }
12072 
12073 static int create_prog_dummy2(int mfd, int idx)
12074 {
12075 	struct bpf_insn prog[] = {
12076 		BPF_MOV64_IMM(BPF_REG_3, idx),
12077 		BPF_LD_MAP_FD(BPF_REG_2, mfd),
12078 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
12079 			     BPF_FUNC_tail_call),
12080 		BPF_MOV64_IMM(BPF_REG_0, 41),
12081 		BPF_EXIT_INSN(),
12082 	};
12083 
12084 	return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog,
12085 				ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
12086 }
12087 
12088 static int create_prog_array(void)
12089 {
12090 	int p1key = 0, p2key = 1;
12091 	int mfd, p1fd, p2fd;
12092 
12093 	mfd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, sizeof(int),
12094 			     sizeof(int), 4, 0);
12095 	if (mfd < 0) {
12096 		printf("Failed to create prog array '%s'!\n", strerror(errno));
12097 		return -1;
12098 	}
12099 
12100 	p1fd = create_prog_dummy1();
12101 	p2fd = create_prog_dummy2(mfd, p2key);
12102 	if (p1fd < 0 || p2fd < 0)
12103 		goto out;
12104 	if (bpf_map_update_elem(mfd, &p1key, &p1fd, BPF_ANY) < 0)
12105 		goto out;
12106 	if (bpf_map_update_elem(mfd, &p2key, &p2fd, BPF_ANY) < 0)
12107 		goto out;
12108 	close(p2fd);
12109 	close(p1fd);
12110 
12111 	return mfd;
12112 out:
12113 	close(p2fd);
12114 	close(p1fd);
12115 	close(mfd);
12116 	return -1;
12117 }
12118 
12119 static int create_map_in_map(void)
12120 {
12121 	int inner_map_fd, outer_map_fd;
12122 
12123 	inner_map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int),
12124 				      sizeof(int), 1, 0);
12125 	if (inner_map_fd < 0) {
12126 		printf("Failed to create array '%s'!\n", strerror(errno));
12127 		return inner_map_fd;
12128 	}
12129 
12130 	outer_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS, NULL,
12131 					     sizeof(int), inner_map_fd, 1, 0);
12132 	if (outer_map_fd < 0)
12133 		printf("Failed to create array of maps '%s'!\n",
12134 		       strerror(errno));
12135 
12136 	close(inner_map_fd);
12137 
12138 	return outer_map_fd;
12139 }
12140 
12141 static char bpf_vlog[UINT_MAX >> 8];
12142 
12143 static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog,
12144 			  int *map_fds)
12145 {
12146 	int *fixup_map1 = test->fixup_map1;
12147 	int *fixup_map2 = test->fixup_map2;
12148 	int *fixup_map3 = test->fixup_map3;
12149 	int *fixup_prog = test->fixup_prog;
12150 	int *fixup_map_in_map = test->fixup_map_in_map;
12151 
12152 	if (test->fill_helper)
12153 		test->fill_helper(test);
12154 
12155 	/* Allocating HTs with 1 elem is fine here, since we only test
12156 	 * for verifier and not do a runtime lookup, so the only thing
12157 	 * that really matters is value size in this case.
12158 	 */
12159 	if (*fixup_map1) {
12160 		map_fds[0] = create_map(sizeof(long long), 1);
12161 		do {
12162 			prog[*fixup_map1].imm = map_fds[0];
12163 			fixup_map1++;
12164 		} while (*fixup_map1);
12165 	}
12166 
12167 	if (*fixup_map2) {
12168 		map_fds[1] = create_map(sizeof(struct test_val), 1);
12169 		do {
12170 			prog[*fixup_map2].imm = map_fds[1];
12171 			fixup_map2++;
12172 		} while (*fixup_map2);
12173 	}
12174 
12175 	if (*fixup_map3) {
12176 		map_fds[1] = create_map(sizeof(struct other_val), 1);
12177 		do {
12178 			prog[*fixup_map3].imm = map_fds[1];
12179 			fixup_map3++;
12180 		} while (*fixup_map3);
12181 	}
12182 
12183 	if (*fixup_prog) {
12184 		map_fds[2] = create_prog_array();
12185 		do {
12186 			prog[*fixup_prog].imm = map_fds[2];
12187 			fixup_prog++;
12188 		} while (*fixup_prog);
12189 	}
12190 
12191 	if (*fixup_map_in_map) {
12192 		map_fds[3] = create_map_in_map();
12193 		do {
12194 			prog[*fixup_map_in_map].imm = map_fds[3];
12195 			fixup_map_in_map++;
12196 		} while (*fixup_map_in_map);
12197 	}
12198 }
12199 
12200 static void do_test_single(struct bpf_test *test, bool unpriv,
12201 			   int *passes, int *errors)
12202 {
12203 	int fd_prog, expected_ret, reject_from_alignment;
12204 	int prog_len, prog_type = test->prog_type;
12205 	struct bpf_insn *prog = test->insns;
12206 	int map_fds[MAX_NR_MAPS];
12207 	const char *expected_err;
12208 	uint32_t retval;
12209 	int i, err;
12210 
12211 	for (i = 0; i < MAX_NR_MAPS; i++)
12212 		map_fds[i] = -1;
12213 
12214 	do_test_fixup(test, prog, map_fds);
12215 	prog_len = probe_filter_length(prog);
12216 
12217 	fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
12218 				     prog, prog_len, test->flags & F_LOAD_WITH_STRICT_ALIGNMENT,
12219 				     "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1);
12220 
12221 	expected_ret = unpriv && test->result_unpriv != UNDEF ?
12222 		       test->result_unpriv : test->result;
12223 	expected_err = unpriv && test->errstr_unpriv ?
12224 		       test->errstr_unpriv : test->errstr;
12225 
12226 	reject_from_alignment = fd_prog < 0 &&
12227 				(test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) &&
12228 				strstr(bpf_vlog, "Unknown alignment.");
12229 #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
12230 	if (reject_from_alignment) {
12231 		printf("FAIL\nFailed due to alignment despite having efficient unaligned access: '%s'!\n",
12232 		       strerror(errno));
12233 		goto fail_log;
12234 	}
12235 #endif
12236 	if (expected_ret == ACCEPT) {
12237 		if (fd_prog < 0 && !reject_from_alignment) {
12238 			printf("FAIL\nFailed to load prog '%s'!\n",
12239 			       strerror(errno));
12240 			goto fail_log;
12241 		}
12242 	} else {
12243 		if (fd_prog >= 0) {
12244 			printf("FAIL\nUnexpected success to load!\n");
12245 			goto fail_log;
12246 		}
12247 		if (!strstr(bpf_vlog, expected_err) && !reject_from_alignment) {
12248 			printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n",
12249 			      expected_err, bpf_vlog);
12250 			goto fail_log;
12251 		}
12252 	}
12253 
12254 	if (fd_prog >= 0) {
12255 		err = bpf_prog_test_run(fd_prog, 1, test->data,
12256 					sizeof(test->data), NULL, NULL,
12257 					&retval, NULL);
12258 		if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) {
12259 			printf("Unexpected bpf_prog_test_run error\n");
12260 			goto fail_log;
12261 		}
12262 		if (!err && retval != test->retval &&
12263 		    test->retval != POINTER_VALUE) {
12264 			printf("FAIL retval %d != %d\n", retval, test->retval);
12265 			goto fail_log;
12266 		}
12267 	}
12268 	(*passes)++;
12269 	printf("OK%s\n", reject_from_alignment ?
12270 	       " (NOTE: reject due to unknown alignment)" : "");
12271 close_fds:
12272 	close(fd_prog);
12273 	for (i = 0; i < MAX_NR_MAPS; i++)
12274 		close(map_fds[i]);
12275 	sched_yield();
12276 	return;
12277 fail_log:
12278 	(*errors)++;
12279 	printf("%s", bpf_vlog);
12280 	goto close_fds;
12281 }
12282 
12283 static bool is_admin(void)
12284 {
12285 	cap_t caps;
12286 	cap_flag_value_t sysadmin = CAP_CLEAR;
12287 	const cap_value_t cap_val = CAP_SYS_ADMIN;
12288 
12289 #ifdef CAP_IS_SUPPORTED
12290 	if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) {
12291 		perror("cap_get_flag");
12292 		return false;
12293 	}
12294 #endif
12295 	caps = cap_get_proc();
12296 	if (!caps) {
12297 		perror("cap_get_proc");
12298 		return false;
12299 	}
12300 	if (cap_get_flag(caps, cap_val, CAP_EFFECTIVE, &sysadmin))
12301 		perror("cap_get_flag");
12302 	if (cap_free(caps))
12303 		perror("cap_free");
12304 	return (sysadmin == CAP_SET);
12305 }
12306 
12307 static int set_admin(bool admin)
12308 {
12309 	cap_t caps;
12310 	const cap_value_t cap_val = CAP_SYS_ADMIN;
12311 	int ret = -1;
12312 
12313 	caps = cap_get_proc();
12314 	if (!caps) {
12315 		perror("cap_get_proc");
12316 		return -1;
12317 	}
12318 	if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val,
12319 				admin ? CAP_SET : CAP_CLEAR)) {
12320 		perror("cap_set_flag");
12321 		goto out;
12322 	}
12323 	if (cap_set_proc(caps)) {
12324 		perror("cap_set_proc");
12325 		goto out;
12326 	}
12327 	ret = 0;
12328 out:
12329 	if (cap_free(caps))
12330 		perror("cap_free");
12331 	return ret;
12332 }
12333 
12334 static void get_unpriv_disabled()
12335 {
12336 	char buf[2];
12337 	FILE *fd;
12338 
12339 	fd = fopen("/proc/sys/"UNPRIV_SYSCTL, "r");
12340 	if (!fd) {
12341 		perror("fopen /proc/sys/"UNPRIV_SYSCTL);
12342 		unpriv_disabled = true;
12343 		return;
12344 	}
12345 	if (fgets(buf, 2, fd) == buf && atoi(buf))
12346 		unpriv_disabled = true;
12347 	fclose(fd);
12348 }
12349 
12350 static int do_test(bool unpriv, unsigned int from, unsigned int to)
12351 {
12352 	int i, passes = 0, errors = 0, skips = 0;
12353 
12354 	for (i = from; i < to; i++) {
12355 		struct bpf_test *test = &tests[i];
12356 
12357 		/* Program types that are not supported by non-root we
12358 		 * skip right away.
12359 		 */
12360 		if (!test->prog_type && unpriv_disabled) {
12361 			printf("#%d/u %s SKIP\n", i, test->descr);
12362 			skips++;
12363 		} else if (!test->prog_type) {
12364 			if (!unpriv)
12365 				set_admin(false);
12366 			printf("#%d/u %s ", i, test->descr);
12367 			do_test_single(test, true, &passes, &errors);
12368 			if (!unpriv)
12369 				set_admin(true);
12370 		}
12371 
12372 		if (unpriv) {
12373 			printf("#%d/p %s SKIP\n", i, test->descr);
12374 			skips++;
12375 		} else {
12376 			printf("#%d/p %s ", i, test->descr);
12377 			do_test_single(test, false, &passes, &errors);
12378 		}
12379 	}
12380 
12381 	printf("Summary: %d PASSED, %d SKIPPED, %d FAILED\n", passes,
12382 	       skips, errors);
12383 	return errors ? EXIT_FAILURE : EXIT_SUCCESS;
12384 }
12385 
12386 int main(int argc, char **argv)
12387 {
12388 	unsigned int from = 0, to = ARRAY_SIZE(tests);
12389 	bool unpriv = !is_admin();
12390 
12391 	if (argc == 3) {
12392 		unsigned int l = atoi(argv[argc - 2]);
12393 		unsigned int u = atoi(argv[argc - 1]);
12394 
12395 		if (l < to && u < to) {
12396 			from = l;
12397 			to   = u + 1;
12398 		}
12399 	} else if (argc == 2) {
12400 		unsigned int t = atoi(argv[argc - 1]);
12401 
12402 		if (t < to) {
12403 			from = t;
12404 			to   = t + 1;
12405 		}
12406 	}
12407 
12408 	get_unpriv_disabled();
12409 	if (unpriv && unpriv_disabled) {
12410 		printf("Cannot run as unprivileged user with sysctl %s.\n",
12411 		       UNPRIV_SYSCTL);
12412 		return EXIT_FAILURE;
12413 	}
12414 
12415 	bpf_semi_rand_init();
12416 	return do_test(unpriv, from, to);
12417 }
12418