[coreboot-gerrit] Patch set updated for coreboot: cbfstool: Fix broken alignment because of flashmap

Werner Zeh (werner.zeh@siemens.com) gerrit at coreboot.org
Mon Jan 25 14:33:50 CET 2016


Werner Zeh (werner.zeh at siemens.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/13417

-gerrit

commit a27fcc204ff3a0532fa27b8b2e4bccc52092778d
Author: Werner Zeh <werner.zeh at siemens.com>
Date:   Mon Jan 25 12:47:20 2016 +0100

    cbfstool: Fix broken alignment because of flashmap
    
    With the introduction of flashmap cbfs alignment of files gets
    broken because flashmap is located at the beginning of the flash
    and cbfstool didn't take care about that offset.
    This commit fixes the alignment in cbfs.
    
    Change-Id: Idebb86d4c691b49a351a402ef79c62d31622c773
    Signed-off-by: Werner Zeh <werner.zeh at siemens.com>
---
 util/cbfstool/cbfs_image.c | 12 +++++++-----
 util/cbfstool/cbfs_image.h |  3 ++-
 util/cbfstool/cbfstool.c   |  5 ++++-
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 2d7a6f0..425a178 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -1411,7 +1411,8 @@ static int is_in_range(size_t start, size_t end, size_t metadata_size,
 }
 
 int32_t cbfs_locate_entry(struct cbfs_image *image, size_t size,
-			  size_t page_size, size_t align, size_t metadata_size)
+			  size_t page_size, size_t align, size_t metadata_size,
+			  size_t region_offset)
 {
 	struct cbfs_file *entry;
 	size_t need_len;
@@ -1474,15 +1475,16 @@ int32_t cbfs_locate_entry(struct cbfs_image *image, size_t size,
 		if (addr_next - addr < need_len)
 			continue;
 
-		offset = align_up(addr + metadata_size, align);
+		offset = align_up(addr + metadata_size + region_offset, align);
+		offset -= region_offset;
 		if (is_in_same_page(offset, size, page_size) &&
 		    is_in_range(addr, addr_next, metadata_size, offset, size)) {
 			DEBUG("cbfs_locate_entry: FIT (PAGE1).");
 			return offset;
 		}
 
-		addr2 = align_up(addr, page_size);
-		offset = align_up(addr2, align);
+		addr2 = align_up(addr + region_offset, page_size);
+		offset = align_up(addr2, align) -  region_offset;
 		if (is_in_range(addr, addr_next, metadata_size, offset, size)) {
 			DEBUG("cbfs_locate_entry: OVERLAP (PAGE2).");
 			return offset;
@@ -1492,7 +1494,7 @@ int32_t cbfs_locate_entry(struct cbfs_image *image, size_t size,
 		 * definitely provide the space for header. */
 		assert(page_size >= metadata_size);
 		addr3 = addr2 + page_size;
-		offset = align_up(addr3, align);
+		offset = align_up(addr3, align) - region_offset;
 		if (is_in_range(addr, addr_next, metadata_size, offset, size)) {
 			DEBUG("cbfs_locate_entry: OVERLAP+ (PAGE3).");
 			return offset;
diff --git a/util/cbfstool/cbfs_image.h b/util/cbfstool/cbfs_image.h
index 00adcc8..223efd4 100644
--- a/util/cbfstool/cbfs_image.h
+++ b/util/cbfstool/cbfs_image.h
@@ -112,7 +112,8 @@ int cbfs_create_empty_entry(struct cbfs_file *entry, int type,
  *  "align" specifies starting address alignment.
  * Returns a valid offset, or -1 on failure. */
 int32_t cbfs_locate_entry(struct cbfs_image *image, size_t size,
-			  size_t page_size, size_t align, size_t metadata_size);
+			  size_t page_size, size_t align, size_t metadata_size,
+			  size_t region_offset);
 
 /* Callback function used by cbfs_walk.
  * Returns 0 on success, or non-zero to stop further iteration. */
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 23787d8..98b8db1 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -166,8 +166,11 @@ static int do_cbfs_locate(int32_t *cbfs_addr, size_t metadata_size)
 	if (param.hash != VB2_HASH_INVALID)
 		metadata_size += sizeof(struct cbfs_file_attr_hash);
 
+	/* image.buffer.offset is passed so alignment is calculated relativ */
+	/* to flash address, not the start of CBFS. */
 	int32_t address = cbfs_locate_entry(&image, buffer.size, param.pagesize,
-						param.alignment, metadata_size);
+						param.alignment, metadata_size,
+						image.buffer.offset);
 	buffer_delete(&buffer);
 
 	if (address == -1) {



More information about the coreboot-gerrit mailing list