فهرست منبع

gdbstub: move guest debug support check to ops

This removes the final hard coding of kvm_enabled() in gdbstub and
moves the check to an AccelOps.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
Message-Id: <20220929114231.583801-46-alex.bennee@linaro.org>
Alex Bennée 2 سال پیش
والد
کامیت
a48e7d9e52
10فایلهای تغییر یافته به همراه33 افزوده شده و 10 حذف شده
  1. 1 0
      accel/kvm/kvm-accel-ops.c
  2. 6 0
      accel/kvm/kvm-all.c
  3. 1 0
      accel/kvm/kvm-cpus.h
  4. 6 0
      accel/tcg/tcg-accel-ops.c
  5. 2 3
      gdbstub/gdbstub.c
  6. 1 0
      gdbstub/internals.h
  7. 9 0
      gdbstub/softmmu.c
  8. 6 0
      gdbstub/user.c
  9. 1 0
      include/sysemu/accel-ops.h
  10. 0 7
      include/sysemu/kvm.h

+ 1 - 0
accel/kvm/kvm-accel-ops.c

@@ -99,6 +99,7 @@ static void kvm_accel_ops_class_init(ObjectClass *oc, void *data)
     ops->synchronize_pre_loadvm = kvm_cpu_synchronize_pre_loadvm;
     ops->synchronize_pre_loadvm = kvm_cpu_synchronize_pre_loadvm;
 
 
 #ifdef KVM_CAP_SET_GUEST_DEBUG
 #ifdef KVM_CAP_SET_GUEST_DEBUG
+    ops->supports_guest_debug = kvm_supports_guest_debug;
     ops->insert_breakpoint = kvm_insert_breakpoint;
     ops->insert_breakpoint = kvm_insert_breakpoint;
     ops->remove_breakpoint = kvm_remove_breakpoint;
     ops->remove_breakpoint = kvm_remove_breakpoint;
     ops->remove_all_breakpoints = kvm_remove_all_breakpoints;
     ops->remove_all_breakpoints = kvm_remove_all_breakpoints;

+ 6 - 0
accel/kvm/kvm-all.c

@@ -3287,6 +3287,12 @@ int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap)
     return data.err;
     return data.err;
 }
 }
 
 
+bool kvm_supports_guest_debug(void)
+{
+    /* probed during kvm_init() */
+    return kvm_has_guest_debug;
+}
+
 int kvm_insert_breakpoint(CPUState *cpu, int type, hwaddr addr, hwaddr len)
 int kvm_insert_breakpoint(CPUState *cpu, int type, hwaddr addr, hwaddr len)
 {
 {
     struct kvm_sw_breakpoint *bp;
     struct kvm_sw_breakpoint *bp;

+ 1 - 0
accel/kvm/kvm-cpus.h

@@ -18,6 +18,7 @@ void kvm_destroy_vcpu(CPUState *cpu);
 void kvm_cpu_synchronize_post_reset(CPUState *cpu);
 void kvm_cpu_synchronize_post_reset(CPUState *cpu);
 void kvm_cpu_synchronize_post_init(CPUState *cpu);
 void kvm_cpu_synchronize_post_init(CPUState *cpu);
 void kvm_cpu_synchronize_pre_loadvm(CPUState *cpu);
 void kvm_cpu_synchronize_pre_loadvm(CPUState *cpu);
+bool kvm_supports_guest_debug(void);
 int kvm_insert_breakpoint(CPUState *cpu, int type, hwaddr addr, hwaddr len);
 int kvm_insert_breakpoint(CPUState *cpu, int type, hwaddr addr, hwaddr len);
 int kvm_remove_breakpoint(CPUState *cpu, int type, hwaddr addr, hwaddr len);
 int kvm_remove_breakpoint(CPUState *cpu, int type, hwaddr addr, hwaddr len);
 void kvm_remove_all_breakpoints(CPUState *cpu);
 void kvm_remove_all_breakpoints(CPUState *cpu);

+ 6 - 0
accel/tcg/tcg-accel-ops.c

@@ -93,6 +93,11 @@ void tcg_handle_interrupt(CPUState *cpu, int mask)
     }
     }
 }
 }
 
 
+static bool tcg_supports_guest_debug(void)
+{
+    return true;
+}
+
 /* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
 /* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
 static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
 static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
 {
 {
@@ -198,6 +203,7 @@ static void tcg_accel_ops_init(AccelOpsClass *ops)
         }
         }
     }
     }
 
 
+    ops->supports_guest_debug = tcg_supports_guest_debug;
     ops->insert_breakpoint = tcg_insert_breakpoint;
     ops->insert_breakpoint = tcg_insert_breakpoint;
     ops->remove_breakpoint = tcg_remove_breakpoint;
     ops->remove_breakpoint = tcg_remove_breakpoint;
     ops->remove_all_breakpoints = tcg_remove_all_breakpoints;
     ops->remove_all_breakpoints = tcg_remove_all_breakpoints;

+ 2 - 3
gdbstub/gdbstub.c

@@ -45,7 +45,6 @@
 
 
 #include "qemu/sockets.h"
 #include "qemu/sockets.h"
 #include "sysemu/hw_accel.h"
 #include "sysemu/hw_accel.h"
-#include "sysemu/kvm.h"
 #include "sysemu/runstate.h"
 #include "sysemu/runstate.h"
 #include "semihosting/semihost.h"
 #include "semihosting/semihost.h"
 #include "exec/exec-all.h"
 #include "exec/exec-all.h"
@@ -3447,8 +3446,8 @@ int gdbserver_start(const char *device)
         return -1;
         return -1;
     }
     }
 
 
-    if (kvm_enabled() && !kvm_supports_guest_debug()) {
-        error_report("gdbstub: KVM doesn't support guest debugging");
+    if (!gdb_supports_guest_debug()) {
+        error_report("gdbstub: current accelerator doesn't support guest debugging");
         return -1;
         return -1;
     }
     }
 
 

+ 1 - 0
gdbstub/internals.h

@@ -9,6 +9,7 @@
 #ifndef _INTERNALS_H_
 #ifndef _INTERNALS_H_
 #define _INTERNALS_H_
 #define _INTERNALS_H_
 
 
+bool gdb_supports_guest_debug(void);
 int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len);
 int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len);
 int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len);
 int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len);
 void gdb_breakpoint_remove_all(CPUState *cs);
 void gdb_breakpoint_remove_all(CPUState *cs);

+ 9 - 0
gdbstub/softmmu.c

@@ -15,6 +15,15 @@
 #include "sysemu/cpus.h"
 #include "sysemu/cpus.h"
 #include "internals.h"
 #include "internals.h"
 
 
+bool gdb_supports_guest_debug(void)
+{
+    const AccelOpsClass *ops = cpus_get_accel();
+    if (ops->supports_guest_debug) {
+        return ops->supports_guest_debug();
+    }
+    return false;
+}
+
 int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len)
 int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len)
 {
 {
     const AccelOpsClass *ops = cpus_get_accel();
     const AccelOpsClass *ops = cpus_get_accel();

+ 6 - 0
gdbstub/user.c

@@ -14,6 +14,12 @@
 #include "hw/core/cpu.h"
 #include "hw/core/cpu.h"
 #include "internals.h"
 #include "internals.h"
 
 
+bool gdb_supports_guest_debug(void)
+{
+    /* user-mode == TCG == supported */
+    return true;
+}
+
 int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len)
 int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len)
 {
 {
     CPUState *cpu;
     CPUState *cpu;

+ 1 - 0
include/sysemu/accel-ops.h

@@ -47,6 +47,7 @@ struct AccelOpsClass {
     int64_t (*get_elapsed_ticks)(void);
     int64_t (*get_elapsed_ticks)(void);
 
 
     /* gdbstub hooks */
     /* gdbstub hooks */
+    bool (*supports_guest_debug)(void);
     int (*insert_breakpoint)(CPUState *cpu, int type, hwaddr addr, hwaddr len);
     int (*insert_breakpoint)(CPUState *cpu, int type, hwaddr addr, hwaddr len);
     int (*remove_breakpoint)(CPUState *cpu, int type, hwaddr addr, hwaddr len);
     int (*remove_breakpoint)(CPUState *cpu, int type, hwaddr addr, hwaddr len);
     void (*remove_all_breakpoints)(CPUState *cpu);
     void (*remove_all_breakpoints)(CPUState *cpu);

+ 0 - 7
include/sysemu/kvm.h

@@ -46,7 +46,6 @@ extern bool kvm_readonly_mem_allowed;
 extern bool kvm_direct_msi_allowed;
 extern bool kvm_direct_msi_allowed;
 extern bool kvm_ioeventfd_any_length_allowed;
 extern bool kvm_ioeventfd_any_length_allowed;
 extern bool kvm_msi_use_devid;
 extern bool kvm_msi_use_devid;
-extern bool kvm_has_guest_debug;
 
 
 #define kvm_enabled()           (kvm_allowed)
 #define kvm_enabled()           (kvm_allowed)
 /**
 /**
@@ -168,11 +167,6 @@ extern bool kvm_has_guest_debug;
  */
  */
 #define kvm_msi_devid_required() (kvm_msi_use_devid)
 #define kvm_msi_devid_required() (kvm_msi_use_devid)
 
 
-/*
- * Does KVM support guest debugging
- */
-#define kvm_supports_guest_debug() (kvm_has_guest_debug)
-
 #else
 #else
 
 
 #define kvm_enabled()           (0)
 #define kvm_enabled()           (0)
@@ -190,7 +184,6 @@ extern bool kvm_has_guest_debug;
 #define kvm_direct_msi_enabled() (false)
 #define kvm_direct_msi_enabled() (false)
 #define kvm_ioeventfd_any_length_enabled() (false)
 #define kvm_ioeventfd_any_length_enabled() (false)
 #define kvm_msi_devid_required() (false)
 #define kvm_msi_devid_required() (false)
-#define kvm_supports_guest_debug() (false)
 
 
 #endif  /* CONFIG_KVM_IS_POSSIBLE */
 #endif  /* CONFIG_KVM_IS_POSSIBLE */