efi/x86: Make efi32_pe_entry() more readable
authorArvind Sankar <nivedita@alum.mit.edu>
Sun, 8 Mar 2020 08:08:42 +0000 (09:08 +0100)
committerIngo Molnar <mingo@kernel.org>
Sun, 8 Mar 2020 08:58:16 +0000 (09:58 +0100)
Set up a proper frame pointer in efi32_pe_entry() so that it's easier to
calculate offsets for arguments.

Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20200301230436.2246909-4-nivedita@alum.mit.edu
Link: https://lore.kernel.org/r/20200308080859.21568-12-ardb@kernel.org
arch/x86/boot/compressed/head_64.S

index 920daf62dac2abb056728461ee158e687e260368..fabbd4c2e9f251e7d3af95574ecf79d09f17560c 100644 (file)
@@ -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)