Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) typedef void(*test_ubsan_fp)(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #define UBSAN_TEST(config, ...)	do {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 		pr_info("%s " __VA_ARGS__ "%s(%s=%s)\n", __func__,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 			sizeof(" " __VA_ARGS__) > 2 ? " " : "",		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 			#config, IS_ENABLED(config) ? "y" : "n");	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) static void test_ubsan_divrem_overflow(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	volatile int val = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	volatile int val2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	UBSAN_TEST(CONFIG_UBSAN_DIV_ZERO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	val /= val2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) static void test_ubsan_shift_out_of_bounds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	volatile int neg = -1, wrap = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	int val1 = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	int val2 = INT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	UBSAN_TEST(CONFIG_UBSAN_SHIFT, "negative exponent");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	val1 <<= neg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	UBSAN_TEST(CONFIG_UBSAN_SHIFT, "left overflow");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	val2 <<= wrap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) static void test_ubsan_out_of_bounds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	volatile int i = 4, j = 5, k = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	volatile char above[4] = { }; /* Protect surrounding memory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	volatile int arr[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	volatile char below[4] = { }; /* Protect surrounding memory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	above[0] = below[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	UBSAN_TEST(CONFIG_UBSAN_BOUNDS, "above");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	arr[j] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	UBSAN_TEST(CONFIG_UBSAN_BOUNDS, "below");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	arr[k] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) enum ubsan_test_enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	UBSAN_TEST_ZERO = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	UBSAN_TEST_ONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	UBSAN_TEST_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) static void test_ubsan_load_invalid_value(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	volatile char *dst, *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	bool val, val2, *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	enum ubsan_test_enum eval, eval2, *eptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	unsigned char c = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	UBSAN_TEST(CONFIG_UBSAN_BOOL, "bool");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	dst = (char *)&val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	src = &c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	*dst = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	ptr = &val2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	val2 = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	UBSAN_TEST(CONFIG_UBSAN_ENUM, "enum");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	dst = (char *)&eval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	src = &c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	*dst = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	eptr = &eval2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	eval2 = eval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) static void test_ubsan_null_ptr_deref(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	volatile int *ptr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	UBSAN_TEST(CONFIG_UBSAN_OBJECT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	val = *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) static void test_ubsan_misaligned_access(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	volatile char arr[5] __aligned(4) = {1, 2, 3, 4, 5};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	volatile int *ptr, val = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	UBSAN_TEST(CONFIG_UBSAN_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	ptr = (int *)(arr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	*ptr = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) static void test_ubsan_object_size_mismatch(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	/* "((aligned(8)))" helps this not into be misaligned for ptr-access. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	volatile int val __aligned(8) = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	volatile long long *ptr, val2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	UBSAN_TEST(CONFIG_UBSAN_OBJECT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	ptr = (long long *)&val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	val2 = *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) static const test_ubsan_fp test_ubsan_array[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	test_ubsan_shift_out_of_bounds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	test_ubsan_out_of_bounds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	test_ubsan_load_invalid_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	test_ubsan_misaligned_access,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	test_ubsan_object_size_mismatch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* Excluded because they Oops the module. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static const test_ubsan_fp skip_ubsan_array[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	test_ubsan_divrem_overflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	test_ubsan_null_ptr_deref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) static int __init test_ubsan_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	for (i = 0; i < ARRAY_SIZE(test_ubsan_array); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		test_ubsan_array[i]();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) module_init(test_ubsan_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) static void __exit test_ubsan_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	/* do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) module_exit(test_ubsan_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) MODULE_AUTHOR("Jinbum Park <jinb.park7@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) MODULE_LICENSE("GPL v2");