flash/nor/tcl: Respect flash bank boundary in verify_bank
Respect the flash bank boundary and compare only the remaining content of the bank even if the file content is larger. Change-Id: I4d75979c7893fdd4d18372fa6b0321a0486b4fa9 Signed-off-by: Marc Schink <openocd-dev@marcschink.de> Reviewed-on: http://openocd.zylin.com/3859 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
This commit is contained in:
parent
2c8602ed9f
commit
2de82d39a2
|
@ -705,6 +705,7 @@ COMMAND_HANDLER(handle_flash_verify_bank_command)
|
||||||
struct fileio *fileio;
|
struct fileio *fileio;
|
||||||
size_t read_cnt;
|
size_t read_cnt;
|
||||||
size_t filesize;
|
size_t filesize;
|
||||||
|
size_t length;
|
||||||
int differ;
|
int differ;
|
||||||
|
|
||||||
if (CMD_ARGC < 2 || CMD_ARGC > 3)
|
if (CMD_ARGC < 2 || CMD_ARGC > 3)
|
||||||
|
@ -741,14 +742,26 @@ COMMAND_HANDLER(handle_flash_verify_bank_command)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_file = malloc(filesize);
|
length = MIN(filesize, p->size - offset);
|
||||||
|
|
||||||
|
if (!length) {
|
||||||
|
LOG_INFO("Nothing to compare with flash bank");
|
||||||
|
fileio_close(fileio);
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length != filesize)
|
||||||
|
LOG_INFO("File content exceeds flash bank size. Only comparing the "
|
||||||
|
"first %zu bytes of the file", length);
|
||||||
|
|
||||||
|
buffer_file = malloc(length);
|
||||||
if (buffer_file == NULL) {
|
if (buffer_file == NULL) {
|
||||||
LOG_ERROR("Out of memory");
|
LOG_ERROR("Out of memory");
|
||||||
fileio_close(fileio);
|
fileio_close(fileio);
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = fileio_read(fileio, filesize, buffer_file, &read_cnt);
|
retval = fileio_read(fileio, length, buffer_file, &read_cnt);
|
||||||
fileio_close(fileio);
|
fileio_close(fileio);
|
||||||
if (retval != ERROR_OK) {
|
if (retval != ERROR_OK) {
|
||||||
LOG_ERROR("File read failure");
|
LOG_ERROR("File read failure");
|
||||||
|
@ -756,20 +769,20 @@ COMMAND_HANDLER(handle_flash_verify_bank_command)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (read_cnt != filesize) {
|
if (read_cnt != length) {
|
||||||
LOG_ERROR("Short read");
|
LOG_ERROR("Short read");
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_flash = malloc(filesize);
|
buffer_flash = malloc(length);
|
||||||
if (buffer_flash == NULL) {
|
if (buffer_flash == NULL) {
|
||||||
LOG_ERROR("Out of memory");
|
LOG_ERROR("Out of memory");
|
||||||
free(buffer_file);
|
free(buffer_file);
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = flash_driver_read(p, buffer_flash, offset, read_cnt);
|
retval = flash_driver_read(p, buffer_flash, offset, length);
|
||||||
if (retval != ERROR_OK) {
|
if (retval != ERROR_OK) {
|
||||||
LOG_ERROR("Flash read error");
|
LOG_ERROR("Flash read error");
|
||||||
free(buffer_flash);
|
free(buffer_flash);
|
||||||
|
@ -780,15 +793,15 @@ COMMAND_HANDLER(handle_flash_verify_bank_command)
|
||||||
if (duration_measure(&bench) == ERROR_OK)
|
if (duration_measure(&bench) == ERROR_OK)
|
||||||
command_print(CMD_CTX, "read %zd bytes from file %s and flash bank %u"
|
command_print(CMD_CTX, "read %zd bytes from file %s and flash bank %u"
|
||||||
" at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
|
" at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
|
||||||
read_cnt, CMD_ARGV[1], p->bank_number, offset,
|
length, CMD_ARGV[1], p->bank_number, offset,
|
||||||
duration_elapsed(&bench), duration_kbps(&bench, read_cnt));
|
duration_elapsed(&bench), duration_kbps(&bench, length));
|
||||||
|
|
||||||
differ = memcmp(buffer_file, buffer_flash, read_cnt);
|
differ = memcmp(buffer_file, buffer_flash, length);
|
||||||
command_print(CMD_CTX, "contents %s", differ ? "differ" : "match");
|
command_print(CMD_CTX, "contents %s", differ ? "differ" : "match");
|
||||||
if (differ) {
|
if (differ) {
|
||||||
uint32_t t;
|
uint32_t t;
|
||||||
int diffs = 0;
|
int diffs = 0;
|
||||||
for (t = 0; t < read_cnt; t++) {
|
for (t = 0; t < length; t++) {
|
||||||
if (buffer_flash[t] == buffer_file[t])
|
if (buffer_flash[t] == buffer_file[t])
|
||||||
continue;
|
continue;
|
||||||
command_print(CMD_CTX, "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x",
|
command_print(CMD_CTX, "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x",
|
||||||
|
|
Loading…
Reference in New Issue