forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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: 03270c1 ("lib/string.c: add testcases for memset16/32/64") Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Geert Uytterhoeven <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Shuah Khan <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
4 changed files
with
143 additions
and
142 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
#include <linux/module.h> | ||
#include <linux/printk.h> | ||
#include <linux/slab.h> | ||
#include <linux/string.h> | ||
|
||
static __init int memset16_selftest(void) | ||
{ | ||
unsigned i, j, k; | ||
u16 v, *p; | ||
|
||
p = kmalloc(256 * 2 * 2, GFP_KERNEL); | ||
if (!p) | ||
return -1; | ||
|
||
for (i = 0; i < 256; i++) { | ||
for (j = 0; j < 256; j++) { | ||
memset(p, 0xa1, 256 * 2 * sizeof(v)); | ||
memset16(p + i, 0xb1b2, j); | ||
for (k = 0; k < 512; k++) { | ||
v = p[k]; | ||
if (k < i) { | ||
if (v != 0xa1a1) | ||
goto fail; | ||
} else if (k < i + j) { | ||
if (v != 0xb1b2) | ||
goto fail; | ||
} else { | ||
if (v != 0xa1a1) | ||
goto fail; | ||
} | ||
} | ||
} | ||
} | ||
|
||
fail: | ||
kfree(p); | ||
if (i < 256) | ||
return (i << 24) | (j << 16) | k; | ||
return 0; | ||
} | ||
|
||
static __init int memset32_selftest(void) | ||
{ | ||
unsigned i, j, k; | ||
u32 v, *p; | ||
|
||
p = kmalloc(256 * 2 * 4, GFP_KERNEL); | ||
if (!p) | ||
return -1; | ||
|
||
for (i = 0; i < 256; i++) { | ||
for (j = 0; j < 256; j++) { | ||
memset(p, 0xa1, 256 * 2 * sizeof(v)); | ||
memset32(p + i, 0xb1b2b3b4, j); | ||
for (k = 0; k < 512; k++) { | ||
v = p[k]; | ||
if (k < i) { | ||
if (v != 0xa1a1a1a1) | ||
goto fail; | ||
} else if (k < i + j) { | ||
if (v != 0xb1b2b3b4) | ||
goto fail; | ||
} else { | ||
if (v != 0xa1a1a1a1) | ||
goto fail; | ||
} | ||
} | ||
} | ||
} | ||
|
||
fail: | ||
kfree(p); | ||
if (i < 256) | ||
return (i << 24) | (j << 16) | k; | ||
return 0; | ||
} | ||
|
||
static __init int memset64_selftest(void) | ||
{ | ||
unsigned i, j, k; | ||
u64 v, *p; | ||
|
||
p = kmalloc(256 * 2 * 8, GFP_KERNEL); | ||
if (!p) | ||
return -1; | ||
|
||
for (i = 0; i < 256; i++) { | ||
for (j = 0; j < 256; j++) { | ||
memset(p, 0xa1, 256 * 2 * sizeof(v)); | ||
memset64(p + i, 0xb1b2b3b4b5b6b7b8ULL, j); | ||
for (k = 0; k < 512; k++) { | ||
v = p[k]; | ||
if (k < i) { | ||
if (v != 0xa1a1a1a1a1a1a1a1ULL) | ||
goto fail; | ||
} else if (k < i + j) { | ||
if (v != 0xb1b2b3b4b5b6b7b8ULL) | ||
goto fail; | ||
} else { | ||
if (v != 0xa1a1a1a1a1a1a1a1ULL) | ||
goto fail; | ||
} | ||
} | ||
} | ||
} | ||
|
||
fail: | ||
kfree(p); | ||
if (i < 256) | ||
return (i << 24) | (j << 16) | k; | ||
return 0; | ||
} | ||
|
||
static __init int string_selftest_init(void) | ||
{ | ||
int test, subtest; | ||
|
||
test = 1; | ||
subtest = memset16_selftest(); | ||
if (subtest) | ||
goto fail; | ||
|
||
test = 2; | ||
subtest = memset32_selftest(); | ||
if (subtest) | ||
goto fail; | ||
|
||
test = 3; | ||
subtest = memset64_selftest(); | ||
if (subtest) | ||
goto fail; | ||
|
||
pr_info("String selftests succeeded\n"); | ||
return 0; | ||
fail: | ||
pr_crit("String selftest failure %d.%08x\n", test, subtest); | ||
return 0; | ||
} | ||
|
||
module_init(string_selftest_init); | ||
MODULE_LICENSE("GPL v2"); |