xref: /linux/tools/testing/selftests/bpf/progs/verifier_masking.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1ade3f08fSEduard Zingerman // SPDX-License-Identifier: GPL-2.0
2ade3f08fSEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/masking.c */
3ade3f08fSEduard Zingerman 
4ade3f08fSEduard Zingerman #include <linux/bpf.h>
5ade3f08fSEduard Zingerman #include <bpf/bpf_helpers.h>
6ade3f08fSEduard Zingerman #include "bpf_misc.h"
7ade3f08fSEduard Zingerman 
8ade3f08fSEduard Zingerman SEC("socket")
9ade3f08fSEduard Zingerman __description("masking, test out of bounds 1")
10ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_1(void)11ade3f08fSEduard Zingerman __naked void test_out_of_bounds_1(void)
12ade3f08fSEduard Zingerman {
13ade3f08fSEduard Zingerman 	asm volatile ("					\
14ade3f08fSEduard Zingerman 	w1 = 5;						\
15ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
16ade3f08fSEduard Zingerman 	r2 -= r1;					\
17ade3f08fSEduard Zingerman 	r2 |= r1;					\
18ade3f08fSEduard Zingerman 	r2 = -r2;					\
19ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
20ade3f08fSEduard Zingerman 	r1 &= r2;					\
21ade3f08fSEduard Zingerman 	r0 = r1;					\
22ade3f08fSEduard Zingerman 	exit;						\
23ade3f08fSEduard Zingerman "	:
24ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 5 - 1)
25ade3f08fSEduard Zingerman 	: __clobber_all);
26ade3f08fSEduard Zingerman }
27ade3f08fSEduard Zingerman 
28ade3f08fSEduard Zingerman SEC("socket")
29ade3f08fSEduard Zingerman __description("masking, test out of bounds 2")
30ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_2(void)31ade3f08fSEduard Zingerman __naked void test_out_of_bounds_2(void)
32ade3f08fSEduard Zingerman {
33ade3f08fSEduard Zingerman 	asm volatile ("					\
34ade3f08fSEduard Zingerman 	w1 = 1;						\
35ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
36ade3f08fSEduard Zingerman 	r2 -= r1;					\
37ade3f08fSEduard Zingerman 	r2 |= r1;					\
38ade3f08fSEduard Zingerman 	r2 = -r2;					\
39ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
40ade3f08fSEduard Zingerman 	r1 &= r2;					\
41ade3f08fSEduard Zingerman 	r0 = r1;					\
42ade3f08fSEduard Zingerman 	exit;						\
43ade3f08fSEduard Zingerman "	:
44ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
45ade3f08fSEduard Zingerman 	: __clobber_all);
46ade3f08fSEduard Zingerman }
47ade3f08fSEduard Zingerman 
48ade3f08fSEduard Zingerman SEC("socket")
49ade3f08fSEduard Zingerman __description("masking, test out of bounds 3")
50ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_3(void)51ade3f08fSEduard Zingerman __naked void test_out_of_bounds_3(void)
52ade3f08fSEduard Zingerman {
53ade3f08fSEduard Zingerman 	asm volatile ("					\
54ade3f08fSEduard Zingerman 	w1 = 0xffffffff;				\
55ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
56ade3f08fSEduard Zingerman 	r2 -= r1;					\
57ade3f08fSEduard Zingerman 	r2 |= r1;					\
58ade3f08fSEduard Zingerman 	r2 = -r2;					\
59ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
60ade3f08fSEduard Zingerman 	r1 &= r2;					\
61ade3f08fSEduard Zingerman 	r0 = r1;					\
62ade3f08fSEduard Zingerman 	exit;						\
63ade3f08fSEduard Zingerman "	:
64ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xffffffff - 1)
65ade3f08fSEduard Zingerman 	: __clobber_all);
66ade3f08fSEduard Zingerman }
67ade3f08fSEduard Zingerman 
68ade3f08fSEduard Zingerman SEC("socket")
69ade3f08fSEduard Zingerman __description("masking, test out of bounds 4")
70ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_4(void)71ade3f08fSEduard Zingerman __naked void test_out_of_bounds_4(void)
72ade3f08fSEduard Zingerman {
73ade3f08fSEduard Zingerman 	asm volatile ("					\
74ade3f08fSEduard Zingerman 	w1 = 0xffffffff;				\
75ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
76ade3f08fSEduard Zingerman 	r2 -= r1;					\
77ade3f08fSEduard Zingerman 	r2 |= r1;					\
78ade3f08fSEduard Zingerman 	r2 = -r2;					\
79ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
80ade3f08fSEduard Zingerman 	r1 &= r2;					\
81ade3f08fSEduard Zingerman 	r0 = r1;					\
82ade3f08fSEduard Zingerman 	exit;						\
83ade3f08fSEduard Zingerman "	:
84ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
85ade3f08fSEduard Zingerman 	: __clobber_all);
86ade3f08fSEduard Zingerman }
87ade3f08fSEduard Zingerman 
88ade3f08fSEduard Zingerman SEC("socket")
89ade3f08fSEduard Zingerman __description("masking, test out of bounds 5")
90ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_5(void)91ade3f08fSEduard Zingerman __naked void test_out_of_bounds_5(void)
92ade3f08fSEduard Zingerman {
93ade3f08fSEduard Zingerman 	asm volatile ("					\
94ade3f08fSEduard Zingerman 	w1 = -1;					\
95ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
96ade3f08fSEduard Zingerman 	r2 -= r1;					\
97ade3f08fSEduard Zingerman 	r2 |= r1;					\
98ade3f08fSEduard Zingerman 	r2 = -r2;					\
99ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
100ade3f08fSEduard Zingerman 	r1 &= r2;					\
101ade3f08fSEduard Zingerman 	r0 = r1;					\
102ade3f08fSEduard Zingerman 	exit;						\
103ade3f08fSEduard Zingerman "	:
104ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
105ade3f08fSEduard Zingerman 	: __clobber_all);
106ade3f08fSEduard Zingerman }
107ade3f08fSEduard Zingerman 
108ade3f08fSEduard Zingerman SEC("socket")
109ade3f08fSEduard Zingerman __description("masking, test out of bounds 6")
110ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_6(void)111ade3f08fSEduard Zingerman __naked void test_out_of_bounds_6(void)
112ade3f08fSEduard Zingerman {
113ade3f08fSEduard Zingerman 	asm volatile ("					\
114ade3f08fSEduard Zingerman 	w1 = -1;					\
115ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
116ade3f08fSEduard Zingerman 	r2 -= r1;					\
117ade3f08fSEduard Zingerman 	r2 |= r1;					\
118ade3f08fSEduard Zingerman 	r2 = -r2;					\
119ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
120ade3f08fSEduard Zingerman 	r1 &= r2;					\
121ade3f08fSEduard Zingerman 	r0 = r1;					\
122ade3f08fSEduard Zingerman 	exit;						\
123ade3f08fSEduard Zingerman "	:
124ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xffffffff - 1)
125ade3f08fSEduard Zingerman 	: __clobber_all);
126ade3f08fSEduard Zingerman }
127ade3f08fSEduard Zingerman 
128ade3f08fSEduard Zingerman SEC("socket")
129ade3f08fSEduard Zingerman __description("masking, test out of bounds 7")
130ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_7(void)131ade3f08fSEduard Zingerman __naked void test_out_of_bounds_7(void)
132ade3f08fSEduard Zingerman {
133ade3f08fSEduard Zingerman 	asm volatile ("					\
134ade3f08fSEduard Zingerman 	r1 = 5;						\
135ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
136ade3f08fSEduard Zingerman 	r2 -= r1;					\
137ade3f08fSEduard Zingerman 	r2 |= r1;					\
138ade3f08fSEduard Zingerman 	r2 = -r2;					\
139ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
140ade3f08fSEduard Zingerman 	r1 &= r2;					\
141ade3f08fSEduard Zingerman 	r0 = r1;					\
142ade3f08fSEduard Zingerman 	exit;						\
143ade3f08fSEduard Zingerman "	:
144ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 5 - 1)
145ade3f08fSEduard Zingerman 	: __clobber_all);
146ade3f08fSEduard Zingerman }
147ade3f08fSEduard Zingerman 
148ade3f08fSEduard Zingerman SEC("socket")
149ade3f08fSEduard Zingerman __description("masking, test out of bounds 8")
150ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_8(void)151ade3f08fSEduard Zingerman __naked void test_out_of_bounds_8(void)
152ade3f08fSEduard Zingerman {
153ade3f08fSEduard Zingerman 	asm volatile ("					\
154ade3f08fSEduard Zingerman 	r1 = 1;						\
155ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
156ade3f08fSEduard Zingerman 	r2 -= r1;					\
157ade3f08fSEduard Zingerman 	r2 |= r1;					\
158ade3f08fSEduard Zingerman 	r2 = -r2;					\
159ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
160ade3f08fSEduard Zingerman 	r1 &= r2;					\
161ade3f08fSEduard Zingerman 	r0 = r1;					\
162ade3f08fSEduard Zingerman 	exit;						\
163ade3f08fSEduard Zingerman "	:
164ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
165ade3f08fSEduard Zingerman 	: __clobber_all);
166ade3f08fSEduard Zingerman }
167ade3f08fSEduard Zingerman 
168ade3f08fSEduard Zingerman SEC("socket")
169ade3f08fSEduard Zingerman __description("masking, test out of bounds 9")
170ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_9(void)171ade3f08fSEduard Zingerman __naked void test_out_of_bounds_9(void)
172ade3f08fSEduard Zingerman {
173ade3f08fSEduard Zingerman 	asm volatile ("					\
174ade3f08fSEduard Zingerman 	r1 = 0xffffffff;				\
175ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
176ade3f08fSEduard Zingerman 	r2 -= r1;					\
177ade3f08fSEduard Zingerman 	r2 |= r1;					\
178ade3f08fSEduard Zingerman 	r2 = -r2;					\
179ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
180ade3f08fSEduard Zingerman 	r1 &= r2;					\
181ade3f08fSEduard Zingerman 	r0 = r1;					\
182ade3f08fSEduard Zingerman 	exit;						\
183ade3f08fSEduard Zingerman "	:
184ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xffffffff - 1)
185ade3f08fSEduard Zingerman 	: __clobber_all);
186ade3f08fSEduard Zingerman }
187ade3f08fSEduard Zingerman 
188ade3f08fSEduard Zingerman SEC("socket")
189ade3f08fSEduard Zingerman __description("masking, test out of bounds 10")
190ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_10(void)191ade3f08fSEduard Zingerman __naked void test_out_of_bounds_10(void)
192ade3f08fSEduard Zingerman {
193ade3f08fSEduard Zingerman 	asm volatile ("					\
194ade3f08fSEduard Zingerman 	r1 = 0xffffffff;				\
195ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
196ade3f08fSEduard Zingerman 	r2 -= r1;					\
197ade3f08fSEduard Zingerman 	r2 |= r1;					\
198ade3f08fSEduard Zingerman 	r2 = -r2;					\
199ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
200ade3f08fSEduard Zingerman 	r1 &= r2;					\
201ade3f08fSEduard Zingerman 	r0 = r1;					\
202ade3f08fSEduard Zingerman 	exit;						\
203ade3f08fSEduard Zingerman "	:
204ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
205ade3f08fSEduard Zingerman 	: __clobber_all);
206ade3f08fSEduard Zingerman }
207ade3f08fSEduard Zingerman 
208ade3f08fSEduard Zingerman SEC("socket")
209ade3f08fSEduard Zingerman __description("masking, test out of bounds 11")
210ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_11(void)211ade3f08fSEduard Zingerman __naked void test_out_of_bounds_11(void)
212ade3f08fSEduard Zingerman {
213ade3f08fSEduard Zingerman 	asm volatile ("					\
214ade3f08fSEduard Zingerman 	r1 = -1;					\
215ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
216ade3f08fSEduard Zingerman 	r2 -= r1;					\
217ade3f08fSEduard Zingerman 	r2 |= r1;					\
218ade3f08fSEduard Zingerman 	r2 = -r2;					\
219ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
220ade3f08fSEduard Zingerman 	r1 &= r2;					\
221ade3f08fSEduard Zingerman 	r0 = r1;					\
222ade3f08fSEduard Zingerman 	exit;						\
223ade3f08fSEduard Zingerman "	:
224ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
225ade3f08fSEduard Zingerman 	: __clobber_all);
226ade3f08fSEduard Zingerman }
227ade3f08fSEduard Zingerman 
228ade3f08fSEduard Zingerman SEC("socket")
229ade3f08fSEduard Zingerman __description("masking, test out of bounds 12")
230ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
test_out_of_bounds_12(void)231ade3f08fSEduard Zingerman __naked void test_out_of_bounds_12(void)
232ade3f08fSEduard Zingerman {
233ade3f08fSEduard Zingerman 	asm volatile ("					\
234ade3f08fSEduard Zingerman 	r1 = -1;					\
235ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
236ade3f08fSEduard Zingerman 	r2 -= r1;					\
237ade3f08fSEduard Zingerman 	r2 |= r1;					\
238ade3f08fSEduard Zingerman 	r2 = -r2;					\
239ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
240ade3f08fSEduard Zingerman 	r1 &= r2;					\
241ade3f08fSEduard Zingerman 	r0 = r1;					\
242ade3f08fSEduard Zingerman 	exit;						\
243ade3f08fSEduard Zingerman "	:
244ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xffffffff - 1)
245ade3f08fSEduard Zingerman 	: __clobber_all);
246ade3f08fSEduard Zingerman }
247ade3f08fSEduard Zingerman 
248ade3f08fSEduard Zingerman SEC("socket")
249ade3f08fSEduard Zingerman __description("masking, test in bounds 1")
250ade3f08fSEduard Zingerman __success __success_unpriv __retval(4)
masking_test_in_bounds_1(void)251ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_1(void)
252ade3f08fSEduard Zingerman {
253ade3f08fSEduard Zingerman 	asm volatile ("					\
254ade3f08fSEduard Zingerman 	w1 = 4;						\
255ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
256ade3f08fSEduard Zingerman 	r2 -= r1;					\
257ade3f08fSEduard Zingerman 	r2 |= r1;					\
258ade3f08fSEduard Zingerman 	r2 = -r2;					\
259ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
260ade3f08fSEduard Zingerman 	r1 &= r2;					\
261ade3f08fSEduard Zingerman 	r0 = r1;					\
262ade3f08fSEduard Zingerman 	exit;						\
263ade3f08fSEduard Zingerman "	:
264ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 5 - 1)
265ade3f08fSEduard Zingerman 	: __clobber_all);
266ade3f08fSEduard Zingerman }
267ade3f08fSEduard Zingerman 
268ade3f08fSEduard Zingerman SEC("socket")
269ade3f08fSEduard Zingerman __description("masking, test in bounds 2")
270ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
masking_test_in_bounds_2(void)271ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_2(void)
272ade3f08fSEduard Zingerman {
273ade3f08fSEduard Zingerman 	asm volatile ("					\
274ade3f08fSEduard Zingerman 	w1 = 0;						\
275ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
276ade3f08fSEduard Zingerman 	r2 -= r1;					\
277ade3f08fSEduard Zingerman 	r2 |= r1;					\
278ade3f08fSEduard Zingerman 	r2 = -r2;					\
279ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
280ade3f08fSEduard Zingerman 	r1 &= r2;					\
281ade3f08fSEduard Zingerman 	r0 = r1;					\
282ade3f08fSEduard Zingerman 	exit;						\
283ade3f08fSEduard Zingerman "	:
284ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xffffffff - 1)
285ade3f08fSEduard Zingerman 	: __clobber_all);
286ade3f08fSEduard Zingerman }
287ade3f08fSEduard Zingerman 
288ade3f08fSEduard Zingerman SEC("socket")
289ade3f08fSEduard Zingerman __description("masking, test in bounds 3")
290ade3f08fSEduard Zingerman __success __success_unpriv __retval(0xfffffffe)
masking_test_in_bounds_3(void)291ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_3(void)
292ade3f08fSEduard Zingerman {
293ade3f08fSEduard Zingerman 	asm volatile ("					\
294ade3f08fSEduard Zingerman 	w1 = 0xfffffffe;				\
295ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
296ade3f08fSEduard Zingerman 	r2 -= r1;					\
297ade3f08fSEduard Zingerman 	r2 |= r1;					\
298ade3f08fSEduard Zingerman 	r2 = -r2;					\
299ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
300ade3f08fSEduard Zingerman 	r1 &= r2;					\
301ade3f08fSEduard Zingerman 	r0 = r1;					\
302ade3f08fSEduard Zingerman 	exit;						\
303ade3f08fSEduard Zingerman "	:
304ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xffffffff - 1)
305ade3f08fSEduard Zingerman 	: __clobber_all);
306ade3f08fSEduard Zingerman }
307ade3f08fSEduard Zingerman 
308ade3f08fSEduard Zingerman SEC("socket")
309ade3f08fSEduard Zingerman __description("masking, test in bounds 4")
310ade3f08fSEduard Zingerman __success __success_unpriv __retval(0xabcde)
masking_test_in_bounds_4(void)311ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_4(void)
312ade3f08fSEduard Zingerman {
313ade3f08fSEduard Zingerman 	asm volatile ("					\
314ade3f08fSEduard Zingerman 	w1 = 0xabcde;					\
315ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
316ade3f08fSEduard Zingerman 	r2 -= r1;					\
317ade3f08fSEduard Zingerman 	r2 |= r1;					\
318ade3f08fSEduard Zingerman 	r2 = -r2;					\
319ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
320ade3f08fSEduard Zingerman 	r1 &= r2;					\
321ade3f08fSEduard Zingerman 	r0 = r1;					\
322ade3f08fSEduard Zingerman 	exit;						\
323ade3f08fSEduard Zingerman "	:
324ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 0xabcdef - 1)
325ade3f08fSEduard Zingerman 	: __clobber_all);
326ade3f08fSEduard Zingerman }
327ade3f08fSEduard Zingerman 
328ade3f08fSEduard Zingerman SEC("socket")
329ade3f08fSEduard Zingerman __description("masking, test in bounds 5")
330ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
masking_test_in_bounds_5(void)331ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_5(void)
332ade3f08fSEduard Zingerman {
333ade3f08fSEduard Zingerman 	asm volatile ("					\
334ade3f08fSEduard Zingerman 	w1 = 0;						\
335ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
336ade3f08fSEduard Zingerman 	r2 -= r1;					\
337ade3f08fSEduard Zingerman 	r2 |= r1;					\
338ade3f08fSEduard Zingerman 	r2 = -r2;					\
339ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
340ade3f08fSEduard Zingerman 	r1 &= r2;					\
341ade3f08fSEduard Zingerman 	r0 = r1;					\
342ade3f08fSEduard Zingerman 	exit;						\
343ade3f08fSEduard Zingerman "	:
344ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 1 - 1)
345ade3f08fSEduard Zingerman 	: __clobber_all);
346ade3f08fSEduard Zingerman }
347ade3f08fSEduard Zingerman 
348ade3f08fSEduard Zingerman SEC("socket")
349ade3f08fSEduard Zingerman __description("masking, test in bounds 6")
350ade3f08fSEduard Zingerman __success __success_unpriv __retval(46)
masking_test_in_bounds_6(void)351ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_6(void)
352ade3f08fSEduard Zingerman {
353ade3f08fSEduard Zingerman 	asm volatile ("					\
354ade3f08fSEduard Zingerman 	w1 = 46;					\
355ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
356ade3f08fSEduard Zingerman 	r2 -= r1;					\
357ade3f08fSEduard Zingerman 	r2 |= r1;					\
358ade3f08fSEduard Zingerman 	r2 = -r2;					\
359ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
360ade3f08fSEduard Zingerman 	r1 &= r2;					\
361ade3f08fSEduard Zingerman 	r0 = r1;					\
362ade3f08fSEduard Zingerman 	exit;						\
363ade3f08fSEduard Zingerman "	:
364ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 47 - 1)
365ade3f08fSEduard Zingerman 	: __clobber_all);
366ade3f08fSEduard Zingerman }
367ade3f08fSEduard Zingerman 
368ade3f08fSEduard Zingerman SEC("socket")
369ade3f08fSEduard Zingerman __description("masking, test in bounds 7")
370ade3f08fSEduard Zingerman __success __success_unpriv __retval(46)
masking_test_in_bounds_7(void)371ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_7(void)
372ade3f08fSEduard Zingerman {
373ade3f08fSEduard Zingerman 	asm volatile ("					\
374ade3f08fSEduard Zingerman 	r3 = -46;					\
375ade3f08fSEduard Zingerman 	r3 *= -1;					\
376ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
377ade3f08fSEduard Zingerman 	r2 -= r3;					\
378ade3f08fSEduard Zingerman 	r2 |= r3;					\
379ade3f08fSEduard Zingerman 	r2 = -r2;					\
380ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
381ade3f08fSEduard Zingerman 	r3 &= r2;					\
382ade3f08fSEduard Zingerman 	r0 = r3;					\
383ade3f08fSEduard Zingerman 	exit;						\
384ade3f08fSEduard Zingerman "	:
385ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 47 - 1)
386ade3f08fSEduard Zingerman 	: __clobber_all);
387ade3f08fSEduard Zingerman }
388ade3f08fSEduard Zingerman 
389ade3f08fSEduard Zingerman SEC("socket")
390ade3f08fSEduard Zingerman __description("masking, test in bounds 8")
391ade3f08fSEduard Zingerman __success __success_unpriv __retval(0)
masking_test_in_bounds_8(void)392ade3f08fSEduard Zingerman __naked void masking_test_in_bounds_8(void)
393ade3f08fSEduard Zingerman {
394ade3f08fSEduard Zingerman 	asm volatile ("					\
395ade3f08fSEduard Zingerman 	r3 = -47;					\
396ade3f08fSEduard Zingerman 	r3 *= -1;					\
397ade3f08fSEduard Zingerman 	w2 = %[__imm_0];				\
398ade3f08fSEduard Zingerman 	r2 -= r3;					\
399ade3f08fSEduard Zingerman 	r2 |= r3;					\
400ade3f08fSEduard Zingerman 	r2 = -r2;					\
401ade3f08fSEduard Zingerman 	r2 s>>= 63;					\
402ade3f08fSEduard Zingerman 	r3 &= r2;					\
403ade3f08fSEduard Zingerman 	r0 = r3;					\
404ade3f08fSEduard Zingerman 	exit;						\
405ade3f08fSEduard Zingerman "	:
406ade3f08fSEduard Zingerman 	: __imm_const(__imm_0, 47 - 1)
407ade3f08fSEduard Zingerman 	: __clobber_all);
408ade3f08fSEduard Zingerman }
409ade3f08fSEduard Zingerman 
410ade3f08fSEduard Zingerman char _license[] SEC("license") = "GPL";
411