Use enum for target_register_timer_callback()
[openocd.git] / src / target / hla_target.c
index 2db04f8111aa6e9d5ea296550ed1eaafd501d9c7..60ed7d64df1749014ff8d83b4466333d36181b6c 100644 (file)
@@ -18,9 +18,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -66,7 +64,7 @@ static int adapter_load_core_reg_u32(struct target *target,
        switch (num) {
        case 0 ... 18:
                /* read a normal core register */
-               retval = adapter->layout->api->read_reg(adapter->fd, num, value);
+               retval = adapter->layout->api->read_reg(adapter->handle, num, value);
 
                if (retval != ERROR_OK) {
                        LOG_ERROR("JTAG failure %i", retval);
@@ -75,11 +73,6 @@ static int adapter_load_core_reg_u32(struct target *target,
                LOG_DEBUG("load from core reg %i  value 0x%" PRIx32 "", (int)num, *value);
                break;
 
-       case ARMV7M_FPSID:
-       case ARMV7M_FPEXC:
-               *value = 0;
-               break;
-
        case ARMV7M_FPSCR:
                /* Floating-point Status and Registers */
                retval = target_write_u32(target, ARMV7M_SCS_DCRSR, 33);
@@ -88,7 +81,7 @@ static int adapter_load_core_reg_u32(struct target *target,
                retval = target_read_u32(target, ARMV7M_SCS_DCRDR, value);
                if (retval != ERROR_OK)
                        return retval;
-               LOG_DEBUG("load from core reg %i  value 0x%" PRIx32 "", (int)num, *value);
+               LOG_DEBUG("load from FPSCR  value 0x%" PRIx32, *value);
                break;
 
        case ARMV7M_S0 ... ARMV7M_S31:
@@ -99,11 +92,8 @@ static int adapter_load_core_reg_u32(struct target *target,
                retval = target_read_u32(target, ARMV7M_SCS_DCRDR, value);
                if (retval != ERROR_OK)
                        return retval;
-               LOG_DEBUG("load from core reg %i  value 0x%" PRIx32 "", (int)num, *value);
-               break;
-
-       case ARMV7M_D0 ... ARMV7M_D15:
-               value = 0;
+               LOG_DEBUG("load from FPU reg S%d  value 0x%" PRIx32,
+                         (int)(num - ARMV7M_S0), *value);
                break;
 
        case ARMV7M_PRIMASK:
@@ -114,7 +104,7 @@ static int adapter_load_core_reg_u32(struct target *target,
                 * in one Debug Core register.  So say r0 and r2 docs;
                 * it was removed from r1 docs, but still works.
                 */
-               retval = adapter->layout->api->read_reg(adapter->fd, 20, value);
+               retval = adapter->layout->api->read_reg(adapter->handle, 20, value);
                if (retval != ERROR_OK)
                        return retval;
 
@@ -163,7 +153,7 @@ static int adapter_store_core_reg_u32(struct target *target,
         */
        switch (num) {
        case 0 ... 18:
-               retval = adapter->layout->api->write_reg(adapter->fd, num, value);
+               retval = adapter->layout->api->write_reg(adapter->handle, num, value);
 
                if (retval != ERROR_OK) {
                        struct reg *r;
@@ -176,10 +166,6 @@ static int adapter_store_core_reg_u32(struct target *target,
                LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", (int)num, value);
                break;
 
-       case ARMV7M_FPSID:
-       case ARMV7M_FPEXC:
-               break;
-
        case ARMV7M_FPSCR:
                /* Floating-point Status and Registers */
                retval = target_write_u32(target, ARMV7M_SCS_DCRDR, value);
@@ -188,7 +174,7 @@ static int adapter_store_core_reg_u32(struct target *target,
                retval = target_write_u32(target, ARMV7M_SCS_DCRSR, 33 | (1<<16));
                if (retval != ERROR_OK)
                        return retval;
-               LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", (int)num, value);
+               LOG_DEBUG("write FPSCR value 0x%" PRIx32, value);
                break;
 
        case ARMV7M_S0 ... ARMV7M_S31:
@@ -199,10 +185,8 @@ static int adapter_store_core_reg_u32(struct target *target,
                retval = target_write_u32(target, ARMV7M_SCS_DCRSR, (num-ARMV7M_S0+64) | (1<<16));
                if (retval != ERROR_OK)
                        return retval;
-               LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", (int)num, value);
-               break;
-
-       case ARMV7M_D0 ... ARMV7M_D15:
+               LOG_DEBUG("write FPU reg S%d  value 0x%" PRIx32,
+                         (int)(num - ARMV7M_S0), value);
                break;
 
        case ARMV7M_PRIMASK:
@@ -214,7 +198,7 @@ static int adapter_store_core_reg_u32(struct target *target,
                 * it was removed from r1 docs, but still works.
                 */
 
-               adapter->layout->api->read_reg(adapter->fd, 20, &reg);
+               adapter->layout->api->read_reg(adapter->handle, 20, &reg);
 
                switch (num) {
                case ARMV7M_PRIMASK:
@@ -234,7 +218,7 @@ static int adapter_store_core_reg_u32(struct target *target,
                        break;
                }
 
-               adapter->layout->api->write_reg(adapter->fd, 20, reg);
+               adapter->layout->api->write_reg(adapter->handle, 20, reg);
 
                LOG_DEBUG("write special reg %i value 0x%" PRIx32 " ", (int)num, value);
                break;
@@ -259,8 +243,8 @@ static int adapter_examine_debug_reason(struct target *target)
 static int hl_dcc_read(struct hl_interface_s *hl_if, uint8_t *value, uint8_t *ctrl)
 {
        uint16_t dcrdr;
-       int retval = hl_if->layout->api->read_mem8(hl_if->fd,
-                                                               DCB_DCRDR, sizeof(dcrdr), (uint8_t *)&dcrdr);
+       int retval = hl_if->layout->api->read_mem(hl_if->handle,
+                       DCB_DCRDR, 1, sizeof(dcrdr), (uint8_t *)&dcrdr);
        if (retval == ERROR_OK) {
            *ctrl = (uint8_t)dcrdr;
            *value = (uint8_t)(dcrdr >> 8);
@@ -272,8 +256,7 @@ static int hl_dcc_read(struct hl_interface_s *hl_if, uint8_t *value, uint8_t *ct
                         * to signify we have read data */
                        /* atomically clear just the byte containing the busy bit */
                        static const uint8_t zero;
-                       retval = hl_if->layout->api->write_mem8(
-                                               hl_if->fd, DCB_DCRDR, 1, &zero);
+                       retval = hl_if->layout->api->write_mem(hl_if->handle, DCB_DCRDR, 1, 1, &zero);
                }
        }
        return retval;
@@ -288,7 +271,10 @@ static int hl_target_request_data(struct target *target,
        uint32_t i;
 
        for (i = 0; i < (size * 4); i++) {
-               hl_dcc_read(hl_if, &data, &ctrl);
+               int err = hl_dcc_read(hl_if, &data, &ctrl);
+               if (err != ERROR_OK)
+                       return err;
+
                buffer[i] = data;
        }
 
@@ -298,6 +284,8 @@ static int hl_target_request_data(struct target *target,
 static int hl_handle_target_request(void *priv)
 {
        struct target *target = priv;
+       int err;
+
        if (!target_was_examined(target))
                return ERROR_OK;
        struct hl_interface_s *hl_if = target_to_adapter(target);
@@ -309,7 +297,9 @@ static int hl_handle_target_request(void *priv)
                uint8_t data;
                uint8_t ctrl;
 
-               hl_dcc_read(hl_if, &data, &ctrl);
+               err = hl_dcc_read(hl_if, &data, &ctrl);
+               if (err != ERROR_OK)
+                       return err;
 
                /* check if we have data */
                if (ctrl & (1 << 0)) {
@@ -317,11 +307,20 @@ static int hl_handle_target_request(void *priv)
 
                        /* we assume target is quick enough */
                        request = data;
-                       hl_dcc_read(hl_if, &data, &ctrl);
+                       err = hl_dcc_read(hl_if, &data, &ctrl);
+                       if (err != ERROR_OK)
+                               return err;
+
                        request |= (data << 8);
-                       hl_dcc_read(hl_if, &data, &ctrl);
+                       err = hl_dcc_read(hl_if, &data, &ctrl);
+                       if (err != ERROR_OK)
+                               return err;
+
                        request |= (data << 16);
-                       hl_dcc_read(hl_if, &data, &ctrl);
+                       err = hl_dcc_read(hl_if, &data, &ctrl);
+                       if (err != ERROR_OK)
+                               return err;
+
                        request |= (data << 24);
                        target_request(target, request);
                }
@@ -331,14 +330,14 @@ static int hl_handle_target_request(void *priv)
 }
 
 static int adapter_init_arch_info(struct target *target,
-                                      struct cortex_m3_common *cortex_m3,
+                                      struct cortex_m_common *cortex_m,
                                       struct jtag_tap *tap)
 {
        struct armv7m_common *armv7m;
 
        LOG_DEBUG("%s", __func__);
 
-       armv7m = &cortex_m3->armv7m;
+       armv7m = &cortex_m->armv7m;
        armv7m_init_arch_info(target, armv7m);
 
        armv7m->load_core_reg_u32 = adapter_load_core_reg_u32;
@@ -347,7 +346,8 @@ static int adapter_init_arch_info(struct target *target,
        armv7m->examine_debug_reason = adapter_examine_debug_reason;
        armv7m->stlink = true;
 
-       target_register_timer_callback(hl_handle_target_request, 1, 1, target);
+       target_register_timer_callback(hl_handle_target_request, 1,
+               TARGET_TIMER_TYPE_PERIODIC, target);
 
        return ERROR_OK;
 }
@@ -358,7 +358,7 @@ static int adapter_init_target(struct command_context *cmd_ctx,
        LOG_DEBUG("%s", __func__);
 
        armv7m_build_reg_cache(target);
-
+       arm_semihosting_init(target);
        return ERROR_OK;
 }
 
@@ -366,13 +366,19 @@ static int adapter_target_create(struct target *target,
                Jim_Interp *interp)
 {
        LOG_DEBUG("%s", __func__);
-
-       struct cortex_m3_common *cortex_m3 = calloc(1, sizeof(struct cortex_m3_common));
-
-       if (!cortex_m3)
+       struct adiv5_private_config *pc = target->private_config;
+       if (pc != NULL && pc->ap_num > 0) {
+               LOG_ERROR("hla_target: invalid parameter -ap-num (> 0)");
                return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+
+       struct cortex_m_common *cortex_m = calloc(1, sizeof(struct cortex_m_common));
+       if (cortex_m == NULL) {
+               LOG_ERROR("No memory creating target");
+               return ERROR_FAIL;
+       }
 
-       adapter_init_arch_info(target, cortex_m3, target->tap);
+       adapter_init_arch_info(target, cortex_m, target->tap);
 
        return ERROR_OK;
 }
@@ -413,7 +419,7 @@ static int adapter_debug_entry(struct target *target)
        adapter_load_context(target);
 
        /* make sure we clear the vector catch bit */
-       adapter->layout->api->write_debug_reg(adapter->fd, DCB_DEMCR, TRCENA);
+       adapter->layout->api->write_debug_reg(adapter->handle, DCB_DEMCR, TRCENA);
 
        r = arm->cpsr;
        xPSR = buf_get_u32(r->value, 0, 32);
@@ -444,7 +450,7 @@ static int adapter_debug_entry(struct target *target)
 
        LOG_DEBUG("entered debug state in core mode: %s at PC 0x%08" PRIx32 ", target->state: %s",
                arm_mode_name(arm->core_mode),
-               *(uint32_t *)(arm->pc->value),
+               buf_get_u32(arm->pc->value, 0, 32),
                target_state_name(target));
 
        return retval;
@@ -457,18 +463,22 @@ static int adapter_poll(struct target *target)
        struct armv7m_common *armv7m = target_to_armv7m(target);
        enum target_state prev_target_state = target->state;
 
-       state = adapter->layout->api->state(adapter->fd);
+       state = adapter->layout->api->state(adapter->handle);
 
        if (state == TARGET_UNKNOWN) {
                LOG_ERROR("jtag status contains invalid mode value - communication failure");
                return ERROR_TARGET_FAILURE;
        }
 
-       if (target->state == state)
+       if (prev_target_state == state)
                return ERROR_OK;
 
+       if (prev_target_state == TARGET_DEBUG_RUNNING && state == TARGET_RUNNING)
+               return ERROR_OK;
+
+       target->state = state;
+
        if (state == TARGET_HALTED) {
-               target->state = state;
 
                int retval = adapter_debug_entry(target);
                if (retval != ERROR_OK)
@@ -483,7 +493,7 @@ static int adapter_poll(struct target *target)
                        target_call_event_callbacks(target, TARGET_EVENT_HALTED);
                }
 
-               LOG_DEBUG("halted: PC: 0x%08x", buf_get_u32(armv7m->arm.pc->value, 0, 32));
+               LOG_DEBUG("halted: PC: 0x%08" PRIx32, buf_get_u32(armv7m->arm.pc->value, 0, 32));
        }
 
        return ERROR_OK;
@@ -505,22 +515,22 @@ static int adapter_assert_reset(struct target *target)
        if ((jtag_reset_config & RESET_HAS_SRST) &&
            (jtag_reset_config & RESET_SRST_NO_GATING)) {
                jtag_add_reset(0, 1);
-               res = adapter->layout->api->assert_srst(adapter->fd, 0);
+               res = adapter->layout->api->assert_srst(adapter->handle, 0);
                srst_asserted = true;
        }
 
-       adapter->layout->api->write_debug_reg(adapter->fd, DCB_DHCSR, DBGKEY|C_DEBUGEN);
+       adapter->layout->api->write_debug_reg(adapter->handle, DCB_DHCSR, DBGKEY|C_DEBUGEN);
 
        /* only set vector catch if halt is requested */
        if (target->reset_halt)
-               adapter->layout->api->write_debug_reg(adapter->fd, DCB_DEMCR, TRCENA|VC_CORERESET);
+               adapter->layout->api->write_debug_reg(adapter->handle, DCB_DEMCR, TRCENA|VC_CORERESET);
        else
-               adapter->layout->api->write_debug_reg(adapter->fd, DCB_DEMCR, TRCENA);
+               adapter->layout->api->write_debug_reg(adapter->handle, DCB_DEMCR, TRCENA);
 
        if (jtag_reset_config & RESET_HAS_SRST) {
                if (!srst_asserted) {
                        jtag_add_reset(0, 1);
-                       res = adapter->layout->api->assert_srst(adapter->fd, 0);
+                       res = adapter->layout->api->assert_srst(adapter->handle, 0);
                }
                if (res == ERROR_COMMAND_NOTFOUND)
                        LOG_ERROR("Hardware srst not supported, falling back to software reset");
@@ -532,10 +542,10 @@ static int adapter_assert_reset(struct target *target)
 
        if (use_srst_fallback) {
                /* stlink v1 api does not support hardware srst, so we use a software reset fallback */
-               adapter->layout->api->write_debug_reg(adapter->fd, NVIC_AIRCR, AIRCR_VECTKEY | AIRCR_SYSRESETREQ);
+               adapter->layout->api->write_debug_reg(adapter->handle, NVIC_AIRCR, AIRCR_VECTKEY | AIRCR_SYSRESETREQ);
        }
 
-       res = adapter->layout->api->reset(adapter->fd);
+       res = adapter->layout->api->reset(adapter->handle);
 
        if (res != ERROR_OK)
                return res;
@@ -562,7 +572,7 @@ static int adapter_deassert_reset(struct target *target)
        LOG_DEBUG("%s", __func__);
 
        if (jtag_reset_config & RESET_HAS_SRST)
-               adapter->layout->api->assert_srst(adapter->fd, 1);
+               adapter->layout->api->assert_srst(adapter->handle, 1);
 
        /* virtual deassert reset, we need it for the internal
         * jtag state machine
@@ -589,7 +599,7 @@ static int adapter_halt(struct target *target)
        if (target->state == TARGET_UNKNOWN)
                LOG_WARNING("target was in unknown state when halt was requested");
 
-       res = adapter->layout->api->halt(adapter->fd);
+       res = adapter->layout->api->halt(adapter->handle);
 
        if (res != ERROR_OK)
                return res;
@@ -600,7 +610,7 @@ static int adapter_halt(struct target *target)
 }
 
 static int adapter_resume(struct target *target, int current,
-               uint32_t address, int handle_breakpoints,
+               target_addr_t address, int handle_breakpoints,
                int debug_execution)
 {
        int res;
@@ -610,8 +620,8 @@ static int adapter_resume(struct target *target, int current,
        struct breakpoint *breakpoint = NULL;
        struct reg *pc;
 
-       LOG_DEBUG("%s %d 0x%08x %d %d", __func__, current, address,
-                       handle_breakpoints, debug_execution);
+       LOG_DEBUG("%s %d " TARGET_ADDR_FMT " %d %d", __func__, current,
+                       address, handle_breakpoints, debug_execution);
 
        if (target->state != TARGET_HALTED) {
                LOG_WARNING("target not halted");
@@ -620,8 +630,8 @@ static int adapter_resume(struct target *target, int current,
 
        if (!debug_execution) {
                target_free_all_working_areas(target);
-               cortex_m3_enable_breakpoints(target);
-               cortex_m3_enable_watchpoints(target);
+               cortex_m_enable_breakpoints(target);
+               cortex_m_enable_watchpoints(target);
        }
 
        pc = armv7m->arm.pc;
@@ -658,21 +668,21 @@ static int adapter_resume(struct target *target, int current,
                /* Single step past breakpoint at current address */
                breakpoint = breakpoint_find(target, resume_pc);
                if (breakpoint) {
-                       LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 " (ID: %d)",
+                       LOG_DEBUG("unset breakpoint at " TARGET_ADDR_FMT " (ID: %" PRIu32 ")",
                                        breakpoint->address,
                                        breakpoint->unique_id);
-                       cortex_m3_unset_breakpoint(target, breakpoint);
+                       cortex_m_unset_breakpoint(target, breakpoint);
 
-                       res = adapter->layout->api->step(adapter->fd);
+                       res = adapter->layout->api->step(adapter->handle);
 
                        if (res != ERROR_OK)
                                return res;
 
-                       cortex_m3_set_breakpoint(target, breakpoint);
+                       cortex_m_set_breakpoint(target, breakpoint);
                }
        }
 
-       res = adapter->layout->api->run(adapter->fd);
+       res = adapter->layout->api->run(adapter->handle);
 
        if (res != ERROR_OK)
                return res;
@@ -691,7 +701,7 @@ static int adapter_resume(struct target *target, int current,
 }
 
 static int adapter_step(struct target *target, int current,
-               uint32_t address, int handle_breakpoints)
+               target_addr_t address, int handle_breakpoints)
 {
        int res;
        struct hl_interface_s *adapter = target_to_adapter(target);
@@ -719,7 +729,7 @@ static int adapter_step(struct target *target, int current,
        if (handle_breakpoints) {
                breakpoint = breakpoint_find(target, pc_value);
                if (breakpoint)
-                       cortex_m3_unset_breakpoint(target, breakpoint);
+                       cortex_m_unset_breakpoint(target, breakpoint);
        }
 
        armv7m_maybe_skip_bkpt_inst(target, &bkpt_inst_found);
@@ -735,7 +745,7 @@ static int adapter_step(struct target *target, int current,
 
        target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
 
-       res = adapter->layout->api->step(adapter->fd);
+       res = adapter->layout->api->step(adapter->handle);
 
        if (res != ERROR_OK)
                return res;
@@ -744,116 +754,53 @@ static int adapter_step(struct target *target, int current,
        register_cache_invalidate(armv7m->arm.core_cache);
 
        if (breakpoint)
-               cortex_m3_set_breakpoint(target, breakpoint);
+               cortex_m_set_breakpoint(target, breakpoint);
 
        adapter_debug_entry(target);
        target_call_event_callbacks(target, TARGET_EVENT_HALTED);
 
-       LOG_INFO("halted: PC: 0x%08x", buf_get_u32(armv7m->arm.pc->value, 0, 32));
+       LOG_INFO("halted: PC: 0x%08" PRIx32, buf_get_u32(armv7m->arm.pc->value, 0, 32));
 
        return ERROR_OK;
 }
 
-static int adapter_read_memory(struct target *target, uint32_t address,
+static int adapter_read_memory(struct target *target, target_addr_t address,
                uint32_t size, uint32_t count,
                uint8_t *buffer)
 {
        struct hl_interface_s *adapter = target_to_adapter(target);
-       int res;
-       uint32_t buffer_threshold = (adapter->param.max_buffer / 4);
-       uint32_t addr_increment = 4;
-       uint32_t c;
 
        if (!count || !buffer)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       LOG_DEBUG("%s 0x%08x %d %d", __func__, address, size, count);
-
-       /* prepare byte count, buffer threshold
-        * and address increment for none 32bit access
-        */
-       if (size != 4) {
-               count *= size;
-               buffer_threshold = (adapter->param.max_buffer / 4) / 2;
-               addr_increment = 1;
-       }
+       LOG_DEBUG("%s " TARGET_ADDR_FMT " %" PRIu32 " %" PRIu32,
+                         __func__, address, size, count);
 
-       while (count) {
-               if (count > buffer_threshold)
-                       c = buffer_threshold;
-               else
-                       c = count;
-
-               if (size != 4)
-                       res = adapter->layout->api->read_mem8(adapter->fd,
-                                       address, c, buffer);
-               else
-                       res = adapter->layout->api->read_mem32(adapter->fd,
-                                       address, c, buffer);
-
-               if (res != ERROR_OK)
-                       return res;
-
-               address += (c * addr_increment);
-               buffer += (c * addr_increment);
-               count -= c;
-       }
-
-       return ERROR_OK;
+       return adapter->layout->api->read_mem(adapter->handle, address, size, count, buffer);
 }
 
-static int adapter_write_memory(struct target *target, uint32_t address,
+static int adapter_write_memory(struct target *target, target_addr_t address,
                uint32_t size, uint32_t count,
                const uint8_t *buffer)
 {
        struct hl_interface_s *adapter = target_to_adapter(target);
-       int res;
-       uint32_t buffer_threshold = (adapter->param.max_buffer / 4);
-       uint32_t addr_increment = 4;
-       uint32_t c;
 
        if (!count || !buffer)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       LOG_DEBUG("%s 0x%08x %d %d", __func__, address, size, count);
+       LOG_DEBUG("%s " TARGET_ADDR_FMT " %" PRIu32 " %" PRIu32,
+                         __func__, address, size, count);
 
-       /* prepare byte count, buffer threshold
-        * and address increment for none 32bit access
-        */
-       if (size != 4) {
-               count *= size;
-               buffer_threshold = (adapter->param.max_buffer / 4) / 2;
-               addr_increment = 1;
-       }
-
-       while (count) {
-               if (count > buffer_threshold)
-                       c = buffer_threshold;
-               else
-                       c = count;
-
-               if (size != 4)
-                       res = adapter->layout->api->write_mem8(adapter->fd,
-                                       address, c, buffer);
-               else
-                       res = adapter->layout->api->write_mem32(adapter->fd,
-                                       address, c, buffer);
-
-               if (res != ERROR_OK)
-                       return res;
-
-               address += (c * addr_increment);
-               buffer += (c * addr_increment);
-               count -= c;
-       }
-
-       return ERROR_OK;
+       return adapter->layout->api->write_mem(adapter->handle, address, size, count, buffer);
 }
 
 static const struct command_registration adapter_command_handlers[] = {
        {
                .chain = arm_command_handlers,
        },
+       {
+               .chain = armv7m_trace_command_handlers,
+       },
        COMMAND_REGISTRATION_DONE
 };
 
@@ -862,8 +809,10 @@ struct target_type hla_target = {
        .deprecated_name = "stm32_stlink",
 
        .init_target = adapter_init_target,
+       .deinit_target = cortex_m_deinit_target,
        .target_create = adapter_target_create,
-       .examine = cortex_m3_examine,
+       .target_jim_configure = adiv5_jim_configure,
+       .examine = cortex_m_examine,
        .commands = adapter_command_handlers,
 
        .poll = adapter_poll,
@@ -877,6 +826,7 @@ struct target_type hla_target = {
        .resume = adapter_resume,
        .step = adapter_step,
 
+       .get_gdb_arch = arm_get_gdb_arch,
        .get_gdb_reg_list = armv7m_get_gdb_reg_list,
 
        .read_memory = adapter_read_memory,
@@ -888,8 +838,9 @@ struct target_type hla_target = {
        .start_algorithm = armv7m_start_algorithm,
        .wait_algorithm = armv7m_wait_algorithm,
 
-       .add_breakpoint = cortex_m3_add_breakpoint,
-       .remove_breakpoint = cortex_m3_remove_breakpoint,
-       .add_watchpoint = cortex_m3_add_watchpoint,
-       .remove_watchpoint = cortex_m3_remove_watchpoint,
+       .add_breakpoint = cortex_m_add_breakpoint,
+       .remove_breakpoint = cortex_m_remove_breakpoint,
+       .add_watchpoint = cortex_m_add_watchpoint,
+       .remove_watchpoint = cortex_m_remove_watchpoint,
+       .profiling = cortex_m_profiling,
 };

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)