1 |
From foo@baz Tue Mar 8 08:47:19 PM CET 2022 |
2 |
From: James Morse <james.morse@arm.com> |
3 |
Date: Tue, 23 Nov 2021 18:41:43 +0000 |
4 |
Subject: arm64: entry: Free up another register on kpti's tramp_exit path |
5 |
|
6 |
From: James Morse <james.morse@arm.com> |
7 |
|
8 |
commit 03aff3a77a58b5b52a77e00537a42090ad57b80b upstream. |
9 |
|
10 |
Kpti stashes x30 in far_el1 while it uses x30 for all its work. |
11 |
|
12 |
Making the vectors a per-cpu data structure will require a second |
13 |
register. |
14 |
|
15 |
Allow tramp_exit two registers before it unmaps the kernel, by |
16 |
leaving x30 on the stack, and stashing x29 in far_el1. |
17 |
|
18 |
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> |
19 |
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> |
20 |
Signed-off-by: James Morse <james.morse@arm.com> |
21 |
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
22 |
--- |
23 |
arch/arm64/kernel/entry.S | 19 +++++++++++++------ |
24 |
1 file changed, 13 insertions(+), 6 deletions(-) |
25 |
|
26 |
--- a/arch/arm64/kernel/entry.S |
27 |
+++ b/arch/arm64/kernel/entry.S |
28 |
@@ -419,14 +419,16 @@ alternative_else_nop_endif |
29 |
ldp x24, x25, [sp, #16 * 12] |
30 |
ldp x26, x27, [sp, #16 * 13] |
31 |
ldp x28, x29, [sp, #16 * 14] |
32 |
- ldr lr, [sp, #S_LR] |
33 |
- add sp, sp, #PT_REGS_SIZE // restore sp |
34 |
|
35 |
.if \el == 0 |
36 |
-alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0 |
37 |
+alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0 |
38 |
+ ldr lr, [sp, #S_LR] |
39 |
+ add sp, sp, #PT_REGS_SIZE // restore sp |
40 |
+ eret |
41 |
+alternative_else_nop_endif |
42 |
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 |
43 |
bne 4f |
44 |
- msr far_el1, x30 |
45 |
+ msr far_el1, x29 |
46 |
tramp_alias x30, tramp_exit_native |
47 |
br x30 |
48 |
4: |
49 |
@@ -434,6 +436,9 @@ alternative_insn eret, nop, ARM64_UNMAP_ |
50 |
br x30 |
51 |
#endif |
52 |
.else |
53 |
+ ldr lr, [sp, #S_LR] |
54 |
+ add sp, sp, #PT_REGS_SIZE // restore sp |
55 |
+ |
56 |
/* Ensure any device/NC reads complete */ |
57 |
alternative_insn nop, "dmb sy", ARM64_WORKAROUND_1508412 |
58 |
|
59 |
@@ -674,10 +679,12 @@ alternative_else_nop_endif |
60 |
.macro tramp_exit, regsize = 64 |
61 |
adr x30, tramp_vectors |
62 |
msr vbar_el1, x30 |
63 |
- tramp_unmap_kernel x30 |
64 |
+ ldr lr, [sp, #S_LR] |
65 |
+ tramp_unmap_kernel x29 |
66 |
.if \regsize == 64 |
67 |
- mrs x30, far_el1 |
68 |
+ mrs x29, far_el1 |
69 |
.endif |
70 |
+ add sp, sp, #PT_REGS_SIZE // restore sp |
71 |
eret |
72 |
sb |
73 |
.endm |