aboutsummaryrefslogtreecommitdiff
path: root/src/target/target.c
diff options
context:
space:
mode:
authorKarl Palsson <karlp@tweak.net.au>2015-05-31 13:36:13 +0000
committerSpencer Oliver <spen@spen-soft.co.uk>2015-08-06 13:07:09 +0100
commit4f1738388df4c6eed285e80ace50302daa3f5175 (patch)
tree64b5c77125dbdb8474036efd61b392c714433863 /src/target/target.c
parent79fdeb37f486f74658f1eaf658abac8efb3eba6a (diff)
downloadriscv-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/target/target.c')
-rw-r--r--src/target/target.c40
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;