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*)&current_instr)) != ERROR_OK)
                        {
                                return retval;
                        }
                        current_instr = target_buffer_get_u32(target,
(uint8_t*)&current_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

Reply via email to