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

source code of linux/tools/testing/selftests/bpf/progs/verifier_bounds_deduction_non_const.c