struct fileio *fileio;
size_t read_cnt;
size_t filesize;
+ size_t length;
int differ;
if (CMD_ARGC < 2 || CMD_ARGC > 3)
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");
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);
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",