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);
|
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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue