X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Farm11.c;h=cbe4d4503f8473e1b00766897fb03486bf7cf407;hb=da7459415079002a52f516a6d00a31474d61b495;hp=5f1607396227dd40ce134238c1f36119847bed15;hpb=f19ac83152b54a204b8148815a538d868973e1e1;p=openocd.git diff --git a/src/target/arm11.c b/src/target/arm11.c index 5f16073962..cbe4d4503f 100644 --- a/src/target/arm11.c +++ b/src/target/arm11.c @@ -418,11 +418,33 @@ static uint32_t arm11_nextpc(struct arm11_common *arm11, int current, uint32_t a { void *value = arm11->arm.pc->value; - if (!current) - buf_set_u32(value, 0, 32, address); - else + /* use the current program counter */ + if (current) address = buf_get_u32(value, 0, 32); + /* Make sure that the gdb thumb fixup does not + * kill the return address + */ + switch (arm11->arm.core_state) { + case ARM_STATE_ARM: + address &= 0xFFFFFFFC; + break; + case ARM_STATE_THUMB: + /* When the return address is loaded into PC + * bit 0 must be 1 to stay in Thumb state + */ + address |= 0x1; + break; + + /* catch-all for JAZELLE and THUMB_EE */ + default: + break; + } + + buf_set_u32(value, 0, 32, address); + arm11->arm.pc->dirty = 1; + arm11->arm.pc->valid = 1; + return address; }