Commit-ID:  32fcefa2bfc8961987e91d1daeb00624b4176d2e
Gitweb:     https://git.kernel.org/tip/32fcefa2bfc8961987e91d1daeb00624b4176d2e
Author:     Kirill A. Shutemov <kirill.shute...@linux.intel.com>
AuthorDate: Mon, 26 Feb 2018 21:04:50 +0300
Committer:  Ingo Molnar <mi...@kernel.org>
CommitDate: Mon, 12 Mar 2018 09:37:25 +0100

x86/boot/compressed/64: Set up trampoline memory

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

Tested-by: Borislav Petkov <b...@suse.de>
Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
Cc: Andy Lutomirski <l...@amacapital.net>
Cc: Andy Shevchenko <andy.shevche...@gmail.com>
Cc: Cyrill Gorcunov <gorcu...@openvz.org>
Cc: Eric Biederman <ebied...@xmission.com>
Cc: H. Peter Anvin <h...@zytor.com>
Cc: Juergen Gross <jgr...@suse.com>
Cc: Kees Cook <keesc...@chromium.org>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Matthew Wilcox <wi...@infradead.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: linux...@kvack.org
Link: 
http://lkml.kernel.org/r/20180226180451.86788-5-kirill.shute...@linux.intel.com
Signed-off-by: Ingo Molnar <mi...@kernel.org>
---
 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 57722a2fe2a0..91f75638f6e6 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 __ASSEMBLER__
 
 extern unsigned long *trampoline_32bit;
 
+extern void trampoline_32bit_src(void *return_ptr);
+
 #endif /* __ASSEMBLER__ */
 #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;
 }
 

Reply via email to