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 02/23] x86/head_64: Store boot_params pointer in callee save register
Date: Mon, 7 Aug 2023 18:26:59 +0200 [thread overview]
Message-ID: <20230807162720.545787-3-ardb@kernel.org> (raw)
In-Reply-To: <20230807162720.545787-1-ardb@kernel.org>
Instead of pushing/popping %RSI to/from the stack every time a function
is called from startup_64(), store it in a callee preserved register
and grab it from there when its value is actually needed.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/kernel/head_64.S | 32 ++++++++------------
1 file changed, 12 insertions(+), 20 deletions(-)
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index c5b9289837dcbad2..ea6995920b7aa920 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -51,7 +51,9 @@ SYM_CODE_START_NOALIGN(startup_64)
* for us. These identity mapped page tables map all of the
* kernel pages and possibly all of memory.
*
- * %rsi holds a physical pointer to real_mode_data.
+ * %RSI holds the physical address of the boot_params structure
+ * provided by the bootloader. Preserve it in %R15 so C function calls
+ * will not clobber it.
*
* We come here either directly from a 64bit bootloader, or from
* arch/x86/boot/compressed/head_64.S.
@@ -62,6 +64,7 @@ SYM_CODE_START_NOALIGN(startup_64)
* compiled to run at we first fixup the physical addresses in our page
* tables and then reload them.
*/
+ mov %rsi, %r15
/* Set up the stack for verify_cpu() */
leaq (__end_init_task - PTREGS_SIZE)(%rip), %rsp
@@ -75,9 +78,7 @@ SYM_CODE_START_NOALIGN(startup_64)
shrq $32, %rdx
wrmsr
- pushq %rsi
call startup_64_setup_env
- popq %rsi
/* Now switch to __KERNEL_CS so IRET works reliably */
pushq $__KERNEL_CS
@@ -93,12 +94,10 @@ SYM_CODE_START_NOALIGN(startup_64)
* Activate SEV/SME memory encryption if supported/enabled. This needs to
* be done now, since this also includes setup of the SEV-SNP CPUID table,
* which needs to be done before any CPUID instructions are executed in
- * subsequent code.
+ * subsequent code. Pass the boot_params pointer as the first argument.
*/
- movq %rsi, %rdi
- pushq %rsi
+ movq %r15, %rdi
call sme_enable
- popq %rsi
#endif
/* Sanitize CPU configuration */
@@ -111,9 +110,8 @@ SYM_CODE_START_NOALIGN(startup_64)
* programmed into CR3.
*/
leaq _text(%rip), %rdi
- pushq %rsi
+ movq %r15, %rsi
call __startup_64
- popq %rsi
/* Form the CR3 value being sure to include the CR3 modifier */
addq $(early_top_pgt - __START_KERNEL_map), %rax
@@ -127,8 +125,6 @@ SYM_CODE_START(secondary_startup_64)
* At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
* and someone has loaded a mapped page table.
*
- * %rsi holds a physical pointer to real_mode_data.
- *
* We come here either from startup_64 (using physical addresses)
* or from trampoline.S (using virtual addresses).
*
@@ -153,6 +149,9 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
UNWIND_HINT_END_OF_STACK
ANNOTATE_NOENDBR
+ /* Clear %R15 which holds the boot_params pointer on the boot CPU */
+ xorq %r15, %r15
+
/*
* Retrieve the modifier (SME encryption mask if SME is active) to be
* added to the initial pgdir entry that will be programmed into CR3.
@@ -199,13 +198,9 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
* hypervisor could lie about the C-bit position to perform a ROP
* attack on the guest by writing to the unencrypted stack and wait for
* the next RET instruction.
- * %rsi carries pointer to realmode data and is callee-clobbered. Save
- * and restore it.
*/
- pushq %rsi
movq %rax, %rdi
call sev_verify_cbit
- popq %rsi
/*
* Switch to new page-table
@@ -365,9 +360,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
wrmsr
/* Setup and Load IDT */
- pushq %rsi
call early_setup_idt
- popq %rsi
/* Check if nx is implemented */
movl $0x80000001, %eax
@@ -403,9 +396,8 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
pushq $0
popfq
- /* rsi is pointer to real mode structure with interesting info.
- pass it to C */
- movq %rsi, %rdi
+ /* Pass the boot_params pointer as first argument */
+ movq %r15, %rdi
.Ljump_to_C_code:
/*
--
2.39.2
next prev parent reply other threads:[~2023-08-07 16:27 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 ` Ard Biesheuvel [this message]
2023-08-08 8:44 ` [tip: x86/boot] x86/head_64: Store boot_params pointer in callee save register 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 ` [PATCH v9 07/23] x86/decompressor: 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 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-3-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.