src/boot/efi/linux: elide __attribute__((regparm(0))) on non-i386
authorDan Streetman <ddstreet@canonical.com>
Tue, 13 Aug 2019 11:02:33 +0000 (07:02 -0400)
committerDan Streetman <ddstreet@canonical.com>
Thu, 15 Aug 2019 20:36:10 +0000 (16:36 -0400)
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

index 5b623f4..00a3551 100644 (file)
@@ -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,