[PATCH v2 2/8] cmd: eficonfig: add support for setting fdt

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Tue May 28 18:07:58 CEST 2024


On 28.05.24 17:16, Ilias Apalodimas wrote:
> Hi Heinrich,
> 
> [...]
> 
>>
>> -       const struct efi_initrd_dp id_dp = {
>> +       const struct efi_initrd_dp initrd_prefix = {
>>                  .vendor = {
>>                          {
>>                          DEVICE_PATH_TYPE_MEDIA_DEVICE,
>>                          DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
>> -                       sizeof(id_dp.vendor),
>> +                       sizeof(initrd_prefix.vendor),
>>                          },
>>                          EFI_INITRD_MEDIA_GUID,
>>                  },
>>                  .end = {
>>                          DEVICE_PATH_TYPE_END,
>>                          DEVICE_PATH_SUB_TYPE_END,
>> -                       sizeof(id_dp.end),
>> +                       sizeof(initrd_prefix.end),
>> +               }
>> +       };
>> +
>> +       const struct efi_initrd_dp fdt_prefix = {
> 
> We need to rename efi_initrd_dp to something more generic in the future
> 
>> +               .vendor = {
>> +                       {
>> +                       DEVICE_PATH_TYPE_MEDIA_DEVICE,
>> +                       DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
>> +                       sizeof(fdt_prefix.vendor),
>> +                       },
>> +                       EFI_FDT_GUID,
>> +               },
>> +               .end = {
>> +                       DEVICE_PATH_TYPE_END,
>> +                       DEVICE_PATH_SUB_TYPE_END,
>> +                       sizeof(initrd_prefix.end),
>>                  }
>>          };
>>
> 
> [...]
> 
>> +/**
>> + * efi_load_option_dp_join() - join device-paths for load option
>> + *
>> + * @dp:                in: binary device-path, out: joined device-path
>> + * @dp_size:   size of joined device-path
>> + * @initrd_dp: initrd device-path or NULL
>> + * @fdt_dp:    device-tree device-path or NULL
>> + * Return:     status_code
>> + */
>> +efi_status_t efi_load_option_dp_join(struct efi_device_path **dp,
>> +                                    size_t *dp_size,
>> +                                    struct efi_device_path *initrd_dp,
>> +                                    struct efi_device_path *fdt_dp)
>> +{
>> +       if (!dp)
> 
> Should we add && !*dp here?

efi_dp_concat() handles the case of one or both device-paths being NULL.

> 
>> +               return EFI_INVALID_PARAMETER;
>> +
>> +       *dp_size = efi_dp_size(*dp);
>> +
>> +       if (initrd_dp) {
>> +               struct efi_device_path *tmp_dp = *dp;
>> +
>> +               *dp = efi_dp_concat(tmp_dp, initrd_dp, *dp_size);
>> +               efi_free_pool(tmp_dp);
>> +               if (!*dp)
>> +                       return EFI_OUT_OF_RESOURCES;
>> +               *dp_size += efi_dp_size(initrd_dp) + sizeof(END);
>> +       }
>> +
>> +       if (fdt_dp) {
>> +               struct efi_device_path *tmp_dp = *dp;
>> +
>> +               *dp = efi_dp_concat(tmp_dp, fdt_dp, *dp_size);
>> +               efi_free_pool(tmp_dp);
>> +               if (!dp)
>> +                       return EFI_OUT_OF_RESOURCES;
>> +               *dp_size += efi_dp_size(fdt_dp) + sizeof(END);
>> +       }
>> +
>> +       *dp_size += sizeof(END);
> 
> Why do we have to account for the end node twice if either fdt_dp or
> initrd_dp are found?

This is the length of the END node of the binary.

Best regards

Heinrich

> 
> Thanks
> /Ilias
>> +
>> +       return EFI_SUCCESS;
>> +}
>> +
>>   const struct guid_to_hash_map {
>>          efi_guid_t guid;
>>          const char algo[32];
>> --
>> 2.43.0
>>



More information about the U-Boot mailing list