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