efi/libstub/x86: Use const attribute for efi_is_64bit()
authorArd Biesheuvel <ardb@kernel.org>
Mon, 13 Jan 2020 17:22:33 +0000 (18:22 +0100)
committerIngo Molnar <mingo@kernel.org>
Mon, 20 Jan 2020 07:13:00 +0000 (08:13 +0100)
Reshuffle the x86 stub code a bit so that we can tag the efi_is_64bit()
function with the 'const' attribute, which permits the compiler to
optimize away any redundant calls. Since we have two different entry
points for 32 and 64 bit firmware in the startup code, this also
simplifies the C code since we'll enter it with the efi_is64 variable
already set.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20200113172245.27925-2-ardb@kernel.org
arch/x86/boot/compressed/eboot.c
arch/x86/boot/compressed/head_64.S
arch/x86/include/asm/efi.h

index 4afd29eb5b34726c3389008773a3c7afed23f009..ab3a40283db705bca86a64d7ddfcce0b90e434d4 100644 (file)
 #include "eboot.h"
 
 static efi_system_table_t *sys_table;
-static bool efi_is64 = IS_ENABLED(CONFIG_X86_64);
+extern const bool efi_is64;
 
 __pure efi_system_table_t *efi_system_table(void)
 {
        return sys_table;
 }
 
-__pure bool efi_is_64bit(void)
+__attribute_const__ bool efi_is_64bit(void)
 {
-       return efi_is64;
+       if (IS_ENABLED(CONFIG_EFI_MIXED))
+               return efi_is64;
+       return IS_ENABLED(CONFIG_X64_64);
 }
 
 static efi_status_t
@@ -710,8 +712,7 @@ static efi_status_t exit_boot(struct boot_params *boot_params, void *handle)
  */
 struct boot_params *efi_main(efi_handle_t handle,
                             efi_system_table_t *sys_table_arg,
-                            struct boot_params *boot_params,
-                            bool is64)
+                            struct boot_params *boot_params)
 {
        struct desc_ptr *gdt = NULL;
        struct setup_header *hdr = &boot_params->hdr;
@@ -721,9 +722,6 @@ struct boot_params *efi_main(efi_handle_t handle,
 
        sys_table = sys_table_arg;
 
-       if (IS_ENABLED(CONFIG_EFI_MIXED))
-               efi_is64 = is64;
-
        /* Check if we were booted by the EFI firmware */
        if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
                goto fail;
index 44a6bb6964b5b7eea7bfd7e3d6ec82b407e1bb3f..1f1f6c8139b38c9c72bb6e7b11b6da2cf238eb0a 100644 (file)
@@ -211,10 +211,9 @@ SYM_FUNC_START(startup_32)
        movl    efi32_boot_args(%ebp), %edi
        cmp     $0, %edi
        jz      1f
-       leal    handover_entry(%ebp), %eax
+       leal    efi64_stub_entry(%ebp), %eax
        movl    %esi, %edx
        movl    efi32_boot_args+4(%ebp), %esi
-       movl    $0x0, %ecx
 1:
 #endif
        pushl   %eax
@@ -242,6 +241,7 @@ SYM_FUNC_START(efi32_stub_entry)
        movl    %ecx, efi32_boot_args(%ebp)
        movl    %edx, efi32_boot_args+4(%ebp)
        sgdtl   efi32_boot_gdt(%ebp)
+       movb    $0, efi_is64(%ebp)
 
        /* Disable paging */
        movl    %cr0, %eax
@@ -452,8 +452,6 @@ SYM_CODE_END(startup_64)
        .org 0x390
 SYM_FUNC_START(efi64_stub_entry)
 SYM_FUNC_START_ALIAS(efi_stub_entry)
-       movq    $1, %rcx
-SYM_INNER_LABEL(handover_entry, SYM_L_LOCAL)
        and     $~0xf, %rsp                     /* realign the stack */
        call    efi_main
        movq    %rax,%rsi
@@ -632,6 +630,7 @@ SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
 
 #ifdef CONFIG_EFI_MIXED
 SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0)
+SYM_DATA(efi_is64, .byte 1)
 #endif
 
 /*
index 383f7a0fc170026a32fa0a8213e764705f87111c..0a58468a7203a703cc7dbb8ea73c13220ee04491 100644 (file)
@@ -221,7 +221,7 @@ efi_status_t efi_set_virtual_address_map(unsigned long memory_map_size,
 
 /* arch specific definitions used by the stub code */
 
-__pure bool efi_is_64bit(void);
+__attribute_const__ bool efi_is_64bit(void);
 
 static inline bool efi_is_native(void)
 {