diff -drupN a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S --- a/arch/arm/kernel/sleep.S 2018-08-06 17:23:04.000000000 +0300 +++ b/arch/arm/kernel/sleep.S 2022-06-12 05:28:14.000000000 +0300 @@ -67,6 +67,12 @@ ENTRY(__cpu_suspend) #endif mov r5, sp @ current virtual SP add r4, r4, #12 @ Space for pgd, virt sp, phys resume fn +#ifdef CONFIG_VMAP_STACK + ldr r6, =#~PAGE_MASK + and r6, r5, r6 @ get offset in page + cmp r6, r4 + suble sp, sp, r6 @ expand hole at page boundary to physical address +#endif sub sp, sp, r4 @ allocate CPU state on stack ldr r3, =sleep_save_sp stmfd sp!, {r0, r1} @ save suspend func arg and pointer @@ -111,6 +117,13 @@ ENTRY(cpu_resume_mmu) ENDPROC(cpu_resume_mmu) .popsection cpu_resume_after_mmu: + isb +#ifdef CONFIG_ARM_LPAE + mcrr p15, 1, r1, r2, c2 @ set TTB 0 +#else + mcr p15, 0, r1, c2, c0, 0 @ set TTB 0 +#endif + isb bl cpu_init @ restore the und/abt/irq banked regs mov r0, #0 @ return zero on success ldmfd sp!, {r4 - r11, pc}