lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 2 Mar 2020 08:49:17 +0100
From:   Ard Biesheuvel <ardb@...nel.org>
To:     Arvind Sankar <nivedita@...m.mit.edu>
Cc:     linux-efi <linux-efi@...r.kernel.org>,
        "the arch/x86 maintainers" <x86@...nel.org>,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH 3/5] efi/x86: Make efi32_pe_entry more readable

On Mon, 2 Mar 2020 at 00:04, Arvind Sankar <nivedita@...m.mit.edu> wrote:
>
> 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>
> ---
>  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 920daf62dac2..fabbd4c2e9f2 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

The code that follows efi32_pe_stub_entry still expects the runtime
displacement in %ebp, so we'll need to pass that in another way here.

>         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.24.1
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ