Commit af7249b3 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Catalin Marinas

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: default avatarArd Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20230111102236.1430401-3-ardb@kernel.orgSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 82e49588
...@@ -543,19 +543,6 @@ SYM_INNER_LABEL(init_el2, SYM_L_LOCAL) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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 ...@@ -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"
......
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