Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+15 -1
+1 -1
arch/arm/Kconfig
··· 128 128 select RTC_LIB 129 129 select SYS_SUPPORTS_APM_EMULATION 130 130 select THREAD_INFO_IN_TASK 131 - select HAVE_ARCH_VMAP_STACK if MMU && (!LD_IS_LLD || LLD_VERSION >= 140000) && !PM_SLEEP_SMP 131 + select HAVE_ARCH_VMAP_STACK if MMU && (!LD_IS_LLD || LLD_VERSION >= 140000) 132 132 select TRACE_IRQFLAGS_SUPPORT if !CPU_V7M 133 133 # Above selects are sorted alphabetically; please add new ones 134 134 # according to that. Thanks.
+7
arch/arm/kernel/head.S
··· 424 424 ENDPROC(secondary_startup_arm) 425 425 426 426 ENTRY(__secondary_switched) 427 + #if defined(CONFIG_VMAP_STACK) && !defined(CONFIG_ARM_LPAE) 428 + @ Before using the vmap'ed stack, we have to switch to swapper_pg_dir 429 + @ as the ID map does not cover the vmalloc region. 430 + mrc p15, 0, ip, c2, c0, 1 @ read TTBR1 431 + mcr p15, 0, ip, c2, c0, 0 @ set TTBR0 432 + instr_sync 433 + #endif 427 434 adr_l r7, secondary_data + 12 @ get secondary_data.stack 428 435 ldr sp, [r7] 429 436 ldr r0, [r7, #4] @ get secondary_data.task
+7
arch/arm/kernel/sleep.S
··· 119 119 ENDPROC(cpu_resume_mmu) 120 120 .popsection 121 121 cpu_resume_after_mmu: 122 + #if defined(CONFIG_VMAP_STACK) && !defined(CONFIG_ARM_LPAE) 123 + @ Before using the vmap'ed stack, we have to switch to swapper_pg_dir 124 + @ as the ID map does not cover the vmalloc region. 125 + mrc p15, 0, ip, c2, c0, 1 @ read TTBR1 126 + mcr p15, 0, ip, c2, c0, 0 @ set TTBR0 127 + instr_sync 128 + #endif 122 129 bl cpu_init @ restore the und/abt/irq banked regs 123 130 mov r0, #0 @ return zero on success 124 131 ldmfd sp!, {r4 - r11, pc}