linux/lib/test_string.c
<<
>>
Prefs
   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
   7static __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
  36fail:
  37        kfree(p);
  38        if (i < 256)
  39                return (i << 24) | (j << 16) | k;
  40        return 0;
  41}
  42
  43static __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
  72fail:
  73        kfree(p);
  74        if (i < 256)
  75                return (i << 24) | (j << 16) | k;
  76        return 0;
  77}
  78
  79static __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
 108fail:
 109        kfree(p);
 110        if (i < 256)
 111                return (i << 24) | (j << 16) | k;
 112        return 0;
 113}
 114
 115static __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;
 136fail:
 137        pr_crit("String selftest failure %d.%08x\n", test, subtest);
 138        return 0;
 139}
 140
 141module_init(string_selftest_init);
 142MODULE_LICENSE("GPL v2");
 143