diff options
author | Kees Cook <keescook@chromium.org> | 2016-02-17 17:41:13 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-02-22 02:51:37 -0500 |
commit | d2aa1acad22f1bdd0cfa67b3861800e392254454 (patch) | |
tree | 1f3b88086e364e87714dfcaeb66add3bbca81800 /init/main.c | |
parent | e267d97b83d9cecc16c54825f9f3ac7f72dc1e1e (diff) |
mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings
It may be useful to debug writes to the readonly sections of memory,
so provide a cmdline "rodata=off" to allow for this. This can be
expanded in the future to support "log" and "write" modes, but that
will need to be architecture-specific.
This also makes KDB software breakpoints more usable, as read-only
mappings can now be disabled on any kernel.
Suggested-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: David Brown <david.brown@linaro.org>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Emese Revfy <re.emese@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mathias Krause <minipli@googlemail.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: PaX Team <pageexec@freemail.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: kernel-hardening@lists.openwall.com
Cc: linux-arch <linux-arch@vger.kernel.org>
Link: http://lkml.kernel.org/r/1455748879-21872-3-git-send-email-keescook@chromium.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'init/main.c')
-rw-r--r-- | init/main.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/init/main.c b/init/main.c index 58c9e374704b..928a3438f7ac 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -93,9 +93,6 @@ static int kernel_init(void *); | |||
93 | extern void init_IRQ(void); | 93 | extern void init_IRQ(void); |
94 | extern void fork_init(void); | 94 | extern void fork_init(void); |
95 | extern void radix_tree_init(void); | 95 | extern void radix_tree_init(void); |
96 | #ifndef CONFIG_DEBUG_RODATA | ||
97 | static inline void mark_rodata_ro(void) { } | ||
98 | #endif | ||
99 | 96 | ||
100 | /* | 97 | /* |
101 | * Debug helper: via this flag we know that we are in 'early bootup code' | 98 | * Debug helper: via this flag we know that we are in 'early bootup code' |
@@ -929,6 +926,28 @@ static int try_to_run_init_process(const char *init_filename) | |||
929 | 926 | ||
930 | static noinline void __init kernel_init_freeable(void); | 927 | static noinline void __init kernel_init_freeable(void); |
931 | 928 | ||
929 | #ifdef CONFIG_DEBUG_RODATA | ||
930 | static bool rodata_enabled = true; | ||
931 | static int __init set_debug_rodata(char *str) | ||
932 | { | ||
933 | return strtobool(str, &rodata_enabled); | ||
934 | } | ||
935 | __setup("rodata=", set_debug_rodata); | ||
936 | |||
937 | static void mark_readonly(void) | ||
938 | { | ||
939 | if (rodata_enabled) | ||
940 | mark_rodata_ro(); | ||
941 | else | ||
942 | pr_info("Kernel memory protection disabled.\n"); | ||
943 | } | ||
944 | #else | ||
945 | static inline void mark_readonly(void) | ||
946 | { | ||
947 | pr_warn("This architecture does not have kernel memory protection.\n"); | ||
948 | } | ||
949 | #endif | ||
950 | |||
932 | static int __ref kernel_init(void *unused) | 951 | static int __ref kernel_init(void *unused) |
933 | { | 952 | { |
934 | int ret; | 953 | int ret; |
@@ -937,7 +956,7 @@ static int __ref kernel_init(void *unused) | |||
937 | /* need to finish all async __init code before freeing the memory */ | 956 | /* need to finish all async __init code before freeing the memory */ |
938 | async_synchronize_full(); | 957 | async_synchronize_full(); |
939 | free_initmem(); | 958 | free_initmem(); |
940 | mark_rodata_ro(); | 959 | mark_readonly(); |
941 | system_state = SYSTEM_RUNNING; | 960 | system_state = SYSTEM_RUNNING; |
942 | numa_default_policy(); | 961 | numa_default_policy(); |
943 | 962 | ||