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

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