xref: /openbmc/linux/lib/test_string.c (revision 59bd9ded)
1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/module.h>
3 #include <linux/printk.h>
4 #include <linux/slab.h>
5 #include <linux/string.h>
6 
7 static __init int memset16_selftest(void)
8 {
9 	unsigned i, j, k;
10 	u16 v, *p;
11 
12 	p = kmalloc(256 * 2 * 2, GFP_KERNEL);
13 	if (!p)
14 		return -1;
15 
16 	for (i = 0; i < 256; i++) {
17 		for (j = 0; j < 256; j++) {
18 			memset(p, 0xa1, 256 * 2 * sizeof(v));
19 			memset16(p + i, 0xb1b2, j);
20 			for (k = 0; k < 512; k++) {
21 				v = p[k];
22 				if (k < i) {
23 					if (v != 0xa1a1)
24 						goto fail;
25 				} else if (k < i + j) {
26 					if (v != 0xb1b2)
27 						goto fail;
28 				} else {
29 					if (v != 0xa1a1)
30 						goto fail;
31 				}
32 			}
33 		}
34 	}
35 
36 fail:
37 	kfree(p);
38 	if (i < 256)
39 		return (i << 24) | (j << 16) | k;
40 	return 0;
41 }
42 
43 static __init int memset32_selftest(void)
44 {
45 	unsigned i, j, k;
46 	u32 v, *p;
47 
48 	p = kmalloc(256 * 2 * 4, GFP_KERNEL);
49 	if (!p)
50 		return -1;
51 
52 	for (i = 0; i < 256; i++) {
53 		for (j = 0; j < 256; j++) {
54 			memset(p, 0xa1, 256 * 2 * sizeof(v));
55 			memset32(p + i, 0xb1b2b3b4, j);
56 			for (k = 0; k < 512; k++) {
57 				v = p[k];
58 				if (k < i) {
59 					if (v != 0xa1a1a1a1)
60 						goto fail;
61 				} else if (k < i + j) {
62 					if (v != 0xb1b2b3b4)
63 						goto fail;
64 				} else {
65 					if (v != 0xa1a1a1a1)
66 						goto fail;
67 				}
68 			}
69 		}
70 	}
71 
72 fail:
73 	kfree(p);
74 	if (i < 256)
75 		return (i << 24) | (j << 16) | k;
76 	return 0;
77 }
78 
79 static __init int memset64_selftest(void)
80 {
81 	unsigned i, j, k;
82 	u64 v, *p;
83 
84 	p = kmalloc(256 * 2 * 8, GFP_KERNEL);
85 	if (!p)
86 		return -1;
87 
88 	for (i = 0; i < 256; i++) {
89 		for (j = 0; j < 256; j++) {
90 			memset(p, 0xa1, 256 * 2 * sizeof(v));
91 			memset64(p + i, 0xb1b2b3b4b5b6b7b8ULL, j);
92 			for (k = 0; k < 512; k++) {
93 				v = p[k];
94 				if (k < i) {
95 					if (v != 0xa1a1a1a1a1a1a1a1ULL)
96 						goto fail;
97 				} else if (k < i + j) {
98 					if (v != 0xb1b2b3b4b5b6b7b8ULL)
99 						goto fail;
100 				} else {
101 					if (v != 0xa1a1a1a1a1a1a1a1ULL)
102 						goto fail;
103 				}
104 			}
105 		}
106 	}
107 
108 fail:
109 	kfree(p);
110 	if (i < 256)
111 		return (i << 24) | (j << 16) | k;
112 	return 0;
113 }
114 
115 static __init int string_selftest_init(void)
116 {
117 	int test, subtest;
118 
119 	test = 1;
120 	subtest = memset16_selftest();
121 	if (subtest)
122 		goto fail;
123 
124 	test = 2;
125 	subtest = memset32_selftest();
126 	if (subtest)
127 		goto fail;
128 
129 	test = 3;
130 	subtest = memset64_selftest();
131 	if (subtest)
132 		goto fail;
133 
134 	pr_info("String selftests succeeded\n");
135 	return 0;
136 fail:
137 	pr_crit("String selftest failure %d.%08x\n", test, subtest);
138 	return 0;
139 }
140 
141 module_init(string_selftest_init);
142 MODULE_LICENSE("GPL v2");
143