summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2010-04-04 00:38:39 -0700
committerDavid Brownell <dbrownell@users.sourceforge.net>2010-04-04 00:38:39 -0700
commit88fcb5a9ef971e54166de7cd16a3b0be20113b82 (patch)
treea82b4df0999e3d4c72b0d1a0211de47b0495bea0 /src
parentd37a10da52bc8e6df4e3df2edd02ddbc29fe3bc4 (diff)
downloadopenocd+libswd-88fcb5a9ef971e54166de7cd16a3b0be20113b82.tar.gz
openocd+libswd-88fcb5a9ef971e54166de7cd16a3b0be20113b82.tar.bz2
openocd+libswd-88fcb5a9ef971e54166de7cd16a3b0be20113b82.tar.xz
openocd+libswd-88fcb5a9ef971e54166de7cd16a3b0be20113b82.zip
simplify and unconfuse target_run_algorithm()
For some reason there are *two* schemes for interposing logic into the run_algorithm() code path... One is a standard procedural wapper around the target method invocation. the other (superfluous) one hacked the method table by splicing a second procedural wrapper into the method table. Remove it: * Rename its slightly-more-featureful wrapper so it becomes the standard procedural wrapper, leaving its added logic (where it should have been in the first place. Also add a paranoia check, to report targets that don't support algorithms without traversing a NULL pointer, and tweak its code structure a bit so it's easier to modify. * Get rid of the superfluous/conusing method table hacks. This is a net simplification, making it simpler to analyse what's going on, and then interpose logic . ... by ensuring there's only one natural place for it to live. ------------ Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src')
-rw-r--r--src/target/target.c50
-rw-r--r--src/target/target_type.h2
2 files changed, 33 insertions, 19 deletions
diff --git a/src/target/target.c b/src/target/target.c
index 868241eb..75c41d38 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -629,16 +629,46 @@ static int target_soft_reset_halt_imp(struct target *target)
return target->type->soft_reset_halt_imp(target);
}
-static int target_run_algorithm_imp(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info)
+/**
+ * Downloads a target-specific native code algorithm to the target,
+ * and executes it. * Note that some targets may need to set up, enable,
+ * and tear down a breakpoint (hard or * soft) to detect algorithm
+ * termination, while others may support lower overhead schemes where
+ * soft breakpoints embedded in the algorithm automatically terminate the
+ * algorithm.
+ *
+ * @param target used to run the algorithm
+ * @param arch_info target-specific description of the algorithm.
+ */
+int target_run_algorithm(struct target *target,
+ int num_mem_params, struct mem_param *mem_params,
+ int num_reg_params, struct reg_param *reg_param,
+ uint32_t entry_point, uint32_t exit_point,
+ int timeout_ms, void *arch_info)
{
+ int retval = ERROR_FAIL;
+
if (!target_was_examined(target))
{
LOG_ERROR("Target not examined yet");
- return ERROR_FAIL;
+ goto done;
+ }
+ if (target->type->run_algorithm) {
+ LOG_ERROR("Target type '%s' does not support %s",
+ target_type_name(target), __func__);
+ goto done;
}
- return target->type->run_algorithm_imp(target, num_mem_params, mem_params, num_reg_params, reg_param, entry_point, exit_point, timeout_ms, arch_info);
+
+ retval = target->type->run_algorithm(target,
+ num_mem_params, mem_params,
+ num_reg_params, reg_param,
+ entry_point, exit_point, timeout_ms, arch_info);
+
+done:
+ return retval;
}
+
int target_read_memory(struct target *target,
uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
{
@@ -711,17 +741,6 @@ int target_step(struct target *target,
}
-int target_run_algorithm(struct target *target,
- int num_mem_params, struct mem_param *mem_params,
- int num_reg_params, struct reg_param *reg_param,
- uint32_t entry_point, uint32_t exit_point,
- int timeout_ms, void *arch_info)
-{
- return target->type->run_algorithm(target,
- num_mem_params, mem_params, num_reg_params, reg_param,
- entry_point, exit_point, timeout_ms, arch_info);
-}
-
/**
* Reset the @c examined flag for the given target.
* Pure paranoia -- targets are zeroed on allocation.
@@ -785,9 +804,6 @@ static int target_init_one(struct command_context *cmd_ctx,
type->soft_reset_halt_imp = target->type->soft_reset_halt;
type->soft_reset_halt = target_soft_reset_halt_imp;
- type->run_algorithm_imp = target->type->run_algorithm;
- type->run_algorithm = target_run_algorithm_imp;
-
/* Sanity-check MMU support ... stub in what we must, to help
* implement it in stages, but warn if we need to do so.
*/
diff --git a/src/target/target_type.h b/src/target/target_type.h
index 70eb9625..d3db8b55 100644
--- a/src/target/target_type.h
+++ b/src/target/target_type.h
@@ -146,8 +146,6 @@ struct target_type
*/
int (*remove_watchpoint)(struct target *target, struct watchpoint *watchpoint);
- /* target algorithm support */
- int (*run_algorithm_imp)(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info);
/**
* Target algorithm support. Do @b not call this method directly,
* use target_run_algorithm() instead.