x86/efi: Delete most of the efi_call* macros
authorMatt Fleming <matt.fleming@intel.com>
Thu, 27 Mar 2014 22:10:39 +0000 (15:10 -0700)
committerMatt Fleming <matt.fleming@intel.com>
Thu, 17 Apr 2014 12:26:30 +0000 (13:26 +0100)
We really only need one phys and one virt function call, and then only
one assembly function to make firmware calls.

Since we are not using the C type system anyway, we're not really losing
much by deleting the macros apart from no longer having a check that
we are passing the correct number of parameters. The lack of duplicated
code seems like a worthwhile trade-off.

Cc: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
Cc: Borislav Petkov <bp@suse.de>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
arch/x86/boot/compressed/head_64.S
arch/x86/include/asm/efi.h
arch/x86/platform/efi/efi.c
arch/x86/platform/efi/efi_stub_64.S
arch/x86/platform/uv/bios_uv.c

index 0d558ee899aec85cf3fce7f69691441691a41f93..2884e0c3e8a5880411ce63955b01c103e6eabd00 100644 (file)
@@ -452,7 +452,7 @@ efi32_config:
        .global efi64_config
 efi64_config:
        .fill   11,8,0
-       .quad   efi_call6
+       .quad   efi_call
        .byte   1
 #endif /* CONFIG_EFI_STUB */
 
index 0869434eaf725e7a5aa5efb6f5ce8a62ed8176d3..e3975597b28994383b92a1c92c8c11463b4d3d57 100644 (file)
 
 extern unsigned long asmlinkage efi_call_phys(void *, ...);
 
-#define efi_call_phys0(f)              efi_call_phys(f)
-#define efi_call_phys1(f, a1)          efi_call_phys(f, a1)
-#define efi_call_phys2(f, a1, a2)      efi_call_phys(f, a1, a2)
-#define efi_call_phys3(f, a1, a2, a3)  efi_call_phys(f, a1, a2, a3)
-#define efi_call_phys4(f, a1, a2, a3, a4)      \
-       efi_call_phys(f, a1, a2, a3, a4)
-#define efi_call_phys5(f, a1, a2, a3, a4, a5)  \
-       efi_call_phys(f, a1, a2, a3, a4, a5)
-#define efi_call_phys6(f, a1, a2, a3, a4, a5, a6)      \
-       efi_call_phys(f, a1, a2, a3, a4, a5, a6)
 /*
  * Wrap all the virtual calls in a way that forces the parameters on the stack.
  */
@@ -44,75 +34,27 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
 #define efi_call_virt(f, args...) \
        ((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args)
 
-#define efi_call_virt0(f)              efi_call_virt(f)
-#define efi_call_virt1(f, a1)          efi_call_virt(f, a1)
-#define efi_call_virt2(f, a1, a2)      efi_call_virt(f, a1, a2)
-#define efi_call_virt3(f, a1, a2, a3)  efi_call_virt(f, a1, a2, a3)
-#define efi_call_virt4(f, a1, a2, a3, a4)      \
-       efi_call_virt(f, a1, a2, a3, a4)
-#define efi_call_virt5(f, a1, a2, a3, a4, a5)  \
-       efi_call_virt(f, a1, a2, a3, a4, a5)
-#define efi_call_virt6(f, a1, a2, a3, a4, a5, a6)      \
-       efi_call_virt(f, a1, a2, a3, a4, a5, a6)
-
 #define efi_ioremap(addr, size, type, attr)    ioremap_cache(addr, size)
 
 #else /* !CONFIG_X86_32 */
 
-extern u64 efi_call0(void *fp);
-extern u64 efi_call1(void *fp, u64 arg1);
-extern u64 efi_call2(void *fp, u64 arg1, u64 arg2);
-extern u64 efi_call3(void *fp, u64 arg1, u64 arg2, u64 arg3);
-extern u64 efi_call4(void *fp, u64 arg1, u64 arg2, u64 arg3, u64 arg4);
-extern u64 efi_call5(void *fp, u64 arg1, u64 arg2, u64 arg3,
-                    u64 arg4, u64 arg5);
-extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3,
-                    u64 arg4, u64 arg5, u64 arg6);
-
-#define efi_call_phys0(f)                      \
-       efi_call0((f))
-#define efi_call_phys1(f, a1)                  \
-       efi_call1((f), (u64)(a1))
-#define efi_call_phys2(f, a1, a2)                      \
-       efi_call2((f), (u64)(a1), (u64)(a2))
-#define efi_call_phys3(f, a1, a2, a3)                          \
-       efi_call3((f), (u64)(a1), (u64)(a2), (u64)(a3))
-#define efi_call_phys4(f, a1, a2, a3, a4)                              \
-       efi_call4((f), (u64)(a1), (u64)(a2), (u64)(a3),         \
-                 (u64)(a4))
-#define efi_call_phys5(f, a1, a2, a3, a4, a5)                          \
-       efi_call5((f), (u64)(a1), (u64)(a2), (u64)(a3),         \
-                 (u64)(a4), (u64)(a5))
-#define efi_call_phys6(f, a1, a2, a3, a4, a5, a6)                      \
-       efi_call6((f), (u64)(a1), (u64)(a2), (u64)(a3),         \
-                 (u64)(a4), (u64)(a5), (u64)(a6))
-
-#define _efi_call_virtX(x, f, ...)                                     \
+#define EFI_LOADER_SIGNATURE   "EL64"
+
+extern u64 asmlinkage efi_call(void *fp, ...);
+
+#define efi_call_phys(f, args...)              efi_call((f), args)
+
+#define efi_call_virt(f, ...)                                          \
 ({                                                                     \
        efi_status_t __s;                                               \
                                                                        \
        efi_sync_low_kernel_mappings();                                 \
        preempt_disable();                                              \
-       __s = efi_call##x((void *)efi.systab->runtime->f, __VA_ARGS__); \
+       __s = efi_call((void *)efi.systab->runtime->f, __VA_ARGS__);    \
        preempt_enable();                                               \
        __s;                                                            \
 })
 
-#define efi_call_virt0(f)                              \
-       _efi_call_virtX(0, f)
-#define efi_call_virt1(f, a1)                          \
-       _efi_call_virtX(1, f, (u64)(a1))
-#define efi_call_virt2(f, a1, a2)                      \
-       _efi_call_virtX(2, f, (u64)(a1), (u64)(a2))
-#define efi_call_virt3(f, a1, a2, a3)                  \
-       _efi_call_virtX(3, f, (u64)(a1), (u64)(a2), (u64)(a3))
-#define efi_call_virt4(f, a1, a2, a3, a4)              \
-       _efi_call_virtX(4, f, (u64)(a1), (u64)(a2), (u64)(a3), (u64)(a4))
-#define efi_call_virt5(f, a1, a2, a3, a4, a5)          \
-       _efi_call_virtX(5, f, (u64)(a1), (u64)(a2), (u64)(a3), (u64)(a4), (u64)(a5))
-#define efi_call_virt6(f, a1, a2, a3, a4, a5, a6)      \
-       _efi_call_virtX(6, f, (u64)(a1), (u64)(a2), (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6))
-
 extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,
                                 u32 type, u64 attribute);
 
index 3781dd39e8bd55a03b8acd779113f40c151442b4..8f6531e8d32f05e4169419fc8fb10b86b3beffb7 100644 (file)
@@ -110,7 +110,7 @@ static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
        efi_status_t status;
 
        spin_lock_irqsave(&rtc_lock, flags);
-       status = efi_call_virt2(get_time, tm, tc);
+       status = efi_call_virt(get_time, tm, tc);
        spin_unlock_irqrestore(&rtc_lock, flags);
        return status;
 }
@@ -121,7 +121,7 @@ static efi_status_t virt_efi_set_time(efi_time_t *tm)
        efi_status_t status;
 
        spin_lock_irqsave(&rtc_lock, flags);
-       status = efi_call_virt1(set_time, tm);
+       status = efi_call_virt(set_time, tm);
        spin_unlock_irqrestore(&rtc_lock, flags);
        return status;
 }
@@ -134,8 +134,7 @@ static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled,
        efi_status_t status;
 
        spin_lock_irqsave(&rtc_lock, flags);
-       status = efi_call_virt3(get_wakeup_time,
-                               enabled, pending, tm);
+       status = efi_call_virt(get_wakeup_time, enabled, pending, tm);
        spin_unlock_irqrestore(&rtc_lock, flags);
        return status;
 }
@@ -146,8 +145,7 @@ static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
        efi_status_t status;
 
        spin_lock_irqsave(&rtc_lock, flags);
-       status = efi_call_virt2(set_wakeup_time,
-                               enabled, tm);
+       status = efi_call_virt(set_wakeup_time, enabled, tm);
        spin_unlock_irqrestore(&rtc_lock, flags);
        return status;
 }
@@ -158,17 +156,17 @@ static efi_status_t virt_efi_get_variable(efi_char16_t *name,
                                          unsigned long *data_size,
                                          void *data)
 {
-       return efi_call_virt5(get_variable,
-                             name, vendor, attr,
-                             data_size, data);
+       return efi_call_virt(get_variable,
+                            name, vendor, attr,
+                            data_size, data);
 }
 
 static efi_status_t virt_efi_get_next_variable(unsigned long *name_size,
                                               efi_char16_t *name,
                                               efi_guid_t *vendor)
 {
-       return efi_call_virt3(get_next_variable,
-                             name_size, name, vendor);
+       return efi_call_virt(get_next_variable,
+                            name_size, name, vendor);
 }
 
 static efi_status_t virt_efi_set_variable(efi_char16_t *name,
@@ -177,9 +175,9 @@ static efi_status_t virt_efi_set_variable(efi_char16_t *name,
                                          unsigned long data_size,
                                          void *data)
 {
-       return efi_call_virt5(set_variable,
-                             name, vendor, attr,
-                             data_size, data);
+       return efi_call_virt(set_variable,
+                            name, vendor, attr,
+                            data_size, data);
 }
 
 static efi_status_t virt_efi_query_variable_info(u32 attr,
@@ -190,13 +188,13 @@ static efi_status_t virt_efi_query_variable_info(u32 attr,
        if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
                return EFI_UNSUPPORTED;
 
-       return efi_call_virt4(query_variable_info, attr, storage_space,
-                             remaining_space, max_variable_size);
+       return efi_call_virt(query_variable_info, attr, storage_space,
+                            remaining_space, max_variable_size);
 }
 
 static efi_status_t virt_efi_get_next_high_mono_count(u32 *count)
 {
-       return efi_call_virt1(get_next_high_mono_count, count);
+       return efi_call_virt(get_next_high_mono_count, count);
 }
 
 static void virt_efi_reset_system(int reset_type,
@@ -204,8 +202,8 @@ static void virt_efi_reset_system(int reset_type,
                                  unsigned long data_size,
                                  efi_char16_t *data)
 {
-       efi_call_virt4(reset_system, reset_type, status,
-                      data_size, data);
+       efi_call_virt(reset_system, reset_type, status,
+                     data_size, data);
 }
 
 static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
@@ -215,7 +213,7 @@ static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
        if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
                return EFI_UNSUPPORTED;
 
-       return efi_call_virt3(update_capsule, capsules, count, sg_list);
+       return efi_call_virt(update_capsule, capsules, count, sg_list);
 }
 
 static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
@@ -226,8 +224,8 @@ static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
        if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
                return EFI_UNSUPPORTED;
 
-       return efi_call_virt4(query_capsule_caps, capsules, count, max_size,
-                             reset_type);
+       return efi_call_virt(query_capsule_caps, capsules, count, max_size,
+                            reset_type);
 }
 
 static efi_status_t __init phys_efi_set_virtual_address_map(
@@ -239,9 +237,9 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
        efi_status_t status;
 
        efi_call_phys_prelog();
-       status = efi_call_phys4(efi_phys.set_virtual_address_map,
-                               memory_map_size, descriptor_size,
-                               descriptor_version, virtual_map);
+       status = efi_call_phys(efi_phys.set_virtual_address_map,
+                              memory_map_size, descriptor_size,
+                              descriptor_version, virtual_map);
        efi_call_phys_epilog();
        return status;
 }
index e0984ef0374b87a4dcf9d770b812feff2825285d..5fcda7272550a79b52660030571adeaf9d0f197b 100644 (file)
        2:
        .endm
 
-ENTRY(efi_call0)
-       SAVE_XMM
-       subq $32, %rsp
-       SWITCH_PGT
-       call *%rdi
-       RESTORE_PGT
-       addq $32, %rsp
-       RESTORE_XMM
-       ret
-ENDPROC(efi_call0)
-
-ENTRY(efi_call1)
-       SAVE_XMM
-       subq $32, %rsp
-       mov  %rsi, %rcx
-       SWITCH_PGT
-       call *%rdi
-       RESTORE_PGT
-       addq $32, %rsp
-       RESTORE_XMM
-       ret
-ENDPROC(efi_call1)
-
-ENTRY(efi_call2)
-       SAVE_XMM
-       subq $32, %rsp
-       mov  %rsi, %rcx
-       SWITCH_PGT
-       call *%rdi
-       RESTORE_PGT
-       addq $32, %rsp
-       RESTORE_XMM
-       ret
-ENDPROC(efi_call2)
-
-ENTRY(efi_call3)
-       SAVE_XMM
-       subq $32, %rsp
-       mov  %rcx, %r8
-       mov  %rsi, %rcx
-       SWITCH_PGT
-       call *%rdi
-       RESTORE_PGT
-       addq $32, %rsp
-       RESTORE_XMM
-       ret
-ENDPROC(efi_call3)
-
-ENTRY(efi_call4)
-       SAVE_XMM
-       subq $32, %rsp
-       mov %r8, %r9
-       mov %rcx, %r8
-       mov %rsi, %rcx
-       SWITCH_PGT
-       call *%rdi
-       RESTORE_PGT
-       addq $32, %rsp
-       RESTORE_XMM
-       ret
-ENDPROC(efi_call4)
-
-ENTRY(efi_call5)
-       SAVE_XMM
-       subq $48, %rsp
-       mov %r9, 32(%rsp)
-       mov %r8, %r9
-       mov %rcx, %r8
-       mov %rsi, %rcx
-       SWITCH_PGT
-       call *%rdi
-       RESTORE_PGT
-       addq $48, %rsp
-       RESTORE_XMM
-       ret
-ENDPROC(efi_call5)
-
-ENTRY(efi_call6)
+ENTRY(efi_call)
        SAVE_XMM
        mov (%rsp), %rax
        mov 8(%rax), %rax
@@ -166,7 +89,7 @@ ENTRY(efi_call6)
        addq $48, %rsp
        RESTORE_XMM
        ret
-ENDPROC(efi_call6)
+ENDPROC(efi_call)
 
 #ifdef CONFIG_EFI_MIXED
 
index 766612137a62d55c6b328f1b3c30807d298a50ac..1584cbed0dce25eab259cdaf00ad49724cd09bac 100644 (file)
@@ -39,7 +39,7 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
                 */
                return BIOS_STATUS_UNIMPLEMENTED;
 
-       ret = efi_call6((void *)__va(tab->function), (u64)which,
+       ret = efi_call((void *)__va(tab->function), (u64)which,
                        a1, a2, a3, a4, a5);
        return ret;
 }