[PATCH v2 1/2] arm64: entry: Preserve/restore X29 even for compat tasks

Ard Biesheuvel ardb at kernel.org
Tue Apr 18 07:36:03 PDT 2023


Currently, the KPTI trampoline code for returning to user space takes
care to only preserve X29 into FAR_EL1 for native tasks, as compat tasks
don't have access to this register anyway, and so preserving it is not
necessary. It also means it does not need to be restored, and so we have
two code paths for returning back to user space: the native one that
restores X29 from FAR_EL1, and the compat one that leaves X29 clobbered,
containing the value of TTBR1_EL1, which carries a physical address
pointing somewhere into the kernel image.

This is needlessly complex, and given that FAR_EL1 becomes UNKNOWN after
an exception return anway, the only benefit of avoiding the preserve and
restore is that we can skip the system register write and read.

So let's simplify this, and collapse the two code paths into one that
always preserves X29 into FAR_EL1, and always restores it again after
the TTBR switch.

Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
---
 arch/arm64/kernel/entry.S | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index ab2a6e33c0528d82..16fbd0d9790dd436 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -435,13 +435,9 @@ alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
 	eret
 alternative_else_nop_endif
 #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
-	bne	4f
 	msr	far_el1, x29
 	tramp_alias	x30, tramp_exit_native, x29
 	br	x30
-4:
-	tramp_alias	x30, tramp_exit_compat, x29
-	br	x30
 #endif
 	.else
 	ldr	lr, [sp, #S_LR]
@@ -740,9 +736,7 @@ alternative_else_nop_endif
 	msr	vbar_el1, x30
 	ldr	lr, [sp, #S_LR]
 	tramp_unmap_kernel	x29
-	.if	\regsize == 64
 	mrs	x29, far_el1
-	.endif
 	add	sp, sp, #PT_REGS_SIZE		// restore sp
 	eret
 	sb
@@ -780,10 +774,6 @@ SYM_CODE_END(tramp_vectors)
 SYM_CODE_START(tramp_exit_native)
 	tramp_exit
 SYM_CODE_END(tramp_exit_native)
-
-SYM_CODE_START(tramp_exit_compat)
-	tramp_exit	32
-SYM_CODE_END(tramp_exit_compat)
 	.popsection				// .entry.tramp.text
 #endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */
 
-- 
2.39.2




More information about the linux-arm-kernel mailing list