diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/fmap.h | 5 | ||||
-rw-r--r-- | src/lib/fmap.c | 43 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/include/fmap.h b/src/include/fmap.h index e575bbf3fc..671e802775 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 0f48cdc414..f2087c3f69 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; +} |