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