summaryrefslogtreecommitdiffstats
path: root/src/boot/efi/meson.build
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2023-04-10 11:43:56 +0200
committerLuca Boccassi <luca.boccassi@gmail.com>2023-04-11 18:09:18 +0200
commitb87d6da4478820d680b9542668b5df41848f937d (patch)
treef0f47ff5460f27da32c505799a001ac768b7b0a1 /src/boot/efi/meson.build
parenthwdb: add matrix for Asus BR1100F (#27197) (diff)
downloadsystemd-b87d6da4478820d680b9542668b5df41848f937d.tar.xz
systemd-b87d6da4478820d680b9542668b5df41848f937d.zip
boot: Fix alignment of long long inside structs on x86
On x86 EFI follows the windows ABI, which expects 8-byte aligned long long. The x86 sysv ELF ABI expects them to be 8-byte aligned when used alone, but 4-byte aligned when they appear inside of structs: struct S { int i; long long ll; }; // _Static_assert(sizeof(struct S) == 12, "x86 sysv ABI"); _Static_assert(sizeof(struct S) == 16, "EFI/MS ABI"); To get the behavior we need when building with sysv ELF ABI we need to pass '-malign-double' to the compiler as done by EDK2. This in turn will make ubsan unhappy as the stack may not be properly aligned on entry, so we have to tell the compiler explicitly to re-align the stack on entry to efi_main. This fixes loading EFI drivers on x86 that were previously always rejected as the EFI_LOADED_IMAGE_PROTOCOL had a wrong memory layout. See also: https://github.com/rhboot/shim/pull/516
Diffstat (limited to 'src/boot/efi/meson.build')
-rw-r--r--src/boot/efi/meson.build9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build
index e6e7eed3bc..67ce00838d 100644
--- a/src/boot/efi/meson.build
+++ b/src/boot/efi/meson.build
@@ -213,15 +213,16 @@ efi_c_args_alt = [efi_c_args, '-DEFI_MACHINE_TYPE_NAME="' + efi_arch_alt + '"']
efi_c_ld_args_primary = efi_c_ld_args
efi_c_ld_args_alt = efi_c_ld_args
-efi_c_args_primary += {
+efi_arch_c_args = {
'aarch64' : ['-mgeneral-regs-only'],
'arm' : ['-mgeneral-regs-only'],
'x86_64' : ['-march=x86-64', '-mno-red-zone', '-mgeneral-regs-only'],
- 'x86' : ['-march=i686', '-mgeneral-regs-only'],
-}.get(host_machine.cpu_family(), [])
+ 'x86' : ['-march=i686', '-mgeneral-regs-only', '-malign-double'],
+}
+efi_c_args_primary += efi_arch_c_args.get(host_machine.cpu_family(), [])
if efi_arch_alt == 'ia32'
- efi_c_args_alt += ['-m32', '-march=i686', '-mgeneral-regs-only']
+ efi_c_args_alt += ['-m32', efi_arch_c_args['x86']]
efi_c_ld_args_alt += '-m32'
endif