[PATCH v2 1/6] cpukit/libdebugger: Avoid missed swbreak removal

Kinsey Moore kinsey.moore at oarcorp.com
Fri Feb 18 16:57:28 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 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 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