diff options
author | Marc Schink <openocd-dev@marcschink.de> | 2016-11-04 09:02:11 +0100 |
---|---|---|
committer | Freddie Chopin <freddie.chopin@gmail.com> | 2017-06-17 12:45:11 +0100 |
commit | 7112e5f57afffb3b387283f2f6048bf45f25c840 (patch) | |
tree | 90f52cdca2a60ac554cc707b773916cd8bc96a9d /src/flash/nor/tcl.c | |
parent | bdc71c5252995d55298ba7bba49adec074104619 (diff) | |
download | riscv-openocd-7112e5f57afffb3b387283f2f6048bf45f25c840.zip riscv-openocd-7112e5f57afffb3b387283f2f6048bf45f25c840.tar.gz riscv-openocd-7112e5f57afffb3b387283f2f6048bf45f25c840.tar.bz2 |
flash/nor/tcl: Respect flash bank boundary in write_bank
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>
Diffstat (limited to 'src/flash/nor/tcl.c')
-rw-r--r-- | src/flash/nor/tcl.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index 2bc0f8a..ab3b1ea 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -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); |