Linux Audio

Check our new training course

Loading...
v6.13.7
  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";
v6.8
  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";