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