| From foo@baz Sat Mar 19 01:51:18 PM CET 2022 |
| From: James Morse <james.morse@arm.com> |
| Date: Fri, 18 Mar 2022 17:48:31 +0000 |
| Subject: arm64: entry: Make the kpti trampoline's kpti sequence optional |
| To: stable@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org, james.morse@arm.com, catalin.marinas@arm.com |
| Message-ID: <20220318174842.2321061-12-james.morse@arm.com> |
| |
| From: James Morse <james.morse@arm.com> |
| |
| commit c47e4d04ba0f1ea17353d85d45f611277507e07a upstream. |
| |
| Spectre-BHB needs to add sequences to the vectors. Having one global |
| set of vectors is a problem for big/little systems where the sequence |
| is costly on cpus that are not vulnerable. |
| |
| Making the vectors per-cpu in the style of KVM's bh_harden_hyp_vecs |
| requires the vectors to be generated by macros. |
| |
| Make the kpti re-mapping of the kernel optional, so the macros can be |
| used without kpti. |
| |
| Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> |
| Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: James Morse <james.morse@arm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm64/kernel/entry.S | 17 +++++++++++------ |
| 1 file changed, 11 insertions(+), 6 deletions(-) |
| |
| --- a/arch/arm64/kernel/entry.S |
| +++ b/arch/arm64/kernel/entry.S |
| @@ -970,9 +970,10 @@ alternative_else_nop_endif |
| sub \dst, \dst, PAGE_SIZE |
| .endm |
| |
| - .macro tramp_ventry, vector_start, regsize |
| + .macro tramp_ventry, vector_start, regsize, kpti |
| .align 7 |
| 1: |
| + .if \kpti == 1 |
| .if \regsize == 64 |
| msr tpidrro_el0, x30 // Restored in kernel_ventry |
| .endif |
| @@ -994,8 +995,12 @@ alternative_insn isb, nop, ARM64_WORKARO |
| #endif |
| prfm plil1strm, [x30, #(1b - \vector_start)] |
| msr vbar_el1, x30 |
| - add x30, x30, #(1b - \vector_start + 4) |
| isb |
| + .else |
| + ldr x30, =vectors |
| + .endif // \kpti == 1 |
| + |
| + add x30, x30, #(1b - \vector_start + 4) |
| ret |
| .org 1b + 128 // Did we overflow the ventry slot? |
| .endm |
| @@ -1012,15 +1017,15 @@ alternative_insn isb, nop, ARM64_WORKARO |
| eret |
| .endm |
| |
| - .macro generate_tramp_vector |
| + .macro generate_tramp_vector, kpti |
| .Lvector_start\@: |
| .space 0x400 |
| |
| .rept 4 |
| - tramp_ventry .Lvector_start\@, 64 |
| + tramp_ventry .Lvector_start\@, 64, \kpti |
| .endr |
| .rept 4 |
| - tramp_ventry .Lvector_start\@, 32 |
| + tramp_ventry .Lvector_start\@, 32, \kpti |
| .endr |
| .endm |
| |
| @@ -1031,7 +1036,7 @@ alternative_insn isb, nop, ARM64_WORKARO |
| .pushsection ".entry.tramp.text", "ax" |
| .align 11 |
| ENTRY(tramp_vectors) |
| - generate_tramp_vector |
| + generate_tramp_vector kpti=1 |
| END(tramp_vectors) |
| |
| ENTRY(tramp_exit_native) |