Skip to content

Commit

Permalink
lib: add module support to string tests
Browse files Browse the repository at this point in the history
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
geertu authored and torvalds committed Nov 18, 2017
1 parent f5bba9d commit d6b28e0
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 142 deletions.
2 changes: 1 addition & 1 deletion lib/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,7 @@ config PRIME_NUMBERS
tristate

config STRING_SELFTEST
bool "Test string functions"
tristate "Test string functions"

endmenu

Expand Down
1 change: 1 addition & 0 deletions lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ obj-y += bcd.o div64.o sort.o parser.o debug_locks.o random32.o \
bsearch.o find_bit.o llist.o memweight.o kfifo.o \
percpu-refcount.o percpu_ida.o rhashtable.o reciprocal_div.o \
once.o refcount.o usercopy.o errseq.o
obj-$(CONFIG_STRING_SELFTEST) += test_string.o
obj-y += string_helpers.o
obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o
obj-y += hexdump.o
Expand Down
141 changes: 0 additions & 141 deletions lib/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -1052,144 +1052,3 @@ void fortify_panic(const char *name)
BUG();
}
EXPORT_SYMBOL(fortify_panic);

#ifdef CONFIG_STRING_SELFTEST
#include <linux/slab.h>
#include <linux/module.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);
#endif /* CONFIG_STRING_SELFTEST */
141 changes: 141 additions & 0 deletions lib/test_string.c
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");

0 comments on commit d6b28e0

Please sign in to comment.