From 4f1738388df4c6eed285e80ace50302daa3f5175 Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Sun, 31 May 2015 13:36:13 +0000 Subject: [PATCH] target: check memory handlers before use for all types MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: http://openocd.zylin.com/2791 Tested-by: jenkins Reviewed-by: Spencer Oliver Reviewed-by: Andreas Färber --- src/target/target.c | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/target/target.c b/src/target/target.c index 4ea445fe93..89fee4aaa5 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; -- 2.30.2