1// SPDX-License-Identifier: GPL-2.0
2/* Converted from tools/testing/selftests/bpf/verifier/div0.c */
3
4#include <linux/bpf.h>
5#include <bpf/bpf_helpers.h>
6#include "bpf_misc.h"
7
8SEC("socket")
9__description("DIV32 by 0, zero check 1")
10__success __success_unpriv __retval(42)
11__naked void by_0_zero_check_1_1(void)
12{
13	asm volatile ("					\
14	w0 = 42;					\
15	w1 = 0;						\
16	w2 = 1;						\
17	w2 /= w1;					\
18	exit;						\
19"	::: __clobber_all);
20}
21
22SEC("socket")
23__description("DIV32 by 0, zero check 2")
24__success __success_unpriv __retval(42)
25__naked void by_0_zero_check_2_1(void)
26{
27	asm volatile ("					\
28	w0 = 42;					\
29	r1 = 0xffffffff00000000LL ll;			\
30	w2 = 1;						\
31	w2 /= w1;					\
32	exit;						\
33"	::: __clobber_all);
34}
35
36SEC("socket")
37__description("DIV64 by 0, zero check")
38__success __success_unpriv __retval(42)
39__naked void div64_by_0_zero_check(void)
40{
41	asm volatile ("					\
42	w0 = 42;					\
43	w1 = 0;						\
44	w2 = 1;						\
45	r2 /= r1;					\
46	exit;						\
47"	::: __clobber_all);
48}
49
50SEC("socket")
51__description("MOD32 by 0, zero check 1")
52__success __success_unpriv __retval(42)
53__naked void by_0_zero_check_1_2(void)
54{
55	asm volatile ("					\
56	w0 = 42;					\
57	w1 = 0;						\
58	w2 = 1;						\
59	w2 %%= w1;					\
60	exit;						\
61"	::: __clobber_all);
62}
63
64SEC("socket")
65__description("MOD32 by 0, zero check 2")
66__success __success_unpriv __retval(42)
67__naked void by_0_zero_check_2_2(void)
68{
69	asm volatile ("					\
70	w0 = 42;					\
71	r1 = 0xffffffff00000000LL ll;			\
72	w2 = 1;						\
73	w2 %%= w1;					\
74	exit;						\
75"	::: __clobber_all);
76}
77
78SEC("socket")
79__description("MOD64 by 0, zero check")
80__success __success_unpriv __retval(42)
81__naked void mod64_by_0_zero_check(void)
82{
83	asm volatile ("					\
84	w0 = 42;					\
85	w1 = 0;						\
86	w2 = 1;						\
87	r2 %%= r1;					\
88	exit;						\
89"	::: __clobber_all);
90}
91
92SEC("tc")
93__description("DIV32 by 0, zero check ok, cls")
94__success __retval(8)
95__naked void _0_zero_check_ok_cls_1(void)
96{
97	asm volatile ("					\
98	w0 = 42;					\
99	w1 = 2;						\
100	w2 = 16;					\
101	w2 /= w1;					\
102	r0 = r2;					\
103	exit;						\
104"	::: __clobber_all);
105}
106
107SEC("tc")
108__description("DIV32 by 0, zero check 1, cls")
109__success __retval(0)
110__naked void _0_zero_check_1_cls_1(void)
111{
112	asm volatile ("					\
113	w1 = 0;						\
114	w0 = 1;						\
115	w0 /= w1;					\
116	exit;						\
117"	::: __clobber_all);
118}
119
120SEC("tc")
121__description("DIV32 by 0, zero check 2, cls")
122__success __retval(0)
123__naked void _0_zero_check_2_cls_1(void)
124{
125	asm volatile ("					\
126	r1 = 0xffffffff00000000LL ll;			\
127	w0 = 1;						\
128	w0 /= w1;					\
129	exit;						\
130"	::: __clobber_all);
131}
132
133SEC("tc")
134__description("DIV64 by 0, zero check, cls")
135__success __retval(0)
136__naked void by_0_zero_check_cls(void)
137{
138	asm volatile ("					\
139	w1 = 0;						\
140	w0 = 1;						\
141	r0 /= r1;					\
142	exit;						\
143"	::: __clobber_all);
144}
145
146SEC("tc")
147__description("MOD32 by 0, zero check ok, cls")
148__success __retval(2)
149__naked void _0_zero_check_ok_cls_2(void)
150{
151	asm volatile ("					\
152	w0 = 42;					\
153	w1 = 3;						\
154	w2 = 5;						\
155	w2 %%= w1;					\
156	r0 = r2;					\
157	exit;						\
158"	::: __clobber_all);
159}
160
161SEC("tc")
162__description("MOD32 by 0, zero check 1, cls")
163__success __retval(1)
164__naked void _0_zero_check_1_cls_2(void)
165{
166	asm volatile ("					\
167	w1 = 0;						\
168	w0 = 1;						\
169	w0 %%= w1;					\
170	exit;						\
171"	::: __clobber_all);
172}
173
174SEC("tc")
175__description("MOD32 by 0, zero check 2, cls")
176__success __retval(1)
177__naked void _0_zero_check_2_cls_2(void)
178{
179	asm volatile ("					\
180	r1 = 0xffffffff00000000LL ll;			\
181	w0 = 1;						\
182	w0 %%= w1;					\
183	exit;						\
184"	::: __clobber_all);
185}
186
187SEC("tc")
188__description("MOD64 by 0, zero check 1, cls")
189__success __retval(2)
190__naked void _0_zero_check_1_cls_3(void)
191{
192	asm volatile ("					\
193	w1 = 0;						\
194	w0 = 2;						\
195	r0 %%= r1;					\
196	exit;						\
197"	::: __clobber_all);
198}
199
200SEC("tc")
201__description("MOD64 by 0, zero check 2, cls")
202__success __retval(-1)
203__naked void _0_zero_check_2_cls_3(void)
204{
205	asm volatile ("					\
206	w1 = 0;						\
207	w0 = -1;					\
208	r0 %%= r1;					\
209	exit;						\
210"	::: __clobber_all);
211}
212
213char _license[] SEC("license") = "GPL";
214