提交 c74a988a 编写于 作者: J James Morse 提交者: Yongqiang Liu

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

stable inclusion
from stable-v4.19.236
commit 51acb81130d1feee7fd043760b75f5377ab8d4f0
category: bugfix
bugzilla: 186460, https://gitee.com/src-openeuler/kernel/issues/I53MHA
CVE: CVE-2022-23960

--------------------------------

commit 03aff3a7 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.
Reviewed-by: NRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: NCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: NJames Morse <james.morse@arm.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NChen Jiahao <chenjiahao16@huawei.com>
Reviewed-by: NHanjun Guo <guohanjun@huawei.com>
Reviewed-by: NLiao Chang <liaochang1@huawei.com>
Signed-off-by: NYongqiang Liu <liuyongqiang13@huawei.com>
上级 7a79d423
...@@ -365,18 +365,20 @@ alternative_else_nop_endif ...@@ -365,18 +365,20 @@ alternative_else_nop_endif
ldp x24, x25, [sp, #16 * 12] ldp x24, x25, [sp, #16 * 12]
ldp x26, x27, [sp, #16 * 13] ldp x26, x27, [sp, #16 * 13]
ldp x28, x29, [sp, #16 * 14] 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 * ARCH_HAS_MEMBARRIER_SYNC_CORE rely on eret context synchronization
* when returning from IPI handler, and when returning to user-space. * when returning from IPI handler, and when returning to user-space.
*/ */
.if \el == 0 .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 #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
bne 4f bne 4f
msr far_el1, x30 msr far_el1, x29
tramp_alias x30, tramp_exit_native tramp_alias x30, tramp_exit_native
br x30 br x30
4: 4:
...@@ -384,6 +386,8 @@ alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0 ...@@ -384,6 +386,8 @@ alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0
br x30 br x30
#endif #endif
.else .else
ldr lr, [sp, #S_LR]
add sp, sp, #S_FRAME_SIZE // restore sp
eret eret
.endif .endif
.endm .endm
...@@ -1096,10 +1100,12 @@ alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003 ...@@ -1096,10 +1100,12 @@ alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003
.macro tramp_exit, regsize = 64 .macro tramp_exit, regsize = 64
adr x30, tramp_vectors adr x30, tramp_vectors
msr vbar_el1, x30 msr vbar_el1, x30
tramp_unmap_kernel x30 ldr lr, [sp, #S_LR]
tramp_unmap_kernel x29
.if \regsize == 64 .if \regsize == 64
mrs x30, far_el1 mrs x29, far_el1
.endif .endif
add sp, sp, #S_FRAME_SIZE // restore sp
eret eret
.endm .endm
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册