[coreboot] r3260 - trunk/util/flashrom

svn at coreboot.org svn at coreboot.org
Thu Apr 24 11:07:58 CEST 2008


Author: stepan
Date: 2008-04-24 11:07:57 +0200 (Thu, 24 Apr 2008)
New Revision: 3260

Modified:
   trunk/util/flashrom/82802ab.c
Log:
Flash pages, which where excluded from updating using the exclude or the
layout option, as well as areas, whose flash contents already contain the
desired data, will be skipped.
These ensures absolute data security of critical areas (BIOS boot block), 
e.g. against a sudden power off or a CPU hangup during flashing. As a
nice side effect, it speeds up the flash process, if the BIOS to be flashed
is very similar to the version in flash. 

Signed-off-by: Claus Gindhart <claus.gindhart at kontron.com>
Acked-by: Stefan Reinauer <stepan at coresystems.de>



Modified: trunk/util/flashrom/82802ab.c
===================================================================
--- trunk/util/flashrom/82802ab.c	2008-04-23 22:54:40 UTC (rev 3259)
+++ trunk/util/flashrom/82802ab.c	2008-04-24 09:07:57 UTC (rev 3260)
@@ -27,6 +27,7 @@
  */
 
 #include <stdio.h>
+#include <string.h>
 #include <stdint.h>
 #include "flash.h"
 
@@ -110,6 +111,7 @@
 {
 	volatile uint8_t *bios = flash->virtual_memory + offset;
 	volatile uint8_t *wrprotect = flash->virtual_registers + offset + 2;
+	int j;
 	uint8_t status;
 
 	// clear status register
@@ -128,6 +130,12 @@
 	// now let's see what the register is
 	status = wait_82802ab(flash->virtual_memory);
 	//print_82802ab_status(status);
+	for (j = 0; j < flash->page_size; j++) {
+		if (*(bios + j) != 0xFF) {
+			printf("BLOCK ERASE failed at 0x%x\n", offset);
+			return -1;
+		}
+	}
 	printf("DONE BLOCK 0x%x\n", offset);
 
 	return 0;
@@ -167,17 +175,29 @@
 	int page_size = flash->page_size;
 	volatile uint8_t *bios = flash->virtual_memory;
 
-	erase_82802ab(flash);
-	if (*bios != 0xff) {
-		printf("ERASE FAILED\n");
-		return -1;
-	}
-	printf("Programming page: ");
+	printf("Programming page: \n");
 	for (i = 0; i < total_size / page_size; i++) {
+		printf
+		    ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 		printf("%04d at address: 0x%08x", i, i * page_size);
+
+		/* Auto Skip Blocks, which already contain the desired data
+		 * Faster, because we only write, what has changed
+		 * More secure, because blocks, which are excluded
+		 * (with the exclude or layout feature)
+		 * or not erased and rewritten; their data is retained also in
+		 * sudden power off situations
+		 */
+		if (!memcmp((void *)(buf + i * page_size),
+			    (void *)(bios + i * page_size), page_size)) {
+			printf("SKIPPED\n");
+			continue;
+		}
+
+		/* erase block by block and write block by block; this is the most secure way */
+		erase_82802ab_block(flash, i * page_size);
 		write_page_82802ab(bios, buf + i * page_size,
 				   bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 	}
 	printf("\n");
 	protect_jedec(bios);





More information about the coreboot mailing list