| 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:29 +0000 |
| Subject: arm64: entry: Don't assume tramp_vectors is the start of the vectors |
| To: stable@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org, james.morse@arm.com, catalin.marinas@arm.com |
| Message-ID: <20220318174842.2321061-10-james.morse@arm.com> |
| |
| From: James Morse <james.morse@arm.com> |
| |
| commit ed50da7764535f1e24432ded289974f2bf2b0c5a upstream. |
| |
| The tramp_ventry macro uses tramp_vectors as the address of the vectors |
| when calculating which ventry in the 'full fat' vectors to branch to. |
| |
| While there is one set of tramp_vectors, this will be true. |
| Adding multiple sets of vectors will break this assumption. |
| |
| Move the generation of the vectors to a macro, and pass the start |
| of the vectors as an argument to tramp_ventry. |
| |
| 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 | 30 ++++++++++++++++-------------- |
| 1 file changed, 16 insertions(+), 14 deletions(-) |
| |
| --- a/arch/arm64/kernel/entry.S |
| +++ b/arch/arm64/kernel/entry.S |
| @@ -975,7 +975,7 @@ alternative_else_nop_endif |
| sub \dst, \dst, PAGE_SIZE |
| .endm |
| |
| - .macro tramp_ventry, regsize = 64 |
| + .macro tramp_ventry, vector_start, regsize |
| .align 7 |
| 1: |
| .if \regsize == 64 |
| @@ -997,9 +997,9 @@ alternative_insn isb, nop, ARM64_WORKARO |
| #else |
| ldr x30, =vectors |
| #endif |
| - prfm plil1strm, [x30, #(1b - tramp_vectors)] |
| + prfm plil1strm, [x30, #(1b - \vector_start)] |
| msr vbar_el1, x30 |
| - add x30, x30, #(1b - tramp_vectors + 4) |
| + add x30, x30, #(1b - \vector_start + 4) |
| isb |
| ret |
| .org 1b + 128 // Did we overflow the ventry slot? |
| @@ -1017,19 +1017,21 @@ alternative_insn isb, nop, ARM64_WORKARO |
| eret |
| .endm |
| |
| - .align 11 |
| -ENTRY(tramp_vectors) |
| + .macro generate_tramp_vector |
| +.Lvector_start\@: |
| .space 0x400 |
| |
| - tramp_ventry |
| - tramp_ventry |
| - tramp_ventry |
| - tramp_ventry |
| - |
| - tramp_ventry 32 |
| - tramp_ventry 32 |
| - tramp_ventry 32 |
| - tramp_ventry 32 |
| + .rept 4 |
| + tramp_ventry .Lvector_start\@, 64 |
| + .endr |
| + .rept 4 |
| + tramp_ventry .Lvector_start\@, 32 |
| + .endr |
| + .endm |
| + |
| + .align 11 |
| +ENTRY(tramp_vectors) |
| + generate_tramp_vector |
| END(tramp_vectors) |
| |
| ENTRY(tramp_exit_native) |