diff options
-rw-r--r-- | arch/x86/include/asm/cacheflush.h | 1 | ||||
-rw-r--r-- | arch/x86/mm/init_32.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/pageattr.c | 10 |
4 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h index b54f6afe7ec4..eebb2cd2b9bf 100644 --- a/arch/x86/include/asm/cacheflush.h +++ b/arch/x86/include/asm/cacheflush.h | |||
@@ -176,6 +176,7 @@ void clflush_cache_range(void *addr, unsigned int size); | |||
176 | #ifdef CONFIG_DEBUG_RODATA | 176 | #ifdef CONFIG_DEBUG_RODATA |
177 | void mark_rodata_ro(void); | 177 | void mark_rodata_ro(void); |
178 | extern const int rodata_test_data; | 178 | extern const int rodata_test_data; |
179 | extern int kernel_set_to_readonly; | ||
179 | void set_kernel_text_rw(void); | 180 | void set_kernel_text_rw(void); |
180 | void set_kernel_text_ro(void); | 181 | void set_kernel_text_ro(void); |
181 | #else | 182 | #else |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index f64d0d5e0f89..c973f8e2a6cf 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -997,7 +997,7 @@ static noinline int do_test_wp_bit(void) | |||
997 | const int rodata_test_data = 0xC3; | 997 | const int rodata_test_data = 0xC3; |
998 | EXPORT_SYMBOL_GPL(rodata_test_data); | 998 | EXPORT_SYMBOL_GPL(rodata_test_data); |
999 | 999 | ||
1000 | static int kernel_set_to_readonly; | 1000 | int kernel_set_to_readonly __read_mostly; |
1001 | 1001 | ||
1002 | void set_kernel_text_rw(void) | 1002 | void set_kernel_text_rw(void) |
1003 | { | 1003 | { |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 0ed09fad6aa1..4b507c089402 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -695,7 +695,7 @@ void __init mem_init(void) | |||
695 | const int rodata_test_data = 0xC3; | 695 | const int rodata_test_data = 0xC3; |
696 | EXPORT_SYMBOL_GPL(rodata_test_data); | 696 | EXPORT_SYMBOL_GPL(rodata_test_data); |
697 | 697 | ||
698 | static int kernel_set_to_readonly; | 698 | int kernel_set_to_readonly; |
699 | 699 | ||
700 | void set_kernel_text_rw(void) | 700 | void set_kernel_text_rw(void) |
701 | { | 701 | { |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 78d3168b3c64..8d1e8d95ea45 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -282,14 +282,16 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, | |||
282 | #if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) && \ | 282 | #if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) && \ |
283 | !defined(CONFIG_DYNAMIC_FTRACE) | 283 | !defined(CONFIG_DYNAMIC_FTRACE) |
284 | /* | 284 | /* |
285 | * Kernel text mappings for the large page aligned .rodata section | 285 | * Once the kernel maps the text as RO (kernel_set_to_readonly is set), |
286 | * will be read-only. For the kernel identity mappings covering | 286 | * kernel text mappings for the large page aligned text, rodata sections |
287 | * the holes caused by this alignment can be anything. | 287 | * will be always read-only. For the kernel identity mappings covering |
288 | * the holes caused by this alignment can be anything that user asks. | ||
288 | * | 289 | * |
289 | * This will preserve the large page mappings for kernel text/data | 290 | * This will preserve the large page mappings for kernel text/data |
290 | * at no extra cost. | 291 | * at no extra cost. |
291 | */ | 292 | */ |
292 | if (within(address, (unsigned long)_text, | 293 | if (kernel_set_to_readonly && |
294 | within(address, (unsigned long)_text, | ||
293 | (unsigned long)__end_rodata_hpage_align)) | 295 | (unsigned long)__end_rodata_hpage_align)) |
294 | pgprot_val(forbidden) |= _PAGE_RW; | 296 | pgprot_val(forbidden) |= _PAGE_RW; |
295 | #endif | 297 | #endif |