From 4287d0832c86a0b6a8ca8fe0163518c8d76cd0f1 Mon Sep 17 00:00:00 2001 From: Dan Streetman Date: Tue, 13 Aug 2019 07:02:33 -0400 Subject: [PATCH] src/boot/efi/linux: elide __attribute__((regparm(0))) on non-i386 This attribute is x86_32-only, so when building on non-intel archs it generates a compiler warning. When building with -Werror this turns into an error, so only include the attribute on i386 arch builds. --- src/boot/efi/linux.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/boot/efi/linux.c b/src/boot/efi/linux.c index 5b623f4..00a3551 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, -- 2.7.4