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