Commit b150a4d1 authored by Michael Ellerman's avatar Michael Ellerman

powerpc/vmlinux.lds: Add an explicit symbol for the SRWX boundary

Currently __init_begin is used as the boundary for strict RWX between
executable/read-only text and data, and non-executable (after boot) code
and data.

But that's a little subtle, so add an explicit symbol to document that
the SRWX boundary lies there, and add a comment making it clear that
__init_begin must also begin there.
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220916131422.318752-2-mpe@ellerman.id.au
parent 331771e8
...@@ -13,6 +13,7 @@ typedef struct func_desc func_desc_t; ...@@ -13,6 +13,7 @@ typedef struct func_desc func_desc_t;
#include <asm-generic/sections.h> #include <asm-generic/sections.h>
extern char __head_end[]; extern char __head_end[];
extern char __srwx_boundary[];
/* Patch sites */ /* Patch sites */
extern s32 patch__call_flush_branch_caches1; extern s32 patch__call_flush_branch_caches1;
......
...@@ -214,11 +214,16 @@ SECTIONS ...@@ -214,11 +214,16 @@ SECTIONS
} }
#endif #endif
/* /*
* Init sections discarded at runtime * Various code relies on __init_begin being at the strict RWX boundary.
*/ */
. = ALIGN(STRICT_ALIGN_SIZE); . = ALIGN(STRICT_ALIGN_SIZE);
__srwx_boundary = .;
__init_begin = .; __init_begin = .;
/*
* Init sections discarded at runtime
*/
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
_sinittext = .; _sinittext = .;
INIT_TEXT INIT_TEXT
......
...@@ -158,7 +158,7 @@ static unsigned long __init __mmu_mapin_ram(unsigned long base, unsigned long to ...@@ -158,7 +158,7 @@ static unsigned long __init __mmu_mapin_ram(unsigned long base, unsigned long to
unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top) unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top)
{ {
unsigned long done; unsigned long done;
unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET; unsigned long border = (unsigned long)__srwx_boundary - PAGE_OFFSET;
unsigned long size; unsigned long size;
size = roundup_pow_of_two((unsigned long)_einittext - PAGE_OFFSET); size = roundup_pow_of_two((unsigned long)_einittext - PAGE_OFFSET);
......
...@@ -259,8 +259,8 @@ print_mapping(unsigned long start, unsigned long end, unsigned long size, bool e ...@@ -259,8 +259,8 @@ print_mapping(unsigned long start, unsigned long end, unsigned long size, bool e
static unsigned long next_boundary(unsigned long addr, unsigned long end) static unsigned long next_boundary(unsigned long addr, unsigned long end)
{ {
#ifdef CONFIG_STRICT_KERNEL_RWX #ifdef CONFIG_STRICT_KERNEL_RWX
if (addr < __pa_symbol(__init_begin)) if (addr < __pa_symbol(__srwx_boundary))
return __pa_symbol(__init_begin); return __pa_symbol(__srwx_boundary);
#endif #endif
return end; return end;
} }
......
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