Message ID | 20220921145422.437618-5-ardb@kernel.org |
---|---|
State | Accepted |
Commit | 91592b5c0c2f076ff9d8cc0c14aa563448ac9fc4 |
Headers | show |
Series | x86: head_64.S spring cleaning | expand |
On Wed, Sep 21, 2022 at 04:54:10PM +0200, Ard Biesheuvel wrote: > /* > * We need to set the image_offset variable here since startup_32() will > * use it before we get to the 64-bit efi_pe_entry() in C code. > */ > - subl %esi, %ebx > - movl %ebx, rva(image_offset)(%ebp) // save image_offset > + subl %esi, %ebp // calculate image_offset > + movl %ebp, (image_offset - 1b)(%ebx) // save image_offset All looks ok, just one question: what was the reason for that image_offset thing? I see: 1887c9b653f9 ("efi/x86: Decompress at start of PE image load address") It says that if the kernel is loaded as a PE executable using LoadImage() we don't know where that image will be loaded each time so we're saving that offset for later when relocating (or not) the kernel? All part of those improvements: https://lore.kernel.org/all/20200301230537.2247550-1-nivedita@alum.mit.edu/ Am I close? I.e., that image_offset is purely a kernel thing and not something EFI LoadImage's inner workings mandate...? It doesn't seem so from where I'm standing but lemme doublecheck still. Thx.
On Thu, Nov 17, 2022 at 05:06:37PM +0100, Ard Biesheuvel wrote: > No this has nothing do with the EFI in particular, only with how the > x86 boot image is constructed and wrapped into a PE/COFF executable. Ok, thanks.
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index b51f0e107c2e..9ae6ddccd3ef 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -757,7 +757,7 @@ SYM_DATA(efi_is64, .byte 1) #define BS32_handle_protocol 88 // offsetof(efi_boot_services_32_t, handle_protocol) #define LI32_image_base 32 // offsetof(efi_loaded_image_32_t, image_base) - __HEAD + .text .code32 SYM_FUNC_START(efi32_pe_entry) /* @@ -779,12 +779,11 @@ SYM_FUNC_START(efi32_pe_entry) call 1f 1: pop %ebx - subl $ rva(1b), %ebx /* Get the loaded image protocol pointer from the image handle */ leal -4(%ebp), %eax pushl %eax // &loaded_image - leal rva(loaded_image_proto)(%ebx), %eax + leal (loaded_image_proto - 1b)(%ebx), %eax pushl %eax // pass the GUID address pushl 8(%ebp) // pass the image handle @@ -813,13 +812,13 @@ SYM_FUNC_START(efi32_pe_entry) 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 + leal (startup_32 - 1b)(%ebx), %ebp // runtime address of startup_32 /* * We need to set the image_offset variable here since startup_32() will * use it before we get to the 64-bit efi_pe_entry() in C code. */ - subl %esi, %ebx - movl %ebx, rva(image_offset)(%ebp) // save image_offset + subl %esi, %ebp // calculate image_offset + movl %ebp, (image_offset - 1b)(%ebx) // save image_offset xorl %esi, %esi jmp efi32_entry
Move efi32_pe_entry() into the .text section, so that it can be moved out of head_64.S and into a separate compilation unit in a subsequent patch. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> --- arch/x86/boot/compressed/head_64.S | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)