ARM11: remove exports and forward decls
[openocd.git] / src / target / arm11.c
index 16c8dd3195e39144b0ca7614b4a240ea1d38e64f..fb57ee5dff44300d92ae21a6d04d50abadf71c6b 100644 (file)
 #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
-
-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(quit),
-};
-
-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
 {
@@ -291,21 +245,32 @@ 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};
+static uint8_t arm11_gdb_dummy_fp_value[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 
-reg_t arm11_gdb_dummy_fp_reg =
+static reg_t arm11_gdb_dummy_fp_reg =
 {
        "GDB dummy floating-point register", arm11_gdb_dummy_fp_value, 0, 1, 96, NULL, 0, NULL, 0
 };
 
-uint8_t arm11_gdb_dummy_fps_value[] = {0, 0, 0, 0};
+static uint8_t arm11_gdb_dummy_fps_value[] = {0, 0, 0, 0};
 
-reg_t arm11_gdb_dummy_fps_reg =
+static reg_t arm11_gdb_dummy_fps_reg =
 {
        "GDB dummy floating-point status register", arm11_gdb_dummy_fps_value, 0, 1, 32, NULL, 0, NULL, 0
 };
 
 
+static int arm11_on_enter_debug_state(arm11_common_t *arm11);
+static int arm11_step(struct target_s *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 void arm11_record_register_history(arm11_common_t * arm11);
+static void arm11_dump_reg_changes(arm11_common_t * arm11);
+
 
 /** Check and if necessary take control of the system
  *
@@ -314,7 +279,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(arm11_common_t *arm11, uint32_t *dscr)
 {
        FNC_INFO;
 
@@ -372,7 +337,7 @@ 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(arm11_common_t *arm11)
 {
        int retval;
        FNC_INFO;
@@ -571,7 +536,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(arm11_common_t *arm11)
 {
        FNC_INFO;
        int retval;
@@ -608,6 +573,13 @@ int arm11_leave_debug_state(arm11_common_t * arm11)
 
                if (DSCR & (ARM11_DSCR_RDTR_FULL | ARM11_DSCR_WDTR_FULL))
                {
+                       /*
+                       The wDTR/rDTR two registers that are used to send/receive data to/from
+                       the core in tandem with corresponding instruction codes that are
+                       written into the core. The RDTR FULL/WDTR FULL flag indicates that the
+                       registers hold data that was written by one side (CPU or JTAG) and not
+                       read out by the other side.
+                       */
                        LOG_ERROR("wDTR/rDTR inconsistent (DSCR %08" PRIx32 ")", DSCR);
                        return ERROR_FAIL;
                }
@@ -681,7 +653,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(arm11_common_t *arm11)
 {
        for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
        {
@@ -695,16 +667,13 @@ 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_s *target)
 {
        FNC_INFO;
        int retval;
 
        arm11_common_t * arm11 = target->arch_info;
 
-       if (arm11->trst_active)
-               return ERROR_OK;
-
        uint32_t        dscr;
 
        CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
@@ -743,7 +712,7 @@ 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_s *target)
 {
        arm11_common_t * arm11 = target->arch_info;
 
@@ -756,7 +725,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_s *target,
+               uint32_t size, uint8_t *buffer)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -764,7 +734,7 @@ 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_s *target)
 {
        FNC_INFO;
 
@@ -784,12 +754,6 @@ int arm11_halt(struct target_s *target)
                return ERROR_OK;
        }
 
-       if (arm11->trst_active)
-       {
-               arm11->halt_requested = true;
-               return ERROR_OK;
-       }
-
        arm11_add_IR(arm11, ARM11_HALT, TAP_IDLE);
 
        CHECK_RETVAL(jtag_execute_queue());
@@ -835,7 +799,8 @@ 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_s *target, int current,
+               uint32_t address, int handle_breakpoints, int debug_execution)
 {
        FNC_INFO;
 
@@ -985,7 +950,8 @@ static uint32_t arm11_sim_get_reg(struct arm_sim_interface *sim, int 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;
 
@@ -994,7 +960,8 @@ static void arm11_sim_set_reg(struct arm_sim_interface *sim, int reg, uint32_t v
        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;
 
@@ -1009,7 +976,8 @@ static enum armv4_5_state arm11_sim_get_state(struct arm_sim_interface *sim)
        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;
 
@@ -1044,7 +1012,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_s *target, int current,
+               uint32_t address, int handle_breakpoints)
 {
        FNC_INFO;
 
@@ -1199,53 +1168,74 @@ int arm11_step(struct target_s *target, int current, uint32_t address, int handl
        return ERROR_OK;
 }
 
-/* target reset control */
-int arm11_assert_reset(struct target_s *target)
+static int arm11_assert_reset(target_t *target)
 {
        FNC_INFO;
-
-#if 0
-       /* assert reset lines */
-       /* resets only the DBGTAP, not the ARM */
-
-       jtag_add_reset(1, 0);
-       jtag_add_sleep(5000);
+       int retval;
 
        arm11_common_t * arm11 = target->arch_info;
-       arm11->trst_active = true;
-#endif
+       retval = arm11_check_init(arm11, NULL);
+       if (retval != ERROR_OK)
+               return retval;
 
+       target->state = TARGET_UNKNOWN;
+
+       /* we would very much like to reset into the halted, state,
+        * but resetting and halting is second best... */
        if (target->reset_halt)
        {
                CHECK_RETVAL(target_halt(target));
        }
 
-       return ERROR_OK;
-}
 
-int arm11_deassert_reset(struct target_s *target)
-{
-       FNC_INFO;
+       /* srst is funny. We can not do *anything* else while it's asserted
+        * and it has unkonwn side effects. Make sure no other code runs
+        * meanwhile.
+        *
+        * Code below assumes srst:
+        *
+        * - Causes power-on-reset (but of what parts of the system?). Bug
+        * in arm11?
+        *
+        * - Messes us TAP state without asserting trst.
+        *
+        * - There is another bug in the arm11 core. When you generate an access to
+        * external logic (for example ddr controller via AHB bus) and that block
+        * is not configured (perhaps it is still held in reset), that transaction
+        * will never complete. This will hang arm11 core but it will also hang
+        * JTAG controller. Nothing, short of srst assertion will bring it out of
+        * this.
+        *
+        * Mysteries:
+        *
+        * - What should the PC be after an srst reset when starting in the halted
+        * state?
+        */
 
-#if 0
-       LOG_DEBUG("target->state: %s",
-               target_state_name(target));
+       jtag_add_reset(0, 1);
+       jtag_add_reset(0, 0);
 
+       /* How long do we have to wait? */
+       jtag_add_sleep(5000);
 
-       /* deassert reset lines */
-       jtag_add_reset(0, 0);
+       /* un-mess up TAP state */
+       jtag_add_tlr();
 
-       arm11_common_t * arm11 = target->arch_info;
-       arm11->trst_active = false;
+       retval = jtag_execute_queue();
+       if (retval != ERROR_OK)
+       {
+               return retval;
+       }
 
-       if (arm11->halt_requested)
-               return arm11_halt(target);
-#endif
+       return ERROR_OK;
+}
 
+static int arm11_deassert_reset(target_t *target)
+{
        return ERROR_OK;
 }
 
-int arm11_soft_reset_halt(struct target_s *target)
+static int arm11_soft_reset_halt(struct target_s *target)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -1253,7 +1243,8 @@ 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_s *target,
+               struct reg_s **reg_list[], int *reg_list_size)
 {
        FNC_INFO;
 
@@ -1288,7 +1279,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_s *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 */
@@ -1375,7 +1367,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_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
        return arm11_read_memory_inner(target, address, size, count, buffer, false);
 }
@@ -1385,7 +1377,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_s *target,
+               uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
                bool arm11_config_memrw_no_increment)
 {
        int retval;
@@ -1401,13 +1394,24 @@ int arm11_write_memory_inner(struct target_s *target, uint32_t address, uint32_t
 
        arm11_common_t * arm11 = target->arch_info;
 
-       arm11_run_instr_data_prepare(arm11);
+       retval = arm11_run_instr_data_prepare(arm11);
+       if (retval != ERROR_OK)
+               return retval;
 
        /* MRC p14,0,r0,c0,c5,0 */
        retval = arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
        if (retval != ERROR_OK)
                return retval;
 
+       /* burst writes are not used for single words as those may well be
+        * reset init script writes.
+        *
+        * The other advantage is that as burst writes are default, we'll
+        * now exercise both burst and non-burst code paths with the
+        * default settings, increasing code coverage.
+        */
+       bool burst = arm11_config_memwrite_burst && (count > 1);
+
        switch (size)
        {
        case 1:
@@ -1463,7 +1467,7 @@ int arm11_write_memory_inner(struct target_s *target, uint32_t address, uint32_t
                /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
                uint32_t *words = (uint32_t*)buffer;
 
-               if (!arm11_config_memwrite_burst)
+               if (!burst)
                {
                        /* STC p14,c5,[R0],#4 */
                        /* STC p14,c5,[R0]*/
@@ -1501,7 +1505,7 @@ int arm11_write_memory_inner(struct target_s *target, uint32_t address, uint32_t
                                        (unsigned) (address + size * count),
                                        (unsigned) r0);
 
-                       if (arm11_config_memwrite_burst)
+                       if (burst)
                                LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
 
                        if (arm11_config_memwrite_error_fatal)
@@ -1512,13 +1516,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_s *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_s *target,
+               uint32_t address, uint32_t count, uint8_t *buffer)
 {
        FNC_INFO;
 
@@ -1535,7 +1541,8 @@ int arm11_bulk_write_memory(struct target_s *target, uint32_t address, uint32_t
  * 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)
+static int arm11_checksum_memory(struct target_s *target,
+               uint32_t address, uint32_t count, uint32_t* checksum)
 {
        return ERROR_FAIL;
 }
@@ -1543,7 +1550,8 @@ int arm11_checksum_memory(struct target_s *target, uint32_t address, uint32_t co
 /* 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_s *target,
+               breakpoint_t *breakpoint)
 {
        FNC_INFO;
 
@@ -1574,7 +1582,8 @@ 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_s *target,
+               breakpoint_t *breakpoint)
 {
        FNC_INFO;
 
@@ -1585,14 +1594,16 @@ int arm11_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
        return ERROR_OK;
 }
 
-int arm11_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
+static int arm11_add_watchpoint(struct target_s *target,
+               watchpoint_t *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_s *target,
+               watchpoint_t *watchpoint)
 {
        FNC_INFO_NOTIMPLEMENTED;
 
@@ -1601,9 +1612,11 @@ 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_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)
 {
                arm11_common_t *arm11 = target->arch_info;
 //     enum armv4_5_state core_state = arm11->core_state;
@@ -1626,10 +1639,10 @@ int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t
 //             return ERROR_FAIL;
 
        // Save regs
-       for (size_t i = 0; i < 16; i++)
+       for (unsigned i = 0; i < 16; i++)
        {
                context[i] = buf_get_u32((uint8_t*)(&arm11->reg_values[i]),0,32);
-               LOG_DEBUG("Save %zi: 0x%" PRIx32 "",i,context[i]);
+               LOG_DEBUG("Save %u: 0x%" PRIx32 "", i, context[i]);
        }
 
        cpsr = buf_get_u32((uint8_t*)(arm11->reg_values + ARM11_RC_CPSR),0,32);
@@ -1765,7 +1778,7 @@ restore:
        return retval;
 }
 
-int arm11_target_create(struct target_s *target, Jim_Interp *interp)
+static int arm11_target_create(struct target_s *target, Jim_Interp *interp)
 {
        FNC_INFO;
 
@@ -1787,15 +1800,18 @@ int arm11_target_create(struct target_s *target, Jim_Interp *interp)
        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_s *cmd_ctx,
+               struct target_s *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_s *target)
 {
+       int retval;
+
        FNC_INFO;
 
        arm11_common_t * arm11 = target->arch_info;
@@ -1863,22 +1879,18 @@ int arm11_examine(struct target_s *target)
         * as suggested by the spec.
         */
 
-       arm11_check_init(arm11, NULL);
+       retval = arm11_check_init(arm11, NULL);
+       if (retval != ERROR_OK)
+               return retval;
 
        target_set_examined(target);
 
        return ERROR_OK;
 }
 
-int arm11_quit(void)
-{
-       FNC_INFO_NOTIMPLEMENTED;
-
-       return ERROR_OK;
-}
 
 /** Load a register that is marked !valid in the register cache */
-int arm11_get_reg(reg_t *reg)
+static int arm11_get_reg(reg_t *reg)
 {
        FNC_INFO;
 
@@ -1901,7 +1913,7 @@ int arm11_get_reg(reg_t *reg)
 }
 
 /** Change a value in the register cache */
-int arm11_set_reg(reg_t *reg, uint8_t *buf)
+static int arm11_set_reg(reg_t *reg, uint8_t *buf)
 {
        FNC_INFO;
 
@@ -1916,7 +1928,7 @@ int arm11_set_reg(reg_t *reg, uint8_t *buf)
        return ERROR_OK;
 }
 
-int arm11_build_reg_cache(target_t *target)
+static int arm11_build_reg_cache(target_t *target)
 {
        arm11_common_t *arm11 = target->arch_info;
 
@@ -1978,7 +1990,8 @@ 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 int arm11_handle_bool(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc, bool * var, char * name)
 {
        if (argc == 0)
        {
@@ -2014,7 +2027,7 @@ 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) \
+static int arm11_handle_bool_##name(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) \
 { \
        return arm11_handle_bool(cmd_ctx, cmd, args, argc, &arm11_config_##name, print_name); \
 }
@@ -2024,14 +2037,15 @@ 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)
+static int arm11_handle_vcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       if (argc == 1)
-       {
-               arm11_vcr = strtoul(args[0], NULL, 0);
-       }
-       else if (argc != 0)
-       {
+       switch (argc) {
+       case 0:
+               break;
+       case 1:
+               COMMAND_PARSE_NUMBER(u32, args[0], arm11_vcr);
+               break;
+       default:
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
@@ -2039,7 +2053,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 */
@@ -2049,7 +2063,7 @@ const uint32_t arm11_coproc_instruction_limits[] =
        0xFFFFFFFF,             /* value */
 };
 
-arm11_common_t * arm11_find_target(const char * arg)
+static arm11_common_t * arm11_find_target(const char * arg)
 {
        jtag_tap_t *    tap;
        target_t *              t;
@@ -2072,7 +2086,8 @@ arm11_common_t * arm11_find_target(const char * arg)
        return 0;
 }
 
-int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, bool read)
+static int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc, bool read)
 {
        int retval;
 
@@ -2100,7 +2115,7 @@ int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx, char *cmd, char **ar
 
        for (size_t i = 0; i < (read ? 5 : 6); i++)
        {
-               values[i] = strtoul(args[i + 1], NULL, 0);
+               COMMAND_PARSE_NUMBER(u32, args[i + 1], values[i]);
 
                if (values[i] > arm11_coproc_instruction_limits[i])
                {
@@ -2154,16 +2169,118 @@ int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx, char *cmd, char **ar
        return arm11_run_instr_data_finish(arm11);
 }
 
-int arm11_handle_mrc(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+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);
 }
 
-int arm11_handle_mcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+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)
+{
+       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) |
+               (op1 << 21) |
+               (CRn << 16) |
+               (CRm <<  0) |
+               (op2 <<  5);
+
+       if (read)
+               instr |= 0x00100000;
+
+       retval = arm11_run_instr_data_prepare(arm11);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (read)
+       {
+               retval = arm11_run_instr_data_from_core_via_r0(arm11, instr, value);
+               if (retval != ERROR_OK)
+                       return retval;
+       }
+       else
+       {
+               retval = arm11_run_instr_data_to_core_via_r0(arm11, instr, *value);
+               if (retval != ERROR_OK)
+                       return retval;
+       }
+
+       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)
+{
+       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)
+{
+       return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, &value, 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)
 {
        FNC_INFO;

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)