summaryrefslogtreecommitdiffstats
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
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.
-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);