[coreboot-gerrit] New patch to review for coreboot: b060c69 fmap: allocate memory as much as discovered fmap size

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Fri Apr 10 17:39:07 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/9556

-gerrit

commit b060c69afa409ad88c5cd5eadb25fb09c5d05206
Author: Daisuke Nojiri <dnojiri at chromium.org>
Date:   Mon Nov 24 13:01:11 2014 -0800

    fmap: allocate memory as much as discovered fmap size
    
    fmap_find used to read 4096 bytes from the fmap offset blindly. instead, we read
    the fmap header first to calcurate the size of the fmap. Then, we read flash
    again exactly as much as the discovered fmap.
    
    BUG=none
    BRANCH=ToT
    TEST=Booted Storm and Peppy. Built all current boards.
    
    Change-Id: Iaa50c1bc3401c77b433af11406d4b9d2e4e722e8
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: 755ff66ab0a4d05e6d5410c11a6badb9fcb77a0d
    Original-Signed-off-by: Daisuke Nojiri <dnojiri at chromium.org>
    Original-Change-Id: Ie5058d181e6565acb70bf108464682dd0e6c1f64
    Original-Reviewed-on: https://chromium-review.googlesource.com/231685
    Original-Reviewed-by: Aaron Durbin <adurbin at chromium.org>
    Original-Reviewed-by: Julius Werner <jwerner at chromium.org>
---
 src/vendorcode/google/chromeos/fmap.c | 65 ++++++++++++++++++++++++-----------
 1 file changed, 45 insertions(+), 20 deletions(-)

diff --git a/src/vendorcode/google/chromeos/fmap.c b/src/vendorcode/google/chromeos/fmap.c
index 7c256ce..50b0248 100644
--- a/src/vendorcode/google/chromeos/fmap.c
+++ b/src/vendorcode/google/chromeos/fmap.c
@@ -24,6 +24,21 @@
 #include <cbfs.h>
 #include "fmap.h"
 
+static int is_fmap_signature_valid(const struct fmap *fmap)
+{
+	if (memcmp(fmap, FMAP_SIGNATURE, sizeof(FMAP_SIGNATURE) - 1)) {
+		printk(BIOS_ERR, "No FMAP found at %p.\n", fmap);
+		return 1;
+	}
+
+	printk(BIOS_DEBUG, "FMAP: Found \"%s\" version %d.%d at %p.\n",
+	       fmap->name, fmap->ver_major, fmap->ver_minor, fmap);
+	printk(BIOS_DEBUG, "FMAP: base = %llx size = %x #areas = %d\n",
+	       (unsigned long long)fmap->base, fmap->size, fmap->nareas);
+
+	return 0;
+}
+
 /* Find FMAP data structure in ROM.
  * See http://code.google.com/p/flashmap/ for more information on FMAP.
  */
@@ -36,32 +51,42 @@ const struct fmap *fmap_find(void)
 	 * master header; that would require some more changes to cbfstool
 	 * and possibly cros_bundle_firmware.
 	 */
+	const struct fmap *fmap;
+	struct cbfs_media media;
+	size_t size;
 
-#if CONFIG_ARCH_X86
-	/* wrapping around 0x100000000 */
-	const struct fmap *fmap = (void *)
-		(CONFIG_FLASHMAP_OFFSET - CONFIG_ROM_SIZE);
-#else
-	struct cbfs_media default_media, *media;
-	media = &default_media;
-	init_default_cbfs_media(media);
-	media->open(media);
-	const struct fmap *fmap = (void *)
-		media->map(media, CONFIG_FLASHMAP_OFFSET, 4096); // FIXME size
-	media->close(media);
-#endif
+	if (init_default_cbfs_media(&media)) {
+		printk(BIOS_ERR, "failed to init default cbfs media\n");
+		return NULL;
+	}
+
+	media.open(&media);
+	fmap = media.map(&media, CONFIG_FLASHMAP_OFFSET, sizeof(*fmap));
 
-	if (fmap == CBFS_MEDIA_INVALID_MAP_ADDRESS ||
-	    memcmp(fmap, FMAP_SIGNATURE, sizeof(FMAP_SIGNATURE) - 1)) {
-		printk(BIOS_DEBUG, "No FMAP found at %p.\n", fmap);
+	if (fmap == CBFS_MEDIA_INVALID_MAP_ADDRESS) {
+		printk(BIOS_ERR, "failed to map FMAP header\n");
+		media.close(&media);
 		return NULL;
 	}
 
-	printk(BIOS_DEBUG, "FMAP: Found \"%s\" version %d.%d at %p.\n",
-	       fmap->name, fmap->ver_major, fmap->ver_minor, fmap);
-	printk(BIOS_DEBUG, "FMAP: base = %llx size = %x #areas = %d\n",
-	       (unsigned long long)fmap->base, fmap->size, fmap->nareas);
+	if (is_fmap_signature_valid(fmap)) {
+		media.unmap(&media, fmap);
+		media.close(&media);
+		return NULL;
+	}
+
+	size = sizeof(*fmap) + sizeof(struct fmap_area) * fmap->nareas;
+	media.unmap(&media, fmap);
+	fmap = media.map(&media, CONFIG_FLASHMAP_OFFSET, size);
+
+	if (fmap == CBFS_MEDIA_INVALID_MAP_ADDRESS) {
+		printk(BIOS_ERR, "failed to map FMAP (size=%zu)\n", size);
+		media.unmap(&media, fmap);
+		media.close(&media);
+		return NULL;
+	}
 
+	media.close(&media);
 	return fmap;
 }
 



More information about the coreboot-gerrit mailing list