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"); 143