Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32fcefa2 authored by Kirill A. Shutemov's avatar Kirill A. Shutemov Committed by Ingo Molnar
Browse files

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: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/20180226180451.86788-5-kirill.shutemov@linux.intel.com


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent fb526835
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -501,6 +501,7 @@ relocated:
	jmp	*%rax

	.code32
ENTRY(trampoline_32bit_src)
compatible_mode:
	/* Set up data and stack segments */
	movl	$__KERNEL_DS, %eax
+9 −0
Original line number Diff line number Diff line
@@ -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 */
+7 −0
Original line number Diff line number Diff line
@@ -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;
}