From dabc470d0bc3c35b6ed706f383d1f8f9a9d324a2 Mon Sep 17 00:00:00 2001 From: Chris Reed Date: Mon, 12 Oct 2020 08:55:47 -0500 Subject: [PATCH] Merge pull request #979 from flit/bugfix/gdbserver_range_step Fix interrupting gdbserver range step --- pyocd/coresight/cortex_m.py | 8 +++++--- pyocd/gdbserver/gdbserver.py | 3 +-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pyocd/coresight/cortex_m.py b/pyocd/coresight/cortex_m.py index d5c69e89a..4c03aa823 100644 --- a/pyocd/coresight/cortex_m.py +++ b/pyocd/coresight/cortex_m.py @@ -539,6 +539,7 @@ def step(self, disable_interrupts=True, start=0, end=0, hook_cb=None): # Get the step timeout. A timeout of 0 means no timeout, so we have to pass None to the Timeout class. step_timeout = self.session.options.get('cpu.step.instruction.timeout') or None + exit_step_loop = False while True: # Single step using current C_MASKINTS setting self.write32(CortexM.DHCSR, dhcsr_step) @@ -550,14 +551,15 @@ def step(self, disable_interrupts=True, start=0, end=0, hook_cb=None): # for Privileged code in the case of UDE. with timeout.Timeout(step_timeout) as tmo: while tmo.check(): - if (self.read32(CortexM.DHCSR) & CortexM.C_HALT) != 0: - break # Invoke the callback if provided. If it returns True, then exit the loop. if (hook_cb is not None) and hook_cb(): + exit_step_loop = True + break + if (self.read32(CortexM.DHCSR) & CortexM.C_HALT) != 0: break # Range is empty, 'range step' will degenerate to 'step' - if start == end: + if (start == end) or exit_step_loop: break # Read program counter and compare to [start, end) diff --git a/pyocd/gdbserver/gdbserver.py b/pyocd/gdbserver/gdbserver.py index fdde2a885..197376be9 100644 --- a/pyocd/gdbserver/gdbserver.py +++ b/pyocd/gdbserver/gdbserver.py @@ -418,7 +418,7 @@ def handle_message(self, msg): reply = handler(msg[msgStart:]) self.lock.release() - detach = 1 if msg[1:2] in self.DETACH_COMMANDS else 0 + detach = msg[1:2] in self.DETACH_COMMANDS return reply, detach except Exception as e: @@ -441,7 +441,6 @@ def kill(self): if not self.persist: self.board.target.set_vector_catch(Target.VectorCatch.NONE) self.board.target.resume() - return self.create_rsp_packet(b"") def restart(self, data): self.target.reset_and_halt()