lkml.org 
[lkml]   [2017]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC 09/10] x86: boot, extract efi_pe_entry from startup_64
    Date
    efi_pe_entry body is somehow squashed into startup_64. It makes the code
    less readable and illogical. Extract the inlined efi_pe_entry body from
    startup_64 into a separate function and mark it appropriatelly by
    ENTRY+ENDPROC.

    ABI offsets are preserved:
    0000000000000200 T startup_64
    0000000000000280 T efi_pe_entry
    00000000000002d0 t handover_entry
    00000000000002fd t fail
    0000000000000390 T efi64_stub_entry

    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: <x86@kernel.org>
    ---
    arch/x86/boot/compressed/head_64.S | 112 ++++++++++++++++++-------------------
    1 file changed, 53 insertions(+), 59 deletions(-)

    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index 59eccbc46ad7..7983e0de4069 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -243,65 +243,6 @@ ENTRY(startup_64)
    * that maps our entire kernel(text+data+bss+brk), zero page
    * and command line.
    */
    -#ifdef CONFIG_EFI_STUB
    - /*
    - * The entry point for the PE/COFF executable is efi_pe_entry, so
    - * only legacy boot loaders will execute this jmp.
    - */
    - jmp preferred_addr
    -
    -GLOBAL(efi_pe_entry)
    - movq %rcx, efi64_config(%rip) /* Handle */
    - movq %rdx, efi64_config+8(%rip) /* EFI System table pointer */
    -
    - leaq efi64_config(%rip), %rax
    - movq %rax, efi_config(%rip)
    -
    - call 1f
    -1: popq %rbp
    - subq $1b, %rbp
    -
    - /*
    - * Relocate efi_config->call().
    - */
    - addq %rbp, efi64_config+32(%rip)
    -
    - movq %rax, %rdi
    - call make_boot_params
    - cmpq $0,%rax
    - je fail
    - mov %rax, %rsi
    - leaq startup_32(%rip), %rax
    - movl %eax, BP_code32_start(%rsi)
    - jmp 2f /* Skip the relocation */
    -
    -handover_entry:
    - call 1f
    -1: popq %rbp
    - subq $1b, %rbp
    -
    - /*
    - * Relocate efi_config->call().
    - */
    - movq efi_config(%rip), %rax
    - addq %rbp, 32(%rax)
    -2:
    - movq efi_config(%rip), %rdi
    - call efi_main
    - movq %rax,%rsi
    - cmpq $0,%rax
    - jne 2f
    -fail:
    - /* EFI init failed, so hang. */
    - hlt
    - jmp fail
    -2:
    - movl BP_code32_start(%esi), %eax
    - leaq preferred_addr(%rax), %rax
    - jmp *%rax
    -
    -preferred_addr:
    -#endif

    /* Setup data segments. */
    xorl %eax, %eax
    @@ -372,6 +313,59 @@ preferred_addr:
    ENDPROC(startup_64)

    #ifdef CONFIG_EFI_STUB
    +
    +/* The entry point for the PE/COFF executable is efi_pe_entry. */
    +ENTRY(efi_pe_entry)
    + movq %rcx, efi64_config(%rip) /* Handle */
    + movq %rdx, efi64_config+8(%rip) /* EFI System table pointer */
    +
    + leaq efi64_config(%rip), %rax
    + movq %rax, efi_config(%rip)
    +
    + call 1f
    +1: popq %rbp
    + subq $1b, %rbp
    +
    + /*
    + * Relocate efi_config->call().
    + */
    + addq %rbp, efi64_config+32(%rip)
    +
    + movq %rax, %rdi
    + call make_boot_params
    + cmpq $0,%rax
    + je fail
    + mov %rax, %rsi
    + leaq startup_32(%rip), %rax
    + movl %eax, BP_code32_start(%rsi)
    + jmp 2f /* Skip the relocation */
    +
    +handover_entry:
    + call 1f
    +1: popq %rbp
    + subq $1b, %rbp
    +
    + /*
    + * Relocate efi_config->call().
    + */
    + movq efi_config(%rip), %rax
    + addq %rbp, 32(%rax)
    +2:
    + movq efi_config(%rip), %rdi
    + call efi_main
    + movq %rax,%rsi
    + cmpq $0,%rax
    + jne 2f
    +fail:
    + /* EFI init failed, so hang. */
    + hlt
    + jmp fail
    +2:
    + movl BP_code32_start(%esi), %eax
    + leaq startup_64(%rax), %rax
    + jmp *%rax
    +ENDPROC(efi_pe_entry)
    +
    .org 0x390
    ENTRY(efi64_stub_entry)
    movq %rdi, efi64_config(%rip) /* Handle */
    --
    2.11.1
    \
     
     \ /
      Last update: 2017-02-17 11:48    [W:4.285 / U:0.260 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site