1*65428312SEduard Zingerman // SPDX-License-Identifier: GPL-2.0
2*65428312SEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/meta_access.c */
3*65428312SEduard Zingerman 
4*65428312SEduard Zingerman #include <linux/bpf.h>
5*65428312SEduard Zingerman #include <bpf/bpf_helpers.h>
6*65428312SEduard Zingerman #include "bpf_misc.h"
7*65428312SEduard Zingerman 
8*65428312SEduard Zingerman SEC("xdp")
9*65428312SEduard Zingerman __description("meta access, test1")
10*65428312SEduard Zingerman __success __retval(0)
meta_access_test1(void)11*65428312SEduard Zingerman __naked void meta_access_test1(void)
12*65428312SEduard Zingerman {
13*65428312SEduard Zingerman 	asm volatile ("					\
14*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
15*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
16*65428312SEduard Zingerman 	r0 = r2;					\
17*65428312SEduard Zingerman 	r0 += 8;					\
18*65428312SEduard Zingerman 	if r0 > r3 goto l0_%=;				\
19*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
20*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
21*65428312SEduard Zingerman 	exit;						\
22*65428312SEduard Zingerman "	:
23*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
24*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
25*65428312SEduard Zingerman 	: __clobber_all);
26*65428312SEduard Zingerman }
27*65428312SEduard Zingerman 
28*65428312SEduard Zingerman SEC("xdp")
29*65428312SEduard Zingerman __description("meta access, test2")
30*65428312SEduard Zingerman __failure __msg("invalid access to packet, off=-8")
meta_access_test2(void)31*65428312SEduard Zingerman __naked void meta_access_test2(void)
32*65428312SEduard Zingerman {
33*65428312SEduard Zingerman 	asm volatile ("					\
34*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
35*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
36*65428312SEduard Zingerman 	r0 = r2;					\
37*65428312SEduard Zingerman 	r0 -= 8;					\
38*65428312SEduard Zingerman 	r4 = r2;					\
39*65428312SEduard Zingerman 	r4 += 8;					\
40*65428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
41*65428312SEduard Zingerman 	r0 = *(u8*)(r0 + 0);				\
42*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
43*65428312SEduard Zingerman 	exit;						\
44*65428312SEduard Zingerman "	:
45*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
46*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
47*65428312SEduard Zingerman 	: __clobber_all);
48*65428312SEduard Zingerman }
49*65428312SEduard Zingerman 
50*65428312SEduard Zingerman SEC("xdp")
51*65428312SEduard Zingerman __description("meta access, test3")
52*65428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test3(void)53*65428312SEduard Zingerman __naked void meta_access_test3(void)
54*65428312SEduard Zingerman {
55*65428312SEduard Zingerman 	asm volatile ("					\
56*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
57*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
58*65428312SEduard Zingerman 	r0 = r2;					\
59*65428312SEduard Zingerman 	r0 += 8;					\
60*65428312SEduard Zingerman 	if r0 > r3 goto l0_%=;				\
61*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
62*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
63*65428312SEduard Zingerman 	exit;						\
64*65428312SEduard Zingerman "	:
65*65428312SEduard Zingerman 	: __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
66*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
67*65428312SEduard Zingerman 	: __clobber_all);
68*65428312SEduard Zingerman }
69*65428312SEduard Zingerman 
70*65428312SEduard Zingerman SEC("xdp")
71*65428312SEduard Zingerman __description("meta access, test4")
72*65428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test4(void)73*65428312SEduard Zingerman __naked void meta_access_test4(void)
74*65428312SEduard Zingerman {
75*65428312SEduard Zingerman 	asm volatile ("					\
76*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
77*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
78*65428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data]);		\
79*65428312SEduard Zingerman 	r0 = r4;					\
80*65428312SEduard Zingerman 	r0 += 8;					\
81*65428312SEduard Zingerman 	if r0 > r3 goto l0_%=;				\
82*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
83*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
84*65428312SEduard Zingerman 	exit;						\
85*65428312SEduard Zingerman "	:
86*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
87*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
88*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
89*65428312SEduard Zingerman 	: __clobber_all);
90*65428312SEduard Zingerman }
91*65428312SEduard Zingerman 
92*65428312SEduard Zingerman SEC("xdp")
93*65428312SEduard Zingerman __description("meta access, test5")
94*65428312SEduard Zingerman __failure __msg("R3 !read_ok")
meta_access_test5(void)95*65428312SEduard Zingerman __naked void meta_access_test5(void)
96*65428312SEduard Zingerman {
97*65428312SEduard Zingerman 	asm volatile ("					\
98*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
99*65428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data]);		\
100*65428312SEduard Zingerman 	r0 = r3;					\
101*65428312SEduard Zingerman 	r0 += 8;					\
102*65428312SEduard Zingerman 	if r0 > r4 goto l0_%=;				\
103*65428312SEduard Zingerman 	r2 = -8;					\
104*65428312SEduard Zingerman 	call %[bpf_xdp_adjust_meta];			\
105*65428312SEduard Zingerman 	r0 = *(u8*)(r3 + 0);				\
106*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
107*65428312SEduard Zingerman 	exit;						\
108*65428312SEduard Zingerman "	:
109*65428312SEduard Zingerman 	: __imm(bpf_xdp_adjust_meta),
110*65428312SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
111*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
112*65428312SEduard Zingerman 	: __clobber_all);
113*65428312SEduard Zingerman }
114*65428312SEduard Zingerman 
115*65428312SEduard Zingerman SEC("xdp")
116*65428312SEduard Zingerman __description("meta access, test6")
117*65428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test6(void)118*65428312SEduard Zingerman __naked void meta_access_test6(void)
119*65428312SEduard Zingerman {
120*65428312SEduard Zingerman 	asm volatile ("					\
121*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
122*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
123*65428312SEduard Zingerman 	r0 = r3;					\
124*65428312SEduard Zingerman 	r0 += 8;					\
125*65428312SEduard Zingerman 	r4 = r2;					\
126*65428312SEduard Zingerman 	r4 += 8;					\
127*65428312SEduard Zingerman 	if r4 > r0 goto l0_%=;				\
128*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
129*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
130*65428312SEduard Zingerman 	exit;						\
131*65428312SEduard Zingerman "	:
132*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
133*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
134*65428312SEduard Zingerman 	: __clobber_all);
135*65428312SEduard Zingerman }
136*65428312SEduard Zingerman 
137*65428312SEduard Zingerman SEC("xdp")
138*65428312SEduard Zingerman __description("meta access, test7")
139*65428312SEduard Zingerman __success __retval(0)
meta_access_test7(void)140*65428312SEduard Zingerman __naked void meta_access_test7(void)
141*65428312SEduard Zingerman {
142*65428312SEduard Zingerman 	asm volatile ("					\
143*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
144*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
145*65428312SEduard Zingerman 	r0 = r3;					\
146*65428312SEduard Zingerman 	r0 += 8;					\
147*65428312SEduard Zingerman 	r4 = r2;					\
148*65428312SEduard Zingerman 	r4 += 8;					\
149*65428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
150*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
151*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
152*65428312SEduard Zingerman 	exit;						\
153*65428312SEduard Zingerman "	:
154*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
155*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
156*65428312SEduard Zingerman 	: __clobber_all);
157*65428312SEduard Zingerman }
158*65428312SEduard Zingerman 
159*65428312SEduard Zingerman SEC("xdp")
160*65428312SEduard Zingerman __description("meta access, test8")
161*65428312SEduard Zingerman __success __retval(0)
meta_access_test8(void)162*65428312SEduard Zingerman __naked void meta_access_test8(void)
163*65428312SEduard Zingerman {
164*65428312SEduard Zingerman 	asm volatile ("					\
165*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
166*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
167*65428312SEduard Zingerman 	r4 = r2;					\
168*65428312SEduard Zingerman 	r4 += 0xFFFF;					\
169*65428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
170*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
171*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
172*65428312SEduard Zingerman 	exit;						\
173*65428312SEduard Zingerman "	:
174*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
175*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
176*65428312SEduard Zingerman 	: __clobber_all);
177*65428312SEduard Zingerman }
178*65428312SEduard Zingerman 
179*65428312SEduard Zingerman SEC("xdp")
180*65428312SEduard Zingerman __description("meta access, test9")
181*65428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test9(void)182*65428312SEduard Zingerman __naked void meta_access_test9(void)
183*65428312SEduard Zingerman {
184*65428312SEduard Zingerman 	asm volatile ("					\
185*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
186*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
187*65428312SEduard Zingerman 	r4 = r2;					\
188*65428312SEduard Zingerman 	r4 += 0xFFFF;					\
189*65428312SEduard Zingerman 	r4 += 1;					\
190*65428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
191*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
192*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
193*65428312SEduard Zingerman 	exit;						\
194*65428312SEduard Zingerman "	:
195*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
196*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
197*65428312SEduard Zingerman 	: __clobber_all);
198*65428312SEduard Zingerman }
199*65428312SEduard Zingerman 
200*65428312SEduard Zingerman SEC("xdp")
201*65428312SEduard Zingerman __description("meta access, test10")
202*65428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test10(void)203*65428312SEduard Zingerman __naked void meta_access_test10(void)
204*65428312SEduard Zingerman {
205*65428312SEduard Zingerman 	asm volatile ("					\
206*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
207*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
208*65428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data_end]);		\
209*65428312SEduard Zingerman 	r5 = 42;					\
210*65428312SEduard Zingerman 	r6 = 24;					\
211*65428312SEduard Zingerman 	*(u64*)(r10 - 8) = r5;				\
212*65428312SEduard Zingerman 	lock *(u64 *)(r10 - 8) += r6;			\
213*65428312SEduard Zingerman 	r5 = *(u64*)(r10 - 8);				\
214*65428312SEduard Zingerman 	if r5 > 100 goto l0_%=;				\
215*65428312SEduard Zingerman 	r3 += r5;					\
216*65428312SEduard Zingerman 	r5 = r3;					\
217*65428312SEduard Zingerman 	r6 = r2;					\
218*65428312SEduard Zingerman 	r6 += 8;					\
219*65428312SEduard Zingerman 	if r6 > r5 goto l0_%=;				\
220*65428312SEduard Zingerman 	r2 = *(u8*)(r2 + 0);				\
221*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
222*65428312SEduard Zingerman 	exit;						\
223*65428312SEduard Zingerman "	:
224*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
225*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
226*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
227*65428312SEduard Zingerman 	: __clobber_all);
228*65428312SEduard Zingerman }
229*65428312SEduard Zingerman 
230*65428312SEduard Zingerman SEC("xdp")
231*65428312SEduard Zingerman __description("meta access, test11")
232*65428312SEduard Zingerman __success __retval(0)
meta_access_test11(void)233*65428312SEduard Zingerman __naked void meta_access_test11(void)
234*65428312SEduard Zingerman {
235*65428312SEduard Zingerman 	asm volatile ("					\
236*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
237*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
238*65428312SEduard Zingerman 	r5 = 42;					\
239*65428312SEduard Zingerman 	r6 = 24;					\
240*65428312SEduard Zingerman 	*(u64*)(r10 - 8) = r5;				\
241*65428312SEduard Zingerman 	lock *(u64 *)(r10 - 8) += r6;			\
242*65428312SEduard Zingerman 	r5 = *(u64*)(r10 - 8);				\
243*65428312SEduard Zingerman 	if r5 > 100 goto l0_%=;				\
244*65428312SEduard Zingerman 	r2 += r5;					\
245*65428312SEduard Zingerman 	r5 = r2;					\
246*65428312SEduard Zingerman 	r6 = r2;					\
247*65428312SEduard Zingerman 	r6 += 8;					\
248*65428312SEduard Zingerman 	if r6 > r3 goto l0_%=;				\
249*65428312SEduard Zingerman 	r5 = *(u8*)(r5 + 0);				\
250*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
251*65428312SEduard Zingerman 	exit;						\
252*65428312SEduard Zingerman "	:
253*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
254*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
255*65428312SEduard Zingerman 	: __clobber_all);
256*65428312SEduard Zingerman }
257*65428312SEduard Zingerman 
258*65428312SEduard Zingerman SEC("xdp")
259*65428312SEduard Zingerman __description("meta access, test12")
260*65428312SEduard Zingerman __success __retval(0)
meta_access_test12(void)261*65428312SEduard Zingerman __naked void meta_access_test12(void)
262*65428312SEduard Zingerman {
263*65428312SEduard Zingerman 	asm volatile ("					\
264*65428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
265*65428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
266*65428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data_end]);		\
267*65428312SEduard Zingerman 	r5 = r3;					\
268*65428312SEduard Zingerman 	r5 += 16;					\
269*65428312SEduard Zingerman 	if r5 > r4 goto l0_%=;				\
270*65428312SEduard Zingerman 	r0 = *(u8*)(r3 + 0);				\
271*65428312SEduard Zingerman 	r5 = r2;					\
272*65428312SEduard Zingerman 	r5 += 16;					\
273*65428312SEduard Zingerman 	if r5 > r3 goto l0_%=;				\
274*65428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
275*65428312SEduard Zingerman l0_%=:	r0 = 0;						\
276*65428312SEduard Zingerman 	exit;						\
277*65428312SEduard Zingerman "	:
278*65428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
279*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
280*65428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
281*65428312SEduard Zingerman 	: __clobber_all);
282*65428312SEduard Zingerman }
283*65428312SEduard Zingerman 
284*65428312SEduard Zingerman char _license[] SEC("license") = "GPL";
285