[Barrelfish-users] [Barrelfish] Hagfish kernel image structure and latest version

sebastian.scherbel at fau.de sebastian.scherbel at fau.de
Fri Apr 16 20:20:43 CEST 2021


 Hi, 

the problem is in update_memory_map_and_exit_boot_services(). The UEFI specification advises "If MapKey value is incorrect, ExitBootServices() returns EFI_INVALID_PARAMETER and GetMemoryMap() with ExitBootServices() must be called again."
Attached is a patch in case anyone wants to use Hagfish on a similar system like the HPE Apollo 70 with American Megatrends Aptio V UEFI in the future.

Regards Sebastian
[0] https://uefi.org/sites/default/files/resources/UEFI_Spec_2_9_2021_03_18.pdf (page 300)
[1] https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=202455 

    Am Donnerstag, 15. April 2021, 19:28:15 MESZ hat David Cock <david.cock at inf.ethz.ch> Folgendes geschrieben:  
 
   
I don't see anything that should cause a problem if you increase the value.  Did you do a clean build after changing it?  I don't quite trust the UEFI build system.  What size did you set it to?
 
David
 
 On 15/4/21 7:20 pm, David Cock wrote:
  
 
That's a bit odd.  It ought to be as simple as increasing the size of the table - I don't think there's anything fundamental about it.  I'm pretty sure I just wanted to avoid dynamic allocation at that point in the code. Let me have a look at it.
 
David
 
 On 15/4/21 6:08 pm, sebastian.scherbel at fau.de wrote:
  
  Hi, 
  
  >The memory map is 17952B, but MEM_MAP_SIZE is 8192. > This is compile-time limit in Hagfish - please report this overflow, it's a bug. 
   I have stumbled across a limitation in Hagfish. 8192B is not enough on a HPE Apollo 70 with 256 cores and 256 GB RAM and 374 entries of 48B each. I tried to just increase the value, but now I crash somewhere between exiting the UEFI boot services and jumping to my ELFs entrypoint. Without any output.
  
   Do you happen to have an educated guess what the problem could possibly be? I don't have a hardware debugger, unfortunately, which makes it somewhat challenging. And limits me to printk debugging.
  
     >We'd be happy to integrate a patch if you wanted to modify it.  I'll do that after i have finished my project.
  
  Regards Sebastian
   
  
      Am Freitag, 12. März 2021, 12:08:39 MEZ hat David Cock <david.cock at inf.ethz.ch> Folgendes geschrieben:  
  
     
Sebastian
 
It looks like what's going on is as Daniel described.  Hagfish seems to use an API call (get_file_size) that's supported by EDK2, but not by many commercial offerings.  I think it'd almost certainly be possible to update Hagfish such that it doesn't depend on it - something like preallocating a "reasonably-sized" buffer, and if it turns out it wasn't big enough trying again with a larger one.  It's been a few years since I wrote this stuff, but I think you'll get back an EFI_BUFFER_TOO_SMALL if it was too small, and *BufferSize will be filled with the actual size so that you can reallocate the buffer.  We'd be happy to integrate a patch if you wanted to modify it.
 
David
 
  On 11/3/21 2:19 pm, Schwyn Daniel wrote:
  
 
    #yiv9539956646 filtered {}#yiv9539956646 filtered {}#yiv9539956646 filtered {}#yiv9539956646 filtered {}#yiv9539956646 p.yiv9539956646MsoNormal, #yiv9539956646 li.yiv9539956646MsoNormal, #yiv9539956646 div.yiv9539956646MsoNormal {margin:0cm;font-size:11.0pt;font-family:sans-serif;}#yiv9539956646 a:link, #yiv9539956646 span.yiv9539956646MsoHyperlink {color:blue;text-decoration:underline;}#yiv9539956646 p.yiv9539956646msonormal, #yiv9539956646 li.yiv9539956646msonormal, #yiv9539956646 div.yiv9539956646msonormal {margin-right:0cm;margin-left:0cm;font-size:11.0pt;font-family:sans-serif;}#yiv9539956646 p.yiv9539956646msonormal1, #yiv9539956646 li.yiv9539956646msonormal1, #yiv9539956646 div.yiv9539956646msonormal1 {margin:0cm;font-size:11.0pt;font-family:sans-serif;}#yiv9539956646 span.yiv9539956646E-MailFormatvorlage33 {font-family:sans-serif;color:windowtext;}#yiv9539956646 .yiv9539956646MsoChpDefault {font-size:10.0pt;}#yiv9539956646 div.yiv9539956646WordSection1 {}   
Hi Sebastian,
 
  
 
David and I are both part of the Barrelfish core team at ETH so our setup is the same😉 We do load Hagfish over PXE but as far as I know always directly with the PXE implementation in EDK2. Hagfish is theoretically designed to be flexible and cover as many EFI based boot environments as possible. In practice it’s only tested on the machines we have. Those are EDK2 based and the PXE implementation in there supports the two MTFTP opcodes we use. It should be possible to either implement support in iPXE or make Hagfish not use the get_file_size e.g. by allocating a large enough buffer and make sure the read_file doesn’t overflow it.
 
  
 
Regards,
 
Daniel
 
  
   
Von: sebastian.scherbel at fau.de <sebastian.scherbel at fau.de> 
 Gesendet: Mittwoch, 10. März 2021 16:38
 An: Schwyn Daniel <daniel.schwyn at inf.ethz.ch>
 Cc: barrelfish-users at lists.inf.ethz.ch
 Betreff: Re: AW: [Barrelfish-users] [Barrelfish] Hagfish kernel image structure and latest version
   
  
      
Hi Daniel,
  
  
   
thank you for your reply. That's what I already suspected.
   
  
   
I'm waiting to hear back from David about his setup. He seemed quite sure that chainloading works, so I was a bit surprised that neither iPXE nor Grub did work for me on EDK2. 
   
  
   
Otherwise, I'll fix iPXE myself. 
   
  
   
Regards Sebastian
    
  
     
Am Mittwoch, 10. März 2021, 10:59:48 MEZ hat Schwyn Daniel <daniel.schwyn at inf.ethz.ch> Folgendes geschrieben: 
   
  
   
  
             
Hi Sebastian,
 
 
 
I have seen this error before with iPXE when I tried chainloading Hagfish with iPXE on top of U-Boot with EFI support. U-Boot’s EFI support is rather minimalistic so I’m not sure the cause was the same in my case. Looking at the iPXE source code though it looks to me as if it only supports the EFI_PXE_BASE_CODE_MTFTP_READ_FILE opcode while Hagfish also needs theEFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE operation to allocate appropriately sized buffers for the files it wants to load.
 
 
 
Regards,
 
Daniel
 
 
    
Von: Barrelfish-users <barrelfish-users-bounces at lists.inf.ethz.ch> Im Auftrag von sebastian.scherbel at fau.de
 Gesendet: Dienstag, 2. März 2021 22:56
 An: Cock David <david.cock at inf.ethz.ch>
 Cc: barrelfish-users at lists.inf.ethz.ch
 Betreff: Re: [Barrelfish-users] [Barrelfish] Hagfish kernel image structure and latest version
   
 
     
Hello,
   
 
   
>Hagfish definitely supports chainloading over PXE - that's exactly what it was designed for.
   
Which bootloaders have you tested? What does your setup look like?
   
 
   
I have tried:
   
 
   
EDK2 -> iPXE -> Hagfish
   
 
   
iPXE> chain tftp://x.x.x.x/Hagfish_ETHZ.efi
   
...
 Hagfish UEFI loader starting
 UEFI vendor: EDK II
 Hagfish loaded at 402D9000, size 147456B, by handle 41839B98
 Could not connect to shell or not enough parameters, assuming PXE boot.
 Connecting to the PXE service that loaded me.
 PXE loader at 403ED660, revision 10000, running
 Loading "hagfish.cfg.10.0.0.10"
 Mtftp: Unsupported, 
 file size: Unsupported
   
 
   
 
   
EDK2 -> Grub2 -> Hagfish
   
 
   
grub> boot
 Status: 0x0000000E
 Failed to initialize ShellLib, aborting.
 Hagfish UEFI loader starting
 UEFI vendor: EDK II
 Hagfish loaded at 402DA000, size 147456B, by handle 41862A18
 Could not connect to shell or not enough parameters, assuming PXE boot.
 Connecting to the PXE service that loaded me.
 OpenProtocol: Unsupported
 Failed to initialize loader: Load Error
   
 
   
> The error there seems to be the UEFI implementation not supporting TFTP - did you compile it in?
  
When I load Hagfish directly, everything works fine. On American Megatrends Aptio V and EDK2.
   
 
    
Regards Sebastian
    
Am Donnerstag, 28. Januar 2021, 16:36:02 MEZ hat David Cock <david.cock at inf.ethz.ch> Folgendes geschrieben: 
   
 
   
 
    
What you're seeing there is Hagfish trying to load its configuration file over TFTP as it's figured out that it was itself loaded over PXE.  The README might be inconsistent wrt filenames - if in doubt, trust the code.  Hagfish definitely supports chainloading over PXE - that's exactly what it was designed for.
 
The error there seems to be the UEFI implementation not supporting TFTP - did you compile it in?
 
David
   
On 28/1/21 3:53 pm, sebastian.scherbel at fau.de wrote:
          
Hello,
   
 
   
sounds good. I have tried to chainload Hagfish after iPXE. However, loading of the cfg fails on QEMU and on the real hardware with the same error.
   
 
    
Hagfish UEFI loader starting
 UEFI vendor: American Megatrends
 Hagfish loaded at F951D000, size 143360B, by handle F6EA1D18
 Could not connect to shell or not enough parameters, assuming PXE boot.
 Connecting to the PXE service that loaded me.
 PXE loader at F5EE1840, revision 10000, running
 Loading "hagfish.cfg.A.B.C.D" (shouldn't the cfg name be hafish.A.B.C.D.cfg according to the readme?)
 Mtftp: Unsupported, 
  
file size: Unsupported
   
 
    
Is this a known bug? Is chainloading unsupported? Your setup is directly booting into Hagfish?
      
 
  
Regards Sebastian 
   
 
       
Am Donnerstag, 28. Januar 2021, 14:03:36 MEZ hat David Cock <david.cock at inf.ethz.ch> Folgendes geschrieben: 
   
 
   
 
     
Sebastian,
 
Hagfish is a custom loader for the Barrelfish CPU driver, which operates under a few unusual assumptions: Mainly, the CPU driver (kernel) itself is not self-relocating, but relies on the bootloader (Hagfish) to do the relocation for it.
 
It would definitely be possible to modify Hagfish to load an arbitrary ELF, however.  You'd have to make a few changes in the relocation code to not look for Barrelfish-specific segments and so on, but there's nothing particularly weird or non-standard about it.
 
Hagfish is pretty static, and doesn't change much from version to version.  We'll update the repository shortly (which we should have done together with the release).  Feel free to ask more specific questions if you decide to use it - we're happy to help.
 
David
   
On 27/1/21 5:41 pm, sebastian.scherbel at fau.de wrote:
        
Hello,
   
 
   
I'm a CS student trying to port an research operating system from x86_64 to ARMv8 and stumbled across Hagfish.
   
 
   
Hagfish should basically be able to load any ELF with its sections into memory with minor modifications? Or is there certain requirement for the kernel image structure that I didn't notice while reading your publication [1] and skimming the source code?
   
 
   
The last commit in the public repository is from March 2017. But in the changelog of your last Barrelfish release from 2020 states "Update Hagfish to latest version". Have there been any bigger changes or improvements in the meantime?
   
 
   
Regards Sebastian
   
 
   
[0] https://lists.inf.ethz.ch/pipermail/barrelfish-users/2020-March/001597.html
   
[1] http://www.barrelfish.org/publications/TN-022-ARMv8.pdf
   
  
 
_______________________________________________
 
Barrelfish-users mailing list
 
Barrelfish-users at lists.inf.ethz.ch
 
https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
     
_______________________________________________
 Barrelfish-users mailing list
 Barrelfish-users at lists.inf.ethz.ch
 https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
     
  
 
_______________________________________________
 
Barrelfish-users mailing list
 
Barrelfish-users at lists.inf.ethz.ch
 
https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
    
_______________________________________________
 Barrelfish-users mailing list
 Barrelfish-users at lists.inf.ethz.ch
 https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
        
  _______________________________________________
Barrelfish-users mailing list
Barrelfish-users at lists.inf.ethz.ch
https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
       
  _______________________________________________
Barrelfish-users mailing list
Barrelfish-users at lists.inf.ethz.ch
https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
 
 
  _______________________________________________
Barrelfish-users mailing list
Barrelfish-users at lists.inf.ethz.ch
https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
 
   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.inf.ethz.ch/pipermail/barrelfish-users/attachments/20210416/9fe7a437/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Increased-max-size-of-memory-map-and-fixed-exiting-U.patch
Type: text/x-patch
Size: 2294 bytes
Desc: not available
URL: <http://lists.inf.ethz.ch/pipermail/barrelfish-users/attachments/20210416/9fe7a437/attachment-0001.bin>


More information about the Barrelfish-users mailing list