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_
|
#define _FMAP_H_
|
||||||
|
|
||||||
#include <region.h>
|
#include <region.h>
|
||||||
|
#include <fmap_serialized.h>
|
||||||
|
|
||||||
/* Locate the named area in the fmap and fill in a region device representing
|
/* 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
|
* 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. */
|
* < 0 on error. */
|
||||||
int fmap_locate_area(const char *name, struct region *r);
|
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
|
#endif
|
||||||
|
|
|
@ -117,3 +117,46 @@ int fmap_locate_area(const char *name, struct region *ar)
|
||||||
|
|
||||||
return -1;
|
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