Hi Mohamed,

On 24/2/26 00:39, Mohamed Mediouni wrote:
Fix what got broken several years ago by adding ops->supports_guest_debug
support as an architecture-specific function.

arm64 WHP doesn't currently provide support needed for this.

Signed-off-by: Mohamed Mediouni <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
---
  accel/whpx/whpx-accel-ops.c | 8 ++++++++
  include/system/whpx-all.h   | 4 ++++
  target/arm/whpx/whpx-all.c  | 5 +++++
  target/i386/whpx/whpx-all.c | 5 +++++
  4 files changed, 22 insertions(+)

diff --git a/accel/whpx/whpx-accel-ops.c b/accel/whpx/whpx-accel-ops.c
index 50fadea0fd..b8f41544cb 100644
--- a/accel/whpx/whpx-accel-ops.c
+++ b/accel/whpx/whpx-accel-ops.c
@@ -17,6 +17,7 @@
#include "system/whpx.h"
  #include "system/whpx-internal.h"
+#include "system/whpx-all.h"
  #include "system/whpx-accel-ops.h"
static void *whpx_cpu_thread_fn(void *arg)
@@ -81,6 +82,12 @@ static bool whpx_vcpu_thread_is_idle(CPUState *cpu)
      return !whpx_irqchip_in_kernel();
  }
+static bool whpx_supports_guest_debug(void)
+{
+    return whpx_arch_supports_guest_debug();
+}
+
+
  static void whpx_accel_ops_class_init(ObjectClass *oc, const void *data)
  {
      AccelOpsClass *ops = ACCEL_OPS_CLASS(oc);
@@ -89,6 +96,7 @@ static void whpx_accel_ops_class_init(ObjectClass *oc, const 
void *data)
      ops->kick_vcpu_thread = whpx_kick_vcpu_thread;
      ops->cpu_thread_is_idle = whpx_vcpu_thread_is_idle;
      ops->handle_interrupt = generic_handle_interrupt;
+    ops->supports_guest_debug = whpx_supports_guest_debug;
ops->synchronize_post_reset = whpx_cpu_synchronize_post_reset;
      ops->synchronize_post_init = whpx_cpu_synchronize_post_init;
diff --git a/include/system/whpx-all.h b/include/system/whpx-all.h
index f13cdf7f66..3db074c38c 100644
--- a/include/system/whpx-all.h
+++ b/include/system/whpx-all.h
@@ -17,4 +17,8 @@ void whpx_translate_cpu_breakpoints(
      struct whpx_breakpoints *breakpoints,
      CPUState *cpu,
      int cpu_breakpoint_count);
+
+/* called by whpx-accel-ops */
+bool whpx_arch_supports_guest_debug(void);
+
  #endif
diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
index 36c5e30a03..8d0ca794af 100644
--- a/target/arm/whpx/whpx-all.c
+++ b/target/arm/whpx/whpx-all.c
@@ -304,6 +304,11 @@ void whpx_translate_cpu_breakpoints(
      /* Breakpoints aren’t supported on this platform */
  }
+bool whpx_arch_supports_guest_debug(void)
+{
+    return false;
+}
+
  static void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, 
WHV_REGISTER_VALUE* val)
  {
      struct whpx_state *whpx = &whpx_global;
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index 8210250dc3..e1f0fa5e77 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -1272,6 +1272,11 @@ void whpx_apply_breakpoints(
      }
  }
+bool whpx_arch_supports_guest_debug(void)
+{
+    return true;
+}
+
  /* Returns the address of the next instruction that is about to be executed. 
*/
  static vaddr whpx_vcpu_get_pc(CPUState *cpu, bool exit_context_valid)
  {

It seems we also need this to get gdbstub fully working:

-- >8 --diff --git a/include/system/whpx-all.h b/include/system/whpx-all.h
index 4022571ffff..0e2d333e919 100644
--- a/include/system/whpx-all.h
+++ b/include/system/whpx-all.h
@@ -25,2 +25,3 @@ void whpx_arch_accel_class_init(ObjectClass *oc);
 /* called by whpx-accel-ops */
+int whpx_arch_gdbstub_sstep_flags(AccelState *as);
 bool whpx_arch_supports_guest_debug(void);
diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
index 247e12db812..e3f93efc61f 100644
--- a/accel/whpx/whpx-common.c
+++ b/accel/whpx/whpx-common.c
@@ -529,2 +529,3 @@ static void whpx_accel_class_init(ObjectClass *oc, const void *data)
     ac->allowed = &whpx_allowed;
+    ac->gdbstub_supported_sstep_flags = whpx_arch_gdbstub_sstep_flags;

diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
index 3079c6293c8..5208d7e1dfe 100644
--- a/target/arm/whpx/whpx-all.c
+++ b/target/arm/whpx/whpx-all.c
@@ -297,2 +297,7 @@ void whpx_translate_cpu_breakpoints(

+int whpx_arch_gdbstub_sstep_flags(AccelState *as)
+{
+    return 0;
+}
+
 bool whpx_arch_supports_guest_debug(void)
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index e626acef2f0..f6e1636a4e0 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -1855,2 +1855,7 @@ void whpx_apply_breakpoints(

+int whpx_arch_gdbstub_sstep_flags(AccelState *as)
+{
+    return SSTEP_ENABLE;
+}
+
 bool whpx_arch_supports_guest_debug(void)
---

I'll post a patch in case you want to test.

Regards,

Phil.

Reply via email to