diff options
author | Karl Palsson <karlp@tweak.net.au> | 2015-05-31 13:36:13 +0000 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2015-08-06 13:07:09 +0100 |
commit | 4f1738388df4c6eed285e80ace50302daa3f5175 (patch) | |
tree | 64b5c77125dbdb8474036efd61b392c714433863 /src | |
parent | 79fdeb37f486f74658f1eaf658abac8efb3eba6a (diff) | |
download | riscv-openocd-4f1738388df4c6eed285e80ace50302daa3f5175.zip riscv-openocd-4f1738388df4c6eed285e80ace50302daa3f5175.tar.gz riscv-openocd-4f1738388df4c6eed285e80ace50302daa3f5175.tar.bz2 |
target: check memory handlers before use for all types
MMU types were checking and installing fakes at init, but this wasn't catching
all devices. Fixes segfaults when attempting mdw and friends on avr.
Change-Id: I5b11f9913157a21f1aeb11ec852f593b529d9be8
Signed-off-by: Karl Palsson <karlp@tweak.net.au>
Reviewed-on: http://openocd.zylin.com/2791
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/target/target.c | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/src/target/target.c b/src/target/target.c index 4ea445f..89fee4a 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -1021,6 +1021,10 @@ int target_read_memory(struct target *target, LOG_ERROR("Target not examined yet"); return ERROR_FAIL; } + if (!target->type->read_memory) { + LOG_ERROR("Target %s doesn't support read_memory", target_name(target)); + return ERROR_FAIL; + } return target->type->read_memory(target, address, size, count, buffer); } @@ -1031,6 +1035,10 @@ int target_read_phys_memory(struct target *target, LOG_ERROR("Target not examined yet"); return ERROR_FAIL; } + if (!target->type->read_phys_memory) { + LOG_ERROR("Target %s doesn't support read_phys_memory", target_name(target)); + return ERROR_FAIL; + } return target->type->read_phys_memory(target, address, size, count, buffer); } @@ -1041,6 +1049,10 @@ int target_write_memory(struct target *target, LOG_ERROR("Target not examined yet"); return ERROR_FAIL; } + if (!target->type->write_memory) { + LOG_ERROR("Target %s doesn't support write_memory", target_name(target)); + return ERROR_FAIL; + } return target->type->write_memory(target, address, size, count, buffer); } @@ -1051,6 +1063,10 @@ int target_write_phys_memory(struct target *target, LOG_ERROR("Target not examined yet"); return ERROR_FAIL; } + if (!target->type->write_phys_memory) { + LOG_ERROR("Target %s doesn't support write_phys_memory", target_name(target)); + return ERROR_FAIL; + } return target->type->write_phys_memory(target, address, size, count, buffer); } @@ -1172,20 +1188,6 @@ static void target_reset_examined(struct target *target) target->examined = false; } -static int err_read_phys_memory(struct target *target, uint32_t address, - uint32_t size, uint32_t count, uint8_t *buffer) -{ - LOG_ERROR("Not implemented: %s", __func__); - return ERROR_FAIL; -} - -static int err_write_phys_memory(struct target *target, uint32_t address, - uint32_t size, uint32_t count, const uint8_t *buffer) -{ - LOG_ERROR("Not implemented: %s", __func__); - return ERROR_FAIL; -} - static int handle_target(void *priv); static int target_init_one(struct command_context *cmd_ctx, @@ -1212,16 +1214,6 @@ static int target_init_one(struct command_context *cmd_ctx, * implement it in stages, but warn if we need to do so. */ if (type->mmu) { - if (type->write_phys_memory == NULL) { - LOG_ERROR("type '%s' is missing write_phys_memory", - type->name); - type->write_phys_memory = err_write_phys_memory; - } - if (type->read_phys_memory == NULL) { - LOG_ERROR("type '%s' is missing read_phys_memory", - type->name); - type->read_phys_memory = err_read_phys_memory; - } if (type->virt2phys == NULL) { LOG_ERROR("type '%s' is missing virt2phys", type->name); type->virt2phys = identity_virt2phys; |