target: don't implicitly include "algorithm.h"
[fw/openocd] / src / target / arm11.c
index 4ebe61f93b372b33b49b3bf24c034c19f935044c..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
@@ -1551,16 +1553,6 @@ static int arm11_bulk_write_memory(struct target *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 *target,
-               uint32_t address, uint32_t count, uint32_t* checksum)
-{
-       return ERROR_FAIL;
-}
-
 /* target break-/watchpoint control
 * rw: 0 = write, 1 = read, 2 = access
 */
@@ -1898,6 +1890,14 @@ static int arm11_examine(struct target *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;
@@ -2076,29 +2076,6 @@ static const uint32_t arm11_coproc_instruction_limits[] =
        0xFFFFFFFF,             /* value */
 };
 
-static struct arm11_common * arm11_find_target(const char * arg)
-{
-       struct jtag_tap *       tap;
-       struct target *         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(struct target *target, int cpnum,
                uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm,
                uint32_t *value, bool read)
@@ -2154,103 +2131,7 @@ static int arm11_mcr(struct target *target, int cpnum,
        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
-
-struct target_type 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 *cmd_ctx)
+static int arm11_register_commands(struct command_context *cmd_ctx)
 {
        FNC_INFO;
 
@@ -2259,14 +2140,6 @@ int arm11_register_commands(struct command_context *cmd_ctx)
        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!
@@ -2295,5 +2168,48 @@ int arm11_register_commands(struct command_context *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,
+};