From 4d3e4c421e94814884d1ff035a4c4ec80d4b33b2 Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Tue, 14 Jul 2015 22:28:27 +0200 Subject: cbfs: hardcode file alignment Assume that it's 64 byte. Change-Id: I168facd92f64c2cf99c26c350c60317807a4aed4 Signed-off-by: Patrick Georgi Reviewed-on: http://review.coreboot.org/10919 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- src/arch/x86/mmap_boot.c | 4 +--- src/arch/x86/walkcbfs.S | 20 ++++++++------------ src/include/cbfs.h | 3 --- src/include/cbfs_serialized.h | 5 ++++- src/lib/cbfs.c | 9 +++------ src/lib/cbfs_boot_props.c | 2 -- src/vendorcode/google/chromeos/vboot2/vboot_loader.c | 1 - 7 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/arch/x86/mmap_boot.c b/src/arch/x86/mmap_boot.c index 4dd269b772..6c98954ff2 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 60eb8b53b0..9c26d3c9a9 100644 --- a/src/arch/x86/walkcbfs.S +++ b/src/arch/x86/walkcbfs.S @@ -7,6 +7,9 @@ #define CBFS_HEADER_ALIGN (CBFS_HEADER_BOOTBLOCKSIZE + 4) #define CBFS_HEADER_OFFSET (CBFS_HEADER_ALIGN + 4) +/* we use this instead of CBFS_HEADER_ALIGN because the latter is retired. */ +#define CBFS_ALIGNMENT 64 + #define CBFS_FILE_MAGIC 0 #define CBFS_FILE_LEN (CBFS_FILE_MAGIC + 8) #define CBFS_FILE_TYPE (CBFS_FILE_LEN + 4) @@ -74,13 +77,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 $(CBFS_ALIGNMENT - 1), %ecx + and $~(CBFS_ALIGNMENT - 1), %ecx /* if oldaddr >= addr, leave */ cmp %ebx, %ecx @@ -106,11 +105,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 $CBFS_ALIGNMENT, %ebx jmp check_for_exit filemagic: diff --git a/src/include/cbfs.h b/src/include/cbfs.h index 00c43f2871..f031141a82 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 df388570bf..f6720959e3 100644 --- a/src/include/cbfs_serialized.h +++ b/src/include/cbfs_serialized.h @@ -95,12 +95,15 @@ 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]; } __attribute__((packed)); +/* this used to be flexible, but wasn't ever set to something different. */ +#define CBFS_ALIGNMENT 64 + /* "Unknown" refers to CBFS headers version 1, * before the architecture was defined (i.e., x86 only). */ diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c index 3e83765bf3..abc40770af 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, CBFS_ALIGNMENT); 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, CBFS_ALIGNMENT); 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, CBFS_ALIGNMENT); continue; } diff --git a/src/lib/cbfs_boot_props.c b/src/lib/cbfs_boot_props.c index 21e64d37a5..7a9f7a98e0 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 3c0d67e8b9..90ada1e651 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); } -- cgit v1.2.3