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:
parent
d37a10da52
commit
88fcb5a9ef
|
@ -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;
|
||||
}
|
||||
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,
|
||||
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.
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue