[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