ARM: mm: switch to swapper_pg_dir early for vmap'ed stack
When onlining a CPU, switch to swapper_pg_dir as soon as possible so that it is guaranteed that the vmap'ed stack is mapped before it is used. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
5fe41793bc
commit
8b806b82bc
@ -128,7 +128,7 @@ config ARM
|
|||||||
select RTC_LIB
|
select RTC_LIB
|
||||||
select SYS_SUPPORTS_APM_EMULATION
|
select SYS_SUPPORTS_APM_EMULATION
|
||||||
select THREAD_INFO_IN_TASK
|
select THREAD_INFO_IN_TASK
|
||||||
select HAVE_ARCH_VMAP_STACK if MMU && (!LD_IS_LLD || LLD_VERSION >= 140000) && !PM_SLEEP_SMP
|
select HAVE_ARCH_VMAP_STACK if MMU && (!LD_IS_LLD || LLD_VERSION >= 140000)
|
||||||
select TRACE_IRQFLAGS_SUPPORT if !CPU_V7M
|
select TRACE_IRQFLAGS_SUPPORT if !CPU_V7M
|
||||||
# Above selects are sorted alphabetically; please add new ones
|
# Above selects are sorted alphabetically; please add new ones
|
||||||
# according to that. Thanks.
|
# according to that. Thanks.
|
||||||
|
@ -424,6 +424,13 @@ ENDPROC(secondary_startup)
|
|||||||
ENDPROC(secondary_startup_arm)
|
ENDPROC(secondary_startup_arm)
|
||||||
|
|
||||||
ENTRY(__secondary_switched)
|
ENTRY(__secondary_switched)
|
||||||
|
#if defined(CONFIG_VMAP_STACK) && !defined(CONFIG_ARM_LPAE)
|
||||||
|
@ Before using the vmap'ed stack, we have to switch to swapper_pg_dir
|
||||||
|
@ as the ID map does not cover the vmalloc region.
|
||||||
|
mrc p15, 0, ip, c2, c0, 1 @ read TTBR1
|
||||||
|
mcr p15, 0, ip, c2, c0, 0 @ set TTBR0
|
||||||
|
instr_sync
|
||||||
|
#endif
|
||||||
adr_l r7, secondary_data + 12 @ get secondary_data.stack
|
adr_l r7, secondary_data + 12 @ get secondary_data.stack
|
||||||
ldr sp, [r7]
|
ldr sp, [r7]
|
||||||
ldr r0, [r7, #4] @ get secondary_data.task
|
ldr r0, [r7, #4] @ get secondary_data.task
|
||||||
|
@ -119,6 +119,13 @@ ENTRY(cpu_resume_mmu)
|
|||||||
ENDPROC(cpu_resume_mmu)
|
ENDPROC(cpu_resume_mmu)
|
||||||
.popsection
|
.popsection
|
||||||
cpu_resume_after_mmu:
|
cpu_resume_after_mmu:
|
||||||
|
#if defined(CONFIG_VMAP_STACK) && !defined(CONFIG_ARM_LPAE)
|
||||||
|
@ Before using the vmap'ed stack, we have to switch to swapper_pg_dir
|
||||||
|
@ as the ID map does not cover the vmalloc region.
|
||||||
|
mrc p15, 0, ip, c2, c0, 1 @ read TTBR1
|
||||||
|
mcr p15, 0, ip, c2, c0, 0 @ set TTBR0
|
||||||
|
instr_sync
|
||||||
|
#endif
|
||||||
bl cpu_init @ restore the und/abt/irq banked regs
|
bl cpu_init @ restore the und/abt/irq banked regs
|
||||||
mov r0, #0 @ return zero on success
|
mov r0, #0 @ return zero on success
|
||||||
ldmfd sp!, {r4 - r11, pc}
|
ldmfd sp!, {r4 - r11, pc}
|
||||||
|
Loading…
Reference in New Issue
Block a user