x86/efi: Move to generic {__,}efi_call_virt()
authorMark Rutland <mark.rutland@arm.com>
Mon, 25 Apr 2016 20:07:06 +0000 (21:07 +0100)
committerIngo Molnar <mingo@kernel.org>
Thu, 28 Apr 2016 09:34:09 +0000 (11:34 +0200)
Now there's a common template for {__,}efi_call_virt(), remove the
duplicate logic from the x86 EFI code.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-efi@vger.kernel.org
Link: http://lkml.kernel.org/r/1461614832-17633-35-git-send-email-matt@codeblueprint.co.uk
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/efi.h

index 8747abe..fb085ce 100644 (file)
 
 extern unsigned long asmlinkage efi_call_phys(void *, ...);
 
+#define arch_efi_call_virt_setup()     kernel_fpu_begin()
+#define arch_efi_call_virt_teardown()  kernel_fpu_end()
+
 /*
  * Wrap all the virtual calls in a way that forces the parameters on the stack.
  */
-
-/* Use this macro if your virtual returns a non-void value */
-#define efi_call_virt(f, args...) \
-({                                                                     \
-       efi_status_t __s;                                               \
-       kernel_fpu_begin();                                             \
-       __s = ((efi_##f##_t __attribute__((regparm(0)))*)               \
-               efi.systab->runtime->f)(args);                          \
-       kernel_fpu_end();                                               \
-       __s;                                                            \
-})
-
-/* Use this macro if your virtual call does not return any value */
-#define __efi_call_virt(f, args...) \
+#define arch_efi_call_virt(f, args...)                                 \
 ({                                                                     \
-       kernel_fpu_begin();                                             \
        ((efi_##f##_t __attribute__((regparm(0)))*)                     \
                efi.systab->runtime->f)(args);                          \
-       kernel_fpu_end();                                               \
 })
 
 #define efi_ioremap(addr, size, type, attr)    ioremap_cache(addr, size)
@@ -78,10 +66,8 @@ struct efi_scratch {
        u64     phys_stack;
 } __packed;
 
-#define efi_call_virt(f, ...)                                          \
+#define arch_efi_call_virt_setup()                                     \
 ({                                                                     \
-       efi_status_t __s;                                               \
-                                                                       \
        efi_sync_low_kernel_mappings();                                 \
        preempt_disable();                                              \
        __kernel_fpu_begin();                                           \
@@ -91,9 +77,13 @@ struct efi_scratch {
                write_cr3((unsigned long)efi_scratch.efi_pgt);          \
                __flush_tlb_all();                                      \
        }                                                               \
-                                                                       \
-       __s = efi_call((void *)efi.systab->runtime->f, __VA_ARGS__);    \
-                                                                       \
+})
+
+#define arch_efi_call_virt(f, args...)                                 \
+       efi_call((void *)efi.systab->runtime->f, args)                  \
+
+#define arch_efi_call_virt_teardown()                                  \
+({                                                                     \
        if (efi_scratch.use_pgd) {                                      \
                write_cr3(efi_scratch.prev_cr3);                        \
                __flush_tlb_all();                                      \
@@ -101,15 +91,8 @@ struct efi_scratch {
                                                                        \
        __kernel_fpu_end();                                             \
        preempt_enable();                                               \
-       __s;                                                            \
 })
 
-/*
- * All X86_64 virt calls return non-void values. Thus, use non-void call for
- * virt calls that would be void on X86_32.
- */
-#define __efi_call_virt(f, args...) efi_call_virt(f, args)
-
 extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
                                        u32 type, u64 attribute);