arm64: kernel: move identity map out of .text mapping
Reorganize the ID map slightly so that only code that is executed with the MMU off or via the 1:1 mapping remains. This allows us to move the identity map out of the .text segment, as it will no longer need executable permissions via the kernel mapping. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Link: https://lore.kernel.org/r/20230111102236.1430401-3-ardb@kernel.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
82e4958800
commit
af7249b317
3 changed files with 16 additions and 16 deletions
|
@ -543,19 +543,6 @@ SYM_INNER_LABEL(init_el2, SYM_L_LOCAL)
|
||||||
eret
|
eret
|
||||||
SYM_FUNC_END(init_kernel_el)
|
SYM_FUNC_END(init_kernel_el)
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the __boot_cpu_mode flag depending on the CPU boot mode passed
|
|
||||||
* in w0. See arch/arm64/include/asm/virt.h for more info.
|
|
||||||
*/
|
|
||||||
SYM_FUNC_START_LOCAL(set_cpu_boot_mode_flag)
|
|
||||||
adr_l x1, __boot_cpu_mode
|
|
||||||
cmp w0, #BOOT_CPU_MODE_EL2
|
|
||||||
b.ne 1f
|
|
||||||
add x1, x1, #4
|
|
||||||
1: str w0, [x1] // Save CPU boot mode
|
|
||||||
ret
|
|
||||||
SYM_FUNC_END(set_cpu_boot_mode_flag)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This provides a "holding pen" for platforms to hold all secondary
|
* This provides a "holding pen" for platforms to hold all secondary
|
||||||
* cores are held until we're ready for them to initialise.
|
* cores are held until we're ready for them to initialise.
|
||||||
|
@ -599,6 +586,7 @@ SYM_FUNC_START_LOCAL(secondary_startup)
|
||||||
br x8
|
br x8
|
||||||
SYM_FUNC_END(secondary_startup)
|
SYM_FUNC_END(secondary_startup)
|
||||||
|
|
||||||
|
.text
|
||||||
SYM_FUNC_START_LOCAL(__secondary_switched)
|
SYM_FUNC_START_LOCAL(__secondary_switched)
|
||||||
mov x0, x20
|
mov x0, x20
|
||||||
bl set_cpu_boot_mode_flag
|
bl set_cpu_boot_mode_flag
|
||||||
|
@ -631,6 +619,19 @@ SYM_FUNC_START_LOCAL(__secondary_too_slow)
|
||||||
b __secondary_too_slow
|
b __secondary_too_slow
|
||||||
SYM_FUNC_END(__secondary_too_slow)
|
SYM_FUNC_END(__secondary_too_slow)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sets the __boot_cpu_mode flag depending on the CPU boot mode passed
|
||||||
|
* in w0. See arch/arm64/include/asm/virt.h for more info.
|
||||||
|
*/
|
||||||
|
SYM_FUNC_START_LOCAL(set_cpu_boot_mode_flag)
|
||||||
|
adr_l x1, __boot_cpu_mode
|
||||||
|
cmp w0, #BOOT_CPU_MODE_EL2
|
||||||
|
b.ne 1f
|
||||||
|
add x1, x1, #4
|
||||||
|
1: str w0, [x1] // Save CPU boot mode
|
||||||
|
ret
|
||||||
|
SYM_FUNC_END(set_cpu_boot_mode_flag)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The booting CPU updates the failed status @__early_cpu_boot_status,
|
* The booting CPU updates the failed status @__early_cpu_boot_status,
|
||||||
* with MMU turned off.
|
* with MMU turned off.
|
||||||
|
@ -662,6 +663,7 @@ SYM_FUNC_END(__secondary_too_slow)
|
||||||
* Checks if the selected granule size is supported by the CPU.
|
* Checks if the selected granule size is supported by the CPU.
|
||||||
* If it isn't, park the CPU
|
* If it isn't, park the CPU
|
||||||
*/
|
*/
|
||||||
|
.section ".idmap.text","awx"
|
||||||
SYM_FUNC_START(__enable_mmu)
|
SYM_FUNC_START(__enable_mmu)
|
||||||
mrs x3, ID_AA64MMFR0_EL1
|
mrs x3, ID_AA64MMFR0_EL1
|
||||||
ubfx x3, x3, #ID_AA64MMFR0_EL1_TGRAN_SHIFT, 4
|
ubfx x3, x3, #ID_AA64MMFR0_EL1_TGRAN_SHIFT, 4
|
||||||
|
|
|
@ -179,7 +179,6 @@ SECTIONS
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
KPROBES_TEXT
|
KPROBES_TEXT
|
||||||
HYPERVISOR_TEXT
|
HYPERVISOR_TEXT
|
||||||
IDMAP_TEXT
|
|
||||||
*(.gnu.warning)
|
*(.gnu.warning)
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
*(.got) /* Global offset table */
|
*(.got) /* Global offset table */
|
||||||
|
@ -206,6 +205,7 @@ SECTIONS
|
||||||
TRAMP_TEXT
|
TRAMP_TEXT
|
||||||
HIBERNATE_TEXT
|
HIBERNATE_TEXT
|
||||||
KEXEC_TEXT
|
KEXEC_TEXT
|
||||||
|
IDMAP_TEXT
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,6 @@ SYM_FUNC_END(cpu_do_suspend)
|
||||||
*
|
*
|
||||||
* x0: Address of context pointer
|
* x0: Address of context pointer
|
||||||
*/
|
*/
|
||||||
.pushsection ".idmap.text", "awx"
|
|
||||||
SYM_FUNC_START(cpu_do_resume)
|
SYM_FUNC_START(cpu_do_resume)
|
||||||
ldp x2, x3, [x0]
|
ldp x2, x3, [x0]
|
||||||
ldp x4, x5, [x0, #16]
|
ldp x4, x5, [x0, #16]
|
||||||
|
@ -166,7 +165,6 @@ alternative_else_nop_endif
|
||||||
isb
|
isb
|
||||||
ret
|
ret
|
||||||
SYM_FUNC_END(cpu_do_resume)
|
SYM_FUNC_END(cpu_do_resume)
|
||||||
.popsection
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.pushsection ".idmap.text", "awx"
|
.pushsection ".idmap.text", "awx"
|
||||||
|
|
Loading…
Add table
Reference in a new issue