aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor/tcl.c
diff options
context:
space:
mode:
authorMarc Schink <openocd-dev@marcschink.de>2016-11-04 09:02:11 +0100
committerFreddie Chopin <freddie.chopin@gmail.com>2017-06-17 12:45:11 +0100
commit7112e5f57afffb3b387283f2f6048bf45f25c840 (patch)
tree90f52cdca2a60ac554cc707b773916cd8bc96a9d /src/flash/nor/tcl.c
parentbdc71c5252995d55298ba7bba49adec074104619 (diff)
downloadriscv-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.c29
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);