]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
9a49a528 KC |
2 | #ifndef __LKDTM_H |
3 | #define __LKDTM_H | |
4 | ||
6d2e91a6 KC |
5 | #define pr_fmt(fmt) "lkdtm: " fmt |
6 | ||
7 | #include <linux/kernel.h> | |
b8661450 | 8 | |
3a3a11e6 | 9 | extern char *lkdtm_kernel_info; |
6d2e91a6 | 10 | |
5b777131 KC |
11 | #define pr_expected_config(kconfig) \ |
12 | { \ | |
13 | if (IS_ENABLED(kconfig)) \ | |
3a3a11e6 KC |
14 | pr_err("Unexpected! This %s was built with " #kconfig "=y\n", \ |
15 | lkdtm_kernel_info); \ | |
5b777131 | 16 | else \ |
3a3a11e6 KC |
17 | pr_warn("This is probably expected, since this %s was built *without* " #kconfig "=y\n", \ |
18 | lkdtm_kernel_info); \ | |
5b777131 KC |
19 | } |
20 | ||
21 | #ifndef MODULE | |
22 | int lkdtm_check_bool_cmdline(const char *param); | |
23 | #define pr_expected_config_param(kconfig, param) \ | |
24 | { \ | |
25 | if (IS_ENABLED(kconfig)) { \ | |
26 | switch (lkdtm_check_bool_cmdline(param)) { \ | |
27 | case 0: \ | |
3a3a11e6 KC |
28 | pr_warn("This is probably expected, since this %s was built with " #kconfig "=y but booted with '" param "=N'\n", \ |
29 | lkdtm_kernel_info); \ | |
5b777131 KC |
30 | break; \ |
31 | case 1: \ | |
3a3a11e6 KC |
32 | pr_err("Unexpected! This %s was built with " #kconfig "=y and booted with '" param "=Y'\n", \ |
33 | lkdtm_kernel_info); \ | |
5b777131 KC |
34 | break; \ |
35 | default: \ | |
3a3a11e6 KC |
36 | pr_err("Unexpected! This %s was built with " #kconfig "=y (and booted without '" param "' specified)\n", \ |
37 | lkdtm_kernel_info); \ | |
5b777131 KC |
38 | } \ |
39 | } else { \ | |
40 | switch (lkdtm_check_bool_cmdline(param)) { \ | |
41 | case 0: \ | |
3a3a11e6 KC |
42 | pr_warn("This is probably expected, as this %s was built *without* " #kconfig "=y and booted with '" param "=N'\n", \ |
43 | lkdtm_kernel_info); \ | |
5b777131 KC |
44 | break; \ |
45 | case 1: \ | |
3a3a11e6 KC |
46 | pr_err("Unexpected! This %s was built *without* " #kconfig "=y but booted with '" param "=Y'\n", \ |
47 | lkdtm_kernel_info); \ | |
5b777131 KC |
48 | break; \ |
49 | default: \ | |
3a3a11e6 KC |
50 | pr_err("This is probably expected, since this %s was built *without* " #kconfig "=y (and booted without '" param "' specified)\n", \ |
51 | lkdtm_kernel_info); \ | |
5b777131 KC |
52 | break; \ |
53 | } \ | |
54 | } \ | |
55 | } | |
56 | #else | |
57 | #define pr_expected_config_param(kconfig, param) pr_expected_config(kconfig) | |
58 | #endif | |
59 | ||
d58b0b1a | 60 | /* bugs.c */ |
00f496c4 KC |
61 | void __init lkdtm_bugs_init(int *recur_param); |
62 | void lkdtm_PANIC(void); | |
63 | void lkdtm_BUG(void); | |
64 | void lkdtm_WARNING(void); | |
1ee170ea | 65 | void lkdtm_WARNING_MESSAGE(void); |
00f496c4 KC |
66 | void lkdtm_EXCEPTION(void); |
67 | void lkdtm_LOOP(void); | |
24cccab4 | 68 | void lkdtm_EXHAUST_STACK(void); |
00f496c4 | 69 | void lkdtm_CORRUPT_STACK(void); |
93e78c6b | 70 | void lkdtm_CORRUPT_STACK_STRONG(void); |
68ef8735 | 71 | void lkdtm_REPORT_STACK(void); |
00f496c4 KC |
72 | void lkdtm_UNALIGNED_LOAD_STORE_WRITE(void); |
73 | void lkdtm_SOFTLOCKUP(void); | |
74 | void lkdtm_HARDLOCKUP(void); | |
75 | void lkdtm_SPINLOCKUP(void); | |
76 | void lkdtm_HUNG_TASK(void); | |
ae2e1aad KC |
77 | void lkdtm_OVERFLOW_SIGNED(void); |
78 | void lkdtm_OVERFLOW_UNSIGNED(void); | |
79 | void lkdtm_ARRAY_BOUNDS(void); | |
6819d101 KC |
80 | void lkdtm_CORRUPT_LIST_ADD(void); |
81 | void lkdtm_CORRUPT_LIST_DEL(void); | |
7b25a85c KC |
82 | void lkdtm_STACK_GUARD_PAGE_LEADING(void); |
83 | void lkdtm_STACK_GUARD_PAGE_TRAILING(void); | |
06b32fdb | 84 | void lkdtm_UNSET_SMEP(void); |
b09511c2 | 85 | void lkdtm_DOUBLE_FAULT(void); |
6cb6982f | 86 | void lkdtm_CORRUPT_PAC(void); |
00f496c4 | 87 | |
d58b0b1a | 88 | /* heap.c */ |
966fede8 KC |
89 | void __init lkdtm_heap_init(void); |
90 | void __exit lkdtm_heap_exit(void); | |
9c4f6ebc KC |
91 | void lkdtm_VMALLOC_LINEAR_OVERFLOW(void); |
92 | void lkdtm_SLAB_LINEAR_OVERFLOW(void); | |
ffc514f3 KC |
93 | void lkdtm_WRITE_AFTER_FREE(void); |
94 | void lkdtm_READ_AFTER_FREE(void); | |
95 | void lkdtm_WRITE_BUDDY_AFTER_FREE(void); | |
96 | void lkdtm_READ_BUDDY_AFTER_FREE(void); | |
37a0ca7f KC |
97 | void lkdtm_SLAB_INIT_ON_ALLOC(void); |
98 | void lkdtm_BUDDY_INIT_ON_ALLOC(void); | |
966fede8 KC |
99 | void lkdtm_SLAB_FREE_DOUBLE(void); |
100 | void lkdtm_SLAB_FREE_CROSS(void); | |
101 | void lkdtm_SLAB_FREE_PAGE(void); | |
ffc514f3 | 102 | |
d58b0b1a | 103 | /* perms.c */ |
0d9eb29b KC |
104 | void __init lkdtm_perms_init(void); |
105 | void lkdtm_WRITE_RO(void); | |
106 | void lkdtm_WRITE_RO_AFTER_INIT(void); | |
107 | void lkdtm_WRITE_KERN(void); | |
108 | void lkdtm_EXEC_DATA(void); | |
109 | void lkdtm_EXEC_STACK(void); | |
110 | void lkdtm_EXEC_KMALLOC(void); | |
111 | void lkdtm_EXEC_VMALLOC(void); | |
112 | void lkdtm_EXEC_RODATA(void); | |
113 | void lkdtm_EXEC_USERSPACE(void); | |
59a12205 | 114 | void lkdtm_EXEC_NULL(void); |
0d9eb29b | 115 | void lkdtm_ACCESS_USERSPACE(void); |
59a12205 | 116 | void lkdtm_ACCESS_NULL(void); |
0d9eb29b | 117 | |
d58b0b1a | 118 | /* refcount.c */ |
95925c99 KC |
119 | void lkdtm_REFCOUNT_INC_OVERFLOW(void); |
120 | void lkdtm_REFCOUNT_ADD_OVERFLOW(void); | |
121 | void lkdtm_REFCOUNT_INC_NOT_ZERO_OVERFLOW(void); | |
122 | void lkdtm_REFCOUNT_ADD_NOT_ZERO_OVERFLOW(void); | |
123 | void lkdtm_REFCOUNT_DEC_ZERO(void); | |
124 | void lkdtm_REFCOUNT_DEC_NEGATIVE(void); | |
125 | void lkdtm_REFCOUNT_DEC_AND_TEST_NEGATIVE(void); | |
126 | void lkdtm_REFCOUNT_SUB_AND_TEST_NEGATIVE(void); | |
127 | void lkdtm_REFCOUNT_INC_ZERO(void); | |
128 | void lkdtm_REFCOUNT_ADD_ZERO(void); | |
129 | void lkdtm_REFCOUNT_INC_SATURATED(void); | |
130 | void lkdtm_REFCOUNT_DEC_SATURATED(void); | |
131 | void lkdtm_REFCOUNT_ADD_SATURATED(void); | |
132 | void lkdtm_REFCOUNT_INC_NOT_ZERO_SATURATED(void); | |
133 | void lkdtm_REFCOUNT_ADD_NOT_ZERO_SATURATED(void); | |
134 | void lkdtm_REFCOUNT_DEC_AND_TEST_SATURATED(void); | |
135 | void lkdtm_REFCOUNT_SUB_AND_TEST_SATURATED(void); | |
c7fea488 KC |
136 | void lkdtm_REFCOUNT_TIMING(void); |
137 | void lkdtm_ATOMIC_TIMING(void); | |
95925c99 | 138 | |
d58b0b1a | 139 | /* rodata.c */ |
9a49a528 KC |
140 | void lkdtm_rodata_do_nothing(void); |
141 | ||
d58b0b1a | 142 | /* usercopy.c */ |
a3dff71c KC |
143 | void __init lkdtm_usercopy_init(void); |
144 | void __exit lkdtm_usercopy_exit(void); | |
145 | void lkdtm_USERCOPY_HEAP_SIZE_TO(void); | |
146 | void lkdtm_USERCOPY_HEAP_SIZE_FROM(void); | |
e47e3118 KC |
147 | void lkdtm_USERCOPY_HEAP_WHITELIST_TO(void); |
148 | void lkdtm_USERCOPY_HEAP_WHITELIST_FROM(void); | |
a3dff71c KC |
149 | void lkdtm_USERCOPY_STACK_FRAME_TO(void); |
150 | void lkdtm_USERCOPY_STACK_FRAME_FROM(void); | |
151 | void lkdtm_USERCOPY_STACK_BEYOND(void); | |
152 | void lkdtm_USERCOPY_KERNEL(void); | |
153 | ||
d58b0b1a | 154 | /* stackleak.c */ |
f90d1e0c AP |
155 | void lkdtm_STACKLEAK_ERASING(void); |
156 | ||
b0eb93cf KC |
157 | /* cfi.c */ |
158 | void lkdtm_CFI_FORWARD_PROTO(void); | |
159 | ||
febebaf3 | 160 | /* fortify.c */ |
fe8e353b KC |
161 | void lkdtm_FORTIFIED_OBJECT(void); |
162 | void lkdtm_FORTIFIED_SUBOBJECT(void); | |
febebaf3 FL |
163 | void lkdtm_FORTIFIED_STRSCPY(void); |
164 | ||
3ba150fb GG |
165 | /* powerpc.c */ |
166 | void lkdtm_PPC_SLB_MULTIHIT(void); | |
167 | ||
9a49a528 | 168 | #endif |