1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __LKDTM_H |
3 | #define __LKDTM_H |
4 | |
5 | #define pr_fmt(fmt) "lkdtm: " fmt |
6 | |
7 | #include <linux/kernel.h> |
8 | |
9 | extern char *lkdtm_kernel_info; |
10 | |
11 | #define pr_expected_config(kconfig) \ |
12 | do { \ |
13 | if (IS_ENABLED(kconfig)) \ |
14 | pr_err("Unexpected! This %s was built with " #kconfig "=y\n", \ |
15 | lkdtm_kernel_info); \ |
16 | else \ |
17 | pr_warn("This is probably expected, since this %s was built *without* " #kconfig "=y\n", \ |
18 | lkdtm_kernel_info); \ |
19 | } while (0) |
20 | |
21 | #ifndef MODULE |
22 | int lkdtm_check_bool_cmdline(const char *param); |
23 | #define pr_expected_config_param(kconfig, param) \ |
24 | do { \ |
25 | if (IS_ENABLED(kconfig)) { \ |
26 | switch (lkdtm_check_bool_cmdline(param)) { \ |
27 | case 0: \ |
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); \ |
30 | break; \ |
31 | case 1: \ |
32 | pr_err("Unexpected! This %s was built with " #kconfig "=y and booted with '" param "=Y'\n", \ |
33 | lkdtm_kernel_info); \ |
34 | break; \ |
35 | default: \ |
36 | pr_err("Unexpected! This %s was built with " #kconfig "=y (and booted without '" param "' specified)\n", \ |
37 | lkdtm_kernel_info); \ |
38 | } \ |
39 | } else { \ |
40 | switch (lkdtm_check_bool_cmdline(param)) { \ |
41 | case 0: \ |
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); \ |
44 | break; \ |
45 | case 1: \ |
46 | pr_err("Unexpected! This %s was built *without* " #kconfig "=y but booted with '" param "=Y'\n", \ |
47 | lkdtm_kernel_info); \ |
48 | break; \ |
49 | default: \ |
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); \ |
52 | break; \ |
53 | } \ |
54 | } \ |
55 | } while (0) |
56 | #else |
57 | #define pr_expected_config_param(kconfig, param) pr_expected_config(kconfig) |
58 | #endif |
59 | |
60 | /* Crash types. */ |
61 | struct crashtype { |
62 | const char *name; |
63 | void (*func)(void); |
64 | }; |
65 | |
66 | #define CRASHTYPE(_name) \ |
67 | { \ |
68 | .name = __stringify(_name), \ |
69 | .func = lkdtm_ ## _name, \ |
70 | } |
71 | |
72 | /* Category's collection of crashtypes. */ |
73 | struct crashtype_category { |
74 | struct crashtype *crashtypes; |
75 | size_t len; |
76 | }; |
77 | |
78 | /* Each category's crashtypes list. */ |
79 | extern struct crashtype_category bugs_crashtypes; |
80 | extern struct crashtype_category heap_crashtypes; |
81 | extern struct crashtype_category perms_crashtypes; |
82 | extern struct crashtype_category refcount_crashtypes; |
83 | extern struct crashtype_category usercopy_crashtypes; |
84 | extern struct crashtype_category stackleak_crashtypes; |
85 | extern struct crashtype_category cfi_crashtypes; |
86 | extern struct crashtype_category fortify_crashtypes; |
87 | extern struct crashtype_category powerpc_crashtypes; |
88 | |
89 | /* Each category's init/exit routines. */ |
90 | void __init lkdtm_bugs_init(int *recur_param); |
91 | void __init lkdtm_heap_init(void); |
92 | void __exit lkdtm_heap_exit(void); |
93 | void __init lkdtm_perms_init(void); |
94 | void __init lkdtm_usercopy_init(void); |
95 | void __exit lkdtm_usercopy_exit(void); |
96 | |
97 | /* Special declaration for function-in-rodata. */ |
98 | void lkdtm_rodata_do_nothing(void); |
99 | |
100 | #endif |
101 | |