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