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  
7  SEC("socket")
8  __description("check deducing bounds from non-const, jmp64, <non_const> == <const>, 1")
9  __success __retval(0)
deducing_bounds_from_non_const_1(void)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_%=;				\
17  l0_%=:							\
18  	r0 = 0;						\
19  	exit;						\
20  l1_%=:							\
21  	r0 -= r1;					\
22  	exit;						\
23  "	:
24  	: __imm(bpf_ktime_get_ns)
25  	: __clobber_all);
26  }
27  
28  SEC("socket")
29  __description("check deducing bounds from non-const, jmp64, <non_const> == <const>, 2")
30  __success __retval(0)
deducing_bounds_from_non_const_2(void)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_%=;				\
38  l0_%=:							\
39  	r0 = 0;						\
40  	exit;						\
41  l1_%=:							\
42  	r0 -= r1;					\
43  	exit;						\
44  "	:
45  	: __imm(bpf_ktime_get_ns)
46  	: __clobber_all);
47  }
48  
49  SEC("socket")
50  __description("check deducing bounds from non-const, jmp64, <non_const> != <const>, 1")
51  __success __retval(0)
deducing_bounds_from_non_const_3(void)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_%=;					\
60  l0_%=:							\
61  	r0 = 0;						\
62  	exit;						\
63  l1_%=:							\
64  	r0 -= r1;					\
65  	exit;						\
66  "	:
67  	: __imm(bpf_ktime_get_ns)
68  	: __clobber_all);
69  }
70  
71  SEC("socket")
72  __description("check deducing bounds from non-const, jmp64, <non_const> != <const>, 2")
73  __success __retval(0)
deducing_bounds_from_non_const_4(void)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_%=;					\
82  l0_%=:							\
83  	r0 = 0;						\
84  	exit;						\
85  l1_%=:							\
86  	r0 -= r1;					\
87  	exit;						\
88  "	:
89  	: __imm(bpf_ktime_get_ns)
90  	: __clobber_all);
91  }
92  
93  SEC("socket")
94  __description("check deducing bounds from non-const, jmp32, <non_const> == <const>, 1")
95  __success __retval(0)
deducing_bounds_from_non_const_5(void)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_%=;				\
103  l0_%=:							\
104  	r0 = 0;						\
105  	exit;						\
106  l1_%=:							\
107  	r0 -= r1;					\
108  	exit;						\
109  "	:
110  	: __imm(bpf_ktime_get_ns)
111  	: __clobber_all);
112  }
113  
114  SEC("socket")
115  __description("check deducing bounds from non-const, jmp32, <non_const> == <const>, 2")
116  __success __retval(0)
deducing_bounds_from_non_const_6(void)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_%=;				\
124  l0_%=:							\
125  	r0 = 0;						\
126  	exit;						\
127  l1_%=:							\
128  	r0 -= r1;					\
129  	exit;						\
130  "	:
131  	: __imm(bpf_ktime_get_ns)
132  	: __clobber_all);
133  }
134  
135  SEC("socket")
136  __description("check deducing bounds from non-const, jmp32, <non_const> != <const>, 1")
137  __success __retval(0)
deducing_bounds_from_non_const_7(void)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_%=;					\
146  l0_%=:							\
147  	r0 = 0;						\
148  	exit;						\
149  l1_%=:							\
150  	r0 -= r1;					\
151  	exit;						\
152  "	:
153  	: __imm(bpf_ktime_get_ns)
154  	: __clobber_all);
155  }
156  
157  SEC("socket")
158  __description("check deducing bounds from non-const, jmp32, <non_const> != <const>, 2")
159  __success __retval(0)
deducing_bounds_from_non_const_8(void)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_%=;					\
168  l0_%=:							\
169  	r0 = 0;						\
170  	exit;						\
171  l1_%=:							\
172  	r0 -= r1;					\
173  	exit;						\
174  "	:
175  	: __imm(bpf_ktime_get_ns)
176  	: __clobber_all);
177  }
178  
179  SEC("socket")
180  __description("check deducing bounds from non-const, jmp64, <const> > <non_const>, 1")
181  __success __retval(0)
deducing_bounds_from_non_const_9(void)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;						\
190  l0_%=:							\
191  	r0 -= r1;					\
192  	exit;						\
193  "	:
194  	: __imm(bpf_ktime_get_ns)
195  	: __clobber_all);
196  }
197  
198  SEC("socket")
199  __description("check deducing bounds from non-const, jmp64, <const> > <non_const>, 2")
200  __success __retval(0)
deducing_bounds_from_non_const_10(void)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_%=;				\
208  l0_%=:							\
209  	r0 = 0;						\
210  	exit;						\
211  l1_%=:							\
212  	r0 -= r1;					\
213  	exit;						\
214  "	:
215  	: __imm(bpf_ktime_get_ns)
216  	: __clobber_all);
217  }
218  
219  SEC("socket")
220  __description("check deducing bounds from non-const, jmp64, <const> >= <non_const>")
221  __success __retval(0)
deducing_bounds_from_non_const_11(void)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_%=;				\
229  l0_%=:							\
230  	r0 = 0;						\
231  	exit;						\
232  l1_%=:							\
233  	r0 -= r1;					\
234  	exit;						\
235  "	:
236  	: __imm(bpf_ktime_get_ns)
237  	: __clobber_all);
238  }
239  
240  SEC("socket")
241  __description("check deducing bounds from non-const, jmp64, <const> < <non_const>")
242  __success __retval(0)
deducing_bounds_from_non_const_12(void)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_%=;				\
250  l0_%=:							\
251  	r0 = 0;						\
252  	exit;						\
253  l1_%=:							\
254  	r0 -= r1;					\
255  	exit;						\
256  "	:
257  	: __imm(bpf_ktime_get_ns)
258  	: __clobber_all);
259  }
260  
261  SEC("socket")
262  __description("check deducing bounds from non-const, jmp64, <const> <= <non_const>")
263  __success __retval(0)
deducing_bounds_from_non_const_13(void)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_%=;				\
271  l0_%=:							\
272  	r0 = 0;						\
273  	exit;						\
274  l1_%=:							\
275  	r0 -= r1;					\
276  	exit;						\
277  "	:
278  	: __imm(bpf_ktime_get_ns)
279  	: __clobber_all);
280  }
281  
282  SEC("socket")
283  __description("check deducing bounds from non-const, jmp64, <const> == <non_const>")
284  __success __retval(0)
deducing_bounds_from_non_const_14(void)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_%=;				\
292  l0_%=:							\
293  	r0 = 0;						\
294  	exit;						\
295  l1_%=:							\
296  	r0 -= r1;					\
297  	exit;						\
298  "	:
299  	: __imm(bpf_ktime_get_ns)
300  	: __clobber_all);
301  }
302  
303  SEC("socket")
304  __description("check deducing bounds from non-const, jmp64, <const> s> <non_const>")
305  __success __retval(0)
deducing_bounds_from_non_const_15(void)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_%=;				\
313  l0_%=:							\
314  	r0 = 0;						\
315  	exit;						\
316  l1_%=:							\
317  	r0 -= r1;					\
318  	exit;						\
319  "	:
320  	: __imm(bpf_ktime_get_ns)
321  	: __clobber_all);
322  }
323  
324  SEC("socket")
325  __description("check deducing bounds from non-const, jmp64, <const> s>= <non_const>")
326  __success __retval(0)
deducing_bounds_from_non_const_16(void)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_%=;				\
334  l0_%=:							\
335  	r0 = 0;						\
336  	exit;						\
337  l1_%=:							\
338  	r0 -= r1;					\
339  	exit;						\
340  "	:
341  	: __imm(bpf_ktime_get_ns)
342  	: __clobber_all);
343  }
344  
345  SEC("socket")
346  __description("check deducing bounds from non-const, jmp64, <const> s< <non_const>")
347  __success __retval(0)
deducing_bounds_from_non_const_17(void)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_%=;				\
355  l0_%=:							\
356  	r0 = 0;						\
357  	exit;						\
358  l1_%=:							\
359  	r0 -= r1;					\
360  	exit;						\
361  "	:
362  	: __imm(bpf_ktime_get_ns)
363  	: __clobber_all);
364  }
365  
366  SEC("socket")
367  __description("check deducing bounds from non-const, jmp64, <const> s<= <non_const>")
368  __success __retval(0)
deducing_bounds_from_non_const_18(void)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_%=;				\
376  l0_%=:							\
377  	r0 = 0;						\
378  	exit;						\
379  l1_%=:							\
380  	r0 -= r1;					\
381  	exit;						\
382  "	:
383  	: __imm(bpf_ktime_get_ns)
384  	: __clobber_all);
385  }
386  
387  SEC("socket")
388  __description("check deducing bounds from non-const, jmp64, <const> != <non_const>")
389  __success __retval(0)
deducing_bounds_from_non_const_19(void)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_%=;					\
398  l0_%=:							\
399  	r0 = 0;						\
400  	exit;						\
401  l1_%=:							\
402  	r0 -= r1;					\
403  	exit;						\
404  "	:
405  	: __imm(bpf_ktime_get_ns)
406  	: __clobber_all);
407  }
408  
409  SEC("socket")
410  __description("check deducing bounds from non-const, jmp32, <const> > <non_const>, 1")
411  __success __retval(0)
deducing_bounds_from_non_const_20(void)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;						\
420  l0_%=:							\
421  	r0 -= r1;					\
422  	exit;						\
423  "	:
424  	: __imm(bpf_ktime_get_ns)
425  	: __clobber_all);
426  }
427  
428  SEC("socket")
429  __description("check deducing bounds from non-const, jmp32, <const> > <non_const>, 2")
430  __success __retval(0)
deducing_bounds_from_non_const_21(void)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_%=;				\
438  l0_%=:							\
439  	r0 = 0;						\
440  	exit;						\
441  l1_%=:							\
442  	r0 -= r1;					\
443  	exit;						\
444  "	:
445  	: __imm(bpf_ktime_get_ns)
446  	: __clobber_all);
447  }
448  
449  SEC("socket")
450  __description("check deducing bounds from non-const, jmp32, <const> >= <non_const>")
451  __success __retval(0)
deducing_bounds_from_non_const_22(void)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_%=;				\
459  l0_%=:							\
460  	r0 = 0;						\
461  	exit;						\
462  l1_%=:							\
463  	r0 -= r1;					\
464  	exit;						\
465  "	:
466  	: __imm(bpf_ktime_get_ns)
467  	: __clobber_all);
468  }
469  
470  SEC("socket")
471  __description("check deducing bounds from non-const, jmp32, <const> < <non_const>")
472  __success __retval(0)
deducing_bounds_from_non_const_23(void)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_%=;				\
480  l0_%=:							\
481  	r0 = 0;						\
482  	exit;						\
483  l1_%=:							\
484  	r0 -= r1;					\
485  	exit;						\
486  "	:
487  	: __imm(bpf_ktime_get_ns)
488  	: __clobber_all);
489  }
490  
491  SEC("socket")
492  __description("check deducing bounds from non-const, jmp32, <const> <= <non_const>")
493  __success __retval(0)
deducing_bounds_from_non_const_24(void)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_%=;				\
501  l0_%=:							\
502  	r0 = 0;						\
503  	exit;						\
504  l1_%=:							\
505  	r0 -= r1;					\
506  	exit;						\
507  "	:
508  	: __imm(bpf_ktime_get_ns)
509  	: __clobber_all);
510  }
511  
512  SEC("socket")
513  __description("check deducing bounds from non-const, jmp32, <const> == <non_const>")
514  __success __retval(0)
deducing_bounds_from_non_const_25(void)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_%=;				\
522  l0_%=:							\
523  	r0 = 0;						\
524  	exit;						\
525  l1_%=:							\
526  	r0 -= r1;					\
527  	exit;						\
528  "	:
529  	: __imm(bpf_ktime_get_ns)
530  	: __clobber_all);
531  }
532  
533  SEC("socket")
534  __description("check deducing bounds from non-const, jmp32, <const> s> <non_const>")
535  __success __retval(0)
deducing_bounds_from_non_const_26(void)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_%=;				\
543  l0_%=:							\
544  	r0 = 0;						\
545  	exit;						\
546  l1_%=:							\
547  	r0 -= r1;					\
548  	exit;						\
549  "	:
550  	: __imm(bpf_ktime_get_ns)
551  	: __clobber_all);
552  }
553  
554  SEC("socket")
555  __description("check deducing bounds from non-const, jmp32, <const> s>= <non_const>")
556  __success __retval(0)
deducing_bounds_from_non_const_27(void)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_%=;				\
564  l0_%=:							\
565  	r0 = 0;						\
566  	exit;						\
567  l1_%=:							\
568  	r0 -= r1;					\
569  	exit;						\
570  "	:
571  	: __imm(bpf_ktime_get_ns)
572  	: __clobber_all);
573  }
574  
575  SEC("socket")
576  __description("check deducing bounds from non-const, jmp32, <const> s< <non_const>")
577  __success __retval(0)
deducing_bounds_from_non_const_28(void)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_%=;				\
585  l0_%=:							\
586  	r0 = 0;						\
587  	exit;						\
588  l1_%=:							\
589  	r0 -= r1;					\
590  	exit;						\
591  "	:
592  	: __imm(bpf_ktime_get_ns)
593  	: __clobber_all);
594  }
595  
596  SEC("socket")
597  __description("check deducing bounds from non-const, jmp32, <const> s<= <non_const>")
598  __success __retval(0)
deducing_bounds_from_non_const_29(void)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_%=;				\
606  l0_%=:							\
607  	r0 = 0;						\
608  	exit;						\
609  l1_%=:							\
610  	r0 -= r1;					\
611  	exit;						\
612  "	:
613  	: __imm(bpf_ktime_get_ns)
614  	: __clobber_all);
615  }
616  
617  SEC("socket")
618  __description("check deducing bounds from non-const, jmp32, <const> != <non_const>")
619  __success __retval(0)
deducing_bounds_from_non_const_30(void)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_%=;					\
628  l0_%=:							\
629  	r0 = 0;						\
630  	exit;						\
631  l1_%=:							\
632  	r0 -= r1;					\
633  	exit;						\
634  "	:
635  	: __imm(bpf_ktime_get_ns)
636  	: __clobber_all);
637  }
638  
639  char _license[] SEC("license") = "GPL";
640