[coreboot-gerrit] New patch to review for coreboot: fmap: Introduce new function to derive fmap name from offset/size

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Thu Jul 9 16:20:02 CEST 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10865

-gerrit

commit b533897b6ea47427082d9008737f179277269cd0
Author: Patrick Georgi <pgeorgi at 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 at chromium.org>
---
 src/include/fmap.h |  3 +++
 src/lib/fmap.c     | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/src/include/fmap.h b/src/include/fmap.h
index e575bbf..bf98e4c 100644
--- a/src/include/fmap.h
+++ b/src/include/fmap.h
@@ -32,4 +32,7 @@ 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 * const name);
 #endif
diff --git a/src/lib/fmap.c b/src/lib/fmap.c
index 0f48cdc..4d3f1ca 100644
--- a/src/lib/fmap.c
+++ b/src/lib/fmap.c
@@ -117,3 +117,45 @@ int fmap_locate_area(const char *name, struct region *ar)
 
 	return -1;
 }
+
+int fmap_find_region_name(const struct region * const ar, char * const name)
+{
+	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;
+}



More information about the coreboot-gerrit mailing list