I found that after running 'continue' in gdb with software
breakpoints, when it hit a breakpoint, it didn't write back the
original instruction. .
Here comes the debug log, pay attention to the current_instr, it has
the wrong endianess,
<log>
Debug: 545 7014 gdb_server.c:2191 gdb_input_inner(): received packet:
'z0,2000026c,4'
Debug: 546 7014 gdb_server.c:1495 gdb_breakpoint_watchpoint_packet(): -
Debug: 547 7014 arm7_9_common.c:341 arm7_9_unset_breakpoint(): BPID:
0, Address: 0x2000026c
Debug: 548 7014 arm7_9_common.c:349 arm7_9_unset_breakpoint():
breakpoint->type = 1
Debug: 549 7014 arm7_9_common.c:372 arm7_9_unset_breakpoint(): unset
soft breakpoint
Debug: 550 7014 arm7_9_common.c:377 arm7_9_unset_breakpoint():
breakpoint->length == 4
Debug: 551 7014 arm7_9_common.c:2251 arm7_9_read_memory(): address:
0x2000026c, size: 0x00000004, count: 0x00000001
Debug: 552 7026 arm7_9_common.c:385 arm7_9_unset_breakpoint():
current_instr = 0x700020e1, arm7_9->arm_bkpt = 0xe1200070
Debug: 553 7026 breakpoints.c:127 breakpoint_free(): free BPID: 0 --> 0
Debug: 554 7026 gdb_server.c:2191 gdb_input_inner(): received packet:
'z0,20000f38,4'
Debug: 555 7026 gdb_server.c:1495 gdb_breakpoint_watchpoint_packet(): -
Debug: 556 7026 arm7_9_common.c:341 arm7_9_unset_breakpoint(): BPID:
1, Address: 0x20000f38
Debug: 557 7026 arm7_9_common.c:349 arm7_9_unset_breakpoint():
breakpoint->type = 1
Debug: 558 7026 arm7_9_common.c:372 arm7_9_unset_breakpoint(): unset
soft breakpoint
Debug: 559 7026 arm7_9_common.c:377 arm7_9_unset_breakpoint():
breakpoint->length == 4
Debug: 560 7026 arm7_9_common.c:2251 arm7_9_read_memory(): address:
0x20000f38, size: 0x00000004, count: 0x00000001
Debug: 561 7038 arm7_9_common.c:385 arm7_9_unset_breakpoint():
current_instr = 0x700020e1, arm7_9->arm_bkpt = 0xe1200070
Debug: 562 7038 embeddedice.c:491 embeddedice_write_reg(): 12: 0x00000000
Debug: 563 7038 arm7_9_common.c:75 arm7_9_clear_watchpoints(): -
Debug: 564 7038 embeddedice.c:491 embeddedice_write_reg(): 12: 0x00000000
Debug: 565 7038 embeddedice.c:491 embeddedice_write_reg(): 20: 0x00000000
Debug: 566 7044 breakpoints.c:127 breakpoint_free(): free BPID: 1 --> 0
Debug: 567 7044 gdb_server.c:2191 gdb_input_inner(): received packet:
'm2000026c,4'
Debug: 568 7044 gdb_server.c:1280 gdb_read_memory_packet(): addr:
0x2000026c, len: 0x00000004
Debug: 569 7044 target.c:1394 target_read_buffer(): reading buffer of
4 byte at 0x2000026c
Debug: 570 7044 arm7_9_common.c:2251 arm7_9_read_memory(): address:
0x2000026c, size: 0x00000004, count: 0x00000001
</log>
To fix this bug, make sure you got the the read data from
target_buffer_get_u32() after each target_read_memory();
see
<code>
if ((retval = target_read_memory(target,
breakpoint->address, 4, 1,
(uint8_t*)¤t_instr)) != ERROR_OK)
{
return retval;
}
current_instr = target_buffer_get_u32(target,
(uint8_t*)¤t_instr); ////////////////// FIX
//////////////////////
LOG_DEBUG("current_instr = 0x%08x,
arm7_9->arm_bkpt = 0x%08x", current_instr, arm7_9->arm_bkpt);
if (current_instr == arm7_9->arm_bkpt)
if ((retval = target_write_memory(target,
breakpoint->address, 4,
1, breakpoint->orig_instr)) != ERROR_OK)
{
return retval;
}
</code>
BTW: Why not handle endianess in target_read_memory()?
Any questions, please let me know.
Thanks
--
FIXME if it is wrong.
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development