diff options
Diffstat (limited to 'arch/x86_64/mm')
-rw-r--r-- | arch/x86_64/mm/init.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index c016dfe84784..1faae5fc1c01 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -498,6 +498,29 @@ void free_initmem(void) | |||
498 | printk ("Freeing unused kernel memory: %luk freed\n", (__init_end - __init_begin) >> 10); | 498 | printk ("Freeing unused kernel memory: %luk freed\n", (__init_end - __init_begin) >> 10); |
499 | } | 499 | } |
500 | 500 | ||
501 | #ifdef CONFIG_DEBUG_RODATA | ||
502 | |||
503 | extern char __start_rodata, __end_rodata; | ||
504 | void mark_rodata_ro(void) | ||
505 | { | ||
506 | unsigned long addr = (unsigned long)&__start_rodata; | ||
507 | |||
508 | for (; addr < (unsigned long)&__end_rodata; addr += PAGE_SIZE) | ||
509 | change_page_attr_addr(addr, 1, PAGE_KERNEL_RO); | ||
510 | |||
511 | printk ("Write protecting the kernel read-only data: %luk\n", | ||
512 | (&__end_rodata - &__start_rodata) >> 10); | ||
513 | |||
514 | /* | ||
515 | * change_page_attr_addr() requires a global_flush_tlb() call after it. | ||
516 | * We do this after the printk so that if something went wrong in the | ||
517 | * change, the printk gets out at least to give a better debug hint | ||
518 | * of who is the culprit. | ||
519 | */ | ||
520 | global_flush_tlb(); | ||
521 | } | ||
522 | #endif | ||
523 | |||
501 | #ifdef CONFIG_BLK_DEV_INITRD | 524 | #ifdef CONFIG_BLK_DEV_INITRD |
502 | void free_initrd_mem(unsigned long start, unsigned long end) | 525 | void free_initrd_mem(unsigned long start, unsigned long end) |
503 | { | 526 | { |