]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
efi/libstub: Fix boot argument handling in mixed mode entry code
authorArd Biesheuvel <ardb@kernel.org>
Fri, 3 Jan 2020 11:39:34 +0000 (12:39 +0100)
committerIngo Molnar <mingo@kernel.org>
Fri, 10 Jan 2020 17:55:01 +0000 (18:55 +0100)
The mixed mode refactor actually broke mixed mode by failing to
pass the bootparam structure to startup_32(). This went unnoticed
because it apparently has a high tolerance for being passed random
junk, and still boots fine in some cases. So let's fix this by
populating %esi as required when entering via efi32_stub_entry,
and while at it, preserve the arguments themselves instead of their
address in memory (via the stack pointer) since that memory could
be clobbered before we get to it.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arvind Sankar <nivedita@alum.mit.edu>
Cc: Matthew Garrett <mjg59@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-efi@vger.kernel.org
Link: https://lkml.kernel.org/r/20200103113953.9571-2-ardb@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/boot/compressed/head_64.S

index a6f3ee9ca61dac2699e4e2ff8a9134d8b3cd3c87..44a6bb6964b5b7eea7bfd7e3d6ec82b407e1bb3f 100644 (file)
@@ -208,13 +208,12 @@ SYM_FUNC_START(startup_32)
        pushl   $__KERNEL_CS
        leal    startup_64(%ebp), %eax
 #ifdef CONFIG_EFI_MIXED
-       movl    efi32_boot_args(%ebp), %ebx
-       cmp     $0, %ebx
+       movl    efi32_boot_args(%ebp), %edi
+       cmp     $0, %edi
        jz      1f
        leal    handover_entry(%ebp), %eax
-       movl    0(%ebx), %edi
-       movl    4(%ebx), %esi
-       movl    8(%ebx), %edx
+       movl    %esi, %edx
+       movl    efi32_boot_args+4(%ebp), %esi
        movl    $0x0, %ecx
 1:
 #endif
@@ -232,12 +231,16 @@ SYM_FUNC_END(startup_32)
        .org 0x190
 SYM_FUNC_START(efi32_stub_entry)
        add     $0x4, %esp              /* Discard return address */
+       popl    %ecx
+       popl    %edx
+       popl    %esi
 
        call    1f
 1:     pop     %ebp
        subl    $1b, %ebp
 
-       movl    %esp, efi32_boot_args(%ebp)
+       movl    %ecx, efi32_boot_args(%ebp)
+       movl    %edx, efi32_boot_args+4(%ebp)
        sgdtl   efi32_boot_gdt(%ebp)
 
        /* Disable paging */
@@ -628,7 +631,7 @@ SYM_DATA_START_LOCAL(gdt)
 SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
 
 #ifdef CONFIG_EFI_MIXED
-SYM_DATA_LOCAL(efi32_boot_args, .long 0)
+SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0)
 #endif
 
 /*