mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 21:57:43 +00:00
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: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220916131422.318752-2-mpe@ellerman.id.au
This commit is contained in:
parent
331771e836
commit
b150a4d12b
4 changed files with 11 additions and 5 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Various code relies on __init_begin being at the strict RWX boundary.
|
||||||
|
*/
|
||||||
|
. = ALIGN(STRICT_ALIGN_SIZE);
|
||||||
|
__srwx_boundary = .;
|
||||||
|
__init_begin = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init sections discarded at runtime
|
* Init sections discarded at runtime
|
||||||
*/
|
*/
|
||||||
. = ALIGN(STRICT_ALIGN_SIZE);
|
|
||||||
__init_begin = .;
|
|
||||||
.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
|
||||||
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
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue