brintos

brintos / linux-shallow public Read only

0
0
Text · 47.8 KiB · df2dfd1 Raw
1723 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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