1 // SPDX-License-Identifier: GPL-2.0
2 /* Converted from tools/testing/selftests/bpf/verifier/meta_access.c */
5 #include <bpf/bpf_helpers.h>
9 __description("meta access, test1")
11 __naked void meta_access_test1(void)
14 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
15 r3 = *(u32*)(r1 + %[xdp_md_data]); \
18 if r0 > r3 goto l0_%=; \
19 r0 = *(u8*)(r2 + 0); \
23 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
24 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
29 __description("meta access, test2")
30 __failure __msg("invalid access to packet, off=-8")
31 __naked void meta_access_test2(void)
34 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
35 r3 = *(u32*)(r1 + %[xdp_md_data]); \
40 if r4 > r3 goto l0_%=; \
41 r0 = *(u8*)(r0 + 0); \
45 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
46 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
51 __description("meta access, test3")
52 __failure __msg("invalid access to packet")
53 __naked void meta_access_test3(void)
56 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
57 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
60 if r0 > r3 goto l0_%=; \
61 r0 = *(u8*)(r2 + 0); \
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))
71 __description("meta access, test4")
72 __failure __msg("invalid access to packet")
73 __naked void meta_access_test4(void)
76 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
77 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \
78 r4 = *(u32*)(r1 + %[xdp_md_data]); \
81 if r0 > r3 goto l0_%=; \
82 r0 = *(u8*)(r2 + 0); \
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))
93 __description("meta access, test5")
94 __failure __msg("R3 !read_ok")
95 __naked void meta_access_test5(void)
98 r3 = *(u32*)(r1 + %[xdp_md_data_meta]); \
99 r4 = *(u32*)(r1 + %[xdp_md_data]); \
102 if r0 > r4 goto l0_%=; \
104 call %[bpf_xdp_adjust_meta]; \
105 r0 = *(u8*)(r3 + 0); \
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))
116 __description("meta access, test6")
117 __failure __msg("invalid access to packet")
118 __naked void meta_access_test6(void)
121 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
122 r3 = *(u32*)(r1 + %[xdp_md_data]); \
127 if r4 > r0 goto l0_%=; \
128 r0 = *(u8*)(r2 + 0); \
132 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
133 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
138 __description("meta access, test7")
139 __success __retval(0)
140 __naked void meta_access_test7(void)
143 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
144 r3 = *(u32*)(r1 + %[xdp_md_data]); \
149 if r4 > r3 goto l0_%=; \
150 r0 = *(u8*)(r2 + 0); \
154 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
155 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
160 __description("meta access, test8")
161 __success __retval(0)
162 __naked void meta_access_test8(void)
165 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
166 r3 = *(u32*)(r1 + %[xdp_md_data]); \
169 if r4 > r3 goto l0_%=; \
170 r0 = *(u8*)(r2 + 0); \
174 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
175 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
180 __description("meta access, test9")
181 __failure __msg("invalid access to packet")
182 __naked void meta_access_test9(void)
185 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
186 r3 = *(u32*)(r1 + %[xdp_md_data]); \
190 if r4 > r3 goto l0_%=; \
191 r0 = *(u8*)(r2 + 0); \
195 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
196 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
201 __description("meta access, test10")
202 __failure __msg("invalid access to packet")
203 __naked void meta_access_test10(void)
206 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
207 r3 = *(u32*)(r1 + %[xdp_md_data]); \
208 r4 = *(u32*)(r1 + %[xdp_md_data_end]); \
211 *(u64*)(r10 - 8) = r5; \
212 lock *(u64 *)(r10 - 8) += r6; \
213 r5 = *(u64*)(r10 - 8); \
214 if r5 > 100 goto l0_%=; \
219 if r6 > r5 goto l0_%=; \
220 r2 = *(u8*)(r2 + 0); \
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))
231 __description("meta access, test11")
232 __success __retval(0)
233 __naked void meta_access_test11(void)
236 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
237 r3 = *(u32*)(r1 + %[xdp_md_data]); \
240 *(u64*)(r10 - 8) = r5; \
241 lock *(u64 *)(r10 - 8) += r6; \
242 r5 = *(u64*)(r10 - 8); \
243 if r5 > 100 goto l0_%=; \
248 if r6 > r3 goto l0_%=; \
249 r5 = *(u8*)(r5 + 0); \
253 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
254 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
259 __description("meta access, test12")
260 __success __retval(0)
261 __naked void meta_access_test12(void)
264 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \
265 r3 = *(u32*)(r1 + %[xdp_md_data]); \
266 r4 = *(u32*)(r1 + %[xdp_md_data_end]); \
269 if r5 > r4 goto l0_%=; \
270 r0 = *(u8*)(r3 + 0); \
273 if r5 > r3 goto l0_%=; \
274 r0 = *(u8*)(r2 + 0); \
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))
284 char _license[] SEC("license") = "GPL";