target_event_action_t -> struct target_event_action
[openocd.git] / src / target / target.c
index 6e5d3fb..e46dec9 100644 (file)
 #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);
@@ -114,8 +86,8 @@ target_type_t *target_types[] =
 };
 
 target_t *all_targets = NULL;
-target_event_callback_t *target_event_callbacks = NULL;
-target_timer_callback_t *target_timer_callbacks = NULL;
+struct target_event_callback *target_event_callbacks = NULL;
+struct target_timer_callback *target_timer_callbacks = NULL;
 
 const Jim_Nvp nvp_assert[] = {
        { .name = "assert", NVP_ASSERT },
@@ -488,13 +460,14 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo
        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)
 {
        *enabled = 0;
        return ERROR_OK;
@@ -586,7 +559,7 @@ static int target_soft_reset_halt_imp(struct target_s *target)
        return target->type->soft_reset_halt_imp(target);
 }
 
-static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info)
+static int target_run_algorithm_imp(struct target_s *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)
 {
        if (!target_was_examined(target))
        {
@@ -638,12 +611,12 @@ int target_remove_breakpoint(struct target_s *target,
 }
 
 int target_add_watchpoint(struct target_s *target,
-               struct watchpoint_s *watchpoint)
+               struct watchpoint *watchpoint)
 {
        return target->type->add_watchpoint(target, watchpoint);
 }
 int target_remove_watchpoint(struct target_s *target,
-               struct watchpoint_s *watchpoint)
+               struct watchpoint *watchpoint)
 {
        return target->type->remove_watchpoint(target, watchpoint);
 }
@@ -661,8 +634,8 @@ int target_step(struct target_s *target,
 
 
 int target_run_algorithm(struct target_s *target,
-               int num_mem_params, mem_param_t *mem_params,
-               int num_reg_params, reg_param_t *reg_param,
+               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)
 {
@@ -691,13 +664,13 @@ void target_reset_examined(struct target_s *target)
 
 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;
 }
 
@@ -765,26 +738,30 @@ int target_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, u
        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)
 {
-       LOG_ERROR("Not implemented");
+       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)
 {
-       LOG_ERROR("Not implemented");
+       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)
                {
@@ -797,22 +774,10 @@ int target_init(struct command_context_s *cmd_ctx)
                        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;
@@ -835,6 +800,12 @@ int target_init(struct command_context_s *cmd_ctx)
                }
 
 
+               /**
+                * @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
                 */
@@ -847,11 +818,45 @@ int target_init(struct command_context_s *cmd_ctx)
                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;
+               /* 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)
@@ -867,7 +872,7 @@ int target_init(struct command_context_s *cmd_ctx)
 
 int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
 {
-       target_event_callback_t **callbacks_p = &target_event_callbacks;
+       struct target_event_callback **callbacks_p = &target_event_callbacks;
 
        if (callback == NULL)
        {
@@ -881,7 +886,7 @@ int target_register_event_callback(int (*callback)(struct target_s *target, enum
                callbacks_p = &((*callbacks_p)->next);
        }
 
-       (*callbacks_p) = malloc(sizeof(target_event_callback_t));
+       (*callbacks_p) = malloc(sizeof(struct target_event_callback));
        (*callbacks_p)->callback = callback;
        (*callbacks_p)->priv = priv;
        (*callbacks_p)->next = NULL;
@@ -891,7 +896,7 @@ int target_register_event_callback(int (*callback)(struct target_s *target, enum
 
 int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
 {
-       target_timer_callback_t **callbacks_p = &target_timer_callbacks;
+       struct target_timer_callback **callbacks_p = &target_timer_callbacks;
        struct timeval now;
 
        if (callback == NULL)
@@ -906,7 +911,7 @@ int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int
                callbacks_p = &((*callbacks_p)->next);
        }
 
-       (*callbacks_p) = malloc(sizeof(target_timer_callback_t));
+       (*callbacks_p) = malloc(sizeof(struct target_timer_callback));
        (*callbacks_p)->callback = callback;
        (*callbacks_p)->periodic = periodic;
        (*callbacks_p)->time_ms = time_ms;
@@ -929,8 +934,8 @@ int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int
 
 int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
 {
-       target_event_callback_t **p = &target_event_callbacks;
-       target_event_callback_t *c = target_event_callbacks;
+       struct target_event_callback **p = &target_event_callbacks;
+       struct target_event_callback *c = target_event_callbacks;
 
        if (callback == NULL)
        {
@@ -939,7 +944,7 @@ int target_unregister_event_callback(int (*callback)(struct target_s *target, en
 
        while (c)
        {
-               target_event_callback_t *next = c->next;
+               struct target_event_callback *next = c->next;
                if ((c->callback == callback) && (c->priv == priv))
                {
                        *p = next;
@@ -956,8 +961,8 @@ int target_unregister_event_callback(int (*callback)(struct target_s *target, en
 
 int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
 {
-       target_timer_callback_t **p = &target_timer_callbacks;
-       target_timer_callback_t *c = target_timer_callbacks;
+       struct target_timer_callback **p = &target_timer_callbacks;
+       struct target_timer_callback *c = target_timer_callbacks;
 
        if (callback == NULL)
        {
@@ -966,7 +971,7 @@ int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
 
        while (c)
        {
-               target_timer_callback_t *next = c->next;
+               struct target_timer_callback *next = c->next;
                if ((c->callback == callback) && (c->priv == priv))
                {
                        *p = next;
@@ -983,8 +988,8 @@ int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
 
 int target_call_event_callbacks(target_t *target, enum target_event event)
 {
-       target_event_callback_t *callback = target_event_callbacks;
-       target_event_callback_t *next_callback;
+       struct target_event_callback *callback = target_event_callbacks;
+       struct target_event_callback *next_callback;
 
        if (event == TARGET_EVENT_HALTED)
        {
@@ -1009,7 +1014,7 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
 }
 
 static int target_timer_callback_periodic_restart(
-               target_timer_callback_t *cb, struct timeval *now)
+               struct target_timer_callback *cb, struct timeval *now)
 {
        int time_ms = cb->time_ms;
        cb->when.tv_usec = now->tv_usec + (time_ms % 1000) * 1000;
@@ -1023,7 +1028,7 @@ static int target_timer_callback_periodic_restart(
        return ERROR_OK;
 }
 
-static int target_call_timer_callback(target_timer_callback_t *cb,
+static int target_call_timer_callback(struct target_timer_callback *cb,
                struct timeval *now)
 {
        cb->callback(cb->priv);
@@ -1041,11 +1046,11 @@ static int target_call_timer_callbacks_check_time(int checktime)
        struct timeval now;
        gettimeofday(&now, NULL);
 
-       target_timer_callback_t *callback = target_timer_callbacks;
+       struct target_timer_callback *callback = target_timer_callbacks;
        while (callback)
        {
                // cleaning up may unregister and free this callback
-               target_timer_callback_t *next_callback = callback->next;
+               struct target_timer_callback *next_callback = callback->next;
 
                bool call_it = callback->callback &&
                        ((!checktime && callback->periodic) ||
@@ -1077,10 +1082,10 @@ int target_call_timer_callbacks_now(void)
        return target_call_timer_callbacks_check_time(0);
 }
 
-int target_alloc_working_area(struct target_s *target, uint32_t size, working_area_t **area)
+int target_alloc_working_area(struct target_s *target, uint32_t size, struct working_area **area)
 {
-       working_area_t *c = target->working_areas;
-       working_area_t *new_wa = NULL;
+       struct working_area *c = target->working_areas;
+       struct working_area *new_wa = NULL;
 
        /* Reevaluate working area address based on MMU state*/
        if (target->working_areas == NULL)
@@ -1140,7 +1145,7 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
        /* if not, allocate a new one */
        if (!new_wa)
        {
-               working_area_t **p = &target->working_areas;
+               struct working_area **p = &target->working_areas;
                uint32_t first_free = target->working_area;
                uint32_t free_size = target->working_area_size;
 
@@ -1162,7 +1167,7 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
 
                LOG_DEBUG("allocated new working area at address 0x%08x", (unsigned)first_free);
 
-               new_wa = malloc(sizeof(working_area_t));
+               new_wa = malloc(sizeof(struct working_area));
                new_wa->next = NULL;
                new_wa->size = size;
                new_wa->address = first_free;
@@ -1197,7 +1202,7 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
        return ERROR_OK;
 }
 
-int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore)
+int target_free_working_area_restore(struct target_s *target, struct working_area *area, int restore)
 {
        if (area->free)
                return ERROR_OK;
@@ -1218,7 +1223,7 @@ int target_free_working_area_restore(struct target_s *target, working_area_t *ar
        return ERROR_OK;
 }
 
-int target_free_working_area(struct target_s *target, working_area_t *area)
+int target_free_working_area(struct target_s *target, struct working_area *area)
 {
        return target_free_working_area_restore(target, area, 1);
 }
@@ -1228,11 +1233,11 @@ int target_free_working_area(struct target_s *target, working_area_t *area)
  */
 void target_free_all_working_areas_restore(struct target_s *target, int restore)
 {
-       working_area_t *c = target->working_areas;
+       struct working_area *c = target->working_areas;
 
        while (c)
        {
-               working_area_t *next = c->next;
+               struct working_area *next = c->next;
                target_free_working_area_restore(target, c, restore);
 
                if (c->backup)
@@ -1251,19 +1256,6 @@ void target_free_all_working_areas(struct target_s *target)
        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 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_arch_state(struct target_s *target)
 {
        int retval;
@@ -1658,69 +1650,7 @@ int target_write_u8(struct target_s *target, uint32_t address, uint8_t value)
        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)
+COMMAND_HANDLER(handle_targets_command)
 {
        target_t *target = all_targets;
 
@@ -1932,7 +1862,7 @@ int handle_target(void *priv)
        return retval;
 }
 
-static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_reg_command)
 {
        target_t *target;
        reg_t *reg = NULL;
@@ -1946,7 +1876,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
        /* list all available registers for the current target */
        if (argc == 0)
        {
-               reg_cache_t *cache = target->reg_cache;
+               struct reg_cache *cache = target->reg_cache;
 
                count = 0;
                while (cache)
@@ -1989,7 +1919,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
                unsigned num;
                COMMAND_PARSE_NUMBER(uint, args[0], num);
 
-               reg_cache_t *cache = target->reg_cache;
+               struct reg_cache *cache = target->reg_cache;
                count = 0;
                while (cache)
                {
@@ -2031,7 +1961,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
 
                if (reg->valid == 0)
                {
-                       reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
+                       struct reg_arch_type *arch_type = register_get_arch_type(reg->arch_type);
                        arch_type->get(reg);
                }
                value = buf_to_str(reg->value, reg->size, 16);
@@ -2046,7 +1976,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
                uint8_t *buf = malloc(CEIL(reg->size, 8));
                str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
 
-               reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
+               struct reg_arch_type *arch_type = register_get_arch_type(reg->arch_type);
                arch_type->set(reg, buf);
 
                value = buf_to_str(reg->value, reg->size, 16);
@@ -2063,7 +1993,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
        return ERROR_OK;
 }
 
-static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_poll_command)
 {
        int retval = ERROR_OK;
        target_t *target = get_current_target(cmd_ctx);
@@ -2105,7 +2035,7 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha
        return retval;
 }
 
-static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_wait_halt_command)
 {
        if (argc > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2116,7 +2046,7 @@ static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd
                int retval = parse_uint(args[0], &ms);
                if (ERROR_OK != retval)
                {
-                       command_print(cmd_ctx, "usage: %s [seconds]", cmd);
+                       command_print(cmd_ctx, "usage: %s [seconds]", CMD_NAME);
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
                // convert seconds (given) to milliseconds (needed)
@@ -2172,7 +2102,7 @@ int target_wait_state(target_t *target, enum target_state state, int ms)
        return ERROR_OK;
 }
 
-static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_halt_command)
 {
        LOG_DEBUG("-");
 
@@ -2191,10 +2121,10 @@ static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, cha
                        return ERROR_OK;
        }
 
-       return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
+       return CALL_COMMAND_HANDLER(handle_wait_halt_command);
 }
 
-static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_soft_reset_halt_command)
 {
        target_t *target = get_current_target(cmd_ctx);
 
@@ -2205,7 +2135,7 @@ static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, cha
        return ERROR_OK;
 }
 
-static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_reset_command)
 {
        if (argc > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2226,7 +2156,7 @@ static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, ch
 }
 
 
-static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_resume_command)
 {
        int current = 1;
        if (argc > 1)
@@ -2248,7 +2178,7 @@ static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, c
        return target_resume(target, current, addr, 1, 0);
 }
 
-static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_step_command)
 {
        if (argc > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2320,13 +2250,13 @@ static void handle_md_output(struct command_context_s *cmd_ctx,
        }
 }
 
-static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_md_command)
 {
        if (argc < 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        unsigned size = 0;
-       switch (cmd[2]) {
+       switch (CMD_NAME[2]) {
        case 'w': size = 4; break;
        case 'h': size = 2; break;
        case 'b': size = 1; break;
@@ -2369,7 +2299,7 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char
        return retval;
 }
 
-static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_mw_command)
 {
        if (argc < 2)
        {
@@ -2403,7 +2333,7 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char
        target_t *target = get_current_target(cmd_ctx);
        unsigned wordsize;
        uint8_t value_buf[4];
-       switch (cmd[2])
+       switch (CMD_NAME[2])
        {
                case 'w':
                        wordsize = 4;
@@ -2433,8 +2363,7 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char
 
 }
 
-static int parse_load_image_command_args(struct command_context_s *cmd_ctx,
-               char **args, int argc, image_t *image,
+static COMMAND_HELPER(parse_load_image_command_args, image_t *image,
                uint32_t *min_address, uint32_t *max_address)
 {
        if (argc < 1 || argc > 5)
@@ -2471,7 +2400,7 @@ static int parse_load_image_command_args(struct command_context_s *cmd_ctx,
        return ERROR_OK;
 }
 
-static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_load_image_command)
 {
        uint8_t *buffer;
        uint32_t buf_cnt;
@@ -2481,7 +2410,7 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm
        int i;
        image_t image;
 
-       int retval = parse_load_image_command_args(cmd_ctx, args, argc,
+       int retval = CALL_COMMAND_HANDLER(parse_load_image_command_args,
                        &image, &min_address, &max_address);
        if (ERROR_OK != retval)
                return retval;
@@ -2562,9 +2491,9 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm
 
 }
 
-static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_dump_image_command)
 {
-       fileio_t fileio;
+       struct fileio fileio;
 
        uint8_t buffer[560];
        int retvaltemp;
@@ -2625,7 +2554,7 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
        return retval;
 }
 
-static int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify)
+static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
 {
        uint8_t *buffer;
        uint32_t buf_cnt;
@@ -2770,14 +2699,14 @@ done:
        return retval;
 }
 
-static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_verify_image_command)
 {
-       return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 1);
+       return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, 1);
 }
 
-static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_test_image_command)
 {
-       return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 0);
+       return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, 0);
 }
 
 static int handle_bp_command_list(struct command_context_s *cmd_ctx)
@@ -2820,8 +2749,7 @@ static int handle_bp_command_set(struct command_context_s *cmd_ctx,
        return retval;
 }
 
-static int handle_bp_command(struct command_context_s *cmd_ctx,
-               char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_bp_command)
 {
        if (argc == 0)
                return handle_bp_command_list(cmd_ctx);
@@ -2849,7 +2777,7 @@ static int handle_bp_command(struct command_context_s *cmd_ctx,
        return handle_bp_command_set(cmd_ctx, addr, length, hw);
 }
 
-static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_rbp_command)
 {
        if (argc != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2863,13 +2791,13 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char
        return ERROR_OK;
 }
 
-static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_wp_command)
 {
        target_t *target = get_current_target(cmd_ctx);
 
        if (argc == 0)
        {
-               watchpoint_t *watchpoint = target->watchpoints;
+               struct watchpoint *watchpoint = target->watchpoints;
 
                while (watchpoint)
                {
@@ -2935,7 +2863,7 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char
        return retval;
 }
 
-static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_rwp_command)
 {
        if (argc != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2956,8 +2884,7 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char
  * The low-level target implementation must have logged a detailed error
  * which is forwarded to telnet/GDB session.
  */
-static int handle_virt2phys_command(command_context_t *cmd_ctx,
-               char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_virt2phys_command)
 {
        if (argc != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2998,7 +2925,7 @@ static void writeString(FILE *f, char *s)
 }
 
 /* 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");
@@ -3091,7 +3018,7 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, char *filename)
 }
 
 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
-static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_profile_command)
 {
        target_t *target = get_current_target(cmd_ctx);
        struct timeval timeout, now;
@@ -3568,7 +3495,7 @@ void target_all_handle_event(enum target_event e)
  */
 void target_handle_event(target_t *target, enum target_event e)
 {
-       target_event_action_t *teap;
+       struct target_event_action *teap;
 
        for (teap = target->event_action; teap != NULL; teap = teap->next) {
                if (teap->event == e) {
@@ -3686,7 +3613,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
                        }
 
                        {
-                               target_event_action_t *teap;
+                               struct target_event_action *teap;
 
                                teap = target->event_action;
                                /* replace existing? */
@@ -3858,7 +3785,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
                case TCFG_CHAIN_POSITION:
                        if (goi->isconfigure) {
                                Jim_Obj *o;
-                               jtag_tap_t *tap;
+                               struct jtag_tap *tap;
                                target_free_all_working_areas(target);
                                e = Jim_GetOpt_Obj(goi, &o);
                                if (e != JIM_OK) {
@@ -4256,7 +4183,7 @@ static int tcl_target_func(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                 * scripts/programs should use 'name cget -event NAME'
                 */
                {
-                       target_event_action_t *teap;
+                       struct target_event_action *teap;
                        teap = target->event_action;
                        command_print(cmd_ctx, "Event actions for target (%d) %s\n",
                                                   target->target_number,
@@ -4609,7 +4536,7 @@ static void free_fastload(void)
 
 
 
-static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_fast_load_image_command)
 {
        uint8_t *buffer;
        uint32_t buf_cnt;
@@ -4620,7 +4547,7 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
 
        image_t image;
 
-       int retval = parse_load_image_command_args(cmd_ctx, args, argc,
+       int retval = CALL_COMMAND_HANDLER(parse_load_image_command_args,
                        &image, &min_address, &max_address);
        if (ERROR_OK != retval)
                return retval;
@@ -4720,7 +4647,7 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
        return retval;
 }
 
-static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_fast_load_command)
 {
        if (argc > 0)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -4835,3 +4762,131 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
        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;
+}