i386/relocator: Align stack in grub_relocator64_efi relocator

Unified Extensible Firmware Interface Specification, Version 2.6,
section 2.3.4, x64 Platforms, boot services, says among others:
The stack must be 16-byte aligned. So, do it. Otherwise OS may
boot only by chance as it happens right now.

Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Daniel Kiper 2017-02-02 15:19:18 +01:00
parent 1402cdd96a
commit 4e5414b2a1

View file

@ -73,14 +73,22 @@ VARIABLE(grub_relocator64_rsp)
movq %rax, %rsp movq %rax, %rsp
#ifdef GRUB_MACHINE_EFI
jmp LOCAL(skip_efi_stack_align)
/* /*
* Here is grub_relocator64_efi_start() entry point. * Here is grub_relocator64_efi_start() entry point. Most of the
* Following code is shared between grub_relocator64_efi_start() * code below is shared between grub_relocator64_efi_start()
* and grub_relocator64_start(). * and grub_relocator64_start().
* *
* Think twice before changing anything below!!! * Think twice before changing anything there!!!
*/ */
VARIABLE(grub_relocator64_efi_start) VARIABLE(grub_relocator64_efi_start)
/* Align the stack as UEFI spec requires. */
andq $~15, %rsp
LOCAL(skip_efi_stack_align):
#endif
/* mov imm64, %rax */ /* mov imm64, %rax */
.byte 0x48 .byte 0x48
.byte 0xb8 .byte 0xb8
@ -128,8 +136,10 @@ LOCAL(jump_addr):
VARIABLE(grub_relocator64_rip) VARIABLE(grub_relocator64_rip)
.quad 0 .quad 0
#ifdef GRUB_MACHINE_EFI
/* Here grub_relocator64_efi_start() ends. Ufff... */ /* Here grub_relocator64_efi_start() ends. Ufff... */
VARIABLE(grub_relocator64_efi_end) VARIABLE(grub_relocator64_efi_end)
#endif
#ifndef __x86_64__ #ifndef __x86_64__
.p2align 4 .p2align 4