• Matt Fleming's avatar
    x86/efi: Firmware agnostic handover entry points · b8ff87a6
    Matt Fleming authored
    The EFI handover code only works if the "bitness" of the firmware and
    the kernel match, i.e. 64-bit firmware and 64-bit kernel - it is not
    possible to mix the two. This goes against the tradition that a 32-bit
    kernel can be loaded on a 64-bit BIOS platform without having to do
    anything special in the boot loader. Linux distributions, for one thing,
    regularly run only 32-bit kernels on their live media.
    
    Despite having only one 'handover_offset' field in the kernel header,
    EFI boot loaders use two separate entry points to enter the kernel based
    on the architecture the boot loader was compiled for,
    
        (1) 32-bit loader: handover_offset
        (2) 64-bit loader: handover_offset + 512
    
    Since we already have two entry points, we can leverage them to infer
    the bitness of the firmware we're running on, without requiring any boot
    loader modifications, by making (1) and (2) valid entry points for both
    CONFIG_X86_32 and CONFIG_X86_64 kernels.
    
    To be clear, a 32-bit boot loader will always use (1) and a 64-bit boot
    loader will always use (2). It's just that, if a single kernel image
    supports (1) and (2) that image can be used with both 32-bit and 64-bit
    boot loaders, and hence both 32-bit and 64-bit EFI.
    
    (1) and (2) must be 512 bytes apart at all times, but that is already
    part of the boot ABI and we could never change that delta without
    breaking existing boot loaders anyhow.
    Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
    b8ff87a6
build.c 11.6 KB