[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200308080859.21568-12-ardb@kernel.org>
Date: Sun, 8 Mar 2020 09:08:42 +0100
From: Ard Biesheuvel <ardb@...nel.org>
To: linux-efi@...r.kernel.org, Ingo Molnar <mingo@...nel.org>,
Thomas Gleixner <tglx@...utronix.de>
Cc: Ard Biesheuvel <ardb@...nel.org>, linux-kernel@...r.kernel.org,
Arvind Sankar <nivedita@...m.mit.edu>,
Christoph Hellwig <hch@....de>,
David Hildenbrand <david@...hat.com>,
Davidlohr Bueso <dave@...olabs.net>,
Guenter Roeck <linux@...ck-us.net>,
Heinrich Schuchardt <xypron.glpk@....de>,
Jonathan Corbet <corbet@....net>,
Lukas Bulwahn <lukas.bulwahn@...il.com>,
Masahiro Yamada <masahiroy@...nel.org>,
Nikolai Merinov <n.merinov@...ngo-systems.com>,
Tom Lendacky <thomas.lendacky@....com>,
Vladis Dronov <vdronov@...hat.com>
Subject: [PATCH 11/28] efi/x86: Make efi32_pe_entry more readable
From: Arvind Sankar <nivedita@...m.mit.edu>
Setup a proper frame pointer in efi32_pe_entry so that it's easier to
calculate offsets for arguments.
Signed-off-by: Arvind Sankar <nivedita@...m.mit.edu>
Link: https://lore.kernel.org/r/20200301230436.2246909-4-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb@...nel.org>
---
arch/x86/boot/compressed/head_64.S | 57 +++++++++++++++++++++---------
1 file changed, 40 insertions(+), 17 deletions(-)
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 25fa763f4e83..b74a012a6fea 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -658,42 +658,65 @@ SYM_DATA(efi_is64, .byte 1)
.text
.code32
SYM_FUNC_START(efi32_pe_entry)
+/*
+ * efi_status_t efi32_pe_entry(efi_handle_t image_handle,
+ * efi_system_table_32_t *sys_table)
+ */
+
pushl %ebp
+ movl %esp, %ebp
+ pushl %eax // dummy push to allocate loaded_image
- pushl %ebx
+ pushl %ebx // save callee-save registers
pushl %edi
+
call verify_cpu // check for long mode support
- popl %edi
- popl %ebx
testl %eax, %eax
movl $0x80000003, %eax // EFI_UNSUPPORTED
- jnz 3f
+ jnz 2f
call 1f
-1: pop %ebp
- subl $1b, %ebp
+1: pop %ebx
+ subl $1b, %ebx
/* Get the loaded image protocol pointer from the image handle */
- subl $12, %esp // space for the loaded image pointer
- pushl %esp // pass its address
- leal loaded_image_proto(%ebp), %eax
+ leal -4(%ebp), %eax
+ pushl %eax // &loaded_image
+ leal loaded_image_proto(%ebx), %eax
pushl %eax // pass the GUID address
- pushl 28(%esp) // pass the image handle
+ pushl 8(%ebp) // pass the image handle
- movl 36(%esp), %eax // sys_table
+ /*
+ * Note the alignment of the stack frame.
+ * sys_table
+ * handle <-- 16-byte aligned on entry by ABI
+ * return address
+ * frame pointer
+ * loaded_image <-- local variable
+ * saved %ebx <-- 16-byte aligned here
+ * saved %edi
+ * &loaded_image
+ * &loaded_image_proto
+ * handle <-- 16-byte aligned for call to handle_protocol
+ */
+
+ movl 12(%ebp), %eax // sys_table
movl ST32_boottime(%eax), %eax // sys_table->boottime
call *BS32_handle_protocol(%eax) // sys_table->boottime->handle_protocol
- cmp $0, %eax
+ addl $12, %esp // restore argument space
+ testl %eax, %eax
jnz 2f
- movl 32(%esp), %ecx // image_handle
- movl 36(%esp), %edx // sys_table
- movl 12(%esp), %esi // loaded_image
+ movl 8(%ebp), %ecx // image_handle
+ movl 12(%ebp), %edx // sys_table
+ movl -4(%ebp), %esi // loaded_image
movl LI32_image_base(%esi), %esi // loaded_image->image_base
+ movl %ebx, %ebp // startup_32 for efi32_pe_stub_entry
jmp efi32_pe_stub_entry
-2: addl $24, %esp
-3: popl %ebp
+2: popl %edi // restore callee-save registers
+ popl %ebx
+ leave
ret
SYM_FUNC_END(efi32_pe_entry)
--
2.17.1
Powered by blists - more mailing lists