diff options
-rw-r--r-- | futility/cmd_dump_fmap.c | 19 | ||||
-rw-r--r-- | host/lib/fmap.c | 54 | ||||
-rw-r--r-- | host/lib/include/fmap.h | 21 |
3 files changed, 53 insertions, 41 deletions
diff --git a/futility/cmd_dump_fmap.c b/futility/cmd_dump_fmap.c index 14bedac6..d1c962cc 100644 --- a/futility/cmd_dump_fmap.c +++ b/futility/cmd_dump_fmap.c @@ -30,13 +30,12 @@ static size_t size_of_rom; static int opt_gaps = 0; /* Return 0 if successful */ -static int dump_fmap(const void *ptr, int argc, char *argv[]) +static int dump_fmap(const FmapHeader *fmh, int argc, char *argv[]) { int i, retval = 0; char buf[80]; /* DWR: magic number */ - const FmapHeader *fmh = (const FmapHeader *)ptr; - const FmapAreaHeader *ah = - (const FmapAreaHeader *)(ptr + sizeof(FmapHeader)); + const FmapAreaHeader *ah; + ah = (const FmapAreaHeader *) (fmh + 1); if (FMT_NORMAL == opt_format) { snprintf(buf, FMAP_SIGNATURE_SIZE + 1, "%s", @@ -260,14 +259,12 @@ static void add_child(node_t * p, int n) } } -static int human_fmap(void *p) +static int human_fmap(const FmapHeader *fmh) { - FmapHeader *fmh; FmapAreaHeader *ah; int i, j, errorcnt = 0; int numnodes; - fmh = (FmapHeader *) p; ah = (FmapAreaHeader *) (fmh + 1); /* The challenge here is to generate a directed graph from the @@ -384,7 +381,7 @@ static int do_dump_fmap(int argc, char *argv[]) int errorcnt = 0; struct stat sb; int fd; - const char *fmap; + const FmapHeader *fmap; int retval = 1; progname = strrchr(argv[0], '/'); @@ -457,15 +454,15 @@ static int do_dump_fmap(int argc, char *argv[]) close(fd); /* done with this now */ size_of_rom = sb.st_size; - fmap = FmapFind((char *)base_of_rom, size_of_rom); + fmap = fmap_find(base_of_rom, size_of_rom); if (fmap) { switch (opt_format) { case FMT_HUMAN: - retval = human_fmap((void *)fmap); + retval = human_fmap(fmap); break; case FMT_NORMAL: printf("hit at 0x%08x\n", - (uint32_t) (fmap - (char *)base_of_rom)); + (uint32_t) ((char *)fmap - (char *)base_of_rom)); /* fallthrough */ default: retval = diff --git a/host/lib/fmap.c b/host/lib/fmap.c index 014c97b2..f9b0e5ed 100644 --- a/host/lib/fmap.c +++ b/host/lib/fmap.c @@ -9,27 +9,41 @@ #include "fmap.h" -const char* FmapFind(const char* ptr, size_t size) +/* Find and point to the FMAP header within the buffer */ +FmapHeader *fmap_find(uint8_t *ptr, size_t size) { - size_t i; - FmapHeader *fmap_header; - for (i=0; i<size; i += FMAP_SEARCH_STRIDE, ptr += FMAP_SEARCH_STRIDE) { - if (0 != strncmp(ptr, FMAP_SIGNATURE, FMAP_SIGNATURE_SIZE)) - continue; - // Image may have multiple signatures (ex, in code that handles FMAP itself) - // so we do want to check at least major version. - fmap_header = (FmapHeader *)ptr; - if (fmap_header->fmap_ver_major == FMAP_VER_MAJOR) - return ptr; - } - return NULL; + size_t i; + FmapHeader *fmap_header; + for (i=0; i<size; i += FMAP_SEARCH_STRIDE, ptr += FMAP_SEARCH_STRIDE) { + if (0 != memcmp(ptr, FMAP_SIGNATURE, FMAP_SIGNATURE_SIZE)) + continue; + fmap_header = (FmapHeader *)ptr; + if (fmap_header->fmap_ver_major == FMAP_VER_MAJOR) + return fmap_header; + } + return NULL; } -int FmapAreaIndex(const FmapHeader* fh, const FmapAreaHeader* ah, - const char* name) { - int i; - for (i = 0; i < fh->fmap_nareas; i++) - if (!strcmp((const char*) ah[i].area_name, name)) - return i; - return -1; +/* Search for an area by name, return pointer to its beginning */ +uint8_t *fmap_find_by_name(uint8_t *ptr, size_t size, FmapHeader *fmap, + const char *name, FmapAreaHeader **ah_ptr) +{ + int i; + FmapAreaHeader *ah; + + if (!fmap) + fmap = fmap_find(ptr, size); + if (!fmap) + return NULL; + + ah = (FmapAreaHeader*)((void *)fmap + sizeof(FmapHeader)); + for (i = 0; i < fmap->fmap_nareas; i++) + if (!strncmp(ah[i].area_name, name, FMAP_NAMELEN)) { + if (ah_ptr) + *ah_ptr = ah + i; + return ptr + ah[i].area_offset; + } + + return NULL; } + diff --git a/host/lib/include/fmap.h b/host/lib/include/fmap.h index 92d74fd3..7e627050 100644 --- a/host/lib/include/fmap.h +++ b/host/lib/include/fmap.h @@ -34,15 +34,16 @@ typedef struct _FmapAreaHeader { } __attribute__((packed)) FmapAreaHeader; -/* Scan firmware image, pointed by [ptr] with length [size], for fmap header. - * Return pointer to fmap header, or NULL if not found. - */ -const char* FmapFind(const char *ptr, size_t size); - -/* Look up fmap area by name, that is, strcmp(fh->fmap_name, name) == 0. - * Return index of fmap area, that is, ah[returned_index], - * or -1 if not found. */ -int FmapAreaIndex(const FmapHeader* fh, const FmapAreaHeader* ah, - const char* name); +/* Find and point to the FMAP header within the buffer */ +FmapHeader *fmap_find(uint8_t *ptr, size_t size); + +/* Search for an area by name, return pointer to its beginning */ +uint8_t *fmap_find_by_name(uint8_t *ptr, size_t size, + /* optional, will call fmap_find() if NULL */ + FmapHeader *fmap, + /* The area name to search for */ + const char *name, + /* optional, return pointer to entry if not NULL */ + FmapAreaHeader **ah); #endif /* __FMAP_H__ */ |