Do not overwrite code when removing software breakpoint if it no longer contains...
authorvpalatin <vpalatin@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 4 Dec 2007 12:56:46 +0000 (12:56 +0000)
committervpalatin <vpalatin@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 4 Dec 2007 12:56:46 +0000 (12:56 +0000)
(thanks to oyvind harboe for bug report and test)

git-svn-id: svn://svn.berlios.de/openocd/trunk@214 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/arm7_9_common.c

index e596d057199cc99ac94dade8c8ee7b55940edd23..b5434d68e7b7c014ae552dc004f3b94ed496dffd 100644 (file)
@@ -243,11 +243,19 @@ int arm7_9_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
                /* restore original instruction (kept in target endianness) */
                if (breakpoint->length == 4)
                {
-                       target->type->write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr);
+                       u32 current_instr;
+                       /* check that user program as not modified breakpoint instruction */
+                       target->type->read_memory(target, breakpoint->address, 4, 1, (u8*)&current_instr);
+                       if (current_instr==arm7_9->arm_bkpt)
+                               target->type->write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr);
                }
                else
                {
-                       target->type->write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr);
+                       u16 current_instr;
+                       /* check that user program as not modified breakpoint instruction */
+                       target->type->read_memory(target, breakpoint->address, 2, 1, (u8*)&current_instr);
+                       if (current_instr==arm7_9->thumb_bkpt)
+                               target->type->write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr);
                }
                breakpoint->set = 0;
        }