VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
09c434b8a0047 (Thomas Gleixner    2019-05-19 13:08:20 +0100   1) // SPDX-License-Identifier: GPL-2.0-only
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   2) #include <linux/module.h>
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   3) #include <linux/printk.h>
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   4) #include <linux/slab.h>
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   5) #include <linux/string.h>
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   6) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   7) static __init int memset16_selftest(void)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   8) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800   9) 	unsigned i, j, k;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  10) 	u16 v, *p;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  11) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  12) 	p = kmalloc(256 * 2 * 2, GFP_KERNEL);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  13) 	if (!p)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  14) 		return -1;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  15) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  16) 	for (i = 0; i < 256; i++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  17) 		for (j = 0; j < 256; j++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  18) 			memset(p, 0xa1, 256 * 2 * sizeof(v));
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  19) 			memset16(p + i, 0xb1b2, j);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  20) 			for (k = 0; k < 512; k++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  21) 				v = p[k];
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  22) 				if (k < i) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  23) 					if (v != 0xa1a1)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  24) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  25) 				} else if (k < i + j) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  26) 					if (v != 0xb1b2)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  27) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  28) 				} else {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  29) 					if (v != 0xa1a1)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  30) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  31) 				}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  32) 			}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  33) 		}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  34) 	}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  35) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  36) fail:
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  37) 	kfree(p);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  38) 	if (i < 256)
33d6e0ff68af7 (Peter Rosin        2019-07-16 16:27:18 -0700  39) 		return (i << 24) | (j << 16) | k | 0x8000;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  40) 	return 0;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  41) }
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  42) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  43) static __init int memset32_selftest(void)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  44) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  45) 	unsigned i, j, k;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  46) 	u32 v, *p;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  47) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  48) 	p = kmalloc(256 * 2 * 4, GFP_KERNEL);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  49) 	if (!p)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  50) 		return -1;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  51) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  52) 	for (i = 0; i < 256; i++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  53) 		for (j = 0; j < 256; j++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  54) 			memset(p, 0xa1, 256 * 2 * sizeof(v));
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  55) 			memset32(p + i, 0xb1b2b3b4, j);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  56) 			for (k = 0; k < 512; k++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  57) 				v = p[k];
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  58) 				if (k < i) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  59) 					if (v != 0xa1a1a1a1)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  60) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  61) 				} else if (k < i + j) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  62) 					if (v != 0xb1b2b3b4)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  63) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  64) 				} else {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  65) 					if (v != 0xa1a1a1a1)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  66) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  67) 				}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  68) 			}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  69) 		}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  70) 	}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  71) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  72) fail:
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  73) 	kfree(p);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  74) 	if (i < 256)
33d6e0ff68af7 (Peter Rosin        2019-07-16 16:27:18 -0700  75) 		return (i << 24) | (j << 16) | k | 0x8000;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  76) 	return 0;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  77) }
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  78) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  79) static __init int memset64_selftest(void)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  80) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  81) 	unsigned i, j, k;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  82) 	u64 v, *p;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  83) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  84) 	p = kmalloc(256 * 2 * 8, GFP_KERNEL);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  85) 	if (!p)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  86) 		return -1;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  87) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  88) 	for (i = 0; i < 256; i++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  89) 		for (j = 0; j < 256; j++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  90) 			memset(p, 0xa1, 256 * 2 * sizeof(v));
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  91) 			memset64(p + i, 0xb1b2b3b4b5b6b7b8ULL, j);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  92) 			for (k = 0; k < 512; k++) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  93) 				v = p[k];
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  94) 				if (k < i) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  95) 					if (v != 0xa1a1a1a1a1a1a1a1ULL)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  96) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  97) 				} else if (k < i + j) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  98) 					if (v != 0xb1b2b3b4b5b6b7b8ULL)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800  99) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 100) 				} else {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 101) 					if (v != 0xa1a1a1a1a1a1a1a1ULL)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 102) 						goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 103) 				}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 104) 			}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 105) 		}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 106) 	}
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 107) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 108) fail:
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 109) 	kfree(p);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 110) 	if (i < 256)
33d6e0ff68af7 (Peter Rosin        2019-07-16 16:27:18 -0700 111) 		return (i << 24) | (j << 16) | k | 0x8000;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 112) 	return 0;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 113) }
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 114) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 115) static __init int strchr_selftest(void)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 116) {
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 117) 	const char *test_string = "abcdefghijkl";
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 118) 	const char *empty_string = "";
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 119) 	char *result;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 120) 	int i;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 121) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 122) 	for (i = 0; i < strlen(test_string) + 1; i++) {
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 123) 		result = strchr(test_string, test_string[i]);
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 124) 		if (result - test_string != i)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 125) 			return i + 'a';
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 126) 	}
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 127) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 128) 	result = strchr(empty_string, '\0');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 129) 	if (result != empty_string)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 130) 		return 0x101;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 131) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 132) 	result = strchr(empty_string, 'a');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 133) 	if (result)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 134) 		return 0x102;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 135) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 136) 	result = strchr(test_string, 'z');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 137) 	if (result)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 138) 		return 0x103;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 139) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 140) 	return 0;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 141) }
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 142) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 143) static __init int strnchr_selftest(void)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 144) {
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 145) 	const char *test_string = "abcdefghijkl";
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 146) 	const char *empty_string = "";
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 147) 	char *result;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 148) 	int i, j;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 149) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 150) 	for (i = 0; i < strlen(test_string) + 1; i++) {
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 151) 		for (j = 0; j < strlen(test_string) + 2; j++) {
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 152) 			result = strnchr(test_string, j, test_string[i]);
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 153) 			if (j <= i) {
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 154) 				if (!result)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 155) 					continue;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 156) 				return ((i + 'a') << 8) | j;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 157) 			}
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 158) 			if (result - test_string != i)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 159) 				return ((i + 'a') << 8) | j;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 160) 		}
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 161) 	}
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 162) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 163) 	result = strnchr(empty_string, 0, '\0');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 164) 	if (result)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 165) 		return 0x10001;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 166) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 167) 	result = strnchr(empty_string, 1, '\0');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 168) 	if (result != empty_string)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 169) 		return 0x10002;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 170) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 171) 	result = strnchr(empty_string, 1, 'a');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 172) 	if (result)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 173) 		return 0x10003;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 174) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 175) 	result = strnchr(NULL, 0, '\0');
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 176) 	if (result)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 177) 		return 0x10004;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 178) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 179) 	return 0;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 180) }
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 181) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 182) static __init int string_selftest_init(void)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 183) {
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 184) 	int test, subtest;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 185) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 186) 	test = 1;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 187) 	subtest = memset16_selftest();
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 188) 	if (subtest)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 189) 		goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 190) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 191) 	test = 2;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 192) 	subtest = memset32_selftest();
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 193) 	if (subtest)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 194) 		goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 195) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 196) 	test = 3;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 197) 	subtest = memset64_selftest();
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 198) 	if (subtest)
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 199) 		goto fail;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 200) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 201) 	test = 4;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 202) 	subtest = strchr_selftest();
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 203) 	if (subtest)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 204) 		goto fail;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 205) 
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 206) 	test = 5;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 207) 	subtest = strnchr_selftest();
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 208) 	if (subtest)
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 209) 		goto fail;
d1a5dc5e6accb (Peter Rosin        2019-07-16 16:27:21 -0700 210) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 211) 	pr_info("String selftests succeeded\n");
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 212) 	return 0;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 213) fail:
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 214) 	pr_crit("String selftest failure %d.%08x\n", test, subtest);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 215) 	return 0;
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 216) }
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 217) 
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 218) module_init(string_selftest_init);
d6b28e0996962 (Geert Uytterhoeven 2017-11-17 15:27:56 -0800 219) MODULE_LICENSE("GPL v2");