On Tue, 17 Mar 2020 at 07:42, AKASHI Takahiro <takahiro.aka...@linaro.org> wrote:
> A capsule tagged with the guid, EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID, > is handled as a firmware update object. > What efi_update_capsule() basically does is to load any firmware management > protocol (or fmp) drivers contained in a capsule, find out an appropriate > fmp driver and then invoke its set_image() interface against each binary > in a capsule. > In this commit, however, installing drivers is not supported yet. > > The result of applying a capsule is set to be stored in "CapsuleXXXX" > variable, but its implementation is deferred to a fmp driver. > > Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> > --- > include/efi_api.h | 127 +++++++++++++++++++++++++++ > lib/efi_loader/Kconfig | 12 +++ > lib/efi_loader/efi_capsule.c | 165 +++++++++++++++++++++++++++++++++++ > lib/efi_loader/efi_setup.c | 4 + > 4 files changed, 308 insertions(+) > <snip> > diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c > index f3e2a555a6b9..f3526beed681 100644 > --- a/lib/efi_loader/efi_capsule.c > +++ b/lib/efi_loader/efi_capsule.c > @@ -14,10 +14,164 @@ > #include <sort.h> > <snip> > /* > * Launch a capsule > */ > @@ -54,6 +208,17 @@ efi_status_t EFIAPI efi_update_capsule( > ret = EFI_SUCCESS; > for (i = 0, capsule = *capsule_header_array; i < capsule_count; > i++, capsule = *(++capsule_header_array)) { > + EFI_PRINT("EFI Capsule (guid:%pUl)\n", > &capsule->capsule_guid); > + if (!guidcmp(&capsule->capsule_guid, > + &efi_guid_firmware_management_capsule_id)) > + ret = efi_capsule_update_firmware( > + (struct > efi_firmware_management_capsule_header *) > + ((void *)capsule + > sizeof(*capsule))); > Instead of sizeof(*capsule), please use header_size member of efi_capsule_header. The spec mentions that the size of the capsule header might be larger than the capsule header structure. Moreover, when testing with a capsule built from the edk2 capsule generation script, i do see that the header_size is greater than sizeof(efi_capsule_header). -sughosh