use ARRAY_SIZE macro
[fw/openocd] / src / target / xscale.c
index a04bf429541906032d4fb23d7762b5b61faae073..07fcc4c0af42a3ef387ccd1a1bcf1cbb874a7167 100644 (file)
 #include "config.h"
 #endif
 
+#include "breakpoints.h"
 #include "xscale.h"
 #include "target_type.h"
-#include "arm7_9_common.h"
+#include "arm_jtag.h"
 #include "arm_simulator.h"
 #include "arm_disassembler.h"
 #include "time_support.h"
+#include "register.h"
 #include "image.h"
 
 
 
 
 /* forward declarations */
-static int xscale_resume(struct target_s *, int current,
+static int xscale_resume(struct target *, int current,
        uint32_t address, int handle_breakpoints, int debug_execution);
-static int xscale_debug_entry(target_t *);
-static int xscale_restore_context(target_t *);
-static int xscale_get_reg(reg_t *reg);
-static int xscale_set_reg(reg_t *reg, uint8_t *buf);
-static int xscale_set_breakpoint(struct target_s *, breakpoint_t *);
-static int xscale_set_watchpoint(struct target_s *, struct watchpoint *);
-static int xscale_unset_breakpoint(struct target_s *, breakpoint_t *);
-static int xscale_read_trace(target_t *);
+static int xscale_debug_entry(struct target *);
+static int xscale_restore_context(struct target *);
+static int xscale_get_reg(struct reg *reg);
+static int xscale_set_reg(struct reg *reg, uint8_t *buf);
+static int xscale_set_breakpoint(struct target *, struct breakpoint *);
+static int xscale_set_watchpoint(struct target *, struct watchpoint *);
+static int xscale_unset_breakpoint(struct target *, struct breakpoint *);
+static int xscale_read_trace(struct target *);
 
 
 /* This XScale "debug handler" is loaded into the processor's
@@ -106,7 +108,7 @@ static char *const xscale_reg_list[] =
        "XSCALE_TXRXCTRL",
 };
 
-static const xscale_reg_t xscale_reg_arch_info[] =
+static const struct xscale_reg xscale_reg_arch_info[] =
 {
        {XSCALE_MAINID, NULL},
        {XSCALE_CACHETYPE, NULL},
@@ -132,10 +134,8 @@ static const xscale_reg_t xscale_reg_arch_info[] =
        {-1, NULL}, /* TXRXCTRL implicit access via JTAG */
 };
 
-static int xscale_reg_arch_type = -1;
-
 /* convenience wrapper to access XScale specific registers */
-static int xscale_set_reg_u32(reg_t *reg, uint32_t value)
+static int xscale_set_reg_u32(struct reg *reg, uint32_t value)
 {
        uint8_t buf[4];
 
@@ -146,8 +146,8 @@ static int xscale_set_reg_u32(reg_t *reg, uint32_t value)
 
 static const char xscale_not[] = "target is not an XScale";
 
-static int xscale_verify_pointer(struct command_context_s *cmd_ctx,
-               struct xscale_common_s *xscale)
+static int xscale_verify_pointer(struct command_context *cmd_ctx,
+               struct xscale_common *xscale)
 {
        if (xscale->common_magic != XSCALE_COMMON_MAGIC) {
                command_print(cmd_ctx, xscale_not);
@@ -178,9 +178,9 @@ static int xscale_jtag_set_instr(struct jtag_tap *tap, uint32_t new_instr)
        return ERROR_OK;
 }
 
-static int xscale_read_dcsr(target_t *target)
+static int xscale_read_dcsr(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
        struct scan_field fields[3];
        uint8_t field0 = 0x0;
@@ -251,7 +251,7 @@ static void xscale_getbuf(jtag_callback_data_t arg)
        *((uint32_t *)in) = buf_get_u32(in, 0, 32);
 }
 
-static int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
+static int xscale_receive(struct target *target, uint32_t *buffer, int num_words)
 {
        if (num_words == 0)
                return ERROR_INVALID_ARGUMENTS;
@@ -355,9 +355,9 @@ static int xscale_receive(target_t *target, uint32_t *buffer, int num_words)
        return retval;
 }
 
-static int xscale_read_tx(target_t *target, int consume)
+static int xscale_read_tx(struct target *target, int consume)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        tap_state_t path[3];
        tap_state_t noconsume_path[6];
        int retval;
@@ -412,7 +412,7 @@ static int xscale_read_tx(target_t *target, int consume)
                        jtag_add_pathmove(3, path);
                else
                {
-                       jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
+                       jtag_add_pathmove(ARRAY_SIZE(noconsume_path), noconsume_path);
                }
 
                jtag_add_dr_scan(3, fields, jtag_set_end_state(TAP_IDLE));
@@ -453,9 +453,9 @@ static int xscale_read_tx(target_t *target, int consume)
        return ERROR_OK;
 }
 
-static int xscale_write_rx(target_t *target)
+static int xscale_write_rx(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
        struct timeval timeout, now;
        struct scan_field fields[3];
@@ -539,7 +539,7 @@ static int xscale_write_rx(target_t *target)
 }
 
 /* send count elements of size byte to the debug handler */
-static int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
+static int xscale_send(struct target *target, uint8_t *buffer, int count, int size)
 {
        uint32_t t[3];
        int bits[3];
@@ -583,7 +583,7 @@ static int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
                        break;
                default:
                        LOG_ERROR("BUG: size neither 4, 2 nor 1");
-                       exit(-1);
+                       return ERROR_INVALID_ARGUMENTS;
                }
                jtag_add_dr_out(target->tap,
                                3,
@@ -602,17 +602,17 @@ static int xscale_send(target_t *target, uint8_t *buffer, int count, int size)
        return ERROR_OK;
 }
 
-static int xscale_send_u32(target_t *target, uint32_t value)
+static int xscale_send_u32(struct target *target, uint32_t value)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        buf_set_u32(xscale->reg_cache->reg_list[XSCALE_RX].value, 0, 32, value);
        return xscale_write_rx(target);
 }
 
-static int xscale_write_dcsr(target_t *target, int hold_rst, int ext_dbg_brk)
+static int xscale_write_dcsr(struct target *target, int hold_rst, int ext_dbg_brk)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
        struct scan_field fields[3];
        uint8_t field0 = 0x0;
@@ -681,7 +681,7 @@ static unsigned int parity (unsigned int v)
        return (0x6996 >> v) & 1;
 }
 
-static int xscale_load_ic(target_t *target, uint32_t va, uint32_t buffer[8])
+static int xscale_load_ic(struct target *target, uint32_t va, uint32_t buffer[8])
 {
        uint8_t packet[4];
        uint8_t cmd;
@@ -736,7 +736,7 @@ static int xscale_load_ic(target_t *target, uint32_t va, uint32_t buffer[8])
        return jtag_execute_queue();
 }
 
-static int xscale_invalidate_ic_line(target_t *target, uint32_t va)
+static int xscale_invalidate_ic_line(struct target *target, uint32_t va)
 {
        uint8_t packet[4];
        uint8_t cmd;
@@ -766,9 +766,9 @@ static int xscale_invalidate_ic_line(target_t *target, uint32_t va)
        return ERROR_OK;
 }
 
-static int xscale_update_vectors(target_t *target)
+static int xscale_update_vectors(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int i;
        int retval;
 
@@ -830,10 +830,10 @@ static int xscale_update_vectors(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_arch_state(struct target_s *target)
+static int xscale_arch_state(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
 
        static const char *state[] =
        {
@@ -848,7 +848,7 @@ static int xscale_arch_state(struct target_s *target)
        if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC)
        {
                LOG_ERROR("BUG: called for a non-ARMv4/5 target");
-               exit(-1);
+               return ERROR_INVALID_ARGUMENTS;
        }
 
        LOG_USER("target halted in %s state due to %s, current mode: %s\n"
@@ -857,8 +857,8 @@ static int xscale_arch_state(struct target_s *target)
                        "%s",
                         armv4_5_state_strings[armv4_5->core_state],
                         Jim_Nvp_value2name_simple(nvp_target_debug_reason, target->debug_reason)->name ,
-                        armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)],
-                        buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32),
+                        arm_mode_name(armv4_5->core_mode),
+                        buf_get_u32(armv4_5->cpsr->value, 0, 32),
                         buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32),
                         state[xscale->armv4_5_mmu.mmu_enabled],
                         state[xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled],
@@ -868,7 +868,7 @@ static int xscale_arch_state(struct target_s *target)
        return ERROR_OK;
 }
 
-static int xscale_poll(target_t *target)
+static int xscale_poll(struct target *target)
 {
        int retval = ERROR_OK;
 
@@ -908,10 +908,10 @@ static int xscale_poll(target_t *target)
        return retval;
 }
 
-static int xscale_debug_entry(target_t *target)
+static int xscale_debug_entry(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
        uint32_t pc;
        uint32_t buffer[10];
        int i;
@@ -948,28 +948,17 @@ static int xscale_debug_entry(target_t *target)
                LOG_DEBUG("r%i: 0x%8.8" PRIx32 "", i, buffer[i + 1]);
        }
 
-       buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32, buffer[9]);
-       armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 1;
-       armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
+       arm_set_cpsr(armv4_5, buffer[9]);
        LOG_DEBUG("cpsr: 0x%8.8" PRIx32 "", buffer[9]);
 
-       armv4_5->core_mode = buffer[9] & 0x1f;
-       if (armv4_5_mode_to_number(armv4_5->core_mode) == -1)
+       if (!is_arm_mode(armv4_5->core_mode))
        {
                target->state = TARGET_UNKNOWN;
                LOG_ERROR("cpsr contains invalid mode value - communication failure");
                return ERROR_TARGET_FAILURE;
        }
-       LOG_DEBUG("target entered debug state in %s mode", armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)]);
-
-       if (buffer[9] & 0x20)
-               armv4_5->core_state = ARMV4_5_STATE_THUMB;
-       else
-               armv4_5->core_state = ARMV4_5_STATE_ARM;
-
-
-       if (armv4_5_mode_to_number(armv4_5->core_mode)==-1)
-               return ERROR_FAIL;
+       LOG_DEBUG("target entered debug state in %s mode",
+                        arm_mode_name(armv4_5->core_mode));
 
        /* get banked registers, r8 to r14, and spsr if not in USR/SYS mode */
        if ((armv4_5->core_mode != ARMV4_5_MODE_USR) && (armv4_5->core_mode != ARMV4_5_MODE_SYS))
@@ -1088,9 +1077,9 @@ static int xscale_debug_entry(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_halt(target_t *target)
+static int xscale_halt(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        LOG_DEBUG("target->state: %s",
                  target_state_name(target));
@@ -1122,15 +1111,15 @@ static int xscale_halt(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_enable_single_step(struct target_s *target, uint32_t next_pc)
+static int xscale_enable_single_step(struct target *target, uint32_t next_pc)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       reg_t *ibcr0 = &xscale->reg_cache->reg_list[XSCALE_IBCR0];
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct reg *ibcr0 = &xscale->reg_cache->reg_list[XSCALE_IBCR0];
        int retval;
 
        if (xscale->ibcr0_used)
        {
-               breakpoint_t *ibcr0_bp = breakpoint_find(target, buf_get_u32(ibcr0->value, 0, 32) & 0xfffffffe);
+               struct breakpoint *ibcr0_bp = breakpoint_find(target, buf_get_u32(ibcr0->value, 0, 32) & 0xfffffffe);
 
                if (ibcr0_bp)
                {
@@ -1149,10 +1138,10 @@ static int xscale_enable_single_step(struct target_s *target, uint32_t next_pc)
        return ERROR_OK;
 }
 
-static int xscale_disable_single_step(struct target_s *target)
+static int xscale_disable_single_step(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       reg_t *ibcr0 = &xscale->reg_cache->reg_list[XSCALE_IBCR0];
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct reg *ibcr0 = &xscale->reg_cache->reg_list[XSCALE_IBCR0];
        int retval;
 
        if ((retval = xscale_set_reg_u32(ibcr0, 0x0)) != ERROR_OK)
@@ -1161,7 +1150,7 @@ static int xscale_disable_single_step(struct target_s *target)
        return ERROR_OK;
 }
 
-static void xscale_enable_watchpoints(struct target_s *target)
+static void xscale_enable_watchpoints(struct target *target)
 {
        struct watchpoint *watchpoint = target->watchpoints;
 
@@ -1173,9 +1162,9 @@ static void xscale_enable_watchpoints(struct target_s *target)
        }
 }
 
-static void xscale_enable_breakpoints(struct target_s *target)
+static void xscale_enable_breakpoints(struct target *target)
 {
-       breakpoint_t *breakpoint = target->breakpoints;
+       struct breakpoint *breakpoint = target->breakpoints;
 
        /* set any pending breakpoints */
        while (breakpoint)
@@ -1186,12 +1175,12 @@ static void xscale_enable_breakpoints(struct target_s *target)
        }
 }
 
-static int xscale_resume(struct target_s *target, int current,
+static int xscale_resume(struct target *target, int current,
                uint32_t address, int handle_breakpoints, int debug_execution)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
-       breakpoint_t *breakpoint = target->breakpoints;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
+       struct breakpoint *breakpoint = target->breakpoints;
        uint32_t current_pc;
        int retval;
        int i;
@@ -1262,8 +1251,10 @@ static int xscale_resume(struct target_s *target, int current,
                                xscale_send_u32(target, 0x30);
 
                        /* send CPSR */
-                       xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
-                       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32 "", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
+                       xscale_send_u32(target,
+                               buf_get_u32(armv4_5->cpsr->value, 0, 32));
+                       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32,
+                               buf_get_u32(armv4_5->cpsr->value, 0, 32));
 
                        for (i = 7; i >= 0; i--)
                        {
@@ -1305,8 +1296,9 @@ static int xscale_resume(struct target_s *target, int current,
                xscale_send_u32(target, 0x30);
 
        /* send CPSR */
-       xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
-       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32 "", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
+       xscale_send_u32(target, buf_get_u32(armv4_5->cpsr->value, 0, 32));
+       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32,
+                       buf_get_u32(armv4_5->cpsr->value, 0, 32));
 
        for (i = 7; i >= 0; i--)
        {
@@ -1324,7 +1316,7 @@ static int xscale_resume(struct target_s *target, int current,
        if (!debug_execution)
        {
                /* registers are now invalid */
-               armv4_5_invalidate_core_regs(target);
+               register_cache_invalidate(armv4_5->core_cache);
                target->state = TARGET_RUNNING;
                target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
        }
@@ -1339,11 +1331,11 @@ static int xscale_resume(struct target_s *target, int current,
        return ERROR_OK;
 }
 
-static int xscale_step_inner(struct target_s *target, int current,
+static int xscale_step_inner(struct target *target, int current,
                uint32_t address, int handle_breakpoints)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
        uint32_t next_pc;
        int retval;
        int i;
@@ -1383,9 +1375,12 @@ static int xscale_step_inner(struct target_s *target, int current,
                        return retval;
 
        /* send CPSR */
-       if ((retval = xscale_send_u32(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32))) != ERROR_OK)
+       retval = xscale_send_u32(target,
+                       buf_get_u32(armv4_5->cpsr->value, 0, 32));
+       if (retval != ERROR_OK)
                return retval;
-       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32 "", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
+       LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32,
+                       buf_get_u32(armv4_5->cpsr->value, 0, 32));
 
        for (i = 7; i >= 0; i--)
        {
@@ -1403,8 +1398,7 @@ static int xscale_step_inner(struct target_s *target, int current,
        target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
 
        /* registers are now invalid */
-       if ((retval = armv4_5_invalidate_core_regs(target)) != ERROR_OK)
-               return retval;
+       register_cache_invalidate(armv4_5->core_cache);
 
        /* wait for and process debug entry */
        if ((retval = xscale_debug_entry(target)) != ERROR_OK)
@@ -1419,11 +1413,11 @@ static int xscale_step_inner(struct target_s *target, int current,
        return ERROR_OK;
 }
 
-static int xscale_step(struct target_s *target, int current,
+static int xscale_step(struct target *target, int current,
                uint32_t address, int handle_breakpoints)
 {
-       struct armv4_5_common_s *armv4_5 = target_to_armv4_5(target);
-       breakpoint_t *breakpoint = target->breakpoints;
+       struct arm *armv4_5 = target_to_armv4_5(target);
+       struct breakpoint *breakpoint = target->breakpoints;
 
        uint32_t current_pc;
        int retval;
@@ -1474,9 +1468,9 @@ static int xscale_step(struct target_s *target, int current,
 
 }
 
-static int xscale_assert_reset(target_t *target)
+static int xscale_assert_reset(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        LOG_DEBUG("target->state: %s",
                  target_state_name(target));
@@ -1515,10 +1509,10 @@ static int xscale_assert_reset(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_deassert_reset(target_t *target)
+static int xscale_deassert_reset(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       breakpoint_t *breakpoint = target->breakpoints;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct breakpoint *breakpoint = target->breakpoints;
 
        LOG_DEBUG("-");
 
@@ -1540,7 +1534,7 @@ static int xscale_deassert_reset(target_t *target)
                breakpoint = breakpoint->next;
        }
 
-       armv4_5_invalidate_core_regs(target);
+       register_cache_invalidate(xscale->armv4_5_common.core_cache);
 
        /* FIXME mark hardware watchpoints got unset too.  Also,
         * at least some of the XScale registers are invalid...
@@ -1649,23 +1643,25 @@ static int xscale_deassert_reset(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_read_core_reg(struct target_s *target, int num,
-               enum armv4_5_mode mode)
+static int xscale_read_core_reg(struct target *target, struct reg *r,
+               int num, enum armv4_5_mode mode)
 {
+       /** \todo add debug handler support for core register reads */
        LOG_ERROR("not implemented");
        return ERROR_OK;
 }
 
-static int xscale_write_core_reg(struct target_s *target, int num,
-               enum armv4_5_mode mode, uint32_t value)
+static int xscale_write_core_reg(struct target *target, struct reg *r,
+               int num, enum armv4_5_mode mode, uint32_t value)
 {
+       /** \todo add debug handler support for core register writes */
        LOG_ERROR("not implemented");
        return ERROR_OK;
 }
 
-static int xscale_full_context(target_t *target)
+static int xscale_full_context(struct target *target)
 {
-       struct armv4_5_common_s *armv4_5 = target_to_armv4_5(target);
+       struct arm *armv4_5 = target_to_armv4_5(target);
 
        uint32_t *buffer;
 
@@ -1739,9 +1735,9 @@ static int xscale_full_context(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_restore_context(target_t *target)
+static int xscale_restore_context(struct target *target)
 {
-       struct armv4_5_common_s *armv4_5 = target_to_armv4_5(target);
+       struct arm *armv4_5 = target_to_armv4_5(target);
 
        int i, j;
 
@@ -1806,10 +1802,10 @@ static int xscale_restore_context(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_read_memory(struct target_s *target, uint32_t address,
+static int xscale_read_memory(struct target *target, uint32_t address,
                uint32_t size, uint32_t count, uint8_t *buffer)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        uint32_t *buf32;
        uint32_t i;
        int retval;
@@ -1863,8 +1859,8 @@ static int xscale_read_memory(struct target_s *target, uint32_t address,
                                *buffer++ = buf32[i] & 0xff;
                                break;
                        default:
-                               LOG_ERROR("should never get here");
-                               exit(-1);
+                               LOG_ERROR("invalid read size");
+                               return ERROR_INVALID_ARGUMENTS;
                }
        }
 
@@ -1885,10 +1881,10 @@ static int xscale_read_memory(struct target_s *target, uint32_t address,
        return ERROR_OK;
 }
 
-static int xscale_write_memory(struct target_s *target, uint32_t address,
+static int xscale_write_memory(struct target *target, uint32_t address,
                uint32_t size, uint32_t count, uint8_t *buffer)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
        LOG_DEBUG("address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32, address, size, count);
@@ -1963,15 +1959,15 @@ static int xscale_write_memory(struct target_s *target, uint32_t address,
        return ERROR_OK;
 }
 
-static int xscale_bulk_write_memory(target_t *target, uint32_t address,
+static int xscale_bulk_write_memory(struct target *target, uint32_t address,
                uint32_t count, uint8_t *buffer)
 {
        return xscale_write_memory(target, address, 4, count, buffer);
 }
 
-static uint32_t xscale_get_ttb(target_t *target)
+static uint32_t xscale_get_ttb(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        uint32_t ttb;
 
        xscale_get_reg(&xscale->reg_cache->reg_list[XSCALE_TTB]);
@@ -1980,10 +1976,10 @@ static uint32_t xscale_get_ttb(target_t *target)
        return ttb;
 }
 
-static void xscale_disable_mmu_caches(target_t *target, int mmu,
+static void xscale_disable_mmu_caches(struct target *target, int mmu,
                int d_u_cache, int i_cache)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        uint32_t cp15_control;
 
        /* read cp15 control register */
@@ -2019,10 +2015,10 @@ static void xscale_disable_mmu_caches(target_t *target, int mmu,
        xscale_send_u32(target, 0x53);
 }
 
-static void xscale_enable_mmu_caches(target_t *target, int mmu,
+static void xscale_enable_mmu_caches(struct target *target, int mmu,
                int d_u_cache, int i_cache)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        uint32_t cp15_control;
 
        /* read cp15 control register */
@@ -2045,11 +2041,11 @@ static void xscale_enable_mmu_caches(target_t *target, int mmu,
        xscale_send_u32(target, 0x53);
 }
 
-static int xscale_set_breakpoint(struct target_s *target,
-               breakpoint_t *breakpoint)
+static int xscale_set_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
        int retval;
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2118,10 +2114,10 @@ static int xscale_set_breakpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_add_breakpoint(struct target_s *target,
-               breakpoint_t *breakpoint)
+static int xscale_add_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2149,11 +2145,11 @@ static int xscale_add_breakpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_unset_breakpoint(struct target_s *target,
-               breakpoint_t *breakpoint)
+static int xscale_unset_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
        int retval;
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2204,9 +2200,9 @@ static int xscale_unset_breakpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int xscale_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2225,12 +2221,12 @@ static int xscale_remove_breakpoint(struct target_s *target, breakpoint_t *break
        return ERROR_OK;
 }
 
-static int xscale_set_watchpoint(struct target_s *target,
+static int xscale_set_watchpoint(struct target *target,
                struct watchpoint *watchpoint)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        uint8_t enable = 0;
-       reg_t *dbcon = &xscale->reg_cache->reg_list[XSCALE_DBCON];
+       struct reg *dbcon = &xscale->reg_cache->reg_list[XSCALE_DBCON];
        uint32_t dbcon_value = buf_get_u32(dbcon->value, 0, 32);
 
        if (target->state != TARGET_HALTED)
@@ -2281,10 +2277,10 @@ static int xscale_set_watchpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_add_watchpoint(struct target_s *target,
+static int xscale_add_watchpoint(struct target *target,
                struct watchpoint *watchpoint)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2307,11 +2303,11 @@ static int xscale_add_watchpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_unset_watchpoint(struct target_s *target,
+static int xscale_unset_watchpoint(struct target *target,
                struct watchpoint *watchpoint)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       reg_t *dbcon = &xscale->reg_cache->reg_list[XSCALE_DBCON];
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct reg *dbcon = &xscale->reg_cache->reg_list[XSCALE_DBCON];
        uint32_t dbcon_value = buf_get_u32(dbcon->value, 0, 32);
 
        if (target->state != TARGET_HALTED)
@@ -2343,9 +2339,9 @@ static int xscale_unset_watchpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_remove_watchpoint(struct target_s *target, struct watchpoint *watchpoint)
+static int xscale_remove_watchpoint(struct target *target, struct watchpoint *watchpoint)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -2363,11 +2359,11 @@ static int xscale_remove_watchpoint(struct target_s *target, struct watchpoint *
        return ERROR_OK;
 }
 
-static int xscale_get_reg(reg_t *reg)
+static int xscale_get_reg(struct reg *reg)
 {
-       xscale_reg_t *arch_info = reg->arch_info;
-       target_t *target = arch_info->target;
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_reg *arch_info = reg->arch_info;
+       struct target *target = arch_info->target;
+       struct xscale_common *xscale = target_to_xscale(target);
 
        /* DCSR, TX and RX are accessible via JTAG */
        if (strcmp(reg->name, "XSCALE_DCSR") == 0)
@@ -2408,11 +2404,11 @@ static int xscale_get_reg(reg_t *reg)
        return ERROR_OK;
 }
 
-static int xscale_set_reg(reg_t *reg, uint8_t* buf)
+static int xscale_set_reg(struct reg *reg, uint8_t* buf)
 {
-       xscale_reg_t *arch_info = reg->arch_info;
-       target_t *target = arch_info->target;
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_reg *arch_info = reg->arch_info;
+       struct target *target = arch_info->target;
+       struct xscale_common *xscale = target_to_xscale(target);
        uint32_t value = buf_get_u32(buf, 0, 32);
 
        /* DCSR, TX and RX are accessible via JTAG */
@@ -2452,11 +2448,11 @@ static int xscale_set_reg(reg_t *reg, uint8_t* buf)
        return ERROR_OK;
 }
 
-static int xscale_write_dcsr_sw(target_t *target, uint32_t value)
+static int xscale_write_dcsr_sw(struct target *target, uint32_t value)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       reg_t *dcsr = &xscale->reg_cache->reg_list[XSCALE_DCSR];
-       xscale_reg_t *dcsr_arch_info = dcsr->arch_info;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct reg *dcsr = &xscale->reg_cache->reg_list[XSCALE_DCSR];
+       struct xscale_reg *dcsr_arch_info = dcsr->arch_info;
 
        /* send CP write request (command 0x41) */
        xscale_send_u32(target, 0x41);
@@ -2471,11 +2467,11 @@ static int xscale_write_dcsr_sw(target_t *target, uint32_t value)
        return ERROR_OK;
 }
 
-static int xscale_read_trace(target_t *target)
+static int xscale_read_trace(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
-       xscale_trace_data_t **trace_data_p;
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
+       struct xscale_trace_data **trace_data_p;
 
        /* 258 words from debug handler
         * 256 trace buffer entries
@@ -2529,12 +2525,12 @@ static int xscale_read_trace(target_t *target)
        for (trace_data_p = &xscale->trace.data; *trace_data_p; trace_data_p = &(*trace_data_p)->next)
                ;
 
-       *trace_data_p = malloc(sizeof(xscale_trace_data_t));
+       *trace_data_p = malloc(sizeof(struct xscale_trace_data));
        (*trace_data_p)->next = NULL;
        (*trace_data_p)->chkpt0 = trace_buffer[256];
        (*trace_data_p)->chkpt1 = trace_buffer[257];
        (*trace_data_p)->last_instruction = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
-       (*trace_data_p)->entries = malloc(sizeof(xscale_trace_entry_t) * (256 - j));
+       (*trace_data_p)->entries = malloc(sizeof(struct xscale_trace_entry) * (256 - j));
        (*trace_data_p)->depth = 256 - j;
 
        for (i = j; i < 256; i++)
@@ -2549,13 +2545,13 @@ static int xscale_read_trace(target_t *target)
        return ERROR_OK;
 }
 
-static int xscale_read_instruction(target_t *target,
-               arm_instruction_t *instruction)
+static int xscale_read_instruction(struct target *target,
+               struct arm_instruction *instruction)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int i;
        int section = -1;
-       uint32_t size_read;
+       size_t size_read;
        uint32_t opcode;
        int retval;
 
@@ -2614,7 +2610,7 @@ static int xscale_read_instruction(target_t *target,
        return ERROR_OK;
 }
 
-static int xscale_branch_address(xscale_trace_data_t *trace_data,
+static int xscale_branch_address(struct xscale_trace_data *trace_data,
                int i, uint32_t *target)
 {
        /* if there are less than four entries prior to the indirect branch message
@@ -2630,12 +2626,12 @@ static int xscale_branch_address(xscale_trace_data_t *trace_data,
        return 0;
 }
 
-static int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
+static int xscale_analyze_trace(struct target *target, struct command_context *cmd_ctx)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int next_pc_ok = 0;
        uint32_t next_pc = 0x0;
-       xscale_trace_data_t *trace_data = xscale->trace.data;
+       struct xscale_trace_data *trace_data = xscale->trace.data;
        int retval;
 
        while (trace_data)
@@ -2723,7 +2719,7 @@ static int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
                        if (xscale->trace.pc_ok)
                        {
                                int executed = (trace_data->entries[i].data & 0xf) + rollover * 16;
-                               arm_instruction_t instruction;
+                               struct arm_instruction instruction;
 
                                if ((exception == 6) || (exception == 7))
                                {
@@ -2795,7 +2791,7 @@ static int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
 
                for (; xscale->trace.current_pc < trace_data->last_instruction; xscale->trace.current_pc += (xscale->trace.core_state == ARMV4_5_STATE_ARM) ? 4 : 2)
                {
-                       arm_instruction_t instruction;
+                       struct arm_instruction instruction;
                        if ((retval = xscale_read_instruction(target, &instruction)) != ERROR_OK)
                        {
                                /* can't continue tracing with no image available */
@@ -2817,29 +2813,29 @@ static int xscale_analyze_trace(target_t *target, command_context_t *cmd_ctx)
        return ERROR_OK;
 }
 
-static void xscale_build_reg_cache(target_t *target)
+static const struct reg_arch_type xscale_reg_type = {
+       .get = xscale_get_reg,
+       .set = xscale_set_reg,
+};
+
+static void xscale_build_reg_cache(struct target *target)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
-       reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
-       xscale_reg_t *arch_info = malloc(sizeof(xscale_reg_arch_info));
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
+       struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
+       struct xscale_reg *arch_info = malloc(sizeof(xscale_reg_arch_info));
        int i;
-       int num_regs = sizeof(xscale_reg_arch_info) / sizeof(xscale_reg_t);
+       int num_regs = ARRAY_SIZE(xscale_reg_arch_info);
 
        (*cache_p) = armv4_5_build_reg_cache(target, armv4_5);
-       armv4_5->core_cache = (*cache_p);
-
-       /* register a register arch-type for XScale dbg registers only once */
-       if (xscale_reg_arch_type == -1)
-               xscale_reg_arch_type = register_reg_arch_type(xscale_get_reg, xscale_set_reg);
 
-       (*cache_p)->next = malloc(sizeof(reg_cache_t));
+       (*cache_p)->next = malloc(sizeof(struct reg_cache));
        cache_p = &(*cache_p)->next;
 
        /* fill in values for the xscale reg cache */
        (*cache_p)->name = "XScale registers";
        (*cache_p)->next = NULL;
-       (*cache_p)->reg_list = malloc(num_regs * sizeof(reg_t));
+       (*cache_p)->reg_list = malloc(num_regs * sizeof(struct reg));
        (*cache_p)->num_regs = num_regs;
 
        for (i = 0; i < num_regs; i++)
@@ -2849,10 +2845,8 @@ static void xscale_build_reg_cache(target_t *target)
                (*cache_p)->reg_list[i].dirty = 0;
                (*cache_p)->reg_list[i].valid = 0;
                (*cache_p)->reg_list[i].size = 32;
-               (*cache_p)->reg_list[i].bitfield_desc = NULL;
-               (*cache_p)->reg_list[i].num_bitfields = 0;
                (*cache_p)->reg_list[i].arch_info = &arch_info[i];
-               (*cache_p)->reg_list[i].arch_type = xscale_reg_arch_type;
+               (*cache_p)->reg_list[i].type = &xscale_reg_type;
                arch_info[i] = xscale_reg_arch_info[i];
                arch_info[i].target = target;
        }
@@ -2860,17 +2854,17 @@ static void xscale_build_reg_cache(target_t *target)
        xscale->reg_cache = (*cache_p);
 }
 
-static int xscale_init_target(struct command_context_s *cmd_ctx,
-               struct target_s *target)
+static int xscale_init_target(struct command_context *cmd_ctx,
+               struct target *target)
 {
        xscale_build_reg_cache(target);
        return ERROR_OK;
 }
 
-static int xscale_init_arch_info(target_t *target,
-               xscale_common_t *xscale, struct jtag_tap *tap, const char *variant)
+static int xscale_init_arch_info(struct target *target,
+               struct xscale_common *xscale, struct jtag_tap *tap, const char *variant)
 {
-       armv4_5_common_t *armv4_5;
+       struct arm *armv4_5;
        uint32_t high_reset_branch, low_reset_branch;
        int i;
 
@@ -2972,9 +2966,9 @@ static int xscale_init_arch_info(target_t *target,
        return ERROR_OK;
 }
 
-static int xscale_target_create(struct target_s *target, Jim_Interp *interp)
+static int xscale_target_create(struct target *target, Jim_Interp *interp)
 {
-       xscale_common_t *xscale;
+       struct xscale_common *xscale;
 
        if (sizeof xscale_debug_handler - 1 > 0x800) {
                LOG_ERROR("debug_handler.bin: larger than 2kb");
@@ -2991,29 +2985,29 @@ static int xscale_target_create(struct target_s *target, Jim_Interp *interp)
 
 COMMAND_HANDLER(xscale_handle_debug_handler_command)
 {
-       target_t *target = NULL;
-       xscale_common_t *xscale;
+       struct target *target = NULL;
+       struct xscale_common *xscale;
        int retval;
        uint32_t handler_address;
 
-       if (argc < 2)
+       if (CMD_ARGC < 2)
        {
                LOG_ERROR("'xscale debug_handler <target#> <address>' command takes two required operands");
                return ERROR_OK;
        }
 
-       if ((target = get_target(args[0])) == NULL)
+       if ((target = get_target(CMD_ARGV[0])) == NULL)
        {
-               LOG_ERROR("target '%s' not defined", args[0]);
+               LOG_ERROR("target '%s' not defined", CMD_ARGV[0]);
                return ERROR_FAIL;
        }
 
        xscale = target_to_xscale(target);
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
-       COMMAND_PARSE_NUMBER(u32, args[1], handler_address);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], handler_address);
 
        if (((handler_address >= 0x800) && (handler_address <= 0x1fef800)) ||
                ((handler_address >= 0xfe000800) && (handler_address <= 0xfffff800)))
@@ -3031,28 +3025,28 @@ COMMAND_HANDLER(xscale_handle_debug_handler_command)
 
 COMMAND_HANDLER(xscale_handle_cache_clean_address_command)
 {
-       target_t *target = NULL;
-       xscale_common_t *xscale;
+       struct target *target = NULL;
+       struct xscale_common *xscale;
        int retval;
        uint32_t cache_clean_address;
 
-       if (argc < 2)
+       if (CMD_ARGC < 2)
        {
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       target = get_target(args[0]);
+       target = get_target(CMD_ARGV[0]);
        if (target == NULL)
        {
-               LOG_ERROR("target '%s' not defined", args[0]);
+               LOG_ERROR("target '%s' not defined", CMD_ARGV[0]);
                return ERROR_FAIL;
        }
        xscale = target_to_xscale(target);
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
-       COMMAND_PARSE_NUMBER(u32, args[1], cache_clean_address);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], cache_clean_address);
 
        if (cache_clean_address & 0xffff)
        {
@@ -3068,21 +3062,21 @@ COMMAND_HANDLER(xscale_handle_cache_clean_address_command)
 
 COMMAND_HANDLER(xscale_handle_cache_info_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
-       return armv4_5_handle_cache_info_command(cmd_ctx, &xscale->armv4_5_mmu.armv4_5_cache);
+       return armv4_5_handle_cache_info_command(CMD_CTX, &xscale->armv4_5_mmu.armv4_5_cache);
 }
 
-static int xscale_virt2phys(struct target_s *target,
+static int xscale_virt2phys(struct target *target,
                uint32_t virtual, uint32_t *physical)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
        int type;
        uint32_t cb;
        int domain;
@@ -3102,9 +3096,9 @@ static int xscale_virt2phys(struct target_s *target,
        return ERROR_OK;
 }
 
-static int xscale_mmu(struct target_s *target, int *enabled)
+static int xscale_mmu(struct target *target, int *enabled)
 {
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct xscale_common *xscale = target_to_xscale(target);
 
        if (target->state != TARGET_HALTED)
        {
@@ -3117,114 +3111,99 @@ static int xscale_mmu(struct target_s *target, int *enabled)
 
 COMMAND_HANDLER(xscale_handle_mmu_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
        if (target->state != TARGET_HALTED)
        {
-               command_print(cmd_ctx, "target must be stopped for \"%s\" command", CMD_NAME);
+               command_print(CMD_CTX, "target must be stopped for \"%s\" command", CMD_NAME);
                return ERROR_OK;
        }
 
-       if (argc >= 1)
+       if (CMD_ARGC >= 1)
        {
-               if (strcmp("enable", args[0]) == 0)
-               {
+               bool enable;
+               COMMAND_PARSE_ENABLE(CMD_ARGV[0], enable);
+               if (enable)
                        xscale_enable_mmu_caches(target, 1, 0, 0);
-                       xscale->armv4_5_mmu.mmu_enabled = 1;
-               }
-               else if (strcmp("disable", args[0]) == 0)
-               {
+               else
                        xscale_disable_mmu_caches(target, 1, 0, 0);
-                       xscale->armv4_5_mmu.mmu_enabled = 0;
-               }
+               xscale->armv4_5_mmu.mmu_enabled = enable;
        }
 
-       command_print(cmd_ctx, "mmu %s", (xscale->armv4_5_mmu.mmu_enabled) ? "enabled" : "disabled");
+       command_print(CMD_CTX, "mmu %s", (xscale->armv4_5_mmu.mmu_enabled) ? "enabled" : "disabled");
 
        return ERROR_OK;
 }
 
 COMMAND_HANDLER(xscale_handle_idcache_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       int icache = 0, dcache = 0;
-       int retval;
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       int retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
        if (target->state != TARGET_HALTED)
        {
-               command_print(cmd_ctx, "target must be stopped for \"%s\" command", CMD_NAME);
+               command_print(CMD_CTX, "target must be stopped for \"%s\" command", CMD_NAME);
                return ERROR_OK;
        }
 
-       if (strcmp(CMD_NAME, "icache") == 0)
-               icache = 1;
-       else if (strcmp(CMD_NAME, "dcache") == 0)
-               dcache = 1;
+       bool icache;
+       COMMAND_PARSE_BOOL(CMD_NAME, icache, "icache", "dcache");
 
-       if (argc >= 1)
+       if (CMD_ARGC >= 1)
        {
-               if (strcmp("enable", args[0]) == 0)
-               {
-                       xscale_enable_mmu_caches(target, 0, dcache, icache);
-
-                       if (icache)
-                               xscale->armv4_5_mmu.armv4_5_cache.i_cache_enabled = 1;
-                       else if (dcache)
-                               xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled = 1;
-               }
-               else if (strcmp("disable", args[0]) == 0)
-               {
-                       xscale_disable_mmu_caches(target, 0, dcache, icache);
-
-                       if (icache)
-                               xscale->armv4_5_mmu.armv4_5_cache.i_cache_enabled = 0;
-                       else if (dcache)
-                               xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled = 0;
-               }
+               bool enable;
+               COMMAND_PARSE_ENABLE(CMD_ARGV[0], enable);
+               if (enable)
+                       xscale_enable_mmu_caches(target, 1, 0, 0);
+               else
+                       xscale_disable_mmu_caches(target, 1, 0, 0);
+               if (icache)
+                       xscale->armv4_5_mmu.armv4_5_cache.i_cache_enabled = enable;
+               else
+                       xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled = enable;
        }
 
-       if (icache)
-               command_print(cmd_ctx, "icache %s", (xscale->armv4_5_mmu.armv4_5_cache.i_cache_enabled) ? "enabled" : "disabled");
-
-       if (dcache)
-               command_print(cmd_ctx, "dcache %s", (xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled) ? "enabled" : "disabled");
+       bool enabled = icache ?
+                                       xscale->armv4_5_mmu.armv4_5_cache.i_cache_enabled :
+                                       xscale->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled;
+       const char *msg = enabled ? "enabled" : "disabled";
+       command_print(CMD_CTX, "%s %s", CMD_NAME, msg);
 
        return ERROR_OK;
 }
 
 COMMAND_HANDLER(xscale_handle_vector_catch_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
-       if (argc < 1)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "usage: xscale vector_catch [mask]");
+               command_print(CMD_CTX, "usage: xscale vector_catch [mask]");
        }
        else
        {
-               COMMAND_PARSE_NUMBER(u8, args[0], xscale->vector_catch);
+               COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0], xscale->vector_catch);
                buf_set_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, 16, 8, xscale->vector_catch);
                xscale_write_dcsr(target, -1, -1);
        }
 
-       command_print(cmd_ctx, "vector catch mask: 0x%2.2x", xscale->vector_catch);
+       command_print(CMD_CTX, "vector catch mask: 0x%2.2x", xscale->vector_catch);
 
        return ERROR_OK;
 }
@@ -3232,47 +3211,47 @@ COMMAND_HANDLER(xscale_handle_vector_catch_command)
 
 COMMAND_HANDLER(xscale_handle_vector_table_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int err = 0;
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
-       if (argc == 0) /* print current settings */
+       if (CMD_ARGC == 0) /* print current settings */
        {
                int idx;
 
-               command_print(cmd_ctx, "active user-set static vectors:");
+               command_print(CMD_CTX, "active user-set static vectors:");
                for (idx = 1; idx < 8; idx++)
                        if (xscale->static_low_vectors_set & (1 << idx))
-                               command_print(cmd_ctx, "low  %d: 0x%" PRIx32, idx, xscale->static_low_vectors[idx]);
+                               command_print(CMD_CTX, "low  %d: 0x%" PRIx32, idx, xscale->static_low_vectors[idx]);
                for (idx = 1; idx < 8; idx++)
                        if (xscale->static_high_vectors_set & (1 << idx))
-                               command_print(cmd_ctx, "high %d: 0x%" PRIx32, idx, xscale->static_high_vectors[idx]);
+                               command_print(CMD_CTX, "high %d: 0x%" PRIx32, idx, xscale->static_high_vectors[idx]);
                return ERROR_OK;
        }
 
-       if (argc != 3)
+       if (CMD_ARGC != 3)
                err = 1;
        else
        {
                int idx;
-               COMMAND_PARSE_NUMBER(int, args[1], idx);
+               COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], idx);
                uint32_t vec;
-               COMMAND_PARSE_NUMBER(u32, args[2], vec);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], vec);
 
                if (idx < 1 || idx >= 8)
                        err = 1;
 
-               if (!err && strcmp(args[0], "low") == 0)
+               if (!err && strcmp(CMD_ARGV[0], "low") == 0)
                {
                        xscale->static_low_vectors_set |= (1<<idx);
                        xscale->static_low_vectors[idx] = vec;
                }
-               else if (!err && (strcmp(args[0], "high") == 0))
+               else if (!err && (strcmp(CMD_ARGV[0], "high") == 0))
                {
                        xscale->static_high_vectors_set |= (1<<idx);
                        xscale->static_high_vectors[idx] = vec;
@@ -3282,7 +3261,7 @@ COMMAND_HANDLER(xscale_handle_vector_table_command)
        }
 
        if (err)
-               command_print(cmd_ctx, "usage: xscale vector_table <high|low> <index> <code>");
+               command_print(CMD_CTX, "usage: xscale vector_table <high|low> <index> <code>");
 
        return ERROR_OK;
 }
@@ -3290,25 +3269,25 @@ COMMAND_HANDLER(xscale_handle_vector_table_command)
 
 COMMAND_HANDLER(xscale_handle_trace_buffer_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       struct armv4_5_common_s *armv4_5 = &xscale->armv4_5_common;
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct arm *armv4_5 = &xscale->armv4_5_common;
        uint32_t dcsr_value;
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
        if (target->state != TARGET_HALTED)
        {
-               command_print(cmd_ctx, "target must be stopped for \"%s\" command", CMD_NAME);
+               command_print(CMD_CTX, "target must be stopped for \"%s\" command", CMD_NAME);
                return ERROR_OK;
        }
 
-       if ((argc >= 1) && (strcmp("enable", args[0]) == 0))
+       if ((CMD_ARGC >= 1) && (strcmp("enable", CMD_ARGV[0]) == 0))
        {
-               xscale_trace_data_t *td, *next_td;
+               struct xscale_trace_data *td, *next_td;
                xscale->trace.buffer_enabled = 1;
 
                /* free old trace data */
@@ -3324,19 +3303,19 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command)
                }
                xscale->trace.data = NULL;
        }
-       else if ((argc >= 1) && (strcmp("disable", args[0]) == 0))
+       else if ((CMD_ARGC >= 1) && (strcmp("disable", CMD_ARGV[0]) == 0))
        {
                xscale->trace.buffer_enabled = 0;
        }
 
-       if ((argc >= 2) && (strcmp("fill", args[1]) == 0))
+       if ((CMD_ARGC >= 2) && (strcmp("fill", CMD_ARGV[1]) == 0))
        {
                uint32_t fill = 1;
-               if (argc >= 3)
-                       COMMAND_PARSE_NUMBER(u32, args[2], fill);
+               if (CMD_ARGC >= 3)
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], fill);
                xscale->trace.buffer_fill = fill;
        }
-       else if ((argc >= 2) && (strcmp("wrap", args[1]) == 0))
+       else if ((CMD_ARGC >= 2) && (strcmp("wrap", CMD_ARGV[1]) == 0))
        {
                xscale->trace.buffer_fill = -1;
        }
@@ -3354,7 +3333,7 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command)
                xscale->trace.pc_ok = 0;
        }
 
-       command_print(cmd_ctx, "trace buffer %s (%s)",
+       command_print(CMD_CTX, "trace buffer %s (%s)",
                (xscale->trace.buffer_enabled) ? "enabled" : "disabled",
                (xscale->trace.buffer_fill > 0) ? "fill" : "wrap");
 
@@ -3369,17 +3348,17 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command)
 
 COMMAND_HANDLER(xscale_handle_trace_image_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
-       if (argc < 1)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "usage: xscale trace_image <file> [base address] [type]");
+               command_print(CMD_CTX, "usage: xscale trace_image <file> [base address] [type]");
                return ERROR_OK;
        }
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
@@ -3387,25 +3366,25 @@ COMMAND_HANDLER(xscale_handle_trace_image_command)
        {
                image_close(xscale->trace.image);
                free(xscale->trace.image);
-               command_print(cmd_ctx, "previously loaded image found and closed");
+               command_print(CMD_CTX, "previously loaded image found and closed");
        }
 
-       xscale->trace.image = malloc(sizeof(image_t));
+       xscale->trace.image = malloc(sizeof(struct image));
        xscale->trace.image->base_address_set = 0;
        xscale->trace.image->start_address_set = 0;
 
        /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
-       if (argc >= 2)
+       if (CMD_ARGC >= 2)
        {
                xscale->trace.image->base_address_set = 1;
-               COMMAND_PARSE_NUMBER(int, args[1], xscale->trace.image->base_address);
+               COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], xscale->trace.image->base_address);
        }
        else
        {
                xscale->trace.image->base_address_set = 0;
        }
 
-       if (image_open(xscale->trace.image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
+       if (image_open(xscale->trace.image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL) != ERROR_OK)
        {
                free(xscale->trace.image);
                xscale->trace.image = NULL;
@@ -3417,25 +3396,25 @@ COMMAND_HANDLER(xscale_handle_trace_image_command)
 
 COMMAND_HANDLER(xscale_handle_dump_trace_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
-       xscale_trace_data_t *trace_data;
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
+       struct xscale_trace_data *trace_data;
        struct fileio file;
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
        if (target->state != TARGET_HALTED)
        {
-               command_print(cmd_ctx, "target must be stopped for \"%s\" command", CMD_NAME);
+               command_print(CMD_CTX, "target must be stopped for \"%s\" command", CMD_NAME);
                return ERROR_OK;
        }
 
-       if (argc < 1)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "usage: xscale dump_trace <file>");
+               command_print(CMD_CTX, "usage: xscale dump_trace <file>");
                return ERROR_OK;
        }
 
@@ -3443,11 +3422,11 @@ COMMAND_HANDLER(xscale_handle_dump_trace_command)
 
        if (!trace_data)
        {
-               command_print(cmd_ctx, "no trace data collected");
+               command_print(CMD_CTX, "no trace data collected");
                return ERROR_OK;
        }
 
-       if (fileio_open(&file, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
+       if (fileio_open(&file, CMD_ARGV[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
        {
                return ERROR_OK;
        }
@@ -3474,39 +3453,39 @@ COMMAND_HANDLER(xscale_handle_dump_trace_command)
 
 COMMAND_HANDLER(xscale_handle_analyze_trace_buffer_command)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
-       xscale_analyze_trace(target, cmd_ctx);
+       xscale_analyze_trace(target, CMD_CTX);
 
        return ERROR_OK;
 }
 
 COMMAND_HANDLER(xscale_handle_cp15)
 {
-       target_t *target = get_current_target(cmd_ctx);
-       struct xscale_common_s *xscale = target_to_xscale(target);
+       struct target *target = get_current_target(CMD_CTX);
+       struct xscale_common *xscale = target_to_xscale(target);
        int retval;
 
-       retval = xscale_verify_pointer(cmd_ctx, xscale);
+       retval = xscale_verify_pointer(CMD_CTX, xscale);
        if (retval != ERROR_OK)
                return retval;
 
        if (target->state != TARGET_HALTED)
        {
-               command_print(cmd_ctx, "target must be stopped for \"%s\" command", CMD_NAME);
+               command_print(CMD_CTX, "target must be stopped for \"%s\" command", CMD_NAME);
                return ERROR_OK;
        }
        uint32_t reg_no = 0;
-       reg_t *reg = NULL;
-       if (argc > 0)
+       struct reg *reg = NULL;
+       if (CMD_ARGC > 0)
        {
-               COMMAND_PARSE_NUMBER(u32, args[0], reg_no);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], reg_no);
                /*translate from xscale cp15 register no to openocd register*/
                switch (reg_no)
                {
@@ -3535,25 +3514,25 @@ COMMAND_HANDLER(xscale_handle_cp15)
                        reg_no = XSCALE_CPACCESS;
                        break;
                default:
-                       command_print(cmd_ctx, "invalid register number");
+                       command_print(CMD_CTX, "invalid register number");
                        return ERROR_INVALID_ARGUMENTS;
                }
                reg = &xscale->reg_cache->reg_list[reg_no];
 
        }
-       if (argc == 1)
+       if (CMD_ARGC == 1)
        {
                uint32_t value;
 
                /* read cp15 control register */
                xscale_get_reg(reg);
                value = buf_get_u32(reg->value, 0, 32);
-               command_print(cmd_ctx, "%s (/%i): 0x%" PRIx32 "", reg->name, (int)(reg->size), value);
+               command_print(CMD_CTX, "%s (/%i): 0x%" PRIx32 "", reg->name, (int)(reg->size), value);
        }
-       else if (argc == 2)
+       else if (CMD_ARGC == 2)
        {
                uint32_t value;
-               COMMAND_PARSE_NUMBER(u32, args[1], value);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], value);
 
                /* send CP write request (command 0x41) */
                xscale_send_u32(target, 0x41);
@@ -3569,44 +3548,123 @@ COMMAND_HANDLER(xscale_handle_cp15)
        }
        else
        {
-               command_print(cmd_ctx, "usage: cp15 [register]<, [value]>");
+               command_print(CMD_CTX, "usage: cp15 [register]<, [value]>");
        }
 
        return ERROR_OK;
 }
 
-static int xscale_register_commands(struct command_context_s *cmd_ctx)
-{
-       command_t *xscale_cmd;
-
-       xscale_cmd = register_command(cmd_ctx, NULL, "xscale", NULL, COMMAND_ANY, "xscale specific commands");
-
-       register_command(cmd_ctx, xscale_cmd, "debug_handler", xscale_handle_debug_handler_command, COMMAND_ANY, "'xscale debug_handler <target#> <address>' command takes two required operands");
-       register_command(cmd_ctx, xscale_cmd, "cache_clean_address", xscale_handle_cache_clean_address_command, COMMAND_ANY, NULL);
-
-       register_command(cmd_ctx, xscale_cmd, "cache_info", xscale_handle_cache_info_command, COMMAND_EXEC, NULL);
-       register_command(cmd_ctx, xscale_cmd, "mmu", xscale_handle_mmu_command, COMMAND_EXEC, "['enable'|'disable'] the MMU");
-       register_command(cmd_ctx, xscale_cmd, "icache", xscale_handle_idcache_command, COMMAND_EXEC, "['enable'|'disable'] the ICache");
-       register_command(cmd_ctx, xscale_cmd, "dcache", xscale_handle_idcache_command, COMMAND_EXEC, "['enable'|'disable'] the DCache");
-
-       register_command(cmd_ctx, xscale_cmd, "vector_catch", xscale_handle_vector_catch_command, COMMAND_EXEC, "<mask> of vectors that should be catched");
-       register_command(cmd_ctx, xscale_cmd, "vector_table", xscale_handle_vector_table_command, COMMAND_EXEC, "<high|low> <index> <code> set static code for exception handler entry");
-
-       register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, "<enable | disable> ['fill' [n]|'wrap']");
-
-       register_command(cmd_ctx, xscale_cmd, "dump_trace", xscale_handle_dump_trace_command, COMMAND_EXEC, "dump content of trace buffer to <file>");
-       register_command(cmd_ctx, xscale_cmd, "analyze_trace", xscale_handle_analyze_trace_buffer_command, COMMAND_EXEC, "analyze content of trace buffer");
-       register_command(cmd_ctx, xscale_cmd, "trace_image", xscale_handle_trace_image_command,
-               COMMAND_EXEC, "load image from <file> [base address]");
-
-       register_command(cmd_ctx, xscale_cmd, "cp15", xscale_handle_cp15, COMMAND_EXEC, "access coproc 15 <register> [value]");
-
-       armv4_5_register_commands(cmd_ctx);
-
-       return ERROR_OK;
-}
+static const struct command_registration xscale_exec_command_handlers[] = {
+       {
+               .name = "cache_info",
+               .handler = &xscale_handle_cache_info_command,
+               .mode = COMMAND_EXEC, NULL,
+       },
+
+       {
+               .name = "mmu",
+               .handler = &xscale_handle_mmu_command,
+               .mode = COMMAND_EXEC,
+               .usage = "[enable|disable]",
+               .help = "enable or disable the MMU",
+       },
+       {
+               .name = "icache",
+               .handler = &xscale_handle_idcache_command,
+               .mode = COMMAND_EXEC,
+               .usage = "[enable|disable]",
+               .help = "enable or disable the ICache",
+       },
+       {
+               .name = "dcache",
+               .handler = &xscale_handle_idcache_command,
+               .mode = COMMAND_EXEC,
+               .usage = "[enable|disable]",
+               .help = "enable or disable the DCache",
+       },
+
+       {
+               .name = "vector_catch",
+               .handler = &xscale_handle_vector_catch_command,
+               .mode = COMMAND_EXEC,
+               .help = "mask of vectors that should be caught",
+               .usage = "[<mask>]",
+       },
+       {
+               .name = "vector_table",
+               .handler = &xscale_handle_vector_table_command,
+               .mode = COMMAND_EXEC,
+               .usage = "<high|low> <index> <code>",
+               .help = "set static code for exception handler entry",
+       },
+
+       {
+               .name = "trace_buffer",
+               .handler = &xscale_handle_trace_buffer_command,
+               .mode = COMMAND_EXEC,
+               .usage = "<enable | disable> [fill [n]|wrap]",
+       },
+       {
+               .name = "dump_trace",
+               .handler = &xscale_handle_dump_trace_command,
+               .mode = COMMAND_EXEC,
+               .help = "dump content of trace buffer to <file>",
+               .usage = "<file>",
+       },
+       {
+               .name = "analyze_trace",
+               .handler = &xscale_handle_analyze_trace_buffer_command,
+               .mode = COMMAND_EXEC,
+               .help = "analyze content of trace buffer",
+       },
+       {
+               .name = "trace_image",
+               .handler = &xscale_handle_trace_image_command,
+               COMMAND_EXEC,
+               .help = "load image from <file> [base address]",
+               .usage = "<file> [address] [type]",
+       },
+
+       {
+               .name = "cp15",
+               .handler = &xscale_handle_cp15,
+               .mode = COMMAND_EXEC,
+               .help = "access coproc 15",
+               .usage = "<register> [value]",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+static const struct command_registration xscale_any_command_handlers[] = {
+       {
+               .name = "debug_handler",
+               .handler = &xscale_handle_debug_handler_command,
+               .mode = COMMAND_ANY,
+               .usage = "<target#> <address>",
+       },
+       {
+               .name = "cache_clean_address",
+               .handler = &xscale_handle_cache_clean_address_command,
+               .mode = COMMAND_ANY,
+       },
+       {
+               .chain = xscale_exec_command_handlers,
+       },
+       COMMAND_REGISTRATION_DONE
+};
+static const struct command_registration xscale_command_handlers[] = {
+       {
+               .chain = arm_command_handlers,
+       },
+       {
+               .name = "xscale",
+               .mode = COMMAND_ANY,
+               .help = "xscale command group",
+               .chain = xscale_any_command_handlers,
+       },
+       COMMAND_REGISTRATION_DONE
+};
 
-target_type_t xscale_target =
+struct target_type xscale_target =
 {
        .name = "xscale",
 
@@ -3628,8 +3686,9 @@ target_type_t xscale_target =
        .read_memory = xscale_read_memory,
        .write_memory = xscale_write_memory,
        .bulk_write_memory = xscale_bulk_write_memory,
-       .checksum_memory = arm7_9_checksum_memory,
-       .blank_check_memory = arm7_9_blank_check_memory,
+
+       .checksum_memory = arm_checksum_memory,
+       .blank_check_memory = arm_blank_check_memory,
 
        .run_algorithm = armv4_5_run_algorithm,
 
@@ -3638,7 +3697,7 @@ target_type_t xscale_target =
        .add_watchpoint = xscale_add_watchpoint,
        .remove_watchpoint = xscale_remove_watchpoint,
 
-       .register_commands = xscale_register_commands,
+       .commands = xscale_command_handlers,
        .target_create = xscale_target_create,
        .init_target = xscale_init_target,