ARM: disassemble STM correctly
[fw/openocd] / src / target / etb.c
index 196df6c9232e0b2557276cf032194809a0677b03..3113eca0651c70750436b71cb2a255b86586b511 100644 (file)
@@ -21,7 +21,7 @@
 #include "config.h"
 #endif
 
-#include "armv4_5.h"
+#include "arm.h"
 #include "etm.h"
 #include "etb.h"
 #include "register.h"
@@ -40,8 +40,6 @@ static char* etb_reg_list[] =
        "ETB_control",
 };
 
-static int etb_reg_arch_type = -1;
-
 static int etb_get_reg(struct reg *reg);
 
 static int etb_set_instr(struct etb *etb, uint32_t new_instr)
@@ -123,6 +121,11 @@ static int etb_get_reg(struct reg *reg)
        return ERROR_OK;
 }
 
+static const struct reg_arch_type etb_reg_type = {
+       .get = etb_get_reg,
+       .set = etb_set_reg_w_exec,
+};
+
 struct reg_cache* etb_build_reg_cache(struct etb *etb)
 {
        struct reg_cache *reg_cache = malloc(sizeof(struct reg_cache));
@@ -131,10 +134,6 @@ struct reg_cache* etb_build_reg_cache(struct etb *etb)
        int num_regs = 9;
        int i;
 
-       /* register a register arch-type for etm registers only once */
-       if (etb_reg_arch_type == -1)
-               etb_reg_arch_type = register_reg_arch_type(etb_get_reg, etb_set_reg_w_exec);
-
        /* the actual registers are kept in two arrays */
        reg_list = calloc(num_regs, sizeof(struct reg));
        arch_info = calloc(num_regs, sizeof(struct etb_reg));
@@ -154,7 +153,7 @@ struct reg_cache* etb_build_reg_cache(struct etb *etb)
                reg_list[i].valid = 0;
                reg_list[i].value = calloc(1, 4);
                reg_list[i].arch_info = &arch_info[i];
-               reg_list[i].arch_type = etb_reg_arch_type;
+               reg_list[i].type = &etb_reg_type;
                reg_list[i].size = 32;
                arch_info[i].addr = i;
                arch_info[i].etb = etb;
@@ -355,30 +354,30 @@ COMMAND_HANDLER(handle_etb_config_command)
        struct jtag_tap *tap;
        struct arm *arm;
 
-       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)
        {
-               LOG_ERROR("ETB: target '%s' not defined", args[0]);
+               LOG_ERROR("ETB: target '%s' not defined", CMD_ARGV[0]);
                return ERROR_FAIL;
        }
 
        arm = target_to_arm(target);
        if (!is_arm(arm))
        {
-               command_print(cmd_ctx, "ETB: '%s' isn't an ARM", args[0]);
+               command_print(CMD_CTX, "ETB: '%s' isn't an ARM", CMD_ARGV[0]);
                return ERROR_FAIL;
        }
 
-       tap = jtag_tap_by_string(args[1]);
+       tap = jtag_tap_by_string(CMD_ARGV[1]);
        if (tap == NULL)
        {
-               command_print(cmd_ctx, "ETB: TAP %s does not exist", args[1]);
+               command_print(CMD_CTX, "ETB: TAP %s does not exist", CMD_ARGV[1]);
                return ERROR_FAIL;
        }
 
@@ -403,17 +402,24 @@ COMMAND_HANDLER(handle_etb_config_command)
        return ERROR_OK;
 }
 
-static int etb_register_commands(struct command_context *cmd_ctx)
-{
-       struct command *etb_cmd = register_command(cmd_ctx, NULL, "etb",
-                       NULL, COMMAND_ANY, "Embedded Trace Buffer");
-
-       register_command(cmd_ctx, etb_cmd, "config",
-                       handle_etb_config_command, COMMAND_CONFIG,
-                       NULL);
-
-       return ERROR_OK;
-}
+static const struct command_registration etb_config_command_handlers[] = {
+       {
+               .name = "config",
+               .handler = &handle_etb_config_command,
+               .mode = COMMAND_CONFIG,
+               .usage = "<target> <tap>",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+static const struct command_registration etb_command_handlers[] = {
+       {
+               .name = "etb",
+               .mode = COMMAND_ANY,
+               .help = "Emebdded Trace Buffer command group",
+               .chain = etb_config_command_handlers,
+       },
+       COMMAND_REGISTRATION_DONE
+};
 
 static int etb_init(struct etm_context *etm_ctx)
 {
@@ -685,7 +691,7 @@ static int etb_stop_capture(struct etm_context *etm_ctx)
 struct etm_capture_driver etb_capture_driver =
 {
        .name = "etb",
-       .register_commands = etb_register_commands,
+       .commands = etb_command_handlers,
        .init = etb_init,
        .status = etb_status,
        .start_capture = etb_start_capture,