diff --git a/ChangeLog b/ChangeLog index ca8ea2e5d..38a97db5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-11-19 Josh Triplett + + * grub-core/kern/x86_64/efi/startup.S (_start): Align the stack to a + 16-byte boundary, as required by the x86-64 ABI, before calling + grub_main. In some cases, GCC emits code that assumes this + alignment, which crashes if not aligned. The EFI firmware is also + entitled to assume that stack alignment without checking. + 2013-11-18 Josh Triplett * grub-core/mmap/efi/mmap.c (grub_mmap_register): Round up/down to diff --git a/grub-core/kern/x86_64/efi/startup.S b/grub-core/kern/x86_64/efi/startup.S index f86f01969..9357e5c5d 100644 --- a/grub-core/kern/x86_64/efi/startup.S +++ b/grub-core/kern/x86_64/efi/startup.S @@ -30,6 +30,6 @@ _start: movq %rcx, EXT_C(grub_efi_image_handle)(%rip) movq %rdx, EXT_C(grub_efi_system_table)(%rip) + andq $~0xf, %rsp call EXT_C(grub_main) - ret - + /* Doesn't return. */