diff options
Diffstat (limited to 'arch/powerpc/mm/pgtable-radix.c')
-rw-r--r-- | arch/powerpc/mm/pgtable-radix.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c index 8c13e4282308..5cc50d47ce3f 100644 --- a/arch/powerpc/mm/pgtable-radix.c +++ b/arch/powerpc/mm/pgtable-radix.c | |||
@@ -112,10 +112,9 @@ set_the_pte: | |||
112 | } | 112 | } |
113 | 113 | ||
114 | #ifdef CONFIG_STRICT_KERNEL_RWX | 114 | #ifdef CONFIG_STRICT_KERNEL_RWX |
115 | void radix__mark_rodata_ro(void) | 115 | void radix__change_memory_range(unsigned long start, unsigned long end, |
116 | unsigned long clear) | ||
116 | { | 117 | { |
117 | unsigned long start = (unsigned long)_stext; | ||
118 | unsigned long end = (unsigned long)__init_begin; | ||
119 | unsigned long idx; | 118 | unsigned long idx; |
120 | pgd_t *pgdp; | 119 | pgd_t *pgdp; |
121 | pud_t *pudp; | 120 | pud_t *pudp; |
@@ -125,7 +124,8 @@ void radix__mark_rodata_ro(void) | |||
125 | start = ALIGN_DOWN(start, PAGE_SIZE); | 124 | start = ALIGN_DOWN(start, PAGE_SIZE); |
126 | end = PAGE_ALIGN(end); // aligns up | 125 | end = PAGE_ALIGN(end); // aligns up |
127 | 126 | ||
128 | pr_devel("marking ro start %lx, end %lx\n", start, end); | 127 | pr_debug("Changing flags on range %lx-%lx removing 0x%lx\n", |
128 | start, end, clear); | ||
129 | 129 | ||
130 | for (idx = start; idx < end; idx += PAGE_SIZE) { | 130 | for (idx = start; idx < end; idx += PAGE_SIZE) { |
131 | pgdp = pgd_offset_k(idx); | 131 | pgdp = pgd_offset_k(idx); |
@@ -147,11 +147,29 @@ void radix__mark_rodata_ro(void) | |||
147 | if (!ptep) | 147 | if (!ptep) |
148 | continue; | 148 | continue; |
149 | update_the_pte: | 149 | update_the_pte: |
150 | radix__pte_update(&init_mm, idx, ptep, _PAGE_WRITE, 0, 0); | 150 | radix__pte_update(&init_mm, idx, ptep, clear, 0, 0); |
151 | } | 151 | } |
152 | 152 | ||
153 | radix__flush_tlb_kernel_range(start, end); | 153 | radix__flush_tlb_kernel_range(start, end); |
154 | } | 154 | } |
155 | |||
156 | void radix__mark_rodata_ro(void) | ||
157 | { | ||
158 | unsigned long start, end; | ||
159 | |||
160 | start = (unsigned long)_stext; | ||
161 | end = (unsigned long)__init_begin; | ||
162 | |||
163 | radix__change_memory_range(start, end, _PAGE_WRITE); | ||
164 | } | ||
165 | |||
166 | void radix__mark_initmem_nx(void) | ||
167 | { | ||
168 | unsigned long start = (unsigned long)__init_begin; | ||
169 | unsigned long end = (unsigned long)__init_end; | ||
170 | |||
171 | radix__change_memory_range(start, end, _PAGE_EXEC); | ||
172 | } | ||
155 | #endif /* CONFIG_STRICT_KERNEL_RWX */ | 173 | #endif /* CONFIG_STRICT_KERNEL_RWX */ |
156 | 174 | ||
157 | static inline void __meminit print_mapping(unsigned long start, | 175 | static inline void __meminit print_mapping(unsigned long start, |