Linux 6.9-rc1
[linux-2.6-microblaze.git] / drivers / misc / lkdtm / lkdtm.h
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