reg_param_t -> struct reg_param
[openocd.git] / src / target / arm11.c
index fb57ee5dff44300d92ae21a6d04d50abadf71c6b..2787eca9f074ae3065c8339d0d4f999e0c4c4987 100644 (file)
@@ -27,6 +27,7 @@
 #endif
 
 #include "arm11.h"
+#include "arm11_dbgtap.h"
 #include "armv4_5.h"
 #include "arm_simulator.h"
 #include "time_support.h"
@@ -359,7 +360,7 @@ static int arm11_on_enter_debug_state(arm11_common_t *arm11)
 
                arm11_add_IR(arm11, ARM11_INTEST, ARM11_TAP_DEFAULT);
 
-               scan_field_t    chain5_fields[3];
+               struct scan_field       chain5_fields[3];
 
                arm11_setup_field(arm11, 32, NULL, &R(WDTR),    chain5_fields + 0);
                arm11_setup_field(arm11,  1, NULL, NULL,                chain5_fields + 1);
@@ -636,7 +637,7 @@ static int arm11_leave_debug_state(arm11_common_t *arm11)
 
                arm11_add_IR(arm11, ARM11_EXTEST, ARM11_TAP_DEFAULT);
 
-               scan_field_t    chain5_fields[3];
+               struct scan_field       chain5_fields[3];
 
                uint8_t                 Ready           = 0;    /* ignored */
                uint8_t                 Valid           = 0;    /* ignored */
@@ -1613,8 +1614,8 @@ 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,
-               int num_mem_params, mem_param_t *mem_params,
-               int num_reg_params, reg_param_t *reg_params,
+               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)
 {
@@ -1820,7 +1821,7 @@ static int arm11_examine(struct target_s *target)
 
        arm11_add_IR(arm11, ARM11_IDCODE, ARM11_TAP_DEFAULT);
 
-       scan_field_t            idcode_field;
+       struct scan_field               idcode_field;
 
        arm11_setup_field(arm11, 32, NULL, &arm11->device_id, &idcode_field);
 
@@ -1832,7 +1833,7 @@ static int arm11_examine(struct target_s *target)
 
        arm11_add_IR(arm11, ARM11_INTEST, ARM11_TAP_DEFAULT);
 
-       scan_field_t            chain0_fields[2];
+       struct scan_field               chain0_fields[2];
 
        arm11_setup_field(arm11, 32, NULL,      &arm11->didr,           chain0_fields + 0);
        arm11_setup_field(arm11,  8, NULL,      &arm11->implementor,    chain0_fields + 1);
@@ -1990,8 +1991,7 @@ static int arm11_build_reg_cache(target_t *target)
        return ERROR_OK;
 }
 
-static int arm11_handle_bool(struct command_context_s *cmd_ctx,
-               char *cmd, char **args, int argc, bool * var, char * name)
+static COMMAND_HELPER(arm11_handle_bool, bool *var, char *name)
 {
        if (argc == 0)
        {
@@ -2027,9 +2027,10 @@ static int arm11_handle_bool(struct command_context_s *cmd_ctx,
 }
 
 #define BOOL_WRAPPER(name, print_name) \
-static int arm11_handle_bool_##name(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) \
+COMMAND_HANDLER(arm11_handle_bool_##name) \
 { \
-       return arm11_handle_bool(cmd_ctx, cmd, args, argc, &arm11_config_##name, print_name); \
+       return CALL_COMMAND_HANDLER(arm11_handle_bool, \
+                       &arm11_config_##name, print_name); \
 }
 
 BOOL_WRAPPER(memwrite_burst,                   "memory write burst mode")
@@ -2037,7 +2038,7 @@ BOOL_WRAPPER(memwrite_error_fatal,                "fatal error mode for memory writes")
 BOOL_WRAPPER(step_irq_enable,                  "IRQs while stepping")
 BOOL_WRAPPER(hardware_step,                    "hardware single step")
 
-static int arm11_handle_vcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(arm11_handle_vcr)
 {
        switch (argc) {
        case 0:
@@ -2065,7 +2066,7 @@ static const uint32_t arm11_coproc_instruction_limits[] =
 
 static arm11_common_t * arm11_find_target(const char * arg)
 {
-       jtag_tap_t *    tap;
+       struct jtag_tap *       tap;
        target_t *              t;
 
        tap = jtag_tap_by_string(arg);
@@ -2086,101 +2087,6 @@ static arm11_common_t * arm11_find_target(const char * arg)
        return 0;
 }
 
-static int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx,
-               char *cmd, char **args, int argc, bool read)
-{
-       int retval;
-
-       if (argc != (read ? 6 : 7))
-       {
-               LOG_ERROR("Invalid number of arguments.");
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       arm11_common_t * arm11 = arm11_find_target(args[0]);
-
-       if (!arm11)
-       {
-               LOG_ERROR("Parameter 1 is not a the JTAG chain position of an ARM11 device.");
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       if (arm11->target->state != TARGET_HALTED)
-       {
-               LOG_WARNING("target was not halted");
-               return ERROR_TARGET_NOT_HALTED;
-       }
-
-       uint32_t        values[6];
-
-       for (size_t i = 0; i < (read ? 5 : 6); i++)
-       {
-               COMMAND_PARSE_NUMBER(u32, args[i + 1], values[i]);
-
-               if (values[i] > arm11_coproc_instruction_limits[i])
-               {
-                       LOG_ERROR("Parameter %ld out of bounds (%" PRId32 " max).",
-                                 (long)(i + 2),
-                                 arm11_coproc_instruction_limits[i]);
-                       return ERROR_COMMAND_SYNTAX_ERROR;
-               }
-       }
-
-       uint32_t instr = 0xEE000010     |
-               (values[0] <<  8) |
-               (values[1] << 21) |
-               (values[2] << 16) |
-               (values[3] <<  0) |
-               (values[4] <<  5);
-
-       if (read)
-               instr |= 0x00100000;
-
-       retval = arm11_run_instr_data_prepare(arm11);
-       if (retval != ERROR_OK)
-               return retval;
-
-       if (read)
-       {
-               uint32_t result;
-               retval = arm11_run_instr_data_from_core_via_r0(arm11, instr, &result);
-               if (retval != ERROR_OK)
-                       return retval;
-
-               LOG_INFO("MRC p%d, %d, R0, c%d, c%d, %d = 0x%08" PRIx32 " (%" PRId32 ")",
-                        (int)(values[0]),
-                        (int)(values[1]),
-                        (int)(values[2]),
-                        (int)(values[3]),
-                        (int)(values[4]), result, result);
-       }
-       else
-       {
-               retval = arm11_run_instr_data_to_core_via_r0(arm11, instr, values[5]);
-               if (retval != ERROR_OK)
-                       return retval;
-
-               LOG_INFO("MRC p%d, %d, R0 (#0x%08" PRIx32 "), c%d, c%d, %d",
-                        (int)(values[0]), (int)(values[1]),
-                        values[5],
-                        (int)(values[2]), (int)(values[3]), (int)(values[4]));
-       }
-
-       return arm11_run_instr_data_finish(arm11);
-}
-
-static int arm11_handle_mrc(struct command_context_s *cmd_ctx,
-               char *cmd, char **args, int argc)
-{
-       return arm11_handle_mrc_mcr(cmd_ctx, cmd, args, argc, true);
-}
-
-static int arm11_handle_mcr(struct command_context_s *cmd_ctx,
-               char *cmd, char **args, int argc)
-{
-       return arm11_handle_mrc_mcr(cmd_ctx, cmd, args, argc, false);
-}
-
 static int arm11_mrc_inner(target_t *target, int cpnum,
                uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm,
                uint32_t *value, bool read)
@@ -2237,6 +2143,58 @@ static int arm11_mcr(target_t *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;
+       }
+
+       arm11_common_t * 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 = {
@@ -2290,6 +2248,14 @@ int arm11_register_commands(struct command_context_s *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!
@@ -2299,10 +2265,6 @@ int arm11_register_commands(struct command_context_s *cmd_ctx)
                        "DEBUG ONLY - Hardware single stepping"
                                " (default: disabled)");
 
-       register_command(cmd_ctx, top_cmd, "mcr",
-                       arm11_handle_mcr, COMMAND_ANY,
-                       "Write Coprocessor register. mcr <jtag_target> <coprocessor> <opcode 1> <CRn> <CRm> <opcode 2> <32bit value to write>. All parameters are numbers only.");
-
        mw_cmd = register_command(cmd_ctx, top_cmd, "memwrite",
                        NULL, COMMAND_ANY, NULL);
        register_command(cmd_ctx, mw_cmd, "burst",
@@ -2314,9 +2276,6 @@ int arm11_register_commands(struct command_context_s *cmd_ctx)
                        "Terminate program if transfer error was found"
                                " (default: enabled)");
 
-       register_command(cmd_ctx, top_cmd, "mrc",
-                       arm11_handle_mrc, COMMAND_ANY,
-                       "Read Coprocessor register. mrc <jtag_target> <coprocessor> <opcode 1> <CRn> <CRm> <opcode 2>. All parameters are numbers only.");
        register_command(cmd_ctx, top_cmd, "step_irq_enable",
                        arm11_handle_bool_step_irq_enable, COMMAND_ANY,
                        "Enable interrupts while stepping"

Linking to existing account procedure

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

SSH host keys fingerprints

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