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