[coreboot-gerrit] New patch to review for coreboot: cbfstool: add new add-master-header command

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Fri Sep 11 16:42:24 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/11628

-gerrit

commit 677a6c9571fc1921aa9ea892e501bd01947715a5
Author: Patrick Georgi <pgeorgi at chromium.org>
Date:   Thu Sep 10 15:28:27 2015 +0200

    cbfstool: add new add-master-header command
    
    The command adds a new cbfs file, fills in the CBFS meta data in cbfs
    master header format, then points the master header pointer (which
    resides at the last 4 bytes of the CBFS region) to the data area of the
    new file.
    
    This can leak some space in CBFS if an old-style CBFS with native master
    header gets the treatment, because a new header is created at pointed
    at. flashmap based images have no such header, and the attempt to create
    a second file with the (hardcoded) name will fail.
    
    Change-Id: I5bc7fbcb5962b35a95261f30f0c93008e760680d
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
---
 util/cbfstool/cbfstool.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 65 insertions(+), 1 deletion(-)

diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index d6c116a..47cf876 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -168,6 +168,66 @@ done:
 	return ret;
 }
 
+static int cbfs_add_master_header(void)
+{
+	const char * const name = "cbfs master header";
+	struct cbfs_image image;
+	struct cbfs_file *header = NULL;
+	struct buffer buffer;
+	int ret = 1;
+
+	if (cbfs_image_from_buffer(&image, param.image_region,
+		param.headeroffset)) {
+		ERROR("Selected image region is not a CBFS.\n");
+		return 1;
+	}
+
+	if (cbfs_get_entry(&image, name)) {
+		ERROR("'%s' already in ROM image.\n", name);
+		return 1;
+	}
+
+	if (buffer_create(&buffer, sizeof(struct cbfs_header), name) != 0)
+		return 1;
+
+	struct cbfs_header *h = (struct cbfs_header *)buffer.data;
+	h->magic = htonl(CBFS_HEADER_MAGIC);
+	h->version = htonl(CBFS_HEADER_VERSION);
+	h->romsize = htonl(param.image_region->size);
+	h->bootblocksize = htonl(4);
+	h->align = htonl(64);
+	h->offset = htonl(param.image_region->offset);
+	h->architecture = htonl(CBFS_ARCHITECTURE_UNKNOWN);
+
+	header = cbfs_create_file_header(CBFS_COMPONENT_CBFSHEADER,
+		buffer.size, name);
+	if (cbfs_add_entry(&image, &buffer, 0, header) != 0) {
+		ERROR("Failed to add cbfs master header into ROM image.\n");
+		goto done;
+	}
+
+	struct cbfs_file *entry;
+	if ((entry = cbfs_get_entry(&image, name)) == NULL) {
+		ERROR("'%s' not in ROM image?!?\n", name);
+		goto done;
+	}
+
+	uint32_t header_offset = CBFS_SUBHEADER(entry) -
+		(void *)image.buffer.data;
+	header_offset = 0xffffffff - image.buffer.size + 1 + header_offset;
+
+	// TODO: when we have a BE target, we'll need to store this as BE
+	*(uint32_t *)(image.buffer.data + image.buffer.size - 4) =
+		swab32(htonl(header_offset));
+
+	ret = 0;
+
+done:
+	free(header);
+	buffer_delete(&buffer);
+	return ret;
+}
+
 static int cbfs_add_component(const char *filename,
 			      const char *name,
 			      uint32_t type,
@@ -191,7 +251,7 @@ static int cbfs_add_component(const char *filename,
 	}
 
 	struct cbfs_image image;
-	if (cbfs_image_from_buffer(&image, param.image_region, headeroffset))
+		if (cbfs_image_from_buffer(&image, param.image_region, headeroffset))
 		return 1;
 
 	if (cbfs_get_entry(&image, name)) {
@@ -811,6 +871,8 @@ static const struct command commands[] = {
 	{"add-payload", "H:r:f:n:t:c:b:C:I:vh?", cbfs_add_payload, true, true},
 	{"add-stage", "H:r:f:n:t:c:b:S:vh?", cbfs_add_stage, true, true},
 	{"add-int", "H:r:i:n:b:vh?", cbfs_add_integer, true, true},
+	{"add-master-header", "H:r:vh?", cbfs_add_master_header, true,
+		true},
 	{"copy", "H:D:s:h?", cbfs_copy, true, true},
 	{"create", "M:r:s:B:b:H:o:m:vh?", cbfs_create, true, true},
 	{"extract", "H:r:n:f:vh?", cbfs_extract, true, false},
@@ -935,6 +997,8 @@ static void usage(char *name)
 			"Add a 32bit flat mode binary\n"
 	     " add-int [-r image,regions] -i INTEGER -n NAME [-b base]     "
 			"Add a raw 64-bit integer value\n"
+	     " add-master-header [-r image,regions]                        "
+			"Add a legacy CBFS master header\n"
 	     " remove [-r image,regions] -n NAME                           "
 			"Remove a component\n"
 	     " copy -D new_header_offset -s region size \\\n"



More information about the coreboot-gerrit mailing list