i386/relocator: Align stack in grub_relocator64_efi relocator
authorDaniel Kiper <daniel.kiper@oracle.com>
Thu, 2 Feb 2017 14:19:18 +0000 (15:19 +0100)
committerDaniel Kiper <daniel.kiper@oracle.com>
Thu, 2 Feb 2017 21:24:47 +0000 (22:24 +0100)
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>
grub-core/lib/i386/relocator64.S

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