Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/efi: Save and restore FPU context around efi_calls (i386)

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>

authored by

Ricardo Neri and committed by
Matt Fleming
b738c6ea de05764e

+15 -2
+15 -2
arch/x86/include/asm/efi.h
··· 34 34 35 35 /* Use this macro if your virtual returns a non-void value */ 36 36 #define efi_call_virt(f, args...) \ 37 - ((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args) 37 + ({ \ 38 + efi_status_t __s; \ 39 + kernel_fpu_begin(); \ 40 + __s = ((efi_##f##_t __attribute__((regparm(0)))*) \ 41 + efi.systab->runtime->f)(args); \ 42 + kernel_fpu_end(); \ 43 + __s; \ 44 + }) 38 45 39 46 /* Use this macro if your virtual call does not return any value */ 40 - #define __efi_call_virt(f, args...) efi_call_virt(f, args) 47 + #define __efi_call_virt(f, args...) \ 48 + ({ \ 49 + kernel_fpu_begin(); \ 50 + ((efi_##f##_t __attribute__((regparm(0)))*) \ 51 + efi.systab->runtime->f)(args); \ 52 + kernel_fpu_end(); \ 53 + }) 41 54 42 55 #define efi_ioremap(addr, size, type, attr) ioremap_cache(addr, size) 43 56