On 10/7/26 22:53, Richard Henderson wrote:
Merge and name bp_wp_hit.  Now that all targets have been
converted to use debug_excp_handler hit argument, we only
need one pointer to an outstanding debug event.

Signed-off-by: Richard Henderson <[email protected]>
---
  include/hw/core/cpu.h  |  3 +--
  accel/tcg/cpu-exec.c   |  7 +++---
  accel/tcg/watchpoint.c |  4 ++--
  gdbstub/system.c       | 50 ++++++++++++++++++++++--------------------
  target/arm/hvf/hvf.c   |  5 ++---
  target/arm/kvm.c       |  2 +-
  target/i386/kvm/kvm.c  |  4 ++--
  target/ppc/kvm.c       |  2 +-
  target/s390x/kvm/kvm.c |  2 +-
  9 files changed, 39 insertions(+), 40 deletions(-)

diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 1a42940d92..5401d7c14b 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -526,8 +526,7 @@ struct CPUState {
      /* ice debug support */
      IntervalTreeRoot breakpoints;
      IntervalTreeRoot watchpoints;
-    CPUBreakpoint *breakpoint_hit;
-    CPUBreakpoint *watchpoint_hit;
+    CPUBreakpoint *bp_wp_hit;

During the last QEMU community call Alex said these fields are for
TCG, and this series confirms it (also this patch $subject).
I planned to move that to the TCG accelerator state at some point,
but then I'm confused by the uses in the hw accelerators...

diff --git a/gdbstub/system.c b/gdbstub/system.c
index c78fb330c4..3f31b75173 100644
--- a/gdbstub/system.c
+++ b/gdbstub/system.c
@@ -150,34 +150,36 @@ static void gdb_vm_state_change(void *opaque, bool 
running, RunState state)
switch (state) {
      case RUN_STATE_DEBUG:
-        if (cpu->watchpoint_hit) {
-            const char *type;
+        {
+            CPUBreakpoint *hit = cpu->bp_wp_hit;
- switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
-            case BP_MEM_READ:
-                type = "r";
-                break;
-            case BP_MEM_ACCESS:
-                type = "a";
-                break;
-            default:
-                type = "";
-                break;
+            if (hit) {
+                unsigned watch = hit->flags & BP_MEM_ACCESS;
+
+                hit->flags &= ~BP_WATCHPOINT_HIT;
+                cpu->bp_wp_hit = NULL;
+
+                if (watch) {
+                    static const char hit_type[4][2] = {
+                        [BP_MEM_READ] = "r",
+                        [BP_MEM_WRITE] = "",
+                        [BP_MEM_ACCESS] = "a",
+                    };
+                    const char *type = hit_type[watch];
+
+                    trace_gdbstub_hit_watchpoint(type, gdb_get_cpu_index(cpu),
+                                                 hit->hitaddr);
+                    g_string_printf(buf, "T%02xthread:%s;%swatch:%"
+                                    VADDR_PRIx ";",
+                                    GDB_SIGNAL_TRAP, tid->str, type,
+                                    hit->hitaddr);
+                    goto send_packet;
+                }
+                /* else breakpoint */
              }
-            trace_gdbstub_hit_watchpoint(type,
-                                         gdb_get_cpu_index(cpu),
-                                         cpu->watchpoint_hit->hitaddr);
-            g_string_printf(buf, "T%02xthread:%s;%swatch:%" VADDR_PRIx ";",
-                            GDB_SIGNAL_TRAP, tid->str, type,
-                            cpu->watchpoint_hit->hitaddr);
-
-            cpu->watchpoint_hit->flags &= ~BP_WATCHPOINT_HIT;
-            cpu->watchpoint_hit = NULL;
-            goto send_packet;
-        } else {
              trace_gdbstub_hit_break();
+            ret = GDB_SIGNAL_TRAP;
          }
-        ret = GDB_SIGNAL_TRAP;
          break;
      case RUN_STATE_PAUSED:
          trace_gdbstub_hit_paused();
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 32e5f43ee3..0fd72c5bde 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2370,13 +2370,12 @@ static int hvf_handle_exception(CPUState *cpu, 
hv_vcpu_exit_exception_t *excp)
cpu_synchronize_state(cpu); - CPUBreakpoint *wp =
-            find_hw_watchpoint(cpu, excp->virtual_address);
+        CPUBreakpoint *wp = find_hw_watchpoint(cpu, excp->virtual_address);
          if (!wp) {
              error_report("EXCP_DEBUG but unknown hw watchpoint");
          }
          wp->hitaddr = excp->virtual_address;
-        cpu->watchpoint_hit = wp;
+        cpu->bp_wp_hit = wp;
          break;
      }
      case EC_DATAABORT: {
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index c2f921095a..f66332299c 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -1520,7 +1520,7 @@ static bool kvm_arm_handle_debug(ARMCPU *cpu,
          CPUBreakpoint *wp = find_hw_watchpoint(cs, debug_exit->far);
          if (wp) {
              wp->hitaddr = debug_exit->far;
-            cs->watchpoint_hit = wp;
+            cs->bp_wp_hit = wp;
              return true;
          }
          break;
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 2e1ecb1c83..c4f0dc1e02 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -6263,13 +6263,13 @@ static int kvm_handle_debug(X86CPU *cpu,
                          break;
                      case 0x1:
                          ret = EXCP_DEBUG;
-                        cs->watchpoint_hit = &hw_watchpoint;
+                        cs->bp_wp_hit = &hw_watchpoint;
                          hw_watchpoint.hitaddr = hw_breakpoint[n].addr;
                          hw_watchpoint.flags = BP_MEM_WRITE;
                          break;
                      case 0x3:
                          ret = EXCP_DEBUG;
-                        cs->watchpoint_hit = &hw_watchpoint;
+                        cs->bp_wp_hit = &hw_watchpoint;
                          hw_watchpoint.hitaddr = hw_breakpoint[n].addr;
                          hw_watchpoint.flags = BP_MEM_ACCESS;
                          break;
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index f161ba6415..f11f8457d0 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -1592,7 +1592,7 @@ static int kvm_handle_hw_breakpoint(CPUState *cs,
              n = find_hw_watchpoint(arch_info->address, &flag);
              if (n >= 0) {
                  handle = DEBUG_RETURN_GDB;
-                cs->watchpoint_hit = &hw_watchpoint;
+                cs->bp_wp_hit = &hw_watchpoint;
                  hw_watchpoint.hitaddr = arch_info->address;
                  hw_watchpoint.flags = flag;
              }
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index b75dab5f3c..5c3cde97b8 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -1863,7 +1863,7 @@ static int kvm_arch_handle_debug_exit(S390CPU *cpu)
      switch (arch_info->type) {
      case KVM_HW_WP_WRITE:
          if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) {
-            cs->watchpoint_hit = &hw_watchpoint;
+            cs->bp_wp_hit = &hw_watchpoint;
              hw_watchpoint.hitaddr = arch_info->addr;
              hw_watchpoint.flags = BP_MEM_WRITE;
              ret = EXCP_DEBUG;


Reply via email to