#include "jtag.h"
-static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
-static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
-static int jim_target(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv);
static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv);
return retval;
}
-static int default_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical)
+static int identity_virt2phys(struct target_s *target,
+ uint32_t virtual, uint32_t *physical)
{
*physical = virtual;
return ERROR_OK;
}
-static int default_mmu(struct target_s *target, int *enabled)
+static int no_mmu(struct target_s *target, int *enabled)
{
- LOG_ERROR("Not implemented.");
- return ERROR_FAIL;
-}
-
-static int default_has_mmu(struct target_s *target, bool *has_mmu)
-{
- *has_mmu = true;
+ *enabled = 0;
return ERROR_OK;
}
static int default_mrc(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
{
- LOG_ERROR("Not implemented");
+ LOG_ERROR("Not implemented: %s", __func__);
return ERROR_FAIL;
}
static int default_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
{
- LOG_ERROR("Not implemented");
+ LOG_ERROR("Not implemented: %s", __func__);
return ERROR_FAIL;
}
return target->type->mcr(target, cpnum, op1, op2, CRn, CRm, value);
}
-static int default_read_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+static int
+err_read_phys_memory(struct target_s *target, uint32_t address,
+ uint32_t size, uint32_t count, uint8_t *buffer)
{
- int retval;
- bool mmu;
- retval = target->type->has_mmu(target, &mmu);
- if (retval != ERROR_OK)
- return retval;
- if (mmu)
- {
- LOG_ERROR("Not implemented");
- return ERROR_FAIL;
- }
- return target_read_memory(target, address, size, count, buffer);
+ LOG_ERROR("Not implemented: %s", __func__);
+ return ERROR_FAIL;
}
-static int default_write_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+static int
+err_write_phys_memory(struct target_s *target, uint32_t address,
+ uint32_t size, uint32_t count, uint8_t *buffer)
{
- int retval;
- bool mmu;
- retval = target->type->has_mmu(target, &mmu);
- if (retval != ERROR_OK)
- return retval;
- if (mmu)
- {
- LOG_ERROR("Not implemented");
- return ERROR_FAIL;
- }
- return target_write_memory(target, address, size, count, buffer);
+ LOG_ERROR("Not implemented: %s", __func__);
+ return ERROR_FAIL;
}
-
int target_init(struct command_context_s *cmd_ctx)
{
- target_t *target = all_targets;
+ struct target_s *target;
int retval;
- while (target)
- {
+ for (target = all_targets; target; target = target->next) {
+ struct target_type_s *type = target->type;
+
target_reset_examined(target);
if (target->type->examine == NULL)
{
return retval;
}
- /* Set up default functions if none are provided by target */
- if (target->type->virt2phys == NULL)
- {
- target->type->virt2phys = default_virt2phys;
- }
-
- if (target->type->read_phys_memory == NULL)
- {
- target->type->read_phys_memory = default_read_phys_memory;
- }
-
- if (target->type->write_phys_memory == NULL)
- {
- target->type->write_phys_memory = default_write_phys_memory;
- }
-
+ /**
+ * @todo MCR/MRC are ARM-specific; don't require them in
+ * all targets, or for ARMs without coprocessors.
+ */
if (target->type->mcr == NULL)
{
target->type->mcr = default_mcr;
}
+ /**
+ * @todo get rid of those *memory_imp() methods, now that all
+ * callers are using target_*_memory() accessors ... and make
+ * sure the "physical" paths handle the same issues.
+ */
+
/* a non-invasive way(in terms of patches) to add some code that
* runs before the type->write/read_memory implementation
*/
target->type->run_algorithm_imp = target->type->run_algorithm;
target->type->run_algorithm = target_run_algorithm_imp;
- if (target->type->mmu == NULL)
- {
- target->type->mmu = default_mmu;
- }
- if (target->type->has_mmu == NULL)
- {
- target->type->has_mmu = default_has_mmu;
+ /* Sanity-check MMU support ... stub in what we must, to help
+ * implement it in stages, but warn if we need to do so.
+ */
+ if (type->mmu) {
+ if (type->write_phys_memory == NULL) {
+ LOG_ERROR("type '%s' is missing %s",
+ type->name,
+ "write_phys_memory");
+ type->write_phys_memory = err_write_phys_memory;
+ }
+ if (type->read_phys_memory == NULL) {
+ LOG_ERROR("type '%s' is missing %s",
+ type->name,
+ "read_phys_memory");
+ type->read_phys_memory = err_read_phys_memory;
+ }
+ if (type->virt2phys == NULL) {
+ LOG_ERROR("type '%s' is missing %s",
+ type->name,
+ "virt2phys");
+ type->virt2phys = identity_virt2phys;
+ }
+
+ /* Make sure no-MMU targets all behave the same: make no
+ * distinction between physical and virtual addresses, and
+ * ensure that virt2phys() is always an identity mapping.
+ */
+ } else {
+ if (type->write_phys_memory
+ || type->read_phys_memory
+ || type->virt2phys)
+ LOG_WARNING("type '%s' has broken MMU hooks",
+ type->name);
+
+ type->mmu = no_mmu;
+ type->write_phys_memory = type->write_memory;
+ type->read_phys_memory = type->read_memory;
+ type->virt2phys = identity_virt2phys;
}
- target = target->next;
}
if (all_targets)
target_free_all_working_areas_restore(target, 1);
}
-int target_register_commands(struct command_context_s *cmd_ctx)
-{
-
- register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, "change the current command line target (one parameter) or lists targets (with no parameter)");
-
-
-
-
- register_jim(cmd_ctx, "target", jim_target, "configure target");
-
- return ERROR_OK;
-}
-
int target_arch_state(struct target_s *target)
{
int retval;
return retval;
}
-int target_register_user_commands(struct command_context_s *cmd_ctx)
-{
- int retval = ERROR_OK;
-
-
- /* script procedures */
- register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "profiling samples the CPU PC");
- register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array, "read memory and return as a TCL array for script processing <ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
- register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem, "convert a TCL array to memory locations and write the values <ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
-
- register_command(cmd_ctx, NULL, "fast_load_image", handle_fast_load_image_command, COMMAND_ANY,
- "same args as load_image, image stored in memory - mainly for profiling purposes");
-
- register_command(cmd_ctx, NULL, "fast_load", handle_fast_load_command, COMMAND_ANY,
- "loads active fast load image to current target - mainly for profiling purposes");
-
-
- register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "translate a virtual address into a physical address");
- register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, "display or set a register");
- register_command(cmd_ctx, NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
- register_command(cmd_ctx, NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
- register_command(cmd_ctx, NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
- register_command(cmd_ctx, NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]");
- register_command(cmd_ctx, NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction from current PC or [addr]");
- register_command(cmd_ctx, NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run | halt | init] - default is run");
- register_command(cmd_ctx, NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset");
-
- register_command(cmd_ctx, NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words [phys] <addr> [count]");
- register_command(cmd_ctx, NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words [phys] <addr> [count]");
- register_command(cmd_ctx, NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes [phys] <addr> [count]");
-
- register_command(cmd_ctx, NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word [phys] <addr> <value> [count]");
- register_command(cmd_ctx, NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word [phys] <addr> <value> [count]");
- register_command(cmd_ctx, NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte [phys] <addr> <value> [count]");
-
- register_command(cmd_ctx, NULL, "bp",
- handle_bp_command, COMMAND_EXEC,
- "list or set breakpoint [<address> <length> [hw]]");
- register_command(cmd_ctx, NULL, "rbp",
- handle_rbp_command, COMMAND_EXEC,
- "remove breakpoint <address>");
- register_command(cmd_ctx, NULL, "wp",
- handle_wp_command, COMMAND_EXEC,
- "list or set watchpoint "
- "[<address> <length> <r/w/a> [value] [mask]]");
- register_command(cmd_ctx, NULL, "rwp",
- handle_rwp_command, COMMAND_EXEC,
- "remove watchpoint <address>");
-
- register_command(cmd_ctx, NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]");
- register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
- register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]");
- register_command(cmd_ctx, NULL, "test_image", handle_test_image_command, COMMAND_EXEC, "test_image <file> [offset] [type]");
-
- if ((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK)
- return retval;
- if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
- return retval;
-
- return retval;
-}
-
static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
target_t *target = all_targets;
}
/* Dump a gmon.out histogram file. */
-static void writeGmon(uint32_t *samples, uint32_t sampleNum, char *filename)
+static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filename)
{
uint32_t i;
FILE *f = fopen(filename, "w");
return JIM_OK;
}
+
+int target_register_commands(struct command_context_s *cmd_ctx)
+{
+
+ register_command(cmd_ctx, NULL, "targets",
+ handle_targets_command, COMMAND_EXEC,
+ "change current command line target (one parameter) "
+ "or list targets (no parameters)");
+
+ register_jim(cmd_ctx, "target", jim_target, "configure target");
+
+ return ERROR_OK;
+}
+
+int target_register_user_commands(struct command_context_s *cmd_ctx)
+{
+ int retval = ERROR_OK;
+ if ((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK)
+ return retval;
+
+ if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
+ return retval;
+
+ register_command(cmd_ctx, NULL, "profile",
+ handle_profile_command, COMMAND_EXEC,
+ "profiling samples the CPU PC");
+
+ register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array,
+ "read memory and return as a TCL array for script processing "
+ "<ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
+
+ register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem,
+ "convert a TCL array to memory locations and write the values "
+ "<ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
+
+ register_command(cmd_ctx, NULL, "fast_load_image",
+ handle_fast_load_image_command, COMMAND_ANY,
+ "same args as load_image, image stored in memory "
+ "- mainly for profiling purposes");
+
+ register_command(cmd_ctx, NULL, "fast_load",
+ handle_fast_load_command, COMMAND_ANY,
+ "loads active fast load image to current target "
+ "- mainly for profiling purposes");
+
+ /** @todo don't register virt2phys() unless target supports it */
+ register_command(cmd_ctx, NULL, "virt2phys",
+ handle_virt2phys_command, COMMAND_ANY,
+ "translate a virtual address into a physical address");
+
+ register_command(cmd_ctx, NULL, "reg",
+ handle_reg_command, COMMAND_EXEC,
+ "display or set a register");
+
+ register_command(cmd_ctx, NULL, "poll",
+ handle_poll_command, COMMAND_EXEC,
+ "poll target state");
+ register_command(cmd_ctx, NULL, "wait_halt",
+ handle_wait_halt_command, COMMAND_EXEC,
+ "wait for target halt [time (s)]");
+ register_command(cmd_ctx, NULL, "halt",
+ handle_halt_command, COMMAND_EXEC,
+ "halt target");
+ register_command(cmd_ctx, NULL, "resume",
+ handle_resume_command, COMMAND_EXEC,
+ "resume target [addr]");
+ register_command(cmd_ctx, NULL, "reset",
+ handle_reset_command, COMMAND_EXEC,
+ "reset target [run | halt | init] - default is run");
+ register_command(cmd_ctx, NULL, "soft_reset_halt",
+ handle_soft_reset_halt_command, COMMAND_EXEC,
+ "halt the target and do a soft reset");
+
+ register_command(cmd_ctx, NULL, "step",
+ handle_step_command, COMMAND_EXEC,
+ "step one instruction from current PC or [addr]");
+
+ register_command(cmd_ctx, NULL, "mdw",
+ handle_md_command, COMMAND_EXEC,
+ "display memory words [phys] <addr> [count]");
+ register_command(cmd_ctx, NULL, "mdh",
+ handle_md_command, COMMAND_EXEC,
+ "display memory half-words [phys] <addr> [count]");
+ register_command(cmd_ctx, NULL, "mdb",
+ handle_md_command, COMMAND_EXEC,
+ "display memory bytes [phys] <addr> [count]");
+
+ register_command(cmd_ctx, NULL, "mww",
+ handle_mw_command, COMMAND_EXEC,
+ "write memory word [phys] <addr> <value> [count]");
+ register_command(cmd_ctx, NULL, "mwh",
+ handle_mw_command, COMMAND_EXEC,
+ "write memory half-word [phys] <addr> <value> [count]");
+ register_command(cmd_ctx, NULL, "mwb",
+ handle_mw_command, COMMAND_EXEC,
+ "write memory byte [phys] <addr> <value> [count]");
+
+ register_command(cmd_ctx, NULL, "bp",
+ handle_bp_command, COMMAND_EXEC,
+ "list or set breakpoint [<address> <length> [hw]]");
+ register_command(cmd_ctx, NULL, "rbp",
+ handle_rbp_command, COMMAND_EXEC,
+ "remove breakpoint <address>");
+
+ register_command(cmd_ctx, NULL, "wp",
+ handle_wp_command, COMMAND_EXEC,
+ "list or set watchpoint "
+ "[<address> <length> <r/w/a> [value] [mask]]");
+ register_command(cmd_ctx, NULL, "rwp",
+ handle_rwp_command, COMMAND_EXEC,
+ "remove watchpoint <address>");
+
+ register_command(cmd_ctx, NULL, "load_image",
+ handle_load_image_command, COMMAND_EXEC,
+ "load_image <file> <address> "
+ "['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]");
+ register_command(cmd_ctx, NULL, "dump_image",
+ handle_dump_image_command, COMMAND_EXEC,
+ "dump_image <file> <address> <size>");
+ register_command(cmd_ctx, NULL, "verify_image",
+ handle_verify_image_command, COMMAND_EXEC,
+ "verify_image <file> [offset] [type]");
+ register_command(cmd_ctx, NULL, "test_image",
+ handle_test_image_command, COMMAND_EXEC,
+ "test_image <file> [offset] [type]");
+
+ return ERROR_OK;
+}