1// SPDX-License-Identifier: GPL-2.0
2/* Converted from tools/testing/selftests/bpf/verifier/xdp_direct_packet_access.c */
3
4#include <linux/bpf.h>
5#include <bpf/bpf_helpers.h>
6#include "bpf_misc.h"
7
8SEC("xdp")
9__description("XDP pkt read, pkt_end mangling, bad access 1")
10__failure __msg("R3 pointer arithmetic on pkt_end")
11__naked void end_mangling_bad_access_1(void)
12{
13 asm volatile (" \
14 r2 = *(u32*)(r1 + %[xdp_md_data]); \
15 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
16 r1 = r2; \
17 r1 += 8; \
18 r3 += 8; \
19 if r1 > r3 goto l0_%=; \
20 r0 = *(u64*)(r1 - 8); \
21l0_%=: r0 = 0; \
22 exit; \
23" :
24 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
25 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
26 : __clobber_all);
27}
28
29SEC("xdp")
30__description("XDP pkt read, pkt_end mangling, bad access 2")
31__failure __msg("R3 pointer arithmetic on pkt_end")
32__naked void end_mangling_bad_access_2(void)
33{
34 asm volatile (" \
35 r2 = *(u32*)(r1 + %[xdp_md_data]); \
36 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
37 r1 = r2; \
38 r1 += 8; \
39 r3 -= 8; \
40 if r1 > r3 goto l0_%=; \
41 r0 = *(u64*)(r1 - 8); \
42l0_%=: r0 = 0; \
43 exit; \
44" :
45 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
46 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
47 : __clobber_all);
48}
49
50SEC("xdp")
51__description("XDP pkt read, pkt_data' > pkt_end, corner case, good access")
52__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
53__naked void end_corner_case_good_access_1(void)
54{
55 asm volatile (" \
56 r2 = *(u32*)(r1 + %[xdp_md_data]); \
57 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
58 r1 = r2; \
59 r1 += 8; \
60 if r1 > r3 goto l0_%=; \
61 r0 = *(u64*)(r1 - 8); \
62l0_%=: r0 = 0; \
63 exit; \
64" :
65 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
66 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
67 : __clobber_all);
68}
69
70SEC("xdp")
71__description("XDP pkt read, pkt_data' > pkt_end, bad access 1")
72__failure __msg("R1 offset is outside of the packet")
73__flag(BPF_F_ANY_ALIGNMENT)
74__naked void pkt_end_bad_access_1_1(void)
75{
76 asm volatile (" \
77 r2 = *(u32*)(r1 + %[xdp_md_data]); \
78 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
79 r1 = r2; \
80 r1 += 8; \
81 if r1 > r3 goto l0_%=; \
82 r0 = *(u64*)(r1 - 4); \
83l0_%=: r0 = 0; \
84 exit; \
85" :
86 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
87 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
88 : __clobber_all);
89}
90
91SEC("xdp")
92__description("XDP pkt read, pkt_data' > pkt_end, bad access 2")
93__failure __msg("R1 offset is outside of the packet")
94__flag(BPF_F_ANY_ALIGNMENT)
95__naked void pkt_end_bad_access_2_1(void)
96{
97 asm volatile (" \
98 r2 = *(u32*)(r1 + %[xdp_md_data]); \
99 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
100 r1 = r2; \
101 r1 += 8; \
102 if r1 > r3 goto l0_%=; \
103l0_%=: r0 = *(u64*)(r1 - 8); \
104 r0 = 0; \
105 exit; \
106" :
107 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
108 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
109 : __clobber_all);
110}
111
112SEC("xdp")
113__description("XDP pkt read, pkt_data' > pkt_end, corner case +1, good access")
114__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
115__naked void corner_case_1_good_access_1(void)
116{
117 asm volatile (" \
118 r2 = *(u32*)(r1 + %[xdp_md_data]); \
119 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
120 r1 = r2; \
121 r1 += 9; \
122 if r1 > r3 goto l0_%=; \
123 r0 = *(u64*)(r1 - 9); \
124l0_%=: r0 = 0; \
125 exit; \
126" :
127 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
128 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
129 : __clobber_all);
130}
131
132SEC("xdp")
133__description("XDP pkt read, pkt_data' > pkt_end, corner case -1, bad access")
134__failure __msg("R1 offset is outside of the packet")
135__flag(BPF_F_ANY_ALIGNMENT)
136__naked void corner_case_1_bad_access_1(void)
137{
138 asm volatile (" \
139 r2 = *(u32*)(r1 + %[xdp_md_data]); \
140 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
141 r1 = r2; \
142 r1 += 7; \
143 if r1 > r3 goto l0_%=; \
144 r0 = *(u64*)(r1 - 7); \
145l0_%=: r0 = 0; \
146 exit; \
147" :
148 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
149 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
150 : __clobber_all);
151}
152
153SEC("xdp")
154__description("XDP pkt read, pkt_end > pkt_data', good access")
155__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
156__naked void end_pkt_data_good_access_1(void)
157{
158 asm volatile (" \
159 r2 = *(u32*)(r1 + %[xdp_md_data]); \
160 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
161 r1 = r2; \
162 r1 += 8; \
163 if r3 > r1 goto l0_%=; \
164 goto l1_%=; \
165l0_%=: r0 = *(u32*)(r1 - 5); \
166l1_%=: r0 = 0; \
167 exit; \
168" :
169 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
170 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
171 : __clobber_all);
172}
173
174SEC("xdp")
175__description("XDP pkt read, pkt_end > pkt_data', corner case -1, bad access")
176__failure __msg("R1 offset is outside of the packet")
177__flag(BPF_F_ANY_ALIGNMENT)
178__naked void corner_case_1_bad_access_2(void)
179{
180 asm volatile (" \
181 r2 = *(u32*)(r1 + %[xdp_md_data]); \
182 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
183 r1 = r2; \
184 r1 += 6; \
185 if r3 > r1 goto l0_%=; \
186 goto l1_%=; \
187l0_%=: r0 = *(u64*)(r1 - 6); \
188l1_%=: r0 = 0; \
189 exit; \
190" :
191 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
192 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
193 : __clobber_all);
194}
195
196SEC("xdp")
197__description("XDP pkt read, pkt_end > pkt_data', bad access 2")
198__failure __msg("R1 offset is outside of the packet")
199__flag(BPF_F_ANY_ALIGNMENT)
200__naked void pkt_data_bad_access_2_1(void)
201{
202 asm volatile (" \
203 r2 = *(u32*)(r1 + %[xdp_md_data]); \
204 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
205 r1 = r2; \
206 r1 += 8; \
207 if r3 > r1 goto l0_%=; \
208 r0 = *(u64*)(r1 - 8); \
209l0_%=: r0 = 0; \
210 exit; \
211" :
212 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
213 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
214 : __clobber_all);
215}
216
217SEC("xdp")
218__description("XDP pkt read, pkt_end > pkt_data', corner case, good access")
219__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
220__naked void data_corner_case_good_access_1(void)
221{
222 asm volatile (" \
223 r2 = *(u32*)(r1 + %[xdp_md_data]); \
224 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
225 r1 = r2; \
226 r1 += 7; \
227 if r3 > r1 goto l0_%=; \
228 goto l1_%=; \
229l0_%=: r0 = *(u64*)(r1 - 7); \
230l1_%=: r0 = 0; \
231 exit; \
232" :
233 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
234 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
235 : __clobber_all);
236}
237
238SEC("xdp")
239__description("XDP pkt read, pkt_end > pkt_data', corner case +1, good access")
240__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
241__naked void corner_case_1_good_access_2(void)
242{
243 asm volatile (" \
244 r2 = *(u32*)(r1 + %[xdp_md_data]); \
245 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
246 r1 = r2; \
247 r1 += 8; \
248 if r3 > r1 goto l0_%=; \
249 goto l1_%=; \
250l0_%=: r0 = *(u64*)(r1 - 8); \
251l1_%=: r0 = 0; \
252 exit; \
253" :
254 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
255 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
256 : __clobber_all);
257}
258
259SEC("xdp")
260__description("XDP pkt read, pkt_data' < pkt_end, good access")
261__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
262__naked void data_pkt_end_good_access_1(void)
263{
264 asm volatile (" \
265 r2 = *(u32*)(r1 + %[xdp_md_data]); \
266 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
267 r1 = r2; \
268 r1 += 8; \
269 if r1 < r3 goto l0_%=; \
270 goto l1_%=; \
271l0_%=: r0 = *(u32*)(r1 - 5); \
272l1_%=: r0 = 0; \
273 exit; \
274" :
275 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
276 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
277 : __clobber_all);
278}
279
280SEC("xdp")
281__description("XDP pkt read, pkt_data' < pkt_end, corner case -1, bad access")
282__failure __msg("R1 offset is outside of the packet")
283__flag(BPF_F_ANY_ALIGNMENT)
284__naked void corner_case_1_bad_access_3(void)
285{
286 asm volatile (" \
287 r2 = *(u32*)(r1 + %[xdp_md_data]); \
288 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
289 r1 = r2; \
290 r1 += 6; \
291 if r1 < r3 goto l0_%=; \
292 goto l1_%=; \
293l0_%=: r0 = *(u64*)(r1 - 6); \
294l1_%=: r0 = 0; \
295 exit; \
296" :
297 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
298 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
299 : __clobber_all);
300}
301
302SEC("xdp")
303__description("XDP pkt read, pkt_data' < pkt_end, bad access 2")
304__failure __msg("R1 offset is outside of the packet")
305__flag(BPF_F_ANY_ALIGNMENT)
306__naked void pkt_end_bad_access_2_2(void)
307{
308 asm volatile (" \
309 r2 = *(u32*)(r1 + %[xdp_md_data]); \
310 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
311 r1 = r2; \
312 r1 += 8; \
313 if r1 < r3 goto l0_%=; \
314 r0 = *(u64*)(r1 - 8); \
315l0_%=: r0 = 0; \
316 exit; \
317" :
318 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
319 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
320 : __clobber_all);
321}
322
323SEC("xdp")
324__description("XDP pkt read, pkt_data' < pkt_end, corner case, good access")
325__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
326__naked void end_corner_case_good_access_2(void)
327{
328 asm volatile (" \
329 r2 = *(u32*)(r1 + %[xdp_md_data]); \
330 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
331 r1 = r2; \
332 r1 += 7; \
333 if r1 < r3 goto l0_%=; \
334 goto l1_%=; \
335l0_%=: r0 = *(u64*)(r1 - 7); \
336l1_%=: r0 = 0; \
337 exit; \
338" :
339 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
340 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
341 : __clobber_all);
342}
343
344SEC("xdp")
345__description("XDP pkt read, pkt_data' < pkt_end, corner case +1, good access")
346__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
347__naked void corner_case_1_good_access_3(void)
348{
349 asm volatile (" \
350 r2 = *(u32*)(r1 + %[xdp_md_data]); \
351 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
352 r1 = r2; \
353 r1 += 8; \
354 if r1 < r3 goto l0_%=; \
355 goto l1_%=; \
356l0_%=: r0 = *(u64*)(r1 - 8); \
357l1_%=: r0 = 0; \
358 exit; \
359" :
360 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
361 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
362 : __clobber_all);
363}
364
365SEC("xdp")
366__description("XDP pkt read, pkt_end < pkt_data', corner case, good access")
367__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
368__naked void data_corner_case_good_access_2(void)
369{
370 asm volatile (" \
371 r2 = *(u32*)(r1 + %[xdp_md_data]); \
372 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
373 r1 = r2; \
374 r1 += 8; \
375 if r3 < r1 goto l0_%=; \
376 r0 = *(u64*)(r1 - 8); \
377l0_%=: r0 = 0; \
378 exit; \
379" :
380 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
381 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
382 : __clobber_all);
383}
384
385SEC("xdp")
386__description("XDP pkt read, pkt_end < pkt_data', bad access 1")
387__failure __msg("R1 offset is outside of the packet")
388__flag(BPF_F_ANY_ALIGNMENT)
389__naked void pkt_data_bad_access_1_1(void)
390{
391 asm volatile (" \
392 r2 = *(u32*)(r1 + %[xdp_md_data]); \
393 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
394 r1 = r2; \
395 r1 += 8; \
396 if r3 < r1 goto l0_%=; \
397 r0 = *(u64*)(r1 - 4); \
398l0_%=: r0 = 0; \
399 exit; \
400" :
401 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
402 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
403 : __clobber_all);
404}
405
406SEC("xdp")
407__description("XDP pkt read, pkt_end < pkt_data', bad access 2")
408__failure __msg("R1 offset is outside of the packet")
409__flag(BPF_F_ANY_ALIGNMENT)
410__naked void pkt_data_bad_access_2_2(void)
411{
412 asm volatile (" \
413 r2 = *(u32*)(r1 + %[xdp_md_data]); \
414 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
415 r1 = r2; \
416 r1 += 8; \
417 if r3 < r1 goto l0_%=; \
418l0_%=: r0 = *(u64*)(r1 - 8); \
419 r0 = 0; \
420 exit; \
421" :
422 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
423 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
424 : __clobber_all);
425}
426
427SEC("xdp")
428__description("XDP pkt read, pkt_end < pkt_data', corner case +1, good access")
429__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
430__naked void corner_case_1_good_access_4(void)
431{
432 asm volatile (" \
433 r2 = *(u32*)(r1 + %[xdp_md_data]); \
434 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
435 r1 = r2; \
436 r1 += 9; \
437 if r3 < r1 goto l0_%=; \
438 r0 = *(u64*)(r1 - 9); \
439l0_%=: r0 = 0; \
440 exit; \
441" :
442 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
443 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
444 : __clobber_all);
445}
446
447SEC("xdp")
448__description("XDP pkt read, pkt_end < pkt_data', corner case -1, bad access")
449__failure __msg("R1 offset is outside of the packet")
450__flag(BPF_F_ANY_ALIGNMENT)
451__naked void corner_case_1_bad_access_4(void)
452{
453 asm volatile (" \
454 r2 = *(u32*)(r1 + %[xdp_md_data]); \
455 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
456 r1 = r2; \
457 r1 += 7; \
458 if r3 < r1 goto l0_%=; \
459 r0 = *(u64*)(r1 - 7); \
460l0_%=: r0 = 0; \
461 exit; \
462" :
463 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
464 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
465 : __clobber_all);
466}
467
468SEC("xdp")
469__description("XDP pkt read, pkt_data' >= pkt_end, good access")
470__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
471__naked void data_pkt_end_good_access_2(void)
472{
473 asm volatile (" \
474 r2 = *(u32*)(r1 + %[xdp_md_data]); \
475 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
476 r1 = r2; \
477 r1 += 8; \
478 if r1 >= r3 goto l0_%=; \
479 r0 = *(u32*)(r1 - 5); \
480l0_%=: r0 = 0; \
481 exit; \
482" :
483 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
484 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
485 : __clobber_all);
486}
487
488SEC("xdp")
489__description("XDP pkt read, pkt_data' >= pkt_end, corner case -1, bad access")
490__failure __msg("R1 offset is outside of the packet")
491__flag(BPF_F_ANY_ALIGNMENT)
492__naked void corner_case_1_bad_access_5(void)
493{
494 asm volatile (" \
495 r2 = *(u32*)(r1 + %[xdp_md_data]); \
496 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
497 r1 = r2; \
498 r1 += 6; \
499 if r1 >= r3 goto l0_%=; \
500 r0 = *(u64*)(r1 - 6); \
501l0_%=: r0 = 0; \
502 exit; \
503" :
504 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
505 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
506 : __clobber_all);
507}
508
509SEC("xdp")
510__description("XDP pkt read, pkt_data' >= pkt_end, bad access 2")
511__failure __msg("R1 offset is outside of the packet")
512__flag(BPF_F_ANY_ALIGNMENT)
513__naked void pkt_end_bad_access_2_3(void)
514{
515 asm volatile (" \
516 r2 = *(u32*)(r1 + %[xdp_md_data]); \
517 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
518 r1 = r2; \
519 r1 += 8; \
520 if r1 >= r3 goto l0_%=; \
521l0_%=: r0 = *(u32*)(r1 - 5); \
522 r0 = 0; \
523 exit; \
524" :
525 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
526 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
527 : __clobber_all);
528}
529
530SEC("xdp")
531__description("XDP pkt read, pkt_data' >= pkt_end, corner case, good access")
532__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
533__naked void end_corner_case_good_access_3(void)
534{
535 asm volatile (" \
536 r2 = *(u32*)(r1 + %[xdp_md_data]); \
537 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
538 r1 = r2; \
539 r1 += 7; \
540 if r1 >= r3 goto l0_%=; \
541 r0 = *(u64*)(r1 - 7); \
542l0_%=: r0 = 0; \
543 exit; \
544" :
545 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
546 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
547 : __clobber_all);
548}
549
550SEC("xdp")
551__description("XDP pkt read, pkt_data' >= pkt_end, corner case +1, good access")
552__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
553__naked void corner_case_1_good_access_5(void)
554{
555 asm volatile (" \
556 r2 = *(u32*)(r1 + %[xdp_md_data]); \
557 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
558 r1 = r2; \
559 r1 += 8; \
560 if r1 >= r3 goto l0_%=; \
561 r0 = *(u64*)(r1 - 8); \
562l0_%=: r0 = 0; \
563 exit; \
564" :
565 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
566 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
567 : __clobber_all);
568}
569
570SEC("xdp")
571__description("XDP pkt read, pkt_end >= pkt_data', corner case, good access")
572__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
573__naked void data_corner_case_good_access_3(void)
574{
575 asm volatile (" \
576 r2 = *(u32*)(r1 + %[xdp_md_data]); \
577 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
578 r1 = r2; \
579 r1 += 8; \
580 if r3 >= r1 goto l0_%=; \
581 goto l1_%=; \
582l0_%=: r0 = *(u64*)(r1 - 8); \
583l1_%=: r0 = 0; \
584 exit; \
585" :
586 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
587 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
588 : __clobber_all);
589}
590
591SEC("xdp")
592__description("XDP pkt read, pkt_end >= pkt_data', bad access 1")
593__failure __msg("R1 offset is outside of the packet")
594__flag(BPF_F_ANY_ALIGNMENT)
595__naked void pkt_data_bad_access_1_2(void)
596{
597 asm volatile (" \
598 r2 = *(u32*)(r1 + %[xdp_md_data]); \
599 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
600 r1 = r2; \
601 r1 += 8; \
602 if r3 >= r1 goto l0_%=; \
603 goto l1_%=; \
604l0_%=: r0 = *(u64*)(r1 - 4); \
605l1_%=: r0 = 0; \
606 exit; \
607" :
608 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
609 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
610 : __clobber_all);
611}
612
613SEC("xdp")
614__description("XDP pkt read, pkt_end >= pkt_data', bad access 2")
615__failure __msg("R1 offset is outside of the packet")
616__flag(BPF_F_ANY_ALIGNMENT)
617__naked void pkt_data_bad_access_2_3(void)
618{
619 asm volatile (" \
620 r2 = *(u32*)(r1 + %[xdp_md_data]); \
621 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
622 r1 = r2; \
623 r1 += 8; \
624 if r3 >= r1 goto l0_%=; \
625 r0 = *(u64*)(r1 - 8); \
626l0_%=: r0 = 0; \
627 exit; \
628" :
629 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
630 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
631 : __clobber_all);
632}
633
634SEC("xdp")
635__description("XDP pkt read, pkt_end >= pkt_data', corner case +1, good access")
636__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
637__naked void corner_case_1_good_access_6(void)
638{
639 asm volatile (" \
640 r2 = *(u32*)(r1 + %[xdp_md_data]); \
641 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
642 r1 = r2; \
643 r1 += 9; \
644 if r3 >= r1 goto l0_%=; \
645 goto l1_%=; \
646l0_%=: r0 = *(u64*)(r1 - 9); \
647l1_%=: r0 = 0; \
648 exit; \
649" :
650 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
651 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
652 : __clobber_all);
653}
654
655SEC("xdp")
656__description("XDP pkt read, pkt_end >= pkt_data', corner case -1, bad access")
657__failure __msg("R1 offset is outside of the packet")
658__flag(BPF_F_ANY_ALIGNMENT)
659__naked void corner_case_1_bad_access_6(void)
660{
661 asm volatile (" \
662 r2 = *(u32*)(r1 + %[xdp_md_data]); \
663 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
664 r1 = r2; \
665 r1 += 7; \
666 if r3 >= r1 goto l0_%=; \
667 goto l1_%=; \
668l0_%=: r0 = *(u64*)(r1 - 7); \
669l1_%=: r0 = 0; \
670 exit; \
671" :
672 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
673 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
674 : __clobber_all);
675}
676
677SEC("xdp")
678__description("XDP pkt read, pkt_data' <= pkt_end, corner case, good access")
679__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
680__naked void end_corner_case_good_access_4(void)
681{
682 asm volatile (" \
683 r2 = *(u32*)(r1 + %[xdp_md_data]); \
684 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
685 r1 = r2; \
686 r1 += 8; \
687 if r1 <= r3 goto l0_%=; \
688 goto l1_%=; \
689l0_%=: r0 = *(u64*)(r1 - 8); \
690l1_%=: r0 = 0; \
691 exit; \
692" :
693 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
694 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
695 : __clobber_all);
696}
697
698SEC("xdp")
699__description("XDP pkt read, pkt_data' <= pkt_end, bad access 1")
700__failure __msg("R1 offset is outside of the packet")
701__flag(BPF_F_ANY_ALIGNMENT)
702__naked void pkt_end_bad_access_1_2(void)
703{
704 asm volatile (" \
705 r2 = *(u32*)(r1 + %[xdp_md_data]); \
706 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
707 r1 = r2; \
708 r1 += 8; \
709 if r1 <= r3 goto l0_%=; \
710 goto l1_%=; \
711l0_%=: r0 = *(u64*)(r1 - 4); \
712l1_%=: r0 = 0; \
713 exit; \
714" :
715 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
716 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
717 : __clobber_all);
718}
719
720SEC("xdp")
721__description("XDP pkt read, pkt_data' <= pkt_end, bad access 2")
722__failure __msg("R1 offset is outside of the packet")
723__flag(BPF_F_ANY_ALIGNMENT)
724__naked void pkt_end_bad_access_2_4(void)
725{
726 asm volatile (" \
727 r2 = *(u32*)(r1 + %[xdp_md_data]); \
728 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
729 r1 = r2; \
730 r1 += 8; \
731 if r1 <= r3 goto l0_%=; \
732 r0 = *(u64*)(r1 - 8); \
733l0_%=: r0 = 0; \
734 exit; \
735" :
736 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
737 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
738 : __clobber_all);
739}
740
741SEC("xdp")
742__description("XDP pkt read, pkt_data' <= pkt_end, corner case +1, good access")
743__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
744__naked void corner_case_1_good_access_7(void)
745{
746 asm volatile (" \
747 r2 = *(u32*)(r1 + %[xdp_md_data]); \
748 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
749 r1 = r2; \
750 r1 += 9; \
751 if r1 <= r3 goto l0_%=; \
752 goto l1_%=; \
753l0_%=: r0 = *(u64*)(r1 - 9); \
754l1_%=: r0 = 0; \
755 exit; \
756" :
757 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
758 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
759 : __clobber_all);
760}
761
762SEC("xdp")
763__description("XDP pkt read, pkt_data' <= pkt_end, corner case -1, bad access")
764__failure __msg("R1 offset is outside of the packet")
765__flag(BPF_F_ANY_ALIGNMENT)
766__naked void corner_case_1_bad_access_7(void)
767{
768 asm volatile (" \
769 r2 = *(u32*)(r1 + %[xdp_md_data]); \
770 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
771 r1 = r2; \
772 r1 += 7; \
773 if r1 <= r3 goto l0_%=; \
774 goto l1_%=; \
775l0_%=: r0 = *(u64*)(r1 - 7); \
776l1_%=: r0 = 0; \
777 exit; \
778" :
779 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
780 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
781 : __clobber_all);
782}
783
784SEC("xdp")
785__description("XDP pkt read, pkt_end <= pkt_data', good access")
786__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
787__naked void end_pkt_data_good_access_2(void)
788{
789 asm volatile (" \
790 r2 = *(u32*)(r1 + %[xdp_md_data]); \
791 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
792 r1 = r2; \
793 r1 += 8; \
794 if r3 <= r1 goto l0_%=; \
795 r0 = *(u32*)(r1 - 5); \
796l0_%=: r0 = 0; \
797 exit; \
798" :
799 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
800 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
801 : __clobber_all);
802}
803
804SEC("xdp")
805__description("XDP pkt read, pkt_end <= pkt_data', corner case -1, bad access")
806__failure __msg("R1 offset is outside of the packet")
807__flag(BPF_F_ANY_ALIGNMENT)
808__naked void corner_case_1_bad_access_8(void)
809{
810 asm volatile (" \
811 r2 = *(u32*)(r1 + %[xdp_md_data]); \
812 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
813 r1 = r2; \
814 r1 += 6; \
815 if r3 <= r1 goto l0_%=; \
816 r0 = *(u64*)(r1 - 6); \
817l0_%=: r0 = 0; \
818 exit; \
819" :
820 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
821 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
822 : __clobber_all);
823}
824
825SEC("xdp")
826__description("XDP pkt read, pkt_end <= pkt_data', bad access 2")
827__failure __msg("R1 offset is outside of the packet")
828__flag(BPF_F_ANY_ALIGNMENT)
829__naked void pkt_data_bad_access_2_4(void)
830{
831 asm volatile (" \
832 r2 = *(u32*)(r1 + %[xdp_md_data]); \
833 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
834 r1 = r2; \
835 r1 += 8; \
836 if r3 <= r1 goto l0_%=; \
837l0_%=: r0 = *(u32*)(r1 - 5); \
838 r0 = 0; \
839 exit; \
840" :
841 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
842 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
843 : __clobber_all);
844}
845
846SEC("xdp")
847__description("XDP pkt read, pkt_end <= pkt_data', corner case, good access")
848__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
849__naked void data_corner_case_good_access_4(void)
850{
851 asm volatile (" \
852 r2 = *(u32*)(r1 + %[xdp_md_data]); \
853 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
854 r1 = r2; \
855 r1 += 7; \
856 if r3 <= r1 goto l0_%=; \
857 r0 = *(u64*)(r1 - 7); \
858l0_%=: r0 = 0; \
859 exit; \
860" :
861 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
862 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
863 : __clobber_all);
864}
865
866SEC("xdp")
867__description("XDP pkt read, pkt_end <= pkt_data', corner case +1, good access")
868__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
869__naked void corner_case_1_good_access_8(void)
870{
871 asm volatile (" \
872 r2 = *(u32*)(r1 + %[xdp_md_data]); \
873 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
874 r1 = r2; \
875 r1 += 8; \
876 if r3 <= r1 goto l0_%=; \
877 r0 = *(u64*)(r1 - 8); \
878l0_%=: r0 = 0; \
879 exit; \
880" :
881 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
882 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
883 : __clobber_all);
884}
885
886SEC("xdp")
887__description("XDP pkt read, pkt_meta' > pkt_data, corner case, good access")
888__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
889__naked void data_corner_case_good_access_5(void)
890{
891 asm volatile (" \
892 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
893 r3 = *(u32*)(r1 + %[xdp_md_data]); \
894 r1 = r2; \
895 r1 += 8; \
896 if r1 > r3 goto l0_%=; \
897 r0 = *(u64*)(r1 - 8); \
898l0_%=: r0 = 0; \
899 exit; \
900" :
901 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
902 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
903 : __clobber_all);
904}
905
906SEC("xdp")
907__description("XDP pkt read, pkt_meta' > pkt_data, bad access 1")
908__failure __msg("R1 offset is outside of the packet")
909__flag(BPF_F_ANY_ALIGNMENT)
910__naked void pkt_data_bad_access_1_3(void)
911{
912 asm volatile (" \
913 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
914 r3 = *(u32*)(r1 + %[xdp_md_data]); \
915 r1 = r2; \
916 r1 += 8; \
917 if r1 > r3 goto l0_%=; \
918 r0 = *(u64*)(r1 - 4); \
919l0_%=: r0 = 0; \
920 exit; \
921" :
922 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
923 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
924 : __clobber_all);
925}
926
927SEC("xdp")
928__description("XDP pkt read, pkt_meta' > pkt_data, bad access 2")
929__failure __msg("R1 offset is outside of the packet")
930__flag(BPF_F_ANY_ALIGNMENT)
931__naked void pkt_data_bad_access_2_5(void)
932{
933 asm volatile (" \
934 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
935 r3 = *(u32*)(r1 + %[xdp_md_data]); \
936 r1 = r2; \
937 r1 += 8; \
938 if r1 > r3 goto l0_%=; \
939l0_%=: r0 = *(u64*)(r1 - 8); \
940 r0 = 0; \
941 exit; \
942" :
943 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
944 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
945 : __clobber_all);
946}
947
948SEC("xdp")
949__description("XDP pkt read, pkt_meta' > pkt_data, corner case +1, good access")
950__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
951__naked void corner_case_1_good_access_9(void)
952{
953 asm volatile (" \
954 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
955 r3 = *(u32*)(r1 + %[xdp_md_data]); \
956 r1 = r2; \
957 r1 += 9; \
958 if r1 > r3 goto l0_%=; \
959 r0 = *(u64*)(r1 - 9); \
960l0_%=: r0 = 0; \
961 exit; \
962" :
963 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
964 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
965 : __clobber_all);
966}
967
968SEC("xdp")
969__description("XDP pkt read, pkt_meta' > pkt_data, corner case -1, bad access")
970__failure __msg("R1 offset is outside of the packet")
971__flag(BPF_F_ANY_ALIGNMENT)
972__naked void corner_case_1_bad_access_9(void)
973{
974 asm volatile (" \
975 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
976 r3 = *(u32*)(r1 + %[xdp_md_data]); \
977 r1 = r2; \
978 r1 += 7; \
979 if r1 > r3 goto l0_%=; \
980 r0 = *(u64*)(r1 - 7); \
981l0_%=: r0 = 0; \
982 exit; \
983" :
984 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
985 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
986 : __clobber_all);
987}
988
989SEC("xdp")
990__description("XDP pkt read, pkt_data > pkt_meta', good access")
991__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
992__naked void data_pkt_meta_good_access_1(void)
993{
994 asm volatile (" \
995 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
996 r3 = *(u32*)(r1 + %[xdp_md_data]); \
997 r1 = r2; \
998 r1 += 8; \
999 if r3 > r1 goto l0_%=; \
1000 goto l1_%=; \
1001l0_%=: r0 = *(u32*)(r1 - 5); \
1002l1_%=: r0 = 0; \
1003 exit; \
1004" :
1005 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1006 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1007 : __clobber_all);
1008}
1009
1010SEC("xdp")
1011__description("XDP pkt read, pkt_data > pkt_meta', corner case -1, bad access")
1012__failure __msg("R1 offset is outside of the packet")
1013__flag(BPF_F_ANY_ALIGNMENT)
1014__naked void corner_case_1_bad_access_10(void)
1015{
1016 asm volatile (" \
1017 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1018 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1019 r1 = r2; \
1020 r1 += 6; \
1021 if r3 > r1 goto l0_%=; \
1022 goto l1_%=; \
1023l0_%=: r0 = *(u64*)(r1 - 6); \
1024l1_%=: r0 = 0; \
1025 exit; \
1026" :
1027 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1028 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1029 : __clobber_all);
1030}
1031
1032SEC("xdp")
1033__description("XDP pkt read, pkt_data > pkt_meta', bad access 2")
1034__failure __msg("R1 offset is outside of the packet")
1035__flag(BPF_F_ANY_ALIGNMENT)
1036__naked void pkt_meta_bad_access_2_1(void)
1037{
1038 asm volatile (" \
1039 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1040 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1041 r1 = r2; \
1042 r1 += 8; \
1043 if r3 > r1 goto l0_%=; \
1044 r0 = *(u64*)(r1 - 8); \
1045l0_%=: r0 = 0; \
1046 exit; \
1047" :
1048 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1049 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1050 : __clobber_all);
1051}
1052
1053SEC("xdp")
1054__description("XDP pkt read, pkt_data > pkt_meta', corner case, good access")
1055__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1056__naked void meta_corner_case_good_access_1(void)
1057{
1058 asm volatile (" \
1059 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1060 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1061 r1 = r2; \
1062 r1 += 7; \
1063 if r3 > r1 goto l0_%=; \
1064 goto l1_%=; \
1065l0_%=: r0 = *(u64*)(r1 - 7); \
1066l1_%=: r0 = 0; \
1067 exit; \
1068" :
1069 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1070 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1071 : __clobber_all);
1072}
1073
1074SEC("xdp")
1075__description("XDP pkt read, pkt_data > pkt_meta', corner case +1, good access")
1076__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1077__naked void corner_case_1_good_access_10(void)
1078{
1079 asm volatile (" \
1080 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1081 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1082 r1 = r2; \
1083 r1 += 8; \
1084 if r3 > r1 goto l0_%=; \
1085 goto l1_%=; \
1086l0_%=: r0 = *(u64*)(r1 - 8); \
1087l1_%=: r0 = 0; \
1088 exit; \
1089" :
1090 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1091 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1092 : __clobber_all);
1093}
1094
1095SEC("xdp")
1096__description("XDP pkt read, pkt_meta' < pkt_data, good access")
1097__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1098__naked void meta_pkt_data_good_access_1(void)
1099{
1100 asm volatile (" \
1101 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1102 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1103 r1 = r2; \
1104 r1 += 8; \
1105 if r1 < r3 goto l0_%=; \
1106 goto l1_%=; \
1107l0_%=: r0 = *(u32*)(r1 - 5); \
1108l1_%=: r0 = 0; \
1109 exit; \
1110" :
1111 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1112 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1113 : __clobber_all);
1114}
1115
1116SEC("xdp")
1117__description("XDP pkt read, pkt_meta' < pkt_data, corner case -1, bad access")
1118__failure __msg("R1 offset is outside of the packet")
1119__flag(BPF_F_ANY_ALIGNMENT)
1120__naked void corner_case_1_bad_access_11(void)
1121{
1122 asm volatile (" \
1123 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1124 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1125 r1 = r2; \
1126 r1 += 6; \
1127 if r1 < r3 goto l0_%=; \
1128 goto l1_%=; \
1129l0_%=: r0 = *(u64*)(r1 - 6); \
1130l1_%=: r0 = 0; \
1131 exit; \
1132" :
1133 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1134 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1135 : __clobber_all);
1136}
1137
1138SEC("xdp")
1139__description("XDP pkt read, pkt_meta' < pkt_data, bad access 2")
1140__failure __msg("R1 offset is outside of the packet")
1141__flag(BPF_F_ANY_ALIGNMENT)
1142__naked void pkt_data_bad_access_2_6(void)
1143{
1144 asm volatile (" \
1145 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1146 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1147 r1 = r2; \
1148 r1 += 8; \
1149 if r1 < r3 goto l0_%=; \
1150 r0 = *(u64*)(r1 - 8); \
1151l0_%=: r0 = 0; \
1152 exit; \
1153" :
1154 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1155 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1156 : __clobber_all);
1157}
1158
1159SEC("xdp")
1160__description("XDP pkt read, pkt_meta' < pkt_data, corner case, good access")
1161__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1162__naked void data_corner_case_good_access_6(void)
1163{
1164 asm volatile (" \
1165 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1166 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1167 r1 = r2; \
1168 r1 += 7; \
1169 if r1 < r3 goto l0_%=; \
1170 goto l1_%=; \
1171l0_%=: r0 = *(u64*)(r1 - 7); \
1172l1_%=: r0 = 0; \
1173 exit; \
1174" :
1175 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1176 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1177 : __clobber_all);
1178}
1179
1180SEC("xdp")
1181__description("XDP pkt read, pkt_meta' < pkt_data, corner case +1, good access")
1182__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1183__naked void corner_case_1_good_access_11(void)
1184{
1185 asm volatile (" \
1186 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1187 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1188 r1 = r2; \
1189 r1 += 8; \
1190 if r1 < r3 goto l0_%=; \
1191 goto l1_%=; \
1192l0_%=: r0 = *(u64*)(r1 - 8); \
1193l1_%=: r0 = 0; \
1194 exit; \
1195" :
1196 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1197 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1198 : __clobber_all);
1199}
1200
1201SEC("xdp")
1202__description("XDP pkt read, pkt_data < pkt_meta', corner case, good access")
1203__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1204__naked void meta_corner_case_good_access_2(void)
1205{
1206 asm volatile (" \
1207 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1208 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1209 r1 = r2; \
1210 r1 += 8; \
1211 if r3 < r1 goto l0_%=; \
1212 r0 = *(u64*)(r1 - 8); \
1213l0_%=: r0 = 0; \
1214 exit; \
1215" :
1216 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1217 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1218 : __clobber_all);
1219}
1220
1221SEC("xdp")
1222__description("XDP pkt read, pkt_data < pkt_meta', bad access 1")
1223__failure __msg("R1 offset is outside of the packet")
1224__flag(BPF_F_ANY_ALIGNMENT)
1225__naked void pkt_meta_bad_access_1_1(void)
1226{
1227 asm volatile (" \
1228 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1229 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1230 r1 = r2; \
1231 r1 += 8; \
1232 if r3 < r1 goto l0_%=; \
1233 r0 = *(u64*)(r1 - 4); \
1234l0_%=: r0 = 0; \
1235 exit; \
1236" :
1237 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1238 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1239 : __clobber_all);
1240}
1241
1242SEC("xdp")
1243__description("XDP pkt read, pkt_data < pkt_meta', bad access 2")
1244__failure __msg("R1 offset is outside of the packet")
1245__flag(BPF_F_ANY_ALIGNMENT)
1246__naked void pkt_meta_bad_access_2_2(void)
1247{
1248 asm volatile (" \
1249 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1250 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1251 r1 = r2; \
1252 r1 += 8; \
1253 if r3 < r1 goto l0_%=; \
1254l0_%=: r0 = *(u64*)(r1 - 8); \
1255 r0 = 0; \
1256 exit; \
1257" :
1258 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1259 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1260 : __clobber_all);
1261}
1262
1263SEC("xdp")
1264__description("XDP pkt read, pkt_data < pkt_meta', corner case +1, good access")
1265__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1266__naked void corner_case_1_good_access_12(void)
1267{
1268 asm volatile (" \
1269 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1270 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1271 r1 = r2; \
1272 r1 += 9; \
1273 if r3 < r1 goto l0_%=; \
1274 r0 = *(u64*)(r1 - 9); \
1275l0_%=: r0 = 0; \
1276 exit; \
1277" :
1278 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1279 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1280 : __clobber_all);
1281}
1282
1283SEC("xdp")
1284__description("XDP pkt read, pkt_data < pkt_meta', corner case -1, bad access")
1285__failure __msg("R1 offset is outside of the packet")
1286__flag(BPF_F_ANY_ALIGNMENT)
1287__naked void corner_case_1_bad_access_12(void)
1288{
1289 asm volatile (" \
1290 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1291 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1292 r1 = r2; \
1293 r1 += 7; \
1294 if r3 < r1 goto l0_%=; \
1295 r0 = *(u64*)(r1 - 7); \
1296l0_%=: r0 = 0; \
1297 exit; \
1298" :
1299 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1300 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1301 : __clobber_all);
1302}
1303
1304SEC("xdp")
1305__description("XDP pkt read, pkt_meta' >= pkt_data, good access")
1306__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1307__naked void meta_pkt_data_good_access_2(void)
1308{
1309 asm volatile (" \
1310 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1311 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1312 r1 = r2; \
1313 r1 += 8; \
1314 if r1 >= r3 goto l0_%=; \
1315 r0 = *(u32*)(r1 - 5); \
1316l0_%=: r0 = 0; \
1317 exit; \
1318" :
1319 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1320 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1321 : __clobber_all);
1322}
1323
1324SEC("xdp")
1325__description("XDP pkt read, pkt_meta' >= pkt_data, corner case -1, bad access")
1326__failure __msg("R1 offset is outside of the packet")
1327__flag(BPF_F_ANY_ALIGNMENT)
1328__naked void corner_case_1_bad_access_13(void)
1329{
1330 asm volatile (" \
1331 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1332 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1333 r1 = r2; \
1334 r1 += 6; \
1335 if r1 >= r3 goto l0_%=; \
1336 r0 = *(u64*)(r1 - 6); \
1337l0_%=: r0 = 0; \
1338 exit; \
1339" :
1340 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1341 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1342 : __clobber_all);
1343}
1344
1345SEC("xdp")
1346__description("XDP pkt read, pkt_meta' >= pkt_data, bad access 2")
1347__failure __msg("R1 offset is outside of the packet")
1348__flag(BPF_F_ANY_ALIGNMENT)
1349__naked void pkt_data_bad_access_2_7(void)
1350{
1351 asm volatile (" \
1352 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1353 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1354 r1 = r2; \
1355 r1 += 8; \
1356 if r1 >= r3 goto l0_%=; \
1357l0_%=: r0 = *(u32*)(r1 - 5); \
1358 r0 = 0; \
1359 exit; \
1360" :
1361 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1362 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1363 : __clobber_all);
1364}
1365
1366SEC("xdp")
1367__description("XDP pkt read, pkt_meta' >= pkt_data, corner case, good access")
1368__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1369__naked void data_corner_case_good_access_7(void)
1370{
1371 asm volatile (" \
1372 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1373 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1374 r1 = r2; \
1375 r1 += 7; \
1376 if r1 >= r3 goto l0_%=; \
1377 r0 = *(u64*)(r1 - 7); \
1378l0_%=: r0 = 0; \
1379 exit; \
1380" :
1381 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1382 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1383 : __clobber_all);
1384}
1385
1386SEC("xdp")
1387__description("XDP pkt read, pkt_meta' >= pkt_data, corner case +1, good access")
1388__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1389__naked void corner_case_1_good_access_13(void)
1390{
1391 asm volatile (" \
1392 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1393 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1394 r1 = r2; \
1395 r1 += 8; \
1396 if r1 >= r3 goto l0_%=; \
1397 r0 = *(u64*)(r1 - 8); \
1398l0_%=: r0 = 0; \
1399 exit; \
1400" :
1401 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1402 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1403 : __clobber_all);
1404}
1405
1406SEC("xdp")
1407__description("XDP pkt read, pkt_data >= pkt_meta', corner case, good access")
1408__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1409__naked void meta_corner_case_good_access_3(void)
1410{
1411 asm volatile (" \
1412 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1413 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1414 r1 = r2; \
1415 r1 += 8; \
1416 if r3 >= r1 goto l0_%=; \
1417 goto l1_%=; \
1418l0_%=: r0 = *(u64*)(r1 - 8); \
1419l1_%=: r0 = 0; \
1420 exit; \
1421" :
1422 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1423 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1424 : __clobber_all);
1425}
1426
1427SEC("xdp")
1428__description("XDP pkt read, pkt_data >= pkt_meta', bad access 1")
1429__failure __msg("R1 offset is outside of the packet")
1430__flag(BPF_F_ANY_ALIGNMENT)
1431__naked void pkt_meta_bad_access_1_2(void)
1432{
1433 asm volatile (" \
1434 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1435 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1436 r1 = r2; \
1437 r1 += 8; \
1438 if r3 >= r1 goto l0_%=; \
1439 goto l1_%=; \
1440l0_%=: r0 = *(u64*)(r1 - 4); \
1441l1_%=: r0 = 0; \
1442 exit; \
1443" :
1444 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1445 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1446 : __clobber_all);
1447}
1448
1449SEC("xdp")
1450__description("XDP pkt read, pkt_data >= pkt_meta', bad access 2")
1451__failure __msg("R1 offset is outside of the packet")
1452__flag(BPF_F_ANY_ALIGNMENT)
1453__naked void pkt_meta_bad_access_2_3(void)
1454{
1455 asm volatile (" \
1456 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1457 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1458 r1 = r2; \
1459 r1 += 8; \
1460 if r3 >= r1 goto l0_%=; \
1461 r0 = *(u64*)(r1 - 8); \
1462l0_%=: r0 = 0; \
1463 exit; \
1464" :
1465 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1466 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1467 : __clobber_all);
1468}
1469
1470SEC("xdp")
1471__description("XDP pkt read, pkt_data >= pkt_meta', corner case +1, good access")
1472__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1473__naked void corner_case_1_good_access_14(void)
1474{
1475 asm volatile (" \
1476 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1477 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1478 r1 = r2; \
1479 r1 += 9; \
1480 if r3 >= r1 goto l0_%=; \
1481 goto l1_%=; \
1482l0_%=: r0 = *(u64*)(r1 - 9); \
1483l1_%=: r0 = 0; \
1484 exit; \
1485" :
1486 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1487 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1488 : __clobber_all);
1489}
1490
1491SEC("xdp")
1492__description("XDP pkt read, pkt_data >= pkt_meta', corner case -1, bad access")
1493__failure __msg("R1 offset is outside of the packet")
1494__flag(BPF_F_ANY_ALIGNMENT)
1495__naked void corner_case_1_bad_access_14(void)
1496{
1497 asm volatile (" \
1498 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1499 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1500 r1 = r2; \
1501 r1 += 7; \
1502 if r3 >= r1 goto l0_%=; \
1503 goto l1_%=; \
1504l0_%=: r0 = *(u64*)(r1 - 7); \
1505l1_%=: r0 = 0; \
1506 exit; \
1507" :
1508 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1509 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1510 : __clobber_all);
1511}
1512
1513SEC("xdp")
1514__description("XDP pkt read, pkt_meta' <= pkt_data, corner case, good access")
1515__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1516__naked void data_corner_case_good_access_8(void)
1517{
1518 asm volatile (" \
1519 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1520 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1521 r1 = r2; \
1522 r1 += 8; \
1523 if r1 <= r3 goto l0_%=; \
1524 goto l1_%=; \
1525l0_%=: r0 = *(u64*)(r1 - 8); \
1526l1_%=: r0 = 0; \
1527 exit; \
1528" :
1529 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1530 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1531 : __clobber_all);
1532}
1533
1534SEC("xdp")
1535__description("XDP pkt read, pkt_meta' <= pkt_data, bad access 1")
1536__failure __msg("R1 offset is outside of the packet")
1537__flag(BPF_F_ANY_ALIGNMENT)
1538__naked void pkt_data_bad_access_1_4(void)
1539{
1540 asm volatile (" \
1541 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1542 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1543 r1 = r2; \
1544 r1 += 8; \
1545 if r1 <= r3 goto l0_%=; \
1546 goto l1_%=; \
1547l0_%=: r0 = *(u64*)(r1 - 4); \
1548l1_%=: r0 = 0; \
1549 exit; \
1550" :
1551 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1552 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1553 : __clobber_all);
1554}
1555
1556SEC("xdp")
1557__description("XDP pkt read, pkt_meta' <= pkt_data, bad access 2")
1558__failure __msg("R1 offset is outside of the packet")
1559__flag(BPF_F_ANY_ALIGNMENT)
1560__naked void pkt_data_bad_access_2_8(void)
1561{
1562 asm volatile (" \
1563 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1564 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1565 r1 = r2; \
1566 r1 += 8; \
1567 if r1 <= r3 goto l0_%=; \
1568 r0 = *(u64*)(r1 - 8); \
1569l0_%=: r0 = 0; \
1570 exit; \
1571" :
1572 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1573 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1574 : __clobber_all);
1575}
1576
1577SEC("xdp")
1578__description("XDP pkt read, pkt_meta' <= pkt_data, corner case +1, good access")
1579__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1580__naked void corner_case_1_good_access_15(void)
1581{
1582 asm volatile (" \
1583 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1584 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1585 r1 = r2; \
1586 r1 += 9; \
1587 if r1 <= r3 goto l0_%=; \
1588 goto l1_%=; \
1589l0_%=: r0 = *(u64*)(r1 - 9); \
1590l1_%=: r0 = 0; \
1591 exit; \
1592" :
1593 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1594 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1595 : __clobber_all);
1596}
1597
1598SEC("xdp")
1599__description("XDP pkt read, pkt_meta' <= pkt_data, corner case -1, bad access")
1600__failure __msg("R1 offset is outside of the packet")
1601__flag(BPF_F_ANY_ALIGNMENT)
1602__naked void corner_case_1_bad_access_15(void)
1603{
1604 asm volatile (" \
1605 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1606 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1607 r1 = r2; \
1608 r1 += 7; \
1609 if r1 <= r3 goto l0_%=; \
1610 goto l1_%=; \
1611l0_%=: r0 = *(u64*)(r1 - 7); \
1612l1_%=: r0 = 0; \
1613 exit; \
1614" :
1615 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1616 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1617 : __clobber_all);
1618}
1619
1620SEC("xdp")
1621__description("XDP pkt read, pkt_data <= pkt_meta', good access")
1622__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1623__naked void data_pkt_meta_good_access_2(void)
1624{
1625 asm volatile (" \
1626 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1627 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1628 r1 = r2; \
1629 r1 += 8; \
1630 if r3 <= r1 goto l0_%=; \
1631 r0 = *(u32*)(r1 - 5); \
1632l0_%=: r0 = 0; \
1633 exit; \
1634" :
1635 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1636 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1637 : __clobber_all);
1638}
1639
1640SEC("xdp")
1641__description("XDP pkt read, pkt_data <= pkt_meta', corner case -1, bad access")
1642__failure __msg("R1 offset is outside of the packet")
1643__flag(BPF_F_ANY_ALIGNMENT)
1644__naked void corner_case_1_bad_access_16(void)
1645{
1646 asm volatile (" \
1647 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1648 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1649 r1 = r2; \
1650 r1 += 6; \
1651 if r3 <= r1 goto l0_%=; \
1652 r0 = *(u64*)(r1 - 6); \
1653l0_%=: r0 = 0; \
1654 exit; \
1655" :
1656 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1657 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1658 : __clobber_all);
1659}
1660
1661SEC("xdp")
1662__description("XDP pkt read, pkt_data <= pkt_meta', bad access 2")
1663__failure __msg("R1 offset is outside of the packet")
1664__flag(BPF_F_ANY_ALIGNMENT)
1665__naked void pkt_meta_bad_access_2_4(void)
1666{
1667 asm volatile (" \
1668 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1669 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1670 r1 = r2; \
1671 r1 += 8; \
1672 if r3 <= r1 goto l0_%=; \
1673l0_%=: r0 = *(u32*)(r1 - 5); \
1674 r0 = 0; \
1675 exit; \
1676" :
1677 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1678 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1679 : __clobber_all);
1680}
1681
1682SEC("xdp")
1683__description("XDP pkt read, pkt_data <= pkt_meta', corner case, good access")
1684__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1685__naked void meta_corner_case_good_access_4(void)
1686{
1687 asm volatile (" \
1688 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1689 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1690 r1 = r2; \
1691 r1 += 7; \
1692 if r3 <= r1 goto l0_%=; \
1693 r0 = *(u64*)(r1 - 7); \
1694l0_%=: r0 = 0; \
1695 exit; \
1696" :
1697 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1698 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1699 : __clobber_all);
1700}
1701
1702SEC("xdp")
1703__description("XDP pkt read, pkt_data <= pkt_meta', corner case +1, good access")
1704__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)
1705__naked void corner_case_1_good_access_16(void)
1706{
1707 asm volatile (" \
1708 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
1709 r3 = *(u32*)(r1 + %[xdp_md_data]); \
1710 r1 = r2; \
1711 r1 += 8; \
1712 if r3 <= r1 goto l0_%=; \
1713 r0 = *(u64*)(r1 - 8); \
1714l0_%=: r0 = 0; \
1715 exit; \
1716" :
1717 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
1718 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
1719 : __clobber_all);
1720}
1721
1722char _license[] SEC("license") = "GPL";
1723

source code of linux/tools/testing/selftests/bpf/progs/verifier_xdp_direct_packet_access.c