ARM semihosting: fix writing to stdout
[openocd.git] / src / target / armv7m.c
index 56fbb05dd3cd7b195272bf8516e0586ded2add4b..c172a27dc9233da0ecf5718c2c2683d09610b4aa 100644 (file)
@@ -246,21 +246,6 @@ static int armv7m_write_core_reg(struct target *target, unsigned num)
        return ERROR_OK;
 }
 
-/** Invalidates cache of core registers set up by armv7m_build_reg_cache(). */
-int armv7m_invalidate_core_regs(struct target *target)
-{
-       struct armv7m_common *armv7m = target_to_armv7m(target);
-       int i;
-
-       for (i = 0; i < armv7m->core_cache->num_regs; i++)
-       {
-               armv7m->core_cache->reg_list[i].valid = 0;
-               armv7m->core_cache->reg_list[i].dirty = 0;
-       }
-
-       return ERROR_OK;
-}
-
 /**
  * Returns generic ARM userspace registers to GDB.
  * GDB doesn't quite understand that most ARMs don't have floating point
@@ -495,8 +480,7 @@ int armv7m_arch_state(struct target *target)
 
        LOG_USER("target halted due to %s, current mode: %s %s\n"
                "xPSR: %#8.8" PRIx32 " pc: %#8.8" PRIx32 " %csp: %#8.8" PRIx32,
-               Jim_Nvp_value2name_simple(nvp_target_debug_reason,
-                               target->debug_reason)->name,
+               debug_reason_name(target),
                armv7m_mode_strings[armv7m->core_mode],
                armv7m_exception_string(armv7m->exception_number),
                buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_xPSR].value, 0, 32),
@@ -611,7 +595,7 @@ int armv7m_checksum_memory(struct target *target,
        }
 
        /* convert flash writing code into a buffer in target endianness */
-       for (i = 0; i < (sizeof(cortex_m3_crc_code)/sizeof(uint16_t)); i++)
+       for (i = 0; i < ARRAY_SIZE(cortex_m3_crc_code); i++)
                if ((retval = target_write_u16(target, crc_algorithm->address + i*sizeof(uint16_t), cortex_m3_crc_code[i])) != ERROR_OK)
                {
                        return retval;
@@ -674,7 +658,7 @@ int armv7m_blank_check_memory(struct target *target,
        }
 
        /* convert flash writing code into a buffer in target endianness */
-       for (i = 0; i < (sizeof(erase_check_code)/sizeof(uint16_t)); i++)
+       for (i = 0; i < ARRAY_SIZE(erase_check_code); i++)
                target_write_u16(target, erase_check_algorithm->address + i*sizeof(uint16_t), erase_check_code[i]);
 
        armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
@@ -710,6 +694,44 @@ int armv7m_blank_check_memory(struct target *target,
        return ERROR_OK;
 }
 
+int armv7m_maybe_skip_bkpt_inst(struct target *target, bool *inst_found)
+{
+       struct armv7m_common *armv7m = target_to_armv7m(target);
+       struct reg *r = armv7m->core_cache->reg_list + 15;
+       bool result = false;
+
+
+       /* if we halted last time due to a bkpt instruction
+        * then we have to manually step over it, otherwise
+        * the core will break again */
+
+       if (target->debug_reason == DBG_REASON_BREAKPOINT)
+       {
+               uint16_t op;
+               uint32_t pc = buf_get_u32(r->value, 0, 32);
+
+               pc &= ~1;
+               if (target_read_u16(target, pc, &op) == ERROR_OK)
+               {
+                       if ((op & 0xFF00) == 0xBE00)
+                       {
+                               pc = buf_get_u32(r->value, 0, 32) + 2;
+                               buf_set_u32(r->value, 0, 32, pc);
+                               r->dirty = true;
+                               r->valid = true;
+                               result = true;
+                               LOG_DEBUG("Skipping over BKPT instruction");
+                       }
+               }
+       }
+
+       if (inst_found) {
+               *inst_found = result;
+       }
+
+       return ERROR_OK;
+}
+
 /*--------------------------------------------------------------------------*/
 
 /*
@@ -747,7 +769,12 @@ COMMAND_HANDLER(handle_dap_baseaddr_command)
        if (apselsave != apsel)
                dap_ap_select(swjdp, apsel);
 
-       dap_ap_read_reg_u32(swjdp, 0xF8, &baseaddr);
+       /* NOTE:  assumes we're talking to a MEM-AP, which
+        * has a base address.  There are other kinds of AP,
+        * though they're not common for now.  This should
+        * use the ID register to verify it's a MEM-AP.
+        */
+       dap_ap_read_reg_u32(swjdp, AP_REG_BASE, &baseaddr);
        retval = swjdp_transaction_endcheck(swjdp);
        command_print(CMD_CTX, "0x%8.8" PRIx32 "", baseaddr);
 
@@ -810,34 +837,58 @@ COMMAND_HANDLER(handle_dap_info_command)
        return dap_info_command(CMD_CTX, swjdp, apsel);
 }
 
-/** Registers commands used to access DAP resources. */
-int armv7m_register_commands(struct command_context *cmd_ctx)
-{
-       struct command *arm_adi_v5_dap_cmd;
-
-       arm_adi_v5_dap_cmd = register_command(cmd_ctx, NULL, "dap",
-                       NULL, COMMAND_ANY,
-                       "cortex dap specific commands");
-
-       register_command(cmd_ctx, arm_adi_v5_dap_cmd, "info",
-                       handle_dap_info_command, COMMAND_EXEC,
-                       "Displays dap info for ap [num],"
-                       "default currently selected AP");
-       register_command(cmd_ctx, arm_adi_v5_dap_cmd, "apsel",
-                       handle_dap_apsel_command, COMMAND_EXEC,
-                       "Select a different AP [num] (default 0)");
-       register_command(cmd_ctx, arm_adi_v5_dap_cmd, "apid",
-                       handle_dap_apid_command, COMMAND_EXEC,
-                       "Displays id reg from AP [num], "
-                       "default currently selected AP");
-       register_command(cmd_ctx, arm_adi_v5_dap_cmd, "baseaddr",
-                       handle_dap_baseaddr_command, COMMAND_EXEC,
-                       "Displays debug base address from AP [num],"
-                       "default currently selected AP");
-       register_command(cmd_ctx, arm_adi_v5_dap_cmd, "memaccess",
-                       handle_dap_memaccess_command, COMMAND_EXEC,
-                       "set/get number of extra tck for mem-ap "
-                       "memory bus access [0-255]");
-
-       return ERROR_OK;
-}
+/* 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[] = {
+       {
+               .name = "dap",
+               .mode = COMMAND_EXEC,
+               .help = "Cortex DAP command group",
+               .chain = armv7m_exec_command_handlers,
+       },
+       COMMAND_REGISTRATION_DONE
+};

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)