Message ID | 20240426141321.232236-13-heinrich.schuchardt@canonical.com |
---|---|
State | RFC |
Delegated to: | Heinrich Schuchardt |
Headers | show |
Series | efi_loader: improve device-tree loading | expand |
Hi Heinrich On Fri, 26 Apr 2024 at 17:14, Heinrich Schuchardt <heinrich.schuchardt@canonical.com> wrote: > > Up to now efi_dp_from_lo() only could return the initrd or fdt device-path. > Allow returning the binary device-path to. Why do we need this? Thanks /Ilias > > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > --- > lib/efi_loader/efi_device_path.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c > index 75fe95c9c1e..c8893f5626b 100644 > --- a/lib/efi_loader/efi_device_path.c > +++ b/lib/efi_loader/efi_device_path.c > @@ -1140,17 +1140,18 @@ ssize_t efi_dp_check_length(const struct efi_device_path *dp, > } > > /** > - * efi_dp_from_lo() - Get the instance of a VenMedia node in a > - * multi-instance device path that matches > - * a specific GUID. This kind of device paths > - * is found in Boot#### options describing an > - * initrd location > + * efi_dp_from_lo() - get device-path from load option > * > - * @lo: EFI_LOAD_OPTION containing a valid device path > - * @guid: guid to search for > + * The load options in U-Boot may contain multiple concatenated device-paths. > + * The first device-path indicates the EFI binary to execute. Subsequent > + * device-paths start with a VenMedia node where the GUID identifies the > + * function (initrd or fdt). > + * > + * @lo: EFI load option containing a valid device path > + * @guid: GUID identifying device-path or NULL for the EFI binary > * > * Return: > - * device path including the VenMedia node or NULL. > + * device path excluding the matched VenMedia node or NULL. > * Caller must free the returned value. > */ > struct > @@ -1161,6 +1162,9 @@ efi_device_path *efi_dp_from_lo(struct efi_load_option *lo, > struct efi_device_path_vendor *vendor; > int lo_len = lo->file_path_length; > > + if (!guid) > + return efi_dp_dup(fp); > + > for (; lo_len >= sizeof(struct efi_device_path); > lo_len -= fp->length, fp = (void *)fp + fp->length) { > if (lo_len < 0 || efi_dp_check_length(fp, lo_len) < 0) > -- > 2.43.0 >
On 4/28/24 15:28, Ilias Apalodimas wrote: > Hi Heinrich > > On Fri, 26 Apr 2024 at 17:14, Heinrich Schuchardt > <heinrich.schuchardt@canonical.com> wrote: >> >> Up to now efi_dp_from_lo() only could return the initrd or fdt device-path. >> Allow returning the binary device-path to. > > Why do we need this? In patch 14/14 I add this line: + dp = efi_get_dp_from_boot(NULL); The binary path indicates the partition on which to search for the default dtb as indicated by $fdtfile. I should have added an explanation in the commit message. Best regards Heinrich > > Thanks > /Ilias >> >> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> >> --- >> lib/efi_loader/efi_device_path.c | 20 ++++++++++++-------- >> 1 file changed, 12 insertions(+), 8 deletions(-) >> >> diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c >> index 75fe95c9c1e..c8893f5626b 100644 >> --- a/lib/efi_loader/efi_device_path.c >> +++ b/lib/efi_loader/efi_device_path.c >> @@ -1140,17 +1140,18 @@ ssize_t efi_dp_check_length(const struct efi_device_path *dp, >> } >> >> /** >> - * efi_dp_from_lo() - Get the instance of a VenMedia node in a >> - * multi-instance device path that matches >> - * a specific GUID. This kind of device paths >> - * is found in Boot#### options describing an >> - * initrd location >> + * efi_dp_from_lo() - get device-path from load option >> * >> - * @lo: EFI_LOAD_OPTION containing a valid device path >> - * @guid: guid to search for >> + * The load options in U-Boot may contain multiple concatenated device-paths. >> + * The first device-path indicates the EFI binary to execute. Subsequent >> + * device-paths start with a VenMedia node where the GUID identifies the >> + * function (initrd or fdt). >> + * >> + * @lo: EFI load option containing a valid device path >> + * @guid: GUID identifying device-path or NULL for the EFI binary >> * >> * Return: >> - * device path including the VenMedia node or NULL. >> + * device path excluding the matched VenMedia node or NULL. >> * Caller must free the returned value. >> */ >> struct >> @@ -1161,6 +1162,9 @@ efi_device_path *efi_dp_from_lo(struct efi_load_option *lo, >> struct efi_device_path_vendor *vendor; >> int lo_len = lo->file_path_length; >> >> + if (!guid) >> + return efi_dp_dup(fp); >> + >> for (; lo_len >= sizeof(struct efi_device_path); >> lo_len -= fp->length, fp = (void *)fp + fp->length) { >> if (lo_len < 0 || efi_dp_check_length(fp, lo_len) < 0) >> -- >> 2.43.0 >>
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c index 75fe95c9c1e..c8893f5626b 100644 --- a/lib/efi_loader/efi_device_path.c +++ b/lib/efi_loader/efi_device_path.c @@ -1140,17 +1140,18 @@ ssize_t efi_dp_check_length(const struct efi_device_path *dp, } /** - * efi_dp_from_lo() - Get the instance of a VenMedia node in a - * multi-instance device path that matches - * a specific GUID. This kind of device paths - * is found in Boot#### options describing an - * initrd location + * efi_dp_from_lo() - get device-path from load option * - * @lo: EFI_LOAD_OPTION containing a valid device path - * @guid: guid to search for + * The load options in U-Boot may contain multiple concatenated device-paths. + * The first device-path indicates the EFI binary to execute. Subsequent + * device-paths start with a VenMedia node where the GUID identifies the + * function (initrd or fdt). + * + * @lo: EFI load option containing a valid device path + * @guid: GUID identifying device-path or NULL for the EFI binary * * Return: - * device path including the VenMedia node or NULL. + * device path excluding the matched VenMedia node or NULL. * Caller must free the returned value. */ struct @@ -1161,6 +1162,9 @@ efi_device_path *efi_dp_from_lo(struct efi_load_option *lo, struct efi_device_path_vendor *vendor; int lo_len = lo->file_path_length; + if (!guid) + return efi_dp_dup(fp); + for (; lo_len >= sizeof(struct efi_device_path); lo_len -= fp->length, fp = (void *)fp + fp->length) { if (lo_len < 0 || efi_dp_check_length(fp, lo_len) < 0)
Up to now efi_dp_from_lo() only could return the initrd or fdt device-path. Allow returning the binary device-path to. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> --- lib/efi_loader/efi_device_path.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)