aboutsummaryrefslogtreecommitdiffstats
path: root/init/main.c
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2016-02-17 17:41:13 -0500
committerIngo Molnar <mingo@kernel.org>2016-02-22 02:51:37 -0500
commitd2aa1acad22f1bdd0cfa67b3861800e392254454 (patch)
tree1f3b88086e364e87714dfcaeb66add3bbca81800 /init/main.c
parente267d97b83d9cecc16c54825f9f3ac7f72dc1e1e (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.c27
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 *);
93extern void init_IRQ(void); 93extern void init_IRQ(void);
94extern void fork_init(void); 94extern void fork_init(void);
95extern void radix_tree_init(void); 95extern void radix_tree_init(void);
96#ifndef CONFIG_DEBUG_RODATA
97static 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
930static noinline void __init kernel_init_freeable(void); 927static noinline void __init kernel_init_freeable(void);
931 928
929#ifdef CONFIG_DEBUG_RODATA
930static bool rodata_enabled = true;
931static int __init set_debug_rodata(char *str)
932{
933 return strtobool(str, &rodata_enabled);
934}
935__setup("rodata=", set_debug_rodata);
936
937static 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
945static inline void mark_readonly(void)
946{
947 pr_warn("This architecture does not have kernel memory protection.\n");
948}
949#endif
950
932static int __ref kernel_init(void *unused) 951static 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