[rtems commit] cpukit/libdebugger: Avoid missed swbreak removal

Joel Sherrill joel at rtems.org
Wed Feb 23 14:26:40 UTC 2022


Module:    rtems
Branch:    master
Commit:    924993a4bcf99809c955991b63e17c2311fb469d
Changeset: http://git.rtems.org/rtems/commit/?id=924993a4bcf99809c955991b63e17c2311fb469d

Author:    Kinsey Moore <kinsey.moore at oarcorp.com>
Date:      Tue Feb  8 12:58:56 2022 -0600

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.

---

 cpukit/libdebugger/rtems-debugger-target.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/cpukit/libdebugger/rtems-debugger-target.c b/cpukit/libdebugger/rtems-debugger-target.c
index 04b2749..c298a62 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);



More information about the vc mailing list