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

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