[coreboot] New patch to review for coreboot: 04c13d9 cbfstool: Unify cbfs_find_location
Noé Rubinstein (noe.rubinstein@gmail.com)
gerrit at coreboot.org
Mon Oct 17 12:29:14 CEST 2011
Noé Rubinstein (noe.rubinstein at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/285
-gerrit
commit 04c13d9b86c0b2bd50f45d328cb5f914e7e13c85
Author: Noe Rubinstein <nrubinstein at avencall.com>
Date: Tue Oct 11 19:13:49 2011 +0200
cbfstool: Unify cbfs_find_location
Change-Id: I7db964d6211d9c6646eeed31bdeb9c204bd44b9a
Signed-off-by: Noe Rubinstein <nrubinstein at avencall.com>
---
util/cbfstool/cbfstool.c | 5 +--
util/cbfstool/common.c | 73 +++++++++++++--------------------------------
2 files changed, 23 insertions(+), 55 deletions(-)
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 530712b..75edcda 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -251,11 +251,10 @@ static int cbfs_locate(int argc, char **argv)
const char *filename = argv[4];
int align = strtoul(argv[5], NULL, 0);
uint32_t offset = argc > 6 ? strtoul(argv[6], NULL, 0) : 0;
- uint32_t loc = cbfs_find_stage_location(romname, filesize, filename, align,
- offset);
+ uint32_t loc = cbfs_find_stage_location(romname, filesize, filename,
+ align, offset);
printf("%x\n", loc);
- fprintf(stderr, "%x\n", loc);
return 0;
}
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 09fe5bb..80b293a 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -436,16 +436,18 @@ static int in_segment(int addr, int size, int gran)
return ((addr & ~(gran - 1)) == ((addr + size) & ~(gran - 1)));
}
-uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
- const char *filename, uint32_t alignment,
- uint32_t offset)
+static uint32_t cbfs_find_location_(const char *romfile, uint32_t filesize,
+ const char *filename, uint32_t offset,
+ int is_stage, uint32_t alignment)
{
void *rom = loadrom(romfile);
int filename_size = strlen(filename);
int headersize =
- sizeof(struct cbfs_file) + ALIGN(filename_size + 1,
- 16) + sizeof(struct cbfs_stage);
+ sizeof(struct cbfs_file) +
+ ALIGN(filename_size + 1, 16) +
+ (is_stage ? sizeof(struct cbfs_stage) : 0);
+
int totalsize = headersize + filesize;
if (offset > phys_end - phys_start) {
@@ -479,6 +481,8 @@ uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
&& (ntohl(thisfile->len) + ntohl(thisfile->offset)
- off_rel >= totalsize)) {
+ if (!is_stage) return current + headersize;
+
if (in_segment
(current + headersize, filesize, alignment))
return current + headersize;
@@ -496,9 +500,9 @@ uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
filesize, alignment))
return ALIGN(current, alignment) + alignment;
}
- current =
- ALIGN(current + ntohl(thisfile->len) +
- ntohl(thisfile->offset), align);
+ current = ALIGN(current + (ntohl(thisfile->len) +
+ ntohl(thisfile->offset) - off_rel),
+ align);
}
return 0;
}
@@ -506,49 +510,14 @@ uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
const char *filename, uint32_t offset)
{
- void *rom = loadrom(romfile);
- int filename_size = strlen(filename);
-
- int headersize =
- sizeof(struct cbfs_file) + ALIGN(filename_size + 1, 16);
-
- int totalsize = headersize + filesize;
-
- if (offset > phys_end - phys_start) {
- fprintf(stderr, "Offset outside of ROM boundaries\n");
- exit(1);
- }
-
- if (offset) offset = ALIGN(phys_start + offset, align);
-
- uint32_t current = phys_start;
- while (current < phys_end) {
- if (!cbfs_file_header(current)) {
- current += align;
- continue;
- }
- struct cbfs_file *thisfile =
- (struct cbfs_file *)phys_to_virt(current);
-
- uint32_t top =
- current + ntohl(thisfile->len) + ntohl(thisfile->offset);
-
- uint32_t off_rel = 0;
- if (current < offset && offset <= top) {
- off_rel = offset - current;
- current = offset;
- }
-
- if (current >= offset
- && ((ntohl(thisfile->type) == 0x0)
- || (ntohl(thisfile->type) == 0xffffffff))
- && (ntohl(thisfile->len) + ntohl(thisfile->offset)
- - off_rel >= totalsize))
- return current + headersize;
+ return cbfs_find_location_(romfile, filesize, filename, offset, 0,
+ 0);
+}
- current = ALIGN(current + (ntohl(thisfile->len) +
- ntohl(thisfile->offset) - off_rel),
- align);
- }
- return 0;
+uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
+ const char *filename, uint32_t alignment,
+ uint32_t offset)
+{
+ return cbfs_find_location_(romfile, filesize, filename, offset, 1,
+ alignment);
}
More information about the coreboot
mailing list