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 v7 18/22] x86/decompressor: Move global symbol references to C code
Date: Fri, 28 Jul 2023 11:09:12 +0200 [thread overview]
Message-ID: <20230728090916.1538550-19-ardb@kernel.org> (raw)
In-Reply-To: <20230728090916.1538550-1-ardb@kernel.org>
It is no longer necessary to be cautious when referring to global
variables in the position independent decompressor code, now that it is
built using PIE codegen and makes an assertion in the linker script that
no GOT entries exist (which would require adjustment for the actual
runtime load address of the decompressor binary).
This means global variables can be referenced directly from C code,
instead of having to pass their runtime addresses into C routines from
asm code, which needs to happen at each call site. Do so for the code
that will be called directly from the EFI stub after a subsequent patch,
and avoid the need to duplicate this logic a third time.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/boot/compressed/head_32.S | 8 --------
arch/x86/boot/compressed/head_64.S | 8 +-------
arch/x86/boot/compressed/misc.c | 16 +++++++++-------
3 files changed, 10 insertions(+), 22 deletions(-)
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
index 3530465b5b85ccf3..beee858058df4403 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -168,13 +168,7 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
*/
/* push arguments for extract_kernel: */
- pushl output_len@GOTOFF(%ebx) /* decompressed length, end of relocs */
pushl %ebp /* output address */
- pushl input_len@GOTOFF(%ebx) /* input_len */
- leal input_data@GOTOFF(%ebx), %eax
- pushl %eax /* input_data */
- leal boot_heap@GOTOFF(%ebx), %eax
- pushl %eax /* heap area */
pushl %esi /* real mode pointer */
call extract_kernel /* returns kernel entry point in %eax */
addl $24, %esp
@@ -202,8 +196,6 @@ SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
*/
.bss
.balign 4
-boot_heap:
- .fill BOOT_HEAP_SIZE, 1, 0
boot_stack:
.fill BOOT_STACK_SIZE, 1, 0
boot_stack_end:
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index eb33edf1e75d4b02..a9237e48f2f7cfd5 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -493,11 +493,7 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
* Do the extraction, and jump to the new kernel..
*/
movq %r15, %rdi /* pass struct boot_params pointer */
- leaq boot_heap(%rip), %rsi /* malloc area for uncompression */
- leaq input_data(%rip), %rdx /* input_data */
- movl input_len(%rip), %ecx /* input_len */
- movq %rbp, %r8 /* output target address */
- movl output_len(%rip), %r9d /* decompressed length, end of relocs */
+ movq %rbp, %rsi /* output target address */
call extract_kernel /* returns kernel entry point in %rax */
/*
@@ -661,8 +657,6 @@ SYM_DATA_END_LABEL(boot_idt, SYM_L_GLOBAL, boot_idt_end)
*/
.bss
.balign 4
-SYM_DATA_LOCAL(boot_heap, .fill BOOT_HEAP_SIZE, 1, 0)
-
SYM_DATA_START_LOCAL(boot_stack)
.fill BOOT_STACK_SIZE, 1, 0
.balign 16
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
index 94b7abcf624b3b55..2d91d56b59e1af93 100644
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -330,6 +330,11 @@ static size_t parse_elf(void *output)
return ehdr.e_entry - LOAD_PHYSICAL_ADDR;
}
+static u8 boot_heap[BOOT_HEAP_SIZE] __aligned(4);
+
+extern unsigned char input_data[];
+extern unsigned int input_len, output_len;
+
/*
* The compressed kernel image (ZO), has been moved so that its position
* is against the end of the buffer used to hold the uncompressed kernel
@@ -347,14 +352,11 @@ static size_t parse_elf(void *output)
* |-------uncompressed kernel image---------|
*
*/
-asmlinkage __visible void *extract_kernel(void *rmode, memptr heap,
- unsigned char *input_data,
- unsigned long input_len,
- unsigned char *output,
- unsigned long output_len)
+asmlinkage __visible void *extract_kernel(void *rmode, unsigned char *output)
{
const unsigned long kernel_total_size = VO__end - VO__text;
unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
+ memptr heap = (memptr)boot_heap;
unsigned long needed_size;
size_t entry_offset;
@@ -412,7 +414,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap,
* entries. This ensures the full mapped area is usable RAM
* and doesn't include any reserved areas.
*/
- needed_size = max(output_len, kernel_total_size);
+ needed_size = max_t(unsigned long, output_len, kernel_total_size);
#ifdef CONFIG_X86_64
needed_size = ALIGN(needed_size, MIN_KERNEL_ALIGN);
#endif
@@ -443,7 +445,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap,
#ifdef CONFIG_X86_64
if (heap > 0x3fffffffffffUL)
error("Destination address too large");
- if (virt_addr + max(output_len, kernel_total_size) > KERNEL_IMAGE_SIZE)
+ if (virt_addr + needed_size > KERNEL_IMAGE_SIZE)
error("Destination virtual address is beyond the kernel mapping area");
#else
if (heap > ((-__PAGE_OFFSET-(128<<20)-1) & 0x7fffffff))
--
2.39.2
next prev parent reply other threads:[~2023-07-28 9:15 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-28 9:08 [PATCH v7 00/22] efi/x86: Avoid bare metal decompressor during EFI boot Ard Biesheuvel
2023-07-28 9:08 ` [PATCH v7 01/22] x86/decompressor: Don't rely on upper 32 bits of GPRs being preserved Ard Biesheuvel
2023-07-31 10:07 ` Borislav Petkov
2023-07-31 10:09 ` Ard Biesheuvel
2023-07-31 11:01 ` Borislav Petkov
2023-07-28 9:08 ` [PATCH v7 02/22] x86/head_64: Store boot_params pointer in callee save register Ard Biesheuvel
2023-08-01 11:28 ` Borislav Petkov
2023-07-28 9:08 ` [PATCH v7 03/22] x86/efistub: Branch straight to kernel entry point from C code Ard Biesheuvel
2023-07-28 9:08 ` [PATCH v7 04/22] x86/efistub: Simplify and clean up handover entry code Ard Biesheuvel
2023-07-28 9:08 ` [PATCH v7 05/22] x86/decompressor: Avoid magic offsets for EFI handover entrypoint Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 06/22] x86/efistub: Clear BSS in EFI handover protocol entrypoint Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 07/22] x86/decompressor: Use proper sequence to take the address of the GOT Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 08/22] x86/decompressor: Store boot_params pointer in callee save register Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 09/22] x86/decompressor: Call trampoline as a normal function Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 10/22] x86/decompressor: Use standard calling convention for trampoline Ard Biesheuvel
2023-07-31 11:28 ` Borislav Petkov
2023-07-31 11:35 ` Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 11/22] x86/decompressor: Avoid the need for a stack in the 32-bit trampoline Ard Biesheuvel
2023-08-01 10:30 ` Borislav Petkov
2023-07-28 9:09 ` [PATCH v7 12/22] x86/decompressor: Call trampoline directly from C code Ard Biesheuvel
2023-08-01 11:45 ` Borislav Petkov
2023-08-01 11:48 ` Ard Biesheuvel
2023-08-01 11:51 ` Borislav Petkov
2023-07-28 9:09 ` [PATCH v7 13/22] x86/decompressor: Only call the trampoline when changing paging levels Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 14/22] x86/decompressor: Merge trampoline cleanup with switching code Ard Biesheuvel
2023-08-01 12:08 ` Borislav Petkov
2023-08-01 12:11 ` Ard Biesheuvel
2023-08-01 12:40 ` Borislav Petkov
2023-08-01 12:46 ` Ard Biesheuvel
2023-08-01 13:04 ` Borislav Petkov
2023-07-28 9:09 ` [PATCH v7 15/22] x86/efistub: Perform 4/5 level paging switch from the stub Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 16/22] x86/efistub: Prefer EFI memory attributes protocol over DXE services Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 17/22] decompress: Use 8 byte alignment Ard Biesheuvel
2023-07-28 9:09 ` Ard Biesheuvel [this message]
2023-07-28 9:09 ` [PATCH v7 19/22] x86/decompressor: Factor out kernel decompression and relocation Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 20/22] efi/libstub: Add limit argument to efi_random_alloc() Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 21/22] x86/efistub: Perform SNP feature test while running in the firmware Ard Biesheuvel
2023-07-28 9:09 ` [PATCH v7 22/22] x86/efistub: Avoid legacy decompressor when doing EFI boot Ard Biesheuvel
2023-08-02 10:26 ` Borislav Petkov
2023-08-02 10:47 ` Ard Biesheuvel
2023-08-02 15:55 ` Borislav Petkov
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=20230728090916.1538550-19-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox