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