Re: U-Boot interferes with initrd binary — Revert "efi: Correct smbios-table installation" ?

Michael Brown mcb30 at ipxe.org
Tue Apr 1 12:22:04 CEST 2025


On 31/03/2025 18:31, Christian Kohlschütter wrote:
> Whoa! Good eyes, Michael!
> 
> What is my Fritzbox doing to my initrd, and why does reverting the commit fix it?
> 
> FWIW, I also have a capture with an ethernet frame from another device on my network (ARP, ethertype 0x0806), so this is probably the content of some ethernet receive buffer...

I've taken a quick look through the U-Boot codebase, and I can't 
immediately see where the Ethernet device gets disabled as a result of 
calling ExitBootServices().  It's possibly worth noting that U-Boot may 
have relied upon iPXE's behavior prior to commit 
https://github.com/ipxe/ipxe/commit/562c74e1e:

   [efi] Run ExitBootServices shutdown hook at TPL_NOTIFY

   ... <snip lengthy explanation as to why we need to do this> ...

   Avoid calling into an underlying SNP protocol instance from within our
   shutdown hook at TPL_NOTIFY, since the underlying SNP driver may
   attempt to raise the TPL to TPL_CALLBACK (which would cause a fatal
   error).  Failing to shut down the underlying SNP device is safe to do
   since the underlying device must, in any case, have installed its own
   ExitBootServices hook if any shutdown actions are required.

So, older versions of iPXE would have called Snp->Stop(), which in 
U-Boot's efi_net_stop() will call eth_halt().  Current versions of iPXE 
will not call Snp->Stop(), and will rely on the underlying SNP driver to 
have dealt with its own ExitBootServices() requirements.

I can't find any evidence of U-Boot installing an 
EVT_SIGNAL_EXIT_BOOT_SERVICES event to call eth_halt() when 
ExitBootServices() is called.

The closest I can find is a block of code in U-Boot's 
efi_exit_boot_services():

   bootm_disable_interrupts();
   if (IS_ENABLED(CONFIG_USB_DEVICE))
      udc_disconnect();
   board_quiesce_devices();
   dm_remove_devices_active();

but I don't know precisely what these various functions are supposed to 
do, and I can't find any path that leads from any of these to eth_halt().

Is it possible that U-Boot is failing to call eth_halt() in response to 
ExitBootServices(), and is therefore leaving the network device active 
and performing DMA while the kernel starts up?

Michael



More information about the U-Boot mailing list