[PATCH v1 1/5] cpukit/libdebugger: Avoid missed swbreak removal

Kinsey Moore kinsey.moore at oarcorp.com
Tue Feb 15 20:38:44 UTC 2022


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 when a software break is removed,
its original instruction is restored.
---
 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 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);
-- 
2.30.2



More information about the devel mailing list