[coreboot] [PATCH] flashrom: Use improved abstraction for verify_range

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Mon Jun 22 11:26:54 CEST 2009


Updated patch.

Use correct abstraction for verify_range(). The new abstraction can
handle out-of-band chip communication protocols as well.
The old abstraction caused spurious false positives for erase on SPI and
spurious false negatives for verify on SPI.

Make verify_flash() use verify_range().

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: flashrom-check_erased_range_use_flash_read/flashrom.c
===================================================================
--- flashrom-check_erased_range_use_flash_read/flashrom.c	(Revision 618)
+++ flashrom-check_erased_range_use_flash_read/flashrom.c	(Arbeitskopie)
@@ -261,13 +261,16 @@
 int verify_range(struct flashchip *flash, uint8_t *cmpbuf, int start, int len, char *message)
 {
 	int i, j, starthere, lenhere, ret = 0;
-	chipaddr bios = flash->virtual_memory;
 	int page_size = flash->page_size;
 	uint8_t *readbuf = malloc(page_size);
 
 	if (!len)
 		goto out_free;
 
+	if (!flash->read) {
+		fprintf(stderr, "ERROR: flashrom has no read function for this flash chip.\n");
+		return 1;
+	}
 	if (!readbuf) {
 		fprintf(stderr, "Could not allocate memory!\n");
 		exit(1);
@@ -297,7 +300,7 @@
 		starthere = max(start, i * page_size);
 		/* Length of bytes in the range in this page. */
 		lenhere = min(start + len, (i + 1) * page_size) - starthere;
-		chip_readn(readbuf, bios + starthere, lenhere);
+		flash->read(flash, readbuf, starthere, lenhere);
 		for (j = 0; j < lenhere; j++) {
 			if (cmpbuf[starthere - start + j] != readbuf[j]) {
 				fprintf(stderr, "%s FAILED at 0x%08x! "
@@ -369,44 +372,17 @@
 
 int verify_flash(struct flashchip *flash, uint8_t *buf)
 {
-	int idx;
+	int ret;
 	int total_size = flash->total_size * 1024;
-	uint8_t *buf2 = (uint8_t *) calloc(total_size, sizeof(char));
-	if (!flash->read) {
-		printf("FAILED!\n");
-		fprintf(stderr, "ERROR: flashrom has no read function for this flash chip.\n");
-		return 1;
-	} else
-		flash->read(flash, buf2, 0, total_size);
 
 	printf("Verifying flash... ");
 
-	if (verbose)
-		printf("address: 0x00000000\b\b\b\b\b\b\b\b\b\b");
+	ret = verify_range(flash, buf, 0, total_size, NULL);
 
-	for (idx = 0; idx < total_size; idx++) {
-		if (verbose && ((idx & 0xfff) == 0xfff))
-			printf("0x%08x", idx);
+	if (!ret)
+		printf("VERIFIED.          \n");
 
-		if (*(buf2 + idx) != *(buf + idx)) {
-			if (verbose)
-				printf("0x%08x FAILED!", idx);
-			else
-				printf("FAILED at 0x%08x!", idx);
-			printf("  Expected=0x%02x, Read=0x%02x\n",
-			       *(buf + idx), *(buf2 + idx));
-			return 1;
-		}
-
-		if (verbose && ((idx & 0xfff) == 0xfff))
-			printf("\b\b\b\b\b\b\b\b\b\b");
-	}
-	if (verbose)
-		printf("\b\b\b\b\b\b\b\b\b\b ");
-
-	printf("VERIFIED.          \n");
-
-	return 0;
+	return ret;
 }
 
 int read_flash(struct flashchip *flash, char *filename)


-- 
http://www.hailfinger.org/
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: flashrom_check_erased_range_use_flash_read01.diff
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20090622/88df38b7/attachment.ksh>


More information about the coreboot mailing list