X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Farmv7m.c;h=c172a27dc9233da0ecf5718c2c2683d09610b4aa;hp=6d8ad5f1a0a9d5ac08318a46328d349932f004c8;hb=4960c9018f2560b11ede91cde8a68dc56c690159;hpb=df95fe25a4f01db9e131272ee72ebbf328ede428 diff --git a/src/target/armv7m.c b/src/target/armv7m.c index 6d8ad5f1a0..c172a27dc9 100644 --- a/src/target/armv7m.c +++ b/src/target/armv7m.c @@ -480,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), @@ -596,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; @@ -659,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; @@ -695,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; +} + /*--------------------------------------------------------------------------*/ /* @@ -732,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); @@ -795,54 +837,58 @@ COMMAND_HANDLER(handle_dap_info_command) 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, + .handler = handle_dap_info_command, .mode = COMMAND_EXEC, - .help = "dap info for ap [num], " - "default currently selected AP", + .help = "display ROM table for MEM-AP " + "(default currently selected AP)", + .usage = "[ap_num]", }, { .name = "apsel", - .handler = &handle_dap_apsel_command, + .handler = handle_dap_apsel_command, .mode = COMMAND_EXEC, - .help = "select a different AP [num] (default 0)", + .help = "Set the currently selected AP (default 0) " + "and display the result", + .usage = "[ap_num]", }, { .name = "apid", - .handler = &handle_dap_apid_command, + .handler = handle_dap_apid_command, .mode = COMMAND_EXEC, - .help = "return id reg from AP [num], " - "default currently selected AP", + .help = "return ID register from AP " + "(default currently selected AP)", + .usage = "[ap_num]", }, { .name = "baseaddr", - .handler = &handle_dap_baseaddr_command, + .handler = handle_dap_baseaddr_command, .mode = COMMAND_EXEC, - .help = "return debug base address from AP [num], " - "default currently selected AP", + .help = "return debug base address from MEM-AP " + "(default currently selected AP)", + .usage = "[ap_num]", }, { .name = "memaccess", - .handler = &handle_dap_memaccess_command, + .handler = handle_dap_memaccess_command, .mode = COMMAND_EXEC, - .help = "set/get number of extra tck for mem-ap memory " + .help = "set/get number of extra tck for MEM-AP memory " "bus access [0-255]", + .usage = "[cycles]", }, COMMAND_REGISTRATION_DONE }; -static const struct command_registration armv7m_command_handlers[] = { +const struct command_registration armv7m_command_handlers[] = { { .name = "dap", - .mode = COMMAND_ANY, + .mode = COMMAND_EXEC, .help = "Cortex DAP command group", .chain = armv7m_exec_command_handlers, }, COMMAND_REGISTRATION_DONE }; - -int armv7m_register_commands(struct command_context *cmd_ctx) -{ - return register_commands(cmd_ctx, NULL, armv7m_command_handlers); -}