LOG_WARNING("breakpoint already set");
return ERROR_OK;
}
-
+
if (cortex_m3->auto_bp_type)
{
breakpoint->type = (breakpoint->address < 0x20000000) ? BKPT_HARD : BKPT_SOFT;
/* get pointers to arch-specific information */
armv7m_common_t *armv7m = target->arch_info;
cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
-
+
if (cortex_m3->auto_bp_type)
{
breakpoint->type = (breakpoint->address < 0x20000000) ? BKPT_HARD : BKPT_SOFT;
+ if (breakpoint->length != 2) {
+ // XXX Hack: Replace all breakpoints with length != 2 with
+ // a hardware breakpoint.
+ breakpoint->type = BKPT_HARD;
+ breakpoint->length = 2;
+ }
}
if ((breakpoint->type == BKPT_HARD) && (breakpoint->address >= 0x20000000))
cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
swjdp_common_t *swjdp = &cortex_m3->swjdp_info;
+ // If the LR register is being modified, make sure it will put us
+ // in "thumb" mode, or an INVSTATE exception will occur. This is a
+ // hack to deal with the fact that gdb will sometimes "forge"
+ // return addresses, and doesn't set the LSB correctly (i.e., when
+ // printing expressions containing function calls, it sets LR=0.)
+ if (num==14)
+ value |= 0x01;
+
if ((type == ARMV7M_REGISTER_CORE_GP) && (num <= ARMV7M_PSP))
{
retval = ahbap_write_coreregister_u32(swjdp, value, num);
return retval;
}
+