x86/efi: Save and restore FPU context around efi_calls (i386)
authorRicardo Neri <ricardo.neri-calderon@linux.intel.com>
Thu, 27 Mar 2014 22:10:43 +0000 (15:10 -0700)
committerMatt Fleming <matt.fleming@intel.com>
Thu, 17 Apr 2014 12:26:33 +0000 (13:26 +0100)
Do a complete FPU context save/restore around the EFI calls. This required
as runtime EFI firmware may potentially use the FPU.

This change covers only the i386 configuration.

Signed-off-by: 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/include/asm/efi.h

index 0b19187cc88268f04dfcb49b4433ed5fe8b6d463..1eb5f6433ad8aa6c0abc314a25b7fc8a5df707b3 100644 (file)
@@ -34,10 +34,23 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
 
 /* Use this macro if your virtual returns a non-void value */
 #define efi_call_virt(f, args...) \
-       ((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->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...) efi_call_virt(f, args)
+#define __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)