]> git.sur5r.net Git - openocd/commitdiff
flash/nor/tcl: Respect flash bank boundary in write_bank
authorMarc Schink <openocd-dev@marcschink.de>
Fri, 4 Nov 2016 08:02:11 +0000 (09:02 +0100)
committerFreddie Chopin <freddie.chopin@gmail.com>
Sat, 17 Jun 2017 11:45:11 +0000 (12:45 +0100)
Respect the flash bank boundary and write only to the remaining part of
the bank even if the file content is larger.

Change-Id: I8f4c1b161c103a77bdb30c6bf052293b5ed48c41
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
Reviewed-on: http://openocd.zylin.com/3861
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
src/flash/nor/tcl.c

index 2bc0f8a9ed83d88922d51b5166afd23c3be17388..ab3b1eaf5e9c262aa23ca317dbb884dae225a73a 100644 (file)
@@ -583,6 +583,7 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
 {
        uint32_t offset;
        uint8_t *buffer;
+       size_t length;
        struct fileio *fileio;
 
        if (CMD_ARGC < 2 || CMD_ARGC > 3)
@@ -617,20 +618,38 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
                return retval;
        }
 
-       buffer = malloc(filesize);
+       length = MIN(filesize, p->size - offset);
+
+       if (!length) {
+               LOG_INFO("Nothing to write to flash bank");
+               fileio_close(fileio);
+               return ERROR_OK;
+       }
+
+       if (length != filesize)
+               LOG_INFO("File content exceeds flash bank size. Only writing the "
+                       "first %zu bytes of the file", length);
+
+       buffer = malloc(length);
        if (buffer == NULL) {
                fileio_close(fileio);
                LOG_ERROR("Out of memory");
                return ERROR_FAIL;
        }
        size_t buf_cnt;
-       if (fileio_read(fileio, filesize, buffer, &buf_cnt) != ERROR_OK) {
+       if (fileio_read(fileio, length, buffer, &buf_cnt) != ERROR_OK) {
                free(buffer);
                fileio_close(fileio);
                return ERROR_FAIL;
        }
 
-       retval = flash_driver_write(p, buffer, offset, buf_cnt);
+       if (buf_cnt != length) {
+               LOG_ERROR("Short read");
+               free(buffer);
+               return ERROR_FAIL;
+       }
+
+       retval = flash_driver_write(p, buffer, offset, length);
 
        free(buffer);
        buffer = NULL;
@@ -638,8 +657,8 @@ COMMAND_HANDLER(handle_flash_write_bank_command)
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
                command_print(CMD_CTX, "wrote %zu bytes from file %s to flash bank %u"
                        " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
-                       filesize, CMD_ARGV[1], p->bank_number, offset,
-                       duration_elapsed(&bench), duration_kbps(&bench, filesize));
+                       length, CMD_ARGV[1], p->bank_number, offset,
+                       duration_elapsed(&bench), duration_kbps(&bench, length));
        }
 
        fileio_close(fileio);