[coreboot-gerrit] New patch to review for coreboot: cbfs: hardcode file alignment

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Tue Jul 14 22:35:01 CEST 2015


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

-gerrit

commit f369ed2b7fc77506c0370cc32e3d162e5d6dfb5c
Author: Patrick Georgi <pgeorgi at chromium.org>
Date:   Tue Jul 14 22:28:27 2015 +0200

    cbfs: hardcode file alignment
    
    Assume that it's 64 byte.
    
    Change-Id: I168facd92f64c2cf99c26c350c60317807a4aed4
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
---
 src/arch/x86/mmap_boot.c                             |  4 +---
 src/arch/x86/walkcbfs.S                              | 17 +++++------------
 src/include/cbfs.h                                   |  3 ---
 src/include/cbfs_serialized.h                        |  2 +-
 src/lib/cbfs.c                                       |  9 +++------
 src/lib/cbfs_boot_props.c                            |  2 --
 src/vendorcode/google/chromeos/vboot2/vboot_loader.c |  1 -
 7 files changed, 10 insertions(+), 28 deletions(-)

diff --git a/src/arch/x86/mmap_boot.c b/src/arch/x86/mmap_boot.c
index 4dd269b..6c98954 100644
--- a/src/arch/x86/mmap_boot.c
+++ b/src/arch/x86/mmap_boot.c
@@ -53,13 +53,11 @@ int cbfs_boot_region_properties(struct cbfs_props *props)
 	header.magic = ntohl(header.magic);
 	header.romsize = ntohl(header.romsize);
 	header.bootblocksize = ntohl(header.bootblocksize);
-	header.align = ntohl(header.align);
 	header.offset = ntohl(header.offset);
 
 	if (header.magic != CBFS_HEADER_MAGIC)
 		return -1;
 
-	props->align = header.align;
 	props->offset = header.offset;
 	if (CONFIG_ROM_SIZE != header.romsize)
 		props->size = CONFIG_ROM_SIZE;
@@ -67,7 +65,7 @@ int cbfs_boot_region_properties(struct cbfs_props *props)
 		props->size = header.romsize;
 	props->size -= props->offset;
 	props->size -= header.bootblocksize;
-	props->size = ALIGN_DOWN(props->size, props->align);
+	props->size = ALIGN_DOWN(props->size, 64);
 
 	printk(BIOS_DEBUG, "CBFS @ %zx size %zx\n", props->offset, props->size);
 
diff --git a/src/arch/x86/walkcbfs.S b/src/arch/x86/walkcbfs.S
index 60eb8b5..00ac24a 100644
--- a/src/arch/x86/walkcbfs.S
+++ b/src/arch/x86/walkcbfs.S
@@ -74,13 +74,9 @@ tryharder:
 	mov CBFS_FILE_LEN(%ebx), %edi
 	bswap %edi
 	add %edi, %ecx
-	mov CBFS_HEADER_PTR, %edi
-	mov CBFS_HEADER_ALIGN(%edi), %edi
-	bswap %edi
-	sub $1, %edi
-	add %edi, %ecx
-	not %edi
-	and %edi, %ecx
+	/* round by 64 bytes */
+	add $(64 - 1), %ecx
+	and $~(64 - 1), %ecx
 
 	/* if oldaddr >= addr, leave */
 	cmp %ebx, %ecx
@@ -106,11 +102,8 @@ out:
 
 
 searchfile:
-	/* if filemagic isn't found, move forward cbfs_header->align bytes */
-	mov CBFS_HEADER_PTR, %edi
-	mov CBFS_HEADER_ALIGN(%edi), %edi
-	bswap %edi
-	add %edi, %ebx
+	/* if filemagic isn't found, move forward 64 bytes */
+	add $64, %ebx
 	jmp check_for_exit
 
 filemagic:
diff --git a/src/include/cbfs.h b/src/include/cbfs.h
index 00c43f2..f031141 100644
--- a/src/include/cbfs.h
+++ b/src/include/cbfs.h
@@ -66,13 +66,10 @@ int cbfs_locate(struct region_device *fh, const struct cbfsd *cbfs,
 
 struct cbfsd {
 	const struct region_device *rdev;
-	size_t align;
 };
 
 /* The cbfs_props struct describes the properties associated with a CBFS. */
 struct cbfs_props {
-	/* Each file is aligned. */
-	size_t align;
 	/* CBFS starts at the following offset within the boot region. */
 	size_t offset;
 	/* CBFS size. */
diff --git a/src/include/cbfs_serialized.h b/src/include/cbfs_serialized.h
index df38857..c8bf79d 100644
--- a/src/include/cbfs_serialized.h
+++ b/src/include/cbfs_serialized.h
@@ -95,7 +95,7 @@ struct cbfs_header {
 	uint32_t version;
 	uint32_t romsize;
 	uint32_t bootblocksize;
-	uint32_t align;
+	uint32_t align; /* fixed to 64 bytes */
 	uint32_t offset;
 	uint32_t architecture;
 	uint32_t pad[1];
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 3e83765..cee18ee 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -57,7 +57,6 @@ int cbfs_boot_locate(struct region_device *fh, const char *name, uint32_t *type)
 		return -1;
 
 	cbfs.rdev = &rdev;
-	cbfs.align = props.align;
 
 	return cbfs_locate(fh, &cbfs, name, type);
 }
@@ -83,11 +82,9 @@ int cbfs_locate(struct region_device *fh, const struct cbfsd *cbfs,
 {
 	size_t offset;
 	const struct region_device *rd;
-	size_t align;
 
 	offset = 0;
 	rd = cbfs->rdev;
-	align = cbfs->align;
 
 	LOG("Locating '%s'\n", name);
 
@@ -107,7 +104,7 @@ int cbfs_locate(struct region_device *fh, const struct cbfsd *cbfs,
 
 		if (memcmp(file.magic, CBFS_FILE_MAGIC, sizeof(file.magic))) {
 			offset++;
-			offset = ALIGN_UP(offset, align);
+			offset = ALIGN_UP(offset, 64);
 			continue;
 		}
 
@@ -127,14 +124,14 @@ int cbfs_locate(struct region_device *fh, const struct cbfsd *cbfs,
 		if (!name_match) {
 			DEBUG(" Unmatched '%s' at %zx\n", fname, offset);
 			offset += file.offset + file.len;
-			offset = ALIGN_UP(offset, align);
+			offset = ALIGN_UP(offset, 64);
 			continue;
 		}
 
 		if (type != NULL && *type != file.type) {
 			DEBUG(" Unmatched type %x at %zx\n", file.type, offset);
 			offset += file.offset + file.len;
-			offset = ALIGN_UP(offset, align);
+			offset = ALIGN_UP(offset, 64);
 			continue;
 		}
 
diff --git a/src/lib/cbfs_boot_props.c b/src/lib/cbfs_boot_props.c
index 21e64d3..7a9f7a9 100644
--- a/src/lib/cbfs_boot_props.c
+++ b/src/lib/cbfs_boot_props.c
@@ -49,13 +49,11 @@ int __attribute__((weak)) cbfs_boot_region_properties(struct cbfs_props *props)
 
 	header.magic = ntohl(header.magic);
 	header.romsize = ntohl(header.romsize);
-	header.align = ntohl(header.align);
 	header.offset = ntohl(header.offset);
 
 	if (header.magic != CBFS_HEADER_MAGIC)
 		return -1;
 
-	props->align = header.align;
 	props->offset = header.offset;
 	props->size = header.romsize;
 	props->size -= props->offset;
diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_loader.c b/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
index 3c0d67e..90ada1e 100644
--- a/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
+++ b/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
@@ -173,7 +173,6 @@ static int vboot_locate_by_multi_cbfs(const struct region_device *fw_main,
 		return -1;
 
 	cbfs.rdev = &rdev;
-	cbfs.align = props.align;
 
 	return cbfs_locate(asset_rdev(asset), &cbfs, asset_name(asset), NULL);
 }



More information about the coreboot-gerrit mailing list