Patrick Georgi has submitted this change. ( https://review.coreboot.org/c/coreboot/+/57296 )
Change subject: util/cbftool: Fix the bug in parsing Uefipayload with extended header ......................................................................
util/cbftool: Fix the bug in parsing Uefipayload with extended header
The patch is to fix "Not a usable UEFI firmware volume" issue when creating CBFS/flash image. This issue is caused by adding FvNameGuid in UefiPayloadEntry.fdf in EDKII. There is an ext header between header of Fv and header of PayloadEntry in Fv with FvNameGuid. The ext header causes the UefiPayloadEntry to be found incorrectly when parsing Fv.
Commit in EDKII: 4bac086e8e007c7143e33f87bb96238326d1d6ba Bugzila: https://bugzilla.tianocore.org/show_bug.cgi?id=3585
Signed-off-by: Dun Tan dun.tan@intel.com Change-Id: Id063efb1c8e6c7a96ec2182e87b71c7e8b7b6423 Reviewed-on: https://review.coreboot.org/c/coreboot/+/57296 Reviewed-by: Ray Ni ray.ni@intel.com Reviewed-by: King Sumo kingsumos@gmail.com Reviewed-by: Patrick Rudolph siro@das-labor.org Reviewed-by: Patrick Rudolph patrick.rudolph@9elements.com Tested-by: build bot (Jenkins) no-reply@coreboot.org --- M util/cbfstool/cbfs-mkpayload.c M util/cbfstool/fv.h 2 files changed, 12 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Patrick Rudolph: Looks good to me, approved Patrick Rudolph: Looks good to me, but someone else must approve King Sumo: Looks good to me, but someone else must approve Ray Ni: Looks good to me, but someone else must approve
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c index ae875f3..5341337 100644 --- a/util/cbfstool/cbfs-mkpayload.c +++ b/util/cbfstool/cbfs-mkpayload.c @@ -283,6 +283,7 @@ struct cbfs_payload_segment segs[2] = { {0} }; int doffset, len = 0; firmware_volume_header_t *fv; + firmware_volume_ext_header_t *fvh_ext; ffs_file_header_t *fh; common_section_header_t *cs; dos_header_t *dh; @@ -305,6 +306,12 @@ }
fh = (ffs_file_header_t *)(input->data + fv->header_length); + if (fv->ext_header_offs != 0) { + fvh_ext = (firmware_volume_ext_header_t *)((uintptr_t)fv + fv->ext_header_offs); + fh = (ffs_file_header_t *)((uintptr_t)fvh_ext + fvh_ext->ext_header_size); + fh = (ffs_file_header_t *)(((uintptr_t)fh + 7) & ~7); + } + while (fh->file_type == FILETYPE_PAD) { unsigned long offset = (fh->size[2] << 16) | (fh->size[1] << 8) | fh->size[0]; DEBUG("skipping %lu bytes of FV padding\n", offset); diff --git a/util/cbfstool/fv.h b/util/cbfstool/fv.h index 21bd89f..0ad650f 100644 --- a/util/cbfstool/fv.h +++ b/util/cbfstool/fv.h @@ -32,3 +32,8 @@ uint8_t size[3]; uint8_t section_type; } common_section_header_t; + +typedef struct { + uint8_t guid[16]; + uint32_t ext_header_size; +} firmware_volume_ext_header_t;