xref: /linux/tools/testing/selftests/bpf/progs/verifier_helper_packet_access.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1fb179fe6SEduard Zingerman // SPDX-License-Identifier: GPL-2.0
2fb179fe6SEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/helper_packet_access.c */
3fb179fe6SEduard Zingerman 
4fb179fe6SEduard Zingerman #include <linux/bpf.h>
5fb179fe6SEduard Zingerman #include <bpf/bpf_helpers.h>
6fb179fe6SEduard Zingerman #include "bpf_misc.h"
7fb179fe6SEduard Zingerman 
8fb179fe6SEduard Zingerman struct {
9fb179fe6SEduard Zingerman 	__uint(type, BPF_MAP_TYPE_HASH);
10fb179fe6SEduard Zingerman 	__uint(max_entries, 1);
11fb179fe6SEduard Zingerman 	__type(key, long long);
12fb179fe6SEduard Zingerman 	__type(value, long long);
13fb179fe6SEduard Zingerman } map_hash_8b SEC(".maps");
14fb179fe6SEduard Zingerman 
15fb179fe6SEduard Zingerman SEC("xdp")
16fb179fe6SEduard Zingerman __description("helper access to packet: test1, valid packet_ptr range")
17fb179fe6SEduard Zingerman __success __retval(0)
test1_valid_packet_ptr_range(void)18fb179fe6SEduard Zingerman __naked void test1_valid_packet_ptr_range(void)
19fb179fe6SEduard Zingerman {
20fb179fe6SEduard Zingerman 	asm volatile ("					\
21fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data]);		\
22fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
23fb179fe6SEduard Zingerman 	r1 = r2;					\
24fb179fe6SEduard Zingerman 	r1 += 8;					\
25fb179fe6SEduard Zingerman 	if r1 > r3 goto l0_%=;				\
26fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
27fb179fe6SEduard Zingerman 	r3 = r2;					\
28fb179fe6SEduard Zingerman 	r4 = 0;						\
29fb179fe6SEduard Zingerman 	call %[bpf_map_update_elem];			\
30fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
31fb179fe6SEduard Zingerman 	exit;						\
32fb179fe6SEduard Zingerman "	:
33fb179fe6SEduard Zingerman 	: __imm(bpf_map_update_elem),
34fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
35fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
36fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
37fb179fe6SEduard Zingerman 	: __clobber_all);
38fb179fe6SEduard Zingerman }
39fb179fe6SEduard Zingerman 
40fb179fe6SEduard Zingerman SEC("xdp")
41fb179fe6SEduard Zingerman __description("helper access to packet: test2, unchecked packet_ptr")
42fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
packet_test2_unchecked_packet_ptr(void)43fb179fe6SEduard Zingerman __naked void packet_test2_unchecked_packet_ptr(void)
44fb179fe6SEduard Zingerman {
45fb179fe6SEduard Zingerman 	asm volatile ("					\
46fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data]);		\
47fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
48fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
49fb179fe6SEduard Zingerman 	r0 = 0;						\
50fb179fe6SEduard Zingerman 	exit;						\
51fb179fe6SEduard Zingerman "	:
52fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
53fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
54fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data))
55fb179fe6SEduard Zingerman 	: __clobber_all);
56fb179fe6SEduard Zingerman }
57fb179fe6SEduard Zingerman 
58fb179fe6SEduard Zingerman SEC("xdp")
59fb179fe6SEduard Zingerman __description("helper access to packet: test3, variable add")
60fb179fe6SEduard Zingerman __success __retval(0)
to_packet_test3_variable_add(void)61fb179fe6SEduard Zingerman __naked void to_packet_test3_variable_add(void)
62fb179fe6SEduard Zingerman {
63fb179fe6SEduard Zingerman 	asm volatile ("					\
64fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data]);		\
65fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
66fb179fe6SEduard Zingerman 	r4 = r2;					\
67fb179fe6SEduard Zingerman 	r4 += 8;					\
68fb179fe6SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
69fb179fe6SEduard Zingerman 	r5 = *(u8*)(r2 + 0);				\
70fb179fe6SEduard Zingerman 	r4 = r2;					\
71fb179fe6SEduard Zingerman 	r4 += r5;					\
72fb179fe6SEduard Zingerman 	r5 = r4;					\
73fb179fe6SEduard Zingerman 	r5 += 8;					\
74fb179fe6SEduard Zingerman 	if r5 > r3 goto l0_%=;				\
75fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
76fb179fe6SEduard Zingerman 	r2 = r4;					\
77fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
78fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
79fb179fe6SEduard Zingerman 	exit;						\
80fb179fe6SEduard Zingerman "	:
81fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
82fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
83fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
84fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
85fb179fe6SEduard Zingerman 	: __clobber_all);
86fb179fe6SEduard Zingerman }
87fb179fe6SEduard Zingerman 
88fb179fe6SEduard Zingerman SEC("xdp")
89fb179fe6SEduard Zingerman __description("helper access to packet: test4, packet_ptr with bad range")
90fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
packet_ptr_with_bad_range_1(void)91fb179fe6SEduard Zingerman __naked void packet_ptr_with_bad_range_1(void)
92fb179fe6SEduard Zingerman {
93fb179fe6SEduard Zingerman 	asm volatile ("					\
94fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data]);		\
95fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
96fb179fe6SEduard Zingerman 	r4 = r2;					\
97fb179fe6SEduard Zingerman 	r4 += 4;					\
98fb179fe6SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
99fb179fe6SEduard Zingerman 	r0 = 0;						\
100fb179fe6SEduard Zingerman 	exit;						\
101fb179fe6SEduard Zingerman l0_%=:	r1 = %[map_hash_8b] ll;				\
102fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
103fb179fe6SEduard Zingerman 	r0 = 0;						\
104fb179fe6SEduard Zingerman 	exit;						\
105fb179fe6SEduard Zingerman "	:
106fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
107fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
108fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
109fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
110fb179fe6SEduard Zingerman 	: __clobber_all);
111fb179fe6SEduard Zingerman }
112fb179fe6SEduard Zingerman 
113fb179fe6SEduard Zingerman SEC("xdp")
114fb179fe6SEduard Zingerman __description("helper access to packet: test5, packet_ptr with too short range")
115fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
ptr_with_too_short_range_1(void)116fb179fe6SEduard Zingerman __naked void ptr_with_too_short_range_1(void)
117fb179fe6SEduard Zingerman {
118fb179fe6SEduard Zingerman 	asm volatile ("					\
119fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data]);		\
120fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
121fb179fe6SEduard Zingerman 	r2 += 1;					\
122fb179fe6SEduard Zingerman 	r4 = r2;					\
123fb179fe6SEduard Zingerman 	r4 += 7;					\
124fb179fe6SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
125fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
126fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
127fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
128fb179fe6SEduard Zingerman 	exit;						\
129fb179fe6SEduard Zingerman "	:
130fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
131fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
132fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
133fb179fe6SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))
134fb179fe6SEduard Zingerman 	: __clobber_all);
135fb179fe6SEduard Zingerman }
136fb179fe6SEduard Zingerman 
137fb179fe6SEduard Zingerman SEC("tc")
138fb179fe6SEduard Zingerman __description("helper access to packet: test6, cls valid packet_ptr range")
139fb179fe6SEduard Zingerman __success __retval(0)
cls_valid_packet_ptr_range(void)140fb179fe6SEduard Zingerman __naked void cls_valid_packet_ptr_range(void)
141fb179fe6SEduard Zingerman {
142fb179fe6SEduard Zingerman 	asm volatile ("					\
143fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[__sk_buff_data]);		\
144fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
145fb179fe6SEduard Zingerman 	r1 = r2;					\
146fb179fe6SEduard Zingerman 	r1 += 8;					\
147fb179fe6SEduard Zingerman 	if r1 > r3 goto l0_%=;				\
148fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
149fb179fe6SEduard Zingerman 	r3 = r2;					\
150fb179fe6SEduard Zingerman 	r4 = 0;						\
151fb179fe6SEduard Zingerman 	call %[bpf_map_update_elem];			\
152fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
153fb179fe6SEduard Zingerman 	exit;						\
154fb179fe6SEduard Zingerman "	:
155fb179fe6SEduard Zingerman 	: __imm(bpf_map_update_elem),
156fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
157fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
158fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
159fb179fe6SEduard Zingerman 	: __clobber_all);
160fb179fe6SEduard Zingerman }
161fb179fe6SEduard Zingerman 
162fb179fe6SEduard Zingerman SEC("tc")
163fb179fe6SEduard Zingerman __description("helper access to packet: test7, cls unchecked packet_ptr")
164fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
test7_cls_unchecked_packet_ptr(void)165fb179fe6SEduard Zingerman __naked void test7_cls_unchecked_packet_ptr(void)
166fb179fe6SEduard Zingerman {
167fb179fe6SEduard Zingerman 	asm volatile ("					\
168fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[__sk_buff_data]);		\
169fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
170fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
171fb179fe6SEduard Zingerman 	r0 = 0;						\
172fb179fe6SEduard Zingerman 	exit;						\
173fb179fe6SEduard Zingerman "	:
174fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
175fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
176fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data))
177fb179fe6SEduard Zingerman 	: __clobber_all);
178fb179fe6SEduard Zingerman }
179fb179fe6SEduard Zingerman 
180fb179fe6SEduard Zingerman SEC("tc")
181fb179fe6SEduard Zingerman __description("helper access to packet: test8, cls variable add")
182fb179fe6SEduard Zingerman __success __retval(0)
packet_test8_cls_variable_add(void)183fb179fe6SEduard Zingerman __naked void packet_test8_cls_variable_add(void)
184fb179fe6SEduard Zingerman {
185fb179fe6SEduard Zingerman 	asm volatile ("					\
186fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[__sk_buff_data]);		\
187fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
188fb179fe6SEduard Zingerman 	r4 = r2;					\
189fb179fe6SEduard Zingerman 	r4 += 8;					\
190fb179fe6SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
191fb179fe6SEduard Zingerman 	r5 = *(u8*)(r2 + 0);				\
192fb179fe6SEduard Zingerman 	r4 = r2;					\
193fb179fe6SEduard Zingerman 	r4 += r5;					\
194fb179fe6SEduard Zingerman 	r5 = r4;					\
195fb179fe6SEduard Zingerman 	r5 += 8;					\
196fb179fe6SEduard Zingerman 	if r5 > r3 goto l0_%=;				\
197fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
198fb179fe6SEduard Zingerman 	r2 = r4;					\
199fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
200fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
201fb179fe6SEduard Zingerman 	exit;						\
202fb179fe6SEduard Zingerman "	:
203fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
204fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
205fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
206fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
207fb179fe6SEduard Zingerman 	: __clobber_all);
208fb179fe6SEduard Zingerman }
209fb179fe6SEduard Zingerman 
210fb179fe6SEduard Zingerman SEC("tc")
211fb179fe6SEduard Zingerman __description("helper access to packet: test9, cls packet_ptr with bad range")
212fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
packet_ptr_with_bad_range_2(void)213fb179fe6SEduard Zingerman __naked void packet_ptr_with_bad_range_2(void)
214fb179fe6SEduard Zingerman {
215fb179fe6SEduard Zingerman 	asm volatile ("					\
216fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[__sk_buff_data]);		\
217fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
218fb179fe6SEduard Zingerman 	r4 = r2;					\
219fb179fe6SEduard Zingerman 	r4 += 4;					\
220fb179fe6SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
221fb179fe6SEduard Zingerman 	r0 = 0;						\
222fb179fe6SEduard Zingerman 	exit;						\
223fb179fe6SEduard Zingerman l0_%=:	r1 = %[map_hash_8b] ll;				\
224fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
225fb179fe6SEduard Zingerman 	r0 = 0;						\
226fb179fe6SEduard Zingerman 	exit;						\
227fb179fe6SEduard Zingerman "	:
228fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
229fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
230fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
231fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
232fb179fe6SEduard Zingerman 	: __clobber_all);
233fb179fe6SEduard Zingerman }
234fb179fe6SEduard Zingerman 
235fb179fe6SEduard Zingerman SEC("tc")
236fb179fe6SEduard Zingerman __description("helper access to packet: test10, cls packet_ptr with too short range")
237fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
ptr_with_too_short_range_2(void)238fb179fe6SEduard Zingerman __naked void ptr_with_too_short_range_2(void)
239fb179fe6SEduard Zingerman {
240fb179fe6SEduard Zingerman 	asm volatile ("					\
241fb179fe6SEduard Zingerman 	r2 = *(u32*)(r1 + %[__sk_buff_data]);		\
242fb179fe6SEduard Zingerman 	r3 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
243fb179fe6SEduard Zingerman 	r2 += 1;					\
244fb179fe6SEduard Zingerman 	r4 = r2;					\
245fb179fe6SEduard Zingerman 	r4 += 7;					\
246fb179fe6SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
247fb179fe6SEduard Zingerman 	r1 = %[map_hash_8b] ll;				\
248fb179fe6SEduard Zingerman 	call %[bpf_map_lookup_elem];			\
249fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
250fb179fe6SEduard Zingerman 	exit;						\
251fb179fe6SEduard Zingerman "	:
252fb179fe6SEduard Zingerman 	: __imm(bpf_map_lookup_elem),
253fb179fe6SEduard Zingerman 	  __imm_addr(map_hash_8b),
254fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
255fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
256fb179fe6SEduard Zingerman 	: __clobber_all);
257fb179fe6SEduard Zingerman }
258fb179fe6SEduard Zingerman 
259fb179fe6SEduard Zingerman SEC("tc")
260fb179fe6SEduard Zingerman __description("helper access to packet: test11, cls unsuitable helper 1")
261fb179fe6SEduard Zingerman __failure __msg("helper access to the packet")
test11_cls_unsuitable_helper_1(void)262fb179fe6SEduard Zingerman __naked void test11_cls_unsuitable_helper_1(void)
263fb179fe6SEduard Zingerman {
264fb179fe6SEduard Zingerman 	asm volatile ("					\
265fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
266fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
267fb179fe6SEduard Zingerman 	r6 += 1;					\
268fb179fe6SEduard Zingerman 	r3 = r6;					\
269fb179fe6SEduard Zingerman 	r3 += 7;					\
270fb179fe6SEduard Zingerman 	if r3 > r7 goto l0_%=;				\
271fb179fe6SEduard Zingerman 	r2 = 0;						\
272fb179fe6SEduard Zingerman 	r4 = 42;					\
273fb179fe6SEduard Zingerman 	r5 = 0;						\
274fb179fe6SEduard Zingerman 	call %[bpf_skb_store_bytes];			\
275fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
276fb179fe6SEduard Zingerman 	exit;						\
277fb179fe6SEduard Zingerman "	:
278fb179fe6SEduard Zingerman 	: __imm(bpf_skb_store_bytes),
279fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
280fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
281fb179fe6SEduard Zingerman 	: __clobber_all);
282fb179fe6SEduard Zingerman }
283fb179fe6SEduard Zingerman 
284fb179fe6SEduard Zingerman SEC("tc")
285fb179fe6SEduard Zingerman __description("helper access to packet: test12, cls unsuitable helper 2")
286fb179fe6SEduard Zingerman __failure __msg("helper access to the packet")
test12_cls_unsuitable_helper_2(void)287fb179fe6SEduard Zingerman __naked void test12_cls_unsuitable_helper_2(void)
288fb179fe6SEduard Zingerman {
289fb179fe6SEduard Zingerman 	asm volatile ("					\
290fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
291fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
292fb179fe6SEduard Zingerman 	r3 = r6;					\
293fb179fe6SEduard Zingerman 	r6 += 8;					\
294fb179fe6SEduard Zingerman 	if r6 > r7 goto l0_%=;				\
295fb179fe6SEduard Zingerman 	r2 = 0;						\
296fb179fe6SEduard Zingerman 	r4 = 4;						\
297fb179fe6SEduard Zingerman 	call %[bpf_skb_load_bytes];			\
298fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
299fb179fe6SEduard Zingerman 	exit;						\
300fb179fe6SEduard Zingerman "	:
301fb179fe6SEduard Zingerman 	: __imm(bpf_skb_load_bytes),
302fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
303fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
304fb179fe6SEduard Zingerman 	: __clobber_all);
305fb179fe6SEduard Zingerman }
306fb179fe6SEduard Zingerman 
307fb179fe6SEduard Zingerman SEC("tc")
308fb179fe6SEduard Zingerman __description("helper access to packet: test13, cls helper ok")
309fb179fe6SEduard Zingerman __success __retval(0)
packet_test13_cls_helper_ok(void)310fb179fe6SEduard Zingerman __naked void packet_test13_cls_helper_ok(void)
311fb179fe6SEduard Zingerman {
312fb179fe6SEduard Zingerman 	asm volatile ("					\
313fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
314fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
315fb179fe6SEduard Zingerman 	r6 += 1;					\
316fb179fe6SEduard Zingerman 	r1 = r6;					\
317fb179fe6SEduard Zingerman 	r1 += 7;					\
318fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
319fb179fe6SEduard Zingerman 	r1 = r6;					\
320fb179fe6SEduard Zingerman 	r2 = 4;						\
321fb179fe6SEduard Zingerman 	r3 = 0;						\
322fb179fe6SEduard Zingerman 	r4 = 0;						\
323fb179fe6SEduard Zingerman 	r5 = 0;						\
324fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
325fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
326fb179fe6SEduard Zingerman 	exit;						\
327fb179fe6SEduard Zingerman "	:
328fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
329fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
330fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
331fb179fe6SEduard Zingerman 	: __clobber_all);
332fb179fe6SEduard Zingerman }
333fb179fe6SEduard Zingerman 
334fb179fe6SEduard Zingerman SEC("tc")
335fb179fe6SEduard Zingerman __description("helper access to packet: test14, cls helper ok sub")
336fb179fe6SEduard Zingerman __success __retval(0)
test14_cls_helper_ok_sub(void)337fb179fe6SEduard Zingerman __naked void test14_cls_helper_ok_sub(void)
338fb179fe6SEduard Zingerman {
339fb179fe6SEduard Zingerman 	asm volatile ("					\
340fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
341fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
342fb179fe6SEduard Zingerman 	r6 += 1;					\
343fb179fe6SEduard Zingerman 	r1 = r6;					\
344fb179fe6SEduard Zingerman 	r1 += 7;					\
345fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
346fb179fe6SEduard Zingerman 	r1 -= 4;					\
347fb179fe6SEduard Zingerman 	r2 = 4;						\
348fb179fe6SEduard Zingerman 	r3 = 0;						\
349fb179fe6SEduard Zingerman 	r4 = 0;						\
350fb179fe6SEduard Zingerman 	r5 = 0;						\
351fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
352fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
353fb179fe6SEduard Zingerman 	exit;						\
354fb179fe6SEduard Zingerman "	:
355fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
356fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
357fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
358fb179fe6SEduard Zingerman 	: __clobber_all);
359fb179fe6SEduard Zingerman }
360fb179fe6SEduard Zingerman 
361fb179fe6SEduard Zingerman SEC("tc")
362fb179fe6SEduard Zingerman __description("helper access to packet: test15, cls helper fail sub")
363fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
test15_cls_helper_fail_sub(void)364fb179fe6SEduard Zingerman __naked void test15_cls_helper_fail_sub(void)
365fb179fe6SEduard Zingerman {
366fb179fe6SEduard Zingerman 	asm volatile ("					\
367fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
368fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
369fb179fe6SEduard Zingerman 	r6 += 1;					\
370fb179fe6SEduard Zingerman 	r1 = r6;					\
371fb179fe6SEduard Zingerman 	r1 += 7;					\
372fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
373fb179fe6SEduard Zingerman 	r1 -= 12;					\
374fb179fe6SEduard Zingerman 	r2 = 4;						\
375fb179fe6SEduard Zingerman 	r3 = 0;						\
376fb179fe6SEduard Zingerman 	r4 = 0;						\
377fb179fe6SEduard Zingerman 	r5 = 0;						\
378fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
379fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
380fb179fe6SEduard Zingerman 	exit;						\
381fb179fe6SEduard Zingerman "	:
382fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
383fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
384fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
385fb179fe6SEduard Zingerman 	: __clobber_all);
386fb179fe6SEduard Zingerman }
387fb179fe6SEduard Zingerman 
388fb179fe6SEduard Zingerman SEC("tc")
389fb179fe6SEduard Zingerman __description("helper access to packet: test16, cls helper fail range 1")
390fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
cls_helper_fail_range_1(void)391fb179fe6SEduard Zingerman __naked void cls_helper_fail_range_1(void)
392fb179fe6SEduard Zingerman {
393fb179fe6SEduard Zingerman 	asm volatile ("					\
394fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
395fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
396fb179fe6SEduard Zingerman 	r6 += 1;					\
397fb179fe6SEduard Zingerman 	r1 = r6;					\
398fb179fe6SEduard Zingerman 	r1 += 7;					\
399fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
400fb179fe6SEduard Zingerman 	r1 = r6;					\
401fb179fe6SEduard Zingerman 	r2 = 8;						\
402fb179fe6SEduard Zingerman 	r3 = 0;						\
403fb179fe6SEduard Zingerman 	r4 = 0;						\
404fb179fe6SEduard Zingerman 	r5 = 0;						\
405fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
406fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
407fb179fe6SEduard Zingerman 	exit;						\
408fb179fe6SEduard Zingerman "	:
409fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
410fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
411fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
412fb179fe6SEduard Zingerman 	: __clobber_all);
413fb179fe6SEduard Zingerman }
414fb179fe6SEduard Zingerman 
415fb179fe6SEduard Zingerman SEC("tc")
416fb179fe6SEduard Zingerman __description("helper access to packet: test17, cls helper fail range 2")
417fb179fe6SEduard Zingerman __failure __msg("R2 min value is negative")
cls_helper_fail_range_2(void)418fb179fe6SEduard Zingerman __naked void cls_helper_fail_range_2(void)
419fb179fe6SEduard Zingerman {
420fb179fe6SEduard Zingerman 	asm volatile ("					\
421fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
422fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
423fb179fe6SEduard Zingerman 	r6 += 1;					\
424fb179fe6SEduard Zingerman 	r1 = r6;					\
425fb179fe6SEduard Zingerman 	r1 += 7;					\
426fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
427fb179fe6SEduard Zingerman 	r1 = r6;					\
428fb179fe6SEduard Zingerman 	r2 = -9;					\
429fb179fe6SEduard Zingerman 	r3 = 0;						\
430fb179fe6SEduard Zingerman 	r4 = 0;						\
431fb179fe6SEduard Zingerman 	r5 = 0;						\
432fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
433fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
434fb179fe6SEduard Zingerman 	exit;						\
435fb179fe6SEduard Zingerman "	:
436fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
437fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
438fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
439fb179fe6SEduard Zingerman 	: __clobber_all);
440fb179fe6SEduard Zingerman }
441fb179fe6SEduard Zingerman 
442fb179fe6SEduard Zingerman SEC("tc")
443fb179fe6SEduard Zingerman __description("helper access to packet: test18, cls helper fail range 3")
444fb179fe6SEduard Zingerman __failure __msg("R2 min value is negative")
cls_helper_fail_range_3(void)445fb179fe6SEduard Zingerman __naked void cls_helper_fail_range_3(void)
446fb179fe6SEduard Zingerman {
447fb179fe6SEduard Zingerman 	asm volatile ("					\
448fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
449fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
450fb179fe6SEduard Zingerman 	r6 += 1;					\
451fb179fe6SEduard Zingerman 	r1 = r6;					\
452fb179fe6SEduard Zingerman 	r1 += 7;					\
453fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
454fb179fe6SEduard Zingerman 	r1 = r6;					\
455fb179fe6SEduard Zingerman 	r2 = %[__imm_0];				\
456fb179fe6SEduard Zingerman 	r3 = 0;						\
457fb179fe6SEduard Zingerman 	r4 = 0;						\
458fb179fe6SEduard Zingerman 	r5 = 0;						\
459fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
460fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
461fb179fe6SEduard Zingerman 	exit;						\
462fb179fe6SEduard Zingerman "	:
463fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
464fb179fe6SEduard Zingerman 	  __imm_const(__imm_0, ~0),
465fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
466fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
467fb179fe6SEduard Zingerman 	: __clobber_all);
468fb179fe6SEduard Zingerman }
469fb179fe6SEduard Zingerman 
470fb179fe6SEduard Zingerman SEC("tc")
471fb179fe6SEduard Zingerman __description("helper access to packet: test19, cls helper range zero")
472fb179fe6SEduard Zingerman __success __retval(0)
test19_cls_helper_range_zero(void)473fb179fe6SEduard Zingerman __naked void test19_cls_helper_range_zero(void)
474fb179fe6SEduard Zingerman {
475fb179fe6SEduard Zingerman 	asm volatile ("					\
476fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
477fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
478fb179fe6SEduard Zingerman 	r6 += 1;					\
479fb179fe6SEduard Zingerman 	r1 = r6;					\
480fb179fe6SEduard Zingerman 	r1 += 7;					\
481fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
482fb179fe6SEduard Zingerman 	r1 = r6;					\
483fb179fe6SEduard Zingerman 	r2 = 0;						\
484fb179fe6SEduard Zingerman 	r3 = 0;						\
485fb179fe6SEduard Zingerman 	r4 = 0;						\
486fb179fe6SEduard Zingerman 	r5 = 0;						\
487fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
488fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
489fb179fe6SEduard Zingerman 	exit;						\
490fb179fe6SEduard Zingerman "	:
491fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
492fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
493fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
494fb179fe6SEduard Zingerman 	: __clobber_all);
495fb179fe6SEduard Zingerman }
496fb179fe6SEduard Zingerman 
497fb179fe6SEduard Zingerman SEC("tc")
498fb179fe6SEduard Zingerman __description("helper access to packet: test20, pkt end as input")
499fb179fe6SEduard Zingerman __failure __msg("R1 type=pkt_end expected=fp")
test20_pkt_end_as_input(void)500fb179fe6SEduard Zingerman __naked void test20_pkt_end_as_input(void)
501fb179fe6SEduard Zingerman {
502fb179fe6SEduard Zingerman 	asm volatile ("					\
503fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
504fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
505fb179fe6SEduard Zingerman 	r6 += 1;					\
506fb179fe6SEduard Zingerman 	r1 = r6;					\
507fb179fe6SEduard Zingerman 	r1 += 7;					\
508fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
509fb179fe6SEduard Zingerman 	r1 = r7;					\
510fb179fe6SEduard Zingerman 	r2 = 4;						\
511fb179fe6SEduard Zingerman 	r3 = 0;						\
512fb179fe6SEduard Zingerman 	r4 = 0;						\
513fb179fe6SEduard Zingerman 	r5 = 0;						\
514fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
515fb179fe6SEduard Zingerman l0_%=:	r0 = 0;						\
516fb179fe6SEduard Zingerman 	exit;						\
517fb179fe6SEduard Zingerman "	:
518fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
519fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
520fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
521fb179fe6SEduard Zingerman 	: __clobber_all);
522fb179fe6SEduard Zingerman }
523fb179fe6SEduard Zingerman 
524fb179fe6SEduard Zingerman SEC("tc")
525fb179fe6SEduard Zingerman __description("helper access to packet: test21, wrong reg")
526fb179fe6SEduard Zingerman __failure __msg("invalid access to packet")
to_packet_test21_wrong_reg(void)527fb179fe6SEduard Zingerman __naked void to_packet_test21_wrong_reg(void)
528fb179fe6SEduard Zingerman {
529fb179fe6SEduard Zingerman 	asm volatile ("					\
530fb179fe6SEduard Zingerman 	r6 = *(u32*)(r1 + %[__sk_buff_data]);		\
531fb179fe6SEduard Zingerman 	r7 = *(u32*)(r1 + %[__sk_buff_data_end]);	\
532fb179fe6SEduard Zingerman 	r6 += 1;					\
533fb179fe6SEduard Zingerman 	r1 = r6;					\
534fb179fe6SEduard Zingerman 	r1 += 7;					\
535fb179fe6SEduard Zingerman 	if r1 > r7 goto l0_%=;				\
536fb179fe6SEduard Zingerman 	r2 = 4;						\
537fb179fe6SEduard Zingerman 	r3 = 0;						\
538fb179fe6SEduard Zingerman 	r4 = 0;						\
539fb179fe6SEduard Zingerman 	r5 = 0;						\
540fb179fe6SEduard Zingerman 	call %[bpf_csum_diff];				\
541fb179fe6SEduard Zingerman 	r0 = 0;						\
542fb179fe6SEduard Zingerman l0_%=:	exit;						\
543fb179fe6SEduard Zingerman "	:
544fb179fe6SEduard Zingerman 	: __imm(bpf_csum_diff),
545fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
546fb179fe6SEduard Zingerman 	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
547fb179fe6SEduard Zingerman 	: __clobber_all);
548fb179fe6SEduard Zingerman }
549fb179fe6SEduard Zingerman 
550fb179fe6SEduard Zingerman char _license[] SEC("license") = "GPL";
551