This is an automated email from Gerrit. Salvador Arroyo ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/4129
-- gerrit commit 1934e3eb194704b6961f1143c2e301ebdaeb02d5 Author: Salvador Arroyo <[email protected]> Date: Tue May 9 15:24:22 2017 +0200 mips32: bug in mips_m4k_unset_breakpoint() In software breakpoints if the isa bit is set, fails to restore original instruction. Use address with the isa bit cleared Change-Id: Ic4e44fec9eae1db45e1d78849b407db6b9eb8cd6 Signed-off-by: Salvador Arroyo <[email protected]> diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c index 7d1c06c..01d6caf 100644 --- a/src/target/mips_m4k.c +++ b/src/target/mips_m4k.c @@ -768,6 +768,7 @@ static int mips_m4k_unset_breakpoint(struct target *target, /* restore original instruction (kept in target endianness) */ uint32_t isa_req = breakpoint->length & 1; uint32_t bplength = breakpoint->length & ~1; + uint32_t bpaddr = breakpoint->address & ~1; uint8_t current_instr[4]; LOG_DEBUG("bpid: %" PRIu32, breakpoint->unique_id); if (bplength == 4) { @@ -775,9 +776,9 @@ static int mips_m4k_unset_breakpoint(struct target *target, if (ejtag_info->endianness && isa_req) sdbbp32_instr = SWAP16(sdbbp32_instr); - if ((breakpoint->address & 3) == 0) { /* 32bit aligned */ + if ((bpaddr & 3) == 0) { /* 32bit aligned */ /* check that user program has not modified breakpoint instruction */ - retval = target_read_memory(target, breakpoint->address, 4, 1, current_instr); + retval = target_read_memory(target, bpaddr, 4, 1, current_instr); if (retval != ERROR_OK) return retval; /** @@ -786,32 +787,29 @@ static int mips_m4k_unset_breakpoint(struct target *target, * we must first transform it to _host_ endianess using target_buffer_get_u16(). */ if (sdbbp32_instr == target_buffer_get_u32(target, current_instr)) { - retval = target_write_memory(target, breakpoint->address, 4, 1, - breakpoint->orig_instr); + retval = target_write_memory(target, bpaddr, 4, 1, breakpoint->orig_instr); if (retval != ERROR_OK) return retval; } } else { /* 16bit alligned */ - retval = target_read_memory(target, breakpoint->address, 2, 2, current_instr); + retval = target_read_memory(target, bpaddr, 2, 2, current_instr); if (retval != ERROR_OK) return retval; if (sdbbp32_instr == target_buffer_get_u32(target, current_instr)) { - retval = target_write_memory(target, breakpoint->address, 2, 2, - breakpoint->orig_instr); + retval = target_write_memory(target, bpaddr, 2, 2, breakpoint->orig_instr); if (retval != ERROR_OK) return retval; } } } else { /* check that user program has not modified breakpoint instruction */ - retval = target_read_memory(target, breakpoint->address, 2, 1, current_instr); + retval = target_read_memory(target, bpaddr, 2, 1, current_instr); if (retval != ERROR_OK) return retval; if (target_buffer_get_u16(target, current_instr) == MIPS16_SDBBP(isa_req)) { - retval = target_write_memory(target, breakpoint->address, 2, 1, - breakpoint->orig_instr); + retval = target_write_memory(target, bpaddr, 2, 1, breakpoint->orig_instr); if (retval != ERROR_OK) return retval; } -- ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
