From: Karl Palsson Date: Sun, 31 May 2015 13:36:13 +0000 (+0000) Subject: target: check memory handlers before use for all types X-Git-Tag: v0.10.0-rc1~472 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=4f1738388df4c6eed285e80ace50302daa3f5175;hp=79fdeb37f486f74658f1eaf658abac8efb3eba6a 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 Reviewed-on: http://openocd.zylin.com/2791 Tested-by: jenkins Reviewed-by: Spencer Oliver Reviewed-by: Andreas Färber --- 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;