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