Hi Mark,

On Mon, 28 Jun 2021 at 11:49, Mark Kettenis <mark.kette...@xs4all.nl> wrote:
>
> > From: Simon Glass <s...@chromium.org>
> > Date: Mon, 28 Jun 2021 08:18:26 -0600
> >
> > Hi Tom, Mark,
> >
> > On Mon, 28 Jun 2021 at 07:37, Tom Rini <tr...@konsulko.com> wrote:
> > >
> > > On Mon, Jun 28, 2021 at 10:38:50AM +0200, Mark Kettenis wrote:
> > > > > From: Simon Glass <s...@chromium.org>
> > > > > Date: Sun, 27 Jun 2021 19:48:34 -0600
> > > > >
> > > > > It has come to light that EFI_LOADER adds an extraordinary amount of
> > > > > code to U-Boot. For example, with nokia_rx51 the size delta is about
> > > > > 90KB. About 170 boards explicitly disable the option, but is is clear
> > > > > that many more could, thus saving image size and boot time.
> > > >
> > > > EFI_LOADER used to be a lot smaller.  It is great to see that over the
> > > > years UEFI support has become more complete, but a lot of that new
> > > > code implements features that are not at all essential for just
> > > > booting an OS from storage.  If that growth leads to the suggestion to
> > > > disable EFI_LOADER completely by default, we're putting the cart
> > > > before the horse.
> > >
> > > Well, I see I forgot to prefix my patch with RFC, but I hadn't found
> > > EFI_LOADER being used in the wild on armv7, but wasn't sure about the
> > > BSD families.  I did see that Debian doesn't use it, and that Armbian
> > > doesn't even use it on aarch64.
> > >
> > > > > The current situation is affecting U-Boot's image as a svelt 
> > > > > bootloader.
> > > >
> > > > Really?  I know UEFI has a bad reputation in the Open Source world,
> > > > and some of its Microsoft-isms are really annoying (yay UCS-2).  But
> > > > it works, it provides a standardized approach across several platforms
> > > > (ARMv7, AMRv8, RISC-V) and the industry seems to like it.  Personally
> > > > I'd wish the industry had standardized on Open Firmware instead, but
> > > > that ship sailed a long time ago...
> > > >
> > > > I find it hard to imagine that 90k is a serious amount of storage for
> > > > something that is going to include a multi-MB Linux kernel.  This
> > > > isn't code that lives in SPL or TPL where severe size restrictions
> > > > apply.
> > >
> > > In one of those cases where I need to pop back in to the other (Nokia
> > > N900 specific) thread and see if the big size reduction really was just
> > > disabling EFI_LOADER, it's perhaps just one of those "fun" things about
> > > Kconfig and anything other than "make oldconfig" for spotting new config
> > > options that default to enabled.
> >
> > Yes it will be interesting to see what you find there. My results on
> > nokia_rx51 were something like this:
> >
> > default
> >         arm: (for 1/1 boards) all +129370.0 bss +1136.0 data +7399.0
> > rodata +10989.0 text +109846.0
> >
> > without ebbr
> >        arm: (for 1/1 boards) all +38460.0 bss +1040.0 data +2375.0
> > rodata +5333.0 text +29712.0
> >
> > with various other things:
> > CONFIG_OF_LIBFDT_ASSUME_MASK=7
> > # CONFIG_OF_TRANSLATE is not set
> > # CONFIG_SIMPLE_BUS is not set
> > # CONFIG_TI_SYSC is not set
> > # CONFIG_CMD_FDT is not set
> >
> >        arm: (for 1/1 boards) all +19170.0 bss -16.0 data +360.0 rodata
> > +3274.0 text +15552.0
> >
> > (Mark, in the same email:)
> > > > FIT simply isn't fit for purpose (pun intended).  It only really works
> > > > for booting Linux, and forces people to combine u-boot, kernel,
> > > > initial ramdisk and other firmware components into a single image.
> > > > That is really undesirable as:
> > > > - This makes it sigificantly harder to update individual components of
> > > >   such an image.  Making it hard to update a kernel is obviously a
> > > >   serious security risk.
> > > > - This makes it impossible to build an OS install image that works om
> > > >   multiple boards/SoCs.
> >
> >
> > I would really like to understand this better. The whole thing is a
> > complete mystery to me.
> >
> > Firstly I have sometimes fiddled with booting other OSes using FIT. It
> > seemed OK. I can't see why it only works with Linux.
>
> Well, you could of course rework the boot flow of other OSes such that
> booting them includes some sort of FIT if you really wanted to.  I But
> an OS like OpenBSD comes with its own bootloader that is essential in
> the boot flow.  On OpenBSD armv7/arm64/riscv64 it adds some essential
> properties to the device tree.  Besides, the kernel itself relies on a
> valid EFI memory map.

(thanks for taking the time to reply with so much detail)

That's news to me; when did that happen? Anyway, I doubt that adds a
lot of code.

>
> > Secondly, I don't expect that U-Boot itself would be in the FIT.
>
> So the FIT would only contain the OS kernel and other OS components?
> What about the FIT that is used on some arm64 platforms to combine
> U-Boot and TF-A?  I guess you can have multiple FITs...
>
> > Thirdly, do you really want the kernel and initrd to be separate? At
> > least in the systems I have used, they are built together, even having
> > the same name, e.g.:
> >
> > initrd.img-5.10.40-1rodete1-amd64
> > System.map-5.10.40-1rodete1-amd64
> > vmlinuz-5.10.28-1rodete2-amd64
>
> I don't really use Linux on these platforms.  But I'd expect the
> normal package management tools of my Linux distribution to build
> those as necessary and place them in the root file system where the
> bootloader picks them up.  And as a distro developer, I'd like to have
> the same approach work on all Linux systems, regardless the specific
> firmware they're running (EDK2, U-Boot or something completely
> different).  Ideally that wouldn't even depend on the architecture.
>
> Now Armbian takes a different approach, and does treat most systems
> they provide as special snowflakes, providing flash images for each
> board.  But that doesn't scale and makes for a fairly crappy user
> experience.  They don't always support booting a mainline kernel.  And
> updating the kernel often requires installing special packages.

I don't think it is a requirement that things have to be special
snowflakes. There are a few common boot flows to support and we can
put that support in U-Boot and in userspace, without needing to make
everything special.

>
> > Finally, for the firmware components, do you mean system firmware? If
> > so, I would expect it to be more convenient to distribute updates to
> > that separately, although I suppose they could be combined with the
> > kernel if the combinatorial explosion can be contained. What is the
> > problem, exactly? (If you mean peripheral firmware, I would expect
> > fwupd to handle that.)
>
> I guess I mean system firmware.  Essentially everything that runs on
> the system before my OS bootloader runs.  So for me, U-Boot is part of
> the system firmware even if it sometimes happens to live on removable
> media.
>
> > What exactly is impossible? Can you please be more specific?
>
> So let me explain what we want for OpenBSD.  We really want a uniform
> user experience across platforms, and don't want to maintain different
> codepaths for special snowflake platforms that might exist for a
> specific architecture.
>
> Installing OpenBSD on a machine should be as simple as dd'ing the
> installer to some boot media, plugging it in and powering the machine
> on.  Now this is somewhat tricky to achieve on some hardware targetted
> by U-Boot as they don't come with usable system firmware on the board
> itself.  But on those boards you can mostly get away with having
> U-Boot on uSD or eMMC and the OS installer on USB.
>
> Updating the OpenBSD kernel should be as simple as copying the kernel
> to /bsd.  Since the root filesystem uses the UFS/FFS filesystem, this
> means that whatever we use as a bootloader must be able to read from
> that filesystem.  To make sure the kernel is properly seeded with
> entropy, the OpenBSD bootloader has some additional tricks up its
> sleeve.  It will replace a special segment in the kernel with random
> data before handing control to the kernel.  On platforms that support
> it, it will try to use a firmware-provided RNG to do this (and EFI
> supports this) but also mix in some random data from a file on the
> UFS/FFS filesystem.  It will actually mark that file as "used" after
> reading it to throw a warning when the file is reused when the machine
> is rebooted (it should have been filled with fresh new entropy).  So
> you really need to use the OpenBSD bootloader instead loading an
> OpenBSD kernel directly from system firmware.
>
> Updating the OpenBSD bootloader should be as simple as running
> installboot(8) from within the OS.
>
> This all works on pretty much any architecture that OpenBSD supports.
> And right now, thanks to EFI_LOADER support in U-Boot, we have a
> nearly uniform boot flow on amd64, arm64, armv7 and riscv64.

OK I see. Really it sounds like you have a pre-kernel loader. The
functionality (some fresh random data) could just as easily be
provided by U-Boot directly, with vastly less code and complexity. But
I do understand that trying to design across a whole system is a pain,
and it is attractive to try to use what hooks exist already to do what
you want.

How do you do verified boot?

>
> > FIT is just a container. It seems to have been rejected by the EFI
> > crew at some point. Perhaps I just need to try to use it with one of
> > the distros out there, to actually understand what is going on here.
> > But any help is appreciated.
>
> It just doesn't make sense for us to use a container just because the
> system firmware (U-Boot) insists on it.  The kernel lives in the root
> UFS/FFS filesystem and the bootloader lives on an MS-DOS filesystem on
> the root disk.

It isn't so much that U-Boot insists on it. It is quite happy to load
a kernel and initrd separately. But it does make verification harder
and I assume it makes upgrades harder since there are multiple files
to install. FIT is just such a nice format for packaging kernels and
related things. It sounds like you could use FIT and everything you
said above would still be true.

[..]

Regards,
Simon

Reply via email to