path: root/init
diff options
authorKees Cook <>2016-02-17 14:41:13 -0800
committerIngo Molnar <>2016-02-22 08:51:37 +0100
commitd2aa1acad22f1bdd0cfa67b3861800e392254454 (patch)
tree1f3b88086e364e87714dfcaeb66add3bbca81800 /init
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 <> Signed-off-by: Kees Cook <> Cc: Andy Lutomirski <> Cc: Arnd Bergmann <> Cc: Borislav Petkov <> Cc: Brian Gerst <> Cc: David Brown <> Cc: Denys Vlasenko <> Cc: Emese Revfy <> Cc: Linus Torvalds <> Cc: Mathias Krause <> Cc: Michael Ellerman <> Cc: PaX Team <> Cc: Peter Zijlstra <> Cc: Thomas Gleixner <> Cc: Cc: linux-arch <> Link: Signed-off-by: Ingo Molnar <>
Diffstat (limited to 'init')
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 *);
extern void init_IRQ(void);
extern void fork_init(void);
extern void radix_tree_init(void);
-static inline void mark_rodata_ro(void) { }
* 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)
static noinline void __init kernel_init_freeable(void);
+static bool rodata_enabled = true;
+static int __init set_debug_rodata(char *str)
+ return strtobool(str, &rodata_enabled);
+__setup("rodata=", set_debug_rodata);
+static void mark_readonly(void)
+ if (rodata_enabled)
+ mark_rodata_ro();
+ else
+ pr_info("Kernel memory protection disabled.\n");
+static inline void mark_readonly(void)
+ pr_warn("This architecture does not have kernel memory protection.\n");
static int __ref kernel_init(void *unused)
int ret;
@@ -937,7 +956,7 @@ static int __ref kernel_init(void *unused)
/* need to finish all async __init code before freeing the memory */
- mark_rodata_ro();
+ mark_readonly();
system_state = SYSTEM_RUNNING;