Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0465045e authored by James Morse's avatar James Morse Committed by Gerrit - the friendly Code Review server
Browse files

arm64: entry: Free up another register on kpti's tramp_exit path



commit 03aff3a77a58b5b52a77e00537a42090ad57b80b upstream.

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.

Change-Id: I324402ec90a8401780ac88d6ed91eaa50fb1911a
Reviewed-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarJames Morse <james.morse@arm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Git-commit: 51acb811
Git-repo: https://android.googlesource.com/kernel/common/


Signed-off-by: default avatarKishor Krishna Bhat <quic_kishkris@quicinc.com>
parent aa33c630
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -358,18 +358,20 @@ alternative_else_nop_endif
	ldp	x24, x25, [sp, #16 * 12]
	ldp	x26, x27, [sp, #16 * 13]
	ldp	x28, x29, [sp, #16 * 14]
	ldr	lr, [sp, #S_LR]
	add	sp, sp, #S_FRAME_SIZE		// restore sp
	/*
	 * ARCH_HAS_MEMBARRIER_SYNC_CORE rely on eret context synchronization
	 * when returning from IPI handler, and when returning to user-space.
	 */

	.if	\el == 0
alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0
alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
	ldr	lr, [sp, #S_LR]
	add	sp, sp, #S_FRAME_SIZE 		//restore sp
	eret
alternative_else_nop_endif
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
	bne	4f
	msr	far_el1, x30
	msr	far_el1, x29
	tramp_alias	x30, tramp_exit_native
	br	x30
4:
@@ -377,6 +379,8 @@ alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0
	br	x30
#endif
	.else
	ldr	lr, [sp, #S_LR]
	add	sp, sp, #S_FRAME_SIZE		// restore sp
	eret
	.endif
	.endm
@@ -1029,10 +1033,12 @@ alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003
	.macro tramp_exit, regsize = 64
	adr	x30, tramp_vectors
	msr	vbar_el1, x30
	tramp_unmap_kernel	x30
	ldr	lr, [sp, #S_LR]
	tramp_unmap_kernel	x29
	.if	\regsize == 64
	mrs	x30, far_el1
	mrs	x29, far_el1
	.endif
	add	sp, sp, #S_FRAME_SIZE   //restore sp
	eret
	.endm