diff options
-rw-r--r-- | arch/x86/mm/init_32.c | 4 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 10 |
2 files changed, 12 insertions, 2 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index ec30d10154b6..f96eca21ad8f 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -710,6 +710,8 @@ void mark_rodata_ro(void) | |||
710 | unsigned long start = PFN_ALIGN(_text); | 710 | unsigned long start = PFN_ALIGN(_text); |
711 | unsigned long size = PFN_ALIGN(_etext) - start; | 711 | unsigned long size = PFN_ALIGN(_etext) - start; |
712 | 712 | ||
713 | #ifndef CONFIG_DYNAMIC_FTRACE | ||
714 | /* Dynamic tracing modifies the kernel text section */ | ||
713 | set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); | 715 | set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); |
714 | printk(KERN_INFO "Write protecting the kernel text: %luk\n", | 716 | printk(KERN_INFO "Write protecting the kernel text: %luk\n", |
715 | size >> 10); | 717 | size >> 10); |
@@ -722,6 +724,8 @@ void mark_rodata_ro(void) | |||
722 | printk(KERN_INFO "Testing CPA: write protecting again\n"); | 724 | printk(KERN_INFO "Testing CPA: write protecting again\n"); |
723 | set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT); | 725 | set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT); |
724 | #endif | 726 | #endif |
727 | #endif /* CONFIG_DYNAMIC_FTRACE */ | ||
728 | |||
725 | start += size; | 729 | start += size; |
726 | size = (unsigned long)__end_rodata - start; | 730 | size = (unsigned long)__end_rodata - start; |
727 | set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); | 731 | set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 32ba13b0f818..41824e776b6c 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -766,6 +766,13 @@ EXPORT_SYMBOL_GPL(rodata_test_data); | |||
766 | void mark_rodata_ro(void) | 766 | void mark_rodata_ro(void) |
767 | { | 767 | { |
768 | unsigned long start = PFN_ALIGN(_stext), end = PFN_ALIGN(__end_rodata); | 768 | unsigned long start = PFN_ALIGN(_stext), end = PFN_ALIGN(__end_rodata); |
769 | unsigned long rodata_start = | ||
770 | ((unsigned long)__start_rodata + PAGE_SIZE - 1) & PAGE_MASK; | ||
771 | |||
772 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
773 | /* Dynamic tracing modifies the kernel text section */ | ||
774 | start = rodata_start; | ||
775 | #endif | ||
769 | 776 | ||
770 | printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n", | 777 | printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n", |
771 | (end - start) >> 10); | 778 | (end - start) >> 10); |
@@ -775,8 +782,7 @@ void mark_rodata_ro(void) | |||
775 | * The rodata section (but not the kernel text!) should also be | 782 | * The rodata section (but not the kernel text!) should also be |
776 | * not-executable. | 783 | * not-executable. |
777 | */ | 784 | */ |
778 | start = ((unsigned long)__start_rodata + PAGE_SIZE - 1) & PAGE_MASK; | 785 | set_memory_nx(rodata_start, (end - start) >> PAGE_SHIFT); |
779 | set_memory_nx(start, (end - start) >> PAGE_SHIFT); | ||
780 | 786 | ||
781 | rodata_test(); | 787 | rodata_test(); |
782 | 788 | ||