X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fstm32_stlink.c;h=d2f38e5af384d4eb8194977ac01022472baf30ae;hp=f6f9247f64a12e7a7d3c0ceb84cf8f5458357943;hb=dbb8de15e39390bf5f323dddb8e5f090515977d1;hpb=6bbb1479b316890519da8aa93f115501711d8656 diff --git a/src/target/stm32_stlink.c b/src/target/stm32_stlink.c index f6f9247f64..d2f38e5af3 100644 --- a/src/target/stm32_stlink.c +++ b/src/target/stm32_stlink.c @@ -20,6 +20,7 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -35,6 +36,10 @@ #include "target_type.h" #include "armv7m.h" #include "cortex_m.h" +#include "arm_semihosting.h" + +#define ARMV7M_SCS_DCRSR 0xe000edf4 +#define ARMV7M_SCS_DCRDR 0xe000edf8 static inline struct stlink_interface_s *target_to_stlink(struct target *target) { @@ -42,8 +47,8 @@ static inline struct stlink_interface_s *target_to_stlink(struct target *target) } static int stm32_stlink_load_core_reg_u32(struct target *target, - enum armv7m_regtype type, - uint32_t num, uint32_t *value) + enum armv7m_regtype type, + uint32_t num, uint32_t *value) { int retval; struct stlink_interface_s *stlink_if = target_to_stlink(target); @@ -57,15 +62,25 @@ static int stm32_stlink_load_core_reg_u32(struct target *target, switch (num) { case 0 ... 18: /* read a normal core register */ - retval = - stlink_if->layout->api->read_reg(stlink_if->fd, num, value); + retval = stlink_if->layout->api->read_reg(stlink_if->fd, num, value); if (retval != ERROR_OK) { LOG_ERROR("JTAG failure %i", retval); return ERROR_JTAG_DEVICE_ERROR; } - LOG_DEBUG("load from core reg %i value 0x%" PRIx32 "", - (int)num, *value); + LOG_DEBUG("load from core reg %i value 0x%" PRIx32 "", (int)num, *value); + break; + + case 33: + case 64 ... 96: + /* Floating-point Status and Registers */ + retval = target_write_u32(target, ARMV7M_SCS_DCRSR, num); + if (retval != ERROR_OK) + return retval; + 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_PRIMASK: @@ -76,8 +91,7 @@ static int stm32_stlink_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 = - stlink_if->layout->api->read_reg(stlink_if->fd, 20, value); + retval = stlink_if->layout->api->read_reg(stlink_if->fd, 20, value); switch (num) { case ARMV7M_PRIMASK: @@ -109,8 +123,8 @@ static int stm32_stlink_load_core_reg_u32(struct target *target, } static int stm32_stlink_store_core_reg_u32(struct target *target, - enum armv7m_regtype type, - uint32_t num, uint32_t value) + enum armv7m_regtype type, + uint32_t num, uint32_t value) { int retval; uint32_t reg; @@ -150,6 +164,18 @@ static int stm32_stlink_store_core_reg_u32(struct target *target, LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", (int)num, value); break; + case 33: + case 64 ... 96: + /* Floating-point Status and Registers */ + retval = target_write_u32(target, ARMV7M_SCS_DCRDR, value); + if (retval != ERROR_OK) + return retval; + retval = target_write_u32(target, ARMV7M_SCS_DCRSR, num | (1<<16)); + if (retval != ERROR_OK) + return retval; + LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", (int)num, value); + break; + case ARMV7M_PRIMASK: case ARMV7M_BASEPRI: case ARMV7M_FAULTMASK: @@ -231,7 +257,7 @@ static int stm32_stlink_init_target(struct command_context *cmd_ctx, } static int stm32_stlink_target_create(struct target *target, - Jim_Interp *interp) + Jim_Interp *interp) { LOG_DEBUG("%s", __func__); @@ -245,66 +271,6 @@ static int stm32_stlink_target_create(struct target *target, return ERROR_OK; } -static int stm32_stlink_examine(struct target *target) -{ - int retval, i; - uint32_t cpuid, fpcr; - struct cortex_m3_common *cortex_m3 = target_to_cm3(target); - - LOG_DEBUG("%s", __func__); - - if (target->tap->hasidcode == false) { - LOG_ERROR("no IDCODE present on device"); - - return ERROR_COMMAND_SYNTAX_ERROR; - } - - if (!target_was_examined(target)) { - target_set_examined(target); - - LOG_INFO("IDCODE %x", target->tap->idcode); - - /* Read from Device Identification Registers */ - retval = target_read_u32(target, CPUID, &cpuid); - if (retval != ERROR_OK) - return retval; - - if (((cpuid >> 4) & 0xc3f) == 0xc23) - LOG_DEBUG("Cortex-M3 r%" PRId8 "p%" PRId8 " processor detected", - (uint8_t)((cpuid >> 20) & 0xf), (uint8_t)((cpuid >> 0) & 0xf)); - LOG_DEBUG("cpuid: 0x%8.8" PRIx32 "", cpuid); - - /* Setup FPB */ - target_read_u32(target, FP_CTRL, &fpcr); - cortex_m3->auto_bp_type = 1; - cortex_m3->fp_num_code = ((fpcr >> 8) & 0x70) | - ((fpcr >> 4) & 0xF); /* bits [14:12] and [7:4] */ - cortex_m3->fp_num_lit = (fpcr >> 8) & 0xF; - cortex_m3->fp_code_available = cortex_m3->fp_num_code; - cortex_m3->fp_comparator_list = calloc(cortex_m3->fp_num_code + - cortex_m3->fp_num_lit, sizeof(struct cortex_m3_fp_comparator)); - cortex_m3->fpb_enabled = fpcr & 1; - for (i = 0; i < cortex_m3->fp_num_code + cortex_m3->fp_num_lit; i++) { - cortex_m3->fp_comparator_list[i].type = - (i < cortex_m3->fp_num_code) ? FPCR_CODE : FPCR_LITERAL; - cortex_m3->fp_comparator_list[i].fpcr_address = FP_COMP0 + 4 * i; - } - LOG_DEBUG("FPB fpcr 0x%" PRIx32 ", numcode %i, numlit %i", fpcr, - cortex_m3->fp_num_code, cortex_m3->fp_num_lit); - - /* Setup DWT */ - cortex_m3_dwt_setup(cortex_m3, target); - - /* These hardware breakpoints only work for code in flash! */ - LOG_INFO("%s: hardware has %d breakpoints, %d watchpoints", - target_name(target), - cortex_m3->fp_num_code, - cortex_m3->dwt_num_comp); - } - - return ERROR_OK; -} - static int stm32_stlink_load_context(struct target *target) { struct armv7m_common *armv7m = target_to_armv7m(target); @@ -388,7 +354,12 @@ static int stm32_stlink_poll(struct target *target) if (state == TARGET_HALTED) { target->state = state; - stlink_debug_entry(target); + int retval = stlink_debug_entry(target); + if (retval != ERROR_OK) + return retval; + + if (arm_semihosting(target, &retval) != 0) + return retval; target_call_event_callbacks(target, TARGET_EVENT_HALTED); LOG_DEBUG("halted: PC: 0x%x", buf_get_u32(armv7m->arm.pc->value, 0, 32)); @@ -467,10 +438,8 @@ static int stm32_stlink_halt(struct target *target) return ERROR_OK; } - if (target->state == TARGET_UNKNOWN) { - LOG_WARNING - ("target was in unknown state when halt was requested"); - } + if (target->state == TARGET_UNKNOWN) + LOG_WARNING("target was in unknown state when halt was requested"); res = stlink_if->layout->api->halt(stlink_if->fd); @@ -483,8 +452,8 @@ static int stm32_stlink_halt(struct target *target) } static int stm32_stlink_resume(struct target *target, int current, - uint32_t address, int handle_breakpoints, - int debug_execution) + uint32_t address, int handle_breakpoints, + int debug_execution) { int res; struct stlink_interface_s *stlink_if = target_to_stlink(target); @@ -494,7 +463,7 @@ static int stm32_stlink_resume(struct target *target, int current, struct reg *pc; LOG_DEBUG("%s %d %x %d %d", __func__, current, address, - handle_breakpoints, debug_execution); + handle_breakpoints, debug_execution); if (target->state != TARGET_HALTED) { LOG_WARNING("target not halted"); @@ -526,8 +495,8 @@ static int stm32_stlink_resume(struct target *target, int current, breakpoint = breakpoint_find(target, resume_pc); if (breakpoint) { LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 " (ID: %d)", - breakpoint->address, - breakpoint->unique_id); + breakpoint->address, + breakpoint->unique_id); cortex_m3_unset_breakpoint(target, breakpoint); res = stlink_if->layout->api->step(stlink_if->fd); @@ -552,7 +521,7 @@ static int stm32_stlink_resume(struct target *target, int current, } static int stm32_stlink_step(struct target *target, int current, - uint32_t address, int handle_breakpoints) + uint32_t address, int handle_breakpoints) { int res; struct stlink_interface_s *stlink_if = target_to_stlink(target); @@ -602,10 +571,8 @@ static int stm32_stlink_step(struct target *target, int current, if (breakpoint) cortex_m3_set_breakpoint(target, breakpoint); - target->debug_reason = DBG_REASON_SINGLESTEP; - target_call_event_callbacks(target, TARGET_EVENT_HALTED); - stlink_debug_entry(target); + target_call_event_callbacks(target, TARGET_EVENT_HALTED); LOG_INFO("halted: PC: 0x%x", buf_get_u32(armv7m->arm.pc->value, 0, 32)); @@ -613,8 +580,8 @@ static int stm32_stlink_step(struct target *target, int current, } static int stm32_stlink_read_memory(struct target *target, uint32_t address, - uint32_t size, uint32_t count, - uint8_t *buffer) + uint32_t size, uint32_t count, + uint8_t *buffer) { int res; uint32_t buffer_threshold = 128; @@ -644,13 +611,11 @@ static int stm32_stlink_read_memory(struct target *target, uint32_t address, c = count; if (size != 4) - res = - stlink_if->layout->api->read_mem8(stlink_if->fd, address, - c, dst); + res = stlink_if->layout->api->read_mem8(stlink_if->fd, + address, c, dst); else - res = - stlink_if->layout->api->read_mem32(stlink_if->fd, address, - c, (uint32_t *)dst); + res = stlink_if->layout->api->read_mem32(stlink_if->fd, + address, c, (uint32_t *)dst); if (res != ERROR_OK) return res; @@ -664,8 +629,8 @@ static int stm32_stlink_read_memory(struct target *target, uint32_t address, } static int stm32_stlink_write_memory(struct target *target, uint32_t address, - uint32_t size, uint32_t count, - const uint8_t *buffer) + uint32_t size, uint32_t count, + const uint8_t *buffer) { int res; uint32_t buffer_threshold = 128; @@ -695,13 +660,11 @@ static int stm32_stlink_write_memory(struct target *target, uint32_t address, c = count; if (size != 4) - res = - stlink_if->layout->api->write_mem8(stlink_if->fd, address, - c, dst); + res = stlink_if->layout->api->write_mem8(stlink_if->fd, + address, c, dst); else - res = - stlink_if->layout->api->write_mem32(stlink_if->fd, address, - c, (uint32_t *)dst); + res = stlink_if->layout->api->write_mem32(stlink_if->fd, + address, c, (uint32_t *)dst); if (res != ERROR_OK) return res; @@ -715,8 +678,8 @@ static int stm32_stlink_write_memory(struct target *target, uint32_t address, } static int stm32_stlink_bulk_write_memory(struct target *target, - uint32_t address, uint32_t count, - const uint8_t *buffer) + uint32_t address, uint32_t count, + const uint8_t *buffer) { return stm32_stlink_write_memory(target, address, 4, count, buffer); } @@ -726,7 +689,7 @@ struct target_type stm32_stlink_target = { .init_target = stm32_stlink_init_target, .target_create = stm32_stlink_target_create, - .examine = stm32_stlink_examine, + .examine = cortex_m3_examine, .poll = stm32_stlink_poll, .arch_state = armv7m_arch_state,