arm64: entry: Move the trampoline data page before the text page
commit c091fb6ae059cda563b2a4d93fdbc548ef34e1d6 upstream.
The trampoline code has a data page that holds the address of the vectors,
which is unmapped when running in user-space. This ensures that with
CONFIG_RANDOMIZE_BASE the randomised address of the kernel cannot be
discovered until after the kernel has been mapped.
If the trampoline text page is extended to include multiple sets of
vectors, it will be larger than a single page making it tricky to
find the data page without knowing the size of the trampoline text
pages, which will vary with PAGE_SIZE.
Move the data page to appear before the text page. This allows the
data page to be found without knowing the size of the trampoline text
pages. 'tramp_vectors' is used to refer to the beginning of the
.entry.tramp.text section,so do that explicitly.
Change-Id: I0034331c077fbd3e49b4934d84ec009b0797bf34
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>
Git-commit: 266b1ef136
Git-repo: https://android.googlesource.com/kernel/common/
Signed-off-by: Kishor Krishna Bhat <quic_kishkris@quicinc.com>
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
parent
0465045e68
commit
5b732b09f2
@@ -59,8 +59,8 @@ enum fixed_addresses {
|
|||||||
#endif /* CONFIG_ACPI_APEI_GHES */
|
#endif /* CONFIG_ACPI_APEI_GHES */
|
||||||
|
|
||||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||||
FIX_ENTRY_TRAMP_DATA,
|
|
||||||
FIX_ENTRY_TRAMP_TEXT,
|
FIX_ENTRY_TRAMP_TEXT,
|
||||||
|
FIX_ENTRY_TRAMP_DATA,
|
||||||
#define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT))
|
#define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT))
|
||||||
#endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */
|
#endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */
|
||||||
__end_of_permanent_fixed_addresses,
|
__end_of_permanent_fixed_addresses,
|
||||||
|
|||||||
@@ -1000,6 +1000,11 @@ alternative_else_nop_endif
|
|||||||
*/
|
*/
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro tramp_data_page dst
|
||||||
|
adr \dst, .entry.tramp.text
|
||||||
|
sub \dst, \dst, PAGE_SIZE
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro tramp_ventry, regsize = 64
|
.macro tramp_ventry, regsize = 64
|
||||||
.align 7
|
.align 7
|
||||||
1:
|
1:
|
||||||
@@ -1016,7 +1021,7 @@ alternative_else_nop_endif
|
|||||||
2:
|
2:
|
||||||
tramp_map_kernel x30
|
tramp_map_kernel x30
|
||||||
#ifdef CONFIG_RANDOMIZE_BASE
|
#ifdef CONFIG_RANDOMIZE_BASE
|
||||||
adr x30, tramp_vectors + PAGE_SIZE
|
tramp_data_page x30
|
||||||
alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003
|
alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003
|
||||||
ldr x30, [x30]
|
ldr x30, [x30]
|
||||||
#else
|
#else
|
||||||
@@ -1169,7 +1174,7 @@ ENTRY(__sdei_asm_entry_trampoline)
|
|||||||
1: str x4, [x1, #(SDEI_EVENT_INTREGS + S_ORIG_ADDR_LIMIT)]
|
1: str x4, [x1, #(SDEI_EVENT_INTREGS + S_ORIG_ADDR_LIMIT)]
|
||||||
|
|
||||||
#ifdef CONFIG_RANDOMIZE_BASE
|
#ifdef CONFIG_RANDOMIZE_BASE
|
||||||
adr x4, tramp_vectors + PAGE_SIZE
|
tramp_data_page x4
|
||||||
add x4, x4, #:lo12:__sdei_asm_trampoline_next_handler
|
add x4, x4, #:lo12:__sdei_asm_trampoline_next_handler
|
||||||
ldr x4, [x4]
|
ldr x4, [x4]
|
||||||
#else
|
#else
|
||||||
|
|||||||
Reference in New Issue
Block a user