• Ard Biesheuvel's avatar
    x86/efistub: Reinstate soft limit for initrd loading · decd347c
    Ard Biesheuvel authored
    Commit
    
      8117961d98fb2 ("x86/efi: Disregard setup header of loaded image")
    
    dropped the memcopy of the image's setup header into the boot_params
    struct provided to the core kernel, on the basis that EFI boot does not
    need it and should rely only on a single protocol to interface with the
    boot chain. It is also a prerequisite for being able to increase the
    section alignment to 4k, which is needed to enable memory protections
    when running in the boot services.
    
    So only the setup_header fields that matter to the core kernel are
    populated explicitly, and everything else is ignored. One thing was
    overlooked, though: the initrd_addr_max field in the setup_header is not
    used by the core kernel, but it is used by the EFI stub itself when it
    loads the initrd, where its default value of INT_MAX is used as the soft
    limit for memory allocation.
    
    This means that, in the old situation, the initrd was virtually always
    loaded in the lower 2G of memory, but now, due to initrd_addr_max being
    0x0, the initrd may end up anywhere in memory. This should not be an
    issue principle, as most systems can deal with this fine. However, it
    does appear to tickle some problems in older UEFI implementations, where
    the memory ends up being corrupted, resulting in errors when unpacking
    the initramfs.
    
    So set the initrd_addr_max field to INT_MAX like it was before.
    
    Fixes: 8117961d98fb2 ("x86/efi: Disregard setup header of loaded image")
    Reported-by: default avatarRadek Podgorny <radek@podgorny.cz>
    Closes: https://lore.kernel.org/all/a99a831a-8ad5-4cb0-bff9-be637311f771@podgorny.czSigned-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    decd347c
x86-stub.c 25.4 KB