watchpoint_add() cleanup
[openocd.git] / src / target / target.c
index 755752bd62656fa1587ddb16a54642091feb2da5..55fc2c8237ead31961d1a83aa5583bbcb2e5aeb9 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007-2009 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008, Duane Ellis                                       *
@@ -69,8 +69,9 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
 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 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);
@@ -82,7 +83,9 @@ extern target_type_t arm9tdmi_target;
 extern target_type_t arm920t_target;
 extern target_type_t arm966e_target;
 extern target_type_t arm926ejs_target;
+extern target_type_t fa526_target;
 extern target_type_t feroceon_target;
+extern target_type_t dragonite_target;
 extern target_type_t xscale_target;
 extern target_type_t cortexm3_target;
 extern target_type_t cortexa8_target;
@@ -98,7 +101,9 @@ target_type_t *target_types[] =
        &arm720t_target,
        &arm966e_target,
        &arm926ejs_target,
+       &fa526_target,
        &feroceon_target,
+       &dragonite_target,
        &xscale_target,
        &cortexm3_target,
        &cortexa8_target,
@@ -137,12 +142,12 @@ const Jim_Nvp nvp_error_target[] = {
        { .value = -1, .name = NULL }
 };
 
-const char *target_strerror_safe( int err )
+const char *target_strerror_safe(int err)
 {
        const Jim_Nvp *n;
 
-       n = Jim_Nvp_value2name_simple( nvp_error_target, err );
-       if( n->name == NULL ){
+       n = Jim_Nvp_value2name_simple(nvp_error_target, err);
+       if (n->name == NULL) {
                return "unknown";
        } else {
                return n->name;
@@ -153,7 +158,7 @@ static const Jim_Nvp nvp_target_event[] = {
        { .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
        { .value = TARGET_EVENT_OLD_pre_resume         , .name = "old-pre_resume" },
 
-       { .value = TARGET_EVENT_EARLY_HALTED, .name = "early-halted" },
+       { .value = TARGET_EVENT_GDB_HALT, .name = "gdb-halt" },
        { .value = TARGET_EVENT_HALTED, .name = "halted" },
        { .value = TARGET_EVENT_RESUMED, .name = "resumed" },
        { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
@@ -235,20 +240,16 @@ const Jim_Nvp nvp_reset_modes[] = {
        { .name = NULL     , .value = -1 },
 };
 
-static int max_target_number(void)
+const char *
+target_state_name( target_t *t )
 {
-       target_t *t;
-       int x;
-
-       x = -1;
-       t = all_targets;
-       while( t ){
-               if( x < t->target_number ){
-                       x = (t->target_number)+1;
-               }
-               t = t->next;
+       const char *cp;
+       cp = Jim_Nvp_value2name_simple(nvp_target_state, t->state)->name;
+       if( !cp ){
+               LOG_ERROR("Invalid target state: %d", (int)(t->state));
+               cp = "(*BUG*unknown*BUG*)";
        }
-       return x;
+       return cp;
 }
 
 /* determine the number of the new target */
@@ -260,19 +261,17 @@ static int new_target_number(void)
        /* number is 0 based */
        x = -1;
        t = all_targets;
-       while(t){
-               if( x < t->target_number ){
+       while (t) {
+               if (x < t->target_number) {
                        x = t->target_number;
                }
                t = t->next;
        }
-       return x+1;
+       return x + 1;
 }
 
-static int target_continous_poll = 1;
-
-/* read a u32 from a buffer in target memory endianness */
-u32 target_buffer_get_u32(target_t *target, const u8 *buffer)
+/* read a uint32_t from a buffer in target memory endianness */
+uint32_t target_buffer_get_u32(target_t *target, const uint8_t *buffer)
 {
        if (target->endianness == TARGET_LITTLE_ENDIAN)
                return le_to_h_u32(buffer);
@@ -280,8 +279,8 @@ u32 target_buffer_get_u32(target_t *target, const u8 *buffer)
                return be_to_h_u32(buffer);
 }
 
-/* read a u16 from a buffer in target memory endianness */
-u16 target_buffer_get_u16(target_t *target, const u8 *buffer)
+/* read a uint16_t from a buffer in target memory endianness */
+uint16_t target_buffer_get_u16(target_t *target, const uint8_t *buffer)
 {
        if (target->endianness == TARGET_LITTLE_ENDIAN)
                return le_to_h_u16(buffer);
@@ -289,14 +288,14 @@ u16 target_buffer_get_u16(target_t *target, const u8 *buffer)
                return be_to_h_u16(buffer);
 }
 
-/* read a u8 from a buffer in target memory endianness */
-u8 target_buffer_get_u8(target_t *target, const u8 *buffer)
+/* read a uint8_t from a buffer in target memory endianness */
+uint8_t target_buffer_get_u8(target_t *target, const uint8_t *buffer)
 {
        return *buffer & 0x0ff;
 }
 
-/* write a u32 to a buffer in target memory endianness */
-void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value)
+/* write a uint32_t to a buffer in target memory endianness */
+void target_buffer_set_u32(target_t *target, uint8_t *buffer, uint32_t value)
 {
        if (target->endianness == TARGET_LITTLE_ENDIAN)
                h_u32_to_le(buffer, value);
@@ -304,8 +303,8 @@ void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value)
                h_u32_to_be(buffer, value);
 }
 
-/* write a u16 to a buffer in target memory endianness */
-void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value)
+/* write a uint16_t to a buffer in target memory endianness */
+void target_buffer_set_u16(target_t *target, uint8_t *buffer, uint16_t value)
 {
        if (target->endianness == TARGET_LITTLE_ENDIAN)
                h_u16_to_le(buffer, value);
@@ -313,8 +312,8 @@ void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value)
                h_u16_to_be(buffer, value);
 }
 
-/* write a u8 to a buffer in target memory endianness */
-void target_buffer_set_u8(target_t *target, u8 *buffer, u8 value)
+/* write a uint8_t to a buffer in target memory endianness */
+void target_buffer_set_u8(target_t *target, uint8_t *buffer, uint8_t value)
 {
        *buffer = value;
 }
@@ -332,14 +331,19 @@ target_t *get_target(const char *id)
                        return target;
        }
 
+       /* It's OK to remove this fallback sometime after August 2010 or so */
+
        /* no match, try as number */
        unsigned num;
        if (parse_uint(id, &num) != ERROR_OK)
                return NULL;
 
        for (target = all_targets; target; target = target->next) {
-               if (target->target_number == (int)num)
+               if (target->target_number == (int)num) {
+                       LOG_WARNING("use '%s' as target identifier, not '%u'",
+                                       target->cmd_name, num);
                        return target;
+               }
        }
 
        return NULL;
@@ -350,8 +354,8 @@ static target_t *get_target_by_num(int num)
 {
        target_t *target = all_targets;
 
-       while (target){
-               if( target->target_number == num ){
+       while (target) {
+               if (target->target_number == num) {
                        return target;
                }
                target = target->next;
@@ -360,11 +364,6 @@ static target_t *get_target_by_num(int num)
        return NULL;
 }
 
-int get_num_by_target(target_t *query_target)
-{
-       return query_target->target_number;
-}
-
 target_t* get_current_target(command_context_t *cmd_ctx)
 {
        target_t *target = get_target_by_num(cmd_ctx->current_target);
@@ -380,27 +379,60 @@ 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, u32 address, int handle_breakpoints, int debug_execution)
+int target_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
 {
        int retval;
 
@@ -426,8 +458,8 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo
        char buf[100];
        int retval;
        Jim_Nvp *n;
-       n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode );
-       if( n->name == NULL ){
+       n = Jim_Nvp_value2name_simple(nvp_reset_modes, reset_mode);
+       if (n->name == NULL) {
                LOG_ERROR("invalid reset mode");
                return ERROR_FAIL;
        }
@@ -436,15 +468,16 @@ 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_continous_poll;
-       target_continous_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 );
+       sprintf(buf, "ocd_process_reset %s", n->name);
+       retval = Jim_Eval(interp, buf);
 
-       target_continous_poll = save_poll;
+       jtag_poll_set_enabled(save_poll);
 
-       if(retval != JIM_OK) {
+       if (retval != JIM_OK) {
                Jim_PrintErrorMessage(interp);
                return ERROR_FAIL;
        }
@@ -455,7 +488,7 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo
        return retval;
 }
 
-static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
+static int default_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical)
 {
        *physical = virtual;
        return ERROR_OK;
@@ -463,7 +496,13 @@ static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical
 
 static int default_mmu(struct target_s *target, int *enabled)
 {
-       *enabled = 0;
+       LOG_ERROR("Not implemented.");
+       return ERROR_FAIL;
+}
+
+static int default_has_mmu(struct target_s *target, bool *has_mmu)
+{
+       *has_mmu = true;
        return ERROR_OK;
 }
 
@@ -478,7 +517,19 @@ int target_examine_one(struct target_s *target)
        return target->type->examine(target);
 }
 
-/* Targets that correctly implement init+examine, i.e.
+static int jtag_enable_callback(enum jtag_event event, void *priv)
+{
+       target_t *target = priv;
+
+       if (event != JTAG_TAP_EVENT_ENABLE || !target->tap->enabled)
+               return ERROR_OK;
+
+       jtag_unregister_event_callback(jtag_enable_callback, target);
+       return target_examine_one(target);
+}
+
+
+/* Targets that correctly implement init + examine, i.e.
  * no communication with target during init:
  *
  * XScale
@@ -490,8 +541,12 @@ int target_examine(void)
 
        for (target = all_targets; target; target = target->next)
        {
-               if (!target->tap->enabled)
+               /* defer examination, but don't skip it */
+               if (!target->tap->enabled) {
+                       jtag_register_event_callback(jtag_enable_callback,
+                                       target);
                        continue;
+               }
                if ((retval = target_examine_one(target)) != ERROR_OK)
                        return retval;
        }
@@ -502,7 +557,7 @@ const char *target_get_name(struct target_s *target)
        return target->type->name;
 }
 
-static int target_write_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
+static int target_write_memory_imp(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        if (!target_was_examined(target))
        {
@@ -512,7 +567,7 @@ static int target_write_memory_imp(struct target_s *target, u32 address, u32 siz
        return target->type->write_memory_imp(target, address, size, count, buffer);
 }
 
-static int target_read_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
+static int target_read_memory_imp(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        if (!target_was_examined(target))
        {
@@ -529,10 +584,15 @@ static int target_soft_reset_halt_imp(struct target_s *target)
                LOG_ERROR("Target not examined yet");
                return ERROR_FAIL;
        }
+       if (!target->type->soft_reset_halt_imp) {
+               LOG_ERROR("Target %s does not support soft_reset_halt",
+                               target->cmd_name);
+               return ERROR_FAIL;
+       }
        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, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info)
+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)
 {
        if (!target_was_examined(target))
        {
@@ -543,18 +603,31 @@ static int target_run_algorithm_imp(struct target_s *target, int num_mem_params,
 }
 
 int target_read_memory(struct target_s *target,
-               u32 address, u32 size, u32 count, u8 *buffer)
+               uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        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,
-               u32 address, u32 size, u32 count, u8 *buffer)
+               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,
-               u32 address, u32 count, u8 *buffer)
+               uint32_t address, uint32_t count, uint8_t *buffer)
 {
        return target->type->bulk_write_memory(target, address, count, buffer);
 }
@@ -587,7 +660,7 @@ int target_get_gdb_reg_list(struct target_s *target,
        return target->type->get_gdb_reg_list(target, reg_list, reg_list_size);
 }
 int target_step(struct target_s *target,
-               int current, u32 address, int handle_breakpoints)
+               int current, uint32_t address, int handle_breakpoints)
 {
        return target->type->step(target, current, address, handle_breakpoints);
 }
@@ -596,7 +669,7 @@ 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,
-               u32 entry_point, u32 exit_point,
+               uint32_t entry_point, uint32_t exit_point,
                int timeout_ms, void *arch_info)
 {
        return target->type->run_algorithm(target,
@@ -621,6 +694,90 @@ 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");
+       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");
+       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;
+       }
+
+       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 default_read_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+{
+       int retval;
+       bool mmu;
+       retval = target->type->has_mmu(target, &mmu);
+       if (retval != ERROR_OK)
+               return retval;
+       if (mmu)
+       {
+               LOG_ERROR("Not implemented");
+               return ERROR_FAIL;
+       }
+       return target_read_memory(target, address, size, count, buffer);
+}
+
+static int default_write_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+{
+       int retval;
+       bool mmu;
+       retval = target->type->has_mmu(target, &mmu);
+       if (retval != ERROR_OK)
+               return retval;
+       if (mmu)
+       {
+               LOG_ERROR("Not implemented");
+               return ERROR_FAIL;
+       }
+       return target_write_memory(target, address, size, count, buffer);
+}
+
+
 int target_init(struct command_context_s *cmd_ctx)
 {
        target_t *target = all_targets;
@@ -645,7 +802,28 @@ int target_init(struct command_context_s *cmd_ctx)
                {
                        target->type->virt2phys = default_virt2phys;
                }
-               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;
+               }
+
+               if (target->type->mcr == NULL)
+               {
+                       target->type->mcr = default_mcr;
+               }
+
+               if (target->type->mrc == NULL)
+               {
+                       target->type->mrc = default_mrc;
+               }
+
+
                /* a non-invasive way(in terms of patches) to add some code that
                 * runs before the type->write/read_memory implementation
                 */
@@ -662,14 +840,18 @@ int target_init(struct command_context_s *cmd_ctx)
                {
                        target->type->mmu = default_mmu;
                }
+               if (target->type->has_mmu == NULL)
+               {
+                       target->type->has_mmu = default_has_mmu;
+               }
                target = target->next;
        }
 
        if (all_targets)
        {
-               if((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK)
+               if ((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK)
                        return retval;
-               if((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK)
+               if ((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK)
                        return retval;
        }
 
@@ -800,14 +982,14 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
        if (event == TARGET_EVENT_HALTED)
        {
                /* execute early halted first */
-               target_call_event_callbacks(target, TARGET_EVENT_EARLY_HALTED);
+               target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
        }
 
        LOG_DEBUG("target event %i (%s)",
                          event,
-                         Jim_Nvp_value2name_simple( nvp_target_event, event )->name );
+                         Jim_Nvp_value2name_simple(nvp_target_event, event)->name);
 
-       target_handle_event( target, event );
+       target_handle_event(target, event);
 
        while (callback)
        {
@@ -888,7 +1070,7 @@ int target_call_timer_callbacks_now(void)
        return target_call_timer_callbacks_check_time(0);
 }
 
-int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
+int target_alloc_working_area(struct target_s *target, uint32_t size, working_area_t **area)
 {
        working_area_t *c = target->working_areas;
        working_area_t *new_wa = NULL;
@@ -903,21 +1085,37 @@ int target_alloc_working_area(struct target_s *target, u32 size, working_area_t
                {
                        return retval;
                }
+
                if (enabled)
                {
-                       target->working_area = target->working_area_virt;
-               }
-               else
+                       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
                {
-                       target->working_area = target->working_area_phys;
+                       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;
+                       }
                }
        }
 
        /* only allocate multiples of 4 byte */
        if (size % 4)
        {
-               LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
-               size = CEIL(size, 4);
+               LOG_ERROR("BUG: code tried to allocate unaligned number of bytes (0x%08x), padding", ((unsigned)(size)));
+               size = (size + 3) & (~3);
        }
 
        /* see if there's already a matching working area */
@@ -935,10 +1133,8 @@ int target_alloc_working_area(struct target_s *target, u32 size, working_area_t
        if (!new_wa)
        {
                working_area_t **p = &target->working_areas;
-               u32 first_free = target->working_area;
-               u32 free_size = target->working_area_size;
-
-               LOG_DEBUG("allocating new working area");
+               uint32_t first_free = target->working_area;
+               uint32_t free_size = target->working_area_size;
 
                c = target->working_areas;
                while (c)
@@ -951,10 +1147,13 @@ int target_alloc_working_area(struct target_s *target, u32 size, working_area_t
 
                if (free_size < size)
                {
-                       LOG_WARNING("not enough working area available(requested %d, free %d)", size, free_size);
+                       LOG_WARNING("not enough working area available(requested %u, free %u)",
+                                   (unsigned)(size), (unsigned)(free_size));
                        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;
@@ -964,7 +1163,7 @@ int target_alloc_working_area(struct target_s *target, u32 size, working_area_t
                {
                        int retval;
                        new_wa->backup = malloc(new_wa->size);
-                       if((retval = target_read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup)) != ERROR_OK)
+                       if ((retval = target_read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup)) != ERROR_OK)
                        {
                                free(new_wa->backup);
                                free(new_wa);
@@ -995,10 +1194,10 @@ int target_free_working_area_restore(struct target_s *target, working_area_t *ar
        if (area->free)
                return ERROR_OK;
 
-       if (restore&&target->backup_working_area)
+       if (restore && target->backup_working_area)
        {
                int retval;
-               if((retval = target_write_memory(target, area->address, 4, area->size / 4, area->backup)) != ERROR_OK)
+               if ((retval = target_write_memory(target, area->address, 4, area->size / 4, area->backup)) != ERROR_OK)
                        return retval;
        }
 
@@ -1052,7 +1251,7 @@ int target_register_commands(struct command_context_s *cmd_ctx)
 
 
 
-       register_jim(cmd_ctx, "target", jim_target, "configure target" );
+       register_jim(cmd_ctx, "target", jim_target, "configure target");
 
        return ERROR_OK;
 }
@@ -1060,19 +1259,18 @@ int target_register_commands(struct command_context_s *cmd_ctx)
 int target_arch_state(struct target_s *target)
 {
        int retval;
-       if (target==NULL)
+       if (target == NULL)
        {
                LOG_USER("No target has been configured");
                return ERROR_OK;
        }
 
-       LOG_USER("target state: %s",
-                Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name);
+       LOG_USER("target state: %s", target_state_name( target ));
 
-       if (target->state!=TARGET_HALTED)
+       if (target->state != TARGET_HALTED)
                return ERROR_OK;
 
-       retval=target->type->arch_state(target);
+       retval = target->type->arch_state(target);
        return retval;
 }
 
@@ -1080,10 +1278,11 @@ int target_arch_state(struct target_s *target)
  * mode respectively, otherwise data is handled as quickly as
  * possible
  */
-int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
+int target_write_buffer(struct target_s *target, uint32_t address, uint32_t size, uint8_t *buffer)
 {
        int retval;
-       LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size, address);
+       LOG_DEBUG("writing buffer of %i byte at 0x%8.8x",
+                 (int)size, (unsigned)address);
 
        if (!target_was_examined(target))
        {
@@ -1098,7 +1297,9 @@ int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buff
        if ((address + size - 1) < address)
        {
                /* GDB can request this when e.g. PC is 0xfffffffc*/
-               LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address, size);
+               LOG_ERROR("address + size wrapped(0x%08x, 0x%08x)",
+                                 (unsigned)address,
+                                 (unsigned)size);
                return ERROR_FAIL;
        }
 
@@ -1110,7 +1311,7 @@ int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buff
        /* handle unaligned head bytes */
        if (address % 4)
        {
-               u32 unaligned = 4 - (address % 4);
+               uint32_t unaligned = 4 - (address % 4);
 
                if (unaligned > size)
                        unaligned = size;
@@ -1159,10 +1360,11 @@ int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buff
  * mode respectively, otherwise data is handled as quickly as
  * possible
  */
-int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
+int target_read_buffer(struct target_s *target, uint32_t address, uint32_t size, uint8_t *buffer)
 {
        int retval;
-       LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size, address);
+       LOG_DEBUG("reading buffer of %i byte at 0x%8.8x",
+                         (int)size, (unsigned)address);
 
        if (!target_was_examined(target))
        {
@@ -1177,7 +1379,9 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
        if ((address + size - 1) < address)
        {
                /* GDB can request this when e.g. PC is 0xfffffffc*/
-               LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address, size);
+               LOG_ERROR("address + size wrapped(0x%08" PRIx32 ", 0x%08" PRIx32 ")",
+                                 address,
+                                 size);
                return ERROR_FAIL;
        }
 
@@ -1189,7 +1393,7 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
        /* handle unaligned head bytes */
        if (address % 4)
        {
-               u32 unaligned = 4 - (address % 4);
+               uint32_t unaligned = 4 - (address % 4);
 
                if (unaligned > size)
                        unaligned = size;
@@ -1215,6 +1419,18 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
                size -= aligned;
        }
 
+       /*prevent byte access when possible (avoid AHB access limitations in some cases)*/
+       if(size >=2)
+       {
+               int aligned = size - (size%2);
+               retval = target_read_memory(target, address, 2, aligned / 2, buffer);
+               if (retval != ERROR_OK)
+                       return retval;
+
+               buffer += aligned;
+               address += aligned;
+               size -= aligned;
+       }
        /* handle tail writes of less than 4 bytes */
        if (size > 0)
        {
@@ -1225,12 +1441,12 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
        return ERROR_OK;
 }
 
-int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc)
+int target_checksum_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t* crc)
 {
-       u8 *buffer;
+       uint8_t *buffer;
        int retval;
-       u32 i;
-       u32 checksum = 0;
+       uint32_t i;
+       uint32_t checksum = 0;
        if (!target_was_examined(target))
        {
                LOG_ERROR("Target not examined yet");
@@ -1243,7 +1459,7 @@ int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32*
                buffer = malloc(size);
                if (buffer == NULL)
                {
-                       LOG_ERROR("error allocating buffer for section (%d bytes)", size);
+                       LOG_ERROR("error allocating buffer for section (%d bytes)", (int)size);
                        return ERROR_INVALID_ARGUMENTS;
                }
                retval = target_read_buffer(target, address, size, buffer);
@@ -1254,14 +1470,14 @@ int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32*
                }
 
                /* convert to target endianess */
-               for (i = 0; i < (size/sizeof(u32)); i++)
+               for (i = 0; i < (size/sizeof(uint32_t)); i++)
                {
-                       u32 target_data;
-                       target_data = target_buffer_get_u32(target, &buffer[i*sizeof(u32)]);
-                       target_buffer_set_u32(target, &buffer[i*sizeof(u32)], target_data);
+                       uint32_t target_data;
+                       target_data = target_buffer_get_u32(target, &buffer[i*sizeof(uint32_t)]);
+                       target_buffer_set_u32(target, &buffer[i*sizeof(uint32_t)], target_data);
                }
 
-               retval = image_calculate_checksum( buffer, size, &checksum );
+               retval = image_calculate_checksum(buffer, size, &checksum);
                free(buffer);
        }
 
@@ -1270,7 +1486,7 @@ int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32*
        return retval;
 }
 
-int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank)
+int target_blank_check_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t* blank)
 {
        int retval;
        if (!target_was_examined(target))
@@ -1287,9 +1503,9 @@ int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u3
        return retval;
 }
 
-int target_read_u32(struct target_s *target, u32 address, u32 *value)
+int target_read_u32(struct target_s *target, uint32_t address, uint32_t *value)
 {
-       u8 value_buf[4];
+       uint8_t value_buf[4];
        if (!target_was_examined(target))
        {
                LOG_ERROR("Target not examined yet");
@@ -1301,20 +1517,23 @@ int target_read_u32(struct target_s *target, u32 address, u32 *value)
        if (retval == ERROR_OK)
        {
                *value = target_buffer_get_u32(target, value_buf);
-               LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, *value);
+               LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8" PRIx32 "",
+                                 address,
+                                 *value);
        }
        else
        {
                *value = 0x0;
-               LOG_DEBUG("address: 0x%8.8x failed", address);
+               LOG_DEBUG("address: 0x%8.8" PRIx32 " failed",
+                                 address);
        }
 
        return retval;
 }
 
-int target_read_u16(struct target_s *target, u32 address, u16 *value)
+int target_read_u16(struct target_s *target, uint32_t address, uint16_t *value)
 {
-       u8 value_buf[2];
+       uint8_t value_buf[2];
        if (!target_was_examined(target))
        {
                LOG_ERROR("Target not examined yet");
@@ -1326,18 +1545,21 @@ int target_read_u16(struct target_s *target, u32 address, u16 *value)
        if (retval == ERROR_OK)
        {
                *value = target_buffer_get_u16(target, value_buf);
-               LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address, *value);
+               LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%4.4x",
+                                 address,
+                                 *value);
        }
        else
        {
                *value = 0x0;
-               LOG_DEBUG("address: 0x%8.8x failed", address);
+               LOG_DEBUG("address: 0x%8.8" PRIx32 " failed",
+                                 address);
        }
 
        return retval;
 }
 
-int target_read_u8(struct target_s *target, u32 address, u8 *value)
+int target_read_u8(struct target_s *target, uint32_t address, uint8_t *value)
 {
        int retval = target_read_memory(target, address, 1, 1, value);
        if (!target_was_examined(target))
@@ -1348,28 +1570,33 @@ int target_read_u8(struct target_s *target, u32 address, u8 *value)
 
        if (retval == ERROR_OK)
        {
-               LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, *value);
+               LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x",
+                                 address,
+                                 *value);
        }
        else
        {
                *value = 0x0;
-               LOG_DEBUG("address: 0x%8.8x failed", address);
+               LOG_DEBUG("address: 0x%8.8" PRIx32 " failed",
+                                 address);
        }
 
        return retval;
 }
 
-int target_write_u32(struct target_s *target, u32 address, u32 value)
+int target_write_u32(struct target_s *target, uint32_t address, uint32_t value)
 {
        int retval;
-       u8 value_buf[4];
+       uint8_t value_buf[4];
        if (!target_was_examined(target))
        {
                LOG_ERROR("Target not examined yet");
                return ERROR_FAIL;
        }
 
-       LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
+       LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8" PRIx32 "",
+                         address,
+                         value);
 
        target_buffer_set_u32(target, value_buf, value);
        if ((retval = target_write_memory(target, address, 4, 1, value_buf)) != ERROR_OK)
@@ -1380,17 +1607,19 @@ int target_write_u32(struct target_s *target, u32 address, u32 value)
        return retval;
 }
 
-int target_write_u16(struct target_s *target, u32 address, u16 value)
+int target_write_u16(struct target_s *target, uint32_t address, uint16_t value)
 {
        int retval;
-       u8 value_buf[2];
+       uint8_t value_buf[2];
        if (!target_was_examined(target))
        {
                LOG_ERROR("Target not examined yet");
                return ERROR_FAIL;
        }
 
-       LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
+       LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8x",
+                         address,
+                         value);
 
        target_buffer_set_u16(target, value_buf, value);
        if ((retval = target_write_memory(target, address, 2, 1, value_buf)) != ERROR_OK)
@@ -1401,7 +1630,7 @@ int target_write_u16(struct target_s *target, u32 address, u16 value)
        return retval;
 }
 
-int target_write_u8(struct target_s *target, u32 address, u8 value)
+int target_write_u8(struct target_s *target, uint32_t address, uint8_t value)
 {
        int retval;
        if (!target_was_examined(target))
@@ -1410,7 +1639,8 @@ int target_write_u8(struct target_s *target, u32 address, u8 value)
                return ERROR_FAIL;
        }
 
-       LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
+       LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x",
+                         address, value);
 
        if ((retval = target_write_memory(target, address, 1, 1, &value)) != ERROR_OK)
        {
@@ -1427,8 +1657,11 @@ int target_register_user_commands(struct command_context_s *cmd_ctx)
 
        /* 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_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_jim(cmd_ctx, "mrc", jim_mcrmrc, "read coprocessor <cpnum> <op1> <op2> <CRn> <CRm>");
+       register_jim(cmd_ctx, "mcr", jim_mcrmrc, "write coprocessor <cpnum> <op1> <op2> <CRn> <CRm> <value>");
 
        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");
@@ -1444,30 +1677,39 @@ int target_register_user_commands(struct command_context_s *cmd_ctx)
        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, "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, "set breakpoint <address> <length> [hw]");
-       register_command(cmd_ctx,  NULL, "rbp", handle_rbp_command, COMMAND_EXEC, "remove breakpoint <adress>");
-       register_command(cmd_ctx,  NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
-       register_command(cmd_ctx,  NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
+       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)
+       if ((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK)
                return retval;
-       if((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
+       if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
                return retval;
 
        return retval;
@@ -1481,7 +1723,7 @@ static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd,
        {
                target = get_target(args[0]);
                if (target == NULL) {
-                       command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] );
+                       command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0]);
                        goto DumpTargets;
                }
                if (!target->tap->enabled) {
@@ -1505,8 +1747,7 @@ DumpTargets:
                char marker = ' ';
 
                if (target->tap->enabled)
-                       state = Jim_Nvp_value2name_simple(nvp_target_state,
-                                       target->state)->name;
+                       state = target_state_name( target );
                else
                        state = "tap-disabled";
 
@@ -1545,7 +1786,7 @@ static int sense_handler(void)
        static int prevPowerdropout = 0;
 
        int retval;
-       if ((retval=jtag_power_dropout(&powerDropout))!=ERROR_OK)
+       if ((retval = jtag_power_dropout(&powerDropout)) != ERROR_OK)
                return retval;
 
        int powerRestored;
@@ -1564,7 +1805,7 @@ static int sense_handler(void)
                lastPower = current;
        }
 
-       if ((retval=jtag_srst_asserted(&srstAsserted))!=ERROR_OK)
+       if ((retval = jtag_srst_asserted(&srstAsserted)) != ERROR_OK)
                return retval;
 
        int srstDeasserted;
@@ -1597,6 +1838,15 @@ static int sense_handler(void)
        return ERROR_OK;
 }
 
+static void target_call_event_callbacks_all(enum target_event e) {
+       target_t *target;
+       target = all_targets;
+       while (target) {
+               target_call_event_callbacks(target, e);
+               target = target->next;
+       }
+}
+
 /* process target state changes */
 int handle_target(void *priv)
 {
@@ -1615,22 +1865,24 @@ int handle_target(void *priv)
                int did_something = 0;
                if (runSrstAsserted)
                {
-                       Jim_Eval( interp, "srst_asserted");
+                       target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
+                       Jim_Eval(interp, "srst_asserted");
                        did_something = 1;
                }
                if (runSrstDeasserted)
                {
-                       Jim_Eval( interp, "srst_deasserted");
+                       Jim_Eval(interp, "srst_deasserted");
                        did_something = 1;
                }
                if (runPowerDropout)
                {
-                       Jim_Eval( interp, "power_dropout");
+                       target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
+                       Jim_Eval(interp, "power_dropout");
                        did_something = 1;
                }
                if (runPowerRestore)
                {
-                       Jim_Eval( interp, "power_restore");
+                       Jim_Eval(interp, "power_restore");
                        did_something = 1;
                }
 
@@ -1642,28 +1894,34 @@ int handle_target(void *priv)
 
                /* clear action flags */
 
-               runSrstAsserted=0;
-               runSrstDeasserted=0;
-               runPowerRestore=0;
-               runPowerDropout=0;
+               runSrstAsserted = 0;
+               runSrstDeasserted = 0;
+               runPowerRestore = 0;
+               runPowerDropout = 0;
 
                recursive = 0;
        }
 
-       target_t *target = all_targets;
-
-       while (target)
+       /* Poll targets for state changes unless that's globally disabled.
+        * Skip targets that are currently disabled.
+        */
+       for (target_t *target = all_targets;
+                       is_jtag_poll_safe() && target;
+                       target = target->next)
        {
+               if (!target->tap->enabled)
+                       continue;
 
                /* only poll target if we've got power and srst isn't asserted */
-               if (target_continous_poll&&!powerDropout&&!srstAsserted)
+               if (!powerDropout && !srstAsserted)
                {
                        /* polling may fail silently until the target has been examined */
-                       if((retval = target_poll(target)) != ERROR_OK)
+                       if ((retval = target_poll(target)) != ERROR_OK)
+                       {
+                               target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
                                return retval;
+                       }
                }
-
-               target = target->next;
        }
 
        return retval;
@@ -1686,14 +1944,33 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
                reg_cache_t *cache = target->reg_cache;
 
                count = 0;
-               while(cache)
+               while (cache)
                {
                        int i;
-                       for (i = 0; i < cache->num_regs; i++)
+
+                       command_print(cmd_ctx, "===== %s", cache->name);
+
+                       for (i = 0, reg = cache->reg_list;
+                                       i < cache->num_regs;
+                                       i++, reg++, count++)
                        {
-                               value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
-                               command_print(cmd_ctx, "(%i) %s (/%i): 0x%s (dirty: %i, valid: %i)", count++, cache->reg_list[i].name, cache->reg_list[i].size, value, cache->reg_list[i].dirty, cache->reg_list[i].valid);
-                               free(value);
+                               /* only print cached values if they are valid */
+                               if (reg->valid) {
+                                       value = buf_to_str(reg->value,
+                                                       reg->size, 16);
+                                       command_print(cmd_ctx,
+                                                       "(%i) %s (/%" PRIu32 "): 0x%s%s",
+                                                       count, reg->name,
+                                                       reg->size, value,
+                                                       reg->dirty
+                                                               ? " (dirty)"
+                                                               : "");
+                                       free(value);
+                               } else {
+                                       command_print(cmd_ctx, "(%i) %s (/%" PRIu32 ")",
+                                                         count, reg->name,
+                                                         reg->size) ;
+                               }
                        }
                        cache = cache->next;
                }
@@ -1711,7 +1988,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
 
                reg_cache_t *cache = target->reg_cache;
                count = 0;
-               while(cache)
+               while (cache)
                {
                        int i;
                        for (i = 0; i < cache->num_regs; i++)
@@ -1755,7 +2032,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
                        arch_type->get(reg);
                }
                value = buf_to_str(reg->value, reg->size, 16);
-               command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
+               command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
                return ERROR_OK;
        }
@@ -1763,14 +2040,14 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char
        /* set register value */
        if (argc == 2)
        {
-               u8 *buf = malloc(CEIL(reg->size, 8));
+               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);
                arch_type->set(reg, buf);
 
                value = buf_to_str(reg->value, reg->size, 16);
-               command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
+               command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
 
                free(buf);
@@ -1791,22 +2068,27 @@ 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_continous_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");
+               if (!target->tap->enabled)
+                       return ERROR_OK;
                if ((retval = target_poll(target)) != ERROR_OK)
                        return retval;
                if ((retval = target_arch_state(target)) != ERROR_OK)
                        return retval;
 
        }
-       else if (argc==1)
+       else if (argc == 1)
        {
                if (strcmp(args[0], "on") == 0)
                {
-                       target_continous_poll = 1;
+                       jtag_poll_set_enabled(true);
                }
                else if (strcmp(args[0], "off") == 0)
                {
-                       target_continous_poll = 0;
+                       jtag_poll_set_enabled(false);
                }
                else
                {
@@ -1851,12 +2133,12 @@ static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd
 int target_wait_state(target_t *target, enum target_state state, int ms)
 {
        int retval;
-       long long then=0, cur;
-       int once=1;
+       long long then = 0, cur;
+       int once = 1;
 
        for (;;)
        {
-               if ((retval=target_poll(target))!=ERROR_OK)
+               if ((retval = target_poll(target)) != ERROR_OK)
                        return retval;
                if (target->state == state)
                {
@@ -1865,18 +2147,18 @@ int target_wait_state(target_t *target, enum target_state state, int ms)
                cur = timeval_ms();
                if (once)
                {
-                       once=0;
+                       once = 0;
                        then = timeval_ms();
                        LOG_DEBUG("waiting for target %s...",
                                Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
                }
 
-               if (cur-then>500)
+               if (cur-then > 500)
                {
                        keep_alive();
                }
 
-               if ((cur-then)>ms)
+               if ((cur-then) > ms)
                {
                        LOG_ERROR("timed out while waiting for target %s",
                                Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
@@ -1929,8 +2211,8 @@ static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, ch
        if (argc == 1)
        {
                const Jim_Nvp *n;
-               n = Jim_Nvp_name2value_simple( nvp_reset_modes, args[0] );
-               if( (n->name == NULL) || (n->value == RESET_UNKNOWN) ){
+               n = Jim_Nvp_name2value_simple(nvp_reset_modes, args[0]);
+               if ((n->name == NULL) || (n->value == RESET_UNKNOWN)) {
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
                reset_mode = n->value;
@@ -1943,6 +2225,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)
 {
+       int current = 1;
        if (argc > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
@@ -1952,15 +2235,16 @@ static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, c
        /* with no args, resume from current pc, addr = 0,
         * with one arguments, addr = args[0],
         * handle breakpoints, not debugging */
-       u32 addr = 0;
+       uint32_t addr = 0;
        if (argc == 1)
        {
                int retval = parse_u32(args[0], &addr);
                if (ERROR_OK != retval)
                        return retval;
+               current = 0;
        }
 
-       return target_resume(target, 0, addr, 1, 0);
+       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)
@@ -1973,21 +2257,24 @@ static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, cha
        /* with no args, step from current pc, addr = 0,
         * with one argument addr = args[0],
         * handle breakpoints, debugging */
-       u32 addr = 0;
+       uint32_t addr = 0;
+       int current_pc = 1;
        if (argc == 1)
        {
                int retval = parse_u32(args[0], &addr);
                if (ERROR_OK != retval)
                        return retval;
+               current_pc = 0;
        }
 
        target_t *target = get_current_target(cmd_ctx);
-       return target->type->step(target, 0, addr, 1);
+
+       return target->type->step(target, current_pc, addr, 1);
 }
 
 static void handle_md_output(struct command_context_s *cmd_ctx,
-               struct target_s *target, u32 address, unsigned size,
-               unsigned count, const u8 *buffer)
+               struct target_s *target, uint32_t address, unsigned size,
+               unsigned count, const uint8_t *buffer)
 {
        const unsigned line_bytecnt = 32;
        unsigned line_modulo = line_bytecnt / size;
@@ -2011,11 +2298,12 @@ static void handle_md_output(struct command_context_s *cmd_ctx,
                {
                        output_len += snprintf(output + output_len,
                                        sizeof(output) - output_len,
-                                       "0x%8.8x: ", address + (i*size));
+                                       "0x%8.8x: ",
+                                       (unsigned)(address + (i*size)));
                }
 
-               u32 value=0;
-               const u8 *value_ptr = buffer + i * size;
+               uint32_t value = 0;
+               const uint8_t *value_ptr = buffer + i * size;
                switch (size) {
                case 4: value = target_buffer_get_u32(target, value_ptr); break;
                case 2: value = target_buffer_get_u16(target, value_ptr); break;
@@ -2046,7 +2334,23 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char
        default: return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       u32 address;
+       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;
@@ -2059,11 +2363,10 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char
                        return retval;
        }
 
-       u8 *buffer = calloc(count, size);
+       uint8_t *buffer = calloc(count, size);
 
        target_t *target = get_current_target(cmd_ctx);
-       retval = target_read_memory(target,
-                               address, size, count, buffer);
+       retval = fn(target, address, size, count, buffer);
        if (ERROR_OK == retval)
                handle_md_output(cmd_ctx, target, address, size, count, buffer);
 
@@ -2074,22 +2377,46 @@ 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)
 {
-       u32 address = 0;
-       u32 value = 0;
-       int count = 1;
-       int i;
-       int wordsize;
-       target_t *target = get_current_target(cmd_ctx);
-       u8 value_buf[4];
-
-        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;
 
-       address = strtoul(args[0], NULL, 0);
-       value = strtoul(args[1], NULL, 0);
+       uint32_t address;
+       int retval = parse_u32(args[0], &address);
+       if (ERROR_OK != retval)
+               return retval;
+
+       uint32_t value;
+       retval = parse_u32(args[1], &value);
+       if (ERROR_OK != retval)
+               return retval;
+
+       unsigned count = 1;
        if (argc == 3)
-               count = strtoul(args[2], NULL, 0);
+       {
+               retval = parse_uint(args[2], &count);
+               if (ERROR_OK != retval)
+                       return retval;
+       }
 
+       target_t *target = get_current_target(cmd_ctx);
+       unsigned wordsize;
+       uint8_t value_buf[4];
        switch (cmd[2])
        {
                case 'w':
@@ -2107,9 +2434,9 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char
                default:
                        return ERROR_COMMAND_SYNTAX_ERROR;
        }
-       for (i=0; i<count; i++)
+       for (unsigned i = 0; i < count; i++)
        {
-               int retval = target_write_memory(target,
+               retval = fn(target,
                                address + i * wordsize, wordsize, 1, value_buf);
                if (ERROR_OK != retval)
                        return retval;
@@ -2120,56 +2447,70 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char
 
 }
 
-static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int parse_load_image_command_args(char **args, int argc,
+               image_t *image, uint32_t *min_address, uint32_t *max_address)
 {
-       u8 *buffer;
-       u32 buf_cnt;
-       u32 image_size;
-       u32 min_address=0;
-       u32 max_address=0xffffffff;
-       int i;
-       int retval, retvaltemp;
-
-       image_t image;
-
-       duration_t duration;
-       char *duration_text;
-
-       target_t *target = get_current_target(cmd_ctx);
-
-       if ((argc < 1)||(argc > 5))
-       {
+       if (argc < 1 || argc > 5)
                return ERROR_COMMAND_SYNTAX_ERROR;
-       }
 
-       /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
+       /* a base address isn't always necessary,
+        * default to 0x0 (i.e. don't relocate) */
        if (argc >= 2)
        {
-               image.base_address_set = 1;
-               image.base_address = strtoul(args[1], NULL, 0);
+               uint32_t addr;
+               int retval = parse_u32(args[1], &addr);
+               if (ERROR_OK != retval)
+                       return ERROR_COMMAND_SYNTAX_ERROR;
+               image->base_address = addr;
+               image->base_address_set = 1;
        }
        else
-       {
-               image.base_address_set = 0;
-       }
+               image->base_address_set = 0;
 
+       image->start_address_set = 0;
 
-       image.start_address_set = 0;
-
-       if (argc>=4)
+       if (argc >= 4)
        {
-               min_address=strtoul(args[3], NULL, 0);
+               int retval = parse_u32(args[3], min_address);
+               if (ERROR_OK != retval)
+                       return ERROR_COMMAND_SYNTAX_ERROR;
        }
-       if (argc>=5)
+       if (argc == 5)
        {
-               max_address=strtoul(args[4], NULL, 0)+min_address;
+               int retval = parse_u32(args[4], max_address);
+               if (ERROR_OK != retval)
+                       return ERROR_COMMAND_SYNTAX_ERROR;
+               // use size (given) to find max (required)
+               *max_address += *min_address;
        }
 
-       if (min_address>max_address)
-       {
+       if (*min_address > *max_address)
                return ERROR_COMMAND_SYNTAX_ERROR;
-       }
 
+       return ERROR_OK;
+}
+
+static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+       uint8_t *buffer;
+       uint32_t buf_cnt;
+       uint32_t image_size;
+       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,
+                       &image, &min_address, &max_address);
+       if (ERROR_OK != retval)
+               return retval;
+
+       target_t *target = get_current_target(cmd_ctx);
        duration_start_measure(&duration);
 
        if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
@@ -2184,7 +2525,9 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL)
                {
-                       command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
+                       command_print(cmd_ctx,
+                                                 "error allocating buffer for section (%d bytes)",
+                                                 (int)(image.sections[i].size));
                        break;
                }
 
@@ -2194,47 +2537,51 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm
                        break;
                }
 
-               u32 offset=0;
-               u32 length=buf_cnt;
+               uint32_t offset = 0;
+               uint32_t length = buf_cnt;
 
                /* DANGER!!! beware of unsigned comparision here!!! */
 
-               if ((image.sections[i].base_address+buf_cnt>=min_address)&&
-                               (image.sections[i].base_address<max_address))
+               if ((image.sections[i].base_address + buf_cnt >= min_address)&&
+                               (image.sections[i].base_address < max_address))
                {
-                       if (image.sections[i].base_address<min_address)
+                       if (image.sections[i].base_address < min_address)
                        {
                                /* clip addresses below */
-                               offset+=min_address-image.sections[i].base_address;
-                               length-=offset;
+                               offset += min_address-image.sections[i].base_address;
+                               length -= offset;
                        }
 
-                       if (image.sections[i].base_address+buf_cnt>max_address)
+                       if (image.sections[i].base_address + buf_cnt > max_address)
                        {
-                               length-=(image.sections[i].base_address+buf_cnt)-max_address;
+                               length -= (image.sections[i].base_address + buf_cnt)-max_address;
                        }
 
-                       if ((retval = target_write_buffer(target, image.sections[i].base_address+offset, length, buffer+offset)) != ERROR_OK)
+                       if ((retval = target_write_buffer(target, image.sections[i].base_address + offset, length, buffer + offset)) != ERROR_OK)
                        {
                                free(buffer);
                                break;
                        }
                        image_size += length;
-                       command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
+                       command_print(cmd_ctx, "%u bytes written at address 0x%8.8" PRIx32 "",
+                                                 (unsigned int)length,
+                                                 image.sections[i].base_address + offset);
                }
 
                free(buffer);
        }
 
-       if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
        {
                image_close(&image);
                return retvaltemp;
        }
 
-       if (retval==ERROR_OK)
+       if (retval == ERROR_OK)
        {
-               command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
+               command_print(cmd_ctx, "downloaded %u byte in %s",
+                                         (unsigned int)image_size,
+                                         duration_text);
        }
        free(duration_text);
 
@@ -2248,10 +2595,8 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
 {
        fileio_t fileio;
 
-       u32 address;
-       u32 size;
-       u8 buffer[560];
-       int retval=ERROR_OK, retvaltemp;
+       uint8_t buffer[560];
+       int retvaltemp;
 
        duration_t duration;
        char *duration_text;
@@ -2264,8 +2609,15 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
                return ERROR_OK;
        }
 
-       address = strtoul(args[1], NULL, 0);
-       size = strtoul(args[2], NULL, 0);
+       uint32_t address;
+       int retval = parse_u32(args[1], &address);
+       if (ERROR_OK != retval)
+               return retval;
+
+       uint32_t size;
+       retval = parse_u32(args[2], &size);
+       if (ERROR_OK != retval)
+               return retval;
 
        if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
        {
@@ -2276,8 +2628,8 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
 
        while (size > 0)
        {
-               u32 size_written;
-               u32 this_run_size = (size > 560) ? 560 : size;
+               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)
@@ -2295,13 +2647,13 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
                address += this_run_size;
        }
 
-       if((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
+       if ((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
                return retvaltemp;
 
-       if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
                return retvaltemp;
 
-       if (retval==ERROR_OK)
+       if (retval == ERROR_OK)
        {
                command_print(cmd_ctx, "dumped %lld byte in %s",
                                fileio.size, duration_text);
@@ -2313,13 +2665,13 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm
 
 static int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify)
 {
-       u8 *buffer;
-       u32 buf_cnt;
-       u32 image_size;
+       uint8_t *buffer;
+       uint32_t buf_cnt;
+       uint32_t image_size;
        int i;
        int retval, retvaltemp;
-       u32 checksum = 0;
-       u32 mem_checksum = 0;
+       uint32_t checksum = 0;
+       uint32_t mem_checksum = 0;
 
        image_t image;
 
@@ -2343,8 +2695,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
 
        if (argc >= 2)
        {
+               uint32_t addr;
+               retval = parse_u32(args[1], &addr);
+               if (ERROR_OK != retval)
+                       return ERROR_COMMAND_SYNTAX_ERROR;
+               image.base_address = addr;
                image.base_address_set = 1;
-               image.base_address = strtoul(args[1], NULL, 0);
        }
        else
        {
@@ -2354,19 +2710,21 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
 
        image.start_address_set = 0;
 
-       if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
+       if ((retval = image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
        {
                return retval;
        }
 
        image_size = 0x0;
-       retval=ERROR_OK;
+       retval = ERROR_OK;
        for (i = 0; i < image.num_sections; i++)
        {
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL)
                {
-                       command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
+                       command_print(cmd_ctx,
+                                                 "error allocating buffer for section (%d bytes)",
+                                                 (int)(image.sections[i].size));
                        break;
                }
                if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
@@ -2378,23 +2736,23 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
                if (verify)
                {
                        /* calculate checksum of image */
-                       image_calculate_checksum( buffer, buf_cnt, &checksum );
+                       image_calculate_checksum(buffer, buf_cnt, &checksum);
 
                        retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
-                       if( retval != ERROR_OK )
+                       if (retval != ERROR_OK)
                        {
                                free(buffer);
                                break;
                        }
 
-                       if( checksum != mem_checksum )
+                       if (checksum != mem_checksum)
                        {
                                /* failed crc checksum, fall back to a binary compare */
-                               u8 *data;
+                               uint8_t *data;
 
                                command_print(cmd_ctx, "checksum mismatch - attempting binary compare");
 
-                               data = (u8*)malloc(buf_cnt);
+                               data = (uint8_t*)malloc(buf_cnt);
 
                                /* Can we use 32bit word accesses? */
                                int size = 1;
@@ -2407,18 +2765,22 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
                                retval = target_read_memory(target, image.sections[i].base_address, size, count, data);
                                if (retval == ERROR_OK)
                                {
-                                       u32 t;
+                                       uint32_t t;
                                        for (t = 0; t < buf_cnt; t++)
                                        {
                                                if (data[t] != buffer[t])
                                                {
-                                                       command_print(cmd_ctx, "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n", t + image.sections[i].base_address, data[t], buffer[t]);
+                                                       command_print(cmd_ctx,
+                                                                                 "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n",
+                                                                                 (unsigned)(t + image.sections[i].base_address),
+                                                                                 data[t],
+                                                                                 buffer[t]);
                                                        free(data);
                                                        free(buffer);
-                                                       retval=ERROR_FAIL;
+                                                       retval = ERROR_FAIL;
                                                        goto done;
                                                }
-                                               if ((t%16384)==0)
+                                               if ((t%16384) == 0)
                                                {
                                                        keep_alive();
                                                }
@@ -2429,7 +2791,9 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
                        }
                } else
                {
-                       command_print(cmd_ctx, "address 0x%08x length 0x%08x", image.sections[i].base_address, buf_cnt);
+                       command_print(cmd_ctx, "address 0x%08" PRIx32 " length 0x%08" PRIx32 "",
+                                                 image.sections[i].base_address,
+                                                 buf_cnt);
                }
 
                free(buffer);
@@ -2437,15 +2801,17 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct
        }
 done:
 
-       if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
        {
                image_close(&image);
                return retvaltemp;
        }
 
-       if (retval==ERROR_OK)
+       if (retval == ERROR_OK)
        {
-               command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
+               command_print(cmd_ctx, "verified %u bytes in %s",
+                                         (unsigned int)image_size,
+                                         duration_text);
        }
        free(duration_text);
 
@@ -2474,15 +2840,17 @@ static int handle_bp_command_list(struct command_context_s *cmd_ctx)
                {
                        char* buf = buf_to_str(breakpoint->orig_instr,
                                        breakpoint->length, 16);
-                       command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s",
-                                       breakpoint->address, breakpoint->length,
+                       command_print(cmd_ctx, "0x%8.8" PRIx32 ", 0x%x, %i, 0x%s",
+                                       breakpoint->address,
+                                       breakpoint->length,
                                        breakpoint->set, buf);
                        free(buf);
                }
                else
                {
-                       command_print(cmd_ctx, "0x%8.8x, 0x%x, %i",
-                                       breakpoint->address, breakpoint->length, breakpoint->set);
+                       command_print(cmd_ctx, "0x%8.8" PRIx32 ", 0x%x, %i",
+                                                 breakpoint->address,
+                                                 breakpoint->length, breakpoint->set);
                }
 
                breakpoint = breakpoint->next;
@@ -2491,12 +2859,12 @@ static int handle_bp_command_list(struct command_context_s *cmd_ctx)
 }
 
 static int handle_bp_command_set(struct command_context_s *cmd_ctx,
-               u32 addr, u32 length, int hw)
+               uint32_t addr, uint32_t length, int hw)
 {
        target_t *target = get_current_target(cmd_ctx);
        int retval = breakpoint_add(target, addr, length, hw);
        if (ERROR_OK == retval)
-               command_print(cmd_ctx, "breakpoint set at 0x%8.8x", addr);
+               command_print(cmd_ctx, "breakpoint set at 0x%8.8" PRIx32 "", addr);
        else
                LOG_ERROR("Failure setting breakpoint");
        return retval;
@@ -2514,8 +2882,15 @@ static int handle_bp_command(struct command_context_s *cmd_ctx,
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       u32 addr = strtoul(args[0], NULL, 0);
-       u32 length = strtoul(args[1], NULL, 0);
+       uint32_t addr;
+       int retval = parse_u32(args[0], &addr);
+       if (ERROR_OK != retval)
+               return retval;
+
+       uint32_t length;
+       retval = parse_u32(args[1], &length);
+       if (ERROR_OK != retval)
+               return retval;
 
        int hw = BKPT_SOFT;
        if (argc == 3)
@@ -2531,10 +2906,16 @@ static int handle_bp_command(struct command_context_s *cmd_ctx,
 
 static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       target_t *target = get_current_target(cmd_ctx);
+       if (argc != 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
-       if (argc > 0)
-               breakpoint_remove(target, strtoul(args[0], NULL, 0));
+       uint32_t addr;
+       int retval = parse_u32(args[0], &addr);
+       if (ERROR_OK != retval)
+               return retval;
+
+       target_t *target = get_current_target(cmd_ctx);
+       breakpoint_remove(target, addr);
 
        return ERROR_OK;
 }
@@ -2542,7 +2923,6 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char
 static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        target_t *target = get_current_target(cmd_ctx);
-       int retval;
 
        if (argc == 0)
        {
@@ -2550,55 +2930,75 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char
 
                while (watchpoint)
                {
-                       command_print(cmd_ctx, "address: 0x%8.8x, len: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask);
+                       command_print(cmd_ctx,
+                                                 "address: 0x%8.8" PRIx32 ", len: 0x%8.8x, r/w/a: %i, value: 0x%8.8" PRIx32 ", mask: 0x%8.8" PRIx32 "",
+                                                 watchpoint->address,
+                                                 watchpoint->length,
+                                                 (int)(watchpoint->rw),
+                                                 watchpoint->value,
+                                                 watchpoint->mask);
                        watchpoint = watchpoint->next;
                }
+               return ERROR_OK;
        }
-       else if (argc >= 2)
-       {
-               enum watchpoint_rw type = WPT_ACCESS;
-               u32 data_value = 0x0;
-               u32 data_mask = 0xffffffff;
 
-               if (argc >= 3)
-               {
-                       switch(args[2][0])
-                       {
-                               case 'r':
-                                       type = WPT_READ;
-                                       break;
-                               case 'w':
-                                       type = WPT_WRITE;
-                                       break;
-                               case 'a':
-                                       type = WPT_ACCESS;
-                                       break;
-                               default:
-                                       command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
-                                       return ERROR_OK;
-                       }
-               }
-               if (argc >= 4)
-               {
-                       data_value = strtoul(args[3], NULL, 0);
-               }
-               if (argc >= 5)
-               {
-                       data_mask = strtoul(args[4], NULL, 0);
-               }
+       enum watchpoint_rw type = WPT_ACCESS;
+       uint32_t addr = 0;
+       uint32_t length = 0;
+       uint32_t data_value = 0x0;
+       uint32_t data_mask = 0xffffffff;
+       int retval;
 
-               if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
-                               strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
+       switch (argc)
+       {
+       case 5:
+               retval = parse_u32(args[4], &data_mask);
+               if (ERROR_OK != retval)
+                       return retval;
+               // fall through
+       case 4:
+               retval = parse_u32(args[3], &data_value);
+               if (ERROR_OK != retval)
+                       return retval;
+               // fall through
+       case 3:
+               switch (args[2][0])
                {
-                       LOG_ERROR("Failure setting breakpoints");
+               case 'r':
+                       type = WPT_READ;
+                       break;
+               case 'w':
+                       type = WPT_WRITE;
+                       break;
+               case 'a':
+                       type = WPT_ACCESS;
+                       break;
+               default:
+                       LOG_ERROR("invalid watchpoint mode ('%c')", args[2][0]);
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
-       }
-       else
-       {
-               command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
+               // 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;
+               break;
+
+       default:
+               command_print(cmd_ctx, "usage: wp [address length "
+                               "[(r|w|a) [value [mask]]]]");
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       return ERROR_OK;
+       retval = watchpoint_add(target, addr, length, type,
+                       data_value, data_mask);
+       if (ERROR_OK != retval)
+               LOG_ERROR("Failure setting watchpoints");
+
+       return retval;
 }
 
 static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
@@ -2606,8 +3006,13 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char
        if (argc != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
+       uint32_t addr;
+       int retval = parse_u32(args[0], &addr);
+       if (ERROR_OK != retval)
+               return retval;
+
        target_t *target = get_current_target(cmd_ctx);
-       watchpoint_remove(target, strtoul(args[0], NULL, 0));
+       watchpoint_remove(target, addr);
 
        return ERROR_OK;
 }
@@ -2625,13 +3030,16 @@ static int handle_virt2phys_command(command_context_t *cmd_ctx,
        if (argc != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       target_t *target = get_current_target(cmd_ctx);
-       u32 va = strtoul(args[0], NULL, 0);
-       u32 pa;
+       uint32_t va;
+       int retval = parse_u32(args[0], &va);
+       if (ERROR_OK != retval)
+               return retval;
+       uint32_t pa;
 
-       int retval = target->type->virt2phys(target, va, &pa);
+       target_t *target = get_current_target(cmd_ctx);
+       retval = target->type->virt2phys(target, va, &pa);
        if (retval == ERROR_OK)
-               command_print(cmd_ctx, "Physical address 0x%08x", pa);
+               command_print(cmd_ctx, "Physical address 0x%08" PRIx32 "", pa);
 
        return retval;
 }
@@ -2646,9 +3054,9 @@ static void writeData(FILE *f, const void *data, size_t len)
 static void writeLong(FILE *f, int l)
 {
        int i;
-       for (i=0; i<4; i++)
+       for (i = 0; i < 4; i++)
        {
-               char c=(l>>(i*8))&0xff;
+               char c = (l >> (i*8))&0xff;
                writeData(f, &c, 1);
        }
 
@@ -2660,11 +3068,11 @@ static void writeString(FILE *f, char *s)
 }
 
 /* Dump a gmon.out histogram file. */
-static void writeGmon(u32 *samples, u32 sampleNum, char *filename)
+static void writeGmon(uint32_t *samples, uint32_t sampleNum, char *filename)
 {
-       u32 i;
-       FILE *f=fopen(filename, "w");
-       if (f==NULL)
+       uint32_t i;
+       FILE *f = fopen(filename, "w");
+       if (f == NULL)
                return;
        writeString(f, "gmon");
        writeLong(f, 0x00000001); /* Version */
@@ -2672,46 +3080,46 @@ static void writeGmon(u32 *samples, u32 sampleNum, char *filename)
        writeLong(f, 0); /* padding */
        writeLong(f, 0); /* padding */
 
-       u8 zero = 0;  /* GMON_TAG_TIME_HIST */
+       uint8_t zero = 0;  /* GMON_TAG_TIME_HIST */
        writeData(f, &zero, 1);
 
        /* figure out bucket size */
-       u32 min=samples[0];
-       u32 max=samples[0];
-       for (i=0; i<sampleNum; i++)
+       uint32_t min = samples[0];
+       uint32_t max = samples[0];
+       for (i = 0; i < sampleNum; i++)
        {
-               if (min>samples[i])
+               if (min > samples[i])
                {
-                       min=samples[i];
+                       min = samples[i];
                }
-               if (max<samples[i])
+               if (max < samples[i])
                {
-                       max=samples[i];
+                       max = samples[i];
                }
        }
 
-       int addressSpace=(max-min+1);
+       int addressSpace = (max-min + 1);
 
-       static const u32 maxBuckets = 256 * 1024; /* maximum buckets. */
-       u32 length = addressSpace;
+       static const uint32_t maxBuckets = 256 * 1024; /* maximum buckets. */
+       uint32_t length = addressSpace;
        if (length > maxBuckets)
        {
-               length=maxBuckets;
+               length = maxBuckets;
        }
-       int *buckets=malloc(sizeof(int)*length);
-       if (buckets==NULL)
+       int *buckets = malloc(sizeof(int)*length);
+       if (buckets == NULL)
        {
                fclose(f);
                return;
        }
        memset(buckets, 0, sizeof(int)*length);
-       for (i=0; i<sampleNum;i++)
+       for (i = 0; i < sampleNum;i++)
        {
-               u32 address=samples[i];
-               long long a=address-min;
-               long long b=length-1;
-               long long c=addressSpace-1;
-               int index=(a*b)/c; /* danger!!!! int32 overflows */
+               uint32_t address = samples[i];
+               long long a = address-min;
+               long long b = length-1;
+               long long c = addressSpace-1;
+               int index = (a*b)/c; /* danger!!!! int32 overflows */
                buckets[index]++;
        }
 
@@ -2721,25 +3129,25 @@ static void writeGmon(u32 *samples, u32 sampleNum, char *filename)
        writeLong(f, length);           /* # of samples */
        writeLong(f, 64000000);         /* 64MHz */
        writeString(f, "seconds");
-       for (i=0; i<(15-strlen("seconds")); i++)
+       for (i = 0; i < (15-strlen("seconds")); i++)
                writeData(f, &zero, 1);
        writeString(f, "s");
 
        /*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
 
-       char *data=malloc(2*length);
-       if (data!=NULL)
+       char *data = malloc(2*length);
+       if (data != NULL)
        {
-               for (i=0; i<length;i++)
+               for (i = 0; i < length;i++)
                {
                        int val;
-                       val=buckets[i];
-                       if (val>65535)
+                       val = buckets[i];
+                       if (val > 65535)
                        {
-                               val=65535;
+                               val = 65535;
                        }
                        data[i*2]=val&0xff;
-                       data[i*2+1]=(val>>8)&0xff;
+                       data[i*2 + 1]=(val >> 8)&0xff;
                }
                free(buckets);
                writeData(f, data, length * 2);
@@ -2759,26 +3167,25 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
        struct timeval timeout, now;
 
        gettimeofday(&timeout, NULL);
-       if (argc!=2)
+       if (argc != 2)
        {
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
-       char *end;
-       timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
-       if (*end)
-       {
-               return ERROR_OK;
-       }
+       unsigned offset;
+       int retval = parse_uint(args[0], &offset);
+       if (ERROR_OK != retval)
+               return retval;
+
+       timeval_add_time(&timeout, offset, 0);
 
        command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
 
-       static const int maxSample=10000;
-       u32 *samples=malloc(sizeof(u32)*maxSample);
-       if (samples==NULL)
+       static const int maxSample = 10000;
+       uint32_t *samples = malloc(sizeof(uint32_t)*maxSample);
+       if (samples == NULL)
                return ERROR_OK;
 
-       int numSamples=0;
-       int retval=ERROR_OK;
+       int numSamples = 0;
        /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
        reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1);
 
@@ -2787,7 +3194,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
                target_poll(target);
                if (target->state == TARGET_HALTED)
                {
-                       u32 t=*((u32 *)reg->value);
+                       uint32_t t=*((uint32_t *)reg->value);
                        samples[numSamples++]=t;
                        retval = target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
                        target_poll(target);
@@ -2795,7 +3202,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
                } else if (target->state == TARGET_RUNNING)
                {
                        /* We want to quickly sample the PC. */
-                       if((retval = target_halt(target)) != ERROR_OK)
+                       if ((retval = target_halt(target)) != ERROR_OK)
                        {
                                free(samples);
                                return retval;
@@ -2803,19 +3210,19 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
                } else
                {
                        command_print(cmd_ctx, "Target not halted or running");
-                       retval=ERROR_OK;
+                       retval = ERROR_OK;
                        break;
                }
-               if (retval!=ERROR_OK)
+               if (retval != ERROR_OK)
                {
                        break;
                }
 
                gettimeofday(&now, NULL);
-               if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
+               if ((numSamples >= maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
                {
                        command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
-                       if((retval = target_poll(target)) != ERROR_OK)
+                       if ((retval = target_poll(target)) != ERROR_OK)
                        {
                                free(samples);
                                return retval;
@@ -2824,7 +3231,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
                        {
                                target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
                        }
-                       if((retval = target_poll(target)) != ERROR_OK)
+                       if ((retval = target_poll(target)) != ERROR_OK)
                        {
                                free(samples);
                                return retval;
@@ -2839,7 +3246,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd,
        return ERROR_OK;
 }
 
-static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val)
+static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, uint32_t val)
 {
        char *namebuf;
        Jim_Obj *nameObjPtr, *valObjPtr;
@@ -2885,21 +3292,21 @@ static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                return JIM_ERR;
        }
 
-       return  target_mem2array(interp, target, argc-1, argv+1);
+       return  target_mem2array(interp, target, argc-1, argv + 1);
 }
 
 static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
 {
        long l;
-       u32 width;
+       uint32_t width;
        int len;
-       u32 addr;
-       u32 count;
-       u32 v;
+       uint32_t addr;
+       uint32_t count;
+       uint32_t v;
        const char *varname;
-       u8 buffer[4096];
+       uint8_t buffer[4096];
        int  n, e, retval;
-       u32 i;
+       uint32_t i;
 
        /* argv[1] = name of array to receive the data
         * argv[2] = desired width
@@ -2941,7 +3348,7 @@ static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_
                        break;
                default:
                        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-                       Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
+                       Jim_AppendStrings(interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL);
                        return JIM_ERR;
        }
        if (len == 0) {
@@ -2968,7 +3375,9 @@ static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_
        } else {
                char buf[100];
                Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-               sprintf(buf, "mem2array address: 0x%08x is not aligned for %d byte reads", addr, width);
+               sprintf(buf, "mem2array address: 0x%08" PRIx32 " is not aligned for %" PRId32 " byte reads",
+                               addr,
+                               width);
                Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
                return JIM_ERR;
        }
@@ -2987,10 +3396,13 @@ static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_
                        count = (sizeof(buffer)/width);
                }
 
-               retval = target_read_memory( target, addr, width, count, buffer );
+               retval = target_read_memory(target, addr, width, count, buffer);
                if (retval != ERROR_OK) {
                        /* BOO !*/
-                       LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
+                       LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed",
+                                         (unsigned int)addr,
+                                         (int)width,
+                                         (int)count);
                        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
                        Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
                        e = JIM_ERR;
@@ -3020,7 +3432,7 @@ static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_
        return JIM_OK;
 }
 
-static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 *val)
+static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, uint32_t *val)
 {
        char *namebuf;
        Jim_Obj *nameObjPtr, *valObjPtr;
@@ -3057,31 +3469,30 @@ static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        target_t *target;
 
        context = Jim_GetAssocData(interp, "context");
-       if (context == NULL){
+       if (context == NULL) {
                LOG_ERROR("array2mem: no command context");
                return JIM_ERR;
        }
        target = get_current_target(context);
-       if (target == NULL){
+       if (target == NULL) {
                LOG_ERROR("array2mem: no current target");
                return JIM_ERR;
        }
 
-       return target_array2mem( interp,target, argc-1, argv+1 );
+       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;
-       u32 width;
+       uint32_t width;
        int len;
-       u32 addr;
-       u32 count;
-       u32 v;
+       uint32_t addr;
+       uint32_t count;
+       uint32_t v;
        const char *varname;
-       u8 buffer[4096];
+       uint8_t buffer[4096];
        int  n, e, retval;
-       u32 i;
+       uint32_t i;
 
        /* argv[1] = name of array to get the data
         * argv[2] = desired width
@@ -3123,7 +3534,7 @@ static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_
                        break;
                default:
                        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-                       Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
+                       Jim_AppendStrings(interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL);
                        return JIM_ERR;
        }
        if (len == 0) {
@@ -3150,7 +3561,9 @@ static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_
        } else {
                char buf[100];
                Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-               sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads", addr, width);
+               sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads",
+                               (unsigned int)addr,
+                               (int)width);
                Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
                return JIM_ERR;
        }
@@ -3189,7 +3602,10 @@ static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_
                retval = target_write_memory(target, addr, width, count, buffer);
                if (retval != ERROR_OK) {
                        /* BOO !*/
-                       LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
+                       LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed",
+                                         (unsigned int)addr,
+                                         (int)width,
+                                         (int)count);
                        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
                        Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
                        e = JIM_ERR;
@@ -3202,50 +3618,43 @@ static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_
        return JIM_OK;
 }
 
-void target_all_handle_event( enum target_event e )
+void target_all_handle_event(enum target_event e)
 {
        target_t *target;
 
-       LOG_DEBUG( "**all*targets: event: %d, %s",
-                       e,
-                       Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
+       LOG_DEBUG("**all*targets: event: %d, %s",
+                          (int)e,
+                          Jim_Nvp_value2name_simple(nvp_target_event, e)->name);
 
        target = all_targets;
-       while (target){
-               target_handle_event( target, e );
+       while (target) {
+               target_handle_event(target, e);
                target = target->next;
        }
 }
 
-void target_handle_event( target_t *target, 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;
-       int done;
-
-       teap = target->event_action;
 
-       done = 0;
-       while( teap ){
-               if( teap->event == e ){
-                       done = 1;
-                       LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
+       for (teap = target->event_action; teap != NULL; teap = teap->next) {
+               if (teap->event == e) {
+                       LOG_DEBUG("target: (%d) %s (%s) event: %d (%s) action: %s",
                                           target->target_number,
                                           target->cmd_name,
                                           target_get_name(target),
                                           e,
-                                          Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
-                                          Jim_GetString( teap->body, NULL ) );
-                       if (Jim_EvalObj( interp, teap->body )!=JIM_OK)
+                                          Jim_Nvp_value2name_simple(nvp_target_event, e)->name,
+                                          Jim_GetString(teap->body, NULL));
+                       if (Jim_EvalObj(interp, teap->body) != JIM_OK)
                        {
                                Jim_PrintErrorMessage(interp);
                        }
                }
-               teap = teap->next;
-       }
-       if( !done ){
-               LOG_DEBUG( "event: %d %s - no action",
-                                  e,
-                                  Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
        }
 }
 
@@ -3275,7 +3684,7 @@ static Jim_Nvp nvp_config_opts[] = {
        { .name = NULL, .value = -1 }
 };
 
-static int target_configure( Jim_GetOptInfo *goi, target_t *target )
+static int target_configure(Jim_GetOptInfo *goi, target_t *target)
 {
        Jim_Nvp *n;
        Jim_Obj *o;
@@ -3284,64 +3693,64 @@ static int target_configure( Jim_GetOptInfo *goi, target_t *target )
        int e;
 
        /* parse config or cget options ... */
-       while( goi->argc > 0 ){
-               Jim_SetEmptyResult( goi->interp );
-               /* Jim_GetOpt_Debug( goi ); */
+       while (goi->argc > 0) {
+               Jim_SetEmptyResult(goi->interp);
+               /* Jim_GetOpt_Debug(goi); */
 
-               if( target->type->target_jim_configure ){
+               if (target->type->target_jim_configure) {
                        /* target defines a configure function */
                        /* target gets first dibs on parameters */
-                       e = (*(target->type->target_jim_configure))( target, goi );
-                       if( e == JIM_OK ){
+                       e = (*(target->type->target_jim_configure))(target, goi);
+                       if (e == JIM_OK) {
                                /* more? */
                                continue;
                        }
-                       if( e == JIM_ERR ){
+                       if (e == JIM_ERR) {
                                /* An error */
                                return e;
                        }
                        /* otherwise we 'continue' below */
                }
-               e = Jim_GetOpt_Nvp( goi, nvp_config_opts, &n );
-               if( e != JIM_OK ){
-                       Jim_GetOpt_NvpUnknown( goi, nvp_config_opts, 0 );
+               e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
+               if (e != JIM_OK) {
+                       Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
                        return e;
                }
-               switch( n->value ){
+               switch (n->value) {
                case TCFG_TYPE:
                        /* not setable */
-                       if( goi->isconfigure ){
-                               Jim_SetResult_sprintf( goi->interp, "not setable: %s", n->name );
+                       if (goi->isconfigure) {
+                               Jim_SetResult_sprintf(goi->interp, "not setable: %s", n->name);
                                return JIM_ERR;
                        } else {
                        no_params:
-                               if( goi->argc != 0 ){
-                                       Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "NO PARAMS");
+                               if (goi->argc != 0) {
+                                       Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "NO PARAMS");
                                        return JIM_ERR;
                                }
                        }
-                       Jim_SetResultString( goi->interp, target_get_name(target), -1 );
+                       Jim_SetResultString(goi->interp, target_get_name(target), -1);
                        /* loop for more */
                        break;
                case TCFG_EVENT:
-                       if( goi->argc == 0 ){
-                               Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
+                       if (goi->argc == 0) {
+                               Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
                                return JIM_ERR;
                        }
 
-                       e = Jim_GetOpt_Nvp( goi, nvp_target_event, &n );
-                       if( e != JIM_OK ){
-                               Jim_GetOpt_NvpUnknown( goi, nvp_target_event, 1 );
+                       e = Jim_GetOpt_Nvp(goi, nvp_target_event, &n);
+                       if (e != JIM_OK) {
+                               Jim_GetOpt_NvpUnknown(goi, nvp_target_event, 1);
                                return e;
                        }
 
-                       if( goi->isconfigure ){
-                               if( goi->argc != 1 ){
-                                       Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
+                       if (goi->isconfigure) {
+                               if (goi->argc != 1) {
+                                       Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
                                        return JIM_ERR;
                                }
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
                                        return JIM_ERR;
                                }
@@ -3352,24 +3761,26 @@ static int target_configure( Jim_GetOptInfo *goi, target_t *target )
 
                                teap = target->event_action;
                                /* replace existing? */
-                               while( teap ){
-                                       if( teap->event == (enum target_event)n->value ){
+                               while (teap) {
+                                       if (teap->event == (enum target_event)n->value) {
                                                break;
                                        }
                                        teap = teap->next;
                                }
 
-                               if( goi->isconfigure ){
-                                       if( teap == NULL ){
+                               if (goi->isconfigure) {
+                                       bool replace = true;
+                                       if (teap == NULL) {
                                                /* create new */
-                                               teap = calloc( 1, sizeof(*teap) );
+                                               teap = calloc(1, sizeof(*teap));
+                                               replace = false;
                                        }
                                        teap->event = n->value;
-                                       Jim_GetOpt_Obj( goi, &o );
-                                       if( teap->body ){
-                                               Jim_DecrRefCount( interp, teap->body );
+                                       Jim_GetOpt_Obj(goi, &o);
+                                       if (teap->body) {
+                                               Jim_DecrRefCount(interp, teap->body);
                                        }
-                                       teap->body  = Jim_DuplicateObj( goi->interp, o );
+                                       teap->body  = Jim_DuplicateObj(goi->interp, o);
                                        /*
                                         * FIXME:
                                         *     Tcl/TK - "tk events" have a nice feature.
@@ -3380,18 +3791,21 @@ static int target_configure( Jim_GetOptInfo *goi, target_t *target )
                                         *     The idea is: %N - target number
                                         *     The idea is: %E - event name.
                                         */
-                                       Jim_IncrRefCount( teap->body );
+                                       Jim_IncrRefCount(teap->body);
 
-                                       /* add to head of event list */
-                                       teap->next = target->event_action;
-                                       target->event_action = teap;
+                                       if (!replace)
+                                       {
+                                               /* add to head of event list */
+                                               teap->next = target->event_action;
+                                               target->event_action = teap;
+                                       }
                                        Jim_SetEmptyResult(goi->interp);
                                } else {
                                        /* get */
-                                       if( teap == NULL ){
-                                               Jim_SetEmptyResult( goi->interp );
+                                       if (teap == NULL) {
+                                               Jim_SetEmptyResult(goi->interp);
                                        } else {
-                                               Jim_SetResult( goi->interp, Jim_DuplicateObj( goi->interp, teap->body ) );
+                                               Jim_SetResult(goi->interp, Jim_DuplicateObj(goi->interp, teap->body));
                                        }
                                }
                        }
@@ -3399,67 +3813,69 @@ static int target_configure( Jim_GetOptInfo *goi, target_t *target )
                        break;
 
                case TCFG_WORK_AREA_VIRT:
-                       if( goi->isconfigure ){
+                       if (goi->isconfigure) {
                                target_free_all_working_areas(target);
-                               e = Jim_GetOpt_Wide( goi, &w );
-                               if( e != JIM_OK ){
+                               e = Jim_GetOpt_Wide(goi, &w);
+                               if (e != JIM_OK) {
                                        return e;
                                }
                                target->working_area_virt = w;
+                               target->working_area_virt_spec = true;
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
-                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
+                       Jim_SetResult(interp, Jim_NewIntObj(goi->interp, target->working_area_virt));
                        /* loop for more */
                        break;
 
                case TCFG_WORK_AREA_PHYS:
-                       if( goi->isconfigure ){
+                       if (goi->isconfigure) {
                                target_free_all_working_areas(target);
-                               e = Jim_GetOpt_Wide( goi, &w );
-                               if( e != JIM_OK ){
+                               e = Jim_GetOpt_Wide(goi, &w);
+                               if (e != JIM_OK) {
                                        return e;
                                }
                                target->working_area_phys = w;
+                               target->working_area_phys_spec = true;
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
-                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
+                       Jim_SetResult(interp, Jim_NewIntObj(goi->interp, target->working_area_phys));
                        /* loop for more */
                        break;
 
                case TCFG_WORK_AREA_SIZE:
-                       if( goi->isconfigure ){
+                       if (goi->isconfigure) {
                                target_free_all_working_areas(target);
-                               e = Jim_GetOpt_Wide( goi, &w );
-                               if( e != JIM_OK ){
+                               e = Jim_GetOpt_Wide(goi, &w);
+                               if (e != JIM_OK) {
                                        return e;
                                }
                                target->working_area_size = w;
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
-                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
+                       Jim_SetResult(interp, Jim_NewIntObj(goi->interp, target->working_area_size));
                        /* loop for more */
                        break;
 
                case TCFG_WORK_AREA_BACKUP:
-                       if( goi->isconfigure ){
+                       if (goi->isconfigure) {
                                target_free_all_working_areas(target);
-                               e = Jim_GetOpt_Wide( goi, &w );
-                               if( e != JIM_OK ){
+                               e = Jim_GetOpt_Wide(goi, &w);
+                               if (e != JIM_OK) {
                                        return e;
                                }
                                /* make this exactly 1 or 0 */
                                target->backup_working_area = (!!w);
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
@@ -3468,73 +3884,73 @@ static int target_configure( Jim_GetOptInfo *goi, target_t *target )
                        break;
 
                case TCFG_ENDIAN:
-                       if( goi->isconfigure ){
-                               e = Jim_GetOpt_Nvp( goi, nvp_target_endian, &n );
-                               if( e != JIM_OK ){
-                                       Jim_GetOpt_NvpUnknown( goi, nvp_target_endian, 1 );
+                       if (goi->isconfigure) {
+                               e = Jim_GetOpt_Nvp(goi, nvp_target_endian, &n);
+                               if (e != JIM_OK) {
+                                       Jim_GetOpt_NvpUnknown(goi, nvp_target_endian, 1);
                                        return e;
                                }
                                target->endianness = n->value;
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
-                       n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
-                       if( n->name == NULL ){
+                       n = Jim_Nvp_value2name_simple(nvp_target_endian, target->endianness);
+                       if (n->name == NULL) {
                                target->endianness = TARGET_LITTLE_ENDIAN;
-                               n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
+                               n = Jim_Nvp_value2name_simple(nvp_target_endian, target->endianness);
                        }
-                       Jim_SetResultString( goi->interp, n->name, -1 );
+                       Jim_SetResultString(goi->interp, n->name, -1);
                        /* loop for more */
                        break;
 
                case TCFG_VARIANT:
-                       if( goi->isconfigure ){
-                               if( goi->argc < 1 ){
-                                       Jim_SetResult_sprintf( goi->interp,
+                       if (goi->isconfigure) {
+                               if (goi->argc < 1) {
+                                       Jim_SetResult_sprintf(goi->interp,
                                                                                   "%s ?STRING?",
-                                                                                  n->name );
+                                                                                  n->name);
                                        return JIM_ERR;
                                }
-                               if( target->variant ){
+                               if (target->variant) {
                                        free((void *)(target->variant));
                                }
-                               e = Jim_GetOpt_String( goi, &cp, NULL );
+                               e = Jim_GetOpt_String(goi, &cp, NULL);
                                target->variant = strdup(cp);
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
-                       Jim_SetResultString( goi->interp, target->variant,-1 );
+                       Jim_SetResultString(goi->interp, target->variant,-1);
                        /* loop for more */
                        break;
                case TCFG_CHAIN_POSITION:
-                       if( goi->isconfigure ){
+                       if (goi->isconfigure) {
                                Jim_Obj *o;
                                jtag_tap_t *tap;
                                target_free_all_working_areas(target);
-                               e = Jim_GetOpt_Obj( goi, &o );
-                               if( e != JIM_OK ){
+                               e = Jim_GetOpt_Obj(goi, &o);
+                               if (e != JIM_OK) {
                                        return e;
                                }
-                               tap = jtag_tap_by_jim_obj( goi->interp, o );
-                               if( tap == NULL ){
+                               tap = jtag_tap_by_jim_obj(goi->interp, o);
+                               if (tap == NULL) {
                                        return JIM_ERR;
                                }
                                /* make this exactly 1 or 0 */
                                target->tap = tap;
                        } else {
-                               if( goi->argc != 0 ){
+                               if (goi->argc != 0) {
                                        goto no_params;
                                }
                        }
-                       Jim_SetResultString( interp, target->tap->dotted_name, -1 );
+                       Jim_SetResultString(interp, target->tap->dotted_name, -1);
                        /* loop for more e*/
                        break;
                }
-       } /* while( goi->argc ) */
+       } /* while (goi->argc) */
 
 
                /* done - we return */
@@ -3542,12 +3958,12 @@ static int target_configure( Jim_GetOptInfo *goi, target_t *target )
 }
 
 /** this is the 'tcl' handler for the target specific command */
-static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
+static int tcl_target_func(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
        Jim_GetOptInfo goi;
        jim_wide a,b,c;
        int x,y,z;
-       u8  target_buf[32];
+       uint8_t  target_buf[32];
        Jim_Nvp *n;
        target_t *target;
        struct command_context_s *cmd_ctx;
@@ -3596,36 +4012,36 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
        };
 
        /* go past the "command" */
-       Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
+       Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1);
 
-       target = Jim_CmdPrivData( goi.interp );
+       target = Jim_CmdPrivData(goi.interp);
        cmd_ctx = Jim_GetAssocData(goi.interp, "context");
 
        /* commands here are in an NVP table */
-       e = Jim_GetOpt_Nvp( &goi, target_options, &n );
-       if( e != JIM_OK ){
-               Jim_GetOpt_NvpUnknown( &goi, target_options, 0 );
+       e = Jim_GetOpt_Nvp(&goi, target_options, &n);
+       if (e != JIM_OK) {
+               Jim_GetOpt_NvpUnknown(&goi, target_options, 0);
                return e;
        }
        /* Assume blank result */
-       Jim_SetEmptyResult( goi.interp );
+       Jim_SetEmptyResult(goi.interp);
 
-       switch( n->value ){
+       switch (n->value) {
        case TS_CMD_CONFIGURE:
-               if( goi.argc < 2 ){
-                       Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "missing: -option VALUE ...");
+               if (goi.argc < 2) {
+                       Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv, "missing: -option VALUE ...");
                        return JIM_ERR;
                }
                goi.isconfigure = 1;
-               return target_configure( &goi, target );
+               return target_configure(&goi, target);
        case TS_CMD_CGET:
                // some things take params
-               if( goi.argc < 1 ){
-                       Jim_WrongNumArgs( goi.interp, 0, goi.argv, "missing: ?-option?");
+               if (goi.argc < 1) {
+                       Jim_WrongNumArgs(goi.interp, 0, goi.argv, "missing: ?-option?");
                        return JIM_ERR;
                }
                goi.isconfigure = 0;
-               return target_configure( &goi, target );
+               return target_configure(&goi, target);
                break;
        case TS_CMD_MWW:
        case TS_CMD_MWH:
@@ -3636,50 +4052,50 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
                 * argv[3] = optional count.
                 */
 
-               if( (goi.argc == 3) || (goi.argc == 4) ){
+               if ((goi.argc == 2) || (goi.argc == 3)) {
                        /* all is well */
                } else {
                mwx_error:
-                       Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
+                       Jim_SetResult_sprintf(goi.interp, "expected: %s ADDR DATA [COUNT]", n->name);
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide( &goi, &a );
-               if( e != JIM_OK ){
+               e = Jim_GetOpt_Wide(&goi, &a);
+               if (e != JIM_OK) {
                        goto mwx_error;
                }
 
-               e = Jim_GetOpt_Wide( &goi, &b );
-               if( e != JIM_OK ){
+               e = Jim_GetOpt_Wide(&goi, &b);
+               if (e != JIM_OK) {
                        goto mwx_error;
                }
-               if( goi.argc ){
-                       e = Jim_GetOpt_Wide( &goi, &c );
-                       if( e != JIM_OK ){
+               if (goi.argc == 3) {
+                       e = Jim_GetOpt_Wide(&goi, &c);
+                       if (e != JIM_OK) {
                                goto mwx_error;
                        }
                } else {
                        c = 1;
                }
 
-               switch( n->value ){
+               switch (n->value) {
                case TS_CMD_MWW:
-                       target_buffer_set_u32( target, target_buf, b );
+                       target_buffer_set_u32(target, target_buf, b);
                        b = 4;
                        break;
                case TS_CMD_MWH:
-                       target_buffer_set_u16( target, target_buf, b );
+                       target_buffer_set_u16(target, target_buf, b);
                        b = 2;
                        break;
                case TS_CMD_MWB:
-                       target_buffer_set_u8( target, target_buf, b );
+                       target_buffer_set_u8(target, target_buf, b);
                        b = 1;
                        break;
                }
-               for( x = 0 ; x < c ; x++ ){
-                       e = target_write_memory( target, a, b, 1, target_buf );
-                       if( e != ERROR_OK ){
-                               Jim_SetResult_sprintf( interp, "Error writing @ 0x%08x: %d\n", (int)(a), e );
+               for (x = 0 ; x < c ; x++) {
+                       e = target_write_memory(target, a, b, 1, target_buf);
+                       if (e != ERROR_OK) {
+                               Jim_SetResult_sprintf(interp, "Error writing @ 0x%08x: %d\n", (int)(a), e);
                                return JIM_ERR;
                        }
                        /* b = width */
@@ -3696,24 +4112,24 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
                 * argv[1] = address
                 * argv[2] = optional count
                 */
-               if( (goi.argc == 2) || (goi.argc == 3) ){
-                       Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR [COUNT]", n->name );
+               if ((goi.argc == 2) || (goi.argc == 3)) {
+                       Jim_SetResult_sprintf(goi.interp, "expected: %s ADDR [COUNT]", n->name);
                        return JIM_ERR;
                }
-               e = Jim_GetOpt_Wide( &goi, &a );
-               if( e != JIM_OK ){
+               e = Jim_GetOpt_Wide(&goi, &a);
+               if (e != JIM_OK) {
                        return JIM_ERR;
                }
-               if( goi.argc ){
-                       e = Jim_GetOpt_Wide( &goi, &c );
-                       if( e != JIM_OK ){
+               if (goi.argc) {
+                       e = Jim_GetOpt_Wide(&goi, &c);
+                       if (e != JIM_OK) {
                                return JIM_ERR;
                        }
                } else {
                        c = 1;
                }
                b = 1; /* shut up gcc */
-               switch( n->value ){
+               switch (n->value) {
                case TS_CMD_MDW:
                        b =  4;
                        break;
@@ -3728,52 +4144,52 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
                /* convert to "bytes" */
                c = c * b;
                /* count is now in 'BYTES' */
-               while( c > 0 ){
+               while (c > 0) {
                        y = c;
-                       if( y > 16 ){
+                       if (y > 16) {
                                y = 16;
                        }
-                       e = target_read_memory( target, a, b, y / b, target_buf );
-                       if( e != ERROR_OK ){
-                               Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
+                       e = target_read_memory(target, a, b, y / b, target_buf);
+                       if (e != ERROR_OK) {
+                               Jim_SetResult_sprintf(interp, "error reading target @ 0x%08lx", (int)(a));
                                return JIM_ERR;
                        }
 
-                       Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
-                       switch( b ){
+                       Jim_fprintf(interp, interp->cookie_stdout, "0x%08x ", (int)(a));
+                       switch (b) {
                        case 4:
-                               for( x = 0 ; (x < 16) && (x < y) ; x += 4 ){
-                                       z = target_buffer_get_u32( target, &(target_buf[ x * 4 ]) );
-                                       Jim_fprintf( interp, interp->cookie_stdout, "%08x ", (int)(z) );
+                               for (x = 0 ; (x < 16) && (x < y) ; x += 4) {
+                                       z = target_buffer_get_u32(target, &(target_buf[ x * 4 ]));
+                                       Jim_fprintf(interp, interp->cookie_stdout, "%08x ", (int)(z));
                                }
-                               for( ; (x < 16) ; x += 4 ){
-                                       Jim_fprintf( interp, interp->cookie_stdout, "         " );
+                               for (; (x < 16) ; x += 4) {
+                                       Jim_fprintf(interp, interp->cookie_stdout, "         ");
                                }
                                break;
                        case 2:
-                               for( x = 0 ; (x < 16) && (x < y) ; x += 2 ){
-                                       z = target_buffer_get_u16( target, &(target_buf[ x * 2 ]) );
-                                       Jim_fprintf( interp, interp->cookie_stdout, "%04x ", (int)(z) );
+                               for (x = 0 ; (x < 16) && (x < y) ; x += 2) {
+                                       z = target_buffer_get_u16(target, &(target_buf[ x * 2 ]));
+                                       Jim_fprintf(interp, interp->cookie_stdout, "%04x ", (int)(z));
                                }
-                               for( ; (x < 16) ; x += 2 ){
-                                       Jim_fprintf( interp, interp->cookie_stdout, "     " );
+                               for (; (x < 16) ; x += 2) {
+                                       Jim_fprintf(interp, interp->cookie_stdout, "     ");
                                }
                                break;
                        case 1:
                        default:
-                               for( x = 0 ; (x < 16) && (x < y) ; x += 1 ){
-                                       z = target_buffer_get_u8( target, &(target_buf[ x * 4 ]) );
-                                       Jim_fprintf( interp, interp->cookie_stdout, "%02x ", (int)(z) );
+                               for (x = 0 ; (x < 16) && (x < y) ; x += 1) {
+                                       z = target_buffer_get_u8(target, &(target_buf[ x * 4 ]));
+                                       Jim_fprintf(interp, interp->cookie_stdout, "%02x ", (int)(z));
                                }
-                               for( ; (x < 16) ; x += 1 ){
-                                       Jim_fprintf( interp, interp->cookie_stdout, "   " );
+                               for (; (x < 16) ; x += 1) {
+                                       Jim_fprintf(interp, interp->cookie_stdout, "   ");
                                }
                                break;
                        }
                        /* ascii-ify the bytes */
-                       for( x = 0 ; x < y ; x++ ){
-                               if(target_buf[x] >= 0x20) &&
-                                       (target_buf[x] <= 0x7e) ){
+                       for (x = 0 ; x < y ; x++) {
+                               if ((target_buf[x] >= 0x20) &&
+                                       (target_buf[x] <= 0x7e){
                                        /* good */
                                } else {
                                        /* smack it */
@@ -3781,119 +4197,127 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
                                }
                        }
                        /* space pad  */
-                       while( x < 16 ){
+                       while (x < 16) {
                                target_buf[x] = ' ';
                                x++;
                        }
                        /* terminate */
                        target_buf[16] = 0;
                        /* print - with a newline */
-                       Jim_fprintf( interp, interp->cookie_stdout, "%s\n", target_buf );
+                       Jim_fprintf(interp, interp->cookie_stdout, "%s\n", target_buf);
                        /* NEXT... */
                        c -= 16;
                        a += 16;
                }
                return JIM_OK;
        case TS_CMD_MEM2ARRAY:
-               return target_mem2array( goi.interp, target, goi.argc, goi.argv );
+               return target_mem2array(goi.interp, target, goi.argc, goi.argv);
                break;
        case TS_CMD_ARRAY2MEM:
-               return target_array2mem( goi.interp, target, goi.argc, goi.argv );
+               return target_array2mem(goi.interp, target, goi.argc, goi.argv);
                break;
        case TS_CMD_EXAMINE:
-               if( goi.argc ){
-                       Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
+               if (goi.argc) {
+                       Jim_WrongNumArgs(goi.interp, 2, argv, "[no parameters]");
                        return JIM_ERR;
                }
                if (!target->tap->enabled)
                        goto err_tap_disabled;
-               e = target->type->examine( target );
-               if( e != ERROR_OK ){
-                       Jim_SetResult_sprintf( interp, "examine-fails: %d", e );
+               e = target->type->examine(target);
+               if (e != ERROR_OK) {
+                       Jim_SetResult_sprintf(interp, "examine-fails: %d", e);
                        return JIM_ERR;
                }
                return JIM_OK;
        case TS_CMD_POLL:
-               if( goi.argc ){
-                       Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
+               if (goi.argc) {
+                       Jim_WrongNumArgs(goi.interp, 2, argv, "[no parameters]");
                        return JIM_ERR;
                }
                if (!target->tap->enabled)
                        goto err_tap_disabled;
-               if( !(target_was_examined(target)) ){
+               if (!(target_was_examined(target))) {
                        e = ERROR_TARGET_NOT_EXAMINED;
                } else {
-                       e = target->type->poll( target );
+                       e = target->type->poll(target);
                }
-               if( e != ERROR_OK ){
-                       Jim_SetResult_sprintf( interp, "poll-fails: %d", e );
+               if (e != ERROR_OK) {
+                       Jim_SetResult_sprintf(interp, "poll-fails: %d", e);
                        return JIM_ERR;
                } else {
                        return JIM_OK;
                }
                break;
        case TS_CMD_RESET:
-               if( goi.argc != 2 ){
-                       Jim_WrongNumArgs( interp, 2, argv, "t|f|assert|deassert BOOL");
+               if (goi.argc != 2) {
+                       Jim_WrongNumArgs(interp, 2, argv,
+                                       "([tT]|[fF]|assert|deassert) BOOL");
                        return JIM_ERR;
                }
-               e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n );
-               if( e != JIM_OK ){
-                       Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 );
+               e = Jim_GetOpt_Nvp(&goi, nvp_assert, &n);
+               if (e != JIM_OK) {
+                       Jim_GetOpt_NvpUnknown(&goi, nvp_assert, 1);
                        return e;
                }
                /* the halt or not param */
-               e = Jim_GetOpt_Wide( &goi, &a);
-               if( e != JIM_OK ){
+               e = Jim_GetOpt_Wide(&goi, &a);
+               if (e != JIM_OK) {
                        return e;
                }
                if (!target->tap->enabled)
                        goto err_tap_disabled;
+               if (!target->type->assert_reset
+                               || !target->type->deassert_reset) {
+                       Jim_SetResult_sprintf(interp,
+                                       "No target-specific reset for %s",
+                                       target->cmd_name);
+                       return JIM_ERR;
+               }
                /* determine if we should halt or not. */
                target->reset_halt = !!a;
                /* When this happens - all workareas are invalid. */
                target_free_all_working_areas_restore(target, 0);
 
                /* do the assert */
-               if( n->value == NVP_ASSERT ){
-                       target->type->assert_reset( target );
+               if (n->value == NVP_ASSERT) {
+                       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]");
+               if (goi.argc) {
+                       Jim_WrongNumArgs(goi.interp, 0, argv, "halt [no parameters]");
                        return JIM_ERR;
                }
                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 ){
-                       Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
+               if (goi.argc != 2) {
+                       Jim_SetResult_sprintf(goi.interp, "%s STATENAME TIMEOUTMSECS", n->name);
                        return JIM_ERR;
                }
-               e = Jim_GetOpt_Nvp( &goi, nvp_target_state, &n );
-               if( e != JIM_OK ){
-                       Jim_GetOpt_NvpUnknown( &goi, nvp_target_state,1 );
+               e = Jim_GetOpt_Nvp(&goi, nvp_target_state, &n);
+               if (e != JIM_OK) {
+                       Jim_GetOpt_NvpUnknown(&goi, nvp_target_state,1);
                        return e;
                }
-               e = Jim_GetOpt_Wide( &goi, &a );
-               if( e != JIM_OK ){
+               e = Jim_GetOpt_Wide(&goi, &a);
+               if (e != JIM_OK) {
                        return e;
                }
                if (!target->tap->enabled)
                        goto err_tap_disabled;
-               e = target_wait_state( target, n->value, a );
-               if( e != ERROR_OK ){
-                       Jim_SetResult_sprintf( goi.interp,
+               e = target_wait_state(target, n->value, a);
+               if (e != ERROR_OK) {
+                       Jim_SetResult_sprintf(goi.interp,
                                                                   "target: %s wait %s fails (%d) %s",
                                                                   target->cmd_name,
                                                                   n->name,
-                                                                  e, target_strerror_safe(e) );
+                                                                  e, target_strerror_safe(e));
                        return JIM_ERR;
                } else {
                        return JIM_OK;
@@ -3905,40 +4329,41 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
                {
                        target_event_action_t *teap;
                        teap = target->event_action;
-                       command_print( cmd_ctx, "Event actions for target (%d) %s\n",
+                       command_print(cmd_ctx, "Event actions for target (%d) %s\n",
                                                   target->target_number,
-                                                  target->cmd_name );
-                       command_print( cmd_ctx, "%-25s | Body", "Event");
-                       command_print( cmd_ctx, "------------------------- | ----------------------------------------");
-                       while( teap ){
-                               command_print( cmd_ctx,
+                                                  target->cmd_name);
+                       command_print(cmd_ctx, "%-25s | Body", "Event");
+                       command_print(cmd_ctx, "------------------------- | ----------------------------------------");
+                       while (teap) {
+                               command_print(cmd_ctx,
                                                           "%-25s | %s",
-                                                          Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
-                                                          Jim_GetString( teap->body, NULL ) );
+                                                          Jim_Nvp_value2name_simple(nvp_target_event, teap->event)->name,
+                                                          Jim_GetString(teap->body, NULL));
                                teap = teap->next;
                        }
-                       command_print( cmd_ctx, "***END***");
+                       command_print(cmd_ctx, "***END***");
                        return JIM_OK;
                }
        case TS_CMD_CURSTATE:
-               if( goi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
+               if (goi.argc != 0) {
+                       Jim_WrongNumArgs(goi.interp, 0, argv, "[no parameters]");
                        return JIM_ERR;
                }
-               Jim_SetResultString( goi.interp,
-                                                        Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
+               Jim_SetResultString(goi.interp,
+                                                       target_state_name( target ),
+                                                       -1);
                return JIM_OK;
        case TS_CMD_INVOKE_EVENT:
-               if( goi.argc != 1 ){
-                       Jim_SetResult_sprintf( goi.interp, "%s ?EVENTNAME?",n->name);
+               if (goi.argc != 1) {
+                       Jim_SetResult_sprintf(goi.interp, "%s ?EVENTNAME?",n->name);
                        return JIM_ERR;
                }
-               e = Jim_GetOpt_Nvp( &goi, nvp_target_event, &n );
-               if( e != JIM_OK ){
-                       Jim_GetOpt_NvpUnknown( &goi, nvp_target_event, 1 );
+               e = Jim_GetOpt_Nvp(&goi, nvp_target_event, &n);
+               if (e != JIM_OK) {
+                       Jim_GetOpt_NvpUnknown(&goi, nvp_target_event, 1);
                        return e;
                }
-               target_handle_event( target, n->value );
+               target_handle_event(target, n->value);
                return JIM_OK;
        }
        return JIM_ERR;
@@ -3948,7 +4373,7 @@ err_tap_disabled:
        return JIM_ERR;
 }
 
-static int target_create( Jim_GetOptInfo *goi )
+static int target_create(Jim_GetOptInfo *goi)
 {
        Jim_Obj *new_cmd;
        Jim_Cmd *cmd;
@@ -3960,44 +4385,44 @@ static int target_create( Jim_GetOptInfo *goi )
        struct command_context_s *cmd_ctx;
 
        cmd_ctx = Jim_GetAssocData(goi->interp, "context");
-       if( goi->argc < 3 ){
-               Jim_WrongNumArgs( goi->interp, 1, goi->argv, "?name? ?type? ..options...");
+       if (goi->argc < 3) {
+               Jim_WrongNumArgs(goi->interp, 1, goi->argv, "?name? ?type? ..options...");
                return JIM_ERR;
        }
 
        /* COMMAND */
-       Jim_GetOpt_Obj( goi, &new_cmd );
+       Jim_GetOpt_Obj(goi, &new_cmd);
        /* does this command exist? */
-       cmd = Jim_GetCommand( goi->interp, new_cmd, JIM_ERRMSG );
-       if( cmd ){
-               cp = Jim_GetString( new_cmd, NULL );
+       cmd = Jim_GetCommand(goi->interp, new_cmd, JIM_ERRMSG);
+       if (cmd) {
+               cp = Jim_GetString(new_cmd, NULL);
                Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
                return JIM_ERR;
        }
 
        /* TYPE */
-       e = Jim_GetOpt_String( goi, &cp2, NULL );
+       e = Jim_GetOpt_String(goi, &cp2, NULL);
        cp = cp2;
        /* now does target type exist */
-       for( x = 0 ; target_types[x] ; x++ ){
-               if( 0 == strcmp( cp, target_types[x]->name ) ){
+       for (x = 0 ; target_types[x] ; x++) {
+               if (0 == strcmp(cp, target_types[x]->name)) {
                        /* found */
                        break;
                }
        }
-       if( target_types[x] == NULL ){
-               Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
-               for( x = 0 ; target_types[x] ; x++ ){
-                       if( target_types[x+1] ){
-                               Jim_AppendStrings( goi->interp,
+       if (target_types[x] == NULL) {
+               Jim_SetResult_sprintf(goi->interp, "Unknown target type %s, try one of ", cp);
+               for (x = 0 ; target_types[x] ; x++) {
+                       if (target_types[x + 1]) {
+                               Jim_AppendStrings(goi->interp,
                                                                   Jim_GetResult(goi->interp),
                                                                   target_types[x]->name,
                                                                   ", ", NULL);
                        } else {
-                               Jim_AppendStrings( goi->interp,
+                               Jim_AppendStrings(goi->interp,
                                                                   Jim_GetResult(goi->interp),
                                                                   " or ",
-                                                                  target_types[x]->name,NULL );
+                                                                  target_types[x]->name,NULL);
                        }
                }
                return JIM_ERR;
@@ -4011,7 +4436,7 @@ static int target_create( Jim_GetOptInfo *goi )
        /* allocate memory for each unique target type */
        target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
 
-       memcpy( target->type, target_types[x], sizeof(target_type_t));
+       memcpy(target->type, target_types[x], sizeof(target_type_t));
 
        /* will be set by "-endian" */
        target->endianness = TARGET_ENDIAN_UNKNOWN;
@@ -4031,6 +4456,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;
@@ -4048,21 +4475,21 @@ static int target_create( Jim_GetOptInfo *goi )
 
        /* Do the rest as "configure" options */
        goi->isconfigure = 1;
-       e = target_configure( goi, target);
+       e = target_configure(goi, target);
 
        if (target->tap == NULL)
        {
-               Jim_SetResultString( interp, "-chain-position required when creating target", -1);
-               e=JIM_ERR;
+               Jim_SetResultString(interp, "-chain-position required when creating target", -1);
+               e = JIM_ERR;
        }
 
-       if( e != JIM_OK ){
-               free( target->type );
-               free( target );
+       if (e != JIM_OK) {
+               free(target->type);
+               free(target);
                return e;
        }
 
-       if( target->endianness == TARGET_ENDIAN_UNKNOWN ){
+       if (target->endianness == TARGET_ENDIAN_UNKNOWN) {
                /* default endian to little if not specified */
                target->endianness = TARGET_LITTLE_ENDIAN;
        }
@@ -4072,38 +4499,38 @@ static int target_create( Jim_GetOptInfo *goi )
                target->variant = strdup("");
 
        /* create the target specific commands */
-       if( target->type->register_commands ){
-               (*(target->type->register_commands))( cmd_ctx );
+       if (target->type->register_commands) {
+               (*(target->type->register_commands))(cmd_ctx);
        }
-       if( target->type->target_create ){
-               (*(target->type->target_create))( target, goi->interp );
+       if (target->type->target_create) {
+               (*(target->type->target_create))(target, goi->interp);
        }
 
        /* append to end of list */
        {
                target_t **tpp;
                tpp = &(all_targets);
-               while( *tpp ){
-                       tpp = &( (*tpp)->next );
+               while (*tpp) {
+                       tpp = &((*tpp)->next);
                }
                *tpp = target;
        }
 
-       cp = Jim_GetString( new_cmd, NULL );
+       cp = Jim_GetString(new_cmd, NULL);
        target->cmd_name = strdup(cp);
 
        /* now - create the new target name command */
-       e = Jim_CreateCommand( goi->interp,
+       e = Jim_CreateCommand(goi->interp,
                                                   /* name */
                                                   cp,
                                                   tcl_target_func, /* C function */
                                                   target, /* private data */
-                                                  NULL ); /* no del proc */
+                                                  NULL); /* no del proc */
 
        return e;
 }
 
-static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
+static int jim_target(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
        int x,r,e;
        jim_wide w;
@@ -4128,91 +4555,95 @@ static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
        LOG_DEBUG("Target command params:");
        LOG_DEBUG("%s", Jim_Debug_ArgvString(interp, argc, argv));
 
-       cmd_ctx = Jim_GetAssocData( interp, "context" );
+       cmd_ctx = Jim_GetAssocData(interp, "context");
 
-       Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
+       Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1);
 
-       if( goi.argc == 0 ){
+       if (goi.argc == 0) {
                Jim_WrongNumArgs(interp, 1, argv, "missing: command ...");
                return JIM_ERR;
        }
 
-       /* Jim_GetOpt_Debug( &goi ); */
-       r = Jim_GetOpt_Enum( &goi, target_cmds, &x   );
-       if( r != JIM_OK ){
+       /* Jim_GetOpt_Debug(&goi); */
+       r = Jim_GetOpt_Enum(&goi, target_cmds, &x);
+       if (r != JIM_OK) {
                return r;
        }
 
-       switch(x){
+       switch (x) {
        default:
                Jim_Panic(goi.interp,"Why am I here?");
                return JIM_ERR;
        case TG_CMD_CURRENT:
-               if( goi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters");
+               if (goi.argc != 0) {
+                       Jim_WrongNumArgs(goi.interp, 1, goi.argv, "Too many parameters");
                        return JIM_ERR;
                }
-               Jim_SetResultString( goi.interp, get_current_target( cmd_ctx )->cmd_name, -1 );
+               Jim_SetResultString(goi.interp, get_current_target(cmd_ctx)->cmd_name, -1);
                return JIM_OK;
        case TG_CMD_TYPES:
-               if( goi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
+               if (goi.argc != 0) {
+                       Jim_WrongNumArgs(goi.interp, 1, goi.argv, "Too many parameters");
                        return JIM_ERR;
                }
-               Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
-               for( x = 0 ; target_types[x] ; x++ ){
-                       Jim_ListAppendElement( goi.interp,
+               Jim_SetResult(goi.interp, Jim_NewListObj(goi.interp, NULL, 0));
+               for (x = 0 ; target_types[x] ; x++) {
+                       Jim_ListAppendElement(goi.interp,
                                                                   Jim_GetResult(goi.interp),
-                                                                  Jim_NewStringObj( goi.interp, target_types[x]->name, -1 ) );
+                                                                  Jim_NewStringObj(goi.interp, target_types[x]->name, -1));
                }
                return JIM_OK;
        case TG_CMD_NAMES:
-               if( goi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
+               if (goi.argc != 0) {
+                       Jim_WrongNumArgs(goi.interp, 1, goi.argv, "Too many parameters");
                        return JIM_ERR;
                }
-               Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
+               Jim_SetResult(goi.interp, Jim_NewListObj(goi.interp, NULL, 0));
                target = all_targets;
-               while( target ){
-                       Jim_ListAppendElement( goi.interp,
+               while (target) {
+                       Jim_ListAppendElement(goi.interp,
                                                                   Jim_GetResult(goi.interp),
-                                                                  Jim_NewStringObj( goi.interp, target->cmd_name, -1 ) );
+                                                                  Jim_NewStringObj(goi.interp, target->cmd_name, -1));
                        target = target->next;
                }
                return JIM_OK;
        case TG_CMD_CREATE:
-               if( goi.argc < 3 ){
-                       Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "?name  ... config options ...");
+               if (goi.argc < 3) {
+                       Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv, "?name  ... config options ...");
                        return JIM_ERR;
                }
-               return target_create( &goi );
+               return target_create(&goi);
                break;
        case TG_CMD_NUMBER:
-               if( goi.argc != 1 ){
-                       Jim_SetResult_sprintf( goi.interp, "expected: target number ?NUMBER?");
+               /* It's OK to remove this mechanism sometime after August 2010 or so */
+               LOG_WARNING("don't use numbers as target identifiers; use names");
+               if (goi.argc != 1) {
+                       Jim_SetResult_sprintf(goi.interp, "expected: target number ?NUMBER?");
                        return JIM_ERR;
                }
-               e = Jim_GetOpt_Wide( &goi, &w );
-               if( e != JIM_OK ){
+               e = Jim_GetOpt_Wide(&goi, &w);
+               if (e != JIM_OK) {
                        return JIM_ERR;
                }
-               {
-                       target_t *t;
-                       t = get_target_by_num(w);
-                       if( t == NULL ){
-                               Jim_SetResult_sprintf( goi.interp,"Target: number %d does not exist", (int)(w));
-                               return JIM_ERR;
-                       }
-                       Jim_SetResultString( goi.interp, t->cmd_name, -1 );
-                       return JIM_OK;
+               for (x = 0, target = all_targets; target; target = target->next, x++) {
+                       if (target->target_number == w)
+                               break;
+               }
+               if (target == NULL) {
+                       Jim_SetResult_sprintf(goi.interp,
+                                       "Target: number %d does not exist", (int)(w));
+                       return JIM_ERR;
                }
+               Jim_SetResultString(goi.interp, target->cmd_name, -1);
+               return JIM_OK;
        case TG_CMD_COUNT:
-               if( goi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 0, goi.argv, "<no parameters>");
+               if (goi.argc != 0) {
+                       Jim_WrongNumArgs(goi.interp, 0, goi.argv, "<no parameters>");
                        return JIM_ERR;
                }
-               Jim_SetResult( goi.interp,
-                                          Jim_NewIntObj( goi.interp, max_target_number()));
+               for (x = 0, target = all_targets; target; target = target->next, x++)
+                       continue;
+               Jim_SetResult(goi.interp, Jim_NewIntObj(goi.interp, x));
                return JIM_OK;
        }
 
@@ -4222,8 +4653,8 @@ static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
 
 struct FastLoad
 {
-       u32 address;
-       u8 *data;
+       uint32_t address;
+       uint8_t *data;
        int length;
 
 };
@@ -4233,16 +4664,16 @@ static struct FastLoad *fastload;
 
 static void free_fastload(void)
 {
-       if (fastload!=NULL)
+       if (fastload != NULL)
        {
                int i;
-               for (i=0; i<fastload_num; i++)
+               for (i = 0; i < fastload_num; i++)
                {
                        if (fastload[i].data)
                                free(fastload[i].data);
                }
                free(fastload);
-               fastload=NULL;
+               fastload = NULL;
        }
 }
 
@@ -4251,51 +4682,22 @@ static void free_fastload(void)
 
 static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       u8 *buffer;
-       u32 buf_cnt;
-       u32 image_size;
-       u32 min_address=0;
-       u32 max_address=0xffffffff;
+       uint8_t *buffer;
+       uint32_t buf_cnt;
+       uint32_t image_size;
+       uint32_t min_address = 0;
+       uint32_t max_address = 0xffffffff;
        int i;
-       int retval;
 
        image_t image;
 
        duration_t duration;
        char *duration_text;
 
-       if ((argc < 1)||(argc > 5))
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
-       if (argc >= 2)
-       {
-               image.base_address_set = 1;
-               image.base_address = strtoul(args[1], NULL, 0);
-       }
-       else
-       {
-               image.base_address_set = 0;
-       }
-
-
-       image.start_address_set = 0;
-
-       if (argc>=4)
-       {
-               min_address=strtoul(args[3], NULL, 0);
-       }
-       if (argc>=5)
-       {
-               max_address=strtoul(args[4], NULL, 0)+min_address;
-       }
-
-       if (min_address>max_address)
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
+       int retval = parse_load_image_command_args(args, argc,
+                       &image, &min_address, &max_address);
+       if (ERROR_OK != retval)
+               return retval;
 
        duration_start_measure(&duration);
 
@@ -4306,9 +4708,9 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
 
        image_size = 0x0;
        retval = ERROR_OK;
-       fastload_num=image.num_sections;
-       fastload=(struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
-       if (fastload==NULL)
+       fastload_num = image.num_sections;
+       fastload = (struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
+       if (fastload == NULL)
        {
                image_close(&image);
                return ERROR_FAIL;
@@ -4319,7 +4721,8 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL)
                {
-                       command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
+                       command_print(cmd_ctx, "error allocating buffer for section (%d bytes)",
+                                                 (int)(image.sections[i].size));
                        break;
                }
 
@@ -4329,55 +4732,57 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
                        break;
                }
 
-               u32 offset=0;
-               u32 length=buf_cnt;
+               uint32_t offset = 0;
+               uint32_t length = buf_cnt;
 
 
                /* DANGER!!! beware of unsigned comparision here!!! */
 
-               if ((image.sections[i].base_address+buf_cnt>=min_address)&&
-                               (image.sections[i].base_address<max_address))
+               if ((image.sections[i].base_address + buf_cnt >= min_address)&&
+                               (image.sections[i].base_address < max_address))
                {
-                       if (image.sections[i].base_address<min_address)
+                       if (image.sections[i].base_address < min_address)
                        {
                                /* clip addresses below */
-                               offset+=min_address-image.sections[i].base_address;
-                               length-=offset;
+                               offset += min_address-image.sections[i].base_address;
+                               length -= offset;
                        }
 
-                       if (image.sections[i].base_address+buf_cnt>max_address)
+                       if (image.sections[i].base_address + buf_cnt > max_address)
                        {
-                               length-=(image.sections[i].base_address+buf_cnt)-max_address;
+                               length -= (image.sections[i].base_address + buf_cnt)-max_address;
                        }
 
-                       fastload[i].address=image.sections[i].base_address+offset;
-                       fastload[i].data=malloc(length);
-                       if (fastload[i].data==NULL)
+                       fastload[i].address = image.sections[i].base_address + offset;
+                       fastload[i].data = malloc(length);
+                       if (fastload[i].data == NULL)
                        {
                                free(buffer);
                                break;
                        }
-                       memcpy(fastload[i].data, buffer+offset, length);
-                       fastload[i].length=length;
+                       memcpy(fastload[i].data, buffer + offset, length);
+                       fastload[i].length = length;
 
                        image_size += length;
-                       command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
+                       command_print(cmd_ctx, "%u bytes written at address 0x%8.8x",
+                                                 (unsigned int)length,
+                                                 ((unsigned int)(image.sections[i].base_address + offset)));
                }
 
                free(buffer);
        }
 
        duration_stop_measure(&duration, &duration_text);
-       if (retval==ERROR_OK)
+       if (retval == ERROR_OK)
        {
-               command_print(cmd_ctx, "Loaded %u bytes in %s", image_size, duration_text);
+               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.");
        }
        free(duration_text);
 
        image_close(&image);
 
-       if (retval!=ERROR_OK)
+       if (retval != ERROR_OK)
        {
                free_fastload();
        }
@@ -4387,28 +4792,116 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha
 
 static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       if (argc>0)
+       if (argc > 0)
                return ERROR_COMMAND_SYNTAX_ERROR;
-       if (fastload==NULL)
+       if (fastload == NULL)
        {
                LOG_ERROR("No image in memory");
                return ERROR_FAIL;
        }
        int i;
-       int ms=timeval_ms();
-       int size=0;
-       int retval=ERROR_OK;
-       for (i=0; i<fastload_num;i++)
+       int ms = timeval_ms();
+       int size = 0;
+       int retval = ERROR_OK;
+       for (i = 0; i < fastload_num;i++)
        {
                target_t *target = get_current_target(cmd_ctx);
-               command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x", fastload[i].address, fastload[i].length);
-               if (retval==ERROR_OK)
+               command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x",
+                                         (unsigned int)(fastload[i].address),
+                                         (unsigned int)(fastload[i].length));
+               if (retval == ERROR_OK)
                {
                        retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
                }
-               size+=fastload[i].length;
+               size += fastload[i].length;
        }
-       int after=timeval_ms();
+       int after = timeval_ms();
        command_print(cmd_ctx, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
        return retval;
 }
+
+static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       command_context_t *context;
+       target_t *target;
+       int retval;
+
+       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;
+       }
+       op2 = l;
+
+       e = Jim_GetLong(interp, argv[4], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       CRn = l;
+
+       e = Jim_GetLong(interp, argv[5], &l);
+       if (e != JIM_OK) {
+               return e;
+       }
+       CRm = 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;
+}

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)