target: rework target_checksum_memory()

Commit d7142a5727 ("target/target: Check checksum_memory
before call") added the error return if target's checksum_memory()
method is not implemented however the slow path with read buffer and
image_calculate_checksum() should be used instead.

Also the code fragment commented as /* convert to target endianness */
is a pure nonsense - it does not convert anything. Drop the conversion
loop.

Change-Id: I804605d31310698445b3ffb5e3fcad1fc43a5579
Suggested-by: Evgeniy Naydanov <evgeniy.naydanov@syntacore.com>
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: https://review.openocd.org/c/openocd/+/9242
Reviewed-by: Evgeniy Naydanov <eugnay@gmail.com>
Tested-by: jenkins
This commit is contained in:
Tomas Vanek
2025-11-19 14:04:55 +01:00
committed by Antonio Borneo
parent df2eb07086
commit 4593222e85

View File

@@ -2475,45 +2475,32 @@ static int target_read_buffer_default(struct target *target, target_addr_t addre
int target_checksum_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t *crc)
{
uint8_t *buffer;
int retval;
uint32_t i;
uint32_t checksum = 0;
if (!target_was_examined(target)) {
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
if (!target->type->checksum_memory) {
LOG_ERROR("Target %s doesn't support checksum_memory", target_name(target));
if (target->type->checksum_memory) {
retval = target->type->checksum_memory(target, address, size, crc);
if (retval == ERROR_OK)
return ERROR_OK;
} else {
LOG_TARGET_INFO(target, "doesn't support fast checksum_memory, using slow read memory");
}
uint8_t *buffer = malloc(size);
if (!buffer) {
LOG_ERROR("error allocating buffer for section (%" PRIu32 " bytes)", size);
return ERROR_FAIL;
}
retval = target->type->checksum_memory(target, address, size, &checksum);
if (retval != ERROR_OK) {
buffer = malloc(size);
if (!buffer) {
LOG_ERROR("error allocating buffer for section (%" PRIu32 " bytes)", size);
return ERROR_COMMAND_SYNTAX_ERROR;
}
retval = target_read_buffer(target, address, size, buffer);
if (retval != ERROR_OK) {
free(buffer);
return retval;
}
retval = target_read_buffer(target, address, size, buffer);
/* convert to target endianness */
for (i = 0; i < (size/sizeof(uint32_t)); i++) {
uint32_t target_data;
target_data = target_buffer_get_u32(target, &buffer[i*sizeof(uint32_t)]);
target_buffer_set_u32(target, &buffer[i*sizeof(uint32_t)], target_data);
}
retval = image_calculate_checksum(buffer, size, &checksum);
free(buffer);
}
*crc = checksum;
if (retval == ERROR_OK)
retval = image_calculate_checksum(buffer, size, crc);
free(buffer);
return retval;
}