• Ard Biesheuvel's avatar
    x86/efi: Make the deprecated EFI handover protocol optional · cc3fdda2
    Ard Biesheuvel authored
    The EFI handover protocol permits a bootloader to invoke the kernel as a
    EFI PE/COFF application, while passing a bootparams struct as a third
    argument to the entrypoint function call.
    
    This has no basis in the UEFI specification, and there are better ways
    to pass additional data to a UEFI application (UEFI configuration
    tables, UEFI variables, UEFI protocols) than going around the
    StartImage() boot service and jumping to a fixed offset in the loaded
    image, just to call a different function that takes a third parameter.
    
    The reason for handling struct bootparams in the bootloader was that the
    EFI stub could only load initrd images from the EFI system partition,
    and so passing it via struct bootparams was needed for loaders like
    GRUB, which pass the initrd in memory, and may load it from anywhere,
    including from the network. Another motivation was EFI mixed mode, which
    could not use the initrd loader in the EFI stub at all due to 32/64 bit
    incompatibilities (which will be fixed shortly [0]), and could not
    invoke the ordinary PE/COFF entry point either, for the same reasons.
    
    Given that loaders such as GRUB already carried the bootparams handling
    in order to implement non-EFI boot, retaining that code and just passing
    bootparams to the EFI stub was a reasonable choice (although defining an
    alternate entrypoint could have been avoided.) However, the GRUB side
    changes never made it upstream, and are only shipped by some of the
    distros in their downstream versions.
    
    In the meantime, EFI support has been added to other Linux architecture
    ports, as well as to U-boot and systemd, including arch-agnostic methods
    for passing initrd images in memory [1], and for doing mixed mode boot
    [2], none of them requiring anything like the EFI handover protocol. So
    given that only out-of-tree distro GRUB relies on this, let's permit it
    to be omitted from the build, in preparation for retiring it completely
    at a later date. (Note that systemd-boot does have an implementation as
    well, but only uses it as a fallback for booting images that do not
    implement the LoadFile2 based initrd loading method, i.e., v5.8 or older)
    
    [0] https://lore.kernel.org/all/20220927085842.2860715-1-ardb@kernel.org/
    [1] ec93fc37 ("efi/libstub: Add support for loading the initrd from a device path")
    [2] 97aa2765 ("efi/x86: Add true mixed mode entry point into .compat section")
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Link: https://lore.kernel.org/r/20221122161017.2426828-18-ardb@kernel.org
    cc3fdda2
build.c 14.5 KB