diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-06-24 08:20:45 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-06-24 08:20:45 +0000 |
commit | 23290664edd906ebc0b9118489dd49d027a170f2 (patch) | |
tree | 41f62df2975f619000f8c69754b13fe129bbec9a | |
parent | 5d1f41857b36fb8632f5d88314e40edd4abc94ef (diff) | |
download | flashrom-23290664edd906ebc0b9118489dd49d027a170f2.tar.gz flashrom-23290664edd906ebc0b9118489dd49d027a170f2.tar.bz2 flashrom-23290664edd906ebc0b9118489dd49d027a170f2.zip |
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.c | 44 |
1 files changed, 10 insertions, 34 deletions
@@ -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) |