1 |
From foo@baz Tue Mar 8 08:47:19 PM CET 2022 |
2 |
From: James Morse <james.morse@arm.com> |
3 |
Date: Thu, 18 Nov 2021 13:16:23 +0000 |
4 |
Subject: arm64: entry: Make the kpti trampoline's kpti sequence optional |
5 |
|
6 |
From: James Morse <james.morse@arm.com> |
7 |
|
8 |
commit c47e4d04ba0f1ea17353d85d45f611277507e07a upstream. |
9 |
|
10 |
Spectre-BHB needs to add sequences to the vectors. Having one global |
11 |
set of vectors is a problem for big/little systems where the sequence |
12 |
is costly on cpus that are not vulnerable. |
13 |
|
14 |
Making the vectors per-cpu in the style of KVM's bh_harden_hyp_vecs |
15 |
requires the vectors to be generated by macros. |
16 |
|
17 |
Make the kpti re-mapping of the kernel optional, so the macros can be |
18 |
used without kpti. |
19 |
|
20 |
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> |
21 |
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> |
22 |
Signed-off-by: James Morse <james.morse@arm.com> |
23 |
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
24 |
--- |
25 |
arch/arm64/kernel/entry.S | 18 ++++++++++++------ |
26 |
1 file changed, 12 insertions(+), 6 deletions(-) |
27 |
|
28 |
--- a/arch/arm64/kernel/entry.S |
29 |
+++ b/arch/arm64/kernel/entry.S |
30 |
@@ -646,9 +646,10 @@ alternative_else_nop_endif |
31 |
sub \dst, \dst, PAGE_SIZE |
32 |
.endm |
33 |
|
34 |
- .macro tramp_ventry, vector_start, regsize |
35 |
+ .macro tramp_ventry, vector_start, regsize, kpti |
36 |
.align 7 |
37 |
1: |
38 |
+ .if \kpti == 1 |
39 |
.if \regsize == 64 |
40 |
msr tpidrro_el0, x30 // Restored in kernel_ventry |
41 |
.endif |
42 |
@@ -671,9 +672,14 @@ alternative_insn isb, nop, ARM64_WORKARO |
43 |
alternative_if_not ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM |
44 |
prfm plil1strm, [x30, #(1b - \vector_start)] |
45 |
alternative_else_nop_endif |
46 |
+ |
47 |
msr vbar_el1, x30 |
48 |
- add x30, x30, #(1b - \vector_start + 4) |
49 |
isb |
50 |
+ .else |
51 |
+ ldr x30, =vectors |
52 |
+ .endif // \kpti == 1 |
53 |
+ |
54 |
+ add x30, x30, #(1b - \vector_start + 4) |
55 |
ret |
56 |
.org 1b + 128 // Did we overflow the ventry slot? |
57 |
.endm |
58 |
@@ -691,15 +697,15 @@ alternative_else_nop_endif |
59 |
sb |
60 |
.endm |
61 |
|
62 |
- .macro generate_tramp_vector |
63 |
+ .macro generate_tramp_vector, kpti |
64 |
.Lvector_start\@: |
65 |
.space 0x400 |
66 |
|
67 |
.rept 4 |
68 |
- tramp_ventry .Lvector_start\@, 64 |
69 |
+ tramp_ventry .Lvector_start\@, 64, \kpti |
70 |
.endr |
71 |
.rept 4 |
72 |
- tramp_ventry .Lvector_start\@, 32 |
73 |
+ tramp_ventry .Lvector_start\@, 32, \kpti |
74 |
.endr |
75 |
.endm |
76 |
|
77 |
@@ -710,7 +716,7 @@ alternative_else_nop_endif |
78 |
.pushsection ".entry.tramp.text", "ax" |
79 |
.align 11 |
80 |
SYM_CODE_START_NOALIGN(tramp_vectors) |
81 |
- generate_tramp_vector |
82 |
+ generate_tramp_vector kpti=1 |
83 |
SYM_CODE_END(tramp_vectors) |
84 |
|
85 |
SYM_CODE_START(tramp_exit_native) |