lkml.org 
[lkml]   [2022]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 05/16] x86/compressed: efi-mixed: move efi32_entry out of head_64.S
    Date
    Move the efi32_entry() routine out of head_64.S and into efi-mixed.S,
    which reduces clutter in the complicated startup routines. It also
    permits linkage of some symbols used by code to be made local.

    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    ---
    arch/x86/boot/compressed/efi_mixed.S | 44 +++++++++++++++-----
    arch/x86/boot/compressed/head_64.S | 32 --------------
    2 files changed, 34 insertions(+), 42 deletions(-)

    diff --git a/arch/x86/boot/compressed/efi_mixed.S b/arch/x86/boot/compressed/efi_mixed.S
    index 77e77c3ea393..5007a44cd966 100644
    --- a/arch/x86/boot/compressed/efi_mixed.S
    +++ b/arch/x86/boot/compressed/efi_mixed.S
    @@ -105,7 +105,7 @@ SYM_FUNC_START(__efi64_thunk)
    /*
    * Switch to IDT and GDT with 32-bit segments. This is the firmware GDT
    * and IDT that was installed when the kernel started executing. The
    - * pointers were saved at the EFI stub entry point in head_64.S.
    + * pointers were saved by the efi32_entry() routine below.
    *
    * Pass the saved DS selector to the 32-bit code, and use far return to
    * restore the saved CS selector.
    @@ -217,22 +217,46 @@ SYM_FUNC_START_LOCAL(efi_enter32)
    lret
    SYM_FUNC_END(efi_enter32)

    +SYM_FUNC_START(efi32_entry)
    + call 1f
    +1: pop %ebx
    +
    + /* Save firmware GDTR and code/data selectors */
    + sgdtl (efi32_boot_gdt - 1b)(%ebx)
    + movw %cs, (efi32_boot_cs - 1b)(%ebx)
    + movw %ds, (efi32_boot_ds - 1b)(%ebx)
    +
    + /* Store firmware IDT descriptor */
    + sidtl (efi32_boot_idt - 1b)(%ebx)
    +
    + /* Store boot arguments */
    + leal (efi32_boot_args - 1b)(%ebx), %ebx
    + movl %ecx, 0(%ebx)
    + movl %edx, 4(%ebx)
    + movl %esi, 8(%ebx)
    + movb $0x0, 12(%ebx) // efi_is64
    +
    + /* Disable paging */
    + movl %cr0, %eax
    + btrl $X86_CR0_PG_BIT, %eax
    + movl %eax, %cr0
    +
    + jmp startup_32
    +SYM_FUNC_END(efi32_entry)
    +
    .data
    .balign 8
    -SYM_DATA_START(efi32_boot_gdt)
    +SYM_DATA_START_LOCAL(efi32_boot_gdt)
    .word 0
    .quad 0
    SYM_DATA_END(efi32_boot_gdt)

    -SYM_DATA_START(efi32_boot_idt)
    +SYM_DATA_START_LOCAL(efi32_boot_idt)
    .word 0
    .quad 0
    SYM_DATA_END(efi32_boot_idt)

    -SYM_DATA_START(efi32_boot_cs)
    - .word 0
    -SYM_DATA_END(efi32_boot_cs)
    -
    -SYM_DATA_START(efi32_boot_ds)
    - .word 0
    -SYM_DATA_END(efi32_boot_ds)
    +SYM_DATA_LOCAL(efi32_boot_cs, .word 0)
    +SYM_DATA_LOCAL(efi32_boot_ds, .word 0)
    +SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0, 0)
    +SYM_DATA(efi_is64, .byte 1)
    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index 9ae6ddccd3ef..be95d5685717 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -289,35 +289,6 @@ SYM_FUNC_START(efi32_stub_entry)
    popl %esi
    jmp efi32_entry
    SYM_FUNC_END(efi32_stub_entry)
    -
    - .text
    -SYM_FUNC_START_LOCAL(efi32_entry)
    - call 1f
    -1: pop %ebx
    -
    - /* Save firmware GDTR and code/data selectors */
    - sgdtl (efi32_boot_gdt - 1b)(%ebx)
    - movw %cs, (efi32_boot_cs - 1b)(%ebx)
    - movw %ds, (efi32_boot_ds - 1b)(%ebx)
    -
    - /* Store firmware IDT descriptor */
    - sidtl (efi32_boot_idt - 1b)(%ebx)
    -
    - /* Store boot arguments */
    - leal (efi32_boot_args - 1b)(%ebx), %ebx
    - movl %ecx, 0(%ebx)
    - movl %edx, 4(%ebx)
    - movl %esi, 8(%ebx)
    - movb $0x0, 12(%ebx) // efi_is64
    -
    - /* Disable paging */
    - movl %cr0, %eax
    - btrl $X86_CR0_PG_BIT, %eax
    - movl %eax, %cr0
    -
    - jmp startup_32
    -SYM_FUNC_END(efi32_entry)
    - __HEAD
    #endif

    .code64
    @@ -750,9 +721,6 @@ SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end)
    SYM_DATA(image_offset, .long 0)
    #endif
    #ifdef CONFIG_EFI_MIXED
    -SYM_DATA(efi32_boot_args, .long 0, 0, 0)
    -SYM_DATA(efi_is64, .byte 1)
    -
    #define ST32_boottime 60 // offsetof(efi_system_table_32_t, boottime)
    #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)
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-09-21 16:56    [W:4.102 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site