diff mbox series

tcg/cpu-exec: precise single-stepping after an interrupt

Message ID 20200717163029.2737546-1-richard.henderson@linaro.org
State Superseded
Headers show
Series tcg/cpu-exec: precise single-stepping after an interrupt | expand

Commit Message

Richard Henderson July 17, 2020, 4:30 p.m. UTC
When single-stepping with a debugger attached to QEMU, and when an
interrupt is raised, the debugger misses the first instruction after
the interrupt.

Buglink: https://bugs.launchpad.net/qemu/+bug/757702
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 accel/tcg/cpu-exec.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

-- 
2.25.1

Comments

Luc Michel July 17, 2020, 6:03 p.m. UTC | #1
On 7/17/20 6:30 PM, Richard Henderson wrote:
> When single-stepping with a debugger attached to QEMU, and when an

> interrupt is raised, the debugger misses the first instruction after

> the interrupt.

> 

> Buglink: https://bugs.launchpad.net/qemu/+bug/757702

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>


Reviewed-by: Luc Michel <luc.michel@greensocs.com>

Tested-by: Luc Michel <luc.michel@greensocs.com>


> ---

>   accel/tcg/cpu-exec.c | 8 +++++++-

>   1 file changed, 7 insertions(+), 1 deletion(-)

> 

> diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c

> index 6a3d3a3cfc..66d38f9d85 100644

> --- a/accel/tcg/cpu-exec.c

> +++ b/accel/tcg/cpu-exec.c

> @@ -588,7 +588,13 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,

>           else {

>               if (cc->cpu_exec_interrupt(cpu, interrupt_request)) {

>                   replay_interrupt();

> -                cpu->exception_index = -1;

> +                /*

> +                 * After processing the interrupt, ensure an EXCP_DEBUG is

> +                 * raised when single-stepping so that GDB doesn't miss the

> +                 * next instruction.

> +                 */

> +                cpu->exception_index =

> +                    (cpu->singlestep_enabled ? EXCP_DEBUG : -1);

>                   *last_tb = NULL;

>               }

>               /* The target hook may have updated the 'cpu->interrupt_request';

>
diff mbox series

Patch

diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 6a3d3a3cfc..66d38f9d85 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -588,7 +588,13 @@  static inline bool cpu_handle_interrupt(CPUState *cpu,
         else {
             if (cc->cpu_exec_interrupt(cpu, interrupt_request)) {
                 replay_interrupt();
-                cpu->exception_index = -1;
+                /*
+                 * After processing the interrupt, ensure an EXCP_DEBUG is
+                 * raised when single-stepping so that GDB doesn't miss the
+                 * next instruction.
+                 */
+                cpu->exception_index =
+                    (cpu->singlestep_enabled ? EXCP_DEBUG : -1);
                 *last_tb = NULL;
             }
             /* The target hook may have updated the 'cpu->interrupt_request';