]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
arm64: entry: Move the trampoline data page before the text page
authorJames Morse <james.morse@arm.com>
Wed, 6 Apr 2022 16:45:31 +0000 (17:45 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Apr 2022 05:52:16 +0000 (07:52 +0200)
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 can't 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, do that explicitly.

Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
[ removed SDEI for backport ]
Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/include/asm/fixmap.h
arch/arm64/kernel/entry.S

index d8e58051f32d47ab5e93ec389672c1fbc4bf71c8..feee38303afe4f15c21aa8f97d82b761552730a7 100644 (file)
@@ -53,8 +53,8 @@ enum fixed_addresses {
        FIX_TEXT_POKE0,
 
 #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
-       FIX_ENTRY_TRAMP_DATA,
        FIX_ENTRY_TRAMP_TEXT,
+       FIX_ENTRY_TRAMP_DATA,
 #define TRAMP_VALIAS           (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT))
 #endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */
        __end_of_permanent_fixed_addresses,
index 40647b5e279ec47360794036faf42461e47011e3..d665714cdca69eafe02f0f523372c0d1353c39fa 100644 (file)
@@ -918,6 +918,11 @@ __ni_sys_trace:
         */
        .endm
 
+       .macro tramp_data_page  dst
+       adr     \dst, .entry.tramp.text
+       sub     \dst, \dst, PAGE_SIZE
+       .endm
+
        .macro tramp_ventry, regsize = 64
        .align  7
 1:
@@ -934,7 +939,7 @@ __ni_sys_trace:
 2:
        tramp_map_kernel        x30
 #ifdef CONFIG_RANDOMIZE_BASE
-       adr     x30, tramp_vectors + PAGE_SIZE
+       tramp_data_page         x30
        isb
        ldr     x30, [x30]
 #else