summaryrefslogtreecommitdiffstats
path: root/cpukit/libdebugger
diff options
context:
space:
mode:
authorKinsey Moore <kinsey.moore@oarcorp.com>2022-02-08 12:58:56 -0600
committerJoel Sherrill <joel@rtems.org>2022-02-23 08:35:45 -0600
commit924993a4bcf99809c955991b63e17c2311fb469d (patch)
tree7b6af6266794cd0eb1856eb7c4d16bbff4e8b0a1 /cpukit/libdebugger
parentconfig: Document CONFIGURE_SCHEDULER_TABLE_ENTRIES (diff)
downloadrtems-924993a4bcf99809c955991b63e17c2311fb469d.tar.bz2
cpukit/libdebugger: Avoid missed swbreak removal
It is possible to remove software breaks without actually restoring the original instruction to memory. When this happens, the original instruction is lost. This ensures that the original instruction is restored when a software break is removed.
Diffstat (limited to 'cpukit/libdebugger')
-rw-r--r--cpukit/libdebugger/rtems-debugger-target.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/cpukit/libdebugger/rtems-debugger-target.c b/cpukit/libdebugger/rtems-debugger-target.c
index 04b274909b..c298a62357 100644
--- a/cpukit/libdebugger/rtems-debugger-target.c
+++ b/cpukit/libdebugger/rtems-debugger-target.c
@@ -191,6 +191,22 @@ rtems_debugger_target_swbreak_control(bool insert, uintptr_t addr, DB_UINT kind)
if (loc == swbreaks[i].address) {
size_t remaining;
if (!insert) {
+ if (target->breakpoint_size > 4)
+ memcpy(loc, swbreaks[i].contents, target->breakpoint_size);
+ else {
+ switch (target->breakpoint_size) {
+ case 4:
+ loc[3] = swbreaks[i].contents[3];
+ case 3:
+ loc[2] = swbreaks[i].contents[2];
+ case 2:
+ loc[1] = swbreaks[i].contents[1];
+ case 1:
+ loc[0] = swbreaks[i].contents[0];
+ break;
+ }
+ }
+ rtems_debugger_target_cache_sync(&swbreaks[i]);
--target->swbreaks.level;
remaining = (target->swbreaks.level - i) * swbreak_size;
memmove(&swbreaks[i], &swbreaks[i + 1], remaining);