diff options
Diffstat (limited to 'host/lib/fmap.c')
-rw-r--r-- | host/lib/fmap.c | 54 |
1 files changed, 34 insertions, 20 deletions
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; } + |