1*4882a593Smuzhiyun #include <linux/init.h>
2*4882a593Smuzhiyun #include <linux/kernel.h>
3*4882a593Smuzhiyun #include <linux/module.h>
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #define for_each_test(i, test) \
6*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(test); i++)
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun struct test_fail {
9*4882a593Smuzhiyun const char *str;
10*4882a593Smuzhiyun unsigned int base;
11*4882a593Smuzhiyun };
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define DEFINE_TEST_FAIL(test) \
14*4882a593Smuzhiyun const struct test_fail test[] __initconst
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #define DECLARE_TEST_OK(type, test_type) \
17*4882a593Smuzhiyun test_type { \
18*4882a593Smuzhiyun const char *str; \
19*4882a593Smuzhiyun unsigned int base; \
20*4882a593Smuzhiyun type expected_res; \
21*4882a593Smuzhiyun }
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #define DEFINE_TEST_OK(type, test) \
24*4882a593Smuzhiyun const type test[] __initconst
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #define TEST_FAIL(fn, type, fmt, test) \
27*4882a593Smuzhiyun { \
28*4882a593Smuzhiyun unsigned int i; \
29*4882a593Smuzhiyun \
30*4882a593Smuzhiyun for_each_test(i, test) { \
31*4882a593Smuzhiyun const struct test_fail *t = &test[i]; \
32*4882a593Smuzhiyun type tmp; \
33*4882a593Smuzhiyun int rv; \
34*4882a593Smuzhiyun \
35*4882a593Smuzhiyun tmp = 0; \
36*4882a593Smuzhiyun rv = fn(t->str, t->base, &tmp); \
37*4882a593Smuzhiyun if (rv >= 0) { \
38*4882a593Smuzhiyun WARN(1, "str '%s', base %u, expected -E, got %d/" fmt "\n", \
39*4882a593Smuzhiyun t->str, t->base, rv, tmp); \
40*4882a593Smuzhiyun continue; \
41*4882a593Smuzhiyun } \
42*4882a593Smuzhiyun } \
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun #define TEST_OK(fn, type, fmt, test) \
46*4882a593Smuzhiyun { \
47*4882a593Smuzhiyun unsigned int i; \
48*4882a593Smuzhiyun \
49*4882a593Smuzhiyun for_each_test(i, test) { \
50*4882a593Smuzhiyun const typeof(test[0]) *t = &test[i]; \
51*4882a593Smuzhiyun type res; \
52*4882a593Smuzhiyun int rv; \
53*4882a593Smuzhiyun \
54*4882a593Smuzhiyun rv = fn(t->str, t->base, &res); \
55*4882a593Smuzhiyun if (rv != 0) { \
56*4882a593Smuzhiyun WARN(1, "str '%s', base %u, expected 0/" fmt ", got %d\n", \
57*4882a593Smuzhiyun t->str, t->base, t->expected_res, rv); \
58*4882a593Smuzhiyun continue; \
59*4882a593Smuzhiyun } \
60*4882a593Smuzhiyun if (res != t->expected_res) { \
61*4882a593Smuzhiyun WARN(1, "str '%s', base %u, expected " fmt ", got " fmt "\n", \
62*4882a593Smuzhiyun t->str, t->base, t->expected_res, res); \
63*4882a593Smuzhiyun continue; \
64*4882a593Smuzhiyun } \
65*4882a593Smuzhiyun } \
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
test_kstrtoull_ok(void)68*4882a593Smuzhiyun static void __init test_kstrtoull_ok(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun DECLARE_TEST_OK(unsigned long long, struct test_ull);
71*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_ull, test_ull_ok) = {
72*4882a593Smuzhiyun {"0", 10, 0ULL},
73*4882a593Smuzhiyun {"1", 10, 1ULL},
74*4882a593Smuzhiyun {"127", 10, 127ULL},
75*4882a593Smuzhiyun {"128", 10, 128ULL},
76*4882a593Smuzhiyun {"129", 10, 129ULL},
77*4882a593Smuzhiyun {"255", 10, 255ULL},
78*4882a593Smuzhiyun {"256", 10, 256ULL},
79*4882a593Smuzhiyun {"257", 10, 257ULL},
80*4882a593Smuzhiyun {"32767", 10, 32767ULL},
81*4882a593Smuzhiyun {"32768", 10, 32768ULL},
82*4882a593Smuzhiyun {"32769", 10, 32769ULL},
83*4882a593Smuzhiyun {"65535", 10, 65535ULL},
84*4882a593Smuzhiyun {"65536", 10, 65536ULL},
85*4882a593Smuzhiyun {"65537", 10, 65537ULL},
86*4882a593Smuzhiyun {"2147483647", 10, 2147483647ULL},
87*4882a593Smuzhiyun {"2147483648", 10, 2147483648ULL},
88*4882a593Smuzhiyun {"2147483649", 10, 2147483649ULL},
89*4882a593Smuzhiyun {"4294967295", 10, 4294967295ULL},
90*4882a593Smuzhiyun {"4294967296", 10, 4294967296ULL},
91*4882a593Smuzhiyun {"4294967297", 10, 4294967297ULL},
92*4882a593Smuzhiyun {"9223372036854775807", 10, 9223372036854775807ULL},
93*4882a593Smuzhiyun {"9223372036854775808", 10, 9223372036854775808ULL},
94*4882a593Smuzhiyun {"9223372036854775809", 10, 9223372036854775809ULL},
95*4882a593Smuzhiyun {"18446744073709551614", 10, 18446744073709551614ULL},
96*4882a593Smuzhiyun {"18446744073709551615", 10, 18446744073709551615ULL},
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun {"00", 8, 00ULL},
99*4882a593Smuzhiyun {"01", 8, 01ULL},
100*4882a593Smuzhiyun {"0177", 8, 0177ULL},
101*4882a593Smuzhiyun {"0200", 8, 0200ULL},
102*4882a593Smuzhiyun {"0201", 8, 0201ULL},
103*4882a593Smuzhiyun {"0377", 8, 0377ULL},
104*4882a593Smuzhiyun {"0400", 8, 0400ULL},
105*4882a593Smuzhiyun {"0401", 8, 0401ULL},
106*4882a593Smuzhiyun {"077777", 8, 077777ULL},
107*4882a593Smuzhiyun {"0100000", 8, 0100000ULL},
108*4882a593Smuzhiyun {"0100001", 8, 0100001ULL},
109*4882a593Smuzhiyun {"0177777", 8, 0177777ULL},
110*4882a593Smuzhiyun {"0200000", 8, 0200000ULL},
111*4882a593Smuzhiyun {"0200001", 8, 0200001ULL},
112*4882a593Smuzhiyun {"017777777777", 8, 017777777777ULL},
113*4882a593Smuzhiyun {"020000000000", 8, 020000000000ULL},
114*4882a593Smuzhiyun {"020000000001", 8, 020000000001ULL},
115*4882a593Smuzhiyun {"037777777777", 8, 037777777777ULL},
116*4882a593Smuzhiyun {"040000000000", 8, 040000000000ULL},
117*4882a593Smuzhiyun {"040000000001", 8, 040000000001ULL},
118*4882a593Smuzhiyun {"0777777777777777777777", 8, 0777777777777777777777ULL},
119*4882a593Smuzhiyun {"01000000000000000000000", 8, 01000000000000000000000ULL},
120*4882a593Smuzhiyun {"01000000000000000000001", 8, 01000000000000000000001ULL},
121*4882a593Smuzhiyun {"01777777777777777777776", 8, 01777777777777777777776ULL},
122*4882a593Smuzhiyun {"01777777777777777777777", 8, 01777777777777777777777ULL},
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun {"0x0", 16, 0x0ULL},
125*4882a593Smuzhiyun {"0x1", 16, 0x1ULL},
126*4882a593Smuzhiyun {"0x7f", 16, 0x7fULL},
127*4882a593Smuzhiyun {"0x80", 16, 0x80ULL},
128*4882a593Smuzhiyun {"0x81", 16, 0x81ULL},
129*4882a593Smuzhiyun {"0xff", 16, 0xffULL},
130*4882a593Smuzhiyun {"0x100", 16, 0x100ULL},
131*4882a593Smuzhiyun {"0x101", 16, 0x101ULL},
132*4882a593Smuzhiyun {"0x7fff", 16, 0x7fffULL},
133*4882a593Smuzhiyun {"0x8000", 16, 0x8000ULL},
134*4882a593Smuzhiyun {"0x8001", 16, 0x8001ULL},
135*4882a593Smuzhiyun {"0xffff", 16, 0xffffULL},
136*4882a593Smuzhiyun {"0x10000", 16, 0x10000ULL},
137*4882a593Smuzhiyun {"0x10001", 16, 0x10001ULL},
138*4882a593Smuzhiyun {"0x7fffffff", 16, 0x7fffffffULL},
139*4882a593Smuzhiyun {"0x80000000", 16, 0x80000000ULL},
140*4882a593Smuzhiyun {"0x80000001", 16, 0x80000001ULL},
141*4882a593Smuzhiyun {"0xffffffff", 16, 0xffffffffULL},
142*4882a593Smuzhiyun {"0x100000000", 16, 0x100000000ULL},
143*4882a593Smuzhiyun {"0x100000001", 16, 0x100000001ULL},
144*4882a593Smuzhiyun {"0x7fffffffffffffff", 16, 0x7fffffffffffffffULL},
145*4882a593Smuzhiyun {"0x8000000000000000", 16, 0x8000000000000000ULL},
146*4882a593Smuzhiyun {"0x8000000000000001", 16, 0x8000000000000001ULL},
147*4882a593Smuzhiyun {"0xfffffffffffffffe", 16, 0xfffffffffffffffeULL},
148*4882a593Smuzhiyun {"0xffffffffffffffff", 16, 0xffffffffffffffffULL},
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun {"0\n", 0, 0ULL},
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun TEST_OK(kstrtoull, unsigned long long, "%llu", test_ull_ok);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
test_kstrtoull_fail(void)155*4882a593Smuzhiyun static void __init test_kstrtoull_fail(void)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_ull_fail) = {
158*4882a593Smuzhiyun {"", 0},
159*4882a593Smuzhiyun {"", 8},
160*4882a593Smuzhiyun {"", 10},
161*4882a593Smuzhiyun {"", 16},
162*4882a593Smuzhiyun {"\n", 0},
163*4882a593Smuzhiyun {"\n", 8},
164*4882a593Smuzhiyun {"\n", 10},
165*4882a593Smuzhiyun {"\n", 16},
166*4882a593Smuzhiyun {"\n0", 0},
167*4882a593Smuzhiyun {"\n0", 8},
168*4882a593Smuzhiyun {"\n0", 10},
169*4882a593Smuzhiyun {"\n0", 16},
170*4882a593Smuzhiyun {"+", 0},
171*4882a593Smuzhiyun {"+", 8},
172*4882a593Smuzhiyun {"+", 10},
173*4882a593Smuzhiyun {"+", 16},
174*4882a593Smuzhiyun {"-", 0},
175*4882a593Smuzhiyun {"-", 8},
176*4882a593Smuzhiyun {"-", 10},
177*4882a593Smuzhiyun {"-", 16},
178*4882a593Smuzhiyun {"0x", 0},
179*4882a593Smuzhiyun {"0x", 16},
180*4882a593Smuzhiyun {"0X", 0},
181*4882a593Smuzhiyun {"0X", 16},
182*4882a593Smuzhiyun {"0 ", 0},
183*4882a593Smuzhiyun {"1+", 0},
184*4882a593Smuzhiyun {"1-", 0},
185*4882a593Smuzhiyun {" 2", 0},
186*4882a593Smuzhiyun /* base autodetection */
187*4882a593Smuzhiyun {"0x0z", 0},
188*4882a593Smuzhiyun {"0z", 0},
189*4882a593Smuzhiyun {"a", 0},
190*4882a593Smuzhiyun /* digit >= base */
191*4882a593Smuzhiyun {"2", 2},
192*4882a593Smuzhiyun {"8", 8},
193*4882a593Smuzhiyun {"a", 10},
194*4882a593Smuzhiyun {"A", 10},
195*4882a593Smuzhiyun {"g", 16},
196*4882a593Smuzhiyun {"G", 16},
197*4882a593Smuzhiyun /* overflow */
198*4882a593Smuzhiyun {"10000000000000000000000000000000000000000000000000000000000000000", 2},
199*4882a593Smuzhiyun {"2000000000000000000000", 8},
200*4882a593Smuzhiyun {"18446744073709551616", 10},
201*4882a593Smuzhiyun {"10000000000000000", 16},
202*4882a593Smuzhiyun /* negative */
203*4882a593Smuzhiyun {"-0", 0},
204*4882a593Smuzhiyun {"-0", 8},
205*4882a593Smuzhiyun {"-0", 10},
206*4882a593Smuzhiyun {"-0", 16},
207*4882a593Smuzhiyun {"-1", 0},
208*4882a593Smuzhiyun {"-1", 8},
209*4882a593Smuzhiyun {"-1", 10},
210*4882a593Smuzhiyun {"-1", 16},
211*4882a593Smuzhiyun /* sign is first character if any */
212*4882a593Smuzhiyun {"-+1", 0},
213*4882a593Smuzhiyun {"-+1", 8},
214*4882a593Smuzhiyun {"-+1", 10},
215*4882a593Smuzhiyun {"-+1", 16},
216*4882a593Smuzhiyun /* nothing after \n */
217*4882a593Smuzhiyun {"0\n0", 0},
218*4882a593Smuzhiyun {"0\n0", 8},
219*4882a593Smuzhiyun {"0\n0", 10},
220*4882a593Smuzhiyun {"0\n0", 16},
221*4882a593Smuzhiyun {"0\n+", 0},
222*4882a593Smuzhiyun {"0\n+", 8},
223*4882a593Smuzhiyun {"0\n+", 10},
224*4882a593Smuzhiyun {"0\n+", 16},
225*4882a593Smuzhiyun {"0\n-", 0},
226*4882a593Smuzhiyun {"0\n-", 8},
227*4882a593Smuzhiyun {"0\n-", 10},
228*4882a593Smuzhiyun {"0\n-", 16},
229*4882a593Smuzhiyun {"0\n ", 0},
230*4882a593Smuzhiyun {"0\n ", 8},
231*4882a593Smuzhiyun {"0\n ", 10},
232*4882a593Smuzhiyun {"0\n ", 16},
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun TEST_FAIL(kstrtoull, unsigned long long, "%llu", test_ull_fail);
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
test_kstrtoll_ok(void)237*4882a593Smuzhiyun static void __init test_kstrtoll_ok(void)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun DECLARE_TEST_OK(long long, struct test_ll);
240*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_ll, test_ll_ok) = {
241*4882a593Smuzhiyun {"0", 10, 0LL},
242*4882a593Smuzhiyun {"1", 10, 1LL},
243*4882a593Smuzhiyun {"127", 10, 127LL},
244*4882a593Smuzhiyun {"128", 10, 128LL},
245*4882a593Smuzhiyun {"129", 10, 129LL},
246*4882a593Smuzhiyun {"255", 10, 255LL},
247*4882a593Smuzhiyun {"256", 10, 256LL},
248*4882a593Smuzhiyun {"257", 10, 257LL},
249*4882a593Smuzhiyun {"32767", 10, 32767LL},
250*4882a593Smuzhiyun {"32768", 10, 32768LL},
251*4882a593Smuzhiyun {"32769", 10, 32769LL},
252*4882a593Smuzhiyun {"65535", 10, 65535LL},
253*4882a593Smuzhiyun {"65536", 10, 65536LL},
254*4882a593Smuzhiyun {"65537", 10, 65537LL},
255*4882a593Smuzhiyun {"2147483647", 10, 2147483647LL},
256*4882a593Smuzhiyun {"2147483648", 10, 2147483648LL},
257*4882a593Smuzhiyun {"2147483649", 10, 2147483649LL},
258*4882a593Smuzhiyun {"4294967295", 10, 4294967295LL},
259*4882a593Smuzhiyun {"4294967296", 10, 4294967296LL},
260*4882a593Smuzhiyun {"4294967297", 10, 4294967297LL},
261*4882a593Smuzhiyun {"9223372036854775807", 10, 9223372036854775807LL},
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun {"-0", 10, 0LL},
264*4882a593Smuzhiyun {"-1", 10, -1LL},
265*4882a593Smuzhiyun {"-2", 10, -2LL},
266*4882a593Smuzhiyun {"-9223372036854775808", 10, LLONG_MIN},
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun TEST_OK(kstrtoll, long long, "%lld", test_ll_ok);
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun
test_kstrtoll_fail(void)271*4882a593Smuzhiyun static void __init test_kstrtoll_fail(void)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_ll_fail) = {
274*4882a593Smuzhiyun {"9223372036854775808", 10},
275*4882a593Smuzhiyun {"9223372036854775809", 10},
276*4882a593Smuzhiyun {"18446744073709551614", 10},
277*4882a593Smuzhiyun {"18446744073709551615", 10},
278*4882a593Smuzhiyun {"-9223372036854775809", 10},
279*4882a593Smuzhiyun {"-18446744073709551614", 10},
280*4882a593Smuzhiyun {"-18446744073709551615", 10},
281*4882a593Smuzhiyun /* sign is first character if any */
282*4882a593Smuzhiyun {"-+1", 0},
283*4882a593Smuzhiyun {"-+1", 8},
284*4882a593Smuzhiyun {"-+1", 10},
285*4882a593Smuzhiyun {"-+1", 16},
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun TEST_FAIL(kstrtoll, long long, "%lld", test_ll_fail);
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun
test_kstrtou64_ok(void)290*4882a593Smuzhiyun static void __init test_kstrtou64_ok(void)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun DECLARE_TEST_OK(u64, struct test_u64);
293*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_u64, test_u64_ok) = {
294*4882a593Smuzhiyun {"0", 10, 0},
295*4882a593Smuzhiyun {"1", 10, 1},
296*4882a593Smuzhiyun {"126", 10, 126},
297*4882a593Smuzhiyun {"127", 10, 127},
298*4882a593Smuzhiyun {"128", 10, 128},
299*4882a593Smuzhiyun {"129", 10, 129},
300*4882a593Smuzhiyun {"254", 10, 254},
301*4882a593Smuzhiyun {"255", 10, 255},
302*4882a593Smuzhiyun {"256", 10, 256},
303*4882a593Smuzhiyun {"257", 10, 257},
304*4882a593Smuzhiyun {"32766", 10, 32766},
305*4882a593Smuzhiyun {"32767", 10, 32767},
306*4882a593Smuzhiyun {"32768", 10, 32768},
307*4882a593Smuzhiyun {"32769", 10, 32769},
308*4882a593Smuzhiyun {"65534", 10, 65534},
309*4882a593Smuzhiyun {"65535", 10, 65535},
310*4882a593Smuzhiyun {"65536", 10, 65536},
311*4882a593Smuzhiyun {"65537", 10, 65537},
312*4882a593Smuzhiyun {"2147483646", 10, 2147483646},
313*4882a593Smuzhiyun {"2147483647", 10, 2147483647},
314*4882a593Smuzhiyun {"2147483648", 10, 2147483648ULL},
315*4882a593Smuzhiyun {"2147483649", 10, 2147483649ULL},
316*4882a593Smuzhiyun {"4294967294", 10, 4294967294ULL},
317*4882a593Smuzhiyun {"4294967295", 10, 4294967295ULL},
318*4882a593Smuzhiyun {"4294967296", 10, 4294967296ULL},
319*4882a593Smuzhiyun {"4294967297", 10, 4294967297ULL},
320*4882a593Smuzhiyun {"9223372036854775806", 10, 9223372036854775806ULL},
321*4882a593Smuzhiyun {"9223372036854775807", 10, 9223372036854775807ULL},
322*4882a593Smuzhiyun {"9223372036854775808", 10, 9223372036854775808ULL},
323*4882a593Smuzhiyun {"9223372036854775809", 10, 9223372036854775809ULL},
324*4882a593Smuzhiyun {"18446744073709551614", 10, 18446744073709551614ULL},
325*4882a593Smuzhiyun {"18446744073709551615", 10, 18446744073709551615ULL},
326*4882a593Smuzhiyun };
327*4882a593Smuzhiyun TEST_OK(kstrtou64, u64, "%llu", test_u64_ok);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
test_kstrtou64_fail(void)330*4882a593Smuzhiyun static void __init test_kstrtou64_fail(void)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_u64_fail) = {
333*4882a593Smuzhiyun {"-2", 10},
334*4882a593Smuzhiyun {"-1", 10},
335*4882a593Smuzhiyun {"18446744073709551616", 10},
336*4882a593Smuzhiyun {"18446744073709551617", 10},
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun TEST_FAIL(kstrtou64, u64, "%llu", test_u64_fail);
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun
test_kstrtos64_ok(void)341*4882a593Smuzhiyun static void __init test_kstrtos64_ok(void)
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun DECLARE_TEST_OK(s64, struct test_s64);
344*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_s64, test_s64_ok) = {
345*4882a593Smuzhiyun {"-128", 10, -128},
346*4882a593Smuzhiyun {"-127", 10, -127},
347*4882a593Smuzhiyun {"-1", 10, -1},
348*4882a593Smuzhiyun {"0", 10, 0},
349*4882a593Smuzhiyun {"1", 10, 1},
350*4882a593Smuzhiyun {"126", 10, 126},
351*4882a593Smuzhiyun {"127", 10, 127},
352*4882a593Smuzhiyun {"128", 10, 128},
353*4882a593Smuzhiyun {"129", 10, 129},
354*4882a593Smuzhiyun {"254", 10, 254},
355*4882a593Smuzhiyun {"255", 10, 255},
356*4882a593Smuzhiyun {"256", 10, 256},
357*4882a593Smuzhiyun {"257", 10, 257},
358*4882a593Smuzhiyun {"32766", 10, 32766},
359*4882a593Smuzhiyun {"32767", 10, 32767},
360*4882a593Smuzhiyun {"32768", 10, 32768},
361*4882a593Smuzhiyun {"32769", 10, 32769},
362*4882a593Smuzhiyun {"65534", 10, 65534},
363*4882a593Smuzhiyun {"65535", 10, 65535},
364*4882a593Smuzhiyun {"65536", 10, 65536},
365*4882a593Smuzhiyun {"65537", 10, 65537},
366*4882a593Smuzhiyun {"2147483646", 10, 2147483646},
367*4882a593Smuzhiyun {"2147483647", 10, 2147483647},
368*4882a593Smuzhiyun {"2147483648", 10, 2147483648LL},
369*4882a593Smuzhiyun {"2147483649", 10, 2147483649LL},
370*4882a593Smuzhiyun {"4294967294", 10, 4294967294LL},
371*4882a593Smuzhiyun {"4294967295", 10, 4294967295LL},
372*4882a593Smuzhiyun {"4294967296", 10, 4294967296LL},
373*4882a593Smuzhiyun {"4294967297", 10, 4294967297LL},
374*4882a593Smuzhiyun {"9223372036854775806", 10, 9223372036854775806LL},
375*4882a593Smuzhiyun {"9223372036854775807", 10, 9223372036854775807LL},
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun TEST_OK(kstrtos64, s64, "%lld", test_s64_ok);
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
test_kstrtos64_fail(void)380*4882a593Smuzhiyun static void __init test_kstrtos64_fail(void)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_s64_fail) = {
383*4882a593Smuzhiyun {"9223372036854775808", 10},
384*4882a593Smuzhiyun {"9223372036854775809", 10},
385*4882a593Smuzhiyun {"18446744073709551614", 10},
386*4882a593Smuzhiyun {"18446744073709551615", 10},
387*4882a593Smuzhiyun {"18446744073709551616", 10},
388*4882a593Smuzhiyun {"18446744073709551617", 10},
389*4882a593Smuzhiyun };
390*4882a593Smuzhiyun TEST_FAIL(kstrtos64, s64, "%lld", test_s64_fail);
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
test_kstrtou32_ok(void)393*4882a593Smuzhiyun static void __init test_kstrtou32_ok(void)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun DECLARE_TEST_OK(u32, struct test_u32);
396*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_u32, test_u32_ok) = {
397*4882a593Smuzhiyun {"0", 10, 0},
398*4882a593Smuzhiyun {"1", 10, 1},
399*4882a593Smuzhiyun {"126", 10, 126},
400*4882a593Smuzhiyun {"127", 10, 127},
401*4882a593Smuzhiyun {"128", 10, 128},
402*4882a593Smuzhiyun {"129", 10, 129},
403*4882a593Smuzhiyun {"254", 10, 254},
404*4882a593Smuzhiyun {"255", 10, 255},
405*4882a593Smuzhiyun {"256", 10, 256},
406*4882a593Smuzhiyun {"257", 10, 257},
407*4882a593Smuzhiyun {"32766", 10, 32766},
408*4882a593Smuzhiyun {"32767", 10, 32767},
409*4882a593Smuzhiyun {"32768", 10, 32768},
410*4882a593Smuzhiyun {"32769", 10, 32769},
411*4882a593Smuzhiyun {"65534", 10, 65534},
412*4882a593Smuzhiyun {"65535", 10, 65535},
413*4882a593Smuzhiyun {"65536", 10, 65536},
414*4882a593Smuzhiyun {"65537", 10, 65537},
415*4882a593Smuzhiyun {"2147483646", 10, 2147483646},
416*4882a593Smuzhiyun {"2147483647", 10, 2147483647},
417*4882a593Smuzhiyun {"2147483648", 10, 2147483648U},
418*4882a593Smuzhiyun {"2147483649", 10, 2147483649U},
419*4882a593Smuzhiyun {"4294967294", 10, 4294967294U},
420*4882a593Smuzhiyun {"4294967295", 10, 4294967295U},
421*4882a593Smuzhiyun };
422*4882a593Smuzhiyun TEST_OK(kstrtou32, u32, "%u", test_u32_ok);
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun
test_kstrtou32_fail(void)425*4882a593Smuzhiyun static void __init test_kstrtou32_fail(void)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_u32_fail) = {
428*4882a593Smuzhiyun {"-2", 10},
429*4882a593Smuzhiyun {"-1", 10},
430*4882a593Smuzhiyun {"4294967296", 10},
431*4882a593Smuzhiyun {"4294967297", 10},
432*4882a593Smuzhiyun {"9223372036854775806", 10},
433*4882a593Smuzhiyun {"9223372036854775807", 10},
434*4882a593Smuzhiyun {"9223372036854775808", 10},
435*4882a593Smuzhiyun {"9223372036854775809", 10},
436*4882a593Smuzhiyun {"18446744073709551614", 10},
437*4882a593Smuzhiyun {"18446744073709551615", 10},
438*4882a593Smuzhiyun {"18446744073709551616", 10},
439*4882a593Smuzhiyun {"18446744073709551617", 10},
440*4882a593Smuzhiyun };
441*4882a593Smuzhiyun TEST_FAIL(kstrtou32, u32, "%u", test_u32_fail);
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun
test_kstrtos32_ok(void)444*4882a593Smuzhiyun static void __init test_kstrtos32_ok(void)
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun DECLARE_TEST_OK(s32, struct test_s32);
447*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_s32, test_s32_ok) = {
448*4882a593Smuzhiyun {"-128", 10, -128},
449*4882a593Smuzhiyun {"-127", 10, -127},
450*4882a593Smuzhiyun {"-1", 10, -1},
451*4882a593Smuzhiyun {"0", 10, 0},
452*4882a593Smuzhiyun {"1", 10, 1},
453*4882a593Smuzhiyun {"126", 10, 126},
454*4882a593Smuzhiyun {"127", 10, 127},
455*4882a593Smuzhiyun {"128", 10, 128},
456*4882a593Smuzhiyun {"129", 10, 129},
457*4882a593Smuzhiyun {"254", 10, 254},
458*4882a593Smuzhiyun {"255", 10, 255},
459*4882a593Smuzhiyun {"256", 10, 256},
460*4882a593Smuzhiyun {"257", 10, 257},
461*4882a593Smuzhiyun {"32766", 10, 32766},
462*4882a593Smuzhiyun {"32767", 10, 32767},
463*4882a593Smuzhiyun {"32768", 10, 32768},
464*4882a593Smuzhiyun {"32769", 10, 32769},
465*4882a593Smuzhiyun {"65534", 10, 65534},
466*4882a593Smuzhiyun {"65535", 10, 65535},
467*4882a593Smuzhiyun {"65536", 10, 65536},
468*4882a593Smuzhiyun {"65537", 10, 65537},
469*4882a593Smuzhiyun {"2147483646", 10, 2147483646},
470*4882a593Smuzhiyun {"2147483647", 10, 2147483647},
471*4882a593Smuzhiyun };
472*4882a593Smuzhiyun TEST_OK(kstrtos32, s32, "%d", test_s32_ok);
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun
test_kstrtos32_fail(void)475*4882a593Smuzhiyun static void __init test_kstrtos32_fail(void)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_s32_fail) = {
478*4882a593Smuzhiyun {"2147483648", 10},
479*4882a593Smuzhiyun {"2147483649", 10},
480*4882a593Smuzhiyun {"4294967294", 10},
481*4882a593Smuzhiyun {"4294967295", 10},
482*4882a593Smuzhiyun {"4294967296", 10},
483*4882a593Smuzhiyun {"4294967297", 10},
484*4882a593Smuzhiyun {"9223372036854775806", 10},
485*4882a593Smuzhiyun {"9223372036854775807", 10},
486*4882a593Smuzhiyun {"9223372036854775808", 10},
487*4882a593Smuzhiyun {"9223372036854775809", 10},
488*4882a593Smuzhiyun {"18446744073709551614", 10},
489*4882a593Smuzhiyun {"18446744073709551615", 10},
490*4882a593Smuzhiyun {"18446744073709551616", 10},
491*4882a593Smuzhiyun {"18446744073709551617", 10},
492*4882a593Smuzhiyun };
493*4882a593Smuzhiyun TEST_FAIL(kstrtos32, s32, "%d", test_s32_fail);
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun
test_kstrtou16_ok(void)496*4882a593Smuzhiyun static void __init test_kstrtou16_ok(void)
497*4882a593Smuzhiyun {
498*4882a593Smuzhiyun DECLARE_TEST_OK(u16, struct test_u16);
499*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_u16, test_u16_ok) = {
500*4882a593Smuzhiyun {"0", 10, 0},
501*4882a593Smuzhiyun {"1", 10, 1},
502*4882a593Smuzhiyun {"126", 10, 126},
503*4882a593Smuzhiyun {"127", 10, 127},
504*4882a593Smuzhiyun {"128", 10, 128},
505*4882a593Smuzhiyun {"129", 10, 129},
506*4882a593Smuzhiyun {"254", 10, 254},
507*4882a593Smuzhiyun {"255", 10, 255},
508*4882a593Smuzhiyun {"256", 10, 256},
509*4882a593Smuzhiyun {"257", 10, 257},
510*4882a593Smuzhiyun {"32766", 10, 32766},
511*4882a593Smuzhiyun {"32767", 10, 32767},
512*4882a593Smuzhiyun {"32768", 10, 32768},
513*4882a593Smuzhiyun {"32769", 10, 32769},
514*4882a593Smuzhiyun {"65534", 10, 65534},
515*4882a593Smuzhiyun {"65535", 10, 65535},
516*4882a593Smuzhiyun };
517*4882a593Smuzhiyun TEST_OK(kstrtou16, u16, "%hu", test_u16_ok);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
test_kstrtou16_fail(void)520*4882a593Smuzhiyun static void __init test_kstrtou16_fail(void)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_u16_fail) = {
523*4882a593Smuzhiyun {"-2", 10},
524*4882a593Smuzhiyun {"-1", 10},
525*4882a593Smuzhiyun {"65536", 10},
526*4882a593Smuzhiyun {"65537", 10},
527*4882a593Smuzhiyun {"2147483646", 10},
528*4882a593Smuzhiyun {"2147483647", 10},
529*4882a593Smuzhiyun {"2147483648", 10},
530*4882a593Smuzhiyun {"2147483649", 10},
531*4882a593Smuzhiyun {"4294967294", 10},
532*4882a593Smuzhiyun {"4294967295", 10},
533*4882a593Smuzhiyun {"4294967296", 10},
534*4882a593Smuzhiyun {"4294967297", 10},
535*4882a593Smuzhiyun {"9223372036854775806", 10},
536*4882a593Smuzhiyun {"9223372036854775807", 10},
537*4882a593Smuzhiyun {"9223372036854775808", 10},
538*4882a593Smuzhiyun {"9223372036854775809", 10},
539*4882a593Smuzhiyun {"18446744073709551614", 10},
540*4882a593Smuzhiyun {"18446744073709551615", 10},
541*4882a593Smuzhiyun {"18446744073709551616", 10},
542*4882a593Smuzhiyun {"18446744073709551617", 10},
543*4882a593Smuzhiyun };
544*4882a593Smuzhiyun TEST_FAIL(kstrtou16, u16, "%hu", test_u16_fail);
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun
test_kstrtos16_ok(void)547*4882a593Smuzhiyun static void __init test_kstrtos16_ok(void)
548*4882a593Smuzhiyun {
549*4882a593Smuzhiyun DECLARE_TEST_OK(s16, struct test_s16);
550*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_s16, test_s16_ok) = {
551*4882a593Smuzhiyun {"-130", 10, -130},
552*4882a593Smuzhiyun {"-129", 10, -129},
553*4882a593Smuzhiyun {"-128", 10, -128},
554*4882a593Smuzhiyun {"-127", 10, -127},
555*4882a593Smuzhiyun {"-1", 10, -1},
556*4882a593Smuzhiyun {"0", 10, 0},
557*4882a593Smuzhiyun {"1", 10, 1},
558*4882a593Smuzhiyun {"126", 10, 126},
559*4882a593Smuzhiyun {"127", 10, 127},
560*4882a593Smuzhiyun {"128", 10, 128},
561*4882a593Smuzhiyun {"129", 10, 129},
562*4882a593Smuzhiyun {"254", 10, 254},
563*4882a593Smuzhiyun {"255", 10, 255},
564*4882a593Smuzhiyun {"256", 10, 256},
565*4882a593Smuzhiyun {"257", 10, 257},
566*4882a593Smuzhiyun {"32766", 10, 32766},
567*4882a593Smuzhiyun {"32767", 10, 32767},
568*4882a593Smuzhiyun };
569*4882a593Smuzhiyun TEST_OK(kstrtos16, s16, "%hd", test_s16_ok);
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
test_kstrtos16_fail(void)572*4882a593Smuzhiyun static void __init test_kstrtos16_fail(void)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_s16_fail) = {
575*4882a593Smuzhiyun {"32768", 10},
576*4882a593Smuzhiyun {"32769", 10},
577*4882a593Smuzhiyun {"65534", 10},
578*4882a593Smuzhiyun {"65535", 10},
579*4882a593Smuzhiyun {"65536", 10},
580*4882a593Smuzhiyun {"65537", 10},
581*4882a593Smuzhiyun {"2147483646", 10},
582*4882a593Smuzhiyun {"2147483647", 10},
583*4882a593Smuzhiyun {"2147483648", 10},
584*4882a593Smuzhiyun {"2147483649", 10},
585*4882a593Smuzhiyun {"4294967294", 10},
586*4882a593Smuzhiyun {"4294967295", 10},
587*4882a593Smuzhiyun {"4294967296", 10},
588*4882a593Smuzhiyun {"4294967297", 10},
589*4882a593Smuzhiyun {"9223372036854775806", 10},
590*4882a593Smuzhiyun {"9223372036854775807", 10},
591*4882a593Smuzhiyun {"9223372036854775808", 10},
592*4882a593Smuzhiyun {"9223372036854775809", 10},
593*4882a593Smuzhiyun {"18446744073709551614", 10},
594*4882a593Smuzhiyun {"18446744073709551615", 10},
595*4882a593Smuzhiyun {"18446744073709551616", 10},
596*4882a593Smuzhiyun {"18446744073709551617", 10},
597*4882a593Smuzhiyun };
598*4882a593Smuzhiyun TEST_FAIL(kstrtos16, s16, "%hd", test_s16_fail);
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun
test_kstrtou8_ok(void)601*4882a593Smuzhiyun static void __init test_kstrtou8_ok(void)
602*4882a593Smuzhiyun {
603*4882a593Smuzhiyun DECLARE_TEST_OK(u8, struct test_u8);
604*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_u8, test_u8_ok) = {
605*4882a593Smuzhiyun {"0", 10, 0},
606*4882a593Smuzhiyun {"1", 10, 1},
607*4882a593Smuzhiyun {"126", 10, 126},
608*4882a593Smuzhiyun {"127", 10, 127},
609*4882a593Smuzhiyun {"128", 10, 128},
610*4882a593Smuzhiyun {"129", 10, 129},
611*4882a593Smuzhiyun {"254", 10, 254},
612*4882a593Smuzhiyun {"255", 10, 255},
613*4882a593Smuzhiyun };
614*4882a593Smuzhiyun TEST_OK(kstrtou8, u8, "%hhu", test_u8_ok);
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun
test_kstrtou8_fail(void)617*4882a593Smuzhiyun static void __init test_kstrtou8_fail(void)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_u8_fail) = {
620*4882a593Smuzhiyun {"-2", 10},
621*4882a593Smuzhiyun {"-1", 10},
622*4882a593Smuzhiyun {"256", 10},
623*4882a593Smuzhiyun {"257", 10},
624*4882a593Smuzhiyun {"32766", 10},
625*4882a593Smuzhiyun {"32767", 10},
626*4882a593Smuzhiyun {"32768", 10},
627*4882a593Smuzhiyun {"32769", 10},
628*4882a593Smuzhiyun {"65534", 10},
629*4882a593Smuzhiyun {"65535", 10},
630*4882a593Smuzhiyun {"65536", 10},
631*4882a593Smuzhiyun {"65537", 10},
632*4882a593Smuzhiyun {"2147483646", 10},
633*4882a593Smuzhiyun {"2147483647", 10},
634*4882a593Smuzhiyun {"2147483648", 10},
635*4882a593Smuzhiyun {"2147483649", 10},
636*4882a593Smuzhiyun {"4294967294", 10},
637*4882a593Smuzhiyun {"4294967295", 10},
638*4882a593Smuzhiyun {"4294967296", 10},
639*4882a593Smuzhiyun {"4294967297", 10},
640*4882a593Smuzhiyun {"9223372036854775806", 10},
641*4882a593Smuzhiyun {"9223372036854775807", 10},
642*4882a593Smuzhiyun {"9223372036854775808", 10},
643*4882a593Smuzhiyun {"9223372036854775809", 10},
644*4882a593Smuzhiyun {"18446744073709551614", 10},
645*4882a593Smuzhiyun {"18446744073709551615", 10},
646*4882a593Smuzhiyun {"18446744073709551616", 10},
647*4882a593Smuzhiyun {"18446744073709551617", 10},
648*4882a593Smuzhiyun };
649*4882a593Smuzhiyun TEST_FAIL(kstrtou8, u8, "%hhu", test_u8_fail);
650*4882a593Smuzhiyun }
651*4882a593Smuzhiyun
test_kstrtos8_ok(void)652*4882a593Smuzhiyun static void __init test_kstrtos8_ok(void)
653*4882a593Smuzhiyun {
654*4882a593Smuzhiyun DECLARE_TEST_OK(s8, struct test_s8);
655*4882a593Smuzhiyun static DEFINE_TEST_OK(struct test_s8, test_s8_ok) = {
656*4882a593Smuzhiyun {"-128", 10, -128},
657*4882a593Smuzhiyun {"-127", 10, -127},
658*4882a593Smuzhiyun {"-1", 10, -1},
659*4882a593Smuzhiyun {"0", 10, 0},
660*4882a593Smuzhiyun {"1", 10, 1},
661*4882a593Smuzhiyun {"126", 10, 126},
662*4882a593Smuzhiyun {"127", 10, 127},
663*4882a593Smuzhiyun };
664*4882a593Smuzhiyun TEST_OK(kstrtos8, s8, "%hhd", test_s8_ok);
665*4882a593Smuzhiyun }
666*4882a593Smuzhiyun
test_kstrtos8_fail(void)667*4882a593Smuzhiyun static void __init test_kstrtos8_fail(void)
668*4882a593Smuzhiyun {
669*4882a593Smuzhiyun static DEFINE_TEST_FAIL(test_s8_fail) = {
670*4882a593Smuzhiyun {"-130", 10},
671*4882a593Smuzhiyun {"-129", 10},
672*4882a593Smuzhiyun {"128", 10},
673*4882a593Smuzhiyun {"129", 10},
674*4882a593Smuzhiyun {"254", 10},
675*4882a593Smuzhiyun {"255", 10},
676*4882a593Smuzhiyun {"256", 10},
677*4882a593Smuzhiyun {"257", 10},
678*4882a593Smuzhiyun {"32766", 10},
679*4882a593Smuzhiyun {"32767", 10},
680*4882a593Smuzhiyun {"32768", 10},
681*4882a593Smuzhiyun {"32769", 10},
682*4882a593Smuzhiyun {"65534", 10},
683*4882a593Smuzhiyun {"65535", 10},
684*4882a593Smuzhiyun {"65536", 10},
685*4882a593Smuzhiyun {"65537", 10},
686*4882a593Smuzhiyun {"2147483646", 10},
687*4882a593Smuzhiyun {"2147483647", 10},
688*4882a593Smuzhiyun {"2147483648", 10},
689*4882a593Smuzhiyun {"2147483649", 10},
690*4882a593Smuzhiyun {"4294967294", 10},
691*4882a593Smuzhiyun {"4294967295", 10},
692*4882a593Smuzhiyun {"4294967296", 10},
693*4882a593Smuzhiyun {"4294967297", 10},
694*4882a593Smuzhiyun {"9223372036854775806", 10},
695*4882a593Smuzhiyun {"9223372036854775807", 10},
696*4882a593Smuzhiyun {"9223372036854775808", 10},
697*4882a593Smuzhiyun {"9223372036854775809", 10},
698*4882a593Smuzhiyun {"18446744073709551614", 10},
699*4882a593Smuzhiyun {"18446744073709551615", 10},
700*4882a593Smuzhiyun {"18446744073709551616", 10},
701*4882a593Smuzhiyun {"18446744073709551617", 10},
702*4882a593Smuzhiyun };
703*4882a593Smuzhiyun TEST_FAIL(kstrtos8, s8, "%hhd", test_s8_fail);
704*4882a593Smuzhiyun }
705*4882a593Smuzhiyun
test_kstrtox_init(void)706*4882a593Smuzhiyun static int __init test_kstrtox_init(void)
707*4882a593Smuzhiyun {
708*4882a593Smuzhiyun test_kstrtoull_ok();
709*4882a593Smuzhiyun test_kstrtoull_fail();
710*4882a593Smuzhiyun test_kstrtoll_ok();
711*4882a593Smuzhiyun test_kstrtoll_fail();
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun test_kstrtou64_ok();
714*4882a593Smuzhiyun test_kstrtou64_fail();
715*4882a593Smuzhiyun test_kstrtos64_ok();
716*4882a593Smuzhiyun test_kstrtos64_fail();
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun test_kstrtou32_ok();
719*4882a593Smuzhiyun test_kstrtou32_fail();
720*4882a593Smuzhiyun test_kstrtos32_ok();
721*4882a593Smuzhiyun test_kstrtos32_fail();
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun test_kstrtou16_ok();
724*4882a593Smuzhiyun test_kstrtou16_fail();
725*4882a593Smuzhiyun test_kstrtos16_ok();
726*4882a593Smuzhiyun test_kstrtos16_fail();
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun test_kstrtou8_ok();
729*4882a593Smuzhiyun test_kstrtou8_fail();
730*4882a593Smuzhiyun test_kstrtos8_ok();
731*4882a593Smuzhiyun test_kstrtos8_fail();
732*4882a593Smuzhiyun return -EINVAL;
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun module_init(test_kstrtox_init);
735*4882a593Smuzhiyun MODULE_LICENSE("Dual BSD/GPL");
736