All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ardb@kernel.org>
To: linux-efi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel <ardb@kernel.org>,
	Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Ingo Molnar <mingo@redhat.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [PATCH v9 07/23] x86/decompressor: Store boot_params pointer in callee save register
Date: Mon,  7 Aug 2023 18:27:04 +0200	[thread overview]
Message-ID: <20230807162720.545787-8-ardb@kernel.org> (raw)
In-Reply-To: <20230807162720.545787-1-ardb@kernel.org>

Instead of pushing and popping %RSI several times to preserve the struct
boot_params pointer across the execution of the startup code, move it
into a callee save register before the first call into C, and copy it
back when needed.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 arch/x86/boot/compressed/head_64.S | 42 ++++++++------------
 1 file changed, 16 insertions(+), 26 deletions(-)

diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index a3f764daf3a3adbc..19bf810409e2aa62 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -405,10 +405,14 @@ SYM_CODE_START(startup_64)
 	lretq
 
 .Lon_kernel_cs:
+	/*
+	 * RSI holds a pointer to a boot_params structure provided by the
+	 * loader, and this needs to be preserved across C function calls. So
+	 * move it into a callee saved register.
+	 */
+	movq	%rsi, %r15
 
-	pushq	%rsi
 	call	load_stage1_idt
-	popq	%rsi
 
 #ifdef CONFIG_AMD_MEM_ENCRYPT
 	/*
@@ -419,12 +423,10 @@ SYM_CODE_START(startup_64)
 	 * CPUID instructions being issued, so go ahead and do that now via
 	 * sev_enable(), which will also handle the rest of the SEV-related
 	 * detection/setup to ensure that has been done in advance of any dependent
-	 * code.
+	 * code. Pass the boot_params pointer as the first argument.
 	 */
-	pushq	%rsi
-	movq	%rsi, %rdi		/* real mode address */
+	movq	%r15, %rdi
 	call	sev_enable
-	popq	%rsi
 #endif
 
 	/*
@@ -437,13 +439,10 @@ SYM_CODE_START(startup_64)
 	 *   - Non zero RDX means trampoline needs to enable 5-level
 	 *     paging.
 	 *
-	 * RSI holds real mode data and needs to be preserved across
-	 * this function call.
+	 * Pass the boot_params pointer as the first argument.
 	 */
-	pushq	%rsi
-	movq	%rsi, %rdi		/* real mode address */
+	movq	%r15, %rdi
 	call	paging_prepare
-	popq	%rsi
 
 	/* Save the trampoline address in RCX */
 	movq	%rax, %rcx
@@ -456,9 +455,9 @@ SYM_CODE_START(startup_64)
 	 * because the architecture does not guarantee that GPRs will retain
 	 * their full 64-bit values across a 32-bit mode switch.
 	 */
+	pushq	%r15
 	pushq	%rbp
 	pushq	%rbx
-	pushq	%rsi
 
 	/*
 	 * Push the 64-bit address of trampoline_return() onto the new stack.
@@ -475,9 +474,9 @@ SYM_CODE_START(startup_64)
 	lretq
 trampoline_return:
 	/* Restore live 64-bit registers */
-	popq	%rsi
 	popq	%rbx
 	popq	%rbp
+	popq	%r15
 
 	/* Restore the stack, the 32-bit trampoline uses its own stack */
 	leaq	rva(boot_stack_end)(%rbx), %rsp
@@ -487,14 +486,9 @@ trampoline_return:
 	 *
 	 * RDI is address of the page table to use instead of page table
 	 * in trampoline memory (if required).
-	 *
-	 * RSI holds real mode data and needs to be preserved across
-	 * this function call.
 	 */
-	pushq	%rsi
 	leaq	rva(top_pgtable)(%rbx), %rdi
 	call	cleanup_trampoline
-	popq	%rsi
 
 	/* Zero EFLAGS */
 	pushq	$0
@@ -504,7 +498,6 @@ trampoline_return:
  * Copy the compressed kernel to the end of our buffer
  * where decompression in place becomes safe.
  */
-	pushq	%rsi
 	leaq	(_bss-8)(%rip), %rsi
 	leaq	rva(_bss-8)(%rbx), %rdi
 	movl	$(_bss - startup_32), %ecx
@@ -512,7 +505,6 @@ trampoline_return:
 	std
 	rep	movsq
 	cld
-	popq	%rsi
 
 	/*
 	 * The GDT may get overwritten either during the copy we just did or
@@ -544,30 +536,28 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
 	shrq	$3, %rcx
 	rep	stosq
 
-	pushq	%rsi
 	call	load_stage2_idt
 
 	/* Pass boot_params to initialize_identity_maps() */
-	movq	(%rsp), %rdi
+	movq	%r15, %rdi
 	call	initialize_identity_maps
-	popq	%rsi
 
 /*
  * Do the extraction, and jump to the new kernel..
  */
-	pushq	%rsi			/* Save the real mode argument */
-	movq	%rsi, %rdi		/* real mode address */
+	/* pass struct boot_params pointer */
+	movq	%r15, %rdi
 	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 */
 	call	extract_kernel		/* returns kernel entry point in %rax */
-	popq	%rsi
 
 /*
  * Jump to the decompressed kernel.
  */
+	movq	%r15, %rsi
 	jmp	*%rax
 SYM_FUNC_END(.Lrelocated)
 
-- 
2.39.2


  parent reply	other threads:[~2023-08-07 16:28 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-07 16:26 [PATCH v9 00/23] efi/x86: Avoid bare metal decompressor during EFI boot Ard Biesheuvel
2023-08-07 16:26 ` [PATCH v9 01/23] x86/decompressor: Don't rely on upper 32 bits of GPRs being preserved Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:26 ` [PATCH v9 02/23] x86/head_64: Store boot_params pointer in callee save register Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 03/23] x86/efistub: Branch straight to kernel entry point from C code Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 04/23] x86/efistub: Simplify and clean up handover entry code Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 05/23] x86/decompressor: Avoid magic offsets for EFI handover entrypoint Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 06/23] x86/efistub: Clear BSS in EFI handover protocol entrypoint Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` Ard Biesheuvel [this message]
2023-08-08  8:44   ` [tip: x86/boot] x86/decompressor: Store boot_params pointer in callee save register tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 08/23] x86/decompressor: Assign paging related global variables earlier Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 09/23] x86/decompressor: Call trampoline as a normal function Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 10/23] x86/decompressor: Use standard calling convention for trampoline Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 11/23] x86/decompressor: Avoid the need for a stack in the 32-bit trampoline Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 12/23] x86/decompressor: Call trampoline directly from C code Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 13/23] x86/decompressor: Only call the trampoline when changing paging levels Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 14/23] x86/decompressor: Pass pgtable address to trampoline directly Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 15/23] x86/decompressor: Merge trampoline cleanup with switching code Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 16/23] x86/efistub: Perform 4/5 level paging switch from the stub Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 17/23] x86/efistub: Prefer EFI memory attributes protocol over DXE services Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 18/23] decompress: Use 8 byte alignment Ard Biesheuvel
2023-08-08  8:44   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 19/23] x86/decompressor: Move global symbol references to C code Ard Biesheuvel
2023-08-08  8:43   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 20/23] x86/decompressor: Factor out kernel decompression and relocation Ard Biesheuvel
2023-08-08  8:43   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 21/23] efi/libstub: Add limit argument to efi_random_alloc() Ard Biesheuvel
2023-08-08  8:43   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 22/23] x86/efistub: Perform SNP feature test while running in the firmware Ard Biesheuvel
2023-08-08  8:43   ` [tip: x86/boot] " tip-bot2 for Ard Biesheuvel
2023-08-07 16:27 ` [PATCH v9 23/23] x86/efistub: Avoid legacy decompressor when doing EFI boot Ard Biesheuvel
2023-08-08  8:43   ` [tip: x86/boot] " tip-bot2 for 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=20230807162720.545787-8-ardb@kernel.org \
    --to=ardb@kernel.org \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    /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.