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 add3cdb044ab4433252ab98f3fdb36238b7df6fb 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 | 5 +++++ src/lib/fmap.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
diff --git a/src/include/fmap.h b/src/include/fmap.h index e575bbf..671e802 100644 --- a/src/include/fmap.h +++ b/src/include/fmap.h @@ -21,6 +21,7 @@ #define _FMAP_H_
#include <region.h> +#include <fmap_serialized.h>
/* Locate the named area in the fmap and fill in a region device representing * that area. The region is a sub-region of the readonly boot media. Return @@ -32,4 +33,8 @@ 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 name[FMAP_STRLEN]); #endif diff --git a/src/lib/fmap.c b/src/lib/fmap.c index 0f48cdc..f2087c3 100644 --- a/src/lib/fmap.c +++ b/src/lib/fmap.c @@ -117,3 +117,46 @@ int fmap_locate_area(const char *name, struct region *ar)
return -1; } + +int fmap_find_region_name(const struct region * const ar, + char name[FMAP_STRLEN]) +{ + 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; +}