ETM: remove old mid-level ETM handle
[fw/openocd] / src / target / target.c
index 253a7e464efa8970a2263384a8c8268e20e2aaa2..575a99ce0beaf4770a58c2b3edb4526e581d1b12 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_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 jim_mcrmrc(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);
@@ -269,8 +242,6 @@ static int new_target_number(void)
        return x + 1;
 }
 
-static int target_continuous_poll = 1;
-
 /* read a uint32_t from a buffer in target memory endianness */
 uint32_t target_buffer_get_u32(target_t *target, const uint8_t *buffer)
 {
@@ -380,24 +351,57 @@ target_t* get_current_target(command_context_t *cmd_ctx)
 
 int target_poll(struct target_s *target)
 {
+       int retval;
+
        /* We can't poll until after examine */
        if (!target_was_examined(target))
        {
                /* Fail silently lest we pollute the log */
                return ERROR_FAIL;
        }
-       return target->type->poll(target);
+
+       retval = target->type->poll(target);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (target->halt_issued)
+       {
+               if (target->state == TARGET_HALTED)
+               {
+                       target->halt_issued = false;
+               } else
+               {
+                       long long t = timeval_ms() - target->halt_issued_time;
+                       if (t>1000)
+                       {
+                               target->halt_issued = false;
+                               LOG_INFO("Halt timed out, wake up GDB.");
+                               target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
+                       }
+               }
+       }
+
+       return ERROR_OK;
 }
 
 int target_halt(struct target_s *target)
 {
+       int retval;
        /* We can't poll until after examine */
        if (!target_was_examined(target))
        {
                LOG_ERROR("Target not examined yet");
                return ERROR_FAIL;
        }
-       return target->type->halt(target);
+
+       retval = target->type->halt(target);
+       if (retval != ERROR_OK)
+               return retval;
+
+       target->halt_issued = true;
+       target->halt_issued_time = timeval_ms();
+
+       return ERROR_OK;
 }
 
 int target_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
@@ -436,13 +440,14 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo
         * more predictable, i.e. dr/irscan & pathmove in events will
         * not have JTAG operations injected into the middle of a sequence.
         */
-       int save_poll = target_continuous_poll;
-       target_continuous_poll = 0;
+       bool save_poll = jtag_poll_get_enabled();
+
+       jtag_poll_set_enabled(false);
 
        sprintf(buf, "ocd_process_reset %s", n->name);
        retval = Jim_Eval(interp, buf);
 
-       target_continuous_poll = save_poll;
+       jtag_poll_set_enabled(save_poll);
 
        if (retval != JIM_OK) {
                Jim_PrintErrorMessage(interp);
@@ -455,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;
@@ -569,11 +575,24 @@ int target_read_memory(struct target_s *target,
        return target->type->read_memory(target, address, size, count, buffer);
 }
 
+int target_read_phys_memory(struct target_s *target,
+               uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+{
+       return target->type->read_phys_memory(target, address, size, count, buffer);
+}
+
 int target_write_memory(struct target_s *target,
                uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        return target->type->write_memory(target, address, size, count, buffer);
 }
+
+int target_write_phys_memory(struct target_s *target,
+               uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+{
+       return target->type->write_phys_memory(target, address, size, count, buffer);
+}
+
 int target_bulk_write_memory(struct target_s *target,
                uint32_t address, uint32_t count, uint8_t *buffer)
 {
@@ -642,13 +661,107 @@ 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: %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: %s", __func__);
+       return ERROR_FAIL;
+}
+
+static int arm_cp_check(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm)
+{
+       /* basic check */
+       if (!target_was_examined(target))
+       {
+               LOG_ERROR("Target not examined yet");
+               return ERROR_FAIL;
+       }
+
+       if ((cpnum <0) || (cpnum > 15))
+       {
+               LOG_ERROR("Illegal co-processor %d", cpnum);
+               return ERROR_FAIL;
+       }
+
+       if (op1 > 7)
+       {
+               LOG_ERROR("Illegal op1");
+               return ERROR_FAIL;
+       }
+
+       if (op2 > 7)
+       {
+               LOG_ERROR("Illegal op2");
+               return ERROR_FAIL;
+       }
+
+       if (CRn > 15)
+       {
+               LOG_ERROR("Illegal CRn");
+               return ERROR_FAIL;
+       }
+
+       if (CRm > 15)
+       {
+               LOG_ERROR("Illegal CRm");
+               return ERROR_FAIL;
+       }
+
+       return ERROR_OK;
+}
+
+int target_mrc(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
+{
+       int retval;
+
+       retval = arm_cp_check(target, cpnum, op1, op2, CRn, CRm);
+       if (retval != ERROR_OK)
+               return retval;
+
+       return target->type->mrc(target, cpnum, op1, op2, CRn, CRm, value);
+}
+
+int target_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
+{
+       int retval;
+
+       retval = arm_cp_check(target, cpnum, op1, op2, CRn, CRm);
+       if (retval != ERROR_OK)
+               return retval;
+
+       return target->type->mcr(target, cpnum, op1, op2, CRn, CRm, value);
+}
+
+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: %s", __func__);
+       return ERROR_FAIL;
+}
+
+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: %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)
                {
@@ -661,12 +774,38 @@ 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)
+               /**
+                * @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->virt2phys = default_virt2phys;
+                       target->type->mcr = default_mcr;
+               } else
+               {
+                       /* FIX! multiple targets will generally register global commands
+                        * multiple times. Only register this one if *one* of the
+                        * targets need the command. Hmm... make it a command on the
+                        * Jim Tcl target object?
+                        */
+                       register_jim(cmd_ctx, "mcr", jim_mcrmrc, "write coprocessor <cpnum> <op1> <op2> <CRn> <CRm> <value>");
                }
-               target->type->virt2phys = default_virt2phys;
+
+               if (target->type->mrc == NULL)
+               {
+                       target->type->mrc = default_mrc;
+               } else
+               {
+                       register_jim(cmd_ctx, "mrc", jim_mcrmrc, "read coprocessor <cpnum> <op1> <op2> <CRn> <CRm>");
+               }
+
+
+               /**
+                * @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
                 */
@@ -679,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)
@@ -919,18 +1092,35 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
        {
                int retval;
                int enabled;
+
                retval = target->type->mmu(target, &enabled);
                if (retval != ERROR_OK)
                {
                        return retval;
                }
-               if (enabled)
-               {
-                       target->working_area = target->working_area_virt;
-               }
-               else
-               {
-                       target->working_area = target->working_area_phys;
+
+               if (!enabled) {
+                       if (target->working_area_phys_spec) {
+                               LOG_DEBUG("MMU disabled, using physical "
+                                       "address for working memory 0x%08x",
+                                       (unsigned)target->working_area_phys);
+                               target->working_area = target->working_area_phys;
+                       } else {
+                               LOG_ERROR("No working memory available. "
+                                       "Specify -work-area-phys to target.");
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+               } else {
+                       if (target->working_area_virt_spec) {
+                               LOG_DEBUG("MMU enabled, using virtual "
+                                       "address for working memory 0x%08x",
+                                       (unsigned)target->working_area_virt);
+                               target->working_area = target->working_area_virt;
+                       } else {
+                               LOG_ERROR("No working memory available. "
+                                       "Specify -work-area-virt to target.");
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
                }
        }
 
@@ -959,8 +1149,6 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
                uint32_t first_free = target->working_area;
                uint32_t free_size = target->working_area_size;
 
-               LOG_DEBUG("allocating new working area");
-
                c = target->working_areas;
                while (c)
                {
@@ -977,6 +1165,8 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
                        return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
                }
 
+               LOG_DEBUG("allocated new working area at address 0x%08x", (unsigned)first_free);
+
                new_wa = malloc(sizeof(working_area_t));
                new_wa->next = NULL;
                new_wa->size = size;
@@ -1066,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 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;
@@ -1473,68 +1650,6 @@ 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 <addr> [count]");
-       register_command(cmd_ctx,  NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words <addr> [count]");
-       register_command(cmd_ctx,  NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes <addr> [count]");
-
-       register_command(cmd_ctx,  NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word <addr> <value> [count]");
-       register_command(cmd_ctx,  NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word <addr> <value> [count]");
-       register_command(cmd_ctx,  NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte <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;
@@ -1726,7 +1841,7 @@ int handle_target(void *priv)
         * Skip targets that are currently disabled.
         */
        for (target_t *target = all_targets;
-                       target_continuous_poll && target;
+                       is_jtag_poll_safe() && target;
                        target = target->next)
        {
                if (!target->tap->enabled)
@@ -1768,6 +1883,8 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
                {
                        int i;
 
+                       command_print(cmd_ctx, "===== %s", cache->name);
+
                        for (i = 0, reg = cache->reg_list;
                                        i < cache->num_regs;
                                        i++, reg++, count++)
@@ -1800,9 +1917,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
        if ((args[0][0] >= '0') && (args[0][0] <= '9'))
        {
                unsigned num;
-               int retval = parse_uint(args[0], &num);
-               if (ERROR_OK != retval)
-                       return ERROR_COMMAND_SYNTAX_ERROR;
+               COMMAND_PARSE_NUMBER(uint, args[0], num);
 
                reg_cache_t *cache = target->reg_cache;
                count = 0;
@@ -1886,7 +2001,7 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha
        if (argc == 0)
        {
                command_print(cmd_ctx, "background polling: %s",
-                               target_continuous_poll ?  "on" : "off");
+                               jtag_poll_get_enabled() ? "on" : "off");
                command_print(cmd_ctx, "TAP: %s (%s)",
                                target->tap->dotted_name,
                                target->tap->enabled ? "enabled" : "disabled");
@@ -1902,11 +2017,11 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha
        {
                if (strcmp(args[0], "on") == 0)
                {
-                       target_continuous_poll = 1;
+                       jtag_poll_set_enabled(true);
                }
                else if (strcmp(args[0], "off") == 0)
                {
-                       target_continuous_poll = 0;
+                       jtag_poll_set_enabled(false);
                }
                else
                {
@@ -2056,9 +2171,7 @@ static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, c
        uint32_t addr = 0;
        if (argc == 1)
        {
-               int retval = parse_u32(args[0], &addr);
-               if (ERROR_OK != retval)
-                       return retval;
+               COMMAND_PARSE_NUMBER(u32, args[0], addr);
                current = 0;
        }
 
@@ -2079,9 +2192,7 @@ static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, cha
        int current_pc = 1;
        if (argc == 1)
        {
-               int retval = parse_u32(args[0], &addr);
-               if (ERROR_OK != retval)
-                       return retval;
+               COMMAND_PARSE_NUMBER(u32, args[0], addr);
                current_pc = 0;
        }
 
@@ -2152,24 +2263,34 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char
        default: return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
+       bool physical=strcmp(args[0], "phys")==0;
+       int (*fn)(struct target_s *target,
+                       uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+       if (physical)
+       {
+               argc--;
+               args++;
+               fn=target_read_phys_memory;
+       } else
+       {
+               fn=target_read_memory;
+       }
+       if ((argc < 1) || (argc > 2))
+       {
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+
        uint32_t address;
-       int retval = parse_u32(args[0], &address);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[0], address);
 
        unsigned count = 1;
        if (argc == 2)
-       {
-               retval = parse_uint(args[1], &count);
-               if (ERROR_OK != retval)
-                       return retval;
-       }
+               COMMAND_PARSE_NUMBER(uint, args[1], count);
 
        uint8_t *buffer = calloc(count, size);
 
        target_t *target = get_current_target(cmd_ctx);
-       retval = target_read_memory(target,
-                               address, size, count, buffer);
+       int retval = fn(target, address, size, count, buffer);
        if (ERROR_OK == retval)
                handle_md_output(cmd_ctx, target, address, size, count, buffer);
 
@@ -2180,26 +2301,34 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char
 
 static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-        if ((argc < 2) || (argc > 3))
+       if (argc < 2)
+       {
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+       bool physical=strcmp(args[0], "phys")==0;
+       int (*fn)(struct target_s *target,
+                       uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+       if (physical)
+       {
+               argc--;
+               args++;
+               fn=target_write_phys_memory;
+       } else
+       {
+               fn=target_write_memory;
+       }
+       if ((argc < 2) || (argc > 3))
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t address;
-       int retval = parse_u32(args[0], &address);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[0], address);
 
        uint32_t value;
-       retval = parse_u32(args[1], &value);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[1], value);
 
        unsigned count = 1;
        if (argc == 3)
-       {
-               retval = parse_uint(args[2], &count);
-               if (ERROR_OK != retval)
-                       return retval;
-       }
+               COMMAND_PARSE_NUMBER(uint, args[2], count);
 
        target_t *target = get_current_target(cmd_ctx);
        unsigned wordsize;
@@ -2223,7 +2352,7 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char
        }
        for (unsigned i = 0; i < count; i++)
        {
-               retval = target_write_memory(target,
+               int retval = fn(target,
                                address + i * wordsize, wordsize, 1, value_buf);
                if (ERROR_OK != retval)
                        return retval;
@@ -2234,8 +2363,9 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char
 
 }
 
-static int parse_load_image_command_args(char **args, int argc,
-               image_t *image, uint32_t *min_address, uint32_t *max_address)
+static int parse_load_image_command_args(struct command_context_s *cmd_ctx,
+               char **args, int argc, image_t *image,
+               uint32_t *min_address, uint32_t *max_address)
 {
        if (argc < 1 || argc > 5)
                return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2245,9 +2375,7 @@ static int parse_load_image_command_args(char **args, int argc,
        if (argc >= 2)
        {
                uint32_t addr;
-               int retval = parse_u32(args[1], &addr);
-               if (ERROR_OK != retval)
-                       return ERROR_COMMAND_SYNTAX_ERROR;
+               COMMAND_PARSE_NUMBER(u32, args[1], addr);
                image->base_address = addr;
                image->base_address_set = 1;
        }
@@ -2258,15 +2386,11 @@ static int parse_load_image_command_args(char **args, int argc,
 
        if (argc >= 4)
        {
-               int retval = parse_u32(args[3], min_address);
-               if (ERROR_OK != retval)
-                       return ERROR_COMMAND_SYNTAX_ERROR;
+               COMMAND_PARSE_NUMBER(u32, args[3], *min_address);
        }
        if (argc == 5)
        {
-               int retval = parse_u32(args[4], max_address);
-               if (ERROR_OK != retval)
-                       return ERROR_COMMAND_SYNTAX_ERROR;
+               COMMAND_PARSE_NUMBER(u32, args[4], *max_address);
                // use size (given) to find max (required)
                *max_address += *min_address;
        }
@@ -2285,20 +2409,17 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm
        uint32_t min_address = 0;
        uint32_t max_address = 0xffffffff;
        int i;
-       int retvaltemp;
-
        image_t image;
 
-       duration_t duration;
-       char *duration_text;
-
-       int retval = parse_load_image_command_args(args, argc,
+       int retval = parse_load_image_command_args(cmd_ctx, args, argc,
                        &image, &min_address, &max_address);
        if (ERROR_OK != retval)
                return retval;
 
        target_t *target = get_current_target(cmd_ctx);
-       duration_start_measure(&duration);
+
+       struct duration bench;
+       duration_start(&bench);
 
        if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
        {
@@ -2358,19 +2479,12 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm
                free(buffer);
        }
 
-       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
-       {
-               image_close(&image);
-               return retvaltemp;
-       }
-
-       if (retval == ERROR_OK)
+       if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "downloaded %u byte in %s",
-                                         (unsigned int)image_size,
-                                         duration_text);
+               command_print(cmd_ctx, "downloaded %" PRIu32 " bytes "
+                               "in %fs (%0.3f kb/s)", image_size,
+                               duration_elapsed(&bench), duration_kbps(&bench, image_size));
        }
-       free(duration_text);
 
        image_close(&image);
 
@@ -2385,8 +2499,6 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
        uint8_t buffer[560];
        int retvaltemp;
 
-       duration_t duration;
-       char *duration_text;
 
        target_t *target = get_current_target(cmd_ctx);
 
@@ -2397,27 +2509,23 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
        }
 
        uint32_t address;
-       int retval = parse_u32(args[1], &address);
-       if (ERROR_OK != retval)
-               return retval;
-
+       COMMAND_PARSE_NUMBER(u32, args[1], address);
        uint32_t size;
-       retval = parse_u32(args[2], &size);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[2], size);
 
        if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
        {
                return ERROR_OK;
        }
 
-       duration_start_measure(&duration);
+       struct duration bench;
+       duration_start(&bench);
 
+       int retval = ERROR_OK;
        while (size > 0)
        {
                uint32_t size_written;
                uint32_t this_run_size = (size > 560) ? 560 : size;
-
                retval = target_read_buffer(target, address, this_run_size, buffer);
                if (retval != ERROR_OK)
                {
@@ -2437,14 +2545,11 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
        if ((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
                return retvaltemp;
 
-       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
-               return retvaltemp;
-
-       if (retval == ERROR_OK)
+       if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "dumped %lld byte in %s",
-                               fileio.size, duration_text);
-               free(duration_text);
+               command_print(cmd_ctx,
+                               "dumped %lld bytes in %fs (%0.3f kb/s)", fileio.size,
+                               duration_elapsed(&bench), duration_kbps(&bench, fileio.size));
        }
 
        return retval;
@@ -2456,15 +2561,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
        uint32_t buf_cnt;
        uint32_t image_size;
        int i;
-       int retval, retvaltemp;
+       int retval;
        uint32_t checksum = 0;
        uint32_t mem_checksum = 0;
 
        image_t image;
 
-       duration_t duration;
-       char *duration_text;
-
        target_t *target = get_current_target(cmd_ctx);
 
        if (argc < 1)
@@ -2478,14 +2580,13 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
                return ERROR_FAIL;
        }
 
-       duration_start_measure(&duration);
+       struct duration bench;
+       duration_start(&bench);
 
        if (argc >= 2)
        {
                uint32_t addr;
-               retval = parse_u32(args[1], &addr);
-               if (ERROR_OK != retval)
-                       return ERROR_COMMAND_SYNTAX_ERROR;
+               COMMAND_PARSE_NUMBER(u32, args[1], addr);
                image.base_address = addr;
                image.base_address_set = 1;
        }
@@ -2587,20 +2688,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
                image_size += buf_cnt;
        }
 done:
-
-       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
-       {
-               image_close(&image);
-               return retvaltemp;
-       }
-
-       if (retval == ERROR_OK)
+       if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "verified %u bytes in %s",
-                                         (unsigned int)image_size,
-                                         duration_text);
+               command_print(cmd_ctx, "verified %" PRIu32 " bytes "
+                               "in %fs (%0.3f kb/s)", image_size,
+                               duration_elapsed(&bench), duration_kbps(&bench, image_size));
        }
-       free(duration_text);
 
        image_close(&image);
 
@@ -2670,14 +2763,9 @@ static int handle_bp_command(struct command_context_s *cmd_ctx,
        }
 
        uint32_t addr;
-       int retval = parse_u32(args[0], &addr);
-       if (ERROR_OK != retval)
-               return retval;
-
+       COMMAND_PARSE_NUMBER(u32, args[0], addr);
        uint32_t length;
-       retval = parse_u32(args[1], &length);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[1], length);
 
        int hw = BKPT_SOFT;
        if (argc == 3)
@@ -2697,9 +2785,7 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t addr;
-       int retval = parse_u32(args[0], &addr);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[0], addr);
 
        target_t *target = get_current_target(cmd_ctx);
        breakpoint_remove(target, addr);
@@ -2734,19 +2820,14 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char
        uint32_t length = 0;
        uint32_t data_value = 0x0;
        uint32_t data_mask = 0xffffffff;
-       int retval;
 
        switch (argc)
        {
        case 5:
-               retval = parse_u32(args[4], &data_mask);
-               if (ERROR_OK != retval)
-                       return retval;
+               COMMAND_PARSE_NUMBER(u32, args[4], data_mask);
                // fall through
        case 4:
-               retval = parse_u32(args[3], &data_value);
-               if (ERROR_OK != retval)
-                       return retval;
+               COMMAND_PARSE_NUMBER(u32, args[3], data_value);
                // fall through
        case 3:
                switch (args[2][0])
@@ -2766,20 +2847,17 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char
                }
                // fall through
        case 2:
-               retval = parse_u32(args[1], &length);
-               if (ERROR_OK != retval)
-                       return retval;
-               retval = parse_u32(args[0], &addr);
-               if (ERROR_OK != retval)
-                       return retval;
+               COMMAND_PARSE_NUMBER(u32, args[1], length);
+               COMMAND_PARSE_NUMBER(u32, args[0], addr);
                break;
 
        default:
-               command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
+               command_print(cmd_ctx, "usage: wp [address length "
+                               "[(r|w|a) [value [mask]]]]");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       retval = watchpoint_add(target, addr, length, type,
+       int retval = watchpoint_add(target, addr, length, type,
                        data_value, data_mask);
        if (ERROR_OK != retval)
                LOG_ERROR("Failure setting watchpoints");
@@ -2793,9 +2871,7 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t addr;
-       int retval = parse_u32(args[0], &addr);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[0], addr);
 
        target_t *target = get_current_target(cmd_ctx);
        watchpoint_remove(target, addr);
@@ -2817,13 +2893,11 @@ static int handle_virt2phys_command(command_context_t *cmd_ctx,
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t va;
-       int retval = parse_u32(args[0], &va);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(u32, args[0], va);
        uint32_t pa;
 
        target_t *target = get_current_target(cmd_ctx);
-       retval = target->type->virt2phys(target, va, &pa);
+       int retval = target->type->virt2phys(target, va, &pa);
        if (retval == ERROR_OK)
                command_print(cmd_ctx, "Physical address 0x%08" PRIx32 "", pa);
 
@@ -2854,7 +2928,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");
@@ -2958,9 +3032,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
        unsigned offset;
-       int retval = parse_uint(args[0], &offset);
-       if (ERROR_OK != retval)
-               return retval;
+       COMMAND_PARSE_NUMBER(uint, args[0], offset);
 
        timeval_add_time(&timeout, offset, 0);
 
@@ -2977,6 +3049,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
 
        for (;;)
        {
+               int retval;
                target_poll(target);
                if (target->state == TARGET_HALTED)
                {
@@ -3267,7 +3340,6 @@ static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
        return target_array2mem(interp,target, argc-1, argv + 1);
 }
-
 static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
 {
        long l;
@@ -3420,6 +3492,10 @@ void target_all_handle_event(enum target_event e)
        }
 }
 
+
+/* FIX? should we propagate errors here rather than printing them
+ * and continuing?
+ */
 void target_handle_event(target_t *target, enum target_event e)
 {
        target_event_action_t *teap;
@@ -3603,6 +3679,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
                                        return e;
                                }
                                target->working_area_virt = w;
+                               target->working_area_virt_spec = true;
                        } else {
                                if (goi->argc != 0) {
                                        goto no_params;
@@ -3620,6 +3697,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
                                        return e;
                                }
                                target->working_area_phys = w;
+                               target->working_area_phys_spec = true;
                        } else {
                                if (goi->argc != 0) {
                                        goto no_params;
@@ -4061,11 +4139,11 @@ static int tcl_target_func(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
                /* do the assert */
                if (n->value == NVP_ASSERT) {
-                       target->type->assert_reset(target);
+                       e = target->type->assert_reset(target);
                } else {
-                       target->type->deassert_reset(target);
+                       e = target->type->deassert_reset(target);
                }
-               return JIM_OK;
+               return (e == ERROR_OK) ? JIM_OK : JIM_ERR;
        case TS_CMD_HALT:
                if (goi.argc) {
                        Jim_WrongNumArgs(goi.interp, 0, argv, "halt [no parameters]");
@@ -4073,8 +4151,8 @@ static int tcl_target_func(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                }
                if (!target->tap->enabled)
                        goto err_tap_disabled;
-               target->type->halt(target);
-               return JIM_OK;
+               e = target->type->halt(target);
+               return (e == ERROR_OK) ? JIM_OK : JIM_ERR;
        case TS_CMD_WAITSTATE:
                /* params:  <name>  statename timeoutmsecs */
                if (goi.argc != 2) {
@@ -4237,6 +4315,8 @@ static int target_create(Jim_GetOptInfo *goi)
 
        target->display             = 1;
 
+       target->halt_issued                     = false;
+
        /* initialize trace information */
        target->trace_info = malloc(sizeof(trace_t));
        target->trace_info->num_trace_points         = 0;
@@ -4470,15 +4550,13 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
 
        image_t image;
 
-       duration_t duration;
-       char *duration_text;
-
-       int retval = parse_load_image_command_args(args, argc,
+       int retval = parse_load_image_command_args(cmd_ctx, args, argc,
                        &image, &min_address, &max_address);
        if (ERROR_OK != retval)
                return retval;
 
-       duration_start_measure(&duration);
+       struct duration bench;
+       duration_start(&bench);
 
        if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
        {
@@ -4551,13 +4629,16 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
                free(buffer);
        }
 
-       duration_stop_measure(&duration, &duration_text);
-       if (retval == ERROR_OK)
+       if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "Loaded %u bytes in %s", (unsigned int)image_size, duration_text);
-               command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so.");
+               command_print(cmd_ctx, "Loaded %" PRIu32 " bytes "
+                               "in %fs (%0.3f kb/s)", image_size, 
+                               duration_elapsed(&bench), duration_kbps(&bench, image_size));
+
+               command_print(cmd_ctx,
+                               "WARNING: image has not been loaded to target!"
+                               "You can issue a 'fast_load' to finish loading.");
        }
-       free(duration_text);
 
        image_close(&image);
 
@@ -4599,10 +4680,216 @@ static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd
        return retval;
 }
 
+static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       command_context_t *context;
+       target_t *target;
+       int retval;
 
-/*
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- */
+       context = Jim_GetAssocData(interp, "context");
+       if (context == NULL) {
+               LOG_ERROR("array2mem: no command context");
+               return JIM_ERR;
+       }
+       target = get_current_target(context);
+       if (target == NULL) {
+               LOG_ERROR("array2mem: no current target");
+               return JIM_ERR;
+       }
+
+       if ((argc < 6) || (argc > 7))
+       {
+               return JIM_ERR;
+       }
+
+       int cpnum;
+       uint32_t op1;
+       uint32_t op2;
+       uint32_t CRn;
+       uint32_t CRm;
+       uint32_t value;
+
+       int e;
+       long l;
+       e = Jim_GetLong(interp, argv[1], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       cpnum = l;
+
+       e = Jim_GetLong(interp, argv[2], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       op1 = l;
+
+       e = Jim_GetLong(interp, argv[3], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       CRn = l;
+
+       e = Jim_GetLong(interp, argv[4], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       CRm = l;
+
+       e = Jim_GetLong(interp, argv[5], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       op2 = l;
+
+       value = 0;
+
+       if (argc == 7)
+       {
+               e = Jim_GetLong(interp, argv[6], &l);
+               if (e != JIM_OK) {
+                       return e;
+               }
+               value = l;
+
+               retval = target_mcr(target, cpnum, op1, op2, CRn, CRm, value);
+               if (retval != ERROR_OK)
+                       return JIM_ERR;
+       } else
+       {
+               retval = target_mrc(target, cpnum, op1, op2, CRn, CRm, &value);
+               if (retval != ERROR_OK)
+                       return JIM_ERR;
+
+               Jim_SetResult(interp, Jim_NewIntObj(interp, value));
+       }
+
+       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;
+}