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>
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index e207b3e..6115e49 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -279,6 +279,11 @@
 	}
 
 	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 @@
 	}
 
 	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");