target: don't implicitly include "algorithm.h"
[fw/openocd] / src / target / arm11.c
index 47786b81f34e5f6e0a459beb2bb47a710096c586..cdeb420039718dc947ea0ce73e8f7945c37ebc00 100644 (file)
 #endif
 
 #include "arm11.h"
+#include "breakpoints.h"
 #include "arm11_dbgtap.h"
 #include "armv4_5.h"
 #include "arm_simulator.h"
 #include "time_support.h"
 #include "target_type.h"
+#include "algorithm.h"
 
 
 #if 0
@@ -246,28 +248,45 @@ enum arm11_regcache_ids
 
 #define ARM11_GDB_REGISTER_COUNT       26
 
-static uint8_t arm11_gdb_dummy_fp_value[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+/* FIXME these are *identical* to the ARMv4_5 dummies ...  except
+ * for their names, and being static vs global, and having different
+ * addresses.  Ditto ARMv7a and ARMv7m dummies.
+ */
+
+static uint8_t arm11_gdb_dummy_fp_value[12];
 
-static reg_t arm11_gdb_dummy_fp_reg =
+static struct reg arm11_gdb_dummy_fp_reg =
 {
-       "GDB dummy floating-point register", arm11_gdb_dummy_fp_value, 0, 1, 96, NULL, 0, NULL, 0
+       .name = "GDB dummy floating-point register",
+       .value = arm11_gdb_dummy_fp_value,
+       .dirty = 0,
+       .valid = 1,
+       .size = 96,
+       .arch_info = NULL,
+       .arch_type = 0,
 };
 
-static uint8_t arm11_gdb_dummy_fps_value[] = {0, 0, 0, 0};
+static uint8_t arm11_gdb_dummy_fps_value[4];
 
-static reg_t arm11_gdb_dummy_fps_reg =
+static struct reg arm11_gdb_dummy_fps_reg =
 {
-       "GDB dummy floating-point status register", arm11_gdb_dummy_fps_value, 0, 1, 32, NULL, 0, NULL, 0
+       .name = "GDB dummy floating-point status register",
+       .value = arm11_gdb_dummy_fps_value,
+       .dirty = 0,
+       .valid = 1,
+       .size = 32,
+       .arch_info = NULL,
+       .arch_type = 0,
 };
 
 
 static int arm11_on_enter_debug_state(struct arm11_common *arm11);
-static int arm11_step(struct target_s *target, int current,
+static int arm11_step(struct target *target, int current,
                uint32_t address, int handle_breakpoints);
 /* helpers */
-static int arm11_build_reg_cache(target_t *target);
-static int arm11_set_reg(reg_t *reg, uint8_t *buf);
-static int arm11_get_reg(reg_t *reg);
+static int arm11_build_reg_cache(struct target *target);
+static int arm11_set_reg(struct reg *reg, uint8_t *buf);
+static int arm11_get_reg(struct reg *reg);
 
 static void arm11_record_register_history(struct arm11_common * arm11);
 static void arm11_dump_reg_changes(struct arm11_common * arm11);
@@ -668,13 +687,11 @@ static void arm11_record_register_history(struct arm11_common *arm11)
 
 
 /* poll current target status */
-static int arm11_poll(struct target_s *target)
+static int arm11_poll(struct target *target)
 {
        FNC_INFO;
        int retval;
-
-       struct arm11_common * arm11 = target->arch_info;
-
+       struct arm11_common *arm11 = target_to_arm11(target);
        uint32_t        dscr;
 
        CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
@@ -713,9 +730,9 @@ static int arm11_poll(struct target_s *target)
        return ERROR_OK;
 }
 /* architecture specific status reply */
-static int arm11_arch_state(struct target_s *target)
+static int arm11_arch_state(struct target *target)
 {
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        LOG_USER("target halted due to %s\ncpsr: 0x%8.8" PRIx32 " pc: 0x%8.8" PRIx32 "",
                         Jim_Nvp_value2name_simple(nvp_target_debug_reason, target->debug_reason)->name,
@@ -726,7 +743,7 @@ static int arm11_arch_state(struct target_s *target)
 }
 
 /* target request support */
-static int arm11_target_request_data(struct target_s *target,
+static int arm11_target_request_data(struct target *target,
                uint32_t size, uint8_t *buffer)
 {
        FNC_INFO_NOTIMPLEMENTED;
@@ -735,11 +752,10 @@ static int arm11_target_request_data(struct target_s *target,
 }
 
 /* target execution control */
-static int arm11_halt(struct target_s *target)
+static int arm11_halt(struct target *target)
 {
        FNC_INFO;
-
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        LOG_DEBUG("target->state: %s",
                target_state_name(target));
@@ -800,7 +816,7 @@ static int arm11_halt(struct target_s *target)
        return ERROR_OK;
 }
 
-static int arm11_resume(struct target_s *target, int current,
+static int arm11_resume(struct target *target, int current,
                uint32_t address, int handle_breakpoints, int debug_execution)
 {
        FNC_INFO;
@@ -808,7 +824,7 @@ static int arm11_resume(struct target_s *target, int current,
        //        LOG_DEBUG("current %d  address %08x  handle_breakpoints %d  debug_execution %d",
        //      current, address, handle_breakpoints, debug_execution);
 
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        LOG_DEBUG("target->state: %s",
                target_state_name(target));
@@ -833,7 +849,7 @@ static int arm11_resume(struct target_s *target, int current,
        {
                /* check if one matches PC and step over it if necessary */
 
-               breakpoint_t *  bp;
+               struct breakpoint *     bp;
 
                for (bp = target->breakpoints; bp; bp = bp->next)
                {
@@ -851,7 +867,7 @@ static int arm11_resume(struct target_s *target, int current,
 
                for (bp = target->breakpoints; bp; bp = bp->next)
                {
-                       arm11_sc7_action_t      brp[2];
+                       struct arm11_sc7_action brp[2];
 
                        brp[0].write    = 1;
                        brp[0].address  = ARM11_SC7_BVR0 + brp_num;
@@ -995,7 +1011,7 @@ static enum armv4_5_mode arm11_sim_get_mode(struct arm_sim_interface *sim)
        return ARMV4_5_MODE_USR;
 }
 
-static int arm11_simulate_step(target_t *target, uint32_t *dry_run_pc)
+static int arm11_simulate_step(struct target *target, uint32_t *dry_run_pc)
 {
        struct arm_sim_interface sim;
 
@@ -1013,7 +1029,7 @@ static int arm11_simulate_step(target_t *target, uint32_t *dry_run_pc)
 
 }
 
-static int arm11_step(struct target_s *target, int current,
+static int arm11_step(struct target *target, int current,
                uint32_t address, int handle_breakpoints)
 {
        FNC_INFO;
@@ -1027,7 +1043,7 @@ static int arm11_step(struct target_s *target, int current,
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        if (!current)
                R(PC) = address;
@@ -1074,7 +1090,7 @@ static int arm11_step(struct target_s *target, int current,
 
                /* Set up breakpoint for stepping */
 
-               arm11_sc7_action_t      brp[2];
+               struct arm11_sc7_action brp[2];
 
                brp[0].write    = 1;
                brp[0].address  = ARM11_SC7_BVR0;
@@ -1169,12 +1185,12 @@ static int arm11_step(struct target_s *target, int current,
        return ERROR_OK;
 }
 
-static int arm11_assert_reset(target_t *target)
+static int arm11_assert_reset(struct target *target)
 {
        FNC_INFO;
        int retval;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
-       struct arm11_common * arm11 = target->arch_info;
        retval = arm11_check_init(arm11, NULL);
        if (retval != ERROR_OK)
                return retval;
@@ -1231,12 +1247,12 @@ static int arm11_assert_reset(target_t *target)
        return ERROR_OK;
 }
 
-static int arm11_deassert_reset(target_t *target)
+static int arm11_deassert_reset(struct target *target)
 {
        return ERROR_OK;
 }
 
-static int arm11_soft_reset_halt(struct target_s *target)
+static int arm11_soft_reset_halt(struct target *target)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -1244,15 +1260,14 @@ static int arm11_soft_reset_halt(struct target_s *target)
 }
 
 /* target register access for gdb */
-static int arm11_get_gdb_reg_list(struct target_s *target,
-               struct reg_s **reg_list[], int *reg_list_size)
+static int arm11_get_gdb_reg_list(struct target *target,
+               struct reg **reg_list[], int *reg_list_size)
 {
        FNC_INFO;
-
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        *reg_list_size  = ARM11_GDB_REGISTER_COUNT;
-       *reg_list               = malloc(sizeof(reg_t*) * ARM11_GDB_REGISTER_COUNT);
+       *reg_list               = malloc(sizeof(struct reg*) * ARM11_GDB_REGISTER_COUNT);
 
        for (size_t i = 16; i < 24; i++)
        {
@@ -1280,7 +1295,7 @@ static int arm11_get_gdb_reg_list(struct target_s *target,
  * to read/write a range of data to a "port". a "port" is an action on
  * read memory address for some peripheral.
  */
-static int arm11_read_memory_inner(struct target_s *target,
+static int arm11_read_memory_inner(struct target *target,
                uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
                bool arm11_config_memrw_no_increment)
 {
@@ -1297,7 +1312,7 @@ static int arm11_read_memory_inner(struct target_s *target,
 
        LOG_DEBUG("ADDR %08" PRIx32 "  SIZE %08" PRIx32 "  COUNT %08" PRIx32 "", address, size, count);
 
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        retval = arm11_run_instr_data_prepare(arm11);
        if (retval != ERROR_OK)
@@ -1368,7 +1383,7 @@ static int arm11_read_memory_inner(struct target_s *target,
        return arm11_run_instr_data_finish(arm11);
 }
 
-static int arm11_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+static int arm11_read_memory(struct target *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        return arm11_read_memory_inner(target, address, size, count, buffer, false);
 }
@@ -1378,7 +1393,7 @@ static int arm11_read_memory(struct target_s *target, uint32_t address, uint32_t
 * to read/write a range of data to a "port". a "port" is an action on
 * read memory address for some peripheral.
 */
-static int arm11_write_memory_inner(struct target_s *target,
+static int arm11_write_memory_inner(struct target *target,
                uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
                bool arm11_config_memrw_no_increment)
 {
@@ -1393,7 +1408,7 @@ static int arm11_write_memory_inner(struct target_s *target,
 
        LOG_DEBUG("ADDR %08" PRIx32 "  SIZE %08" PRIx32 "  COUNT %08" PRIx32 "", address, size, count);
 
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        retval = arm11_run_instr_data_prepare(arm11);
        if (retval != ERROR_OK)
@@ -1517,14 +1532,14 @@ static int arm11_write_memory_inner(struct target_s *target,
        return arm11_run_instr_data_finish(arm11);
 }
 
-static int arm11_write_memory(struct target_s *target,
+static int arm11_write_memory(struct target *target,
                uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        return arm11_write_memory_inner(target, address, size, count, buffer, false);
 }
 
 /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
-static int arm11_bulk_write_memory(struct target_s *target,
+static int arm11_bulk_write_memory(struct target *target,
                uint32_t address, uint32_t count, uint8_t *buffer)
 {
        FNC_INFO;
@@ -1538,25 +1553,14 @@ static int arm11_bulk_write_memory(struct target_s *target,
        return arm11_write_memory(target, address, 4, count, buffer);
 }
 
-/* here we have nothing target specific to contribute, so we fail and then the
- * fallback code will read data from the target and calculate the CRC on the
- * host.
- */
-static int arm11_checksum_memory(struct target_s *target,
-               uint32_t address, uint32_t count, uint32_t* checksum)
-{
-       return ERROR_FAIL;
-}
-
 /* target break-/watchpoint control
 * rw: 0 = write, 1 = read, 2 = access
 */
-static int arm11_add_breakpoint(struct target_s *target,
-               breakpoint_t *breakpoint)
+static int arm11_add_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
        FNC_INFO;
-
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
 #if 0
        if (breakpoint->type == BKPT_SOFT)
@@ -1583,28 +1587,27 @@ static int arm11_add_breakpoint(struct target_s *target,
        return ERROR_OK;
 }
 
-static int arm11_remove_breakpoint(struct target_s *target,
-               breakpoint_t *breakpoint)
+static int arm11_remove_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
        FNC_INFO;
-
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        arm11->free_brps++;
 
        return ERROR_OK;
 }
 
-static int arm11_add_watchpoint(struct target_s *target,
-               watchpoint_t *watchpoint)
+static int arm11_add_watchpoint(struct target *target,
+               struct watchpoint *watchpoint)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
        return ERROR_OK;
 }
 
-static int arm11_remove_watchpoint(struct target_s *target,
-               watchpoint_t *watchpoint)
+static int arm11_remove_watchpoint(struct target *target,
+               struct watchpoint *watchpoint)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -1613,13 +1616,13 @@ static int arm11_remove_watchpoint(struct target_s *target,
 
 // HACKHACKHACK - FIXME mode/state
 /* target algorithm support */
-static int arm11_run_algorithm(struct target_s *target,
+static int arm11_run_algorithm(struct target *target,
                int num_mem_params, struct mem_param *mem_params,
                int num_reg_params, struct reg_param *reg_params,
                uint32_t entry_point, uint32_t exit_point,
                int timeout_ms, void *arch_info)
 {
-               struct arm11_common *arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 //     enum armv4_5_state core_state = arm11->core_state;
 //     enum armv4_5_mode core_mode = arm11->core_mode;
        uint32_t context[16];
@@ -1657,7 +1660,7 @@ static int arm11_run_algorithm(struct target_s *target,
        // Set register parameters
        for (int i = 0; i < num_reg_params; i++)
        {
-               reg_t *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
+               struct reg *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
                if (!reg)
                {
                        LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
@@ -1742,7 +1745,7 @@ static int arm11_run_algorithm(struct target_s *target,
        {
                if (reg_params[i].direction != PARAM_OUT)
                {
-                       reg_t *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
+                       struct reg *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
                        if (!reg)
                        {
                                LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
@@ -1779,7 +1782,7 @@ restore:
        return retval;
 }
 
-static int arm11_target_create(struct target_s *target, Jim_Interp *interp)
+static int arm11_target_create(struct target *target, Jim_Interp *interp)
 {
        FNC_INFO;
 
@@ -1796,26 +1799,31 @@ static int arm11_target_create(struct target_s *target, Jim_Interp *interp)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       target->arch_info = arm11;
+       armv4_5_init_arch_info(target, &arm11->arm);
+
+       arm11->jtag_info.tap = target->tap;
+       arm11->jtag_info.scann_size = 5;
+       arm11->jtag_info.scann_instr = ARM11_SCAN_N;
+       /* cur_scan_chain == 0 */
+       arm11->jtag_info.intest_instr = ARM11_INTEST;
 
        return ERROR_OK;
 }
 
-static int arm11_init_target(struct command_context_s *cmd_ctx,
-               struct target_s *target)
+static int arm11_init_target(struct command_context *cmd_ctx,
+               struct target *target)
 {
        /* Initialize anything we can set up without talking to the target */
        return arm11_build_reg_cache(target);
 }
 
 /* talk to the target and set things up */
-static int arm11_examine(struct target_s *target)
+static int arm11_examine(struct target *target)
 {
        int retval;
 
        FNC_INFO;
-
-       struct arm11_common * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        /* check IDCODE */
 
@@ -1848,11 +1856,9 @@ static int arm11_examine(struct target_s *target)
        case 0x07B56000:        LOG_INFO("found ARM1156"); break;
        case 0x07B76000:        LOG_INFO("found ARM1176"); break;
        default:
-       {
                LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
                return ERROR_FAIL;
        }
-       }
 
        arm11->debug_version = (arm11->didr >> 16) & 0x0F;
 
@@ -1884,6 +1890,14 @@ static int arm11_examine(struct target_s *target)
        if (retval != ERROR_OK)
                return retval;
 
+       /* ETM on ARM11 still uses original scanchain 6 access mode */
+       if (arm11->arm.etm && !target_was_examined(target)) {
+               *register_get_last_cache_p(&target->reg_cache) =
+                       etm_build_reg_cache(target, &arm11->jtag_info,
+                                       arm11->arm.etm);
+               retval = etm_setup(target);
+       }
+
        target_set_examined(target);
 
        return ERROR_OK;
@@ -1891,11 +1905,11 @@ static int arm11_examine(struct target_s *target)
 
 
 /** Load a register that is marked !valid in the register cache */
-static int arm11_get_reg(reg_t *reg)
+static int arm11_get_reg(struct reg *reg)
 {
        FNC_INFO;
 
-       target_t * target = ((struct arm11_reg_state *)reg->arch_info)->target;
+       struct target * target = ((struct arm11_reg_state *)reg->arch_info)->target;
 
        if (target->state != TARGET_HALTED)
        {
@@ -1906,21 +1920,21 @@ static int arm11_get_reg(reg_t *reg)
        /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
 
 #if 0
-       struct arm11_common *arm11 = target->arch_info;
-       const struct arm11_reg_defs * arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
+       struct arm11_common *arm11 = target_to_arm11(target);
+       const struct arm11_reg_defs *arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
 #endif
 
        return ERROR_OK;
 }
 
 /** Change a value in the register cache */
-static int arm11_set_reg(reg_t *reg, uint8_t *buf)
+static int arm11_set_reg(struct reg *reg, uint8_t *buf)
 {
        FNC_INFO;
 
-       target_t * target = ((struct arm11_reg_state *)reg->arch_info)->target;
-       struct arm11_common *arm11 = target->arch_info;
-//       const struct arm11_reg_defs * arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
+       struct target *target = ((struct arm11_reg_state *)reg->arch_info)->target;
+       struct arm11_common *arm11 = target_to_arm11(target);
+//     const struct arm11_reg_defs *arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
 
        arm11->reg_values[((struct arm11_reg_state *)reg->arch_info)->def_index] = buf_get_u32(buf, 0, 32);
        reg->valid      = 1;
@@ -1929,12 +1943,12 @@ static int arm11_set_reg(reg_t *reg, uint8_t *buf)
        return ERROR_OK;
 }
 
-static int arm11_build_reg_cache(target_t *target)
+static int arm11_build_reg_cache(struct target *target)
 {
-       struct arm11_common *arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
-       NEW(reg_cache_t,                cache,                          1);
-       NEW(reg_t,                              reg_list,                       ARM11_REGCACHE_COUNT);
+       NEW(struct reg_cache,           cache,                          1);
+       NEW(struct reg,                         reg_list,                       ARM11_REGCACHE_COUNT);
        NEW(struct arm11_reg_state,     arm11_reg_states,       ARM11_REGCACHE_COUNT);
 
        if (arm11_regs_arch_type == -1)
@@ -1951,7 +1965,7 @@ static int arm11_build_reg_cache(target_t *target)
        cache->reg_list = reg_list;
        cache->num_regs = ARM11_REGCACHE_COUNT;
 
-       reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
+       struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
        (*cache_p) = cache;
 
        arm11->core_cache = cache;
@@ -1970,7 +1984,7 @@ static int arm11_build_reg_cache(target_t *target)
 
        for (i = 0; i < ARM11_REGCACHE_COUNT; i++)
        {
-               reg_t *                                         r       = reg_list                      + i;
+               struct reg *                                            r       = reg_list                      + i;
                const struct arm11_reg_defs *   rd      = arm11_reg_defs        + i;
                struct arm11_reg_state *                        rs      = arm11_reg_states      + i;
 
@@ -1979,8 +1993,6 @@ static int arm11_build_reg_cache(target_t *target)
                r->value                        = (uint8_t *)(arm11->reg_values + i);
                r->dirty                        = 0;
                r->valid                        = 0;
-               r->bitfield_desc        = NULL;
-               r->num_bitfields        = 0;
                r->arch_type            = arm11_regs_arch_type;
                r->arch_info            = rs;
 
@@ -2064,42 +2076,18 @@ static const uint32_t arm11_coproc_instruction_limits[] =
        0xFFFFFFFF,             /* value */
 };
 
-static struct arm11_common * arm11_find_target(const char * arg)
-{
-       struct jtag_tap *       tap;
-       target_t *              t;
-
-       tap = jtag_tap_by_string(arg);
-
-       if (!tap)
-               return 0;
-
-       for (t = all_targets; t; t = t->next)
-       {
-               if (t->tap != tap)
-                       continue;
-
-               /* if (t->type == arm11_target) */
-               if (0 == strcmp(target_get_name(t), "arm11"))
-                       return t->arch_info;
-       }
-
-       return 0;
-}
-
-static int arm11_mrc_inner(target_t *target, int cpnum,
+static int arm11_mrc_inner(struct target *target, int cpnum,
                uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm,
                uint32_t *value, bool read)
 {
        int retval;
-       
+       struct arm11_common *arm11 = target_to_arm11(target);
+
        if (target->state != TARGET_HALTED)
        {
                LOG_ERROR("Target not halted");
                return ERROR_FAIL;
        }
-               
-       struct arm11_common * arm11 = target->arch_info;
 
        uint32_t instr = 0xEE000010     |
                (cpnum <<  8) |
@@ -2131,131 +2119,27 @@ static int arm11_mrc_inner(target_t *target, int cpnum,
        return arm11_run_instr_data_finish(arm11);
 }
 
-static int arm11_mrc(target_t *target, int cpnum,
+static int arm11_mrc(struct target *target, int cpnum,
                uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
 {
        return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, value, true);
 }
 
-static int arm11_mcr(target_t *target, int cpnum,
+static int arm11_mcr(struct target *target, int cpnum,
                uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
 {
        return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, &value, false);
 }
 
-static COMMAND_HELPER(arm11_handle_etm_read_write, bool read)
-{
-       if (argc != (read ? 2 : 3))
-       {
-               LOG_ERROR("Invalid number of arguments.");
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       struct arm11_common * arm11 = arm11_find_target(args[0]);
-
-       if (!arm11)
-       {
-               LOG_ERROR("Parameter 1 is not the target name of an ARM11 device.");
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       uint32_t address;
-       COMMAND_PARSE_NUMBER(u32, args[1], address);
-
-       if (!read)
-       {
-               uint32_t value;
-               COMMAND_PARSE_NUMBER(u32, args[2], value);
-
-               LOG_INFO("ETM write register 0x%02" PRIx32 " (%" PRId32 ") = 0x%08" PRIx32 " (%" PRId32 ")",
-                 address, address, value, value);
-
-               CHECK_RETVAL(arm11_write_etm(arm11, address, value));
-       }
-       else
-       {
-               uint32_t value;
-
-               CHECK_RETVAL(arm11_read_etm(arm11, address, &value));
-
-           LOG_INFO("ETM read register 0x%02" PRIx32 " (%" PRId32 ") = 0x%08" PRIx32 " (%" PRId32 ")",
-                 address, address, value, value);
-       }
-
-       return ERROR_OK;
-}
-
-COMMAND_HANDLER(arm11_handle_etmr)
-{
-       return CALL_COMMAND_HANDLER(arm11_handle_etm_read_write, true);
-}
-
-COMMAND_HANDLER(arm11_handle_etmw)
-{
-       return CALL_COMMAND_HANDLER(arm11_handle_etm_read_write, false);
-}
-
-#define ARM11_HANDLER(x)       .x = arm11_##x
-
-target_type_t arm11_target = {
-               .name = "arm11",
-
-               ARM11_HANDLER(poll),
-               ARM11_HANDLER(arch_state),
-
-               ARM11_HANDLER(target_request_data),
-
-               ARM11_HANDLER(halt),
-               ARM11_HANDLER(resume),
-               ARM11_HANDLER(step),
-
-               ARM11_HANDLER(assert_reset),
-               ARM11_HANDLER(deassert_reset),
-               ARM11_HANDLER(soft_reset_halt),
-
-               ARM11_HANDLER(get_gdb_reg_list),
-
-               ARM11_HANDLER(read_memory),
-               ARM11_HANDLER(write_memory),
-
-               ARM11_HANDLER(bulk_write_memory),
-
-               ARM11_HANDLER(checksum_memory),
-
-               ARM11_HANDLER(add_breakpoint),
-               ARM11_HANDLER(remove_breakpoint),
-               ARM11_HANDLER(add_watchpoint),
-               ARM11_HANDLER(remove_watchpoint),
-
-               ARM11_HANDLER(run_algorithm),
-
-               ARM11_HANDLER(register_commands),
-               ARM11_HANDLER(target_create),
-               ARM11_HANDLER(init_target),
-               ARM11_HANDLER(examine),
-
-               ARM11_HANDLER(mrc),
-               ARM11_HANDLER(mcr),
-       };
-
-
-int arm11_register_commands(struct command_context_s *cmd_ctx)
+static int arm11_register_commands(struct command_context *cmd_ctx)
 {
        FNC_INFO;
 
-       command_t *top_cmd, *mw_cmd;
+       struct command *top_cmd, *mw_cmd;
 
        top_cmd = register_command(cmd_ctx, NULL, "arm11",
                        NULL, COMMAND_ANY, NULL);
 
-       register_command(cmd_ctx, top_cmd, "etmr",
-                       arm11_handle_etmr, COMMAND_ANY,
-                       "Read Embedded Trace Macrocell (ETM) register. etmr <jtag_target> <ETM register address>");
-
-       register_command(cmd_ctx, top_cmd, "etmw",
-                       arm11_handle_etmw, COMMAND_ANY,
-                       "Write Embedded Trace Macrocell (ETM) register. etmr <jtag_target> <ETM register address> <value>");
-
        /* "hardware_step" is only here to check if the default
         * simulate + breakpoint implementation is broken.
         * TEMPORARY! NOT DOCUMENTED!
@@ -2284,5 +2168,48 @@ int arm11_register_commands(struct command_context_s *cmd_ctx)
                        arm11_handle_vcr, COMMAND_ANY,
                        "Control (Interrupt) Vector Catch Register");
 
-       return ERROR_OK;
+       return etm_register_commands(cmd_ctx);
 }
+
+/** Holds methods for ARM11xx targets. */
+struct target_type arm11_target = {
+       .name =                 "arm11",
+
+       .poll =                 arm11_poll,
+       .arch_state =           arm11_arch_state,
+
+       .target_request_data =  arm11_target_request_data,
+
+       .halt =                 arm11_halt,
+       .resume =               arm11_resume,
+       .step =                 arm11_step,
+
+       .assert_reset =         arm11_assert_reset,
+       .deassert_reset =       arm11_deassert_reset,
+       .soft_reset_halt =      arm11_soft_reset_halt,
+
+       .get_gdb_reg_list =     arm11_get_gdb_reg_list,
+
+       .read_memory =          arm11_read_memory,
+       .write_memory =         arm11_write_memory,
+
+       .bulk_write_memory =    arm11_bulk_write_memory,
+
+       .checksum_memory =      arm_checksum_memory,
+       .blank_check_memory =   arm_blank_check_memory,
+
+       .add_breakpoint =       arm11_add_breakpoint,
+       .remove_breakpoint =    arm11_remove_breakpoint,
+       .add_watchpoint =       arm11_add_watchpoint,
+       .remove_watchpoint =    arm11_remove_watchpoint,
+
+       .run_algorithm =        arm11_run_algorithm,
+
+       .register_commands =    arm11_register_commands,
+       .target_create =        arm11_target_create,
+       .init_target =          arm11_init_target,
+       .examine =              arm11_examine,
+
+       .mrc =                  arm11_mrc,
+       .mcr =                  arm11_mcr,
+};