| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef __LKDTM_H |
| #define __LKDTM_H |
| |
| #define pr_fmt(fmt) "lkdtm: " fmt |
| |
| #include <linux/kernel.h> |
| |
| extern char *lkdtm_kernel_info; |
| |
| #define pr_expected_config(kconfig) \ |
| do { \ |
| if (IS_ENABLED(kconfig)) \ |
| pr_err("Unexpected! This %s was built with " #kconfig "=y\n", \ |
| lkdtm_kernel_info); \ |
| else \ |
| pr_warn("This is probably expected, since this %s was built *without* " #kconfig "=y\n", \ |
| lkdtm_kernel_info); \ |
| } while (0) |
| |
| #ifndef MODULE |
| int lkdtm_check_bool_cmdline(const char *param); |
| #define pr_expected_config_param(kconfig, param) \ |
| do { \ |
| if (IS_ENABLED(kconfig)) { \ |
| switch (lkdtm_check_bool_cmdline(param)) { \ |
| case 0: \ |
| pr_warn("This is probably expected, since this %s was built with " #kconfig "=y but booted with '" param "=N'\n", \ |
| lkdtm_kernel_info); \ |
| break; \ |
| case 1: \ |
| pr_err("Unexpected! This %s was built with " #kconfig "=y and booted with '" param "=Y'\n", \ |
| lkdtm_kernel_info); \ |
| break; \ |
| default: \ |
| pr_err("Unexpected! This %s was built with " #kconfig "=y (and booted without '" param "' specified)\n", \ |
| lkdtm_kernel_info); \ |
| } \ |
| } else { \ |
| switch (lkdtm_check_bool_cmdline(param)) { \ |
| case 0: \ |
| pr_warn("This is probably expected, as this %s was built *without* " #kconfig "=y and booted with '" param "=N'\n", \ |
| lkdtm_kernel_info); \ |
| break; \ |
| case 1: \ |
| pr_err("Unexpected! This %s was built *without* " #kconfig "=y but booted with '" param "=Y'\n", \ |
| lkdtm_kernel_info); \ |
| break; \ |
| default: \ |
| pr_err("This is probably expected, since this %s was built *without* " #kconfig "=y (and booted without '" param "' specified)\n", \ |
| lkdtm_kernel_info); \ |
| break; \ |
| } \ |
| } \ |
| } while (0) |
| #else |
| #define pr_expected_config_param(kconfig, param) pr_expected_config(kconfig) |
| #endif |
| |
| /* Crash types. */ |
| struct crashtype { |
| const char *name; |
| void (*func)(void); |
| }; |
| |
| #define CRASHTYPE(_name) \ |
| { \ |
| .name = __stringify(_name), \ |
| .func = lkdtm_ ## _name, \ |
| } |
| |
| /* Category's collection of crashtypes. */ |
| struct crashtype_category { |
| struct crashtype *crashtypes; |
| size_t len; |
| }; |
| |
| /* Each category's crashtypes list. */ |
| extern struct crashtype_category bugs_crashtypes; |
| extern struct crashtype_category heap_crashtypes; |
| extern struct crashtype_category perms_crashtypes; |
| extern struct crashtype_category refcount_crashtypes; |
| extern struct crashtype_category usercopy_crashtypes; |
| extern struct crashtype_category stackleak_crashtypes; |
| extern struct crashtype_category cfi_crashtypes; |
| extern struct crashtype_category fortify_crashtypes; |
| extern struct crashtype_category powerpc_crashtypes; |
| |
| /* Each category's init/exit routines. */ |
| void __init lkdtm_bugs_init(int *recur_param); |
| void __init lkdtm_heap_init(void); |
| void __exit lkdtm_heap_exit(void); |
| void __init lkdtm_perms_init(void); |
| void __init lkdtm_usercopy_init(void); |
| void __exit lkdtm_usercopy_exit(void); |
| |
| /* Special declaration for function-in-rodata. */ |
| void lkdtm_rodata_do_nothing(void); |
| |
| #endif |