1aec08d67SYonghong Song // SPDX-License-Identifier: GPL-2.0
2aec08d67SYonghong Song 
3aec08d67SYonghong Song #include <linux/bpf.h>
4aec08d67SYonghong Song #include <bpf/bpf_helpers.h>
5aec08d67SYonghong Song #include "bpf_misc.h"
6aec08d67SYonghong Song 
7aec08d67SYonghong Song SEC("socket")
8aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp64, <non_const> == <const>, 1")
9aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_1(void)10aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_1(void)
11aec08d67SYonghong Song {
12aec08d67SYonghong Song 	asm volatile ("					\
13aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
14aec08d67SYonghong Song 	if r0 < 3 goto l0_%=;				\
15aec08d67SYonghong Song 	r2 = 2;						\
16aec08d67SYonghong Song 	if r0 == r2 goto l1_%=;				\
17aec08d67SYonghong Song l0_%=:							\
18aec08d67SYonghong Song 	r0 = 0;						\
19aec08d67SYonghong Song 	exit;						\
20aec08d67SYonghong Song l1_%=:							\
21aec08d67SYonghong Song 	r0 -= r1;					\
22aec08d67SYonghong Song 	exit;						\
23aec08d67SYonghong Song "	:
24aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
25aec08d67SYonghong Song 	: __clobber_all);
26aec08d67SYonghong Song }
27aec08d67SYonghong Song 
28aec08d67SYonghong Song SEC("socket")
29aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp64, <non_const> == <const>, 2")
30aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_2(void)31aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_2(void)
32aec08d67SYonghong Song {
33aec08d67SYonghong Song 	asm volatile ("					\
34aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
35aec08d67SYonghong Song 	if r0 > 3 goto l0_%=;				\
36aec08d67SYonghong Song 	r2 = 4;						\
37aec08d67SYonghong Song 	if r0 == r2 goto l1_%=;				\
38aec08d67SYonghong Song l0_%=:							\
39aec08d67SYonghong Song 	r0 = 0;						\
40aec08d67SYonghong Song 	exit;						\
41aec08d67SYonghong Song l1_%=:							\
42aec08d67SYonghong Song 	r0 -= r1;					\
43aec08d67SYonghong Song 	exit;						\
44aec08d67SYonghong Song "	:
45aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
46aec08d67SYonghong Song 	: __clobber_all);
47aec08d67SYonghong Song }
48aec08d67SYonghong Song 
49aec08d67SYonghong Song SEC("socket")
50aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp64, <non_const> != <const>, 1")
51aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_3(void)52aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_3(void)
53aec08d67SYonghong Song {
54aec08d67SYonghong Song 	asm volatile ("					\
55aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
56aec08d67SYonghong Song 	if r0 < 3 goto l0_%=;				\
57aec08d67SYonghong Song 	r2 = 2;						\
58aec08d67SYonghong Song 	if r0 != r2 goto l0_%=;				\
59aec08d67SYonghong Song 	goto l1_%=;					\
60aec08d67SYonghong Song l0_%=:							\
61aec08d67SYonghong Song 	r0 = 0;						\
62aec08d67SYonghong Song 	exit;						\
63aec08d67SYonghong Song l1_%=:							\
64aec08d67SYonghong Song 	r0 -= r1;					\
65aec08d67SYonghong Song 	exit;						\
66aec08d67SYonghong Song "	:
67aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
68aec08d67SYonghong Song 	: __clobber_all);
69aec08d67SYonghong Song }
70aec08d67SYonghong Song 
71aec08d67SYonghong Song SEC("socket")
72aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp64, <non_const> != <const>, 2")
73aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_4(void)74aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_4(void)
75aec08d67SYonghong Song {
76aec08d67SYonghong Song 	asm volatile ("					\
77aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
78aec08d67SYonghong Song 	if r0 > 3 goto l0_%=;				\
79aec08d67SYonghong Song 	r2 = 4;						\
80aec08d67SYonghong Song 	if r0 != r2 goto l0_%=;				\
81aec08d67SYonghong Song 	goto l1_%=;					\
82aec08d67SYonghong Song l0_%=:							\
83aec08d67SYonghong Song 	r0 = 0;						\
84aec08d67SYonghong Song 	exit;						\
85aec08d67SYonghong Song l1_%=:							\
86aec08d67SYonghong Song 	r0 -= r1;					\
87aec08d67SYonghong Song 	exit;						\
88aec08d67SYonghong Song "	:
89aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
90aec08d67SYonghong Song 	: __clobber_all);
91aec08d67SYonghong Song }
92aec08d67SYonghong Song 
93aec08d67SYonghong Song SEC("socket")
94aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp32, <non_const> == <const>, 1")
95aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_5(void)96aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_5(void)
97aec08d67SYonghong Song {
98aec08d67SYonghong Song 	asm volatile ("					\
99aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
100aec08d67SYonghong Song 	if w0 < 4 goto l0_%=;				\
101aec08d67SYonghong Song 	w2 = 3;						\
102aec08d67SYonghong Song 	if w0 == w2 goto l1_%=;				\
103aec08d67SYonghong Song l0_%=:							\
104aec08d67SYonghong Song 	r0 = 0;						\
105aec08d67SYonghong Song 	exit;						\
106aec08d67SYonghong Song l1_%=:							\
107aec08d67SYonghong Song 	r0 -= r1;					\
108aec08d67SYonghong Song 	exit;						\
109aec08d67SYonghong Song "	:
110aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
111aec08d67SYonghong Song 	: __clobber_all);
112aec08d67SYonghong Song }
113aec08d67SYonghong Song 
114aec08d67SYonghong Song SEC("socket")
115aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp32, <non_const> == <const>, 2")
116aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_6(void)117aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_6(void)
118aec08d67SYonghong Song {
119aec08d67SYonghong Song 	asm volatile ("					\
120aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
121aec08d67SYonghong Song 	if w0 > 4 goto l0_%=;				\
122aec08d67SYonghong Song 	w2 = 5;						\
123aec08d67SYonghong Song 	if w0 == w2 goto l1_%=;				\
124aec08d67SYonghong Song l0_%=:							\
125aec08d67SYonghong Song 	r0 = 0;						\
126aec08d67SYonghong Song 	exit;						\
127aec08d67SYonghong Song l1_%=:							\
128aec08d67SYonghong Song 	r0 -= r1;					\
129aec08d67SYonghong Song 	exit;						\
130aec08d67SYonghong Song "	:
131aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
132aec08d67SYonghong Song 	: __clobber_all);
133aec08d67SYonghong Song }
134aec08d67SYonghong Song 
135aec08d67SYonghong Song SEC("socket")
136aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp32, <non_const> != <const>, 1")
137aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_7(void)138aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_7(void)
139aec08d67SYonghong Song {
140aec08d67SYonghong Song 	asm volatile ("					\
141aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
142aec08d67SYonghong Song 	if w0 < 3 goto l0_%=;				\
143aec08d67SYonghong Song 	w2 = 2;						\
144aec08d67SYonghong Song 	if w0 != w2 goto l0_%=;				\
145aec08d67SYonghong Song 	goto l1_%=;					\
146aec08d67SYonghong Song l0_%=:							\
147aec08d67SYonghong Song 	r0 = 0;						\
148aec08d67SYonghong Song 	exit;						\
149aec08d67SYonghong Song l1_%=:							\
150aec08d67SYonghong Song 	r0 -= r1;					\
151aec08d67SYonghong Song 	exit;						\
152aec08d67SYonghong Song "	:
153aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
154aec08d67SYonghong Song 	: __clobber_all);
155aec08d67SYonghong Song }
156aec08d67SYonghong Song 
157aec08d67SYonghong Song SEC("socket")
158aec08d67SYonghong Song __description("check deducing bounds from non-const, jmp32, <non_const> != <const>, 2")
159aec08d67SYonghong Song __success __retval(0)
deducing_bounds_from_non_const_8(void)160aec08d67SYonghong Song __naked void deducing_bounds_from_non_const_8(void)
161aec08d67SYonghong Song {
162aec08d67SYonghong Song 	asm volatile ("					\
163aec08d67SYonghong Song 	call %[bpf_ktime_get_ns];			\
164aec08d67SYonghong Song 	if w0 > 3 goto l0_%=;				\
165aec08d67SYonghong Song 	w2 = 4;						\
166aec08d67SYonghong Song 	if w0 != w2 goto l0_%=;				\
167aec08d67SYonghong Song 	goto l1_%=;					\
168aec08d67SYonghong Song l0_%=:							\
169aec08d67SYonghong Song 	r0 = 0;						\
170aec08d67SYonghong Song 	exit;						\
171aec08d67SYonghong Song l1_%=:							\
172aec08d67SYonghong Song 	r0 -= r1;					\
173aec08d67SYonghong Song 	exit;						\
174aec08d67SYonghong Song "	:
175aec08d67SYonghong Song 	: __imm(bpf_ktime_get_ns)
176aec08d67SYonghong Song 	: __clobber_all);
177aec08d67SYonghong Song }
178aec08d67SYonghong Song 
179*23a88faeSYonghong Song SEC("socket")
180*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> > <non_const>, 1")
181*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_9(void)182*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_9(void)
183*23a88faeSYonghong Song {
184*23a88faeSYonghong Song 	asm volatile ("					\
185*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
186*23a88faeSYonghong Song 	r2 = 0;						\
187*23a88faeSYonghong Song 	if r2 > r0 goto l0_%=;				\
188*23a88faeSYonghong Song 	r0 = 0;						\
189*23a88faeSYonghong Song 	exit;						\
190*23a88faeSYonghong Song l0_%=:							\
191*23a88faeSYonghong Song 	r0 -= r1;					\
192*23a88faeSYonghong Song 	exit;						\
193*23a88faeSYonghong Song "	:
194*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
195*23a88faeSYonghong Song 	: __clobber_all);
196*23a88faeSYonghong Song }
197*23a88faeSYonghong Song 
198*23a88faeSYonghong Song SEC("socket")
199*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> > <non_const>, 2")
200*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_10(void)201*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_10(void)
202*23a88faeSYonghong Song {
203*23a88faeSYonghong Song 	asm volatile ("					\
204*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
205*23a88faeSYonghong Song 	if r0 < 4 goto l0_%=;				\
206*23a88faeSYonghong Song 	r2 = 4;						\
207*23a88faeSYonghong Song 	if r2 > r0 goto l1_%=;				\
208*23a88faeSYonghong Song l0_%=:							\
209*23a88faeSYonghong Song 	r0 = 0;						\
210*23a88faeSYonghong Song 	exit;						\
211*23a88faeSYonghong Song l1_%=:							\
212*23a88faeSYonghong Song 	r0 -= r1;					\
213*23a88faeSYonghong Song 	exit;						\
214*23a88faeSYonghong Song "	:
215*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
216*23a88faeSYonghong Song 	: __clobber_all);
217*23a88faeSYonghong Song }
218*23a88faeSYonghong Song 
219*23a88faeSYonghong Song SEC("socket")
220*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> >= <non_const>")
221*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_11(void)222*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_11(void)
223*23a88faeSYonghong Song {
224*23a88faeSYonghong Song 	asm volatile ("					\
225*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
226*23a88faeSYonghong Song 	if r0 < 4 goto l0_%=;				\
227*23a88faeSYonghong Song 	r2 = 3;						\
228*23a88faeSYonghong Song 	if r2 >= r0 goto l1_%=;				\
229*23a88faeSYonghong Song l0_%=:							\
230*23a88faeSYonghong Song 	r0 = 0;						\
231*23a88faeSYonghong Song 	exit;						\
232*23a88faeSYonghong Song l1_%=:							\
233*23a88faeSYonghong Song 	r0 -= r1;					\
234*23a88faeSYonghong Song 	exit;						\
235*23a88faeSYonghong Song "	:
236*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
237*23a88faeSYonghong Song 	: __clobber_all);
238*23a88faeSYonghong Song }
239*23a88faeSYonghong Song 
240*23a88faeSYonghong Song SEC("socket")
241*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> < <non_const>")
242*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_12(void)243*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_12(void)
244*23a88faeSYonghong Song {
245*23a88faeSYonghong Song 	asm volatile ("					\
246*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
247*23a88faeSYonghong Song 	if r0 > 4 goto l0_%=;				\
248*23a88faeSYonghong Song 	r2 = 4;						\
249*23a88faeSYonghong Song 	if r2 < r0 goto l1_%=;				\
250*23a88faeSYonghong Song l0_%=:							\
251*23a88faeSYonghong Song 	r0 = 0;						\
252*23a88faeSYonghong Song 	exit;						\
253*23a88faeSYonghong Song l1_%=:							\
254*23a88faeSYonghong Song 	r0 -= r1;					\
255*23a88faeSYonghong Song 	exit;						\
256*23a88faeSYonghong Song "	:
257*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
258*23a88faeSYonghong Song 	: __clobber_all);
259*23a88faeSYonghong Song }
260*23a88faeSYonghong Song 
261*23a88faeSYonghong Song SEC("socket")
262*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> <= <non_const>")
263*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_13(void)264*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_13(void)
265*23a88faeSYonghong Song {
266*23a88faeSYonghong Song 	asm volatile ("					\
267*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
268*23a88faeSYonghong Song 	if r0 >= 4 goto l0_%=;				\
269*23a88faeSYonghong Song 	r2 = 4;						\
270*23a88faeSYonghong Song 	if r2 <= r0 goto l1_%=;				\
271*23a88faeSYonghong Song l0_%=:							\
272*23a88faeSYonghong Song 	r0 = 0;						\
273*23a88faeSYonghong Song 	exit;						\
274*23a88faeSYonghong Song l1_%=:							\
275*23a88faeSYonghong Song 	r0 -= r1;					\
276*23a88faeSYonghong Song 	exit;						\
277*23a88faeSYonghong Song "	:
278*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
279*23a88faeSYonghong Song 	: __clobber_all);
280*23a88faeSYonghong Song }
281*23a88faeSYonghong Song 
282*23a88faeSYonghong Song SEC("socket")
283*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> == <non_const>")
284*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_14(void)285*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_14(void)
286*23a88faeSYonghong Song {
287*23a88faeSYonghong Song 	asm volatile ("					\
288*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
289*23a88faeSYonghong Song 	if r0 < 3 goto l0_%=;				\
290*23a88faeSYonghong Song 	r2 = 2;						\
291*23a88faeSYonghong Song 	if r2 == r0 goto l1_%=;				\
292*23a88faeSYonghong Song l0_%=:							\
293*23a88faeSYonghong Song 	r0 = 0;						\
294*23a88faeSYonghong Song 	exit;						\
295*23a88faeSYonghong Song l1_%=:							\
296*23a88faeSYonghong Song 	r0 -= r1;					\
297*23a88faeSYonghong Song 	exit;						\
298*23a88faeSYonghong Song "	:
299*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
300*23a88faeSYonghong Song 	: __clobber_all);
301*23a88faeSYonghong Song }
302*23a88faeSYonghong Song 
303*23a88faeSYonghong Song SEC("socket")
304*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> s> <non_const>")
305*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_15(void)306*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_15(void)
307*23a88faeSYonghong Song {
308*23a88faeSYonghong Song 	asm volatile ("					\
309*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
310*23a88faeSYonghong Song 	if r0 s< 4 goto l0_%=;				\
311*23a88faeSYonghong Song 	r2 = 4;						\
312*23a88faeSYonghong Song 	if r2 s> r0 goto l1_%=;				\
313*23a88faeSYonghong Song l0_%=:							\
314*23a88faeSYonghong Song 	r0 = 0;						\
315*23a88faeSYonghong Song 	exit;						\
316*23a88faeSYonghong Song l1_%=:							\
317*23a88faeSYonghong Song 	r0 -= r1;					\
318*23a88faeSYonghong Song 	exit;						\
319*23a88faeSYonghong Song "	:
320*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
321*23a88faeSYonghong Song 	: __clobber_all);
322*23a88faeSYonghong Song }
323*23a88faeSYonghong Song 
324*23a88faeSYonghong Song SEC("socket")
325*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> s>= <non_const>")
326*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_16(void)327*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_16(void)
328*23a88faeSYonghong Song {
329*23a88faeSYonghong Song 	asm volatile ("					\
330*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
331*23a88faeSYonghong Song 	if r0 s< 4 goto l0_%=;				\
332*23a88faeSYonghong Song 	r2 = 3;						\
333*23a88faeSYonghong Song 	if r2 s>= r0 goto l1_%=;				\
334*23a88faeSYonghong Song l0_%=:							\
335*23a88faeSYonghong Song 	r0 = 0;						\
336*23a88faeSYonghong Song 	exit;						\
337*23a88faeSYonghong Song l1_%=:							\
338*23a88faeSYonghong Song 	r0 -= r1;					\
339*23a88faeSYonghong Song 	exit;						\
340*23a88faeSYonghong Song "	:
341*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
342*23a88faeSYonghong Song 	: __clobber_all);
343*23a88faeSYonghong Song }
344*23a88faeSYonghong Song 
345*23a88faeSYonghong Song SEC("socket")
346*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> s< <non_const>")
347*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_17(void)348*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_17(void)
349*23a88faeSYonghong Song {
350*23a88faeSYonghong Song 	asm volatile ("					\
351*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
352*23a88faeSYonghong Song 	if r0 s> 4 goto l0_%=;				\
353*23a88faeSYonghong Song 	r2 = 4;						\
354*23a88faeSYonghong Song 	if r2 s< r0 goto l1_%=;				\
355*23a88faeSYonghong Song l0_%=:							\
356*23a88faeSYonghong Song 	r0 = 0;						\
357*23a88faeSYonghong Song 	exit;						\
358*23a88faeSYonghong Song l1_%=:							\
359*23a88faeSYonghong Song 	r0 -= r1;					\
360*23a88faeSYonghong Song 	exit;						\
361*23a88faeSYonghong Song "	:
362*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
363*23a88faeSYonghong Song 	: __clobber_all);
364*23a88faeSYonghong Song }
365*23a88faeSYonghong Song 
366*23a88faeSYonghong Song SEC("socket")
367*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> s<= <non_const>")
368*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_18(void)369*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_18(void)
370*23a88faeSYonghong Song {
371*23a88faeSYonghong Song 	asm volatile ("					\
372*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
373*23a88faeSYonghong Song 	if r0 s> 4 goto l0_%=;				\
374*23a88faeSYonghong Song 	r2 = 5;						\
375*23a88faeSYonghong Song 	if r2 s<= r0 goto l1_%=;				\
376*23a88faeSYonghong Song l0_%=:							\
377*23a88faeSYonghong Song 	r0 = 0;						\
378*23a88faeSYonghong Song 	exit;						\
379*23a88faeSYonghong Song l1_%=:							\
380*23a88faeSYonghong Song 	r0 -= r1;					\
381*23a88faeSYonghong Song 	exit;						\
382*23a88faeSYonghong Song "	:
383*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
384*23a88faeSYonghong Song 	: __clobber_all);
385*23a88faeSYonghong Song }
386*23a88faeSYonghong Song 
387*23a88faeSYonghong Song SEC("socket")
388*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp64, <const> != <non_const>")
389*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_19(void)390*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_19(void)
391*23a88faeSYonghong Song {
392*23a88faeSYonghong Song 	asm volatile ("					\
393*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
394*23a88faeSYonghong Song 	if r0 < 3 goto l0_%=;				\
395*23a88faeSYonghong Song 	r2 = 2;						\
396*23a88faeSYonghong Song 	if r2 != r0 goto l0_%=;				\
397*23a88faeSYonghong Song 	goto l1_%=;					\
398*23a88faeSYonghong Song l0_%=:							\
399*23a88faeSYonghong Song 	r0 = 0;						\
400*23a88faeSYonghong Song 	exit;						\
401*23a88faeSYonghong Song l1_%=:							\
402*23a88faeSYonghong Song 	r0 -= r1;					\
403*23a88faeSYonghong Song 	exit;						\
404*23a88faeSYonghong Song "	:
405*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
406*23a88faeSYonghong Song 	: __clobber_all);
407*23a88faeSYonghong Song }
408*23a88faeSYonghong Song 
409*23a88faeSYonghong Song SEC("socket")
410*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> > <non_const>, 1")
411*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_20(void)412*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_20(void)
413*23a88faeSYonghong Song {
414*23a88faeSYonghong Song 	asm volatile ("					\
415*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
416*23a88faeSYonghong Song 	w2 = 0;						\
417*23a88faeSYonghong Song 	if w2 > w0 goto l0_%=;				\
418*23a88faeSYonghong Song 	r0 = 0;						\
419*23a88faeSYonghong Song 	exit;						\
420*23a88faeSYonghong Song l0_%=:							\
421*23a88faeSYonghong Song 	r0 -= r1;					\
422*23a88faeSYonghong Song 	exit;						\
423*23a88faeSYonghong Song "	:
424*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
425*23a88faeSYonghong Song 	: __clobber_all);
426*23a88faeSYonghong Song }
427*23a88faeSYonghong Song 
428*23a88faeSYonghong Song SEC("socket")
429*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> > <non_const>, 2")
430*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_21(void)431*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_21(void)
432*23a88faeSYonghong Song {
433*23a88faeSYonghong Song 	asm volatile ("					\
434*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
435*23a88faeSYonghong Song 	if w0 < 4 goto l0_%=;				\
436*23a88faeSYonghong Song 	w2 = 4;						\
437*23a88faeSYonghong Song 	if w2 > w0 goto l1_%=;				\
438*23a88faeSYonghong Song l0_%=:							\
439*23a88faeSYonghong Song 	r0 = 0;						\
440*23a88faeSYonghong Song 	exit;						\
441*23a88faeSYonghong Song l1_%=:							\
442*23a88faeSYonghong Song 	r0 -= r1;					\
443*23a88faeSYonghong Song 	exit;						\
444*23a88faeSYonghong Song "	:
445*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
446*23a88faeSYonghong Song 	: __clobber_all);
447*23a88faeSYonghong Song }
448*23a88faeSYonghong Song 
449*23a88faeSYonghong Song SEC("socket")
450*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> >= <non_const>")
451*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_22(void)452*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_22(void)
453*23a88faeSYonghong Song {
454*23a88faeSYonghong Song 	asm volatile ("					\
455*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
456*23a88faeSYonghong Song 	if w0 < 4 goto l0_%=;				\
457*23a88faeSYonghong Song 	w2 = 3;						\
458*23a88faeSYonghong Song 	if w2 >= w0 goto l1_%=;				\
459*23a88faeSYonghong Song l0_%=:							\
460*23a88faeSYonghong Song 	r0 = 0;						\
461*23a88faeSYonghong Song 	exit;						\
462*23a88faeSYonghong Song l1_%=:							\
463*23a88faeSYonghong Song 	r0 -= r1;					\
464*23a88faeSYonghong Song 	exit;						\
465*23a88faeSYonghong Song "	:
466*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
467*23a88faeSYonghong Song 	: __clobber_all);
468*23a88faeSYonghong Song }
469*23a88faeSYonghong Song 
470*23a88faeSYonghong Song SEC("socket")
471*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> < <non_const>")
472*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_23(void)473*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_23(void)
474*23a88faeSYonghong Song {
475*23a88faeSYonghong Song 	asm volatile ("					\
476*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
477*23a88faeSYonghong Song 	if w0 > 4 goto l0_%=;				\
478*23a88faeSYonghong Song 	w2 = 4;						\
479*23a88faeSYonghong Song 	if w2 < w0 goto l1_%=;				\
480*23a88faeSYonghong Song l0_%=:							\
481*23a88faeSYonghong Song 	r0 = 0;						\
482*23a88faeSYonghong Song 	exit;						\
483*23a88faeSYonghong Song l1_%=:							\
484*23a88faeSYonghong Song 	r0 -= r1;					\
485*23a88faeSYonghong Song 	exit;						\
486*23a88faeSYonghong Song "	:
487*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
488*23a88faeSYonghong Song 	: __clobber_all);
489*23a88faeSYonghong Song }
490*23a88faeSYonghong Song 
491*23a88faeSYonghong Song SEC("socket")
492*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> <= <non_const>")
493*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_24(void)494*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_24(void)
495*23a88faeSYonghong Song {
496*23a88faeSYonghong Song 	asm volatile ("					\
497*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
498*23a88faeSYonghong Song 	if w0 >= 4 goto l0_%=;				\
499*23a88faeSYonghong Song 	w2 = 4;						\
500*23a88faeSYonghong Song 	if w2 <= w0 goto l1_%=;				\
501*23a88faeSYonghong Song l0_%=:							\
502*23a88faeSYonghong Song 	r0 = 0;						\
503*23a88faeSYonghong Song 	exit;						\
504*23a88faeSYonghong Song l1_%=:							\
505*23a88faeSYonghong Song 	r0 -= r1;					\
506*23a88faeSYonghong Song 	exit;						\
507*23a88faeSYonghong Song "	:
508*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
509*23a88faeSYonghong Song 	: __clobber_all);
510*23a88faeSYonghong Song }
511*23a88faeSYonghong Song 
512*23a88faeSYonghong Song SEC("socket")
513*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> == <non_const>")
514*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_25(void)515*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_25(void)
516*23a88faeSYonghong Song {
517*23a88faeSYonghong Song 	asm volatile ("					\
518*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
519*23a88faeSYonghong Song 	if w0 < 4 goto l0_%=;				\
520*23a88faeSYonghong Song 	w2 = 3;						\
521*23a88faeSYonghong Song 	if w2 == w0 goto l1_%=;				\
522*23a88faeSYonghong Song l0_%=:							\
523*23a88faeSYonghong Song 	r0 = 0;						\
524*23a88faeSYonghong Song 	exit;						\
525*23a88faeSYonghong Song l1_%=:							\
526*23a88faeSYonghong Song 	r0 -= r1;					\
527*23a88faeSYonghong Song 	exit;						\
528*23a88faeSYonghong Song "	:
529*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
530*23a88faeSYonghong Song 	: __clobber_all);
531*23a88faeSYonghong Song }
532*23a88faeSYonghong Song 
533*23a88faeSYonghong Song SEC("socket")
534*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> s> <non_const>")
535*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_26(void)536*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_26(void)
537*23a88faeSYonghong Song {
538*23a88faeSYonghong Song 	asm volatile ("					\
539*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
540*23a88faeSYonghong Song 	if w0 s< 4 goto l0_%=;				\
541*23a88faeSYonghong Song 	w2 = 4;						\
542*23a88faeSYonghong Song 	if w2 s> w0 goto l1_%=;				\
543*23a88faeSYonghong Song l0_%=:							\
544*23a88faeSYonghong Song 	r0 = 0;						\
545*23a88faeSYonghong Song 	exit;						\
546*23a88faeSYonghong Song l1_%=:							\
547*23a88faeSYonghong Song 	r0 -= r1;					\
548*23a88faeSYonghong Song 	exit;						\
549*23a88faeSYonghong Song "	:
550*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
551*23a88faeSYonghong Song 	: __clobber_all);
552*23a88faeSYonghong Song }
553*23a88faeSYonghong Song 
554*23a88faeSYonghong Song SEC("socket")
555*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> s>= <non_const>")
556*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_27(void)557*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_27(void)
558*23a88faeSYonghong Song {
559*23a88faeSYonghong Song 	asm volatile ("					\
560*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
561*23a88faeSYonghong Song 	if w0 s< 4 goto l0_%=;				\
562*23a88faeSYonghong Song 	w2 = 3;						\
563*23a88faeSYonghong Song 	if w2 s>= w0 goto l1_%=;				\
564*23a88faeSYonghong Song l0_%=:							\
565*23a88faeSYonghong Song 	r0 = 0;						\
566*23a88faeSYonghong Song 	exit;						\
567*23a88faeSYonghong Song l1_%=:							\
568*23a88faeSYonghong Song 	r0 -= r1;					\
569*23a88faeSYonghong Song 	exit;						\
570*23a88faeSYonghong Song "	:
571*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
572*23a88faeSYonghong Song 	: __clobber_all);
573*23a88faeSYonghong Song }
574*23a88faeSYonghong Song 
575*23a88faeSYonghong Song SEC("socket")
576*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> s< <non_const>")
577*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_28(void)578*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_28(void)
579*23a88faeSYonghong Song {
580*23a88faeSYonghong Song 	asm volatile ("					\
581*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
582*23a88faeSYonghong Song 	if w0 s> 4 goto l0_%=;				\
583*23a88faeSYonghong Song 	w2 = 5;						\
584*23a88faeSYonghong Song 	if w2 s< w0 goto l1_%=;				\
585*23a88faeSYonghong Song l0_%=:							\
586*23a88faeSYonghong Song 	r0 = 0;						\
587*23a88faeSYonghong Song 	exit;						\
588*23a88faeSYonghong Song l1_%=:							\
589*23a88faeSYonghong Song 	r0 -= r1;					\
590*23a88faeSYonghong Song 	exit;						\
591*23a88faeSYonghong Song "	:
592*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
593*23a88faeSYonghong Song 	: __clobber_all);
594*23a88faeSYonghong Song }
595*23a88faeSYonghong Song 
596*23a88faeSYonghong Song SEC("socket")
597*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> s<= <non_const>")
598*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_29(void)599*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_29(void)
600*23a88faeSYonghong Song {
601*23a88faeSYonghong Song 	asm volatile ("					\
602*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
603*23a88faeSYonghong Song 	if w0 s>= 4 goto l0_%=;				\
604*23a88faeSYonghong Song 	w2 = 4;						\
605*23a88faeSYonghong Song 	if w2 s<= w0 goto l1_%=;				\
606*23a88faeSYonghong Song l0_%=:							\
607*23a88faeSYonghong Song 	r0 = 0;						\
608*23a88faeSYonghong Song 	exit;						\
609*23a88faeSYonghong Song l1_%=:							\
610*23a88faeSYonghong Song 	r0 -= r1;					\
611*23a88faeSYonghong Song 	exit;						\
612*23a88faeSYonghong Song "	:
613*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
614*23a88faeSYonghong Song 	: __clobber_all);
615*23a88faeSYonghong Song }
616*23a88faeSYonghong Song 
617*23a88faeSYonghong Song SEC("socket")
618*23a88faeSYonghong Song __description("check deducing bounds from non-const, jmp32, <const> != <non_const>")
619*23a88faeSYonghong Song __success __retval(0)
deducing_bounds_from_non_const_30(void)620*23a88faeSYonghong Song __naked void deducing_bounds_from_non_const_30(void)
621*23a88faeSYonghong Song {
622*23a88faeSYonghong Song 	asm volatile ("					\
623*23a88faeSYonghong Song 	call %[bpf_ktime_get_ns];			\
624*23a88faeSYonghong Song 	if w0 < 3 goto l0_%=;				\
625*23a88faeSYonghong Song 	w2 = 2;						\
626*23a88faeSYonghong Song 	if w2 != w0 goto l0_%=;				\
627*23a88faeSYonghong Song 	goto l1_%=;					\
628*23a88faeSYonghong Song l0_%=:							\
629*23a88faeSYonghong Song 	r0 = 0;						\
630*23a88faeSYonghong Song 	exit;						\
631*23a88faeSYonghong Song l1_%=:							\
632*23a88faeSYonghong Song 	r0 -= r1;					\
633*23a88faeSYonghong Song 	exit;						\
634*23a88faeSYonghong Song "	:
635*23a88faeSYonghong Song 	: __imm(bpf_ktime_get_ns)
636*23a88faeSYonghong Song 	: __clobber_all);
637*23a88faeSYonghong Song }
638*23a88faeSYonghong Song 
639aec08d67SYonghong Song char _license[] SEC("license") = "GPL";
640