Hi Samer, 

Thanks for having a look at this

On Mon, Mar 01, 2021 at 08:44:00PM +0000, Samer El-Haj-Mahmoud wrote:
> 
> 
> > -----Original Message-----
> > From: Heinrich Schuchardt <xypron.g...@gmx.de>
> > Sent: Monday, March 1, 2021 2:39 PM
> > To: Ilias Apalodimas <ilias.apalodi...@linaro.org>; Grant Likely
> > <grant.lik...@arm.com>
> > Cc: Boot Architecture Mailman List <boot-architecture@lists.linaro.org>; 
> > Samer
> > El-Haj-Mahmoud <samer.el-haj-mahm...@arm.com>; Ard Biesheuvel
> > <a...@kernel.org>; Leif Lindholm <l...@nuviainc.com>
> > Subject: Re: EFI_LOAD_FILE2 for initrd standardization
> 
> 
> ...
> 
> >
> > The UEFI spec knows two types of separators for device paths. Both have type
> > 0x7F (End of Hardware Device Path) but differ by the sub-type:
> >
> > Sub-Type 0xff – End Entire Device Path
> > Sub-Type 0x01 – End Instance of a Device Path
> >
> > Field EFI_LOAD_OPTION.FilePathList[] is described in the UEFI spec as
> > follows:
> >
> > "A packed array of UEFI device paths. The first element of the array is a 
> > device
> > path that describes the device and location of the Image for this load 
> > option."
> >
> > It is not immediately clear if the separators between the array elements 
> > are of
> > sub-type 0xff or 0x01. The description in the UEFI spec should be reworked 
> > for
> > more clarity.
> >
> 
> Agree that this is not clear, and could be interpreted either way. And yes, 
> agree the UEFI spec needs a clarification
> 
> 
> > The current EDK II coding requires that the device path identifying the UEFI
> > binary (i.e. FilePathList[0] is terminated by a sub-type 0xff end node.
> >
> 
> The EDK2 code seems to be incomplete, with a "TODO" to support the 
> FilePathList[]. In fact, the code calls it "FilePath" to be clear that it is 
> assuming a single DevicePath (which means a 0xFF sub-type termination)
> https://github.com/tianocore/edk2/blob/master/MdeModulePkg%2FLibrary%2FUefiBootManagerLib%2FBmLoadOption.c#L199
> 
> Searching the code further, I see there is support for parsing multi-instance 
> device path (separated by END_INSTANCE_DEVICE_PATH_SUBTYPE, or 0x1) in things 
> like UefiDevicePathLib , parsing code, etc... But it does not seem to be 
> supported at all in the UEFI Boot Manager implemented in EDK2
> 
> 
> > The UEFI variable ConDev is decribed as "The device path of all possible 
> > console
> > input devices". The spec does not refer to it as an array of device paths.
> >
> 
> Looking at EDK2, ConXDev are treated as multi-instance devices, with 
> ConPlatformDxe using AppendDevicePathInstance() and 
> GetNextDevicePathInstance() to construct / navigate the multiple-instances
> 
> The spec should have defined these as a "multi-instance device path of all 
> possible console X devices".  See my notes below on multi-instance DP.
> 
> 
> > So it seems that the UEFI spec editors mean by array of device paths that an
> > element of the array is separated by sub-type 0xff. Each individual array 
> > element
> > may be a collection of device paths instances separated by 0x01 sub-type end
> > nodes.
> >
> 
> I am leaning towards this conclusion as well. This is further supported by 
> the following evidence:
> 

Yes that's exactly what I thought as well and that's what option (2) was
trying to describe on my first mail.

What I had in there was:
Loaded Image device path - end node - VenMedia - Initrd DP - end instance - 
(repeat) - Initrd DP - end node - other DPs

> 
> * EFI_DEVICE_PATH_UTILITIES_PROTOCOL has a function called 
> IsDevicePathMultiInstance() along with walker functions 
> AppendDevicePathInstance(), GetNextDevicePathInstance(). The description of 
> these functions make it clear that the intention is to treat 0x01 as a 
> separator between multiple instances of device paths in a multi-instance 
> device path structure, with 0xff as the final end of DP indicator. For 
> example, AppendDevicePathInstance() is defined as:
> 
> " This function creates a new device path by appending a copy of the 
> specified device path instance to a copy of the specified device path in an 
> allocated buffer. The end-of-device-path device node is moved after the end 
> of the appended device node and a new end-of-device-path-instance node is 
> inserted between."
> 
> 
> * In EFI_USER_INFO , there are user info policy types that leverage the 
> device path definitions (such as EFI_USER_INFO_ACCESS_FORBID_LOAD), and they 
> are clear on distinguishing the term "multi-instance device path" from a 
> "series of UEFI device paths":
> 
> "The record is a series of normal UEFI device paths (not multi-instance 
> device paths)."
> 
> 
> * The "multi-instance" usage also shows up in the language of 
> LocateDevicePath()
> 
> So if the spec intended for FilePathList[] to use the 0x1 separator, they 
> should have used the term "multi-instance" device path, which is not the case.
> 
> 
> 
> > In the device path spec a sentence could be added as follows:
> >
> > "A packed array of UEFI device paths. The first element of the array is a 
> > device
> > path that describes the device and location of the Image for this load 
> > option.
> > *Each array element is terminated by a sub-type 0xff, End Entire Device Path
> > node.*"
> >
> 
> Yes. Or could simply say:
> "A packed array of UEFI device paths (not multi-instance device paths). The 
> first element of the array is a device
> path that describes the device and location of the Image for this load 
> option."
> 
> Either way, we can do a "code first" ECR in the UEFI spec. I say code first 
> to ensure that it remains in public domain, and not blocked by UEFI Forum NDA 
> until the publication of the next version of the UEFI spec. If we agree, I 
> can get this process started and propose the language.
> 

That's fine by me. I have most of the u-boot code ready, I'll finish it up and
send patches.

> 
> 
> > Adding initrd or device tree device paths could be implemented as follows:
> >
> > Array element [0]:
> > device path of the binary (e.g. the Linux kernel) terminated by 0xff.
> >
> > Array element [i], i > 0:
> > device paths of the different initial RAM disks separated by 0x01 instance 
> > end
> > nodes and terminated by an 0xff entire path node.
> >
> > To identify the device paths with all its instances as initrds we can 
> > prepend a
> > VenMedia() device path node with a specific GUID to the entire path.
> >
> > Array element [j], j > 0:
> > device path of the device-tree possibly followed by instances of device 
> > paths of
> > device-tree overlays separated by 0x01 instance end nodes and terminated by 
> > an
> > 0xff entire path node.
> >
> > To identify the device paths with all its instances as device trees and 
> > device tree
> > overlays we can prepend a VenMedia() device path node with a specific GUID 
> > to
> > the entire path.
> >
> 
> One suggestion here is to take into consideration: whether we standardize 
> this proposal (for loading additional kernel files from element[i], i>0 ) or 
> not, the FW implementation must still be compliant with the UEFI rules around 
> booting from a "short form device path" (UEFI spec, section 3.1.2)

Ok that's something I'll have to change since I am inserting the entire DP,
but as Heinrich pointed out, u-boot already has support for short form device
paths so the change shouldn't be too hard.

Thanks
/Ilias
_______________________________________________
boot-architecture mailing list
boot-architecture@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/boot-architecture

Reply via email to