UPSTREAM: arm64: entry: Allow tramp_alias to access symbols after the 4K boundary
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. Bug: 215557547 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> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic7a70f79baeacb3c8d12c396009968e563a2e69a
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
6e48449c91
commit
0defb52ce6
@@ -128,9 +128,12 @@
|
|||||||
.org .Lventry_start\@ + 128 // Did we overflow the ventry slot?
|
.org .Lventry_start\@ + 128 // Did we overflow the ventry slot?
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro tramp_alias, dst, sym
|
.macro tramp_alias, dst, sym, tmp
|
||||||
mov_q \dst, TRAMP_VALIAS
|
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
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -466,10 +469,10 @@ alternative_else_nop_endif
|
|||||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||||
bne 4f
|
bne 4f
|
||||||
msr far_el1, x29
|
msr far_el1, x29
|
||||||
tramp_alias x30, tramp_exit_native
|
tramp_alias x30, tramp_exit_native, x29
|
||||||
br x30
|
br x30
|
||||||
4:
|
4:
|
||||||
tramp_alias x30, tramp_exit_compat
|
tramp_alias x30, tramp_exit_compat, x29
|
||||||
br x30
|
br x30
|
||||||
#endif
|
#endif
|
||||||
.else
|
.else
|
||||||
@@ -1228,7 +1231,7 @@ alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
|
|||||||
alternative_else_nop_endif
|
alternative_else_nop_endif
|
||||||
|
|
||||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
#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
|
br x5
|
||||||
#endif
|
#endif
|
||||||
SYM_CODE_END(__sdei_asm_handler)
|
SYM_CODE_END(__sdei_asm_handler)
|
||||||
|
Reference in New Issue
Block a user