mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 20:32:22 +00:00
e15dd4949a
According to the UEFI spec section 2.3.6.4, the use of FP/SIMD instructions is allowed, and should adhere to the AAPCS64 calling convention, which states that 'only the bottom 64 bits of each value stored in registers v8-v15 need to be preserved' (section 5.1.2). This applies equally to UEFI Runtime Services called by the kernel, so make sure the FP/SIMD register file is preserved in this case. We do this by enabling the wrappers for UEFI Runtime Services (CONFIG_EFI_RUNTIME_WRAPPERS) and inserting calls to kernel_neon_begin()and kernel_neon_end() into these wrappers. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
36 lines
683 B
C
36 lines
683 B
C
#ifndef _ASM_EFI_H
|
|
#define _ASM_EFI_H
|
|
|
|
#include <asm/io.h>
|
|
#include <asm/neon.h>
|
|
|
|
#ifdef CONFIG_EFI
|
|
extern void efi_init(void);
|
|
extern void efi_idmap_init(void);
|
|
#else
|
|
#define efi_init()
|
|
#define efi_idmap_init()
|
|
#endif
|
|
|
|
#define efi_call_virt(f, ...) \
|
|
({ \
|
|
efi_##f##_t *__f = efi.systab->runtime->f; \
|
|
efi_status_t __s; \
|
|
\
|
|
kernel_neon_begin(); \
|
|
__s = __f(__VA_ARGS__); \
|
|
kernel_neon_end(); \
|
|
__s; \
|
|
})
|
|
|
|
#define __efi_call_virt(f, ...) \
|
|
({ \
|
|
efi_##f##_t *__f = efi.systab->runtime->f; \
|
|
\
|
|
kernel_neon_begin(); \
|
|
__f(__VA_ARGS__); \
|
|
kernel_neon_end(); \
|
|
})
|
|
|
|
#endif /* _ASM_EFI_H */
|