summary refs log tree commit diff stats
path: root/gitlab/issues_text/target_missing/host_missing/accel_TCG/1184
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/issues_text/target_missing/host_missing/accel_TCG/1184')
-rw-r--r--gitlab/issues_text/target_missing/host_missing/accel_TCG/118469
1 files changed, 69 insertions, 0 deletions
diff --git a/gitlab/issues_text/target_missing/host_missing/accel_TCG/1184 b/gitlab/issues_text/target_missing/host_missing/accel_TCG/1184
new file mode 100644
index 000000000..794813dcb
--- /dev/null
+++ b/gitlab/issues_text/target_missing/host_missing/accel_TCG/1184
@@ -0,0 +1,69 @@
+Extra SIGTRAP when breakpoint + watchpoint occur on same instruction
+Description of problem:
+If a breakpoint and watchpoint occur on the same instruction in TCG, gdb receives a breakpoint notification, a watchpoint notification, and then a SIGTRAP not corresponding to any set breakpoint/watchpoint.
+Steps to reproduce:
+Start QEMU via:
+
+```
+./qemu-system-i386 -display none -accel tcg -kernel kernel.elf -s -S
+```
+
+Here's the gdb session:
+
+```
+(gdb) file kernel.elf
+Reading symbols from kernel.elf...done.
+(gdb) tar rem :1234
+Remote debugging using :1234
+0x0000fff0 in ?? ()
+(gdb) b _start
+Breakpoint 1 at 0x10000c: file kernel.s, line 17.
+(gdb) c
+Continuing.
+
+Breakpoint 1, _start () at kernel.s:17
+17          mov eax, 3
+(gdb) b bp
+Breakpoint 2 at 0x100011: file kernel.s, line 20.
+(gdb) watch *(int*)&value
+Hardware watchpoint 3: *(int*)&value
+(gdb) c
+Continuing.
+
+Breakpoint 2, bp () at kernel.s:20
+20          mov dword ptr value, eax
+(gdb) c
+Continuing.
+
+Hardware watchpoint 3: *(int*)&value
+
+Old value = 0
+New value = 3
+done () at kernel.s:23
+23          jmp done
+(gdb) c
+Continuing.
+
+Program received signal SIGTRAP, Trace/breakpoint trap.
+done () at kernel.s:23
+23          jmp done
+```
+Additional information:
+This patch fixes it by disabling the extra debug interrupt if the CPU is already singlestepping, but I'm not certain it's the 'correct' fix?
+
+```patch
+--- a/softmmu/physmem.c
++++ b/softmmu/physmem.c
+@@ -894,7 +894,9 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
+          * trigger after the current instruction.
+          */
+         qemu_mutex_lock_iothread();
+-        cpu_interrupt(cpu, CPU_INTERRUPT_DEBUG);
++        if ((cpu->singlestep_enabled & SSTEP_NOIRQ) == 0) {
++            cpu_interrupt(cpu, CPU_INTERRUPT_DEBUG);
++        }
+         qemu_mutex_unlock_iothread();
+         return;
+     }
+
+```