diff --git a/src/boot/efi/linux.c b/src/boot/efi/linux.c index 5b623f4b71e..00a3551e09a 100644 --- a/src/boot/efi/linux.c +++ b/src/boot/efi/linux.c @@ -6,24 +6,24 @@ #include "linux.h" #include "util.h" -#ifdef __x86_64__ -typedef VOID(*handover_f)(VOID *image, EFI_SYSTEM_TABLE *table, struct boot_params *params); -static VOID linux_efi_handover(EFI_HANDLE image, struct boot_params *params) { - handover_f handover; - - asm volatile ("cli"); - handover = (handover_f)((UINTN)params->hdr.code32_start + 512 + params->hdr.handover_offset); - handover(image, ST, params); -} +#ifdef __i386__ +#define __regparm0__ __attribute__((regparm(0))) #else -typedef VOID(*handover_f)(VOID *image, EFI_SYSTEM_TABLE *table, struct boot_params *params) __attribute__((regparm(0))); +#define __regparm0__ +#endif + +typedef VOID(*handover_f)(VOID *image, EFI_SYSTEM_TABLE *table, struct boot_params *params) __regparm0__; static VOID linux_efi_handover(EFI_HANDLE image, struct boot_params *params) { handover_f handover; + UINTN start = (UINTN)params->hdr.code32_start; - handover = (handover_f)((UINTN)params->hdr.code32_start + params->hdr.handover_offset); +#ifdef __x86_64__ + asm volatile ("cli"); + start += 512; +#endif + handover = (handover_f)(start + params->hdr.handover_offset); handover(image, ST, params); } -#endif EFI_STATUS linux_exec(EFI_HANDLE *image, CHAR8 *cmdline, UINTN cmdline_len, diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build index dfec97028b4..b8fd5105d04 100644 --- a/src/boot/efi/meson.build +++ b/src/boot/efi/meson.build @@ -135,6 +135,9 @@ if have_gnu_efi compile_args += ['-mno-sse', '-mno-mmx'] endif + if get_option('werror') == true + compile_args += ['-Werror'] + endif efi_ldflags = ['-T', join_paths(efi_ldsdir, arch_lds), diff --git a/src/boot/efi/shim.c b/src/boot/efi/shim.c index 9e072d294f9..8db27547cca 100644 --- a/src/boot/efi/shim.c +++ b/src/boot/efi/shim.c @@ -14,14 +14,20 @@ #include "util.h" #include "shim.h" +#if defined(__x86_64__) || defined(__i386__) +#define __sysv_abi__ __attribute__((sysv_abi)) +#else +#define __sysv_abi__ +#endif + struct ShimLock { - EFI_STATUS __attribute__((sysv_abi)) (*shim_verify) (VOID *buffer, UINT32 size); + EFI_STATUS __sysv_abi__ (*shim_verify) (VOID *buffer, UINT32 size); /* context is actually a struct for the PE header, but it isn't needed so void is sufficient just do define the interface * see shim.c/shim.h and PeHeader.h in the github shim repo */ - EFI_STATUS __attribute__((sysv_abi)) (*generate_hash) (VOID *data, UINT32 datasize, VOID *context, UINT8 *sha256hash, UINT8 *sha1hash); + EFI_STATUS __sysv_abi__ (*generate_hash) (VOID *data, UINT32 datasize, VOID *context, UINT8 *sha256hash, UINT8 *sha1hash); - EFI_STATUS __attribute__((sysv_abi)) (*read_header) (VOID *data, UINT32 datasize, VOID *context); + EFI_STATUS __sysv_abi__ (*read_header) (VOID *data, UINT32 datasize, VOID *context); }; static const EFI_GUID simple_fs_guid = SIMPLE_FILE_SYSTEM_PROTOCOL;