summaryrefslogtreecommitdiff
path: root/util/cbfstool/cbfs-mkpayload.c
diff options
context:
space:
mode:
authorDun Tan <dun.tan@intel.com>2021-09-01 10:29:41 +0800
committerPatrick Georgi <pgeorgi@google.com>2021-09-02 06:07:08 +0000
commit4a359401370d179b6b37dd6a6ff0c87ca8e1d241 (patch)
tree8049dd86a51f807de38965174f63994e34b0855a /util/cbfstool/cbfs-mkpayload.c
parent6f3fd6358f605c181f958ded9ef92803cec172fd (diff)
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>
Diffstat (limited to 'util/cbfstool/cbfs-mkpayload.c')
-rw-r--r--util/cbfstool/cbfs-mkpayload.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index ae875f3634..5341337a85 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -283,6 +283,7 @@ int parse_fv_to_payload(const struct buffer *input, struct buffer *output,
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 @@ int parse_fv_to_payload(const struct buffer *input, struct buffer *output,
}
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);