summaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
authorDan Streetman <ddstreet@canonical.com>2019-08-13 07:02:33 -0400
committerDan Streetman <ddstreet@canonical.com>2019-08-15 16:36:10 -0400
commit4287d0832c86a0b6a8ca8fe0163518c8d76cd0f1 (patch)
tree78873f695b24e11bb49b8945b47cedce7e15bbb3 /src/boot
parent82a0fb328e6fd0dbe14223bd290fc88d13fd5a4d (diff)
downloadsystemd-4287d0832c86a0b6a8ca8fe0163518c8d76cd0f1.tar.gz
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.
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/efi/linux.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/boot/efi/linux.c b/src/boot/efi/linux.c
index 5b623f4b71..00a3551e09 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,