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