Commit b134bd90 authored by Michael Ellerman's avatar Michael Ellerman

powerpc/mm/radix: Refactor radix__mark_rodata_ro()

Move the core logic into a helper, so we can use it for changing permissions
other than _PAGE_WRITE.
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Reviewed-by: default avatarBalbir Singh <bsingharora@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 76fc0cfc
...@@ -112,10 +112,9 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa, ...@@ -112,10 +112,9 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa,
} }
#ifdef CONFIG_STRICT_KERNEL_RWX #ifdef CONFIG_STRICT_KERNEL_RWX
void radix__mark_rodata_ro(void) void radix__change_memory_range(unsigned long start, unsigned long end,
unsigned long clear)
{ {
unsigned long start = (unsigned long)_stext;
unsigned long end = (unsigned long)__init_begin;
unsigned long idx; unsigned long idx;
pgd_t *pgdp; pgd_t *pgdp;
pud_t *pudp; pud_t *pudp;
...@@ -125,7 +124,8 @@ void radix__mark_rodata_ro(void) ...@@ -125,7 +124,8 @@ void radix__mark_rodata_ro(void)
start = ALIGN_DOWN(start, PAGE_SIZE); start = ALIGN_DOWN(start, PAGE_SIZE);
end = PAGE_ALIGN(end); // aligns up end = PAGE_ALIGN(end); // aligns up
pr_devel("marking ro start %lx, end %lx\n", start, end); pr_debug("Changing flags on range %lx-%lx removing 0x%lx\n",
start, end, clear);
for (idx = start; idx < end; idx += PAGE_SIZE) { for (idx = start; idx < end; idx += PAGE_SIZE) {
pgdp = pgd_offset_k(idx); pgdp = pgd_offset_k(idx);
...@@ -147,11 +147,21 @@ void radix__mark_rodata_ro(void) ...@@ -147,11 +147,21 @@ void radix__mark_rodata_ro(void)
if (!ptep) if (!ptep)
continue; continue;
update_the_pte: update_the_pte:
radix__pte_update(&init_mm, idx, ptep, _PAGE_WRITE, 0, 0); radix__pte_update(&init_mm, idx, ptep, clear, 0, 0);
} }
radix__flush_tlb_kernel_range(start, end); radix__flush_tlb_kernel_range(start, end);
} }
void radix__mark_rodata_ro(void)
{
unsigned long start, end;
start = (unsigned long)_stext;
end = (unsigned long)__init_begin;
radix__change_memory_range(start, end, _PAGE_WRITE);
}
#endif /* CONFIG_STRICT_KERNEL_RWX */ #endif /* CONFIG_STRICT_KERNEL_RWX */
static inline void __meminit print_mapping(unsigned long start, static inline void __meminit print_mapping(unsigned long start,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment