xref: /linux/tools/testing/selftests/bpf/progs/verifier_sdiv.c (revision 788f63c4dc1780c84deb5fe820f6446c28364a0d)
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 #if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \
8 	(defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || defined(__TARGET_ARCH_arm)) && \
9 	__clang_major__ >= 18
10 
11 SEC("socket")
12 __description("SDIV32, non-zero imm divisor, check 1")
13 __success __success_unpriv __retval(-20)
14 __naked void sdiv32_non_zero_imm_1(void)
15 {
16 	asm volatile ("					\
17 	w0 = -41;					\
18 	w0 s/= 2;					\
19 	exit;						\
20 "	::: __clobber_all);
21 }
22 
23 SEC("socket")
24 __description("SDIV32, non-zero imm divisor, check 2")
25 __success __success_unpriv __retval(-20)
26 __naked void sdiv32_non_zero_imm_2(void)
27 {
28 	asm volatile ("					\
29 	w0 = 41;					\
30 	w0 s/= -2;					\
31 	exit;						\
32 "	::: __clobber_all);
33 }
34 
35 SEC("socket")
36 __description("SDIV32, non-zero imm divisor, check 3")
37 __success __success_unpriv __retval(20)
38 __naked void sdiv32_non_zero_imm_3(void)
39 {
40 	asm volatile ("					\
41 	w0 = -41;					\
42 	w0 s/= -2;					\
43 	exit;						\
44 "	::: __clobber_all);
45 }
46 
47 SEC("socket")
48 __description("SDIV32, non-zero imm divisor, check 4")
49 __success __success_unpriv __retval(-21)
50 __naked void sdiv32_non_zero_imm_4(void)
51 {
52 	asm volatile ("					\
53 	w0 = -42;					\
54 	w0 s/= 2;					\
55 	exit;						\
56 "	::: __clobber_all);
57 }
58 
59 SEC("socket")
60 __description("SDIV32, non-zero imm divisor, check 5")
61 __success __success_unpriv __retval(-21)
62 __naked void sdiv32_non_zero_imm_5(void)
63 {
64 	asm volatile ("					\
65 	w0 = 42;					\
66 	w0 s/= -2;					\
67 	exit;						\
68 "	::: __clobber_all);
69 }
70 
71 SEC("socket")
72 __description("SDIV32, non-zero imm divisor, check 6")
73 __success __success_unpriv __retval(21)
74 __naked void sdiv32_non_zero_imm_6(void)
75 {
76 	asm volatile ("					\
77 	w0 = -42;					\
78 	w0 s/= -2;					\
79 	exit;						\
80 "	::: __clobber_all);
81 }
82 
83 SEC("socket")
84 __description("SDIV32, non-zero imm divisor, check 7")
85 __success __success_unpriv __retval(21)
86 __naked void sdiv32_non_zero_imm_7(void)
87 {
88 	asm volatile ("					\
89 	w0 = 42;					\
90 	w0 s/= 2;					\
91 	exit;						\
92 "	::: __clobber_all);
93 }
94 
95 SEC("socket")
96 __description("SDIV32, non-zero imm divisor, check 8")
97 __success __success_unpriv __retval(20)
98 __naked void sdiv32_non_zero_imm_8(void)
99 {
100 	asm volatile ("					\
101 	w0 = 41;					\
102 	w0 s/= 2;					\
103 	exit;						\
104 "	::: __clobber_all);
105 }
106 
107 SEC("socket")
108 __description("SDIV32, non-zero reg divisor, check 1")
109 __success __success_unpriv __retval(-20)
110 __naked void sdiv32_non_zero_reg_1(void)
111 {
112 	asm volatile ("					\
113 	w0 = -41;					\
114 	w1 = 2;						\
115 	w0 s/= w1;					\
116 	exit;						\
117 "	::: __clobber_all);
118 }
119 
120 SEC("socket")
121 __description("SDIV32, non-zero reg divisor, check 2")
122 __success __success_unpriv __retval(-20)
123 __naked void sdiv32_non_zero_reg_2(void)
124 {
125 	asm volatile ("					\
126 	w0 = 41;					\
127 	w1 = -2;					\
128 	w0 s/= w1;					\
129 	exit;						\
130 "	::: __clobber_all);
131 }
132 
133 SEC("socket")
134 __description("SDIV32, non-zero reg divisor, check 3")
135 __success __success_unpriv __retval(20)
136 __naked void sdiv32_non_zero_reg_3(void)
137 {
138 	asm volatile ("					\
139 	w0 = -41;					\
140 	w1 = -2;					\
141 	w0 s/= w1;					\
142 	exit;						\
143 "	::: __clobber_all);
144 }
145 
146 SEC("socket")
147 __description("SDIV32, non-zero reg divisor, check 4")
148 __success __success_unpriv __retval(-21)
149 __naked void sdiv32_non_zero_reg_4(void)
150 {
151 	asm volatile ("					\
152 	w0 = -42;					\
153 	w1 = 2;						\
154 	w0 s/= w1;					\
155 	exit;						\
156 "	::: __clobber_all);
157 }
158 
159 SEC("socket")
160 __description("SDIV32, non-zero reg divisor, check 5")
161 __success __success_unpriv __retval(-21)
162 __naked void sdiv32_non_zero_reg_5(void)
163 {
164 	asm volatile ("					\
165 	w0 = 42;					\
166 	w1 = -2;					\
167 	w0 s/= w1;					\
168 	exit;						\
169 "	::: __clobber_all);
170 }
171 
172 SEC("socket")
173 __description("SDIV32, non-zero reg divisor, check 6")
174 __success __success_unpriv __retval(21)
175 __naked void sdiv32_non_zero_reg_6(void)
176 {
177 	asm volatile ("					\
178 	w0 = -42;					\
179 	w1 = -2;					\
180 	w0 s/= w1;					\
181 	exit;						\
182 "	::: __clobber_all);
183 }
184 
185 SEC("socket")
186 __description("SDIV32, non-zero reg divisor, check 7")
187 __success __success_unpriv __retval(21)
188 __naked void sdiv32_non_zero_reg_7(void)
189 {
190 	asm volatile ("					\
191 	w0 = 42;					\
192 	w1 = 2;						\
193 	w0 s/= w1;					\
194 	exit;						\
195 "	::: __clobber_all);
196 }
197 
198 SEC("socket")
199 __description("SDIV32, non-zero reg divisor, check 8")
200 __success __success_unpriv __retval(20)
201 __naked void sdiv32_non_zero_reg_8(void)
202 {
203 	asm volatile ("					\
204 	w0 = 41;					\
205 	w1 = 2;						\
206 	w0 s/= w1;					\
207 	exit;						\
208 "	::: __clobber_all);
209 }
210 
211 SEC("socket")
212 __description("SDIV64, non-zero imm divisor, check 1")
213 __success __success_unpriv __retval(-20)
214 __naked void sdiv64_non_zero_imm_1(void)
215 {
216 	asm volatile ("					\
217 	r0 = -41;					\
218 	r0 s/= 2;					\
219 	exit;						\
220 "	::: __clobber_all);
221 }
222 
223 SEC("socket")
224 __description("SDIV64, non-zero imm divisor, check 2")
225 __success __success_unpriv __retval(-20)
226 __naked void sdiv64_non_zero_imm_2(void)
227 {
228 	asm volatile ("					\
229 	r0 = 41;					\
230 	r0 s/= -2;					\
231 	exit;						\
232 "	::: __clobber_all);
233 }
234 
235 SEC("socket")
236 __description("SDIV64, non-zero imm divisor, check 3")
237 __success __success_unpriv __retval(20)
238 __naked void sdiv64_non_zero_imm_3(void)
239 {
240 	asm volatile ("					\
241 	r0 = -41;					\
242 	r0 s/= -2;					\
243 	exit;						\
244 "	::: __clobber_all);
245 }
246 
247 SEC("socket")
248 __description("SDIV64, non-zero imm divisor, check 4")
249 __success __success_unpriv __retval(-21)
250 __naked void sdiv64_non_zero_imm_4(void)
251 {
252 	asm volatile ("					\
253 	r0 = -42;					\
254 	r0 s/= 2;					\
255 	exit;						\
256 "	::: __clobber_all);
257 }
258 
259 SEC("socket")
260 __description("SDIV64, non-zero imm divisor, check 5")
261 __success __success_unpriv __retval(-21)
262 __naked void sdiv64_non_zero_imm_5(void)
263 {
264 	asm volatile ("					\
265 	r0 = 42;					\
266 	r0 s/= -2;					\
267 	exit;						\
268 "	::: __clobber_all);
269 }
270 
271 SEC("socket")
272 __description("SDIV64, non-zero imm divisor, check 6")
273 __success __success_unpriv __retval(21)
274 __naked void sdiv64_non_zero_imm_6(void)
275 {
276 	asm volatile ("					\
277 	r0 = -42;					\
278 	r0 s/= -2;					\
279 	exit;						\
280 "	::: __clobber_all);
281 }
282 
283 SEC("socket")
284 __description("SDIV64, non-zero reg divisor, check 1")
285 __success __success_unpriv __retval(-20)
286 __naked void sdiv64_non_zero_reg_1(void)
287 {
288 	asm volatile ("					\
289 	r0 = -41;					\
290 	r1 = 2;						\
291 	r0 s/= r1;					\
292 	exit;						\
293 "	::: __clobber_all);
294 }
295 
296 SEC("socket")
297 __description("SDIV64, non-zero reg divisor, check 2")
298 __success __success_unpriv __retval(-20)
299 __naked void sdiv64_non_zero_reg_2(void)
300 {
301 	asm volatile ("					\
302 	r0 = 41;					\
303 	r1 = -2;					\
304 	r0 s/= r1;					\
305 	exit;						\
306 "	::: __clobber_all);
307 }
308 
309 SEC("socket")
310 __description("SDIV64, non-zero reg divisor, check 3")
311 __success __success_unpriv __retval(20)
312 __naked void sdiv64_non_zero_reg_3(void)
313 {
314 	asm volatile ("					\
315 	r0 = -41;					\
316 	r1 = -2;					\
317 	r0 s/= r1;					\
318 	exit;						\
319 "	::: __clobber_all);
320 }
321 
322 SEC("socket")
323 __description("SDIV64, non-zero reg divisor, check 4")
324 __success __success_unpriv __retval(-21)
325 __naked void sdiv64_non_zero_reg_4(void)
326 {
327 	asm volatile ("					\
328 	r0 = -42;					\
329 	r1 = 2;						\
330 	r0 s/= r1;					\
331 	exit;						\
332 "	::: __clobber_all);
333 }
334 
335 SEC("socket")
336 __description("SDIV64, non-zero reg divisor, check 5")
337 __success __success_unpriv __retval(-21)
338 __naked void sdiv64_non_zero_reg_5(void)
339 {
340 	asm volatile ("					\
341 	r0 = 42;					\
342 	r1 = -2;					\
343 	r0 s/= r1;					\
344 	exit;						\
345 "	::: __clobber_all);
346 }
347 
348 SEC("socket")
349 __description("SDIV64, non-zero reg divisor, check 6")
350 __success __success_unpriv __retval(21)
351 __naked void sdiv64_non_zero_reg_6(void)
352 {
353 	asm volatile ("					\
354 	r0 = -42;					\
355 	r1 = -2;					\
356 	r0 s/= r1;					\
357 	exit;						\
358 "	::: __clobber_all);
359 }
360 
361 SEC("socket")
362 __description("SMOD32, non-zero imm divisor, check 1")
363 __success __success_unpriv __retval(-1)
364 __naked void smod32_non_zero_imm_1(void)
365 {
366 	asm volatile ("					\
367 	w0 = -41;					\
368 	w0 s%%= 2;					\
369 	exit;						\
370 "	::: __clobber_all);
371 }
372 
373 SEC("socket")
374 __description("SMOD32, non-zero imm divisor, check 2")
375 __success __success_unpriv __retval(1)
376 __naked void smod32_non_zero_imm_2(void)
377 {
378 	asm volatile ("					\
379 	w0 = 41;					\
380 	w0 s%%= -2;					\
381 	exit;						\
382 "	::: __clobber_all);
383 }
384 
385 SEC("socket")
386 __description("SMOD32, non-zero imm divisor, check 3")
387 __success __success_unpriv __retval(-1)
388 __naked void smod32_non_zero_imm_3(void)
389 {
390 	asm volatile ("					\
391 	w0 = -41;					\
392 	w0 s%%= -2;					\
393 	exit;						\
394 "	::: __clobber_all);
395 }
396 
397 SEC("socket")
398 __description("SMOD32, non-zero imm divisor, check 4")
399 __success __success_unpriv __retval(0)
400 __naked void smod32_non_zero_imm_4(void)
401 {
402 	asm volatile ("					\
403 	w0 = -42;					\
404 	w0 s%%= 2;					\
405 	exit;						\
406 "	::: __clobber_all);
407 }
408 
409 SEC("socket")
410 __description("SMOD32, non-zero imm divisor, check 5")
411 __success __success_unpriv __retval(0)
412 __naked void smod32_non_zero_imm_5(void)
413 {
414 	asm volatile ("					\
415 	w0 = 42;					\
416 	w0 s%%= -2;					\
417 	exit;						\
418 "	::: __clobber_all);
419 }
420 
421 SEC("socket")
422 __description("SMOD32, non-zero imm divisor, check 6")
423 __success __success_unpriv __retval(0)
424 __naked void smod32_non_zero_imm_6(void)
425 {
426 	asm volatile ("					\
427 	w0 = -42;					\
428 	w0 s%%= -2;					\
429 	exit;						\
430 "	::: __clobber_all);
431 }
432 
433 SEC("socket")
434 __description("SMOD32, non-zero reg divisor, check 1")
435 __success __success_unpriv __retval(-1)
436 __naked void smod32_non_zero_reg_1(void)
437 {
438 	asm volatile ("					\
439 	w0 = -41;					\
440 	w1 = 2;						\
441 	w0 s%%= w1;					\
442 	exit;						\
443 "	::: __clobber_all);
444 }
445 
446 SEC("socket")
447 __description("SMOD32, non-zero reg divisor, check 2")
448 __success __success_unpriv __retval(1)
449 __naked void smod32_non_zero_reg_2(void)
450 {
451 	asm volatile ("					\
452 	w0 = 41;					\
453 	w1 = -2;					\
454 	w0 s%%= w1;					\
455 	exit;						\
456 "	::: __clobber_all);
457 }
458 
459 SEC("socket")
460 __description("SMOD32, non-zero reg divisor, check 3")
461 __success __success_unpriv __retval(-1)
462 __naked void smod32_non_zero_reg_3(void)
463 {
464 	asm volatile ("					\
465 	w0 = -41;					\
466 	w1 = -2;					\
467 	w0 s%%= w1;					\
468 	exit;						\
469 "	::: __clobber_all);
470 }
471 
472 SEC("socket")
473 __description("SMOD32, non-zero reg divisor, check 4")
474 __success __success_unpriv __retval(0)
475 __naked void smod32_non_zero_reg_4(void)
476 {
477 	asm volatile ("					\
478 	w0 = -42;					\
479 	w1 = 2;						\
480 	w0 s%%= w1;					\
481 	exit;						\
482 "	::: __clobber_all);
483 }
484 
485 SEC("socket")
486 __description("SMOD32, non-zero reg divisor, check 5")
487 __success __success_unpriv __retval(0)
488 __naked void smod32_non_zero_reg_5(void)
489 {
490 	asm volatile ("					\
491 	w0 = 42;					\
492 	w1 = -2;					\
493 	w0 s%%= w1;					\
494 	exit;						\
495 "	::: __clobber_all);
496 }
497 
498 SEC("socket")
499 __description("SMOD32, non-zero reg divisor, check 6")
500 __success __success_unpriv __retval(0)
501 __naked void smod32_non_zero_reg_6(void)
502 {
503 	asm volatile ("					\
504 	w0 = -42;					\
505 	w1 = -2;					\
506 	w0 s%%= w1;					\
507 	exit;						\
508 "	::: __clobber_all);
509 }
510 
511 SEC("socket")
512 __description("SMOD64, non-zero imm divisor, check 1")
513 __success __success_unpriv __retval(-1)
514 __naked void smod64_non_zero_imm_1(void)
515 {
516 	asm volatile ("					\
517 	r0 = -41;					\
518 	r0 s%%= 2;					\
519 	exit;						\
520 "	::: __clobber_all);
521 }
522 
523 SEC("socket")
524 __description("SMOD64, non-zero imm divisor, check 2")
525 __success __success_unpriv __retval(1)
526 __naked void smod64_non_zero_imm_2(void)
527 {
528 	asm volatile ("					\
529 	r0 = 41;					\
530 	r0 s%%= -2;					\
531 	exit;						\
532 "	::: __clobber_all);
533 }
534 
535 SEC("socket")
536 __description("SMOD64, non-zero imm divisor, check 3")
537 __success __success_unpriv __retval(-1)
538 __naked void smod64_non_zero_imm_3(void)
539 {
540 	asm volatile ("					\
541 	r0 = -41;					\
542 	r0 s%%= -2;					\
543 	exit;						\
544 "	::: __clobber_all);
545 }
546 
547 SEC("socket")
548 __description("SMOD64, non-zero imm divisor, check 4")
549 __success __success_unpriv __retval(0)
550 __naked void smod64_non_zero_imm_4(void)
551 {
552 	asm volatile ("					\
553 	r0 = -42;					\
554 	r0 s%%= 2;					\
555 	exit;						\
556 "	::: __clobber_all);
557 }
558 
559 SEC("socket")
560 __description("SMOD64, non-zero imm divisor, check 5")
561 __success __success_unpriv __retval(-0)
562 __naked void smod64_non_zero_imm_5(void)
563 {
564 	asm volatile ("					\
565 	r0 = 42;					\
566 	r0 s%%= -2;					\
567 	exit;						\
568 "	::: __clobber_all);
569 }
570 
571 SEC("socket")
572 __description("SMOD64, non-zero imm divisor, check 6")
573 __success __success_unpriv __retval(0)
574 __naked void smod64_non_zero_imm_6(void)
575 {
576 	asm volatile ("					\
577 	r0 = -42;					\
578 	r0 s%%= -2;					\
579 	exit;						\
580 "	::: __clobber_all);
581 }
582 
583 SEC("socket")
584 __description("SMOD64, non-zero imm divisor, check 7")
585 __success __success_unpriv __retval(0)
586 __naked void smod64_non_zero_imm_7(void)
587 {
588 	asm volatile ("					\
589 	r0 = 42;					\
590 	r0 s%%= 2;					\
591 	exit;						\
592 "	::: __clobber_all);
593 }
594 
595 SEC("socket")
596 __description("SMOD64, non-zero imm divisor, check 8")
597 __success __success_unpriv __retval(1)
598 __naked void smod64_non_zero_imm_8(void)
599 {
600 	asm volatile ("					\
601 	r0 = 41;					\
602 	r0 s%%= 2;					\
603 	exit;						\
604 "	::: __clobber_all);
605 }
606 
607 SEC("socket")
608 __description("SMOD64, non-zero reg divisor, check 1")
609 __success __success_unpriv __retval(-1)
610 __naked void smod64_non_zero_reg_1(void)
611 {
612 	asm volatile ("					\
613 	r0 = -41;					\
614 	r1 = 2;						\
615 	r0 s%%= r1;					\
616 	exit;						\
617 "	::: __clobber_all);
618 }
619 
620 SEC("socket")
621 __description("SMOD64, non-zero reg divisor, check 2")
622 __success __success_unpriv __retval(1)
623 __naked void smod64_non_zero_reg_2(void)
624 {
625 	asm volatile ("					\
626 	r0 = 41;					\
627 	r1 = -2;					\
628 	r0 s%%= r1;					\
629 	exit;						\
630 "	::: __clobber_all);
631 }
632 
633 SEC("socket")
634 __description("SMOD64, non-zero reg divisor, check 3")
635 __success __success_unpriv __retval(-1)
636 __naked void smod64_non_zero_reg_3(void)
637 {
638 	asm volatile ("					\
639 	r0 = -41;					\
640 	r1 = -2;					\
641 	r0 s%%= r1;					\
642 	exit;						\
643 "	::: __clobber_all);
644 }
645 
646 SEC("socket")
647 __description("SMOD64, non-zero reg divisor, check 4")
648 __success __success_unpriv __retval(0)
649 __naked void smod64_non_zero_reg_4(void)
650 {
651 	asm volatile ("					\
652 	r0 = -42;					\
653 	r1 = 2;						\
654 	r0 s%%= r1;					\
655 	exit;						\
656 "	::: __clobber_all);
657 }
658 
659 SEC("socket")
660 __description("SMOD64, non-zero reg divisor, check 5")
661 __success __success_unpriv __retval(0)
662 __naked void smod64_non_zero_reg_5(void)
663 {
664 	asm volatile ("					\
665 	r0 = 42;					\
666 	r1 = -2;					\
667 	r0 s%%= r1;					\
668 	exit;						\
669 "	::: __clobber_all);
670 }
671 
672 SEC("socket")
673 __description("SMOD64, non-zero reg divisor, check 6")
674 __success __success_unpriv __retval(0)
675 __naked void smod64_non_zero_reg_6(void)
676 {
677 	asm volatile ("					\
678 	r0 = -42;					\
679 	r1 = -2;					\
680 	r0 s%%= r1;					\
681 	exit;						\
682 "	::: __clobber_all);
683 }
684 
685 SEC("socket")
686 __description("SMOD64, non-zero reg divisor, check 7")
687 __success __success_unpriv __retval(0)
688 __naked void smod64_non_zero_reg_7(void)
689 {
690 	asm volatile ("					\
691 	r0 = 42;					\
692 	r1 = 2;						\
693 	r0 s%%= r1;					\
694 	exit;						\
695 "	::: __clobber_all);
696 }
697 
698 SEC("socket")
699 __description("SMOD64, non-zero reg divisor, check 8")
700 __success __success_unpriv __retval(1)
701 __naked void smod64_non_zero_reg_8(void)
702 {
703 	asm volatile ("					\
704 	r0 = 41;					\
705 	r1 = 2;						\
706 	r0 s%%= r1;					\
707 	exit;						\
708 "	::: __clobber_all);
709 }
710 
711 SEC("socket")
712 __description("SDIV32, zero divisor")
713 __success __success_unpriv __retval(0)
714 __naked void sdiv32_zero_divisor(void)
715 {
716 	asm volatile ("					\
717 	w0 = 42;					\
718 	w1 = 0;						\
719 	w2 = -1;					\
720 	w2 s/= w1;					\
721 	w0 = w2;					\
722 	exit;						\
723 "	::: __clobber_all);
724 }
725 
726 SEC("socket")
727 __description("SDIV64, zero divisor")
728 __success __success_unpriv __retval(0)
729 __naked void sdiv64_zero_divisor(void)
730 {
731 	asm volatile ("					\
732 	r0 = 42;					\
733 	r1 = 0;						\
734 	r2 = -1;					\
735 	r2 s/= r1;					\
736 	r0 = r2;					\
737 	exit;						\
738 "	::: __clobber_all);
739 }
740 
741 SEC("socket")
742 __description("SMOD32, zero divisor")
743 __success __success_unpriv __retval(-1)
744 __naked void smod32_zero_divisor(void)
745 {
746 	asm volatile ("					\
747 	w0 = 42;					\
748 	w1 = 0;						\
749 	w2 = -1;					\
750 	w2 s%%= w1;					\
751 	w0 = w2;					\
752 	exit;						\
753 "	::: __clobber_all);
754 }
755 
756 SEC("socket")
757 __description("SMOD64, zero divisor")
758 __success __success_unpriv __retval(-1)
759 __naked void smod64_zero_divisor(void)
760 {
761 	asm volatile ("					\
762 	r0 = 42;					\
763 	r1 = 0;						\
764 	r2 = -1;					\
765 	r2 s%%= r1;					\
766 	r0 = r2;					\
767 	exit;						\
768 "	::: __clobber_all);
769 }
770 
771 #else
772 
773 SEC("socket")
774 __description("cpuv4 is not supported by compiler or jit, use a dummy test")
775 __success
776 int dummy_test(void)
777 {
778 	return 0;
779 }
780 
781 #endif
782 
783 char _license[] SEC("license") = "GPL";
784