Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[sfrench/cifs-2.6.git] / lib / test_string.c
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");