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> Reviewed-on: http://review.coreboot.org/10865 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
ad0dda767b
commit
995269062e
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue