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
10SEC("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
22SEC("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
34SEC("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
46SEC("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
58SEC("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
70SEC("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
82SEC("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
94SEC("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
106SEC("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
119SEC("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
132SEC("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
145SEC("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
158SEC("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
171SEC("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
184SEC("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
197SEC("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
210SEC("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
222SEC("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
234SEC("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
246SEC("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
258SEC("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
270SEC("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
282SEC("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
295SEC("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
308SEC("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
321SEC("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
334SEC("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
347SEC("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
360SEC("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
372SEC("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
384SEC("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
396SEC("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
408SEC("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
420SEC("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
432SEC("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
445SEC("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
458SEC("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
471SEC("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
484SEC("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
497SEC("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
510SEC("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
522SEC("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
534SEC("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
546SEC("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
558SEC("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
570SEC("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
582SEC("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
594SEC("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
606SEC("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
619SEC("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
632SEC("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
645SEC("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
658SEC("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
671SEC("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
684SEC("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
697SEC("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
710SEC("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
725SEC("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
740SEC("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
755SEC("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
772SEC("socket")
773__description("cpuv4 is not supported by compiler or jit, use a dummy test")
774__success
775int dummy_test(void)
776{
777	return 0;
778}
779
780#endif
781
782char _license[] SEC("license") = "GPL";
783