cortex_m: fix stepping on FPB rev 1

Stepping in the maskisr auto mode sets breakpoint to step over interrupt
service tasks. If the device has FPB rev 1, setting hard breakpoint
is impossible on address over 0x1fffffff.

Use soft type breakpoint for adresses over 0x1fffffff if FPB is rev 1.
This may eventually fail if the code memory is not writeable, but there
is nothing to do in such case.

Change-Id: Ibdeeb506903a35d550b64f82c24c37a668de62b3
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/4857
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
log_output
Tomas Vanek 2019-01-19 10:26:38 +01:00
parent 5105e6037f
commit 4b998cb5f5
1 changed files with 10 additions and 3 deletions

View File

@ -877,10 +877,17 @@ static int cortex_m_step(struct target *target, int current,
else { else {
/* Set a temporary break point */ /* Set a temporary break point */
if (breakpoint) if (breakpoint) {
retval = cortex_m_set_breakpoint(target, breakpoint); retval = cortex_m_set_breakpoint(target, breakpoint);
else } else {
retval = breakpoint_add(target, pc_value, 2, BKPT_HARD); enum breakpoint_type type = BKPT_HARD;
if (cortex_m->fp_rev == 0 && pc_value > 0x1FFFFFFF) {
/* FPB rev.1 cannot handle such addr, try BKPT instr */
type = BKPT_SOFT;
}
retval = breakpoint_add(target, pc_value, 2, type);
}
bool tmp_bp_set = (retval == ERROR_OK); bool tmp_bp_set = (retval == ERROR_OK);
/* No more breakpoints left, just do a step */ /* No more breakpoints left, just do a step */