X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Ftcl.c;h=ed5f77eea85b715e152fd732771fcfbc24a3856f;hp=3619e2fb085702863c09933bf3267c3523856184;hb=2de82d39a2df0bfc040f753549eabcb5b737beb1;hpb=790a7b2a8d22e04d9447d35d3bbb8684a11446a3 diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index 3619e2fb08..ed5f77eea8 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -705,9 +705,10 @@ COMMAND_HANDLER(handle_flash_verify_bank_command) struct fileio *fileio; size_t read_cnt; size_t filesize; + size_t length; int differ; - if (CMD_ARGC != 3) + if (CMD_ARGC < 2 || CMD_ARGC > 3) return ERROR_COMMAND_SYNTAX_ERROR; struct duration bench; @@ -718,7 +719,16 @@ COMMAND_HANDLER(handle_flash_verify_bank_command) if (ERROR_OK != retval) return retval; - COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], offset); + offset = 0; + + if (CMD_ARGC > 2) + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], offset); + + if (offset > p->size) { + LOG_ERROR("Offset 0x%8.8" PRIx32 " is out of range of the flash bank", + offset); + return ERROR_COMMAND_ARGUMENT_INVALID; + } retval = fileio_open(&fileio, CMD_ARGV[1], FILEIO_READ, FILEIO_BINARY); if (retval != ERROR_OK) { @@ -732,14 +742,26 @@ COMMAND_HANDLER(handle_flash_verify_bank_command) 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) { LOG_ERROR("Out of memory"); fileio_close(fileio); return ERROR_FAIL; } - retval = fileio_read(fileio, filesize, buffer_file, &read_cnt); + retval = fileio_read(fileio, length, buffer_file, &read_cnt); fileio_close(fileio); if (retval != ERROR_OK) { LOG_ERROR("File read failure"); @@ -747,20 +769,20 @@ COMMAND_HANDLER(handle_flash_verify_bank_command) return retval; } - if (read_cnt != filesize) { + if (read_cnt != length) { LOG_ERROR("Short read"); free(buffer_file); return ERROR_FAIL; } - buffer_flash = malloc(filesize); + buffer_flash = malloc(length); if (buffer_flash == NULL) { LOG_ERROR("Out of memory"); free(buffer_file); 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) { LOG_ERROR("Flash read error"); free(buffer_flash); @@ -771,15 +793,15 @@ COMMAND_HANDLER(handle_flash_verify_bank_command) if (duration_measure(&bench) == ERROR_OK) 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)", - read_cnt, CMD_ARGV[1], p->bank_number, offset, - duration_elapsed(&bench), duration_kbps(&bench, read_cnt)); + length, CMD_ARGV[1], p->bank_number, offset, + 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"); if (differ) { uint32_t t; int diffs = 0; - for (t = 0; t < read_cnt; t++) { + for (t = 0; t < length; t++) { if (buffer_flash[t] == buffer_file[t]) continue; command_print(CMD_CTX, "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x", @@ -926,10 +948,10 @@ static const struct command_registration flash_exec_command_handlers[] = { .name = "verify_bank", .handler = handle_flash_verify_bank_command, .mode = COMMAND_EXEC, - .usage = "bank_id filename offset", - .help = "Read binary data from flash bank and file, " - "starting at specified byte offset from the " - "beginning of the bank. Compare the contents.", + .usage = "bank_id filename [offset]", + .help = "Compare the contents of a file with the contents of the " + "flash bank. Allow optional offset from beginning of the bank " + "(defaults to zero).", }, { .name = "protect",