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