Hi Heinrich,

On Mon, 28 Sep 2020 at 12:20, Heinrich Schuchardt <xypron.g...@gmx.de> wrote:
>
> On 28.09.20 18:51, Simon Glass wrote:
> > Hi,
> >
> > I thought perhaps it might be worth starting a thread on this, as
> > despite Grant and Heinrich kinding spending a bit of time talking
> > about this, I am still very much in the dark about how 'embedded' and
> > distro/other boot flows are going to come together with EBBR. Of
> > course this would be easier f2f.
> >
> > Case 1:
> > Firmware loads the kernel to a particular address, selects DT and
> > boots it. The kernel may require EFI boot services, or may not, but in
> > the general case the firmware provides them.
>
> The Linux kernel has an EFI stub. This EFI stub consumes UEFI services
> and starts the main part of the kernel.

What about the case where we don't want to use EFI?

>
> >
> > Case 2:
> > Firmware loads EFI app and provides EFI boot services to it. How the
> > system actually boots is under control of the app.
>
> Which app can be the Linux, Windows, BSD or if you do not want to start
> an operating system directly it can be a boot manager like GRUB, iPXE,
> rEFInd.
>
> The strength of the UEFI spec is that it just provides an API and does
> not prescribe what you use it for. This gives much more choice than a
> firmware tied down to boot one specific OS only.

Exactly, but it is overly complex for many use cases.

>
> It is like with nuts and bolts. An M6 nut will fit onto any M6 bolt
> anywhere in the world. - But beware of 1/4" UNC parts. They only fit to
> their kin.
>
> How about playing a game written for the EFI API:
> https://github.com/Openwide-Ingenierie/Pong-UEFI

I think you've just proved my point.

>
> >
> > I feel that a lot of the confusion about verified boot, DT selections,
> > boot menus, etc. is coming from the introduction of an EFI app which
> > has no specification (it can be grub, shim or something else, as I
> > understand it). Certainly this is very flexible and future-proof, but
> > it is also arbitrarily complex, unpredictable and hard to secure.
> >
> > I am wondering if we can come up with a way to deterministically
> > specify how a system will boot and how to make it boot a different way
> > (i.e. with a different kernel, initrd, DT).
> >
> > Heinrich mentioned EFI variables as a way of selecting
> > kernel/initrd/DT. Then the problem becomes just a case of being able
> > to change those variables from Linux userspace. Is that right?
>
> In Linux you can use the command efibootmgr to set up the boot variables
> if the UEFI firmware offers the SetVariable() runtime service. (U-Boot
> does not offer it at runtime) With the variables you can only specify a
> binary that is started and "load options". Linux uses these load options
> as command line. A Linux command line parameter (initrd=<path>) can be
> used to specify the initial ramdisk.
>
> The UEFI boot manager (in U-Boot command 'bootefi bootmgr') uses the
> BootNext and BootOrder variables to identify which BootXXXX variable
> contains the specification of the binary to start.
>
> The entry point of an UEFI binary (e.g. the Linux EFI stub) receives two
> parameters: the system table pointer, and the handle of the loaded
> image. The UEFI system table points to a list of configuration tables.
> These may include ACPI, SMBIOS, device-tree, and more. The Linux command
> line can be retrieved via the LoadOptions field of the loaded image
> protocol installed on the handle passed to the entry point.
>
> It is the task of the firmware to set up a configuration table with the
> device tree or the ACPI table.

Yes most of that matches what I understood, but I knew very little
about the boot variables.

So I think we can have still have a reasonably simple boot if the boot
variables and all required boot functionality are implemented in
U-Boot (as apparently they are) and can be changed using efibootmgr
under Linux.

>
> >
> > We are talking about having a 'secure' part of EBBR, which allows for
> > secure boot. Should we have a 'defined boot' part of EBBR, that
> > defines how the kernel/DT/initrd are selected, based on EFI variables?
>
> Secure Boot in UEFI terms involves setting up the PK, KEK, db, and dbx
> variables. Then every UEFI binary loaded can only be started via service
> StartImage() if it was signed with a certificate with a public key in db
> and not in dbx.
>
> Verification of intrd and fdt is out of scope for the UEFI specification.

If these are in a FIT then the verification can be done in U-Boot.

>
> >
> > Unfortunately I just don't know enough about all the different boot
> > flows used by the different distros. It seems like crazy town. Does
> > anyone have some pointers so I can do some study?
>
> Debian/Ubuntu, Fedora and Suse all use UEFI [-> shim] -> GRUB -> Linux
> if the firmware running the installer image supports UEFI.
>
> FreeBSD and OpenBSD can be started as UEFI payloads but they typically
> do not use GRUB.
>
> Here is a good starting point:
> https://wiki.ubuntu.com/UEFI/SecureBoot

OK thank you. What are SHIM and MOK not incorporated into the boot loader?

Regards,
Simon
_______________________________________________
boot-architecture mailing list
boot-architecture@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/boot-architecture

Reply via email to