Skip to content

Commit bc9f3d7

Browse files
Ard Biesheuvelctmarinas
authored andcommitted
arm64: kernel: avoid literal load of virtual address with MMU off
Literal loads of virtual addresses are subject to runtime relocation when CONFIG_RELOCATABLE=y, and given that the relocation routines run with the MMU and caches enabled, literal loads of relocated values performed with the MMU off are not guaranteed to return the latest value unless the memory covering the literal is cleaned to the PoC explicitly. So defer the literal load until after the MMU has been enabled, just like we do for primary_switch() and secondary_switch() in head.S. Fixes: 1e48ef7 ("arm64: add support for building vmlinux as a relocatable PIE binary") Cc: <stable@vger.kernel.org> # 4.6+ Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
1 parent bfe6c8a commit bc9f3d7

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

arch/arm64/kernel/sleep.S

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,20 @@ ENTRY(cpu_resume)
101101
bl el2_setup // if in EL2 drop to EL1 cleanly
102102
/* enable the MMU early - so we can access sleep_save_stash by va */
103103
adr_l lr, __enable_mmu /* __cpu_setup will return here */
104-
ldr x27, =_cpu_resume /* __enable_mmu will branch here */
104+
adr_l x27, _resume_switched /* __enable_mmu will branch here */
105105
adrp x25, idmap_pg_dir
106106
adrp x26, swapper_pg_dir
107107
b __cpu_setup
108108
ENDPROC(cpu_resume)
109109

110+
.pushsection ".idmap.text", "ax"
111+
_resume_switched:
112+
ldr x8, =_cpu_resume
113+
br x8
114+
ENDPROC(_resume_switched)
115+
.ltorg
116+
.popsection
117+
110118
ENTRY(_cpu_resume)
111119
mrs x1, mpidr_el1
112120
adrp x8, mpidr_hash

0 commit comments

Comments
 (0)