summaryrefslogtreecommitdiff
path: root/util/cbfstool/cbfs-mkpayload.c
diff options
context:
space:
mode:
authorPatrick Georgi <patrick@georgi-clan.de>2013-02-09 13:26:19 +0100
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-02-09 20:58:22 +0100
commit4610247ef1744ccabbcc6bfc441a3583aa49f7b5 (patch)
treed63cf75e5a6b67d1ea53d18428967d6726931b56 /util/cbfstool/cbfs-mkpayload.c
parent408aefd17645a95a0b1cac23b0ca7ad9c9df6925 (diff)
cbfstool: Handle alignment in UEFI payloads
Tiano for X64 is much cleaner to start up when using higher alignments in firmware volumes. These are implemented using padding files and sections that cbfstool knew nothing about. Skip these. Change-Id: Ibc433070ae6f822d00af2f187018ed8b358e2018 Signed-off-by: Patrick Georgi <patrick@georgi-clan.de> Reviewed-on: http://review.coreboot.org/2334 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'util/cbfstool/cbfs-mkpayload.c')
-rw-r--r--util/cbfstool/cbfs-mkpayload.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index e207b3e40f..6115e492c3 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -279,6 +279,11 @@ int parse_fv_to_payload(const struct buffer *input,
}
fh = (ffs_file_header_t *)(input->data + fv->header_length);
+ while (fh->file_type == FILETYPE_PAD) {
+ unsigned long offset = (fh->size[2] << 16) | (fh->size[1] << 8) | fh->size[0];
+ ERROR("skipping %d bytes of FV padding\n", offset);
+ fh = (ffs_file_header_t *)(((void*)fh) + offset);
+ }
if (fh->file_type != FILETYPE_SEC) {
ERROR("Not a usable UEFI firmware volume.\n");
INFO("First file in first FV not a SEC core.\n");
@@ -286,6 +291,11 @@ int parse_fv_to_payload(const struct buffer *input,
}
cs = (common_section_header_t *)&fh[1];
+ while (cs->section_type == SECTION_RAW) {
+ unsigned long offset = (cs->size[2] << 16) | (cs->size[1] << 8) | cs->size[0];
+ ERROR("skipping %d bytes of section padding\n", offset);
+ cs = (common_section_header_t *)(((void*)cs) + offset);
+ }
if (cs->section_type != SECTION_PE32) {
ERROR("Not a usable UEFI firmware volume.\n");
INFO("Section type not PE32.\n");