Allow targets to register their legacy target_get_monitor_def()
in CPUClass; check it first in get_monitor_def() otherwise fall
back to previous per-target helper.

Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
 include/hw/core/cpu.h | 5 +++++
 monitor/hmp.c         | 6 +++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 072f58bead5..8f9d62bfafb 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -150,6 +150,9 @@ struct SysemuCPUOps;
  *          CPUState::cpu_ases.
  * @legacy_monitor_defs: Array of MonitorDef entries. This field is legacy,
  *                       use @gdb_core_xml_file to dump registers instead.
+ * @legacy_monitor_get_register: Callback to fill @pval with register @name.
+ *                               This field is legacy, use @gdb_core_xml_file
+ *                               to dump registers instead.
  *
  * Represents a CPU family or model.
  */
@@ -177,6 +180,8 @@ struct CPUClass {
     const char * (*gdb_arch_name)(CPUState *cpu);
     const char * (*gdb_get_core_xml_file)(CPUState *cpu);
     const MonitorDef *legacy_monitor_defs;
+    int (*legacy_monitor_get_register)(CPUState *cs, const char *name,
+                                       uint64_t *pval);
 
     void (*disas_set_info)(const CPUState *cpu, disassemble_info *info);
 
diff --git a/monitor/hmp.c b/monitor/hmp.c
index 6dfc59725c2..ad253347892 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -1628,7 +1628,11 @@ int get_monitor_def(Monitor *mon, int64_t *pval, const 
char *name)
         }
     }
 
-    ret = target_get_monitor_def(cs, name, &tmp);
+    if (cs->cc->legacy_monitor_get_register) {
+        ret = cs->cc->legacy_monitor_get_register(cs, name, &tmp);
+    } else {
+        ret = target_get_monitor_def(cs, name, &tmp);
+    }
     if (!ret) {
         *pval = target_long_bits() == 32 ? (int32_t)tmp : tmp;
     }
-- 
2.53.0


Reply via email to