public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v0 00/20] enough UEFI for standard distro boot
@ 2017-08-04 19:31 Rob Clark
  2017-08-04 19:31 ` [U-Boot] [PATCH v0 01/20] fs: add fs_readdir() Rob Clark
                   ` (21 more replies)
  0 siblings, 22 replies; 116+ messages in thread
From: Rob Clark @ 2017-08-04 19:31 UTC (permalink / raw)
  To: u-boot

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.

The first seven patches add dependencies that will be needed later
in the series.  Patches 8-15 make u-boot work with upstream grub,
without relying on distro patches.  Patches 16-19 add missing bits
of the UEFI implementation needed to support shim/fallback.  And
finally patch 20 adds bootmanager support to avoid shim/fallback
after first boot.

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.

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

(I'm ignoring secure boot, it is out of scope here.)

For example, if you had both fedora and opensuse installed on the
same disk in different partitions, you would have both:

 + \EFI\fedora\boot.csv
 + \EFI\opensuse\boot.csv

The former would contain the filename of \EFI\fedora\shim.efi and the
latter to \EFI\opensuse\shim.efi (each of which would know to load
\EFI\fedora\grubaa64.efi or \EFI\opensuse\grubaa64.efi).  Based on
this, fallback.efi would setup EFI_LOAD_OPTION's Boot0000 and
Boot0001 (and BootOrder would control the order the load-options
are considered).

With a real UEFI fw there would also be some sort of boot-order menu
(ie. hold down f9 at boot, and get a menu to pick which of the Boot*
load-options to try first).  That is not part of this patchset but
would be a useful next step to allow installing multiple operating
systems on the same disk.

This patchset provides EFI variable support during bootservices,
so viewing or modifying EFI variables after linux ExitBootServices()'s
is not possible.  If the board supports saveenv() this will be called
in efi_exit_boot_services() to persist variables that where set during
the boot process.  Making variables available after EBS is tricky on
hardware that does not have dedicated storage, as after EBS u-boot no
longer controls the devices.  An approach that Alexander Graf
suggested, is that since reboot/halt is controlled via UEFI, is that
on boards that can ensure memory is persisted across reboot, to
store modified EFI variables in a special memory location and turn
halt into reboot uboot -> appropriate setenv() calls -> saveenv() ->
halt in order to persist modified variables.  Which is also not part
of this patchset, and will likely require some board-specific help.

There will be some updates to this patchset depending on whether we
move to c11 as Heinrich suggested (ie s/L"string"/u"string" and some
changeups in the vsprintf patch).  But rather than calling this an
RFC (which I figured was more likely to get ignored for review) I
am calling this a v0.

Thanks to Peter Jones for a couple of the patches, and a bunch of help
understanding what the things above the UEFI fw expect (and fixing a
few shim and grub bugs that we found along the way).

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

Rob Clark (18):
  fs: add fs_readdir()
  fs/fat: implement readdir
  short-wchar
  common: add some utf16 handling helpers
  vsprintf.c: add wide string (%ls) support
  efi_loader: add back optional efi_handler::open()
  efi_loader: add device-path utils
  efi_loader: drop redundant efi_device_path_protocol
  efi_loader: add guidstr helper
  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

 cmd/bootefi.c                            | 249 +++++++---------
 common/Makefile                          |   1 +
 common/charset.c                         |  81 ++++++
 config.mk                                |   2 +-
 disk/part_dos.c                          |  12 +-
 disk/part_efi.c                          |  20 ++
 fs/fat/fat.c                             |  59 +++-
 fs/fs.c                                  |  46 +++
 include/blk.h                            |  15 +
 include/charset.h                        |  18 ++
 include/config_distro_bootcmd.h          |   5 +
 include/efi.h                            |  25 ++
 include/efi_api.h                        | 141 ++++++++-
 include/efi_loader.h                     |  83 +++++-
 include/fat.h                            |   4 +-
 include/fs.h                             |  23 ++
 include/part.h                           |   3 +-
 include/part_efi.h                       |   4 -
 lib/efi_loader/Makefile                  |   3 +-
 lib/efi_loader/efi_bootmgr.c             | 169 +++++++++++
 lib/efi_loader/efi_boottime.c            | 153 ++++++++--
 lib/efi_loader/efi_console.c             |  17 +-
 lib/efi_loader/efi_device_path.c         | 485 +++++++++++++++++++++++++++++++
 lib/efi_loader/efi_device_path_to_text.c | 224 ++++++++++----
 lib/efi_loader/efi_disk.c                | 105 +++++--
 lib/efi_loader/efi_file.c                | 468 +++++++++++++++++++++++++++++
 lib/efi_loader/efi_image_loader.c        |   4 +
 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            | 342 ++++++++++++++++++++++
 lib/vsprintf.c                           |  30 +-
 32 files changed, 2508 insertions(+), 329 deletions(-)
 create mode 100644 common/charset.c
 create mode 100644 include/charset.h
 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.0

^ permalink raw reply	[flat|nested] 116+ messages in thread

end of thread, other threads:[~2017-08-10 10:41 UTC | newest]

Thread overview: 116+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-08-04 19:31 [U-Boot] [PATCH v0 00/20] enough UEFI for standard distro boot Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 01/20] fs: add fs_readdir() Rob Clark
2017-08-07 18:19   ` Brüns, Stefan
2017-08-07 19:11     ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 02/20] fs/fat: implement readdir Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 03/20] short-wchar Rob Clark
2017-08-04 20:28   ` Heinrich Schuchardt
2017-08-04 20:36     ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 04/20] part: extract MBR signature from partitions Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 05/20] efi: add some more device path structures Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 06/20] common: add some utf16 handling helpers Rob Clark
2017-08-06  5:17   ` Simon Glass
2017-08-08 22:50   ` [U-Boot] [U-Boot, v0, " Heinrich Schuchardt
2017-08-08 23:21     ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 07/20] vsprintf.c: add wide string (%ls) support Rob Clark
2017-08-08 22:03   ` [U-Boot] [U-Boot, v0, " Heinrich Schuchardt
2017-08-08 22:44     ` Rob Clark
2017-08-08 23:08       ` Heinrich Schuchardt
2017-08-08 23:20         ` Alexander Graf
2017-08-08 23:39         ` Rob Clark
2017-08-08 23:55           ` Alexander Graf
2017-08-09  0:14             ` Rob Clark
2017-08-09  1:14               ` Rob Clark
2017-08-09 11:27               ` Tom Rini
2017-08-10  2:16                 ` rick at andestech.com
2017-08-09  8:50           ` Peter Robinson
2017-08-08 22:52     ` Rob Clark
2017-08-09 13:38     ` Rob Clark
2017-08-09 13:48       ` Alexander Graf
2017-08-09 14:35         ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 08/20] efi_loader: add back optional efi_handler::open() Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 09/20] efi_loader: add device-path utils Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 10/20] efi_loader: drop redundant efi_device_path_protocol Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 11/20] efi_loader: add guidstr helper Rob Clark
2017-08-05 19:33   ` Heinrich Schuchardt
2017-08-05 19:56     ` Rob Clark
2017-08-05 20:18       ` Heinrich Schuchardt
2017-08-04 19:31 ` [U-Boot] [PATCH v0 12/20] efi_loader: flesh out device-path to text Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 13/20] efi_loader: use proper device-paths for partitions Rob Clark
2017-08-04 20:41   ` Mark Kettenis
2017-08-04 20:57     ` Rob Clark
2017-08-05 14:01       ` Mark Kettenis
2017-08-05 14:19         ` Rob Clark
2017-08-05 14:28         ` Mark Kettenis
2017-08-05 14:35           ` Rob Clark
2017-08-05 15:08             ` Mark Kettenis
2017-08-05 15:22               ` Rob Clark
2017-08-05 16:02                 ` Heinrich Schuchardt
2017-08-05 16:13                   ` Rob Clark
2017-08-05 15:10             ` Heinrich Schuchardt
2017-08-05 15:24               ` Rob Clark
2017-08-05 15:36                 ` Rob Clark
2017-08-06 13:16                   ` Mark Kettenis
2017-08-06 14:17                     ` Rob Clark
2017-08-06 14:26                       ` Rob Clark
2017-08-06 14:28                     ` Mark Kettenis
2017-08-06 14:45                       ` Rob Clark
2017-08-06 15:34                         ` Rob Clark
2017-08-06 16:00                           ` Heinrich Schuchardt
2017-08-06 16:14                           ` Jonathan Gray
2017-08-06 17:28                           ` Mark Kettenis
2017-08-06 17:49                             ` Rob Clark
2017-08-06 18:13                               ` Peter Robinson
2017-08-06 18:21                               ` Mark Kettenis
2017-08-06 18:37                                 ` Mark Kettenis
2017-08-06 18:47                                   ` Rob Clark
2017-08-06 18:53                                     ` Rob Clark
2017-08-06 18:41                                 ` Rob Clark
2017-08-07 15:47                           ` Jonathan Gray
2017-08-07 16:16                             ` Rob Clark
2017-08-08  1:36                               ` Jonathan Gray
2017-08-05 14:28         ` Rob Clark
2017-08-06 12:53           ` Mark Kettenis
2017-08-07 17:32     ` Peter Jones
2017-08-04 19:31 ` [U-Boot] [PATCH v0 14/20] efi_loader: use proper device-paths for net Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 15/20] efi_loader: refactor boot device and loaded_image handling Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 16/20] efi_loader: add file/filesys support Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 17/20] efi_loader: support load_image() from a file-path Rob Clark
2017-08-04 19:32 ` [U-Boot] [PATCH v0 18/20] efi_loader: make pool allocations cacheline aligned Rob Clark
2017-08-04 19:32 ` [U-Boot] [PATCH v0 19/20] efi_loader: efi variable support Rob Clark
2017-08-06  5:17   ` Simon Glass
2017-08-04 19:32 ` [U-Boot] [PATCH v0 20/20] efi_loader: add bootmgr Rob Clark
2017-08-04 20:06   ` Heinrich Schuchardt
2017-08-04 20:28     ` Rob Clark
2017-08-04 20:29       ` Rob Clark
2017-08-04 22:46       ` Peter Jones
2017-08-05 15:58 ` [U-Boot] [PATCH v0 21/20] efi_loader: hack for archs that cannot do unaligned accesses Rob Clark
2017-08-05 16:12   ` Heinrich Schuchardt
2017-08-05 16:16     ` Rob Clark
2017-08-05 16:19       ` Rob Clark
2017-08-05 16:26         ` Heinrich Schuchardt
2017-08-05 16:46           ` Rob Clark
2017-08-05 16:52       ` Heinrich Schuchardt
2017-08-05 17:06         ` Rob Clark
2017-08-05 18:43           ` Rob Clark
2017-08-05 20:05             ` Heinrich Schuchardt
2017-08-05 20:31               ` Rob Clark
2017-08-07 20:19                 ` Alexander Graf
2017-08-07 21:14                   ` Mark Kettenis
2017-08-07 22:18                     ` Rob Clark
2017-08-08  6:52                       ` Alexander Graf
2017-08-08  8:11                         ` Ard Biesheuvel
2017-08-08 11:32                           ` Leif Lindholm
2017-08-08 12:01                             ` Rob Clark
2017-08-08 12:39                               ` Leif Lindholm
2017-08-08  9:27                         ` Rob Clark
2017-08-08 12:26                       ` Mark Kettenis
2017-08-08 12:54                         ` Rob Clark
2017-08-08 13:33                           ` Mark Kettenis
2017-08-08 14:03                             ` Rob Clark
2017-08-08 14:10                               ` Rob Clark
2017-08-08 18:20                               ` Rob Clark
2017-08-07 16:56           ` Rob Clark
2017-08-07 17:15         ` Peter Jones
2017-08-10  1:32 ` [U-Boot] [PATCH v0 00/20] enough UEFI for standard distro boot Tom Rini
2017-08-10 10:41   ` Rob Clark

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox