aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
authorAKASHI Takahiro <takahiro.akashi@linaro.org>2016-11-14 01:15:05 -0500
committerJessica Yu <jeyu@redhat.com>2016-11-27 19:15:33 -0500
commit39290b389ea2654f9190e3b48c57d27b24def83e (patch)
treec56b3f6505001d9c4bf25d5588e79e79f2db0ea8 /kernel/module.c
parent71d9f5079358c148e71eba930e436a7a0cb35d95 (diff)
module: extend 'rodata=off' boot cmdline parameter to module mappings
The current "rodata=off" parameter disables read-only kernel mappings under CONFIG_DEBUG_RODATA: commit d2aa1acad22f ("mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings") This patch is a logical extension to module mappings ie. read-only mappings at module loading can be disabled even if CONFIG_DEBUG_SET_MODULE_RONX (mainly for debug use). Please note, however, that it only affects RO/RW permissions, keeping NX set. This is the first step to make CONFIG_DEBUG_SET_MODULE_RONX mandatory (always-on) in the future as CONFIG_DEBUG_RODATA on x86 and arm64. Suggested-by: and Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Rusty Russell <rusty@rustcorp.com.au> Link: http://lkml.kernel.org/r/20161114061505.15238-1-takahiro.akashi@linaro.org Signed-off-by: Jessica Yu <jeyu@redhat.com>
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 6281c70683d3..039ce82803f7 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1902,6 +1902,9 @@ static void frob_writable_data(const struct module_layout *layout,
1902/* livepatching wants to disable read-only so it can frob module. */ 1902/* livepatching wants to disable read-only so it can frob module. */
1903void module_disable_ro(const struct module *mod) 1903void module_disable_ro(const struct module *mod)
1904{ 1904{
1905 if (!rodata_enabled)
1906 return;
1907
1905 frob_text(&mod->core_layout, set_memory_rw); 1908 frob_text(&mod->core_layout, set_memory_rw);
1906 frob_rodata(&mod->core_layout, set_memory_rw); 1909 frob_rodata(&mod->core_layout, set_memory_rw);
1907 frob_ro_after_init(&mod->core_layout, set_memory_rw); 1910 frob_ro_after_init(&mod->core_layout, set_memory_rw);
@@ -1911,6 +1914,9 @@ void module_disable_ro(const struct module *mod)
1911 1914
1912void module_enable_ro(const struct module *mod, bool after_init) 1915void module_enable_ro(const struct module *mod, bool after_init)
1913{ 1916{
1917 if (!rodata_enabled)
1918 return;
1919
1914 frob_text(&mod->core_layout, set_memory_ro); 1920 frob_text(&mod->core_layout, set_memory_ro);
1915 frob_rodata(&mod->core_layout, set_memory_ro); 1921 frob_rodata(&mod->core_layout, set_memory_ro);
1916 frob_text(&mod->init_layout, set_memory_ro); 1922 frob_text(&mod->init_layout, set_memory_ro);
@@ -1943,6 +1949,9 @@ void set_all_modules_text_rw(void)
1943{ 1949{
1944 struct module *mod; 1950 struct module *mod;
1945 1951
1952 if (!rodata_enabled)
1953 return;
1954
1946 mutex_lock(&module_mutex); 1955 mutex_lock(&module_mutex);
1947 list_for_each_entry_rcu(mod, &modules, list) { 1956 list_for_each_entry_rcu(mod, &modules, list) {
1948 if (mod->state == MODULE_STATE_UNFORMED) 1957 if (mod->state == MODULE_STATE_UNFORMED)
@@ -1959,6 +1968,9 @@ void set_all_modules_text_ro(void)
1959{ 1968{
1960 struct module *mod; 1969 struct module *mod;
1961 1970
1971 if (!rodata_enabled)
1972 return;
1973
1962 mutex_lock(&module_mutex); 1974 mutex_lock(&module_mutex);
1963 list_for_each_entry_rcu(mod, &modules, list) { 1975 list_for_each_entry_rcu(mod, &modules, list) {
1964 /* 1976 /*
@@ -1978,10 +1990,12 @@ void set_all_modules_text_ro(void)
1978 1990
1979static void disable_ro_nx(const struct module_layout *layout) 1991static void disable_ro_nx(const struct module_layout *layout)
1980{ 1992{
1981 frob_text(layout, set_memory_rw); 1993 if (rodata_enabled) {
1982 frob_rodata(layout, set_memory_rw); 1994 frob_text(layout, set_memory_rw);
1995 frob_rodata(layout, set_memory_rw);
1996 frob_ro_after_init(layout, set_memory_rw);
1997 }
1983 frob_rodata(layout, set_memory_x); 1998 frob_rodata(layout, set_memory_x);
1984 frob_ro_after_init(layout, set_memory_rw);
1985 frob_ro_after_init(layout, set_memory_x); 1999 frob_ro_after_init(layout, set_memory_x);
1986 frob_writable_data(layout, set_memory_x); 2000 frob_writable_data(layout, set_memory_x);
1987} 2001}