blob: bf8def01ed20458f18d46d128be222bbe98feb84 [file] [log] [blame]
Thomas Gleixner09c434b2019-05-19 13:08:20 +01001// SPDX-License-Identifier: GPL-2.0-only
Geert Uytterhoevend6b28e02017-11-17 15:27:56 -08002#include <linux/module.h>
3#include <linux/printk.h>
4#include <linux/slab.h>
5#include <linux/string.h>
6
7static __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
36fail:
37 kfree(p);
38 if (i < 256)
39 return (i << 24) | (j << 16) | k;
40 return 0;
41}
42
43static __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
72fail:
73 kfree(p);
74 if (i < 256)
75 return (i << 24) | (j << 16) | k;
76 return 0;
77}
78
79static __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
108fail:
109 kfree(p);
110 if (i < 256)
111 return (i << 24) | (j << 16) | k;
112 return 0;
113}
114
115static __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;
136fail:
137 pr_crit("String selftest failure %d.%08x\n", test, subtest);
138 return 0;
139}
140
141module_init(string_selftest_init);
142MODULE_LICENSE("GPL v2");