Browse Source

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>
tags/v0.5.0-rc1
David Brownell 14 years ago
parent
commit
88fcb5a9ef
2 changed files with 33 additions and 19 deletions
  1. +33
    -17
      src/target/target.c
  2. +0
    -2
      src/target/target_type.h

+ 33
- 17
src/target/target.c View File

@@ -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.
*/


+ 0
- 2
src/target/target_type.h View File

@@ -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…
Cancel
Save