[coreboot-gerrit] New patch to review for coreboot: cbfstool: Allows mixed-state fmap regions to work

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Thu Nov 12 00:10:00 CET 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12416

-gerrit

commit a75172c094552e3f7fcaa4aabc463372743d28ea
Author: Patrick Georgi <pgeorgi at google.com>
Date:   Wed Nov 11 15:35:24 2015 +0100

    cbfstool: Allows mixed-state fmap regions to work
    
    When using FMAP regions (with option -r) that were generated with a
    master header (as done by cbfstool copy, eg. in Chrome OS' build
    system), there were differences in interpretation of the master header's
    fields.
    
    Normalize for that by not sanity-checking the master header's size field
    (there are enough other tests) and by dealing with region offsets
    properly.
    
    BUG=chromium:445938
    BRANCH=tot
    TEST=`cbfstool /build/veyron_minnie/firmware/image.dev.bin print -r
    FW_MAIN_A` shows that region's directory (instead of claiming that
    there's no CBFS at all, or showing an empty directory).
    
    Change-Id: Ia840c823739d4ca144a7f861573d6d1b4113d799
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: 0e5364d291f45e4705e83c0331e128e35ab226d3
    Original-Change-Id: Ie28edbf55ec56b7c78160000290ef3c57fda0f0e
    Original-Signed-off-by: Patrick Georgi <pgeorgi at google.com>
    Original-Reviewed-on: https://chromium-review.googlesource.com/312210
    Original-Commit-Ready: Patrick Georgi <pgeorgi at chromium.org>
    Original-Tested-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Reviewed-by: Aaron Durbin <adurbin at chromium.org>
---
 util/cbfstool/cbfs_image.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index f5ef680..2b25011 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -1168,12 +1168,11 @@ int cbfs_walk(struct cbfs_image *image, cbfs_entry_callback callback,
 	return count;
 }
 
-static int cbfs_header_valid(struct cbfs_header *header, size_t size)
+static int cbfs_header_valid(struct cbfs_header *header)
 {
 	if ((ntohl(header->magic) == CBFS_HEADER_MAGIC) &&
 	    ((ntohl(header->version) == CBFS_HEADER_VERSION1) ||
 	     (ntohl(header->version) == CBFS_HEADER_VERSION2)) &&
-	    (ntohl(header->romsize) <= size) &&
 	    (ntohl(header->offset) < ntohl(header->romsize)))
 		return 1;
 	return 0;
@@ -1190,7 +1189,7 @@ struct cbfs_header *cbfs_find_header(char *data, size_t size,
 	if (forced_offset < (size - sizeof(struct cbfs_header))) {
 		/* Check if the forced header is valid. */
 		header = (struct cbfs_header *)(data + forced_offset);
-		if (cbfs_header_valid(header, size))
+		if (cbfs_header_valid(header))
 			return header;
 		return NULL;
 	}
@@ -1202,7 +1201,7 @@ struct cbfs_header *cbfs_find_header(char *data, size_t size,
 	      (size_t)rel_offset, (size_t)-rel_offset, offset);
 
 	if (offset >= size - sizeof(*header) ||
-	    !cbfs_header_valid((struct cbfs_header *)(data + offset), size)) {
+	    !cbfs_header_valid((struct cbfs_header *)(data + offset))) {
 		// Some use cases append non-CBFS data to the end of the ROM.
 		DEBUG("relative offset seems wrong, scanning whole image...\n");
 		offset = 0;
@@ -1210,7 +1209,7 @@ struct cbfs_header *cbfs_find_header(char *data, size_t size,
 
 	for (; offset + sizeof(*header) < size; offset++) {
 		header = (struct cbfs_header *)(data + offset);
-		if (!cbfs_header_valid(header, size))
+		if (!cbfs_header_valid(header))
 			continue;
 		if (!found++)
 			result = header;
@@ -1228,9 +1227,15 @@ struct cbfs_header *cbfs_find_header(char *data, size_t size,
 struct cbfs_file *cbfs_find_first_entry(struct cbfs_image *image)
 {
 	assert(image);
-	return image->has_header ? (struct cbfs_file *)(image->buffer.data +
-						   image->header.offset) :
-				   (struct cbfs_file *)image->buffer.data;
+	if (image->has_header)
+		/* header.offset is relative to start of flash, not
+		 * start of region, so use it with the full image.
+		 */
+		return (struct cbfs_file *)
+			(buffer_get_original_backing(&image->buffer) +
+			image->header.offset);
+	else
+		return (struct cbfs_file *)buffer_get(&image->buffer);
 }
 
 struct cbfs_file *cbfs_find_next_entry(struct cbfs_image *image,



More information about the coreboot-gerrit mailing list