Patrick Georgi (pgeorgi@google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10865
-gerrit
commit b533897b6ea47427082d9008737f179277269cd0 Author: Patrick Georgi pgeorgi@chromium.org Date: Thu Jul 9 11:27:44 2015 +0200
fmap: Introduce new function to derive fmap name from offset/size
vboot passes around the offset and size of the region to use in later stages. To assign more meaning to this pair, provide a function that returns the fmap area name if there's a precise match (and an error otherwise).
Change-Id: I5724b860271025c8cb8b390ecbd33352ea779660 Signed-off-by: Patrick Georgi pgeorgi@chromium.org --- src/include/fmap.h | 3 +++ src/lib/fmap.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+)
diff --git a/src/include/fmap.h b/src/include/fmap.h index e575bbf..bf98e4c 100644 --- a/src/include/fmap.h +++ b/src/include/fmap.h @@ -32,4 +32,7 @@ int fmap_locate_area_as_rdev(const char *name, struct region_device *area); * < 0 on error. */ int fmap_locate_area(const char *name, struct region *r);
+/* Find fmap area name by offset and size. + * Return 0 on success, < 0 on error. */ +int fmap_find_region_name(const struct region * const ar, char * const name); #endif diff --git a/src/lib/fmap.c b/src/lib/fmap.c index 0f48cdc..4d3f1ca 100644 --- a/src/lib/fmap.c +++ b/src/lib/fmap.c @@ -117,3 +117,45 @@ int fmap_locate_area(const char *name, struct region *ar)
return -1; } + +int fmap_find_region_name(const struct region * const ar, char * const name) +{ + struct region_device fmrd; + size_t offset; + + if (find_fmap_directory(&fmrd)) + return -1; + + /* Start reading the areas just after fmap header. */ + offset = sizeof(struct fmap); + + while (1) { + struct fmap_area *area; + + area = rdev_mmap(&fmrd, offset, sizeof(*area)); + + if (area == NULL) + return -1; + + if ((ar->offset != area->offset) || + (ar->size != area->size)) { + rdev_munmap(&fmrd, area); + offset += sizeof(struct fmap_area); + continue; + } + + printk(BIOS_DEBUG, "FMAP: area (%zx, %zx) found, named %s\n", + ar->offset, ar->size, area->name); + + memcpy(name, area->name, FMAP_STRLEN); + + rdev_munmap(&fmrd, area); + + return 0; + } + + printk(BIOS_DEBUG, "FMAP: area (%zx, %zx) not found\n", + ar->offset, ar->size); + + return -1; +}