From 995269062e631b83079c11bd91112fc0b71c523a Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Thu, 9 Jul 2015 11:27:44 +0200 Subject: 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 Reviewed-on: http://review.coreboot.org/10865 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- src/lib/fmap.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/lib/fmap.c') 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; +} -- cgit v1.2.3