From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hoeun Ryu Date: Sun, 19 Feb 2017 19:04:05 +0900 Message-Id: <1487498660-16600-2-git-send-email-hoeun.ryu@gmail.com> In-Reply-To: <1487498660-16600-1-git-send-email-hoeun.ryu@gmail.com> References: <1487498660-16600-1-git-send-email-hoeun.ryu@gmail.com> Subject: [kernel-hardening] [RFC 2/7] init: add set_ro_mostly_after_init_rw/ro function To: kernel-hardening@lists.openwall.com, linux-kernel@vger.kernel.org Cc: Hoeun Ryu , Kees Cook , Jessica Yu , Ingo Molnar , Andrew Morton , Emese Revfy , AKASHI Takahiro , Fabian Frederick , Helge Deller , Laura Abbott , Nicholas Piggin , Thomas Gleixner , Petr Mladek , Yang Shi , Rasmus Villemoes , Tejun Heo , Prarit Bhargava , Lokesh Vutla List-ID: Add set_ro_mostly_after_init_rw/ro pair to modify memory attributes for memory marked as `ro_mostly_after_init`. I am doubtful that this is the right place where these functions reside and these functions are suitable for all architectures for memory attributes modification. Please comment. Signed-off-by: Hoeun Ryu --- include/linux/init.h | 6 ++++++ init/main.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/linux/init.h b/include/linux/init.h index 79af096..d68e4f7 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -131,6 +131,12 @@ extern bool rodata_enabled; #endif #ifdef CONFIG_STRICT_KERNEL_RWX void mark_rodata_ro(void); + +void set_ro_mostly_after_init_rw(void); +void set_ro_mostly_after_init_ro(void); +#else +static inline void set_ro_mostly_after_init_rw(void) { } +static inline void set_ro_mostly_after_init_ro(void) { } #endif extern void (*late_time_init)(void); diff --git a/init/main.c b/init/main.c index 4719abf..a5d4873 100644 --- a/init/main.c +++ b/init/main.c @@ -941,6 +941,30 @@ static void mark_readonly(void) } else pr_info("Kernel memory protection disabled.\n"); } + +void set_ro_mostly_after_init_rw(void) +{ + unsigned long start = PFN_ALIGN(__start_data_ro_mostly_after_init); + unsigned long end = PFN_ALIGN(&__end_data_ro_mostly_after_init); + unsigned long nr_pages = (end - start) >> PAGE_SHIFT; + + if (!rodata_enabled) + return; + + set_memory_rw(start, nr_pages); +} + +void set_ro_mostly_after_init_ro(void) +{ + unsigned long start = PFN_ALIGN(__start_data_ro_mostly_after_init); + unsigned long end = PFN_ALIGN(&__end_data_ro_mostly_after_init); + unsigned long nr_pages = (end - start) >> PAGE_SHIFT; + + if (!rodata_enabled) + return; + + set_memory_ro(start, nr_pages); +} #else static inline void mark_readonly(void) { -- 2.7.4