| 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:28 +0000 |
| Subject: arm64: entry: Allow tramp_alias to access symbols after the 4K boundary |
| To: stable@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org, james.morse@arm.com, catalin.marinas@arm.com |
| Message-ID: <20220318174842.2321061-9-james.morse@arm.com> |
| |
| From: James Morse <james.morse@arm.com> |
| |
| commit 6c5bf79b69f911560fbf82214c0971af6e58e682 upstream. |
| |
| Systems using kpti enter and exit the kernel through a trampoline mapping |
| that is always mapped, even when the kernel is not. tramp_valias is a macro |
| to find the address of a symbol in the trampoline mapping. |
| |
| Adding extra sets of vectors will expand the size of the entry.tramp.text |
| section to beyond 4K. tramp_valias will be unable to generate addresses |
| for symbols beyond 4K as it uses the 12 bit immediate of the add |
| instruction. |
| |
| As there are now two registers available when tramp_alias is called, |
| use the extra register to avoid the 4K limit of the 12 bit immediate. |
| |
| 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 | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| --- a/arch/arm64/kernel/entry.S |
| +++ b/arch/arm64/kernel/entry.S |
| @@ -135,9 +135,12 @@ |
| .org .Lventry_start\@ + 128 // Did we overflow the ventry slot? |
| .endm |
| |
| - .macro tramp_alias, dst, sym |
| + .macro tramp_alias, dst, sym, tmp |
| mov_q \dst, TRAMP_VALIAS |
| - add \dst, \dst, #(\sym - .entry.tramp.text) |
| + adr_l \tmp, \sym |
| + add \dst, \dst, \tmp |
| + adr_l \tmp, .entry.tramp.text |
| + sub \dst, \dst, \tmp |
| .endm |
| |
| // This macro corrupts x0-x3. It is the caller's duty |
| @@ -362,10 +365,10 @@ alternative_else_nop_endif |
| #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 |
| bne 4f |
| msr far_el1, x29 |
| - tramp_alias x30, tramp_exit_native |
| + tramp_alias x30, tramp_exit_native, x29 |
| br x30 |
| 4: |
| - tramp_alias x30, tramp_exit_compat |
| + tramp_alias x30, tramp_exit_compat, x29 |
| br x30 |
| #endif |
| .else |
| @@ -1265,7 +1268,7 @@ alternative_if_not ARM64_UNMAP_KERNEL_AT |
| alternative_else_nop_endif |
| |
| #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 |
| - tramp_alias dst=x5, sym=__sdei_asm_exit_trampoline |
| + tramp_alias dst=x5, sym=__sdei_asm_exit_trampoline, tmp=x3 |
| br x5 |
| #endif |
| ENDPROC(__sdei_asm_handler) |