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>
This commit is contained in:
David Brownell 2010-04-04 00:38:39 -07:00
parent d37a10da52
commit 88fcb5a9ef
2 changed files with 33 additions and 19 deletions

View File

@ -629,16 +629,46 @@ static int target_soft_reset_halt_imp(struct target *target)
return target->type->soft_reset_halt_imp(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)) if (!target_was_examined(target))
{ {
LOG_ERROR("Target not examined yet"); LOG_ERROR("Target not examined yet");
return ERROR_FAIL; 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); if (target->type->run_algorithm) {
LOG_ERROR("Target type '%s' does not support %s",
target_type_name(target), __func__);
goto done;
}
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, int target_read_memory(struct target *target,
uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) 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. * Reset the @c examined flag for the given target.
* Pure paranoia -- targets are zeroed on allocation. * 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_imp = target->type->soft_reset_halt;
type->soft_reset_halt = target_soft_reset_halt_imp; 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 /* Sanity-check MMU support ... stub in what we must, to help
* implement it in stages, but warn if we need to do so. * implement it in stages, but warn if we need to do so.
*/ */

View File

@ -146,8 +146,6 @@ struct target_type
*/ */
int (*remove_watchpoint)(struct target *target, struct watchpoint *watchpoint); 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, * Target algorithm support. Do @b not call this method directly,
* use target_run_algorithm() instead. * use target_run_algorithm() instead.