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