summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2009-06-24 08:20:45 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2009-06-24 08:20:45 +0000
commit23290664edd906ebc0b9118489dd49d027a170f2 (patch)
tree41f62df2975f619000f8c69754b13fe129bbec9a
parent5d1f41857b36fb8632f5d88314e40edd4abc94ef (diff)
downloadast2050-flashrom-23290664edd906ebc0b9118489dd49d027a170f2.zip
ast2050-flashrom-23290664edd906ebc0b9118489dd49d027a170f2.tar.gz
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(). Tested by Uwe on SB600. Corresponding to flashrom svn r629. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
-rw-r--r--flashrom.c44
1 files changed, 10 insertions, 34 deletions
diff --git a/flashrom.c b/flashrom.c
index e5e4994..97b086f 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -276,13 +276,16 @@ int check_erased_range(struct flashchip *flash, int start, int len)
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);
@@ -312,7 +315,7 @@ int verify_range(struct flashchip *flash, uint8_t *cmpbuf, int start, int len, c
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! "
@@ -384,44 +387,17 @@ notfound:
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)
OpenPOWER on IntegriCloud