This patch clears up trampoline memory and copies trampoline code in
place. It's not yet used though.

Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
Tested-by: Borislav Petkov <b...@suse.de>
---
 arch/x86/boot/compressed/head_64.S    | 3 ++-
 arch/x86/boot/compressed/pgtable.h    | 9 +++++++++
 arch/x86/boot/compressed/pgtable_64.c | 7 +++++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/arch/x86/boot/compressed/head_64.S 
b/arch/x86/boot/compressed/head_64.S
index 8ba0582c65d5..c813cb004056 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -501,8 +501,9 @@ relocated:
        jmp     *%rax
 
        .code32
+ENTRY(trampoline_32bit_src)
 compatible_mode:
-       /* Setup data and stack segments */
+       /* Set up data and stack segments */
        movl    $__KERNEL_DS, %eax
        movl    %eax, %ds
        movl    %eax, %ss
diff --git a/arch/x86/boot/compressed/pgtable.h 
b/arch/x86/boot/compressed/pgtable.h
index 1895f345eb73..cfcb8beeac8f 100644
--- a/arch/x86/boot/compressed/pgtable.h
+++ b/arch/x86/boot/compressed/pgtable.h
@@ -3,9 +3,18 @@
 
 #define TRAMPOLINE_32BIT_SIZE          (2 * PAGE_SIZE)
 
+#define TRAMPOLINE_32BIT_PGTABLE_OFFSET        0
+
+#define TRAMPOLINE_32BIT_CODE_OFFSET   PAGE_SIZE
+#define TRAMPOLINE_32BIT_CODE_SIZE     0x60
+
+#define TRAMPOLINE_32BIT_STACK_END     TRAMPOLINE_32BIT_SIZE
+
 #ifndef __ASSEMBLY__
 
 extern unsigned long *trampoline_32bit;
 
+extern void trampoline_32bit_src(void *return_ptr);
+
 #endif /* __ASSEMBLY__ */
 #endif /* BOOT_COMPRESSED_PAGETABLE_H */
diff --git a/arch/x86/boot/compressed/pgtable_64.c 
b/arch/x86/boot/compressed/pgtable_64.c
index 01d08d3e3e43..810c2c32d98e 100644
--- a/arch/x86/boot/compressed/pgtable_64.c
+++ b/arch/x86/boot/compressed/pgtable_64.c
@@ -76,6 +76,13 @@ struct paging_config paging_prepare(void)
        /* Preserve trampoline memory */
        memcpy(trampoline_save, trampoline_32bit, TRAMPOLINE_32BIT_SIZE);
 
+       /* Clear trampoline memory first */
+       memset(trampoline_32bit, 0, TRAMPOLINE_32BIT_SIZE);
+
+       /* Copy trampoline code in place */
+       memcpy(trampoline_32bit + TRAMPOLINE_32BIT_CODE_OFFSET / 
sizeof(unsigned long),
+                       &trampoline_32bit_src, TRAMPOLINE_32BIT_CODE_SIZE);
+
        return paging_config;
 }
 
-- 
2.16.1

Reply via email to