mips32: Added CP0 coprocessor R/W routines
[fw/openocd] / src / target / armv7m.c
index 65e03bf6db724d4d997e41718ea332ce583090b5..fff5dd84062d1c8b7850f5f525f443dd82a577f8 100644 (file)
@@ -82,7 +82,7 @@ struct reg armv7m_gdb_dummy_cpsr_reg =
  */
 static const struct {
        unsigned id;
-       char *name;
+       const char *name;
        unsigned bits;
 } armv7m_regs[] = {
        { ARMV7M_R0, "r0", 32 },
@@ -139,9 +139,6 @@ int armv7m_restore_context(struct target *target)
                }
        }
 
-       if (armv7m->post_restore_context)
-               armv7m->post_restore_context(target);
-
        return ERROR_OK;
 }
 
@@ -316,9 +313,9 @@ static int armv7m_run_and_wait(struct target *target, uint32_t entry_point, int
        }
 
        armv7m->load_core_reg_u32(target, ARMV7M_REGISTER_CORE_GP, 15, &pc);
-       if (pc != exit_point)
+       if (exit_point && (pc != exit_point))
        {
-               LOG_DEBUG("failed algoritm halted at 0x%" PRIx32 " ", pc);
+               LOG_DEBUG("failed algorithm halted at 0x%" PRIx32 " ", pc);
                return ERROR_TARGET_TIMEOUT;
        }
 
@@ -530,7 +527,7 @@ struct reg_cache *armv7m_build_reg_cache(struct target *target)
        return cache;
 }
 
-int armv7m_setup_semihosting(struct target *target, int enable)
+static int armv7m_setup_semihosting(struct target *target, int enable)
 {
        /* nothing todo for armv7m */
        return ERROR_OK;
@@ -565,6 +562,8 @@ int armv7m_checksum_memory(struct target *target,
        struct reg_param reg_params[2];
        int retval;
 
+       /* see contib/loaders/checksum/armv7m_crc.s for src */
+
        static const uint16_t cortex_m3_crc_code[] = {
                0x4602,                                 /* mov  r2, r0 */
                0xF04F, 0x30FF,                 /* mov  r0, #0xffffffff */
@@ -618,8 +617,10 @@ int armv7m_checksum_memory(struct target *target,
        buf_set_u32(reg_params[0].value, 0, 32, address);
        buf_set_u32(reg_params[1].value, 0, 32, count);
 
+       int timeout = 20000 * (1 + (count / (1024 * 1024)));
+
        if ((retval = target_run_algorithm(target, 0, NULL, 2, reg_params,
-               crc_algorithm->address, crc_algorithm->address + (sizeof(cortex_m3_crc_code)-6), 20000, &armv7m_info)) != ERROR_OK)
+               crc_algorithm->address, crc_algorithm->address + (sizeof(cortex_m3_crc_code)-6), timeout, &armv7m_info)) != ERROR_OK)
        {
                LOG_ERROR("error executing cortex_m3 crc algorithm");
                destroy_reg_param(&reg_params[0]);
@@ -739,160 +740,12 @@ int armv7m_maybe_skip_bkpt_inst(struct target *target, bool *inst_found)
        return ERROR_OK;
 }
 
-/*--------------------------------------------------------------------------*/
-
-/*
- * Only stuff below this line should need to verify that its target
- * is an ARMv7-M node.
- */
-
-
-/*
- * Return the debug ap baseaddress in hexadecimal;
- * no extra output to simplify script processing
- */
-COMMAND_HANDLER(handle_dap_baseaddr_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct armv7m_common *armv7m = target_to_armv7m(target);
-       struct swjdp_common *swjdp = &armv7m->swjdp_info;
-
-       if (!is_armv7m(armv7m)) {
-               command_print(CMD_CTX, "current target isn't an ARM7-M");
-               return ERROR_TARGET_INVALID;
-       }
-
-       return CALL_COMMAND_HANDLER(dap_baseaddr_command, swjdp);
-}
-
-/*
- * Return the debug ap id in hexadecimal;
- * no extra output to simplify script processing
- */
-COMMAND_HANDLER(handle_dap_apid_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct armv7m_common *armv7m = target_to_armv7m(target);
-       struct swjdp_common *swjdp = &armv7m->swjdp_info;
-
-       if (!is_armv7m(armv7m)) {
-               command_print(CMD_CTX, "current target isn't an ARM7-M");
-               return ERROR_TARGET_INVALID;
-       }
-
-       return CALL_COMMAND_HANDLER(dap_apid_command, swjdp);
-}
-
-COMMAND_HANDLER(handle_dap_apsel_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct armv7m_common *armv7m = target_to_armv7m(target);
-       struct swjdp_common *swjdp = &armv7m->swjdp_info;
-
-       if (!is_armv7m(armv7m)) {
-               command_print(CMD_CTX, "current target isn't an ARM7-M");
-               return ERROR_TARGET_INVALID;
-       }
-
-       return CALL_COMMAND_HANDLER(dap_apsel_command, swjdp);
-}
-
-COMMAND_HANDLER(handle_dap_memaccess_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct armv7m_common *armv7m = target_to_armv7m(target);
-       struct swjdp_common *swjdp = &armv7m->swjdp_info;
-
-       if (!is_armv7m(armv7m)) {
-               command_print(CMD_CTX, "current target isn't an ARM7-M");
-               return ERROR_TARGET_INVALID;
-       }
-
-       return CALL_COMMAND_HANDLER(dap_memaccess_command, swjdp);
-}
-
-
-COMMAND_HANDLER(handle_dap_info_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct armv7m_common *armv7m = target_to_armv7m(target);
-       struct swjdp_common *swjdp = &armv7m->swjdp_info;
-       uint32_t apsel;
-
-       if (!is_armv7m(armv7m)) {
-               command_print(CMD_CTX, "current target isn't an ARM7-M");
-               return ERROR_TARGET_INVALID;
-       }
-
-       switch (CMD_ARGC) {
-       case 0:
-               apsel = swjdp->apsel;
-               break;
-       case 1:
-               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
-               break;
-       default:
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       return dap_info_command(CMD_CTX, swjdp, apsel);
-}
-
-/* FIXME this table should be part of generic DAP support, and
- * be shared by the ARMv7-A/R and ARMv7-M support ...
- */
-static const struct command_registration armv7m_exec_command_handlers[] = {
-       {
-               .name = "info",
-               .handler = handle_dap_info_command,
-               .mode = COMMAND_EXEC,
-               .help = "display ROM table for MEM-AP "
-                       "(default currently selected AP)",
-               .usage = "[ap_num]",
-       },
-       {
-               .name = "apsel",
-               .handler = handle_dap_apsel_command,
-               .mode = COMMAND_EXEC,
-               .help = "Set the currently selected AP (default 0) "
-                       "and display the result",
-               .usage = "[ap_num]",
-       },
-       {
-               .name = "apid",
-               .handler = handle_dap_apid_command,
-               .mode = COMMAND_EXEC,
-               .help = "return ID register from AP "
-                       "(default currently selected AP)",
-               .usage = "[ap_num]",
-       },
-       {
-               .name = "baseaddr",
-               .handler = handle_dap_baseaddr_command,
-               .mode = COMMAND_EXEC,
-               .help = "return debug base address from MEM-AP "
-                       "(default currently selected AP)",
-               .usage = "[ap_num]",
-       },
-       {
-               .name = "memaccess",
-               .handler = handle_dap_memaccess_command,
-               .mode = COMMAND_EXEC,
-               .help = "set/get number of extra tck for MEM-AP memory "
-                       "bus access [0-255]",
-               .usage = "[cycles]",
-       },
-       COMMAND_REGISTRATION_DONE
-};
 const struct command_registration armv7m_command_handlers[] = {
        {
                .chain = arm_command_handlers,
        },
        {
-               .name = "dap",
-               .mode = COMMAND_EXEC,
-               .help = "Cortex DAP command group",
-               .chain = armv7m_exec_command_handlers,
+               .chain = dap_command_handlers,
        },
        COMMAND_REGISTRATION_DONE
 };