]> git.sur5r.net Git - openocd/commitdiff
flash/nor/tcl: Respect flash bank boundary in verify_bank
authorMarc Schink <openocd-dev@marcschink.de>
Fri, 4 Nov 2016 07:18:45 +0000 (08:18 +0100)
committerFreddie Chopin <freddie.chopin@gmail.com>
Sat, 17 Jun 2017 11:43:29 +0000 (12:43 +0100)
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>
src/flash/nor/tcl.c

index b93d12694b0edc4d4e6a95c92877f5f8b77da376..ed5f77eea85b715e152fd732771fcfbc24a3856f 100644 (file)
@@ -705,6 +705,7 @@ 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 < 2 || CMD_ARGC > 3)
@@ -741,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");
@@ -756,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);
@@ -780,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",