[U-Boot] [PATCH v3 00/21] efi_loader: enough UEFI for standard distro boot

Rob Clark
2017-09-13T22:05:23Z

This patchset fleshes out EFI_LOADER enough to support booting an
upstream \EFI\BOOT\bootaa64.efi (which then loads fallback.efi and
then eventually the per-distro shim.efi which loads the per-distro
grubaa64.efi) without resorting to hacks to hard-code u-boot to load
a particular distro's grub, or other hacks like setting up the
distro installation as live-media.

Background: with a normal UEFI implementation, the boot process is:

a) firmware (u-boot) looks at BootOrder and the BootXXXX variables
to try to determine what to boot.
b) the firmware will look at the BootXXXX variables (which contain
an EFI_LOAD_OPTION "struct" in order specified by BootOrder, and
will boot the first bootable option.
c) The EFI_LOAD_OPTION specifies a device-path which identifies the
device and file path of the .efi payload to exectute.

This is implemented with the 'bootefi bootmgr' command.

If there are no bootable options the firmware falls back to loading
\EFI\BOOT\bootaa64.efi (exact name varies depending on arch), which
for distro's using fallback/shim (which should include most modern
linux distros) then loads fallback.efi which uses the
EFI_SIMPLE_FILE_SYSTEM_PROTCOL and EFI_FILE_PROTOCOL to search for
any \EFI\*\boot.csv, and will then set BootOrder and BootXXXX EFI
variables accordingly so that on next boot fallback.efi is not
necessary.

The last 5 patches are a bit unrelated, just pulling forward some of
the patches I have from the next patchset, to get Shell.efi and SCT
working.

v2: updates for review comments
v3: rebase on latest master and additional comments

Peter Jones (2):
part: extract MBR signature from partitions
efi: add some more device path structures

Rob Clark (19):
part: move efi_guid_t
efi: add some missing __packed
efi_loader: add device-path utils
efi_loader: drop redundant efi_device_path_protocol
efi_loader: flesh out device-path to text
efi_loader: use proper device-paths for partitions
efi_loader: use proper device-paths for net
efi_loader: refactor boot device and loaded_image handling
efi_loader: add file/filesys support
efi_loader: support load_image() from a file-path
efi_loader: make pool allocations cacheline aligned
efi_loader: efi variable support
efi_loader: add bootmgr
efi_loader: file_path should be variable length
efi_loader: set loaded image code/data type properly
efi_loader: print GUIDs
efi_loader: split out escape sequence based size query
efi_loader: Correctly figure out size for vidconsole
efi_loader: Some console improvements for vidconsole

cmd/bootefi.c | 249 ++++++--------
disk/part_dos.c | 12 +-
disk/part_efi.c | 20 ++
include/blk.h | 18 +
include/config_distro_bootcmd.h | 5 +
include/efi.h | 25 ++
include/efi_api.h | 162 ++++++++-
include/efi_loader.h | 62 +++-
include/part.h | 3 +-
include/part_efi.h | 4 -
include/pe.h | 6 +
lib/efi_loader/Makefile | 3 +-
lib/efi_loader/efi_bootmgr.c | 180 ++++++++++
lib/efi_loader/efi_boottime.c | 162 +++++++--
lib/efi_loader/efi_console.c | 123 ++++---
lib/efi_loader/efi_device_path.c | 563 +++++++++++++++++++++++++++++++
lib/efi_loader/efi_device_path_to_text.c | 242 +++++++++----
lib/efi_loader/efi_disk.c | 86 +++--
lib/efi_loader/efi_file.c | 560 ++++++++++++++++++++++++++++++
lib/efi_loader/efi_image_loader.c | 26 ++
lib/efi_loader/efi_memory.c | 5 +-
lib/efi_loader/efi_net.c | 24 +-
lib/efi_loader/efi_runtime.c | 17 +-
lib/efi_loader/efi_variable.c | 335 ++++++++++++++++++
24 files changed, 2538 insertions(+), 354 deletions(-)
create mode 100644 lib/efi_loader/efi_bootmgr.c
create mode 100644 lib/efi_loader/efi_device_path.c
create mode 100644 lib/efi_loader/efi_file.c
create mode 100644 lib/efi_loader/efi_variable.c

--
2.13.5