diff options
author | Kinsey Moore <kinsey.moore@oarcorp.com> | 2022-02-08 12:58:56 -0600 |
---|---|---|
committer | Joel Sherrill <joel@rtems.org> | 2022-02-23 08:35:45 -0600 |
commit | 924993a4bcf99809c955991b63e17c2311fb469d (patch) | |
tree | 7b6af6266794cd0eb1856eb7c4d16bbff4e8b0a1 /cpukit/libdebugger | |
parent | config: Document CONFIGURE_SCHEDULER_TABLE_ENTRIES (diff) | |
download | rtems-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.
Diffstat (limited to 'cpukit/libdebugger')
-rw-r--r-- | cpukit/libdebugger/rtems-debugger-target.c | 16 |
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); |