diff options
author | Geert Uytterhoeven <geert@linux-m68k.org> | 2017-11-17 18:27:56 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-17 19:10:01 -0500 |
commit | d6b28e0996962aeadd3777ae565ae03dd5c59f18 (patch) | |
tree | 83cde532b1500223778ddebbb84447418a140c3b /lib/string.c | |
parent | f5bba9d11a256ad2a1c2f8e7fc6aabe6416b7890 (diff) |
lib: add module support to string tests
Extract the string test code into its own source file, to allow
compiling it either to a loadable module, or built into the kernel.
Fixes: 03270c13c5ffaa6a ("lib/string.c: add testcases for memset16/32/64")
Link: http://lkml.kernel.org/r/1505397744-3387-1-git-send-email-geert@linux-m68k.org
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Matthew Wilcox <mawilcox@microsoft.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/string.c')
-rw-r--r-- | lib/string.c | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/lib/string.c b/lib/string.c index 5e8d410a93df..64a9e33f1daa 100644 --- a/lib/string.c +++ b/lib/string.c | |||
@@ -1052,144 +1052,3 @@ void fortify_panic(const char *name) | |||
1052 | BUG(); | 1052 | BUG(); |
1053 | } | 1053 | } |
1054 | EXPORT_SYMBOL(fortify_panic); | 1054 | EXPORT_SYMBOL(fortify_panic); |
1055 | |||
1056 | #ifdef CONFIG_STRING_SELFTEST | ||
1057 | #include <linux/slab.h> | ||
1058 | #include <linux/module.h> | ||
1059 | |||
1060 | static __init int memset16_selftest(void) | ||
1061 | { | ||
1062 | unsigned i, j, k; | ||
1063 | u16 v, *p; | ||
1064 | |||
1065 | p = kmalloc(256 * 2 * 2, GFP_KERNEL); | ||
1066 | if (!p) | ||
1067 | return -1; | ||
1068 | |||
1069 | for (i = 0; i < 256; i++) { | ||
1070 | for (j = 0; j < 256; j++) { | ||
1071 | memset(p, 0xa1, 256 * 2 * sizeof(v)); | ||
1072 | memset16(p + i, 0xb1b2, j); | ||
1073 | for (k = 0; k < 512; k++) { | ||
1074 | v = p[k]; | ||
1075 | if (k < i) { | ||
1076 | if (v != 0xa1a1) | ||
1077 | goto fail; | ||
1078 | } else if (k < i + j) { | ||
1079 | if (v != 0xb1b2) | ||
1080 | goto fail; | ||
1081 | } else { | ||
1082 | if (v != 0xa1a1) | ||
1083 | goto fail; | ||
1084 | } | ||
1085 | } | ||
1086 | } | ||
1087 | } | ||
1088 | |||
1089 | fail: | ||
1090 | kfree(p); | ||
1091 | if (i < 256) | ||
1092 | return (i << 24) | (j << 16) | k; | ||
1093 | return 0; | ||
1094 | } | ||
1095 | |||
1096 | static __init int memset32_selftest(void) | ||
1097 | { | ||
1098 | unsigned i, j, k; | ||
1099 | u32 v, *p; | ||
1100 | |||
1101 | p = kmalloc(256 * 2 * 4, GFP_KERNEL); | ||
1102 | if (!p) | ||
1103 | return -1; | ||
1104 | |||
1105 | for (i = 0; i < 256; i++) { | ||
1106 | for (j = 0; j < 256; j++) { | ||
1107 | memset(p, 0xa1, 256 * 2 * sizeof(v)); | ||
1108 | memset32(p + i, 0xb1b2b3b4, j); | ||
1109 | for (k = 0; k < 512; k++) { | ||
1110 | v = p[k]; | ||
1111 | if (k < i) { | ||
1112 | if (v != 0xa1a1a1a1) | ||
1113 | goto fail; | ||
1114 | } else if (k < i + j) { | ||
1115 | if (v != 0xb1b2b3b4) | ||
1116 | goto fail; | ||
1117 | } else { | ||
1118 | if (v != 0xa1a1a1a1) | ||
1119 | goto fail; | ||
1120 | } | ||
1121 | } | ||
1122 | } | ||
1123 | } | ||
1124 | |||
1125 | fail: | ||
1126 | kfree(p); | ||
1127 | if (i < 256) | ||
1128 | return (i << 24) | (j << 16) | k; | ||
1129 | return 0; | ||
1130 | } | ||
1131 | |||
1132 | static __init int memset64_selftest(void) | ||
1133 | { | ||
1134 | unsigned i, j, k; | ||
1135 | u64 v, *p; | ||
1136 | |||
1137 | p = kmalloc(256 * 2 * 8, GFP_KERNEL); | ||
1138 | if (!p) | ||
1139 | return -1; | ||
1140 | |||
1141 | for (i = 0; i < 256; i++) { | ||
1142 | for (j = 0; j < 256; j++) { | ||
1143 | memset(p, 0xa1, 256 * 2 * sizeof(v)); | ||
1144 | memset64(p + i, 0xb1b2b3b4b5b6b7b8ULL, j); | ||
1145 | for (k = 0; k < 512; k++) { | ||
1146 | v = p[k]; | ||
1147 | if (k < i) { | ||
1148 | if (v != 0xa1a1a1a1a1a1a1a1ULL) | ||
1149 | goto fail; | ||
1150 | } else if (k < i + j) { | ||
1151 | if (v != 0xb1b2b3b4b5b6b7b8ULL) | ||
1152 | goto fail; | ||
1153 | } else { | ||
1154 | if (v != 0xa1a1a1a1a1a1a1a1ULL) | ||
1155 | goto fail; | ||
1156 | } | ||
1157 | } | ||
1158 | } | ||
1159 | } | ||
1160 | |||
1161 | fail: | ||
1162 | kfree(p); | ||
1163 | if (i < 256) | ||
1164 | return (i << 24) | (j << 16) | k; | ||
1165 | return 0; | ||
1166 | } | ||
1167 | |||
1168 | static __init int string_selftest_init(void) | ||
1169 | { | ||
1170 | int test, subtest; | ||
1171 | |||
1172 | test = 1; | ||
1173 | subtest = memset16_selftest(); | ||
1174 | if (subtest) | ||
1175 | goto fail; | ||
1176 | |||
1177 | test = 2; | ||
1178 | subtest = memset32_selftest(); | ||
1179 | if (subtest) | ||
1180 | goto fail; | ||
1181 | |||
1182 | test = 3; | ||
1183 | subtest = memset64_selftest(); | ||
1184 | if (subtest) | ||
1185 | goto fail; | ||
1186 | |||
1187 | pr_info("String selftests succeeded\n"); | ||
1188 | return 0; | ||
1189 | fail: | ||
1190 | pr_crit("String selftest failure %d.%08x\n", test, subtest); | ||
1191 | return 0; | ||
1192 | } | ||
1193 | |||
1194 | module_init(string_selftest_init); | ||
1195 | #endif /* CONFIG_STRING_SELFTEST */ | ||