ARM11: register (most) standard ARM commands
[openocd.git] / src / target / arm11.c
index 9cb80f117ed0bb05f2641a2445191acdc4a5891d..4d9016fdc28bed8b8e17933d9c36523c103a0403 100644 (file)
 #include "config.h"
 #endif
 
+#include "etm.h"
 #include "arm11.h"
-#include "armv4_5.h"
+#include "breakpoints.h"
+#include "arm11_dbgtap.h"
 #include "arm_simulator.h"
 #include "time_support.h"
 #include "target_type.h"
+#include "algorithm.h"
+#include "register.h"
 
 
 #if 0
 #define FNC_INFO_NOTIMPLEMENTED
 #endif
 
-static int arm11_on_enter_debug_state(arm11_common_t * arm11);
-
-bool   arm11_config_memwrite_burst                             = true;
-bool   arm11_config_memwrite_error_fatal               = true;
-uint32_t               arm11_vcr                                                               = 0;
-bool   arm11_config_step_irq_enable                    = false;
-bool   arm11_config_hardware_step                              = false;
-
-#define ARM11_HANDLER(x)       \
-       .x                              = arm11_##x
-
-
-static int arm11_mrc(target_t *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value);
-static int arm11_mcr(target_t *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value);
-
-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),
-       .mrc = arm11_mrc,
-       .mcr = arm11_mcr,
-
-};
-
-int arm11_regs_arch_type = -1;
+static bool arm11_config_memwrite_burst = true;
+static bool arm11_config_memwrite_error_fatal = true;
+static uint32_t arm11_vcr = 0;
+static bool arm11_config_step_irq_enable = false;
+static bool arm11_config_hardware_step = false;
 
+static int arm11_regs_arch_type = -1;
 
 enum arm11_regtype
 {
@@ -138,16 +90,16 @@ enum arm11_regtype
 };
 
 
-typedef struct arm11_reg_defs_s
+struct arm11_reg_defs
 {
        char *                                  name;
        uint32_t                                                num;
        int                                             gdb_num;
        enum arm11_regtype              type;
-} arm11_reg_defs_t;
+};
 
 /* update arm11_regcache_ids when changing this */
-static const arm11_reg_defs_t arm11_reg_defs[] =
+static const struct arm11_reg_defs arm11_reg_defs[] =
 {
        {"r0",  0,      0,      ARM11_REGISTER_CORE},
        {"r1",  1,      1,      ARM11_REGISTER_CORE},
@@ -297,21 +249,49 @@ enum arm11_regcache_ids
 
 #define ARM11_GDB_REGISTER_COUNT       26
 
-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];
 
-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,
 };
 
-uint8_t arm11_gdb_dummy_fps_value[] = {0, 0, 0, 0};
+static uint8_t arm11_gdb_dummy_fps_value[4];
 
-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 *target, int current,
+               uint32_t address, int handle_breakpoints);
+/* helpers */
+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);
+
 
 /** Check and if necessary take control of the system
  *
@@ -320,7 +300,7 @@ reg_t arm11_gdb_dummy_fps_reg =
  *                                     available a pointer to a word holding the
  *                                     DSCR can be passed. Otherwise use NULL.
  */
-int arm11_check_init(arm11_common_t * arm11, uint32_t * dscr)
+static int arm11_check_init(struct arm11_common *arm11, uint32_t *dscr)
 {
        FNC_INFO;
 
@@ -378,12 +358,12 @@ int arm11_check_init(arm11_common_t * arm11, uint32_t * dscr)
   * or on other occasions that stop the processor.
   *
   */
-static int arm11_on_enter_debug_state(arm11_common_t * arm11)
+static int arm11_on_enter_debug_state(struct arm11_common *arm11)
 {
        int retval;
        FNC_INFO;
 
-       for (size_t i = 0; i < asizeof(arm11->reg_values); i++)
+       for (size_t i = 0; i < ARRAY_SIZE(arm11->reg_values); i++)
        {
                arm11->reg_list[i].valid        = 1;
                arm11->reg_list[i].dirty        = 0;
@@ -400,13 +380,13 @@ 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);
                arm11_setup_field(arm11,  1, NULL, NULL,                chain5_fields + 2);
 
-               arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_DRPAUSE);
+               arm11_add_dr_scan_vc(ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE);
        }
        else
        {
@@ -542,7 +522,7 @@ static int arm11_on_enter_debug_state(arm11_common_t * arm11)
        return ERROR_OK;
 }
 
-void arm11_dump_reg_changes(arm11_common_t * arm11)
+void arm11_dump_reg_changes(struct arm11_common * arm11)
 {
 
        if (!(debug_level >= LOG_LVL_DEBUG))
@@ -577,7 +557,7 @@ void arm11_dump_reg_changes(arm11_common_t * arm11)
   * This is called in preparation for the RESTART function.
   *
   */
-int arm11_leave_debug_state(arm11_common_t * arm11)
+static int arm11_leave_debug_state(struct arm11_common *arm11)
 {
        FNC_INFO;
        int retval;
@@ -677,7 +657,7 @@ 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 */
@@ -686,7 +666,7 @@ int arm11_leave_debug_state(arm11_common_t * arm11)
                arm11_setup_field(arm11,  1, &Ready,    NULL, chain5_fields + 1);
                arm11_setup_field(arm11,  1, &Valid,    NULL, chain5_fields + 2);
 
-               arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_DRPAUSE);
+               arm11_add_dr_scan_vc(ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE);
        }
 
        arm11_record_register_history(arm11);
@@ -694,7 +674,7 @@ int arm11_leave_debug_state(arm11_common_t * arm11)
        return ERROR_OK;
 }
 
-void arm11_record_register_history(arm11_common_t * arm11)
+static void arm11_record_register_history(struct arm11_common *arm11)
 {
        for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
        {
@@ -708,13 +688,11 @@ void arm11_record_register_history(arm11_common_t * arm11)
 
 
 /* poll current target status */
-int arm11_poll(struct target_s *target)
+static int arm11_poll(struct target *target)
 {
        FNC_INFO;
        int retval;
-
-       arm11_common_t * arm11 = target->arch_info;
-
+       struct arm11_common *arm11 = target_to_arm11(target);
        uint32_t        dscr;
 
        CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
@@ -753,9 +731,9 @@ int arm11_poll(struct target_s *target)
        return ERROR_OK;
 }
 /* architecture specific status reply */
-int arm11_arch_state(struct target_s *target)
+static int arm11_arch_state(struct target *target)
 {
-       arm11_common_t * 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,
@@ -766,7 +744,8 @@ int arm11_arch_state(struct target_s *target)
 }
 
 /* target request support */
-int arm11_target_request_data(struct target_s *target, uint32_t size, uint8_t *buffer)
+static int arm11_target_request_data(struct target *target,
+               uint32_t size, uint8_t *buffer)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -774,11 +753,10 @@ int arm11_target_request_data(struct target_s *target, uint32_t size, uint8_t *b
 }
 
 /* target execution control */
-int arm11_halt(struct target_s *target)
+static int arm11_halt(struct target *target)
 {
        FNC_INFO;
-
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        LOG_DEBUG("target->state: %s",
                target_state_name(target));
@@ -839,14 +817,15 @@ int arm11_halt(struct target_s *target)
        return ERROR_OK;
 }
 
-int arm11_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
+static int arm11_resume(struct target *target, int current,
+               uint32_t address, int handle_breakpoints, int debug_execution)
 {
        FNC_INFO;
 
        //        LOG_DEBUG("current %d  address %08x  handle_breakpoints %d  debug_execution %d",
        //      current, address, handle_breakpoints, debug_execution);
 
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        LOG_DEBUG("target->state: %s",
                target_state_name(target));
@@ -871,7 +850,7 @@ int arm11_resume(struct target_s *target, int current, uint32_t address, int han
        {
                /* 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)
                {
@@ -889,7 +868,7 @@ int arm11_resume(struct target_s *target, int current, uint32_t address, int han
 
                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;
@@ -898,7 +877,7 @@ int arm11_resume(struct target_s *target, int current, uint32_t address, int han
                        brp[1].address  = ARM11_SC7_BCR0 + brp_num;
                        brp[1].value    = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
 
-                       arm11_sc7_run(arm11, brp, asizeof(brp));
+                       arm11_sc7_run(arm11, brp, ARRAY_SIZE(brp));
 
                        LOG_DEBUG("Add BP " ZU " at %08" PRIx32 "", brp_num, bp->address);
 
@@ -982,40 +961,43 @@ static int armv4_5_to_arm11(int reg)
 
 static uint32_t arm11_sim_get_reg(struct arm_sim_interface *sim, int reg)
 {
-       arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
+       struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
 
        reg=armv4_5_to_arm11(reg);
 
        return buf_get_u32(arm11->reg_list[reg].value, 0, 32);
 }
 
-static void arm11_sim_set_reg(struct arm_sim_interface *sim, int reg, uint32_t value)
+static void arm11_sim_set_reg(struct arm_sim_interface *sim,
+               int reg, uint32_t value)
 {
-       arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
+       struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
 
        reg=armv4_5_to_arm11(reg);
 
        buf_set_u32(arm11->reg_list[reg].value, 0, 32, value);
 }
 
-static uint32_t arm11_sim_get_cpsr(struct arm_sim_interface *sim, int pos, int bits)
+static uint32_t arm11_sim_get_cpsr(struct arm_sim_interface *sim,
+               int pos, int bits)
 {
-       arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
+       struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
 
        return buf_get_u32(arm11->reg_list[ARM11_RC_CPSR].value, pos, bits);
 }
 
 static enum armv4_5_state arm11_sim_get_state(struct arm_sim_interface *sim)
 {
-//     arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
+//     struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
 
        /* FIX!!!! we should implement thumb for arm11 */
        return ARMV4_5_STATE_ARM;
 }
 
-static void arm11_sim_set_state(struct arm_sim_interface *sim, enum armv4_5_state mode)
+static void arm11_sim_set_state(struct arm_sim_interface *sim,
+               enum armv4_5_state mode)
 {
-//     arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
+//     struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
 
        /* FIX!!!! we should implement thumb for arm11 */
        LOG_ERROR("Not implemetned!");
@@ -1024,13 +1006,13 @@ static void arm11_sim_set_state(struct arm_sim_interface *sim, enum armv4_5_stat
 
 static enum armv4_5_mode arm11_sim_get_mode(struct arm_sim_interface *sim)
 {
-       //arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
+       //struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
 
        /* FIX!!!! we should implement something that returns the current mode here!!! */
        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;
 
@@ -1048,7 +1030,8 @@ static int arm11_simulate_step(target_t *target, uint32_t *dry_run_pc)
 
 }
 
-int arm11_step(struct target_s *target, int current, uint32_t address, int handle_breakpoints)
+static int arm11_step(struct target *target, int current,
+               uint32_t address, int handle_breakpoints)
 {
        FNC_INFO;
 
@@ -1061,7 +1044,7 @@ int arm11_step(struct target_s *target, int current, uint32_t address, int handl
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        if (!current)
                R(PC) = address;
@@ -1108,7 +1091,7 @@ int arm11_step(struct target_s *target, int current, uint32_t address, int handl
 
                /* 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;
@@ -1137,7 +1120,7 @@ int arm11_step(struct target_s *target, int current, uint32_t address, int handl
                        brp[1].value    = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
                }
 
-               CHECK_RETVAL(arm11_sc7_run(arm11, brp, asizeof(brp)));
+               CHECK_RETVAL(arm11_sc7_run(arm11, brp, ARRAY_SIZE(brp)));
 
                /* resume */
 
@@ -1203,12 +1186,12 @@ int arm11_step(struct target_s *target, int current, uint32_t address, int handl
        return ERROR_OK;
 }
 
-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);
 
-       arm11_common_t * arm11 = target->arch_info;
        retval = arm11_check_init(arm11, NULL);
        if (retval != ERROR_OK)
                return retval;
@@ -1265,12 +1248,12 @@ int arm11_assert_reset(target_t *target)
        return ERROR_OK;
 }
 
-int arm11_deassert_reset(target_t *target)
+static int arm11_deassert_reset(struct target *target)
 {
        return ERROR_OK;
 }
 
-int arm11_soft_reset_halt(struct target_s *target)
+static int arm11_soft_reset_halt(struct target *target)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -1278,14 +1261,14 @@ int arm11_soft_reset_halt(struct target_s *target)
 }
 
 /* target register access for gdb */
-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;
-
-       arm11_common_t * 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++)
        {
@@ -1313,7 +1296,8 @@ int arm11_get_gdb_reg_list(struct target_s *target, struct reg_s **reg_list[], i
  * to read/write a range of data to a "port". a "port" is an action on
  * read memory address for some peripheral.
  */
-int arm11_read_memory_inner(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
+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)
 {
        /** \todo TODO: check if buffer cast to uint32_t* and uint16_t* might cause alignment problems */
@@ -1329,7 +1313,7 @@ int arm11_read_memory_inner(struct target_s *target, uint32_t address, uint32_t
 
        LOG_DEBUG("ADDR %08" PRIx32 "  SIZE %08" PRIx32 "  COUNT %08" PRIx32 "", address, size, count);
 
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        retval = arm11_run_instr_data_prepare(arm11);
        if (retval != ERROR_OK)
@@ -1400,7 +1384,7 @@ int arm11_read_memory_inner(struct target_s *target, uint32_t address, uint32_t
        return arm11_run_instr_data_finish(arm11);
 }
 
-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);
 }
@@ -1410,7 +1394,8 @@ int arm11_read_memory(struct target_s *target, uint32_t address, uint32_t size,
 * to read/write a range of data to a "port". a "port" is an action on
 * read memory address for some peripheral.
 */
-int arm11_write_memory_inner(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
+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)
 {
        int retval;
@@ -1424,7 +1409,7 @@ int arm11_write_memory_inner(struct target_s *target, uint32_t address, uint32_t
 
        LOG_DEBUG("ADDR %08" PRIx32 "  SIZE %08" PRIx32 "  COUNT %08" PRIx32 "", address, size, count);
 
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        retval = arm11_run_instr_data_prepare(arm11);
        if (retval != ERROR_OK)
@@ -1548,13 +1533,15 @@ int arm11_write_memory_inner(struct target_s *target, uint32_t address, uint32_t
        return arm11_run_instr_data_finish(arm11);
 }
 
-int arm11_write_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+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 */
-int arm11_bulk_write_memory(struct target_s *target, uint32_t address, uint32_t count, uint8_t *buffer)
+static int arm11_bulk_write_memory(struct target *target,
+               uint32_t address, uint32_t count, uint8_t *buffer)
 {
        FNC_INFO;
 
@@ -1567,23 +1554,14 @@ int arm11_bulk_write_memory(struct target_s *target, uint32_t address, uint32_t
        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.
- */
-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
 */
-int arm11_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int arm11_add_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
        FNC_INFO;
-
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
 #if 0
        if (breakpoint->type == BKPT_SOFT)
@@ -1610,25 +1588,27 @@ int arm11_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int arm11_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
+static int arm11_remove_breakpoint(struct target *target,
+               struct breakpoint *breakpoint)
 {
        FNC_INFO;
-
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        arm11->free_brps++;
 
        return ERROR_OK;
 }
 
-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;
 }
 
-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;
 
@@ -1637,11 +1617,13 @@ int arm11_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
 
 // HACKHACKHACK - FIXME mode/state
 /* target algorithm support */
-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, uint32_t entry_point, uint32_t exit_point,
-                       int timeout_ms, void *arch_info)
+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)
 {
-               arm11_common_t *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];
@@ -1679,7 +1661,7 @@ int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t
        // 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);
@@ -1764,7 +1746,7 @@ int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t
        {
                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);
@@ -1801,11 +1783,11 @@ restore:
        return retval;
 }
 
-int arm11_target_create(struct target_s *target, Jim_Interp *interp)
+static int arm11_target_create(struct target *target, Jim_Interp *interp)
 {
        FNC_INFO;
 
-       NEW(arm11_common_t, arm11, 1);
+       NEW(struct arm11_common, arm11, 1);
 
        arm11->target = target;
 
@@ -1818,31 +1800,37 @@ 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;
 }
 
-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 */
-int arm11_examine(struct target_s *target)
+static int arm11_examine(struct target *target)
 {
        int retval;
 
        FNC_INFO;
-
-       arm11_common_t * arm11 = target->arch_info;
+       struct arm11_common *arm11 = target_to_arm11(target);
 
        /* check IDCODE */
 
        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);
 
@@ -1854,12 +1842,12 @@ 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);
 
-       arm11_add_dr_scan_vc(asizeof(chain0_fields), chain0_fields, TAP_IDLE);
+       arm11_add_dr_scan_vc(ARRAY_SIZE(chain0_fields), chain0_fields, TAP_IDLE);
 
        CHECK_RETVAL(jtag_execute_queue());
 
@@ -1869,11 +1857,9 @@ 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;
 
@@ -1905,6 +1891,14 @@ 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;
@@ -1912,11 +1906,11 @@ int arm11_examine(struct target_s *target)
 
 
 /** Load a register that is marked !valid in the register cache */
-int arm11_get_reg(reg_t *reg)
+static int arm11_get_reg(struct reg *reg)
 {
        FNC_INFO;
 
-       target_t * target = ((arm11_reg_state_t *)reg->arch_info)->target;
+       struct target * target = ((struct arm11_reg_state *)reg->arch_info)->target;
 
        if (target->state != TARGET_HALTED)
        {
@@ -1927,36 +1921,36 @@ int arm11_get_reg(reg_t *reg)
        /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
 
 #if 0
-       arm11_common_t *arm11 = target->arch_info;
-       const arm11_reg_defs_t * arm11_reg_info = arm11_reg_defs + ((arm11_reg_state_t *)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 */
-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 = ((arm11_reg_state_t *)reg->arch_info)->target;
-       arm11_common_t *arm11 = target->arch_info;
-//       const arm11_reg_defs_t * arm11_reg_info = arm11_reg_defs + ((arm11_reg_state_t *)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[((arm11_reg_state_t *)reg->arch_info)->def_index] = buf_get_u32(buf, 0, 32);
+       arm11->reg_values[((struct arm11_reg_state *)reg->arch_info)->def_index] = buf_get_u32(buf, 0, 32);
        reg->valid      = 1;
        reg->dirty      = 1;
 
        return ERROR_OK;
 }
 
-int arm11_build_reg_cache(target_t *target)
+static int arm11_build_reg_cache(struct target *target)
 {
-       arm11_common_t *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(arm11_reg_state_t,  arm11_reg_states,       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)
                arm11_regs_arch_type = register_reg_arch_type(arm11_get_reg, arm11_set_reg);
@@ -1972,7 +1966,7 @@ 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;
@@ -1981,27 +1975,25 @@ int arm11_build_reg_cache(target_t *target)
        size_t i;
 
        /* Not very elegant assertion */
-       if (ARM11_REGCACHE_COUNT != asizeof(arm11->reg_values) ||
-               ARM11_REGCACHE_COUNT != asizeof(arm11_reg_defs) ||
+       if (ARM11_REGCACHE_COUNT != ARRAY_SIZE(arm11->reg_values) ||
+               ARM11_REGCACHE_COUNT != ARRAY_SIZE(arm11_reg_defs) ||
                ARM11_REGCACHE_COUNT != ARM11_RC_MAX)
        {
-               LOG_ERROR("BUG: arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
+               LOG_ERROR("BUG: arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, ARRAY_SIZE(arm11->reg_values), ARRAY_SIZE(arm11_reg_defs), ARM11_RC_MAX);
                exit(-1);
        }
 
        for (i = 0; i < ARM11_REGCACHE_COUNT; i++)
        {
-               reg_t *                                         r       = reg_list                      + i;
-               const arm11_reg_defs_t *        rd      = arm11_reg_defs        + i;
-               arm11_reg_state_t *                     rs      = arm11_reg_states      + 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;
 
                r->name                         = rd->name;
                r->size                         = 32;
                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;
 
@@ -2012,7 +2004,7 @@ int arm11_build_reg_cache(target_t *target)
        return ERROR_OK;
 }
 
-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)
        {
@@ -2048,9 +2040,10 @@ int arm11_handle_bool(struct command_context_s *cmd_ctx, char *cmd, char **args,
 }
 
 #define BOOL_WRAPPER(name, print_name) \
-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")
@@ -2058,7 +2051,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")
 
-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:
@@ -2074,7 +2067,7 @@ int arm11_handle_vcr(struct command_context_s *cmd_ctx, char *cmd, char **args,
        return ERROR_OK;
 }
 
-const uint32_t arm11_coproc_instruction_limits[] =
+static const uint32_t arm11_coproc_instruction_limits[] =
 {
        15,                             /* coprocessor */
        7,                              /* opcode 1 */
@@ -2084,132 +2077,18 @@ const uint32_t arm11_coproc_instruction_limits[] =
        0xFFFFFFFF,             /* value */
 };
 
-arm11_common_t * arm11_find_target(const char * arg)
-{
-       jtag_tap_t *    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;
-}
-
-int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, bool read)
+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 (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);
-}
-
-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);
-}
-
-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)
-{
-       int retval;
-       
        if (target->state != TARGET_HALTED)
        {
                LOG_ERROR("Target not halted");
                return ERROR_FAIL;
        }
-               
-       arm11_common_t * arm11 = target->arch_info;
 
        uint32_t instr = 0xEE000010     |
                (cpnum <<  8) |
@@ -2241,22 +2120,25 @@ static int arm11_mrc_inner(target_t *target, int cpnum, uint32_t op1, uint32_t o
        return arm11_run_instr_data_finish(arm11);
 }
 
-static int arm11_mrc(target_t *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
+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, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
+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);
 }
 
-
-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;
+
+       armv4_5_register_commands(cmd_ctx);
 
        top_cmd = register_command(cmd_ctx, NULL, "arm11",
                        NULL, COMMAND_ANY, NULL);
@@ -2270,10 +2152,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",
@@ -2285,9 +2163,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"
@@ -2296,5 +2171,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,
+};

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)