summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Sherk <steven.sherk@se-eng.com>2013-08-14 14:55:57 -0600
committerPatrick Georgi <patrick@georgi-clan.de>2014-08-10 22:25:07 +0200
commite17843c4a75ce440e19d545ddb2e04372f548c07 (patch)
treed9bb5c60cab68daeffbca4f8ed1675d392aaf27b
parent1f5487a7c0687b910a898b1fe704e9b75947b5dc (diff)
cbfs: Fix overwalk on file scan
A bootblock overwalk was occuring when deriving the actual length, the bootblock size was not taken into account and bootblock size was not aligned. Resolved merge conflict. Change-Id: I7eb42f8deaaf223dcf07b37bb7dde4643acd508f Signed-off-by: Steven Sherk <steven.sherk@se-eng.com> Reviewed-on: https://gerrit.chromium.org/gerrit/65989 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Commit-Queue: Steve Sherk <ssherk70@gmail.com> Tested-by: Steve Sherk <ssherk70@gmail.com> (cherry picked from commit 20b0ba479b01755fbdc7f3dd9214e8af923402ba) Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com> Reviewed-on: http://review.coreboot.org/6539 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
-rw-r--r--payloads/libpayload/libcbfs/cbfs_core.c15
-rw-r--r--src/lib/cbfs_core.c15
2 files changed, 26 insertions, 4 deletions
diff --git a/payloads/libpayload/libcbfs/cbfs_core.c b/payloads/libpayload/libcbfs/cbfs_core.c
index a3d3e02467..fb15744fe0 100644
--- a/payloads/libpayload/libcbfs/cbfs_core.c
+++ b/payloads/libpayload/libcbfs/cbfs_core.c
@@ -119,11 +119,22 @@ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name)
// TODO Add a "size" in CBFS header for a platform independent way to
// determine the end of CBFS data.
#if defined(CONFIG_LP_ARCH_X86) && CONFIG_LP_ARCH_X86
- romsize -= htonl(header->bootblocksize);
+ // resolve actual length of ROM used for CBFS components
+ // the bootblock size was not taken into account
+ romsize -= ntohl(header->bootblocksize);
+
+ // fine tune the length to handle alignment positioning.
+ // using (bootblock size) % align, to derive the
+ // number of bytes the bootblock is off from the alignment size.
+ if ((ntohl(header->bootblocksize) % align))
+ romsize -= (align - (ntohl(header->bootblocksize) % align));
+ else
+ romsize -= 1;
#endif
- DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align);
+ DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align);
DEBUG("Looking for '%s' starting from 0x%x.\n", name, offset);
+
media->open(media);
while (offset < romsize &&
media->read(media, &file, offset, sizeof(file)) == sizeof(file)) {
diff --git a/src/lib/cbfs_core.c b/src/lib/cbfs_core.c
index 7ef103bc24..264d9a8f24 100644
--- a/src/lib/cbfs_core.c
+++ b/src/lib/cbfs_core.c
@@ -119,11 +119,22 @@ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name)
// TODO Add a "size" in CBFS header for a platform independent way to
// determine the end of CBFS data.
#if defined(CONFIG_ARCH_X86) && CONFIG_ARCH_X86
- romsize -= htonl(header->bootblocksize);
+ // resolve actual length of ROM used for CBFS components
+ // the bootblock size was not taken into account
+ romsize -= ntohl(header->bootblocksize);
+
+ // fine tune the length to handle alignment positioning.
+ // using (bootblock size) % align, to derive the
+ // number of bytes the bootblock is off from the alignment size.
+ if ((ntohl(header->bootblocksize) % align))
+ romsize -= (align - (ntohl(header->bootblocksize) % align));
+ else
+ romsize -= 1;
#endif
- DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align);
+ DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align);
DEBUG("Looking for '%s' starting from 0x%x.\n", name, offset);
+
media->open(media);
while (offset < romsize &&
media->read(media, &file, offset, sizeof(file)) == sizeof(file)) {