Skip to content

Commit 03aff3a

Browse files
author
James Morse
committed
arm64: entry: Free up another register on kpti's tramp_exit path
Kpti stashes x30 in far_el1 while it uses x30 for all its work. Making the vectors a per-cpu data structure will require a second register. Allow tramp_exit two registers before it unmaps the kernel, by leaving x30 on the stack, and stashing x29 in far_el1. Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: James Morse <james.morse@arm.com>
1 parent d739da1 commit 03aff3a

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

arch/arm64/kernel/entry.S

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -419,21 +419,26 @@ alternative_else_nop_endif
419419
ldp x24, x25, [sp, #16 * 12]
420420
ldp x26, x27, [sp, #16 * 13]
421421
ldp x28, x29, [sp, #16 * 14]
422-
ldr lr, [sp, #S_LR]
423-
add sp, sp, #PT_REGS_SIZE // restore sp
424422

425423
.if \el == 0
426-
alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0
424+
alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
425+
ldr lr, [sp, #S_LR]
426+
add sp, sp, #PT_REGS_SIZE // restore sp
427+
eret
428+
alternative_else_nop_endif
427429
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
428430
bne 4f
429-
msr far_el1, x30
431+
msr far_el1, x29
430432
tramp_alias x30, tramp_exit_native
431433
br x30
432434
4:
433435
tramp_alias x30, tramp_exit_compat
434436
br x30
435437
#endif
436438
.else
439+
ldr lr, [sp, #S_LR]
440+
add sp, sp, #PT_REGS_SIZE // restore sp
441+
437442
/* Ensure any device/NC reads complete */
438443
alternative_insn nop, "dmb sy", ARM64_WORKAROUND_1508412
439444

@@ -674,10 +679,12 @@ alternative_else_nop_endif
674679
.macro tramp_exit, regsize = 64
675680
adr x30, tramp_vectors
676681
msr vbar_el1, x30
677-
tramp_unmap_kernel x30
682+
ldr lr, [sp, #S_LR]
683+
tramp_unmap_kernel x29
678684
.if \regsize == 64
679-
mrs x30, far_el1
685+
mrs x29, far_el1
680686
.endif
687+
add sp, sp, #PT_REGS_SIZE // restore sp
681688
eret
682689
sb
683690
.endm

0 commit comments

Comments
 (0)