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