From: Ard Biesheuvel <ardb@kernel.org>
To: linux-efi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel <ardb@kernel.org>,
Evgeniy Baskov <baskov@ispras.ru>, Borislav Petkov <bp@alien8.de>,
Andy Lutomirski <luto@kernel.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Alexey Khoroshilov <khoroshilov@ispras.ru>,
Peter Jones <pjones@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>, Dave Young <dyoung@redhat.com>,
Mario Limonciello <mario.limonciello@amd.com>,
Kees Cook <keescook@chromium.org>,
Tom Lendacky <thomas.lendacky@amd.com>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Joerg Roedel <jroedel@suse.de>
Subject: [PATCH v6 08/21] x86/decompressor: Call trampoline as a normal function
Date: Tue, 11 Jul 2023 11:14:40 +0200 [thread overview]
Message-ID: <20230711091453.2543622-9-ardb@kernel.org> (raw)
In-Reply-To: <20230711091453.2543622-1-ardb@kernel.org>
Move the long return to switch to 32-bit mode into the trampoline code
so it can be called as an ordinary function. This will allow it to be
called directly from C code in a subsequent patch.
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/boot/compressed/head_64.S | 25 +++++++++-----------
arch/x86/boot/compressed/pgtable.h | 2 +-
2 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 2d1b0ee94929f7ec..af45ddd8297a4a07 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -446,18 +446,9 @@ SYM_CODE_START(startup_64)
/* Save the trampoline address in RCX */
movq %rax, %rcx
- /*
- * Load the address of trampoline_return() into RDI.
- * It will be used by the trampoline to return to the main code.
- */
- leaq trampoline_return(%rip), %rdi
-
- /* Switch to compatibility mode (CS.L = 0 CS.D = 1) via far return */
- pushq $__KERNEL32_CS
leaq TRAMPOLINE_32BIT_CODE_OFFSET(%rax), %rax
- pushq %rax
- lretq
-trampoline_return:
+ call *%rax
+
/* Restore the stack, the 32-bit trampoline uses its own stack */
leaq rva(boot_stack_end)(%rbx), %rsp
@@ -540,16 +531,22 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
jmp *%rax
SYM_FUNC_END(.Lrelocated)
- .code32
/*
* This is the 32-bit trampoline that will be copied over to low memory.
*
- * RDI contains the return address (might be above 4G).
* ECX contains the base address of the trampoline memory.
* Non zero RDX means trampoline needs to enable 5-level paging.
*/
SYM_CODE_START(trampoline_32bit_src)
- /* Set up data and stack segments */
+ popq %rdi
+ /* Switch to compatibility mode (CS.L = 0 CS.D = 1) via far return */
+ pushq $__KERNEL32_CS
+ leaq 0f(%rip), %rax
+ pushq %rax
+ lretq
+
+ .code32
+0: /* 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 cc9b2529a08634b4..91dbb99203fbce2d 100644
--- a/arch/x86/boot/compressed/pgtable.h
+++ b/arch/x86/boot/compressed/pgtable.h
@@ -6,7 +6,7 @@
#define TRAMPOLINE_32BIT_PGTABLE_OFFSET 0
#define TRAMPOLINE_32BIT_CODE_OFFSET PAGE_SIZE
-#define TRAMPOLINE_32BIT_CODE_SIZE 0x80
+#define TRAMPOLINE_32BIT_CODE_SIZE 0xA0
#define TRAMPOLINE_32BIT_STACK_END TRAMPOLINE_32BIT_SIZE
--
2.39.2
next prev parent reply other threads:[~2023-07-11 9:16 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-11 9:14 [PATCH v6 00/21] efi/x86: Avoid bare metal decompressor during EFI boot Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 01/21] x86/head_64: Store boot_params pointer in callee save register Ard Biesheuvel
2023-07-18 11:39 ` Borislav Petkov
2023-07-11 9:14 ` [PATCH v6 02/21] x86/efistub: Branch straight to kernel entry point from C code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 03/21] x86/efistub: Simplify and clean up handover entry code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 04/21] x86/decompressor: Avoid magic offsets for EFI handover entrypoint Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 05/21] x86/efistub: Clear BSS in EFI handover protocol entrypoint Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 06/21] x86/decompressor: Use proper sequence to take the address of the GOT Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 07/21] x86/decompressor: Store boot_params pointer in callee save register Ard Biesheuvel
2023-07-11 9:14 ` Ard Biesheuvel [this message]
2023-07-11 9:14 ` [PATCH v6 09/21] x86/decompressor: Use standard calling convention for trampoline Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 10/21] x86/decompressor: Avoid the need for a stack in the 32-bit trampoline Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 11/21] x86/decompressor: Call trampoline directly from C code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 12/21] x86/decompressor: Only call the trampoline when changing paging levels Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 13/21] x86/decompressor: Merge trampoline cleanup with switching code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 14/21] x86/efistub: Perform 4/5 level paging switch from the stub Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 15/21] x86/efistub: Prefer EFI memory attributes protocol over DXE services Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 16/21] decompress: Use 8 byte alignment Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 17/21] x86/decompressor: Move global symbol references to C code Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 18/21] x86/decompressor: Factor out kernel decompression and relocation Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 19/21] efi/libstub: Add limit argument to efi_random_alloc() Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 20/21] x86/efistub: Perform SNP feature test while running in the firmware Ard Biesheuvel
2023-07-11 9:14 ` [PATCH v6 21/21] x86/efistub: Avoid legacy decompressor when doing EFI boot Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230711091453.2543622-9-ardb@kernel.org \
--to=ardb@kernel.org \
--cc=baskov@ispras.ru \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=dyoung@redhat.com \
--cc=jroedel@suse.de \
--cc=keescook@chromium.org \
--cc=khoroshilov@ispras.ru \
--cc=kirill.shutemov@linux.intel.com \
--cc=kraxel@redhat.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mario.limonciello@amd.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=pjones@redhat.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.