Kernel KVM virtualization development
 help / color / mirror / Atom feed
* [PATCH v3 04/49] target/i386: decouple cpu_x86_inject_mce() from Monitor
       [not found] <20260816-qemu-no-hmp-v3-0-e53fc35bc550@redhat.com>
@ 2026-08-16 19:12 ` Marc-André Lureau
  2026-08-16 19:12 ` [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP Marc-André Lureau
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Marc-André Lureau @ 2026-08-16 19:12 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marc-André Lureau, Philippe Mathieu-Daudé,
	Daniel P. Berrangé, Markus Armbruster, Paolo Bonzini,
	Zhao Liu, Marcelo Tosatti, kvm, Philippe Mathieu-Daudé

Replace monitor_printf() error reporting with the standard **errp
pattern. Drop the Monitor *mon parameter and return bool to indicate
success, improving the function usage from non-HMP contexts. Update the
KVM MCE injection path and hmp_mce() accordingly.

Notes:
 - we may want to print the error in KVM path too

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 target/i386/cpu.h     |  4 ++--
 target/i386/helper.c  | 49 ++++++++++++++++++++++++++++---------------------
 target/i386/kvm/kvm.c |  4 ++--
 target/i386/monitor.c |  6 ++++--
 4 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index e6a197602d87..4f342b69f471 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -2847,9 +2847,9 @@ void do_cpu_init(X86CPU *cpu);
 #define MCE_INJECT_BROADCAST    1
 #define MCE_INJECT_UNCOND_AO    2
 
-void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
+bool cpu_x86_inject_mce(X86CPU *cpu, int bank,
                         uint64_t status, uint64_t mcg_status, uint64_t addr,
-                        uint64_t misc, int flags);
+                        uint64_t misc, int flags, Error **errp);
 
 uint32_t cpu_cc_compute_all(CPUX86State *env1);
 
diff --git a/target/i386/helper.c b/target/i386/helper.c
index 683621416213..4133b5f244c6 100644
--- a/target/i386/helper.c
+++ b/target/i386/helper.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qapi/qapi-events-run-state.h"
 #include "cpu.h"
 #include "exec/cputlb.h"
@@ -27,7 +28,6 @@
 #ifndef CONFIG_USER_ONLY
 #include "system/hw_accel.h"
 #include "system/memory.h"
-#include "monitor/monitor.h"
 #include "kvm/kvm_i386.h"
 #endif
 #include "qemu/log.h"
@@ -381,7 +381,7 @@ out:
 }
 
 typedef struct MCEInjectionParams {
-    Monitor *mon;
+    Error **errp;
     int bank;
     uint64_t status;
     uint64_t mcg_status;
@@ -428,9 +428,9 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
          * reporting is disabled
          */
         if ((cenv->mcg_cap & MCG_CTL_P) && cenv->mcg_ctl != ~(uint64_t)0) {
-            monitor_printf(params->mon,
-                           "CPU %d: Uncorrected error reporting disabled\n",
-                           cs->cpu_index);
+            error_setg(params->errp,
+                "CPU %d: Uncorrected error reporting disabled",
+                cs->cpu_index);
             return;
         }
 
@@ -439,10 +439,9 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
          * reporting is disabled for the bank
          */
         if (banks[0] != ~(uint64_t)0) {
-            monitor_printf(params->mon,
-                           "CPU %d: Uncorrected error reporting disabled for"
-                           " bank %d\n",
-                           cs->cpu_index, params->bank);
+            error_setg(params->errp,
+                "CPU %d: Uncorrected error reporting disabled for bank %d",
+                cs->cpu_index, params->bank);
             return;
         }
 
@@ -459,7 +458,7 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
         if (need_reset) {
             emit_guest_memory_failure(MEMORY_FAILURE_ACTION_RESET, ar,
                                       recursive);
-            monitor_printf(params->mon, "%s", msg);
+            error_setg(params->errp, "%s", msg);
             qemu_log_mask(CPU_LOG_RESET, "%s\n", msg);
             qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
             return;
@@ -488,14 +487,15 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
     emit_guest_memory_failure(MEMORY_FAILURE_ACTION_INJECT, ar, recursive);
 }
 
-void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
+bool cpu_x86_inject_mce(X86CPU *cpu, int bank,
                         uint64_t status, uint64_t mcg_status, uint64_t addr,
-                        uint64_t misc, int flags)
+                        uint64_t misc, int flags, Error **errp)
 {
+    ERRP_GUARD();
     CPUState *cs = CPU(cpu);
     CPUX86State *cenv = &cpu->env;
     MCEInjectionParams params = {
-        .mon = mon,
+        .errp = errp,
         .bank = bank,
         .status = status,
         .mcg_status = mcg_status,
@@ -506,24 +506,27 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
     unsigned bank_num = cenv->mcg_cap & 0xff;
 
     if (!cenv->mcg_cap) {
-        monitor_printf(mon, "MCE injection not supported\n");
-        return;
+        error_setg(errp, "MCE injection not supported");
+        return false;
     }
     if (bank >= bank_num) {
-        monitor_printf(mon, "Invalid MCE bank number\n");
-        return;
+        error_setg(errp, "Invalid MCE bank number");
+        return false;
     }
     if (!(status & MCI_STATUS_VAL)) {
-        monitor_printf(mon, "Invalid MCE status code\n");
-        return;
+        error_setg(errp, "Invalid MCE status code");
+        return false;
     }
     if ((flags & MCE_INJECT_BROADCAST)
         && !cpu_x86_support_mca_broadcast(cenv)) {
-        monitor_printf(mon, "Guest CPU does not support MCA broadcast\n");
-        return;
+        error_setg(errp, "Guest CPU does not support MCA broadcast");
+        return false;
     }
 
     run_on_cpu(cs, do_inject_x86_mce, RUN_ON_CPU_HOST_PTR(&params));
+    if (*errp) {
+        return false;
+    }
     if (flags & MCE_INJECT_BROADCAST) {
         CPUState *other_cs;
 
@@ -537,8 +540,12 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
                 continue;
             }
             run_on_cpu(other_cs, do_inject_x86_mce, RUN_ON_CPU_HOST_PTR(&params));
+            if (*errp) {
+                return false;
+            }
         }
     }
+    return true;
 }
 
 static inline target_ulong get_memio_eip(CPUX86State *env)
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 644c45fb0a02..1eeadb99adac 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -748,8 +748,8 @@ static void kvm_mce_inject(X86CPU *cpu, hwaddr paddr, int code)
         flags = 0;
     }
 
-    cpu_x86_inject_mce(NULL, cpu, 9, status, mcg_status, paddr,
-                       (MCM_ADDR_PHYS << 6) | 0xc, flags);
+    cpu_x86_inject_mce(cpu, 9, status, mcg_status, paddr,
+                       (MCM_ADDR_PHYS << 6) | 0xc, flags, NULL);
 }
 
 static void emit_hypervisor_memory_failure(MemoryFailureAction action, bool ar)
diff --git a/target/i386/monitor.c b/target/i386/monitor.c
index a536712c755a..785a13dd7107 100644
--- a/target/i386/monitor.c
+++ b/target/i386/monitor.c
@@ -580,6 +580,7 @@ void hmp_mce(Monitor *mon, const QDict *qdict)
     uint64_t addr = qdict_get_int(qdict, "addr");
     uint64_t misc = qdict_get_int(qdict, "misc");
     int flags = MCE_INJECT_UNCOND_AO;
+    Error *err = NULL;
 
     if (qdict_get_try_bool(qdict, "broadcast", false)) {
         flags |= MCE_INJECT_BROADCAST;
@@ -587,7 +588,8 @@ void hmp_mce(Monitor *mon, const QDict *qdict)
     cs = qemu_get_cpu(cpu_index);
     if (cs != NULL) {
         cpu = X86_CPU(cs);
-        cpu_x86_inject_mce(mon, cpu, bank, status, mcg_status, addr, misc,
-                           flags);
+        cpu_x86_inject_mce(cpu, bank, status, mcg_status, addr, misc,
+                           flags, &err);
+        hmp_handle_error(mon, err);
     }
 }

-- 
2.55.0.543.g5ebe2ebe4ea8


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP
       [not found] <20260816-qemu-no-hmp-v3-0-e53fc35bc550@redhat.com>
  2026-08-16 19:12 ` [PATCH v3 04/49] target/i386: decouple cpu_x86_inject_mce() from Monitor Marc-André Lureau
@ 2026-08-16 19:12 ` Marc-André Lureau
  2026-08-16 21:51   ` Dr. David Alan Gilbert
  2026-08-16 19:13 ` [PATCH v3 37/49] monitor: tighten monitor_printf*() Marc-André Lureau
  2026-08-16 19:13 ` [PATCH v3 41/49] Guard HMP command implementations with CONFIG_HMP Marc-André Lureau
  3 siblings, 1 reply; 8+ messages in thread
From: Marc-André Lureau @ 2026-08-16 19:12 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marc-André Lureau, Philippe Mathieu-Daudé,
	Daniel P. Berrangé, Markus Armbruster, Gerd Hoffmann,
	Gonglei (Arei), zhenwei pi, Kevin Wolf, Hanna Reitz,
	Paolo Bonzini, Ani Sinha, David Woodhouse, Paul Durrant,
	Michael S. Tsirkin, Richard Henderson, Marcelo Tosatti,
	Mark Cave-Ayland, Jiri Pirko, Jason Wang, Halil Pasic,
	Christian Borntraeger, Jason Herne, Ilya Leoshkevich,
	David Hildenbrand, Eric Farman, Matthew Rosato, Cornelia Huck,
	Dr. David Alan Gilbert, Samuel Thibault, Hyman Huang, Peter Xu,
	Fabiano Rosas, Alex Bennée, Stefan Berger, Zhao Liu,
	Laurent Vivier, Nicholas Piggin, Chinmay Rath, Glenn Miles,
	Harsh Prateek Bora, Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Yoshinori Sato,
	Artyom Tarasenko, Max Filippov, Stefan Hajnoczi, qemu-block, kvm,
	qemu-ppc, qemu-s390x, qemu-riscv

HMP commands are specific to the HMP monitor, so make the cmd function
pointer in HMPCommand take MonitorHMP * instead of Monitor *. This
strengthens type safety and makes the HMP-specific nature of these
handlers explicit.

Handler functions are renamed to take MonitorHMP *hmp, with a local
Monitor *mon = MONITOR(hmp) added where the body needs the base type.
Following patches will drop it, since most functions are HMP specific.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 audio/audio-hmp-cmds.c          |   8 +-
 backends/cryptodev-hmp-cmds.c   |   3 +-
 block/monitor/block-hmp-cmds.c  |  78 +++++++----
 chardev/char-hmp-cmds.c         |  21 ++-
 dump/dump-hmp-cmds.c            |   6 +-
 hw/core/machine-hmp-cmds.c      |  49 ++++---
 hw/i386/kvm/xen-stubs.c         |   6 +-
 hw/i386/kvm/xen_evtchn.c        |   6 +-
 hw/i386/sgx-hmp-stub.c          |   3 +-
 hw/i386/sgx.c                   |   3 +-
 hw/misc/mos6522-stub.c          |   3 +-
 hw/misc/mos6522.c               |   3 +-
 hw/net/rocker/rocker-hmp-cmds.c |  12 +-
 hw/pci/pci-hmp-cmds.c           |   6 +-
 hw/pci/pci-stub.c               |   5 +-
 hw/s390x/s390-skeys.c           |   5 +-
 hw/s390x/s390-stattrib.c        |   6 +-
 hw/uefi/ovmf-log.c              |   3 +-
 hw/usb/host-libusb.c            |   3 +-
 hw/virtio/virtio-hmp-cmds.c     |  15 +-
 include/block/block-hmp-cmds.h  |  55 ++++----
 include/hw/usb/usb.h            |   3 +-
 include/monitor/hmp.h           | 294 ++++++++++++++++++++--------------------
 include/monitor/qdev.h          |   5 +-
 include/net/net.h               |   5 +-
 include/net/slirp.h             |   8 +-
 migration/dirtyrate.c           |   6 +-
 migration/migration-hmp-cmds.c  |  48 ++++---
 monitor/hmp-cmds.c              |  96 ++++++++-----
 monitor/hmp.c                   |  17 ++-
 monitor/monitor-internal.h      |   2 +-
 net/net-hmp-cmds.c              |  14 +-
 net/slirp.c                     |   9 +-
 qom/qom-hmp-cmds.c              |  18 ++-
 replay/replay-debugging.c       |   9 +-
 replay/stubs-system.c           |   8 +-
 stats/stats-hmp-cmds.c          |   3 +-
 stubs/hmp-cmd-info_sev.c        |   3 +-
 system/dirtylimit-hmp-cmds.c    |   9 +-
 system/qdev-monitor.c           |  11 +-
 system/runstate-hmp-cmds.c      |   9 +-
 system/tpm-hmp-cmds.c           |   3 +-
 target/i386/cpu-apic.c          |   3 +-
 target/i386/monitor.c           |   9 +-
 target/i386/sev.c               |   3 +-
 target/m68k/monitor.c           |   3 +-
 target/ppc/monitor.c            |   3 +-
 target/riscv/monitor.c          |   3 +-
 target/sh4/monitor.c            |   3 +-
 target/sparc/monitor.c          |   3 +-
 target/xtensa/monitor.c         |   3 +-
 trace/trace-hmp-cmds.c          |   8 +-
 ui/ui-hmp-cmds.c                |  31 +++--
 53 files changed, 561 insertions(+), 390 deletions(-)

diff --git a/audio/audio-hmp-cmds.c b/audio/audio-hmp-cmds.c
index 1ffb5ebc7420..4d326ec99fdf 100644
--- a/audio/audio-hmp-cmds.c
+++ b/audio/audio-hmp-cmds.c
@@ -32,8 +32,9 @@
 
 static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
 
-void hmp_info_capture(Monitor *mon, const QDict *qdict)
+void hmp_info_capture(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int i;
     CaptureState *s;
 
@@ -45,7 +46,7 @@ void hmp_info_capture(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_stopcapture(Monitor *mon, const QDict *qdict)
+void hmp_stopcapture(MonitorHMP *hmp, const QDict *qdict)
 {
     int i;
     int n = qdict_get_int(qdict, "n");
@@ -63,8 +64,9 @@ void hmp_stopcapture(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_wavcapture(Monitor *mon, const QDict *qdict)
+void hmp_wavcapture(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_str(qdict, "path");
     int freq = qdict_get_try_int(qdict, "freq", 44100);
     int bits = qdict_get_try_int(qdict, "bits", 16);
diff --git a/backends/cryptodev-hmp-cmds.c b/backends/cryptodev-hmp-cmds.c
index 01396d227c88..fb62428d795a 100644
--- a/backends/cryptodev-hmp-cmds.c
+++ b/backends/cryptodev-hmp-cmds.c
@@ -17,8 +17,9 @@
 #include "qobject/qdict.h"
 
 
-void hmp_info_cryptodev(Monitor *mon, const QDict *qdict)
+void hmp_info_cryptodev(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     QCryptodevInfoList *il;
     QCryptodevBackendServiceTypeList *sl;
     QCryptodevBackendClientList *cl;
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
index 22fa03089ea3..3914b5189d56 100644
--- a/block/monitor/block-hmp-cmds.c
+++ b/block/monitor/block-hmp-cmds.c
@@ -87,8 +87,9 @@ out:
     hmp_handle_error(mon, err);
 }
 
-void hmp_drive_add(Monitor *mon, const QDict *qdict)
+void hmp_drive_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     DriveInfo *dinfo;
     QemuOpts *opts;
@@ -135,8 +136,9 @@ err:
     hmp_handle_error(mon, err);
 }
 
-void hmp_drive_del(Monitor *mon, const QDict *qdict)
+void hmp_drive_del(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *id = qdict_get_str(qdict, "id");
     BlockBackend *blk;
     BlockDriverState *bs;
@@ -194,8 +196,9 @@ unlock:
     hmp_handle_error(mon, err);
 }
 
-void hmp_commit(Monitor *mon, const QDict *qdict)
+void hmp_commit(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     BlockBackend *blk;
     int ret;
@@ -232,8 +235,9 @@ end:
     hmp_handle_error(mon, err);
 }
 
-void hmp_drive_mirror(Monitor *mon, const QDict *qdict)
+void hmp_drive_mirror(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *filename = qdict_get_str(qdict, "target");
     const char *format = qdict_get_try_str(qdict, "format");
     bool reuse = qdict_get_try_bool(qdict, "reuse", false);
@@ -258,8 +262,9 @@ end:
     hmp_handle_error(mon, err);
 }
 
-void hmp_drive_backup(Monitor *mon, const QDict *qdict)
+void hmp_drive_backup(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *filename = qdict_get_str(qdict, "target");
     const char *format = qdict_get_try_str(qdict, "format");
@@ -288,8 +293,9 @@ end:
     hmp_handle_error(mon, err);
 }
 
-void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
+void hmp_block_job_set_speed(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *error = NULL;
     const char *device = qdict_get_str(qdict, "device");
     int64_t value = qdict_get_int(qdict, "speed");
@@ -299,8 +305,9 @@ void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, error);
 }
 
-void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
+void hmp_block_job_cancel(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *error = NULL;
     const char *device = qdict_get_str(qdict, "device");
     bool force = qdict_get_try_bool(qdict, "force", false);
@@ -310,8 +317,9 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, error);
 }
 
-void hmp_block_job_pause(Monitor *mon, const QDict *qdict)
+void hmp_block_job_pause(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *error = NULL;
     const char *device = qdict_get_str(qdict, "device");
 
@@ -320,8 +328,9 @@ void hmp_block_job_pause(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, error);
 }
 
-void hmp_block_job_resume(Monitor *mon, const QDict *qdict)
+void hmp_block_job_resume(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *error = NULL;
     const char *device = qdict_get_str(qdict, "device");
 
@@ -330,8 +339,9 @@ void hmp_block_job_resume(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, error);
 }
 
-void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
+void hmp_block_job_complete(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *error = NULL;
     const char *device = qdict_get_str(qdict, "device");
 
@@ -340,8 +350,9 @@ void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, error);
 }
 
-void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
+void hmp_snapshot_blkdev(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *filename = qdict_get_str(qdict, "snapshot-file");
     const char *format = qdict_get_try_str(qdict, "format");
@@ -355,8 +366,9 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict)
+void hmp_snapshot_blkdev_internal(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *name = qdict_get_str(qdict, "name");
     Error *err = NULL;
@@ -365,8 +377,9 @@ void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict)
+void hmp_snapshot_delete_blkdev_internal(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *name = qdict_get_str(qdict, "name");
     const char *id = qdict_get_try_str(qdict, "id");
@@ -376,8 +389,9 @@ void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
+void hmp_nbd_server_start(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *uri = qdict_get_str(qdict, "uri");
     bool writable = qdict_get_try_bool(qdict, "writable", false);
     bool all = qdict_get_try_bool(qdict, "all", false);
@@ -438,8 +452,9 @@ exit:
     hmp_handle_error(mon, local_err);
 }
 
-void hmp_nbd_server_add(Monitor *mon, const QDict *qdict)
+void hmp_nbd_server_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *name = qdict_get_try_str(qdict, "name");
     bool writable = qdict_get_try_bool(qdict, "writable", false);
@@ -456,8 +471,9 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, local_err);
 }
 
-void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict)
+void hmp_nbd_server_remove(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *name = qdict_get_str(qdict, "name");
     bool force = qdict_get_try_bool(qdict, "force", false);
     Error *err = NULL;
@@ -467,16 +483,18 @@ void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict)
+void hmp_nbd_server_stop(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_nbd_server_stop(&err);
     hmp_handle_error(mon, err);
 }
 
-void coroutine_fn hmp_block_resize(Monitor *mon, const QDict *qdict)
+void coroutine_fn hmp_block_resize(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     int64_t size = qdict_get_int(qdict, "size");
     Error *err = NULL;
@@ -485,8 +503,9 @@ void coroutine_fn hmp_block_resize(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_block_stream(Monitor *mon, const QDict *qdict)
+void hmp_block_stream(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *error = NULL;
     const char *device = qdict_get_str(qdict, "device");
     const char *base = qdict_get_try_str(qdict, "base");
@@ -500,8 +519,9 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, error);
 }
 
-void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
+void hmp_block_set_io_throttle(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     char *device = (char *) qdict_get_str(qdict, "device");
     BlockIOThrottle throttle = {
@@ -528,8 +548,9 @@ void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_eject(Monitor *mon, const QDict *qdict)
+void hmp_eject(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     bool force = qdict_get_try_bool(qdict, "force", false);
     const char *device = qdict_get_str(qdict, "device");
     Error *err = NULL;
@@ -538,8 +559,9 @@ void hmp_eject(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_qemu_io(Monitor *mon, const QDict *qdict)
+void hmp_qemu_io(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     bool qdev = qdict_get_try_bool(qdict, "qdev", false);
     const char *device = qdict_get_str(qdict, "device");
     const char *command = qdict_get_str(qdict, "command");
@@ -666,8 +688,9 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
     }
 }
 
-void hmp_info_block(Monitor *mon, const QDict *qdict)
+void hmp_info_block(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     BlockInfoList *block_list, *info;
     BlockDeviceInfoList *blockdev_list, *blockdev;
     const char *device = qdict_get_try_str(qdict, "device");
@@ -719,8 +742,9 @@ void hmp_info_block(Monitor *mon, const QDict *qdict)
     qapi_free_BlockDeviceInfoList(blockdev_list);
 }
 
-void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
+void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     BlockStatsList *stats_list, *stats;
 
     stats_list = qmp_query_blockstats(false, false, NULL);
@@ -757,8 +781,9 @@ void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
     qapi_free_BlockStatsList(stats_list);
 }
 
-void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
+void hmp_info_block_jobs(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     BlockJobInfoList *list;
 
     list = qmp_query_block_jobs(&error_abort);
@@ -793,8 +818,9 @@ void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
     qapi_free_BlockJobInfoList(list);
 }
 
-void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
+void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     BlockDriverState *bs, *bs1;
     BdrvNextIterator it1;
     QEMUSnapshotInfo *sn_tab, *sn;
diff --git a/chardev/char-hmp-cmds.c b/chardev/char-hmp-cmds.c
index f377e00b6991..d4a5a3a255a5 100644
--- a/chardev/char-hmp-cmds.c
+++ b/chardev/char-hmp-cmds.c
@@ -24,8 +24,9 @@
 #include "qemu/config-file.h"
 #include "qemu/option.h"
 
-void hmp_info_chardev(Monitor *mon, const QDict *qdict)
+void hmp_info_chardev(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     ChardevInfoList *char_info, *info;
 
     char_info = qmp_query_chardev(NULL);
@@ -37,8 +38,9 @@ void hmp_info_chardev(Monitor *mon, const QDict *qdict)
     qapi_free_ChardevInfoList(char_info);
 }
 
-void hmp_ringbuf_write(Monitor *mon, const QDict *qdict)
+void hmp_ringbuf_write(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *chardev = qdict_get_str(qdict, "device");
     const char *data = qdict_get_str(qdict, "data");
     Error *err = NULL;
@@ -48,8 +50,9 @@ void hmp_ringbuf_write(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
+void hmp_ringbuf_read(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     uint32_t size = qdict_get_int(qdict, "size");
     const char *chardev = qdict_get_str(qdict, "device");
     char *data;
@@ -77,8 +80,9 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
     g_free(data);
 }
 
-void hmp_chardev_add(Monitor *mon, const QDict *qdict)
+void hmp_chardev_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *args = qdict_get_str(qdict, "args");
     Error *err = NULL;
     QemuOpts *opts;
@@ -93,8 +97,9 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_chardev_change(Monitor *mon, const QDict *qdict)
+void hmp_chardev_change(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *args = qdict_get_str(qdict, "args");
     const char *id;
     Error *err = NULL;
@@ -127,16 +132,18 @@ end:
     hmp_handle_error(mon, err);
 }
 
-void hmp_chardev_remove(Monitor *mon, const QDict *qdict)
+void hmp_chardev_remove(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *local_err = NULL;
 
     qmp_chardev_remove(qdict_get_str(qdict, "id"), &local_err);
     hmp_handle_error(mon, local_err);
 }
 
-void hmp_chardev_send_break(Monitor *mon, const QDict *qdict)
+void hmp_chardev_send_break(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *local_err = NULL;
 
     qmp_chardev_send_break(qdict_get_str(qdict, "id"), &local_err);
diff --git a/dump/dump-hmp-cmds.c b/dump/dump-hmp-cmds.c
index 21023db6fd85..ba78ad026f1e 100644
--- a/dump/dump-hmp-cmds.c
+++ b/dump/dump-hmp-cmds.c
@@ -12,8 +12,9 @@
 #include "qapi/qapi-commands-dump.h"
 #include "qobject/qdict.h"
 
-void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
+void hmp_dump_guest_memory(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     bool win_dmp = qdict_get_try_bool(qdict, "windmp", false);
     bool paging = qdict_get_try_bool(qdict, "paging", false);
@@ -83,8 +84,9 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
     g_free(prot);
 }
 
-void hmp_info_dump(Monitor *mon, const QDict *qdict)
+void hmp_info_dump(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     DumpQueryResult *result = qmp_query_dump(NULL);
 
     assert(result && result->status < DUMP_STATUS__MAX);
diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
index 1c700aad3587..48fa27f12705 100644
--- a/hw/core/machine-hmp-cmds.c
+++ b/hw/core/machine-hmp-cmds.c
@@ -25,8 +25,9 @@
 #include "system/numa.h"
 #include "hw/core/boards.h"
 
-void hmp_info_cpus(Monitor *mon, const QDict *qdict)
+void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CpuInfoFastList *cpu_list, *cpu;
 
     cpu_list = qmp_query_cpus_fast(NULL);
@@ -48,8 +49,9 @@ void hmp_info_cpus(Monitor *mon, const QDict *qdict)
     qapi_free_CpuInfoFastList(cpu_list);
 }
 
-void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
+void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err);
     HotpluggableCPUList *saved = l;
@@ -106,8 +108,9 @@ void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
     qapi_free_HotpluggableCPUList(saved);
 }
 
-void hmp_info_memdev(Monitor *mon, const QDict *qdict)
+void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     MemdevList *memdev_list = qmp_query_memdev(&err);
     MemdevList *m = memdev_list;
@@ -147,8 +150,9 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_info_kvm(Monitor *mon, const QDict *qdict)
+void hmp_info_kvm(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     KvmInfo *info;
 
     info = qmp_query_kvm(NULL);
@@ -162,8 +166,9 @@ void hmp_info_kvm(Monitor *mon, const QDict *qdict)
     qapi_free_KvmInfo(info);
 }
 
-void hmp_info_accelerators(Monitor *mon, const QDict *qdict)
+void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     AcceleratorInfo *info;
     AcceleratorList *accel;
 
@@ -180,8 +185,9 @@ void hmp_info_accelerators(Monitor *mon, const QDict *qdict)
     qapi_free_AcceleratorInfo(info);
 }
 
-void hmp_info_uuid(Monitor *mon, const QDict *qdict)
+void hmp_info_uuid(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     UuidInfo *info;
 
     info = qmp_query_uuid(NULL);
@@ -189,8 +195,9 @@ void hmp_info_uuid(Monitor *mon, const QDict *qdict)
     qapi_free_UuidInfo(info);
 }
 
-void hmp_info_balloon(Monitor *mon, const QDict *qdict)
+void hmp_info_balloon(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     BalloonInfo *info;
     Error *err = NULL;
 
@@ -204,18 +211,19 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict)
     qapi_free_BalloonInfo(info);
 }
 
-void hmp_system_reset(Monitor *mon, const QDict *qdict)
+void hmp_system_reset(MonitorHMP *hmp, const QDict *qdict)
 {
     qmp_system_reset(NULL);
 }
 
-void hmp_system_powerdown(Monitor *mon, const QDict *qdict)
+void hmp_system_powerdown(MonitorHMP *hmp, const QDict *qdict)
 {
     qmp_system_powerdown(NULL);
 }
 
-void hmp_memsave(Monitor *mon, const QDict *qdict)
+void hmp_memsave(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     uint32_t size = qdict_get_int(qdict, "size");
     const char *filename = qdict_get_str(qdict, "filename");
     uint64_t addr = qdict_get_int(qdict, "val");
@@ -231,8 +239,9 @@ void hmp_memsave(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_pmemsave(Monitor *mon, const QDict *qdict)
+void hmp_pmemsave(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     uint32_t size = qdict_get_int(qdict, "size");
     const char *filename = qdict_get_str(qdict, "filename");
     uint64_t addr = qdict_get_int(qdict, "val");
@@ -242,24 +251,27 @@ void hmp_pmemsave(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
+void hmp_system_wakeup(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_system_wakeup(&err);
     hmp_handle_error(mon, err);
 }
 
-void hmp_nmi(Monitor *mon, const QDict *qdict)
+void hmp_nmi(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_inject_nmi(&err);
     hmp_handle_error(mon, err);
 }
 
-void hmp_balloon(Monitor *mon, const QDict *qdict)
+void hmp_balloon(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int64_t value = qdict_get_int(qdict, "value");
     Error *err = NULL;
 
@@ -267,8 +279,9 @@ void hmp_balloon(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
+void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     MemoryDeviceInfoList *info_list = qmp_query_memory_devices(&err);
     MemoryDeviceInfoList *info;
@@ -370,8 +383,9 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
+void hmp_info_vm_generation_id(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     GuidInfo *info = qmp_query_vm_generation_id(&err);
     if (info) {
@@ -381,8 +395,9 @@ void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
     qapi_free_GuidInfo(info);
 }
 
-void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict)
+void hmp_info_memory_size_summary(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     MemoryInfo *info = qmp_query_memory_size_summary(&err);
     if (info) {
diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c
index bf6ac28bef47..ab1eb14f99e0 100644
--- a/hw/i386/kvm/xen-stubs.c
+++ b/hw/i386/kvm/xen-stubs.c
@@ -40,12 +40,14 @@ void xen_primary_console_set_be_port(uint16_t port)
 {
 }
 
-void hmp_xen_event_list(Monitor *mon, const QDict *qdict)
+void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     monitor_printf(mon, "XEN emulation is not available in this QEMU\n");
 }
 
-void hmp_xen_event_inject(Monitor *mon, const QDict *qdict)
+void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     monitor_printf(mon, "XEN emulation is not available in this QEMU\n");
 }
diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
index 8b243984e412..845838c372d5 100644
--- a/hw/i386/kvm/xen_evtchn.c
+++ b/hw/i386/kvm/xen_evtchn.c
@@ -2344,8 +2344,9 @@ void qmp_xen_event_inject(uint32_t port, Error **errp)
     }
 }
 
-void hmp_xen_event_list(Monitor *mon, const QDict *qdict)
+void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     EvtchnInfoList *iter, *info_list;
     Error *err = NULL;
 
@@ -2379,8 +2380,9 @@ void hmp_xen_event_list(Monitor *mon, const QDict *qdict)
     qapi_free_EvtchnInfoList(info_list);
 }
 
-void hmp_xen_event_inject(Monitor *mon, const QDict *qdict)
+void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int port = qdict_get_int(qdict, "port");
     Error *err = NULL;
 
diff --git a/hw/i386/sgx-hmp-stub.c b/hw/i386/sgx-hmp-stub.c
index cf1d9a6344b0..a4848ae1d1a7 100644
--- a/hw/i386/sgx-hmp-stub.c
+++ b/hw/i386/sgx-hmp-stub.c
@@ -10,7 +10,8 @@
 #include "monitor/hmp.h"
 #include "monitor/monitor.h"
 
-void hmp_info_sgx(Monitor *mon, const QDict *qdict)
+void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     monitor_printf(mon, "SGX is not available in this QEMU\n");
 }
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index 7e4c509f5a4a..77b41d234c9f 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -234,8 +234,9 @@ SgxInfo *qmp_query_sgx(Error **errp)
     return info;
 }
 
-void hmp_info_sgx(Monitor *mon, const QDict *qdict)
+void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     SgxEpcSectionList *section_list, *section;
     g_autoptr(SgxInfo) info = qmp_query_sgx(&err);
diff --git a/hw/misc/mos6522-stub.c b/hw/misc/mos6522-stub.c
index 85eb0ee36ee1..6a7d76292f00 100644
--- a/hw/misc/mos6522-stub.c
+++ b/hw/misc/mos6522-stub.c
@@ -10,7 +10,8 @@
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 
-void hmp_info_via(Monitor *mon, const QDict *qdict)
+void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     monitor_printf(mon, "MOS6522 VIA is not available in this QEMU\n");
 }
diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c
index bae766ef1782..15a6a1a75745 100644
--- a/hw/misc/mos6522.c
+++ b/hw/misc/mos6522.c
@@ -586,8 +586,9 @@ static HumanReadableText *qmp_x_query_via(Error **errp)
     return human_readable_text_from_str(buf);
 }
 
-void hmp_info_via(Monitor *mon, const QDict *qdict)
+void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     g_autoptr(HumanReadableText) info = qmp_x_query_via(&err);
 
diff --git a/hw/net/rocker/rocker-hmp-cmds.c b/hw/net/rocker/rocker-hmp-cmds.c
index df40991f6d20..856aaef5e210 100644
--- a/hw/net/rocker/rocker-hmp-cmds.c
+++ b/hw/net/rocker/rocker-hmp-cmds.c
@@ -20,8 +20,9 @@
 #include "qapi/qapi-commands-rocker.h"
 #include "qobject/qdict.h"
 
-void hmp_rocker(Monitor *mon, const QDict *qdict)
+void hmp_rocker(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *name = qdict_get_str(qdict, "name");
     RockerSwitch *rocker;
     Error *err = NULL;
@@ -38,8 +39,9 @@ void hmp_rocker(Monitor *mon, const QDict *qdict)
     qapi_free_RockerSwitch(rocker);
 }
 
-void hmp_rocker_ports(Monitor *mon, const QDict *qdict)
+void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     RockerPortList *list, *port;
     const char *name = qdict_get_str(qdict, "name");
     Error *err = NULL;
@@ -65,8 +67,9 @@ void hmp_rocker_ports(Monitor *mon, const QDict *qdict)
     qapi_free_RockerPortList(list);
 }
 
-void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict)
+void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     RockerOfDpaFlowList *list, *info;
     const char *name = qdict_get_str(qdict, "name");
     uint32_t tbl_id = qdict_get_try_int(qdict, "tbl_id", -1);
@@ -214,8 +217,9 @@ void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict)
     qapi_free_RockerOfDpaFlowList(list);
 }
 
-void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict)
+void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     RockerOfDpaGroupList *list, *g;
     const char *name = qdict_get_str(qdict, "name");
     uint8_t type = qdict_get_try_int(qdict, "type", 9);
diff --git a/hw/pci/pci-hmp-cmds.c b/hw/pci/pci-hmp-cmds.c
index a5f6483cc3d2..be24aecc8ac8 100644
--- a/hw/pci/pci-hmp-cmds.c
+++ b/hw/pci/pci-hmp-cmds.c
@@ -117,8 +117,9 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
     }
 }
 
-void hmp_info_pci(Monitor *mon, const QDict *qdict)
+void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     PciInfoList *info_list, *info;
 
     info_list = qmp_query_pci(&error_abort);
@@ -170,8 +171,9 @@ void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
     }
 }
 
-void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
+void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *id = qdict_get_str(qdict, "id");
     const char *error_name;
diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c
index 3397d0c82ea8..a80e34175462 100644
--- a/hw/pci/pci-stub.c
+++ b/hw/pci/pci-stub.c
@@ -34,12 +34,13 @@ PciInfoList *qmp_query_pci(Error **errp)
     return NULL;
 }
 
-void hmp_info_pci(Monitor *mon, const QDict *qdict)
+void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
 {
 }
 
-void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
+void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     monitor_printf(mon, "PCI devices not supported\n");
 }
 
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index 7dca67d6618c..d8afaf730639 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -104,8 +104,9 @@ static void write_keys(FILE *f, uint8_t *keys, uint64_t startgfn,
     }
 }
 
-void hmp_info_skeys(Monitor *mon, const QDict *qdict)
+void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     S390SKeysState *ss = s390_get_skeys_device();
     S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     uint64_t addr = qdict_get_int(qdict, "addr");
@@ -134,7 +135,7 @@ void hmp_info_skeys(Monitor *mon, const QDict *qdict)
     monitor_printf(mon, "  key: 0x%X\n", key);
 }
 
-void hmp_dump_skeys(Monitor *mon, const QDict *qdict)
+void hmp_dump_skeys(MonitorHMP *hmp, const QDict *qdict)
 {
     const char *filename = qdict_get_str(qdict, "filename");
     Error *err = NULL;
diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index b0f04eb30c7f..b4a405455901 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -59,8 +59,9 @@ void s390_stattrib_init(void)
 
 /* Console commands: */
 
-void hmp_migrationmode(Monitor *mon, const QDict *qdict)
+void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     S390StAttribState *sas = s390_get_stattrib_device();
     S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
     uint64_t what = qdict_get_int(qdict, "mode");
@@ -74,8 +75,9 @@ void hmp_migrationmode(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_info_cmma(Monitor *mon, const QDict *qdict)
+void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     S390StAttribState *sas = s390_get_stattrib_device();
     S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
     uint64_t addr = qdict_get_int(qdict, "addr");
diff --git a/hw/uefi/ovmf-log.c b/hw/uefi/ovmf-log.c
index 3a24afd9417d..c97622b2aad6 100644
--- a/hw/uefi/ovmf-log.c
+++ b/hw/uefi/ovmf-log.c
@@ -256,8 +256,9 @@ FirmwareLog *qmp_query_firmware_log(bool have_max_size, uint64_t max_size,
     return ret;
 }
 
-void hmp_info_firmware_log(Monitor *mon, const QDict *qdict)
+void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     g_autofree gchar *log_esc = NULL;
     g_autofree guchar *log_out = NULL;
     Error *err = NULL;
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index af67d5dfeb10..c02343d3a655 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -1920,8 +1920,9 @@ static void usb_host_auto_check(void *unused)
     timer_mod(usb_auto_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 2000);
 }
 
-void hmp_info_usbhost(Monitor *mon, const QDict *qdict)
+void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     libusb_device **devs = NULL;
     struct libusb_device_descriptor ddesc;
     char port[16];
diff --git a/hw/virtio/virtio-hmp-cmds.c b/hw/virtio/virtio-hmp-cmds.c
index a91bb7dbeda5..49f3367785ba 100644
--- a/hw/virtio/virtio-hmp-cmds.c
+++ b/hw/virtio/virtio-hmp-cmds.c
@@ -80,8 +80,9 @@ static void hmp_virtio_dump_features(Monitor *mon,
     }
 }
 
-void hmp_virtio_query(Monitor *mon, const QDict *qdict)
+void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     VirtioInfoList *list = qmp_x_query_virtio(&err);
     VirtioInfoList *node;
@@ -105,8 +106,9 @@ void hmp_virtio_query(Monitor *mon, const QDict *qdict)
     qapi_free_VirtioInfoList(list);
 }
 
-void hmp_virtio_status(Monitor *mon, const QDict *qdict)
+void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     VirtioStatus *s = qmp_x_query_virtio_status(path, &err);
@@ -183,8 +185,9 @@ void hmp_virtio_status(Monitor *mon, const QDict *qdict)
     qapi_free_VirtioStatus(s);
 }
 
-void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict)
+void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     int queue = qdict_get_int(qdict, "queue");
@@ -216,8 +219,9 @@ void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict)
     qapi_free_VirtVhostQueueStatus(s);
 }
 
-void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict)
+void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     int queue = qdict_get_int(qdict, "queue");
@@ -261,8 +265,9 @@ void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict)
     qapi_free_VirtQueueStatus(s);
 }
 
-void hmp_virtio_queue_element(Monitor *mon, const QDict *qdict)
+void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     int queue = qdict_get_int(qdict, "queue");
diff --git a/include/block/block-hmp-cmds.h b/include/block/block-hmp-cmds.h
index 71113cd7efa4..0f5908958f05 100644
--- a/include/block/block-hmp-cmds.h
+++ b/include/block/block-hmp-cmds.h
@@ -16,41 +16,42 @@
 #define BLOCK_BLOCK_HMP_CMDS_H
 
 #include "qemu/coroutine.h"
+#include "monitor/hmp.h"
 
-void hmp_drive_add(Monitor *mon, const QDict *qdict);
+void hmp_drive_add(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_commit(Monitor *mon, const QDict *qdict);
-void hmp_drive_del(Monitor *mon, const QDict *qdict);
+void hmp_commit(MonitorHMP *hmp, const QDict *qdict);
+void hmp_drive_del(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_drive_mirror(Monitor *mon, const QDict *qdict);
-void hmp_drive_backup(Monitor *mon, const QDict *qdict);
+void hmp_drive_mirror(MonitorHMP *hmp, const QDict *qdict);
+void hmp_drive_backup(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict);
-void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
-void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
-void hmp_block_job_resume(Monitor *mon, const QDict *qdict);
-void hmp_block_job_complete(Monitor *mon, const QDict *qdict);
+void hmp_block_job_set_speed(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_job_cancel(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_job_pause(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_job_resume(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_job_complete(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict);
-void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict);
-void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict);
+void hmp_snapshot_blkdev(MonitorHMP *hmp, const QDict *qdict);
+void hmp_snapshot_blkdev_internal(MonitorHMP *hmp, const QDict *qdict);
+void hmp_snapshot_delete_blkdev_internal(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_nbd_server_start(Monitor *mon, const QDict *qdict);
-void hmp_nbd_server_add(Monitor *mon, const QDict *qdict);
-void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict);
-void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict);
+void hmp_nbd_server_start(MonitorHMP *hmp, const QDict *qdict);
+void hmp_nbd_server_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_nbd_server_remove(MonitorHMP *hmp, const QDict *qdict);
+void hmp_nbd_server_stop(MonitorHMP *hmp, const QDict *qdict);
 
-void coroutine_fn hmp_block_resize(Monitor *mon, const QDict *qdict);
-void hmp_block_stream(Monitor *mon, const QDict *qdict);
-void hmp_block_passwd(Monitor *mon, const QDict *qdict);
-void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict);
-void hmp_eject(Monitor *mon, const QDict *qdict);
+void coroutine_fn hmp_block_resize(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_stream(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_passwd(MonitorHMP *hmp, const QDict *qdict);
+void hmp_block_set_io_throttle(MonitorHMP *hmp, const QDict *qdict);
+void hmp_eject(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_qemu_io(Monitor *mon, const QDict *qdict);
+void hmp_qemu_io(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_info_block(Monitor *mon, const QDict *qdict);
-void hmp_info_blockstats(Monitor *mon, const QDict *qdict);
-void hmp_info_block_jobs(Monitor *mon, const QDict *qdict);
-void hmp_info_snapshots(Monitor *mon, const QDict *qdict);
+void hmp_info_block(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_block_jobs(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict);
 
 #endif
diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h
index 78e2ceedd7fd..cbd4711933e8 100644
--- a/include/hw/usb/usb.h
+++ b/include/hw/usb/usb.h
@@ -31,6 +31,7 @@
 #include "qemu/queue.h"
 #include "qom/object.h"
 #include "qapi/error.h"
+#include "monitor/hmp.h"
 
 /* Constants related to the USB / PCI interaction */
 #define USB_SBRN    0x60 /* Serial Bus Release Number Register */
@@ -466,7 +467,7 @@ void usb_wakeup(USBEndpoint *ep, unsigned int stream);
 void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
 
 /* usb-linux.c */
-void hmp_info_usbhost(Monitor *mon, const QDict *qdict);
+void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict);
 
 /* usb ports of the VM */
 
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
index 166cd4100c63..7a270ad3f25c 100644
--- a/include/monitor/hmp.h
+++ b/include/monitor/hmp.h
@@ -22,7 +22,7 @@
 OBJECT_DECLARE_TYPE(MonitorHMP, MonitorHMPClass, MONITOR_HMP);
 
 #define HMP_STUB(cmd) \
-    void hmp_##cmd(Monitor *mon, const QDict *qdict) \
+    void hmp_##cmd(MonitorHMP *hmp, const QDict *qdict) \
     { \
         g_assert_not_reached(); \
     }
@@ -46,7 +46,7 @@ int monitor_hmp_read_password(MonitorHMP *hmp, ReadLineFunc *readline_func,
                               void *opaque);
 
 void monitor_register_hmp(const char *name, bool info,
-                          void (*cmd)(Monitor *mon, const QDict *qdict));
+                          void (*cmd)(MonitorHMP *mon, const QDict *qdict));
 void monitor_register_hmp_info_hrt(const char *name,
                                    HumanReadableText *(*handler)(Error **errp));
 
@@ -58,58 +58,58 @@ bool hmp_handle_error(Monitor *mon, Error *err);
 void hmp_help_cmd(Monitor *mon, const char *name);
 strList *hmp_split_at_comma(const char *str);
 
-void hmp_info_name(Monitor *mon, const QDict *qdict);
-void hmp_info_version(Monitor *mon, const QDict *qdict);
-void hmp_info_kvm(Monitor *mon, const QDict *qdict);
-void hmp_info_accelerators(Monitor *mon, const QDict *qdict);
-void hmp_info_status(Monitor *mon, const QDict *qdict);
-void hmp_info_uuid(Monitor *mon, const QDict *qdict);
-void hmp_info_chardev(Monitor *mon, const QDict *qdict);
-void hmp_info_mice(Monitor *mon, const QDict *qdict);
-void hmp_info_migrate(Monitor *mon, const QDict *qdict);
-void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
-void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
-void hmp_info_cpus(Monitor *mon, const QDict *qdict);
-void hmp_info_vnc(Monitor *mon, const QDict *qdict);
-void hmp_info_spice(Monitor *mon, const QDict *qdict);
-void hmp_info_balloon(Monitor *mon, const QDict *qdict);
-void hmp_info_pci(Monitor *mon, const QDict *qdict);
-void hmp_info_tpm(Monitor *mon, const QDict *qdict);
-void hmp_info_iothreads(Monitor *mon, const QDict *qdict);
-void hmp_quit(Monitor *mon, const QDict *qdict);
-void hmp_stop(Monitor *mon, const QDict *qdict);
-void hmp_sync_profile(Monitor *mon, const QDict *qdict);
-void hmp_system_reset(Monitor *mon, const QDict *qdict);
-void hmp_system_powerdown(Monitor *mon, const QDict *qdict);
-void hmp_exit_preconfig(Monitor *mon, const QDict *qdict);
-void hmp_announce_self(Monitor *mon, const QDict *qdict);
-void hmp_cpu(Monitor *mon, const QDict *qdict);
-void hmp_memsave(Monitor *mon, const QDict *qdict);
-void hmp_pmemsave(Monitor *mon, const QDict *qdict);
-void hmp_ringbuf_write(Monitor *mon, const QDict *qdict);
-void hmp_ringbuf_read(Monitor *mon, const QDict *qdict);
-void hmp_cont(Monitor *mon, const QDict *qdict);
-void hmp_system_wakeup(Monitor *mon, const QDict *qdict);
-void hmp_nmi(Monitor *mon, const QDict *qdict);
-void hmp_info_network(Monitor *mon, const QDict *qdict);
-void hmp_set_link(Monitor *mon, const QDict *qdict);
-void hmp_balloon(Monitor *mon, const QDict *qdict);
-void hmp_loadvm(Monitor *mon, const QDict *qdict);
-void hmp_savevm(Monitor *mon, const QDict *qdict);
-void hmp_delvm(Monitor *mon, const QDict *qdict);
-void hmp_migrate_cancel(Monitor *mon, const QDict *qdict);
-void hmp_migrate_continue(Monitor *mon, const QDict *qdict);
-void hmp_migrate_incoming(Monitor *mon, const QDict *qdict);
-void hmp_migrate_recover(Monitor *mon, const QDict *qdict);
-void hmp_migrate_pause(Monitor *mon, const QDict *qdict);
-void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict);
-void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict);
-void hmp_client_migrate_info(Monitor *mon, const QDict *qdict);
-void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict);
-void hmp_x_colo_lost_heartbeat(Monitor *mon, const QDict *qdict);
-void hmp_set_password(Monitor *mon, const QDict *qdict);
-void hmp_expire_password(Monitor *mon, const QDict *qdict);
-void hmp_change(Monitor *mon, const QDict *qdict);
+void hmp_info_name(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_version(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_kvm(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_status(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_uuid(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_chardev(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_mice(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_migrate_capabilities(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_migrate_parameters(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_balloon(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_tpm(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_iothreads(MonitorHMP *hmp, const QDict *qdict);
+void hmp_quit(MonitorHMP *hmp, const QDict *qdict);
+void hmp_stop(MonitorHMP *hmp, const QDict *qdict);
+void hmp_sync_profile(MonitorHMP *hmp, const QDict *qdict);
+void hmp_system_reset(MonitorHMP *hmp, const QDict *qdict);
+void hmp_system_powerdown(MonitorHMP *hmp, const QDict *qdict);
+void hmp_exit_preconfig(MonitorHMP *hmp, const QDict *qdict);
+void hmp_announce_self(MonitorHMP *hmp, const QDict *qdict);
+void hmp_cpu(MonitorHMP *hmp, const QDict *qdict);
+void hmp_memsave(MonitorHMP *hmp, const QDict *qdict);
+void hmp_pmemsave(MonitorHMP *hmp, const QDict *qdict);
+void hmp_ringbuf_write(MonitorHMP *hmp, const QDict *qdict);
+void hmp_ringbuf_read(MonitorHMP *hmp, const QDict *qdict);
+void hmp_cont(MonitorHMP *hmp, const QDict *qdict);
+void hmp_system_wakeup(MonitorHMP *hmp, const QDict *qdict);
+void hmp_nmi(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_network(MonitorHMP *hmp, const QDict *qdict);
+void hmp_set_link(MonitorHMP *hmp, const QDict *qdict);
+void hmp_balloon(MonitorHMP *hmp, const QDict *qdict);
+void hmp_loadvm(MonitorHMP *hmp, const QDict *qdict);
+void hmp_savevm(MonitorHMP *hmp, const QDict *qdict);
+void hmp_delvm(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_cancel(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_continue(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_incoming(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_recover(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_pause(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_set_capability(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_set_parameter(MonitorHMP *hmp, const QDict *qdict);
+void hmp_client_migrate_info(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrate_start_postcopy(MonitorHMP *hmp, const QDict *qdict);
+void hmp_x_colo_lost_heartbeat(MonitorHMP *hmp, const QDict *qdict);
+void hmp_set_password(MonitorHMP *hmp, const QDict *qdict);
+void hmp_expire_password(MonitorHMP *hmp, const QDict *qdict);
+void hmp_change(MonitorHMP *hmp, const QDict *qdict);
 #ifdef CONFIG_VNC
 void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
                     const char *arg, const char *read_only, bool force,
@@ -118,101 +118,101 @@ void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
 void hmp_change_medium(Monitor *mon, const char *device, const char *target,
                        const char *arg, const char *read_only, bool force,
                        Error **errp);
-void hmp_migrate(Monitor *mon, const QDict *qdict);
-void hmp_device_add(Monitor *mon, const QDict *qdict);
-void hmp_device_del(Monitor *mon, const QDict *qdict);
-void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict);
-void hmp_netdev_add(Monitor *mon, const QDict *qdict);
-void hmp_netdev_del(Monitor *mon, const QDict *qdict);
-void hmp_getfd(Monitor *mon, const QDict *qdict);
-void hmp_closefd(Monitor *mon, const QDict *qdict);
-void hmp_mouse_move(Monitor *mon, const QDict *qdict);
-void hmp_mouse_button(Monitor *mon, const QDict *qdict);
-void hmp_mouse_set(Monitor *mon, const QDict *qdict);
-void hmp_sendkey(Monitor *mon, const QDict *qdict);
-void coroutine_fn hmp_screendump(Monitor *mon, const QDict *qdict);
-void hmp_chardev_add(Monitor *mon, const QDict *qdict);
-void hmp_chardev_change(Monitor *mon, const QDict *qdict);
-void hmp_chardev_remove(Monitor *mon, const QDict *qdict);
-void hmp_chardev_send_break(Monitor *mon, const QDict *qdict);
-void hmp_object_add(Monitor *mon, const QDict *qdict);
-void hmp_object_del(Monitor *mon, const QDict *qdict);
-void hmp_info_memdev(Monitor *mon, const QDict *qdict);
-void hmp_info_memory_devices(Monitor *mon, const QDict *qdict);
-void hmp_qom_list(Monitor *mon, const QDict *qdict);
-void hmp_qom_get(Monitor *mon, const QDict *qdict);
-void hmp_qom_set(Monitor *mon, const QDict *qdict);
-void hmp_info_qom_tree(Monitor *mon, const QDict *dict);
-void hmp_virtio_query(Monitor *mon, const QDict *qdict);
-void hmp_virtio_status(Monitor *mon, const QDict *qdict);
-void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict);
-void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict);
-void hmp_virtio_queue_element(Monitor *mon, const QDict *qdict);
-void hmp_xen_event_inject(Monitor *mon, const QDict *qdict);
-void hmp_xen_event_list(Monitor *mon, const QDict *qdict);
-void hmp_rocker(Monitor *mon, const QDict *qdict);
-void hmp_rocker_ports(Monitor *mon, const QDict *qdict);
-void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict);
-void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict);
-void hmp_info_dump(Monitor *mon, const QDict *qdict);
-void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict);
-void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict);
-void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict);
-void hmp_info_replay(Monitor *mon, const QDict *qdict);
-void hmp_replay_break(Monitor *mon, const QDict *qdict);
-void hmp_replay_delete_break(Monitor *mon, const QDict *qdict);
-void hmp_replay_seek(Monitor *mon, const QDict *qdict);
-void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict);
-void hmp_calc_dirty_rate(Monitor *mon, const QDict *qdict);
-void hmp_set_vcpu_dirty_limit(Monitor *mon, const QDict *qdict);
-void hmp_cancel_vcpu_dirty_limit(Monitor *mon, const QDict *qdict);
-void hmp_info_vcpu_dirty_limit(Monitor *mon, const QDict *qdict);
+void hmp_migrate(MonitorHMP *hmp, const QDict *qdict);
+void hmp_device_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_device_del(MonitorHMP *hmp, const QDict *qdict);
+void hmp_dump_guest_memory(MonitorHMP *hmp, const QDict *qdict);
+void hmp_netdev_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_netdev_del(MonitorHMP *hmp, const QDict *qdict);
+void hmp_getfd(MonitorHMP *hmp, const QDict *qdict);
+void hmp_closefd(MonitorHMP *hmp, const QDict *qdict);
+void hmp_mouse_move(MonitorHMP *hmp, const QDict *qdict);
+void hmp_mouse_button(MonitorHMP *hmp, const QDict *qdict);
+void hmp_mouse_set(MonitorHMP *hmp, const QDict *qdict);
+void hmp_sendkey(MonitorHMP *hmp, const QDict *qdict);
+void coroutine_fn hmp_screendump(MonitorHMP *hmp, const QDict *qdict);
+void hmp_chardev_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_chardev_change(MonitorHMP *hmp, const QDict *qdict);
+void hmp_chardev_remove(MonitorHMP *hmp, const QDict *qdict);
+void hmp_chardev_send_break(MonitorHMP *hmp, const QDict *qdict);
+void hmp_object_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_object_del(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict);
+void hmp_qom_list(MonitorHMP *hmp, const QDict *qdict);
+void hmp_qom_get(MonitorHMP *hmp, const QDict *qdict);
+void hmp_qom_set(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_qom_tree(MonitorHMP *hmp, const QDict *dict);
+void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict);
+void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict);
+void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict);
+void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict);
+void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict);
+void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict);
+void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict);
+void hmp_rocker(MonitorHMP *hmp, const QDict *qdict);
+void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict);
+void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict);
+void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_dump(MonitorHMP *hmp, const QDict *qdict);
+void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_vm_generation_id(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_memory_size_summary(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict);
+void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict);
+void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict);
+void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict);
+void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict);
+void hmp_set_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict);
+void hmp_cancel_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict);
 void hmp_human_readable_text_helper(Monitor *mon,
                                     HumanReadableText *(*qmp_handler)(Error **));
-void hmp_info_stats(Monitor *mon, const QDict *qdict);
-void hmp_one_insn_per_tb(Monitor *mon, const QDict *qdict);
-void hmp_watchdog_action(Monitor *mon, const QDict *qdict);
-void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict);
-void hmp_info_capture(Monitor *mon, const QDict *qdict);
-void hmp_stopcapture(Monitor *mon, const QDict *qdict);
-void hmp_wavcapture(Monitor *mon, const QDict *qdict);
-void hmp_trace_event(Monitor *mon, const QDict *qdict);
-void hmp_trace_file(Monitor *mon, const QDict *qdict);
-void hmp_info_trace_events(Monitor *mon, const QDict *qdict);
-void hmp_help(Monitor *mon, const QDict *qdict);
-void hmp_clear(Monitor *mon, const QDict *qdict);
-void hmp_info_help(Monitor *mon, const QDict *qdict);
-void hmp_info_sync_profile(Monitor *mon, const QDict *qdict);
-void hmp_info_history(Monitor *mon, const QDict *qdict);
-void hmp_logfile(Monitor *mon, const QDict *qdict);
-void hmp_log(Monitor *mon, const QDict *qdict);
-void hmp_gdbserver(Monitor *mon, const QDict *qdict);
-void hmp_print(Monitor *mon, const QDict *qdict);
-void hmp_sum(Monitor *mon, const QDict *qdict);
-void hmp_ioport_read(Monitor *mon, const QDict *qdict);
-void hmp_ioport_write(Monitor *mon, const QDict *qdict);
-void hmp_boot_set(Monitor *mon, const QDict *qdict);
-void hmp_info_mtree(Monitor *mon, const QDict *qdict);
-void hmp_info_cryptodev(Monitor *mon, const QDict *qdict);
-void hmp_dumpdtb(Monitor *mon, const QDict *qdict);
-void hmp_info_firmware_log(Monitor *mon, const QDict *qdict);
-void hmp_info_mem(Monitor *mon, const QDict *qdict);
-void hmp_info_tlb(Monitor *mon, const QDict *qdict);
-void hmp_mce(Monitor *mon, const QDict *qdict);
-void hmp_info_local_apic(Monitor *mon, const QDict *qdict);
-void hmp_info_sev(Monitor *mon, const QDict *qdict);
-void hmp_info_sgx(Monitor *mon, const QDict *qdict);
-void hmp_info_via(Monitor *mon, const QDict *qdict);
-void hmp_memory_dump(Monitor *mon, const QDict *qdict);
-void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict);
-void hmp_info_registers(Monitor *mon, const QDict *qdict);
-void hmp_gva2gpa(Monitor *mon, const QDict *qdict);
-void hmp_gpa2hva(Monitor *mon, const QDict *qdict);
-void hmp_gpa2hpa(Monitor *mon, const QDict *qdict);
+void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict);
+void hmp_one_insn_per_tb(MonitorHMP *hmp, const QDict *qdict);
+void hmp_watchdog_action(MonitorHMP *hmp, const QDict *qdict);
+void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_capture(MonitorHMP *hmp, const QDict *qdict);
+void hmp_stopcapture(MonitorHMP *hmp, const QDict *qdict);
+void hmp_wavcapture(MonitorHMP *hmp, const QDict *qdict);
+void hmp_trace_event(MonitorHMP *hmp, const QDict *qdict);
+void hmp_trace_file(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_trace_events(MonitorHMP *hmp, const QDict *qdict);
+void hmp_help(MonitorHMP *hmp, const QDict *qdict);
+void hmp_clear(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_help(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_sync_profile(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_history(MonitorHMP *hmp, const QDict *qdict);
+void hmp_logfile(MonitorHMP *hmp, const QDict *qdict);
+void hmp_log(MonitorHMP *hmp, const QDict *qdict);
+void hmp_gdbserver(MonitorHMP *hmp, const QDict *qdict);
+void hmp_print(MonitorHMP *hmp, const QDict *qdict);
+void hmp_sum(MonitorHMP *hmp, const QDict *qdict);
+void hmp_ioport_read(MonitorHMP *hmp, const QDict *qdict);
+void hmp_ioport_write(MonitorHMP *hmp, const QDict *qdict);
+void hmp_boot_set(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_mtree(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_cryptodev(MonitorHMP *hmp, const QDict *qdict);
+void hmp_dumpdtb(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict);
+void hmp_mce(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_via(MonitorHMP *hmp, const QDict *qdict);
+void hmp_memory_dump(MonitorHMP *hmp, const QDict *qdict);
+void hmp_physical_memory_dump(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict);
+void hmp_gva2gpa(MonitorHMP *hmp, const QDict *qdict);
+void hmp_gpa2hva(MonitorHMP *hmp, const QDict *qdict);
+void hmp_gpa2hpa(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_dump_skeys(Monitor *mon, const QDict *qdict);
-void hmp_info_skeys(Monitor *mon, const QDict *qdict);
-void hmp_info_cmma(Monitor *mon, const QDict *qdict);
-void hmp_migrationmode(Monitor *mon, const QDict *qdict);
+void hmp_dump_skeys(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict);
+void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict);
 
 #endif
diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
index f85f25738d58..8f7e2f616cf3 100644
--- a/include/monitor/qdev.h
+++ b/include/monitor/qdev.h
@@ -2,11 +2,12 @@
 #define MONITOR_QDEV_H
 
 #include "hw/core/qdev.h"
+#include "monitor/hmp.h"
 
 /*** monitor commands ***/
 
-void hmp_info_qtree(Monitor *mon, const QDict *qdict);
-void hmp_info_qdm(Monitor *mon, const QDict *qdict);
+void hmp_info_qtree(MonitorHMP *hmp, const QDict *qdict);
+void hmp_info_qdm(MonitorHMP *hmp, const QDict *qdict);
 void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp);
 
 int qdev_device_help(QemuOpts *opts);
diff --git a/include/net/net.h b/include/net/net.h
index a7c49c543783..626b99794806 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -5,6 +5,7 @@
 #include "qapi/qapi-types-net.h"
 #include "net/queue.h"
 #include "hw/core/qdev-properties-system.h"
+#include "monitor/hmp.h"
 
 #define MAC_FMT "%02X:%02X:%02X:%02X:%02X:%02X"
 #define MAC_ARG(x) ((uint8_t *)(x))[0], ((uint8_t *)(x))[1], \
@@ -318,8 +319,8 @@ void net_init_clients(void);
 void net_check_clients(void);
 void net_client_set_link(NetClientState **ncs, int queues, bool up);
 void net_cleanup(void);
-void hmp_host_net_add(Monitor *mon, const QDict *qdict);
-void hmp_host_net_remove(Monitor *mon, const QDict *qdict);
+void hmp_host_net_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_host_net_remove(MonitorHMP *hmp, const QDict *qdict);
 void netdev_add(QemuOpts *opts, Error **errp);
 
 int net_hub_id_for_client(NetClientState *nc, int *id);
diff --git a/include/net/slirp.h b/include/net/slirp.h
index bad3e1e2416b..38859edf58ae 100644
--- a/include/net/slirp.h
+++ b/include/net/slirp.h
@@ -24,13 +24,13 @@
 #ifndef QEMU_NET_SLIRP_H
 #define QEMU_NET_SLIRP_H
 
-
 #ifdef CONFIG_SLIRP
+#include "monitor/hmp.h"
 
-void hmp_hostfwd_add(Monitor *mon, const QDict *qdict);
-void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict);
+void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict);
+void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict);
 
-void hmp_info_usernet(Monitor *mon, const QDict *qdict);
+void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict);
 
 #endif
 
diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c
index b360f49efeaf..567abab321cc 100644
--- a/migration/dirtyrate.c
+++ b/migration/dirtyrate.c
@@ -856,8 +856,9 @@ struct DirtyRateInfo *qmp_query_dirty_rate(bool has_calc_time_unit,
         has_calc_time_unit ? calc_time_unit : TIME_UNIT_SECOND);
 }
 
-void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict)
+void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     DirtyRateInfo *info = query_dirty_rate_info(TIME_UNIT_SECOND);
 
     monitor_printf(mon, "Status: %s\n",
@@ -891,8 +892,9 @@ void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict)
     g_free(info);
 }
 
-void hmp_calc_dirty_rate(Monitor *mon, const QDict *qdict)
+void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int64_t sec = qdict_get_try_int(qdict, "second", 0);
     int64_t sample_pages = qdict_get_try_int(qdict, "sample_pages_per_GB", -1);
     bool has_sample_pages = (sample_pages != -1);
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index ad68fa23aa4b..8d2e8735277e 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -135,8 +135,9 @@ static void migration_dump_blocktime(Monitor *mon, MigrationInfo *info)
     }
 }
 
-void hmp_info_migrate(Monitor *mon, const QDict *qdict)
+void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     bool show_all = qdict_get_try_bool(qdict, "all", false);
     MigrationInfo *info;
 
@@ -297,8 +298,9 @@ out:
     qapi_free_MigrationInfo(info);
 }
 
-void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
+void hmp_info_migrate_capabilities(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     MigrationCapabilityStatusList *caps, *cap;
 
     caps = qmp_query_migrate_capabilities(NULL);
@@ -326,8 +328,9 @@ static void monitor_print_cpr_exec_command(Monitor *mon, strList *args)
     monitor_printf(mon, "\n");
 }
 
-void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
+void hmp_info_migrate_parameters(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     MigrationParameters *params;
     MigrationState *s = migrate_get_current();
 
@@ -473,8 +476,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
     qapi_free_MigrationParameters(params);
 }
 
-void hmp_loadvm(Monitor *mon, const QDict *qdict)
+void hmp_loadvm(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     RunState saved_state = runstate_get();
 
     const char *name = qdict_get_str(qdict, "name");
@@ -489,8 +493,9 @@ void hmp_loadvm(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_savevm(Monitor *mon, const QDict *qdict)
+void hmp_savevm(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     save_snapshot(qdict_get_try_str(qdict, "name"),
@@ -498,8 +503,9 @@ void hmp_savevm(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_delvm(Monitor *mon, const QDict *qdict)
+void hmp_delvm(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *name = qdict_get_str(qdict, "name");
 
@@ -507,13 +513,14 @@ void hmp_delvm(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
+void hmp_migrate_cancel(MonitorHMP *hmp, const QDict *qdict)
 {
     qmp_migrate_cancel(NULL);
 }
 
-void hmp_migrate_continue(Monitor *mon, const QDict *qdict)
+void hmp_migrate_continue(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *state = qdict_get_str(qdict, "state");
     int val = qapi_enum_parse(&MigrationStatus_lookup, state, -1, &err);
@@ -525,8 +532,9 @@ void hmp_migrate_continue(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
+void hmp_migrate_incoming(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *uri = qdict_get_str(qdict, "uri");
     MigrationChannelList *caps = NULL;
@@ -544,8 +552,9 @@ end:
     hmp_handle_error(mon, err);
 }
 
-void hmp_migrate_recover(Monitor *mon, const QDict *qdict)
+void hmp_migrate_recover(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *uri = qdict_get_str(qdict, "uri");
 
@@ -554,8 +563,9 @@ void hmp_migrate_recover(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_migrate_pause(Monitor *mon, const QDict *qdict)
+void hmp_migrate_pause(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_migrate_pause(&err);
@@ -564,8 +574,9 @@ void hmp_migrate_pause(Monitor *mon, const QDict *qdict)
 }
 
 
-void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
+void hmp_migrate_set_capability(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *cap = qdict_get_str(qdict, "capability");
     bool state = qdict_get_bool(qdict, "state");
     Error *err = NULL;
@@ -589,8 +600,9 @@ end:
     hmp_handle_error(mon, err);
 }
 
-void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
+void hmp_migrate_set_parameter(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *param = qdict_get_str(qdict, "parameter");
     const char *valuestr = qdict_get_str(qdict, "value");
     Visitor *v = string_input_visitor_new(valuestr);
@@ -790,16 +802,18 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict)
+void hmp_migrate_start_postcopy(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     qmp_migrate_start_postcopy(&err);
     hmp_handle_error(mon, err);
 }
 
 #ifdef CONFIG_REPLICATION
-void hmp_x_colo_lost_heartbeat(Monitor *mon, const QDict *qdict)
+void hmp_x_colo_lost_heartbeat(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_x_colo_lost_heartbeat(&err);
@@ -833,8 +847,9 @@ static void hmp_migrate_status_cb(void *opaque)
     qapi_free_MigrationInfo(info);
 }
 
-void hmp_migrate(Monitor *mon, const QDict *qdict)
+void hmp_migrate(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     bool detach = qdict_get_try_bool(qdict, "detach", false);
     bool resume = qdict_get_try_bool(qdict, "resume", false);
     const char *uri = qdict_get_str(qdict, "uri");
@@ -873,7 +888,6 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)
 
     if (!detach) {
         HMPMigrationStatus *status;
-        MonitorHMP *hmp = MONITOR_HMP(mon);
 
         if (!hmp->use_readline) {
             monitor_printf(mon, "terminal does not allow synchronous "
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 6718fec97047..afe4817b4056 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -103,8 +103,9 @@ strList *hmp_split_at_comma(const char *str)
     return res;
 }
 
-void hmp_info_name(Monitor *mon, const QDict *qdict)
+void hmp_info_name(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     NameInfo *info;
 
     info = qmp_query_name(NULL);
@@ -114,8 +115,9 @@ void hmp_info_name(Monitor *mon, const QDict *qdict)
     qapi_free_NameInfo(info);
 }
 
-void hmp_info_version(Monitor *mon, const QDict *qdict)
+void hmp_info_version(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     VersionInfo *info;
 
     info = qmp_query_version(NULL);
@@ -127,22 +129,23 @@ void hmp_info_version(Monitor *mon, const QDict *qdict)
     qapi_free_VersionInfo(info);
 }
 
-void hmp_quit(Monitor *mon, const QDict *qdict)
+void hmp_quit(MonitorHMP *hmp, const QDict *qdict)
 {
-    MonitorHMP *hmp = MONITOR_HMP(mon);
+    Monitor *mon = MONITOR(hmp);
     if (hmp->use_readline) {
         monitor_suspend(mon);
     }
     qmp_quit(NULL);
 }
 
-void hmp_stop(Monitor *mon, const QDict *qdict)
+void hmp_stop(MonitorHMP *hmp, const QDict *qdict)
 {
     qmp_stop(NULL);
 }
 
-void hmp_sync_profile(Monitor *mon, const QDict *qdict)
+void hmp_sync_profile(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *op = qdict_get_try_str(qdict, "op");
 
     if (op == NULL) {
@@ -166,16 +169,18 @@ void hmp_sync_profile(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_exit_preconfig(Monitor *mon, const QDict *qdict)
+void hmp_exit_preconfig(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_x_exit_preconfig(&err);
     hmp_handle_error(mon, err);
 }
 
-void hmp_cpu(Monitor *mon, const QDict *qdict)
+void hmp_cpu(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int64_t cpu_index;
 
     /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
@@ -186,16 +191,18 @@ void hmp_cpu(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_cont(Monitor *mon, const QDict *qdict)
+void hmp_cont(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qmp_cont(&err);
     hmp_handle_error(mon, err);
 }
 
-void hmp_change(Monitor *mon, const QDict *qdict)
+void hmp_change(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *target = qdict_get_str(qdict, "target");
     const char *arg = qdict_get_try_str(qdict, "arg");
@@ -216,8 +223,9 @@ void hmp_change(Monitor *mon, const QDict *qdict)
 }
 
 #ifdef CONFIG_POSIX
-void hmp_getfd(Monitor *mon, const QDict *qdict)
+void hmp_getfd(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *fdname = qdict_get_str(qdict, "fdname");
     Error *err = NULL;
 
@@ -226,8 +234,9 @@ void hmp_getfd(Monitor *mon, const QDict *qdict)
 }
 #endif
 
-void hmp_closefd(Monitor *mon, const QDict *qdict)
+void hmp_closefd(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *fdname = qdict_get_str(qdict, "fdname");
     Error *err = NULL;
 
@@ -235,8 +244,9 @@ void hmp_closefd(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
+void hmp_info_iothreads(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
     IOThreadInfoList *info;
     IOThreadInfo *value;
@@ -256,13 +266,15 @@ void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
     qapi_free_IOThreadInfoList(info_list);
 }
 
-void hmp_help(Monitor *mon, const QDict *qdict)
+void hmp_help(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     hmp_help_cmd(mon, qdict_get_try_str(qdict, "name"));
 }
 
-void hmp_clear(Monitor *mon, const QDict *qdict)
+void hmp_clear(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     /*
      * Send an ANSI escape sequence:
      * "\x1b[H" - move cursor to top-left
@@ -272,12 +284,13 @@ void hmp_clear(Monitor *mon, const QDict *qdict)
     monitor_printf(mon, "\x1b[H\x1b[2J\x1b[3J");
 }
 
-void hmp_info_help(Monitor *mon, const QDict *qdict)
+void hmp_info_help(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     hmp_help_cmd(mon, "info");
 }
 
-void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
+void hmp_info_sync_profile(MonitorHMP *hmp, const QDict *qdict)
 {
     int64_t max = qdict_get_try_int(qdict, "max", 10);
     bool mean = qdict_get_try_bool(qdict, "mean", false);
@@ -288,9 +301,9 @@ void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
     qsp_report(max, sort_by, coalesce);
 }
 
-void hmp_info_history(Monitor *mon, const QDict *qdict)
+void hmp_info_history(MonitorHMP *hmp, const QDict *qdict)
 {
-    MonitorHMP *hmp = MONITOR_HMP(mon);
+    Monitor *mon = MONITOR(hmp);
     int i;
     const char *str;
 
@@ -308,7 +321,7 @@ void hmp_info_history(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_logfile(Monitor *mon, const QDict *qdict)
+void hmp_logfile(MonitorHMP *hmp, const QDict *qdict)
 {
     Error *err = NULL;
 
@@ -317,8 +330,9 @@ void hmp_logfile(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_log(Monitor *mon, const QDict *qdict)
+void hmp_log(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int mask;
     const char *items = qdict_get_str(qdict, "items");
     Error *err = NULL;
@@ -338,8 +352,9 @@ void hmp_log(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_gdbserver(Monitor *mon, const QDict *qdict)
+void hmp_gdbserver(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *device = qdict_get_try_str(qdict, "device");
 
@@ -357,8 +372,9 @@ void hmp_gdbserver(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_print(Monitor *mon, const QDict *qdict)
+void hmp_print(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int format = qdict_get_int(qdict, "format");
     hwaddr val = qdict_get_int(qdict, "val");
 
@@ -383,8 +399,9 @@ void hmp_print(Monitor *mon, const QDict *qdict)
     monitor_printf(mon, "\n");
 }
 
-void hmp_sum(Monitor *mon, const QDict *qdict)
+void hmp_sum(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     uint32_t addr;
     uint16_t sum;
     uint32_t start = qdict_get_int(qdict, "start");
@@ -401,8 +418,9 @@ void hmp_sum(Monitor *mon, const QDict *qdict)
     monitor_printf(mon, "%05d\n", sum);
 }
 
-void hmp_ioport_read(Monitor *mon, const QDict *qdict)
+void hmp_ioport_read(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int size = qdict_get_int(qdict, "size");
     int addr = qdict_get_int(qdict, "addr");
     int has_index = qdict_haskey(qdict, "index");
@@ -435,7 +453,7 @@ void hmp_ioport_read(Monitor *mon, const QDict *qdict)
                    suffix, addr, size * 2, val);
 }
 
-void hmp_ioport_write(Monitor *mon, const QDict *qdict)
+void hmp_ioport_write(MonitorHMP *hmp, const QDict *qdict)
 {
     int size = qdict_get_int(qdict, "size");
     int addr = qdict_get_int(qdict, "addr");
@@ -457,8 +475,9 @@ void hmp_ioport_write(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_boot_set(Monitor *mon, const QDict *qdict)
+void hmp_boot_set(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *local_err = NULL;
     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
 
@@ -470,7 +489,7 @@ void hmp_boot_set(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_info_mtree(Monitor *mon, const QDict *qdict)
+void hmp_info_mtree(MonitorHMP *hmp, const QDict *qdict)
 {
     bool flatview = qdict_get_try_bool(qdict, "flatview", false);
     bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false);
@@ -481,8 +500,9 @@ void hmp_info_mtree(Monitor *mon, const QDict *qdict)
 }
 
 #if defined(CONFIG_FDT)
-void hmp_dumpdtb(Monitor *mon, const QDict *qdict)
+void hmp_dumpdtb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *filename = qdict_get_str(qdict, "filename");
     Error *local_err = NULL;
 
@@ -558,8 +578,9 @@ int monitor_get_cpu_index(Monitor *mon)
     return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX;
 }
 
-void hmp_info_registers(Monitor *mon, const QDict *qdict)
+void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
     int vcpu = qdict_get_try_int(qdict, "vcpu", -1);
     CPUState *cs;
@@ -694,8 +715,9 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
     }
 }
 
-void hmp_memory_dump(Monitor *mon, const QDict *qdict)
+void hmp_memory_dump(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int count = qdict_get_int(qdict, "count");
     int format = qdict_get_int(qdict, "format");
     int size = qdict_get_int(qdict, "size");
@@ -704,8 +726,9 @@ void hmp_memory_dump(Monitor *mon, const QDict *qdict)
     memory_dump(mon, count, format, size, addr, false);
 }
 
-void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
+void hmp_physical_memory_dump(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int count = qdict_get_int(qdict, "count");
     int format = qdict_get_int(qdict, "format");
     int size = qdict_get_int(qdict, "size");
@@ -714,8 +737,9 @@ void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
     memory_dump(mon, count, format, size, addr, true);
 }
 
-void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
+void hmp_gpa2hva(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     hwaddr addr = qdict_get_int(qdict, "addr");
     Error *local_err = NULL;
     MemoryRegion *mr = NULL;
@@ -734,8 +758,9 @@ void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
     memory_region_unref(mr);
 }
 
-void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
+void hmp_gva2gpa(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     vaddr addr = qdict_get_int(qdict, "addr");
     CPUState *cs = mon_get_cpu(mon);
     TranslateForDebugResult tres;
@@ -787,8 +812,9 @@ out:
     return ret;
 }
 
-void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
+void hmp_gpa2hpa(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     hwaddr addr = qdict_get_int(qdict, "addr");
     Error *local_err = NULL;
     MemoryRegion *mr = NULL;
diff --git a/monitor/hmp.c b/monitor/hmp.c
index b4d05d47c4bf..6e6334b64685 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -1228,12 +1228,12 @@ static void hmp_info_human_readable_text(Monitor *mon,
     monitor_puts(mon, info->human_readable_text);
 }
 
-static void handle_hmp_command_exec(Monitor *mon,
+static void handle_hmp_command_exec(MonitorHMP *mon,
                                     const HMPCommand *cmd,
                                     QDict *qdict)
 {
     if (cmd->cmd_info_hrt) {
-        hmp_info_human_readable_text(mon,
+        hmp_info_human_readable_text(MONITOR(mon),
                                      cmd->cmd_info_hrt);
     } else {
         cmd->cmd(mon, qdict);
@@ -1241,7 +1241,7 @@ static void handle_hmp_command_exec(Monitor *mon,
 }
 
 typedef struct HandleHmpCommandCo {
-    Monitor *mon;
+    MonitorHMP *mon;
     const HMPCommand *cmd;
     QDict *qdict;
     bool done;
@@ -1289,19 +1289,18 @@ void handle_hmp_command(MonitorHMP *hmp, const char *cmdline)
 
     if (!cmd->coroutine) {
         /* old_mon is non-NULL when called from qmp_human_monitor_command() */
-        Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(),
-                                           &hmp->parent_obj);
-        handle_hmp_command_exec(&hmp->parent_obj, cmd, qdict);
+        Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(), MONITOR(hmp));
+        handle_hmp_command_exec(hmp, cmd, qdict);
         monitor_set_cur(qemu_coroutine_self(), old_mon);
     } else {
         HandleHmpCommandCo data = {
-            .mon = &hmp->parent_obj,
+            .mon = hmp,
             .cmd = cmd,
             .qdict = qdict,
             .done = false,
         };
         Coroutine *co = qemu_coroutine_create(handle_hmp_command_co, &data);
-        monitor_set_cur(co, &hmp->parent_obj);
+        monitor_set_cur(co, MONITOR(hmp));
         aio_co_enter(qemu_get_aio_context(), co);
         AIO_WAIT_WHILE_UNLOCKED(NULL, !data.done);
     }
@@ -1689,7 +1688,7 @@ int hmp_compare_cmd(const char *name, const char *list)
 }
 
 void monitor_register_hmp(const char *name, bool info,
-                          void (*cmd)(Monitor *mon, const QDict *qdict))
+                          void (*cmd)(MonitorHMP *mon, const QDict *qdict))
 {
     HMPCommand *table = hmp_cmds_for_target(info);
 
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
index ee9ba0c8231e..a0fa37c887ed 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -77,7 +77,7 @@ typedef struct HMPCommand {
     const char *params;
     const char *help;
     const char *flags; /* p=preconfig */
-    void (*cmd)(Monitor *mon, const QDict *qdict);
+    void (*cmd)(MonitorHMP *mon, const QDict *qdict);
     /*
      * If implementing a command that takes no arguments and simply
      * prints formatted data, then leave @cmd NULL, and then set
diff --git a/net/net-hmp-cmds.c b/net/net-hmp-cmds.c
index 52ac8da770d9..702103b6a920 100644
--- a/net/net-hmp-cmds.c
+++ b/net/net-hmp-cmds.c
@@ -45,8 +45,9 @@ static void hmp_print_client_info(Monitor *mon, NetworkClientInfo *ci)
     }
 }
 
-void hmp_info_network(Monitor *mon, const QDict *qdict)
+void hmp_info_network(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     g_autoptr(NetworkInfo) info = qmp_x_query_network(&err);
     NetHubInfoList *h;
@@ -83,8 +84,9 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_set_link(Monitor *mon, const QDict *qdict)
+void hmp_set_link(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *name = qdict_get_str(qdict, "name");
     bool up = qdict_get_bool(qdict, "up");
     Error *err = NULL;
@@ -94,7 +96,7 @@ void hmp_set_link(Monitor *mon, const QDict *qdict)
 }
 
 
-void hmp_announce_self(Monitor *mon, const QDict *qdict)
+void hmp_announce_self(MonitorHMP *hmp, const QDict *qdict)
 {
     const char *interfaces_str = qdict_get_try_str(qdict, "interfaces");
     const char *id = qdict_get_try_str(qdict, "id");
@@ -109,8 +111,9 @@ void hmp_announce_self(Monitor *mon, const QDict *qdict)
     qapi_free_AnnounceParameters(params);
 }
 
-void hmp_netdev_add(Monitor *mon, const QDict *qdict)
+void hmp_netdev_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     QemuOpts *opts;
     const char *type = qdict_get_try_str(qdict, "type");
@@ -133,8 +136,9 @@ out:
     hmp_handle_error(mon, err);
 }
 
-void hmp_netdev_del(Monitor *mon, const QDict *qdict)
+void hmp_netdev_del(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *id = qdict_get_str(qdict, "id");
     Error *err = NULL;
 
diff --git a/net/slirp.c b/net/slirp.c
index 9bf09a2c8bc9..d5c190b48b76 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -733,8 +733,9 @@ static SlirpState *slirp_lookup(Monitor *mon, const char *id)
     }
 }
 
-void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict)
+void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     /* TODO: support removing unix fwd */
     struct sockaddr_in host_addr = {
         .sin_family = AF_INET,
@@ -957,8 +958,9 @@ static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
     return -1;
 }
 
-void hmp_hostfwd_add(Monitor *mon, const QDict *qdict)
+void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *redir_str;
     SlirpState *s;
     const char *arg1 = qdict_get_str(qdict, "arg1");
@@ -1224,8 +1226,9 @@ UsernetInfoList *qmp_x_query_usernet(Error **errp)
     return head;
 }
 
-void hmp_info_usernet(Monitor *mon, const QDict *qdict)
+void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     g_autoptr(UsernetInfoList) list = NULL;
     UsernetInfoList *entry;
 
diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c
index 47110ca58c0d..16847d1ce261 100644
--- a/qom/qom-hmp-cmds.c
+++ b/qom/qom-hmp-cmds.c
@@ -18,8 +18,9 @@
 #include "qom/object.h"
 #include "qom/object_interfaces.h"
 
-void hmp_qom_list(Monitor *mon, const QDict *qdict)
+void hmp_qom_list(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_try_str(qdict, "path");
     ObjectPropertyInfoList *list;
     Error *err = NULL;
@@ -44,8 +45,9 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_qom_set(Monitor *mon, const QDict *qdict)
+void hmp_qom_set(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const bool json = qdict_get_try_bool(qdict, "json", false);
     const char *path = qdict_get_str(qdict, "path");
     const char *property = qdict_get_str(qdict, "property");
@@ -72,8 +74,9 @@ void hmp_qom_set(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_qom_get(Monitor *mon, const QDict *qdict)
+void hmp_qom_get(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_str(qdict, "path");
     const char *property = qdict_get_str(qdict, "property");
     Error *err = NULL;
@@ -132,8 +135,9 @@ static void print_qom_composition(Monitor *mon, Object *obj, int indent)
     g_array_free(children, TRUE);
 }
 
-void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
+void hmp_info_qom_tree(MonitorHMP *hmp, const QDict *dict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_try_str(dict, "path");
     Object *obj;
     bool ambiguous = false;
@@ -154,8 +158,9 @@ void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
     print_qom_composition(mon, obj, 0);
 }
 
-void hmp_object_add(Monitor *mon, const QDict *qdict)
+void hmp_object_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *options = qdict_get_str(qdict, "object");
     Error *err = NULL;
 
@@ -163,8 +168,9 @@ void hmp_object_add(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, err);
 }
 
-void hmp_object_del(Monitor *mon, const QDict *qdict)
+void hmp_object_del(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *id = qdict_get_str(qdict, "id");
     Error *err = NULL;
 
diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
index 7b904a141654..ef69d23ff507 100644
--- a/replay/replay-debugging.c
+++ b/replay/replay-debugging.c
@@ -31,8 +31,9 @@ bool replay_running_debug(void)
     return replay_is_debugging;
 }
 
-void hmp_info_replay(Monitor *mon, const QDict *qdict)
+void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     if (replay_mode == REPLAY_MODE_NONE) {
         monitor_printf(mon, "Record/replay is not active\n");
     } else {
@@ -103,7 +104,7 @@ void qmp_replay_break(int64_t icount, Error **errp)
     }
 }
 
-void hmp_replay_break(Monitor *mon, const QDict *qdict)
+void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
 {
     int64_t icount = qdict_get_try_int(qdict, "icount", -1LL);
     Error *err = NULL;
@@ -124,7 +125,7 @@ void qmp_replay_delete_break(Error **errp)
     }
 }
 
-void hmp_replay_delete_break(Monitor *mon, const QDict *qdict)
+void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
 {
     Error *err = NULL;
 
@@ -209,7 +210,7 @@ void qmp_replay_seek(int64_t icount, Error **errp)
     replay_seek(icount, replay_stop_vm, errp);
 }
 
-void hmp_replay_seek(Monitor *mon, const QDict *qdict)
+void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
 {
     int64_t icount = qdict_get_try_int(qdict, "icount", -1LL);
     Error *err = NULL;
diff --git a/replay/stubs-system.c b/replay/stubs-system.c
index f8e17dcf1ce9..15e7411591ab 100644
--- a/replay/stubs-system.c
+++ b/replay/stubs-system.c
@@ -63,19 +63,19 @@ void replay_vmstate_init(void)
 #include "qapi/error.h"
 #include "qemu/error-report.h"
 
-void hmp_info_replay(Monitor *mon, const QDict *qdict)
+void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
-void hmp_replay_break(Monitor *mon, const QDict *qdict)
+void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
-void hmp_replay_delete_break(Monitor *mon, const QDict *qdict)
+void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
-void hmp_replay_seek(Monitor *mon, const QDict *qdict)
+void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
diff --git a/stats/stats-hmp-cmds.c b/stats/stats-hmp-cmds.c
index b93b471b1b25..f280ad8c4314 100644
--- a/stats/stats-hmp-cmds.c
+++ b/stats/stats-hmp-cmds.c
@@ -187,8 +187,9 @@ static StatsFilter *stats_filter(StatsTarget target, const char *names,
     return filter;
 }
 
-void hmp_info_stats(Monitor *mon, const QDict *qdict)
+void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *target_str = qdict_get_str(qdict, "target");
     const char *provider_str = qdict_get_try_str(qdict, "provider");
     const char *names = qdict_get_try_str(qdict, "names");
diff --git a/stubs/hmp-cmd-info_sev.c b/stubs/hmp-cmd-info_sev.c
index f3624423a334..6f2b87d1ad10 100644
--- a/stubs/hmp-cmd-info_sev.c
+++ b/stubs/hmp-cmd-info_sev.c
@@ -10,7 +10,8 @@
 #include "monitor/hmp.h"
 #include "monitor/monitor.h"
 
-void hmp_info_sev(Monitor *mon, const QDict *qdict)
+void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     monitor_printf(mon, "SEV is not available in this QEMU\n");
 }
diff --git a/system/dirtylimit-hmp-cmds.c b/system/dirtylimit-hmp-cmds.c
index 4928d57cc8e3..4c100783778f 100644
--- a/system/dirtylimit-hmp-cmds.c
+++ b/system/dirtylimit-hmp-cmds.c
@@ -15,8 +15,9 @@
 #include "monitor/monitor.h"
 #include "system/dirtylimit.h"
 
-void hmp_cancel_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
+void hmp_cancel_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int64_t cpu_index = qdict_get_try_int(qdict, "cpu_index", -1);
     Error *err = NULL;
 
@@ -30,8 +31,9 @@ void hmp_cancel_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
                    "dirty limit for virtual CPU]\n");
 }
 
-void hmp_set_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
+void hmp_set_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     int64_t dirty_rate = qdict_get_int(qdict, "dirty_rate");
     int64_t cpu_index = qdict_get_try_int(qdict, "cpu_index", -1);
     Error *err = NULL;
@@ -47,8 +49,9 @@ out:
     hmp_handle_error(mon, err);
 }
 
-void hmp_info_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
+void hmp_info_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     DirtyLimitInfoList *info;
     g_autoptr(DirtyLimitInfoList) head = NULL;
     Error *err = NULL;
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 00fed791cce1..e27b9724867a 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -851,8 +851,9 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent, bool details)
 }
 #undef qdev_printf
 
-void hmp_info_qtree(Monitor *mon, const QDict *qdict)
+void hmp_info_qtree(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     bool details = !qdict_get_try_bool(qdict, "brief", false);
 
     if (sysbus_get_default()) {
@@ -860,7 +861,7 @@ void hmp_info_qtree(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_info_qdm(Monitor *mon, const QDict *qdict)
+void hmp_info_qdm(MonitorHMP *hmp, const QDict *qdict)
 {
     qdev_print_devinfos(true);
 }
@@ -1001,8 +1002,9 @@ void qmp_device_sync_config(const char *id, Error **errp)
     qdev_sync_config(dev, errp);
 }
 
-void hmp_device_add(Monitor *mon, const QDict *qdict)
+void hmp_device_add(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     QemuOpts *opts;
     DeviceState *dev;
@@ -1035,8 +1037,9 @@ out:
     hmp_handle_error(mon, err);
 }
 
-void hmp_device_del(Monitor *mon, const QDict *qdict)
+void hmp_device_del(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *id = qdict_get_str(qdict, "id");
     Error *err = NULL;
 
diff --git a/system/runstate-hmp-cmds.c b/system/runstate-hmp-cmds.c
index 02d1d42bf392..834b95835339 100644
--- a/system/runstate-hmp-cmds.c
+++ b/system/runstate-hmp-cmds.c
@@ -23,8 +23,9 @@
 #include "qobject/qdict.h"
 #include "qemu/accel.h"
 
-void hmp_info_status(Monitor *mon, const QDict *qdict)
+void hmp_info_status(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     StatusInfo *info;
 
     info = qmp_query_status(NULL);
@@ -41,8 +42,9 @@ void hmp_info_status(Monitor *mon, const QDict *qdict)
     qapi_free_StatusInfo(info);
 }
 
-void hmp_one_insn_per_tb(Monitor *mon, const QDict *qdict)
+void hmp_one_insn_per_tb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *option = qdict_get_try_str(qdict, "option");
     AccelState *accel = current_accel();
     bool newval;
@@ -66,8 +68,9 @@ void hmp_one_insn_per_tb(Monitor *mon, const QDict *qdict)
                              newval, &error_abort);
 }
 
-void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
+void hmp_watchdog_action(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     WatchdogAction action;
     char *qapi_value;
diff --git a/system/tpm-hmp-cmds.c b/system/tpm-hmp-cmds.c
index 9ed6ad6c4d46..094c3f16cf50 100644
--- a/system/tpm-hmp-cmds.c
+++ b/system/tpm-hmp-cmds.c
@@ -11,8 +11,9 @@
 #include "monitor/hmp.h"
 #include "qapi/error.h"
 
-void hmp_info_tpm(Monitor *mon, const QDict *qdict)
+void hmp_info_tpm(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
 #ifdef CONFIG_TPM
     TPMInfoList *info_list, *info;
     Error *err = NULL;
diff --git a/target/i386/cpu-apic.c b/target/i386/cpu-apic.c
index 04b7257ad120..2cb3147837d1 100644
--- a/target/i386/cpu-apic.c
+++ b/target/i386/cpu-apic.c
@@ -80,8 +80,9 @@ void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
      }
 }
 
-void hmp_info_local_apic(Monitor *mon, const QDict *qdict)
+void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUState *cs;
 
     if (qdict_haskey(qdict, "apic-id")) {
diff --git a/target/i386/monitor.c b/target/i386/monitor.c
index 9ed772e6d7f2..f1d2a327ddad 100644
--- a/target/i386/monitor.c
+++ b/target/i386/monitor.c
@@ -209,8 +209,9 @@ static void tlb_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
 }
 #endif /* TARGET_X86_64 */
 
-void hmp_info_tlb(Monitor *mon, const QDict *qdict)
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env;
     AddressSpace *as;
 
@@ -535,8 +536,9 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
 }
 #endif /* TARGET_X86_64 */
 
-void hmp_info_mem(Monitor *mon, const QDict *qdict)
+void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env;
     AddressSpace *as;
 
@@ -569,8 +571,9 @@ void hmp_info_mem(Monitor *mon, const QDict *qdict)
     }
 }
 
-void hmp_mce(Monitor *mon, const QDict *qdict)
+void hmp_mce(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     X86CPU *cpu;
     CPUState *cs;
     int cpu_index = qdict_get_int(qdict, "cpu_index");
diff --git a/target/i386/sev.c b/target/i386/sev.c
index d7dcefc8ecf5..4473d02981ff 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -754,8 +754,9 @@ SevInfo *qmp_query_sev(Error **errp)
     return info;
 }
 
-void hmp_info_sev(Monitor *mon, const QDict *qdict)
+void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     SevInfo *info = sev_get_info();
 
     if (!info || !info->enabled) {
diff --git a/target/m68k/monitor.c b/target/m68k/monitor.c
index 3e0df40a6b8b..0414474f2ffb 100644
--- a/target/m68k/monitor.c
+++ b/target/m68k/monitor.c
@@ -10,8 +10,9 @@
 #include "monitor/hmp.h"
 #include "monitor/monitor.h"
 
-void hmp_info_tlb(Monitor *mon, const QDict *qdict)
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = mon_get_cpu_env(mon);
 
     if (!env1) {
diff --git a/target/ppc/monitor.c b/target/ppc/monitor.c
index 7c88e0e2bda0..99eda7351877 100644
--- a/target/ppc/monitor.c
+++ b/target/ppc/monitor.c
@@ -11,8 +11,9 @@
 #include "monitor/hmp.h"
 #include "cpu.h"
 
-void hmp_info_tlb(Monitor *mon, const QDict *qdict)
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = mon_get_cpu_env(mon);
 
     if (!env1) {
diff --git a/target/riscv/monitor.c b/target/riscv/monitor.c
index f8042db9cdf3..496d519c978d 100644
--- a/target/riscv/monitor.c
+++ b/target/riscv/monitor.c
@@ -215,8 +215,9 @@ static void mem_info_svxx(Monitor *mon, CPUArchState *env)
               last_paddr + last_size - pbase, last_attr);
 }
 
-void hmp_info_mem(Monitor *mon, const QDict *qdict)
+void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env;
 
     env = mon_get_cpu_env(mon);
diff --git a/target/sh4/monitor.c b/target/sh4/monitor.c
index 50324d3600c4..50da650b2e04 100644
--- a/target/sh4/monitor.c
+++ b/target/sh4/monitor.c
@@ -38,8 +38,9 @@ static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
                    tlb->d, tlb->wt);
 }
 
-void hmp_info_tlb(Monitor *mon, const QDict *qdict)
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env = mon_get_cpu_env(mon);
     int i;
 
diff --git a/target/sparc/monitor.c b/target/sparc/monitor.c
index 36f3d8d58e9d..09a15b821a1a 100644
--- a/target/sparc/monitor.c
+++ b/target/sparc/monitor.c
@@ -27,8 +27,9 @@
 #include "monitor/hmp.h"
 
 
-void hmp_info_tlb(Monitor *mon, const QDict *qdict)
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = mon_get_cpu_env(mon);
 
     if (!env1) {
diff --git a/target/xtensa/monitor.c b/target/xtensa/monitor.c
index 2af84934f83d..a1082c44e11c 100644
--- a/target/xtensa/monitor.c
+++ b/target/xtensa/monitor.c
@@ -26,8 +26,9 @@
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 
-void hmp_info_tlb(Monitor *mon, const QDict *qdict)
+void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = mon_get_cpu_env(mon);
 
     if (!env1) {
diff --git a/trace/trace-hmp-cmds.c b/trace/trace-hmp-cmds.c
index c8f0133abecf..5a8158f4f4b6 100644
--- a/trace/trace-hmp-cmds.c
+++ b/trace/trace-hmp-cmds.c
@@ -33,7 +33,7 @@
 #include "trace/simple.h"
 #endif
 
-void hmp_trace_event(Monitor *mon, const QDict *qdict)
+void hmp_trace_event(MonitorHMP *hmp, const QDict *qdict)
 {
     const char *tp_name = qdict_get_str(qdict, "name");
     bool new_state = qdict_get_bool(qdict, "option");
@@ -47,8 +47,9 @@ void hmp_trace_event(Monitor *mon, const QDict *qdict)
 }
 
 #ifdef CONFIG_TRACE_SIMPLE
-void hmp_trace_file(Monitor *mon, const QDict *qdict)
+void hmp_trace_file(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *op = qdict_get_try_str(qdict, "op");
     const char *arg = qdict_get_try_str(qdict, "arg");
 
@@ -71,8 +72,9 @@ void hmp_trace_file(Monitor *mon, const QDict *qdict)
 }
 #endif
 
-void hmp_info_trace_events(Monitor *mon, const QDict *qdict)
+void hmp_info_trace_events(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *name = qdict_get_try_str(qdict, "name");
     TraceEventInfoList *events;
     TraceEventInfoList *elem;
diff --git a/ui/ui-hmp-cmds.c b/ui/ui-hmp-cmds.c
index 4ef459490ba2..5f3522943c56 100644
--- a/ui/ui-hmp-cmds.c
+++ b/ui/ui-hmp-cmds.c
@@ -29,7 +29,7 @@
 
 static int mouse_button_state;
 
-void hmp_mouse_move(Monitor *mon, const QDict *qdict)
+void hmp_mouse_move(MonitorHMP *hmp, const QDict *qdict)
 {
     int dx, dy, dz, button;
     const char *dx_str = qdict_get_str(qdict, "dx_str");
@@ -53,7 +53,7 @@ void hmp_mouse_move(Monitor *mon, const QDict *qdict)
     qemu_input_event_sync();
 }
 
-void hmp_mouse_button(Monitor *mon, const QDict *qdict)
+void hmp_mouse_button(MonitorHMP *hmp, const QDict *qdict)
 {
     /* HMP mouse_button bitmask: 1=L, 2=R, 4=M */
     static uint32_t bmap[INPUT_BUTTON__MAX] = {
@@ -71,16 +71,18 @@ void hmp_mouse_button(Monitor *mon, const QDict *qdict)
     mouse_button_state = button_state;
 }
 
-void hmp_mouse_set(Monitor *mon, const QDict *qdict)
+void hmp_mouse_set(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
 
     qemu_mouse_set(qdict_get_int(qdict, "index"), &err);
     hmp_handle_error(mon, err);
 }
 
-void hmp_info_mice(Monitor *mon, const QDict *qdict)
+void hmp_info_mice(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     MouseInfoList *mice_list, *mouse;
 
     mice_list = qmp_query_mice(NULL);
@@ -148,8 +150,9 @@ static void hmp_info_vnc_servers(Monitor *mon, VncServerInfo2List *server)
     }
 }
 
-void hmp_info_vnc(Monitor *mon, const QDict *qdict)
+void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     VncInfo2List *info2l, *info2l_head;
     Error *err = NULL;
 
@@ -189,8 +192,9 @@ void hmp_info_vnc(Monitor *mon, const QDict *qdict)
 #endif
 
 #ifdef CONFIG_SPICE
-void hmp_info_spice(Monitor *mon, const QDict *qdict)
+void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     SpiceChannelList *chan;
     SpiceInfo *info;
     const char *channel_name;
@@ -260,8 +264,9 @@ out:
 }
 #endif
 
-void hmp_set_password(Monitor *mon, const QDict *qdict)
+void hmp_set_password(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *protocol  = qdict_get_str(qdict, "protocol");
     const char *password  = qdict_get_str(qdict, "password");
     const char *display = qdict_get_try_str(qdict, "display");
@@ -295,8 +300,9 @@ out:
     hmp_handle_error(mon, err);
 }
 
-void hmp_expire_password(Monitor *mon, const QDict *qdict)
+void hmp_expire_password(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *protocol  = qdict_get_str(qdict, "protocol");
     const char *whenstr = qdict_get_str(qdict, "time");
     const char *display = qdict_get_try_str(qdict, "display");
@@ -366,8 +372,9 @@ static int index_from_key(const char *key, size_t key_length)
     return i;
 }
 
-void hmp_sendkey(Monitor *mon, const QDict *qdict)
+void hmp_sendkey(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *keys = qdict_get_str(qdict, "keys");
     KeyValue *v = NULL;
     KeyValueList *head = NULL, **tail = &head;
@@ -456,8 +463,9 @@ void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
 
 #ifdef CONFIG_PIXMAN
 void coroutine_fn
-hmp_screendump(Monitor *mon, const QDict *qdict)
+hmp_screendump(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     const char *filename = qdict_get_str(qdict, "filename");
     const char *id = qdict_get_try_str(qdict, "device");
     int64_t head = qdict_get_try_int(qdict, "head", 0);
@@ -478,8 +486,9 @@ end:
 }
 #endif
 
-void hmp_client_migrate_info(Monitor *mon, const QDict *qdict)
+void hmp_client_migrate_info(MonitorHMP *hmp, const QDict *qdict)
 {
+    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *protocol = qdict_get_str(qdict, "protocol");
     const char *hostname = qdict_get_str(qdict, "hostname");

-- 
2.55.0.543.g5ebe2ebe4ea8


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 37/49] monitor: tighten monitor_printf*()
       [not found] <20260816-qemu-no-hmp-v3-0-e53fc35bc550@redhat.com>
  2026-08-16 19:12 ` [PATCH v3 04/49] target/i386: decouple cpu_x86_inject_mce() from Monitor Marc-André Lureau
  2026-08-16 19:12 ` [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP Marc-André Lureau
@ 2026-08-16 19:13 ` Marc-André Lureau
  2026-08-17 18:09   ` Jason J. Herne
  2026-08-16 19:13 ` [PATCH v3 41/49] Guard HMP command implementations with CONFIG_HMP Marc-André Lureau
  3 siblings, 1 reply; 8+ messages in thread
From: Marc-André Lureau @ 2026-08-16 19:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marc-André Lureau, Philippe Mathieu-Daudé,
	Daniel P. Berrangé, Markus Armbruster, Gerd Hoffmann,
	Gonglei (Arei), zhenwei pi, Kevin Wolf, Hanna Reitz,
	Paolo Bonzini, Alex Bennée, Pierrick Bouvier, Ani Sinha,
	Laurent Vivier, Amit Shah, Michael S. Tsirkin, Brian Cain,
	David Woodhouse, Paul Durrant, Richard Henderson, Marcelo Tosatti,
	Mark Cave-Ayland, Jiri Pirko, Jason Wang, Halil Pasic,
	Christian Borntraeger, Jason Herne, Cornelia Huck, Eric Farman,
	Matthew Rosato, Ilya Leoshkevich, David Hildenbrand,
	Stefano Stabellini, Anthony PERARD, Edgar E. Iglesias,
	Dr. David Alan Gilbert, Hyman Huang, Peter Xu, Fabiano Rosas,
	Samuel Thibault, Stefan Berger, Zhao Liu, Nicholas Piggin,
	Chinmay Rath, Glenn Miles, Harsh Prateek Bora, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, Daniel Henrique Barboza, Liu Zhiwei,
	Chao Liu, Yoshinori Sato, Artyom Tarasenko, Max Filippov,
	Stefan Hajnoczi, qemu-block, kvm, qemu-ppc, qemu-s390x, xen-devel,
	qemu-riscv

Rename monitor_printf->monitor_hmp_printf, monitor_vprintf->
monitor_hmp_vprintf, and monitor_printc->monitor_hmp_printc, changing
the first parameter from Monitor * to MonitorHMP * to enforce type
safety. The implementation is also simplified: monitor_hmp_vprintf now
directly calls g_strdup_vprintf + monitor_puts, removing the virtual
dispatch via moncls->vprintf.

The dev_print() callbacks are temporarily using the MONITOR_HMP(mon)
cast, they are fixed in the following commits.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 audio/audio-hmp-cmds.c                  |   6 +-
 backends/cryptodev-hmp-cmds.c           |   9 +-
 block/monitor/block-hmp-cmds.c          | 170 +++++++++---------
 chardev/char-hmp-cmds.c                 |  12 +-
 disas/disas-mon.c                       |  10 +-
 docs/devel/style.rst                    |   2 +-
 docs/devel/writing-monitor-commands.rst |   8 +-
 dump/dump-hmp-cmds.c                    |   5 +-
 hw/char/virtio-serial-bus.c             |  10 +-
 hw/core/machine-hmp-cmds.c              | 213 +++++++++++-----------
 hw/core/sysbus.c                        |   5 +-
 hw/hexagon/hexagon_tlb.c                |  44 ++---
 hw/i386/kvm/xen-stubs.c                 |   6 +-
 hw/i386/kvm/xen_evtchn.c                |  21 +--
 hw/i386/sgx-hmp-stub.c                  |   3 +-
 hw/i386/sgx.c                           |  29 ++-
 hw/misc/auxbus.c                        |   9 +-
 hw/misc/mos6522-stub.c                  |   3 +-
 hw/net/rocker/rocker-hmp-cmds.c         | 146 ++++++++-------
 hw/pci/pci-hmp-cmds.c                   | 114 ++++++------
 hw/pci/pci-stub.c                       |   3 +-
 hw/s390x/s390-skeys.c                   |   9 +-
 hw/s390x/s390-stattrib.c                |  20 +--
 hw/uefi/ovmf-log.c                      |   5 +-
 hw/usb/bus.c                            |  11 +-
 hw/usb/host-libusb.c                    |  21 ++-
 hw/virtio/virtio-hmp-cmds.c             | 297 +++++++++++++++----------------
 hw/xen/xen-bus.c                        |   5 +-
 include/disas/disas.h                   |   4 +-
 include/monitor/hmp.h                   |  12 +-
 migration/dirtyrate.c                   |  46 +++--
 migration/migration-hmp-cmds.c          | 305 ++++++++++++++++----------------
 monitor/hmp-cmds.c                      | 141 +++++++--------
 monitor/hmp.c                           | 143 +++++++--------
 monitor/monitor-internal.h              |   6 -
 monitor/monitor.c                       |  33 ++--
 net/net-hmp-cmds.c                      |  31 ++--
 net/slirp.c                             |  31 ++--
 qom/qom-hmp-cmds.c                      |  27 ++-
 replay/replay-debugging.c               |   5 +-
 stats/stats-hmp-cmds.c                  |  57 +++---
 stubs/hmp-cmd-info_sev.c                |   3 +-
 stubs/monitor-core.c                    |   2 +-
 system/dirtylimit-hmp-cmds.c            |  10 +-
 system/qdev-monitor.c                   |  19 +-
 system/runstate-hmp-cmds.c              |  16 +-
 system/tpm-hmp-cmds.c                   |  29 ++-
 target/i386/cpu-apic.c                  |   3 +-
 target/i386/monitor.c                   | 152 ++++++++--------
 target/i386/sev.c                       |  35 ++--
 target/m68k/monitor.c                   |   3 +-
 target/ppc/monitor.c                    |   3 +-
 target/riscv/monitor.c                  |  55 +++---
 target/sh4/monitor.c                    |  29 ++-
 target/sparc/monitor.c                  |   3 +-
 target/xtensa/monitor.c                 |   3 +-
 tests/unit/test-util-sockets.c          |   2 +-
 tools/qemu-vnc/clipboard.c              |   4 +-
 tools/qemu-vnc/stubs.c                  |   2 +-
 trace/trace-hmp-cmds.c                  |  12 +-
 ui/ui-hmp-cmds.c                        | 115 ++++++------
 util/error-report.c                     |   2 +-
 util/qemu-print.c                       |   4 +-
 63 files changed, 1214 insertions(+), 1329 deletions(-)

diff --git a/audio/audio-hmp-cmds.c b/audio/audio-hmp-cmds.c
index 4d326ec99fdf..94182fe1d71f 100644
--- a/audio/audio-hmp-cmds.c
+++ b/audio/audio-hmp-cmds.c
@@ -34,14 +34,13 @@ static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
 
 void hmp_info_capture(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int i;
     CaptureState *s;
 
     warn_report_once("'info capture' is deprecated since v10.2, to be removed");
 
     for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
-        monitor_printf(mon, "[%d]: ", i);
+        monitor_hmp_printf(hmp, "[%d]: ", i);
         s->ops.info (s->opaque);
     }
 }
@@ -66,7 +65,6 @@ void hmp_stopcapture(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_wavcapture(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_str(qdict, "path");
     int freq = qdict_get_try_int(qdict, "freq", 44100);
     int bits = qdict_get_try_int(qdict, "bits", 16);
@@ -86,7 +84,7 @@ void hmp_wavcapture(MonitorHMP *hmp, const QDict *qdict)
     s = g_malloc0 (sizeof (*s));
 
     if (wav_start_capture(as, s, path, freq, bits, nchannels)) {
-        monitor_printf(mon, "Failed to add wave capture\n");
+        monitor_hmp_printf(hmp, "Failed to add wave capture\n");
         g_free (s);
         return;
     }
diff --git a/backends/cryptodev-hmp-cmds.c b/backends/cryptodev-hmp-cmds.c
index fb62428d795a..aafa4b970d24 100644
--- a/backends/cryptodev-hmp-cmds.c
+++ b/backends/cryptodev-hmp-cmds.c
@@ -19,7 +19,6 @@
 
 void hmp_info_cryptodev(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     QCryptodevInfoList *il;
     QCryptodevBackendServiceTypeList *sl;
     QCryptodevBackendClientList *cl;
@@ -41,13 +40,13 @@ void hmp_info_cryptodev(MonitorHMP *hmp, const QDict *qdict)
                 services = tmp_services;
             }
         }
-        monitor_printf(mon, "%s: service=[%s]\n", info->id, services);
+        monitor_hmp_printf(hmp, "%s: service=[%s]\n", info->id, services);
 
         for (cl = info->client; cl; cl = cl->next) {
             QCryptodevBackendClient *client = cl->value;
-            monitor_printf(mon, "    queue %" PRIu32 ": type=%s\n",
-                           client->queue,
-                           QCryptodevBackendType_str(client->type));
+            monitor_hmp_printf(hmp, "    queue %" PRIu32 ": type=%s\n",
+                               client->queue,
+                               QCryptodevBackendType_str(client->type));
         }
     }
 
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
index a2666e2f1b9b..7bae4d425c6d 100644
--- a/block/monitor/block-hmp-cmds.c
+++ b/block/monitor/block-hmp-cmds.c
@@ -89,7 +89,6 @@ out:
 
 void hmp_drive_add(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     DriveInfo *dinfo;
     QemuOpts *opts;
@@ -119,7 +118,7 @@ void hmp_drive_add(MonitorHMP *hmp, const QDict *qdict)
 
     switch (dinfo->type) {
     case IF_NONE:
-        monitor_printf(mon, "OK\n");
+        monitor_hmp_printf(hmp, "OK\n");
         break;
     default:
         error_setg(&err, "Can't hot-add drive to type %d", dinfo->type);
@@ -552,9 +551,10 @@ void hmp_qemu_io(MonitorHMP *hmp, const QDict *qdict)
     hmp_handle_error(hmp, err);
 }
 
-static void print_block_info(Monitor *mon, BlockInfo *info,
+static void print_block_info(MonitorHMP *hmp, BlockInfo *info,
                              BlockDeviceInfo *inserted, bool verbose)
 {
+    Monitor *mon = MONITOR(hmp);
     ImageInfo *image_info;
 
     assert(!info || !info->inserted || info->inserted == inserted);
@@ -562,7 +562,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
     if (info && *info->device) {
         monitor_puts(mon, info->device);
         if (inserted && inserted->node_name) {
-            monitor_printf(mon, " (%s)", inserted->node_name);
+            monitor_hmp_printf(hmp, " (%s)", inserted->node_name);
         }
     } else {
         assert(info || inserted);
@@ -573,29 +573,29 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
     }
 
     if (inserted) {
-        monitor_printf(mon, ": %s (%s%s%s%s)\n",
-                       inserted->file,
-                       inserted->drv,
-                       inserted->ro ? ", read-only" : "",
-                       inserted->encrypted ? ", encrypted" : "",
-                       inserted->active ? "" : ", inactive");
+        monitor_hmp_printf(hmp, ": %s (%s%s%s%s)\n",
+                           inserted->file,
+                           inserted->drv,
+                           inserted->ro ? ", read-only" : "",
+                           inserted->encrypted ? ", encrypted" : "",
+                           inserted->active ? "" : ", inactive");
     } else {
-        monitor_printf(mon, ": [not inserted]\n");
+        monitor_hmp_printf(hmp, ": [not inserted]\n");
     }
 
     if (info) {
         if (info->qdev) {
-            monitor_printf(mon, "    Attached to:      %s\n", info->qdev);
+            monitor_hmp_printf(hmp, "    Attached to:      %s\n", info->qdev);
         }
         if (info->has_io_status && info->io_status != BLOCK_DEVICE_IO_STATUS_OK) {
-            monitor_printf(mon, "    I/O status:       %s\n",
-                           BlockDeviceIoStatus_str(info->io_status));
+            monitor_hmp_printf(hmp, "    I/O status:       %s\n",
+                               BlockDeviceIoStatus_str(info->io_status));
         }
 
         if (info->removable) {
-            monitor_printf(mon, "    Removable device: %slocked, tray %s\n",
-                           info->locked ? "" : "not ",
-                           info->tray_open ? "open" : "closed");
+            monitor_hmp_printf(hmp, "    Removable device: %slocked, tray %s\n",
+                               info->locked ? "" : "not ",
+                               info->tray_open ? "open" : "closed");
         }
     }
 
@@ -604,28 +604,28 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
         return;
     }
 
-    monitor_printf(mon, "    Cache mode:       %s%s%s\n",
-                   inserted->cache->writeback ? "writeback" : "writethrough",
-                   inserted->cache->direct ? ", direct" : "",
-                   inserted->cache->no_flush ? ", ignore flushes" : "");
+    monitor_hmp_printf(hmp, "    Cache mode:       %s%s%s\n",
+                       inserted->cache->writeback ? "writeback" : "writethrough",
+                       inserted->cache->direct ? ", direct" : "",
+                       inserted->cache->no_flush ? ", ignore flushes" : "");
 
     if (inserted->backing_file) {
-        monitor_printf(mon,
-                       "    Backing file:     %s "
-                       "(chain depth: %" PRId64 ")\n",
-                       inserted->backing_file,
-                       inserted->backing_file_depth);
+        monitor_hmp_printf(hmp,
+                           "    Backing file:     %s "
+                           "(chain depth: %" PRId64 ")\n",
+                           inserted->backing_file,
+                           inserted->backing_file_depth);
     }
 
     if (inserted->detect_zeroes != BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF) {
-        monitor_printf(mon, "    Detect zeroes:    %s\n",
+        monitor_hmp_printf(hmp, "    Detect zeroes:    %s\n",
                 BlockdevDetectZeroesOptions_str(inserted->detect_zeroes));
     }
 
     if (inserted->bps  || inserted->bps_rd  || inserted->bps_wr  ||
         inserted->iops || inserted->iops_rd || inserted->iops_wr)
     {
-        monitor_printf(mon, "    I/O throttling:   bps=%" PRId64
+        monitor_hmp_printf(hmp, "    I/O throttling:   bps=%" PRId64
                         " bps_rd=%" PRId64  " bps_wr=%" PRId64
                         " bps_max=%" PRId64
                         " bps_rd_max=%" PRId64
@@ -654,7 +654,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
     }
 
     if (verbose) {
-        monitor_printf(mon, "\nImages:\n");
+        monitor_hmp_printf(hmp, "\nImages:\n");
         image_info = inserted->image;
         while (1) {
             bdrv_node_info_dump(qapi_ImageInfo_base(image_info), 0, false);
@@ -669,7 +669,6 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
 
 void hmp_info_block(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     BlockInfoList *block_list, *info;
     BlockDeviceInfoList *blockdev_list, *blockdev;
     const char *device = qdict_get_try_str(qdict, "device");
@@ -690,10 +689,10 @@ void hmp_info_block(MonitorHMP *hmp, const QDict *qdict)
         }
 
         if (info != block_list) {
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
 
-        print_block_info(mon, info->value, info->value->inserted,
+        print_block_info(hmp, info->value, info->value->inserted,
                          verbose);
         printed = true;
     }
@@ -713,17 +712,16 @@ void hmp_info_block(MonitorHMP *hmp, const QDict *qdict)
         }
 
         if (blockdev != blockdev_list) {
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
 
-        print_block_info(mon, NULL, blockdev->value, verbose);
+        print_block_info(hmp, NULL, blockdev->value, verbose);
     }
     qapi_free_BlockDeviceInfoList(blockdev_list);
 }
 
 void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     BlockStatsList *stats_list, *stats;
 
     stats_list = qmp_query_blockstats(false, false, NULL);
@@ -733,28 +731,28 @@ void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict)
             continue;
         }
 
-        monitor_printf(mon, "%s%s: idle_time_ns=%" PRId64 "\n",
-                       stats != stats_list ? "\n" : "",
-                       stats->value->device,
-                       stats->value->stats->idle_time_ns);
-        monitor_printf(mon, "       %24s %16s %24s %10s\n", "bytes",
-                       "operations", "total_time_ns", "merged");
-        monitor_printf(mon, "Read:  %24" PRId64 " %16" PRId64 " %24" PRId64
-                       " %10" PRId64 "\n",
-                       stats->value->stats->rd_bytes,
-                       stats->value->stats->rd_operations,
-                       stats->value->stats->rd_total_time_ns,
-                       stats->value->stats->rd_merged);
-        monitor_printf(mon, "Write: %24" PRId64 " %16" PRId64 " %24" PRId64
-                       " %10" PRId64 "\n",
-                       stats->value->stats->wr_bytes,
-                       stats->value->stats->wr_operations,
-                       stats->value->stats->wr_total_time_ns,
-                       stats->value->stats->wr_merged);
-        monitor_printf(mon, "Flush: %24s %16" PRId64 " %24" PRId64 "\n",
-                       "",
-                       stats->value->stats->flush_operations,
-                       stats->value->stats->flush_total_time_ns);
+        monitor_hmp_printf(hmp, "%s%s: idle_time_ns=%" PRId64 "\n",
+                           stats != stats_list ? "\n" : "",
+                           stats->value->device,
+                           stats->value->stats->idle_time_ns);
+        monitor_hmp_printf(hmp, "       %24s %16s %24s %10s\n", "bytes",
+                           "operations", "total_time_ns", "merged");
+        monitor_hmp_printf(hmp, "Read:  %24" PRId64 " %16" PRId64 " %24" PRId64
+                           " %10" PRId64 "\n",
+                           stats->value->stats->rd_bytes,
+                           stats->value->stats->rd_operations,
+                           stats->value->stats->rd_total_time_ns,
+                           stats->value->stats->rd_merged);
+        monitor_hmp_printf(hmp, "Write: %24" PRId64 " %16" PRId64 " %24" PRId64
+                           " %10" PRId64 "\n",
+                           stats->value->stats->wr_bytes,
+                           stats->value->stats->wr_operations,
+                           stats->value->stats->wr_total_time_ns,
+                           stats->value->stats->wr_merged);
+        monitor_hmp_printf(hmp, "Flush: %24s %16" PRId64 " %24" PRId64 "\n",
+                           "",
+                           stats->value->stats->flush_operations,
+                           stats->value->stats->flush_total_time_ns);
     }
 
     qapi_free_BlockStatsList(stats_list);
@@ -762,34 +760,33 @@ void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_block_jobs(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     BlockJobInfoList *list;
 
     list = qmp_query_block_jobs(&error_abort);
 
     if (!list) {
-        monitor_printf(mon, "No active jobs\n");
+        monitor_hmp_printf(hmp, "No active jobs\n");
         return;
     }
 
     while (list) {
         if (list->value->type == JOB_TYPE_STREAM) {
-            monitor_printf(mon, "Streaming device %s: Completed %" PRId64
-                           " of %" PRId64 " bytes, speed limit %" PRId64
-                           " bytes/s\n",
-                           list->value->device,
-                           list->value->offset,
-                           list->value->len,
-                           list->value->speed);
+            monitor_hmp_printf(hmp, "Streaming device %s: Completed %" PRId64
+                               " of %" PRId64 " bytes, speed limit %" PRId64
+                               " bytes/s\n",
+                               list->value->device,
+                               list->value->offset,
+                               list->value->len,
+                               list->value->speed);
         } else {
-            monitor_printf(mon, "Type %s, device %s: Completed %" PRId64
-                           " of %" PRId64 " bytes, speed limit %" PRId64
-                           " bytes/s\n",
-                           JobType_str(list->value->type),
-                           list->value->device,
-                           list->value->offset,
-                           list->value->len,
-                           list->value->speed);
+            monitor_hmp_printf(hmp, "Type %s, device %s: Completed %" PRId64
+                               " of %" PRId64 " bytes, speed limit %" PRId64
+                               " bytes/s\n",
+                               JobType_str(list->value->type),
+                               list->value->device,
+                               list->value->offset,
+                               list->value->len,
+                               list->value->speed);
         }
         list = list->next;
     }
@@ -799,7 +796,6 @@ void hmp_info_block_jobs(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     BlockDriverState *bs, *bs1;
     BdrvNextIterator it1;
     QEMUSnapshotInfo *sn_tab, *sn;
@@ -837,7 +833,7 @@ void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
 
     if (nb_sns < 0) {
-        monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
+        monitor_hmp_printf(hmp, "bdrv_snapshot_list: error %d\n", nb_sns);
         return;
     }
 
@@ -866,7 +862,7 @@ void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
     }
 
     if (no_snapshot) {
-        monitor_printf(mon, "There is no snapshot available.\n");
+        monitor_hmp_printf(hmp, "There is no snapshot available.\n");
         return;
     }
 
@@ -889,11 +885,11 @@ void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
             }
         }
     }
-    monitor_printf(mon, "List of snapshots present on all disks:\n");
+    monitor_hmp_printf(hmp, "List of snapshots present on all disks:\n");
 
     if (total > 0) {
         bdrv_snapshot_dump(NULL);
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
         for (i = 0; i < total; i++) {
             sn = &sn_tab[global_snapshots[i]];
             /*
@@ -902,24 +898,24 @@ void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
              */
             pstrcpy(sn->id_str, sizeof(sn->id_str), "--");
             bdrv_snapshot_dump(sn);
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
     } else {
-        monitor_printf(mon, "None\n");
+        monitor_hmp_printf(hmp, "None\n");
     }
 
     QTAILQ_FOREACH(image_entry, &image_list, next) {
         if (QTAILQ_EMPTY(&image_entry->snapshots)) {
             continue;
         }
-        monitor_printf(mon,
-                       "\nList of partial (non-loadable) snapshots on '%s':\n",
-                       image_entry->imagename);
+        monitor_hmp_printf(hmp,
+                           "\nList of partial (non-loadable) snapshots on '%s':\n",
+                           image_entry->imagename);
         bdrv_snapshot_dump(NULL);
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
         QTAILQ_FOREACH(snapshot_entry, &image_entry->snapshots, next) {
             bdrv_snapshot_dump(&snapshot_entry->sn);
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
     }
 
@@ -935,7 +931,7 @@ void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
     g_free(global_snapshots);
 }
 
-void hmp_change_medium(Monitor *mon, const char *device, const char *target,
+void hmp_change_medium(MonitorHMP *hmp, const char *device, const char *target,
                        const char *arg, const char *read_only, bool force,
                        Error **errp)
 {
diff --git a/chardev/char-hmp-cmds.c b/chardev/char-hmp-cmds.c
index 71017fd2d19e..fb0560054b7b 100644
--- a/chardev/char-hmp-cmds.c
+++ b/chardev/char-hmp-cmds.c
@@ -26,12 +26,11 @@
 
 void hmp_info_chardev(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     ChardevInfoList *char_info, *info;
 
     char_info = qmp_query_chardev(NULL);
     for (info = char_info; info; info = info->next) {
-        monitor_printf(mon, "%s: filename=%s\n", info->value->label,
+        monitor_hmp_printf(hmp, "%s: filename=%s\n", info->value->label,
                                                  info->value->filename);
     }
 
@@ -51,7 +50,6 @@ void hmp_ringbuf_write(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_ringbuf_read(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     uint32_t size = qdict_get_int(qdict, "size");
     const char *chardev = qdict_get_str(qdict, "device");
     char *data;
@@ -67,15 +65,15 @@ void hmp_ringbuf_read(MonitorHMP *hmp, const QDict *qdict)
         unsigned char ch = data[i];
 
         if (ch == '\\') {
-            monitor_printf(mon, "\\\\");
+            monitor_hmp_printf(hmp, "\\\\");
         } else if ((ch < 0x20 && ch != '\n' && ch != '\t') || ch == 0x7F) {
-            monitor_printf(mon, "\\u%04X", ch);
+            monitor_hmp_printf(hmp, "\\u%04X", ch);
         } else {
-            monitor_printf(mon, "%c", ch);
+            monitor_hmp_printf(hmp, "%c", ch);
         }
 
     }
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
     g_free(data);
 }
 
diff --git a/disas/disas-mon.c b/disas/disas-mon.c
index bc9dec3a7761..32e4220181a8 100644
--- a/disas/disas-mon.c
+++ b/disas/disas-mon.c
@@ -38,7 +38,7 @@ physical_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
 }
 
 /* Disassembler for the monitor.  */
-void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
+void monitor_disas(MonitorHMP *hmp, CPUState *cpu, uint64_t pc,
                    int nb_insn, bool is_physical)
 {
     int count, i;
@@ -58,13 +58,13 @@ void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
     s.info.buffer_vma = pc;
 
     if (s.info.cap_arch >= 0 && cap_disas_monitor(&s.info, pc, nb_insn)) {
-        monitor_puts(mon, ds->str);
+        monitor_puts(MONITOR(hmp), ds->str);
         return;
     }
 
     if (!s.info.print_insn) {
-        monitor_printf(mon, "0x%08" PRIx64
-                       ": Asm output not supported on this arch\n", pc);
+        monitor_hmp_printf(hmp, "0x%08" PRIx64
+                           ": Asm output not supported on this arch\n", pc);
         return;
     }
 
@@ -78,5 +78,5 @@ void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
         pc += count;
     }
 
-    monitor_puts(mon, ds->str);
+    monitor_puts(MONITOR(hmp), ds->str);
 }
diff --git a/docs/devel/style.rst b/docs/devel/style.rst
index 6c5f94cc5098..6876d3a59ec7 100644
--- a/docs/devel/style.rst
+++ b/docs/devel/style.rst
@@ -754,7 +754,7 @@ Error handling and reporting
 Reporting errors to the human user
 ----------------------------------
 
-Do not use printf(), fprintf() or monitor_printf().  Instead, use
+Do not use printf(), fprintf() or monitor_hmp_printf().  Instead, use
 error_report() or error_vreport() from error-report.h.  This ensures the
 error is reported in the right place (current monitor or stderr), and in
 a uniform format.
diff --git a/docs/devel/writing-monitor-commands.rst b/docs/devel/writing-monitor-commands.rst
index 7ae7efe32759..baf94cbdefab 100644
--- a/docs/devel/writing-monitor-commands.rst
+++ b/docs/devel/writing-monitor-commands.rst
@@ -479,7 +479,7 @@ The HMP command
 
 Here's the HMP counterpart of the query-option-roms command::
 
- void hmp_info_option_roms(Monitor *mon, const QDict *qdict)
+ void hmp_info_option_roms(MonitorHMP *mon, const QDict *qdict)
  {
      Error *err = NULL;
      OptionRomInfoList *info_list, *tail;
@@ -492,11 +492,11 @@ Here's the HMP counterpart of the query-option-roms command::
 
      for (tail = info_list; tail; tail = tail->next) {
          info = tail->value;
-         monitor_printf(mon, "%s", info->filename);
+         monitor_hmp_printf(mon, "%s", info->filename);
          if (info->has_bootindex) {
-             monitor_printf(mon, " %" PRId64, info->bootindex);
+             monitor_hmp_printf(mon, " %" PRId64, info->bootindex);
          }
-         monitor_printf(mon, "\n");
+         monitor_hmp_printf(mon, "\n");
      }
 
      qapi_free_OptionRomInfoList(info_list);
diff --git a/dump/dump-hmp-cmds.c b/dump/dump-hmp-cmds.c
index 104ab5d2a53a..c7045c2d7314 100644
--- a/dump/dump-hmp-cmds.c
+++ b/dump/dump-hmp-cmds.c
@@ -85,17 +85,16 @@ void hmp_dump_guest_memory(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_dump(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     DumpQueryResult *result = qmp_query_dump(NULL);
 
     assert(result && result->status < DUMP_STATUS__MAX);
-    monitor_printf(mon, "Status: %s\n", DumpStatus_str(result->status));
+    monitor_hmp_printf(hmp, "Status: %s\n", DumpStatus_str(result->status));
 
     if (result->status == DUMP_STATUS_ACTIVE) {
         float percent = 0;
         assert(result->total != 0);
         percent = 100.0 * result->completed / result->total;
-        monitor_printf(mon, "Finished: %.2f %%\n", percent);
+        monitor_hmp_printf(hmp, "Finished: %.2f %%\n", percent);
     }
 
     qapi_free_DumpQueryResult(result);
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
index 02604740f86a..33fdc0846ac3 100644
--- a/hw/char/virtio-serial-bus.c
+++ b/hw/char/virtio-serial-bus.c
@@ -838,11 +838,11 @@ static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(qdev);
 
-    monitor_printf(mon, "%*sport %d, guest %s, host %s, throttle %s\n",
-                   indent, "", port->id,
-                   port->guest_connected ? "on" : "off",
-                   port->host_connected ? "on" : "off",
-                   port->throttled ? "on" : "off");
+    monitor_hmp_printf(MONITOR_HMP(mon), "%*sport %d, guest %s, host %s, throttle %s\n",
+                       indent, "", port->id,
+                       port->guest_connected ? "on" : "off",
+                       port->host_connected ? "on" : "off",
+                       port->throttled ? "on" : "off");
 }
 
 /* This function is only used if a port id is not provided by the user */
diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
index 702c798ccc56..10a633af0780 100644
--- a/hw/core/machine-hmp-cmds.c
+++ b/hw/core/machine-hmp-cmds.c
@@ -27,7 +27,6 @@
 
 void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CpuInfoFastList *cpu_list, *cpu;
 
     cpu_list = qmp_query_cpus_fast(NULL);
@@ -40,10 +39,10 @@ void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict)
             active = '*';
         }
 
-        monitor_printf(mon, "%c CPU #%" PRId64 ":", active,
-                       cpu->value->cpu_index);
-        monitor_printf(mon, " thread_id=%" PRId64 " model=%s\n",
-                       cpu->value->thread_id, cpu_model);
+        monitor_hmp_printf(hmp, "%c CPU #%" PRId64 ":", active,
+                           cpu->value->cpu_index);
+        monitor_hmp_printf(hmp, " thread_id=%" PRId64 " model=%s\n",
+                           cpu->value->thread_id, cpu_model);
     }
 
     qapi_free_CpuInfoFastList(cpu_list);
@@ -51,7 +50,6 @@ void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err);
     HotpluggableCPUList *saved = l;
@@ -61,45 +59,45 @@ void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "Hotpluggable CPUs:\n");
+    monitor_hmp_printf(hmp, "Hotpluggable CPUs:\n");
     while (l) {
-        monitor_printf(mon, "  type: \"%s\"\n", l->value->type);
-        monitor_printf(mon, "  vcpus_count: \"%" PRIu64 "\"\n",
-                       l->value->vcpus_count);
+        monitor_hmp_printf(hmp, "  type: \"%s\"\n", l->value->type);
+        monitor_hmp_printf(hmp, "  vcpus_count: \"%" PRIu64 "\"\n",
+                           l->value->vcpus_count);
         if (l->value->qom_path) {
-            monitor_printf(mon, "  qom_path: \"%s\"\n", l->value->qom_path);
+            monitor_hmp_printf(hmp, "  qom_path: \"%s\"\n", l->value->qom_path);
         }
 
         c = l->value->props;
-        monitor_printf(mon, "  CPUInstance Properties:\n");
+        monitor_hmp_printf(hmp, "  CPUInstance Properties:\n");
         if (c->has_node_id) {
-            monitor_printf(mon, "    node-id: \"%" PRIu64 "\"\n", c->node_id);
+            monitor_hmp_printf(hmp, "    node-id: \"%" PRIu64 "\"\n", c->node_id);
         }
         if (c->has_drawer_id) {
-            monitor_printf(mon, "    drawer-id: \"%" PRIu64 "\"\n", c->drawer_id);
+            monitor_hmp_printf(hmp, "    drawer-id: \"%" PRIu64 "\"\n", c->drawer_id);
         }
         if (c->has_book_id) {
-            monitor_printf(mon, "    book-id: \"%" PRIu64 "\"\n", c->book_id);
+            monitor_hmp_printf(hmp, "    book-id: \"%" PRIu64 "\"\n", c->book_id);
         }
         if (c->has_socket_id) {
-            monitor_printf(mon, "    socket-id: \"%" PRIu64 "\"\n", c->socket_id);
+            monitor_hmp_printf(hmp, "    socket-id: \"%" PRIu64 "\"\n", c->socket_id);
         }
         if (c->has_die_id) {
-            monitor_printf(mon, "    die-id: \"%" PRIu64 "\"\n", c->die_id);
+            monitor_hmp_printf(hmp, "    die-id: \"%" PRIu64 "\"\n", c->die_id);
         }
         if (c->has_cluster_id) {
-            monitor_printf(mon, "    cluster-id: \"%" PRIu64 "\"\n",
-                           c->cluster_id);
+            monitor_hmp_printf(hmp, "    cluster-id: \"%" PRIu64 "\"\n",
+                               c->cluster_id);
         }
         if (c->has_module_id) {
-            monitor_printf(mon, "    module-id: \"%" PRIu64 "\"\n",
-                           c->module_id);
+            monitor_hmp_printf(hmp, "    module-id: \"%" PRIu64 "\"\n",
+                               c->module_id);
         }
         if (c->has_core_id) {
-            monitor_printf(mon, "    core-id: \"%" PRIu64 "\"\n", c->core_id);
+            monitor_hmp_printf(hmp, "    core-id: \"%" PRIu64 "\"\n", c->core_id);
         }
         if (c->has_thread_id) {
-            monitor_printf(mon, "    thread-id: \"%" PRIu64 "\"\n", c->thread_id);
+            monitor_hmp_printf(hmp, "    thread-id: \"%" PRIu64 "\"\n", c->thread_id);
         }
 
         l = l->next;
@@ -110,7 +108,6 @@ void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     MemdevList *memdev_list = qmp_query_memdev(&err);
     MemdevList *m = memdev_list;
@@ -120,31 +117,31 @@ void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict)
     while (m) {
         v = string_output_visitor_new(false, &str);
         visit_type_uint16List(v, NULL, &m->value->host_nodes, &error_abort);
-        monitor_printf(mon, "memory backend: %s\n", m->value->id);
-        monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
-        monitor_printf(mon, "  merge: %s\n",
-                       m->value->merge ? "true" : "false");
-        monitor_printf(mon, "  dump: %s\n",
-                       m->value->dump ? "true" : "false");
-        monitor_printf(mon, "  prealloc: %s\n",
-                       m->value->prealloc ? "true" : "false");
-        monitor_printf(mon, "  share: %s\n",
-                       m->value->share ? "true" : "false");
+        monitor_hmp_printf(hmp, "memory backend: %s\n", m->value->id);
+        monitor_hmp_printf(hmp, "  size:  %" PRId64 "\n", m->value->size);
+        monitor_hmp_printf(hmp, "  merge: %s\n",
+                           m->value->merge ? "true" : "false");
+        monitor_hmp_printf(hmp, "  dump: %s\n",
+                           m->value->dump ? "true" : "false");
+        monitor_hmp_printf(hmp, "  prealloc: %s\n",
+                           m->value->prealloc ? "true" : "false");
+        monitor_hmp_printf(hmp, "  share: %s\n",
+                           m->value->share ? "true" : "false");
         if (m->value->has_reserve) {
-            monitor_printf(mon, "  reserve: %s\n",
-                           m->value->reserve ? "true" : "false");
+            monitor_hmp_printf(hmp, "  reserve: %s\n",
+                               m->value->reserve ? "true" : "false");
         }
-        monitor_printf(mon, "  policy: %s\n",
-                       HostMemPolicy_str(m->value->policy));
+        monitor_hmp_printf(hmp, "  policy: %s\n",
+                           HostMemPolicy_str(m->value->policy));
         visit_complete(v, &str);
-        monitor_printf(mon, "  host nodes: %s\n", str);
+        monitor_hmp_printf(hmp, "  host nodes: %s\n", str);
 
         g_free(str);
         visit_free(v);
         m = m->next;
     }
 
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
 
     qapi_free_MemdevList(memdev_list);
     hmp_handle_error(hmp, err);
@@ -152,15 +149,14 @@ void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_kvm(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     KvmInfo *info;
 
     info = qmp_query_kvm(NULL);
-    monitor_printf(mon, "kvm support: ");
+    monitor_hmp_printf(hmp, "kvm support: ");
     if (info->present) {
-        monitor_printf(mon, "%s\n", info->enabled ? "enabled" : "disabled");
+        monitor_hmp_printf(hmp, "%s\n", info->enabled ? "enabled" : "disabled");
     } else {
-        monitor_printf(mon, "not compiled\n");
+        monitor_hmp_printf(hmp, "not compiled\n");
     }
 
     qapi_free_KvmInfo(info);
@@ -168,7 +164,6 @@ void hmp_info_kvm(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     AcceleratorInfo *info;
     AcceleratorList *accel;
 
@@ -176,9 +171,9 @@ void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict)
     for (accel = info->present; accel; accel = accel->next) {
         char trail = accel->next ? ' ' : '\n';
         if (info->enabled == accel->value) {
-            monitor_printf(mon, "[%s]%c", Accelerator_str(accel->value), trail);
+            monitor_hmp_printf(hmp, "[%s]%c", Accelerator_str(accel->value), trail);
         } else {
-            monitor_printf(mon, "%s%c", Accelerator_str(accel->value), trail);
+            monitor_hmp_printf(hmp, "%s%c", Accelerator_str(accel->value), trail);
         }
     }
 
@@ -187,17 +182,15 @@ void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_uuid(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     UuidInfo *info;
 
     info = qmp_query_uuid(NULL);
-    monitor_printf(mon, "%s\n", info->UUID);
+    monitor_hmp_printf(hmp, "%s\n", info->UUID);
     qapi_free_UuidInfo(info);
 }
 
 void hmp_info_balloon(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     BalloonInfo *info;
     Error *err = NULL;
 
@@ -206,7 +199,7 @@ void hmp_info_balloon(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "balloon: actual=%" PRId64 "\n", info->actual >> 20);
+    monitor_hmp_printf(hmp, "balloon: actual=%" PRId64 "\n", info->actual >> 20);
 
     qapi_free_BalloonInfo(info);
 }
@@ -223,7 +216,6 @@ void hmp_system_powerdown(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_memsave(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     uint32_t size = qdict_get_int(qdict, "size");
     const char *filename = qdict_get_str(qdict, "filename");
     uint64_t addr = qdict_get_int(qdict, "val");
@@ -231,7 +223,7 @@ void hmp_memsave(MonitorHMP *hmp, const QDict *qdict)
     int cpu_index = monitor_hmp_get_cpu_index(hmp);
 
     if (cpu_index < 0) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
 
@@ -277,7 +269,6 @@ void hmp_balloon(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     MemoryDeviceInfoList *info_list = qmp_query_memory_devices(&err);
     MemoryDeviceInfoList *info;
@@ -298,76 +289,76 @@ void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict)
             case MEMORY_DEVICE_INFO_KIND_NVDIMM:
                 di = value->type == MEMORY_DEVICE_INFO_KIND_DIMM ?
                      value->u.dimm.data : value->u.nvdimm.data;
-                monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                               MemoryDeviceInfoKind_str(value->type),
-                               di->id ? di->id : "");
-                monitor_printf(mon, "  addr: 0x%" PRIx64 "\n", di->addr);
-                monitor_printf(mon, "  slot: %" PRId64 "\n", di->slot);
-                monitor_printf(mon, "  node: %" PRId64 "\n", di->node);
-                monitor_printf(mon, "  size: %" PRIu64 "\n", di->size);
-                monitor_printf(mon, "  memdev: %s\n", di->memdev);
-                monitor_printf(mon, "  hotplugged: %s\n",
-                               di->hotplugged ? "true" : "false");
-                monitor_printf(mon, "  hotpluggable: %s\n",
-                               di->hotpluggable ? "true" : "false");
+                monitor_hmp_printf(hmp, "Memory device [%s]: \"%s\"\n",
+                                   MemoryDeviceInfoKind_str(value->type),
+                                   di->id ? di->id : "");
+                monitor_hmp_printf(hmp, "  addr: 0x%" PRIx64 "\n", di->addr);
+                monitor_hmp_printf(hmp, "  slot: %" PRId64 "\n", di->slot);
+                monitor_hmp_printf(hmp, "  node: %" PRId64 "\n", di->node);
+                monitor_hmp_printf(hmp, "  size: %" PRIu64 "\n", di->size);
+                monitor_hmp_printf(hmp, "  memdev: %s\n", di->memdev);
+                monitor_hmp_printf(hmp, "  hotplugged: %s\n",
+                                   di->hotplugged ? "true" : "false");
+                monitor_hmp_printf(hmp, "  hotpluggable: %s\n",
+                                   di->hotpluggable ? "true" : "false");
                 break;
             case MEMORY_DEVICE_INFO_KIND_VIRTIO_PMEM:
                 vpi = value->u.virtio_pmem.data;
-                monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                               MemoryDeviceInfoKind_str(value->type),
-                               vpi->id ? vpi->id : "");
-                monitor_printf(mon, "  memaddr: 0x%" PRIx64 "\n", vpi->memaddr);
-                monitor_printf(mon, "  size: %" PRIu64 "\n", vpi->size);
-                monitor_printf(mon, "  memdev: %s\n", vpi->memdev);
+                monitor_hmp_printf(hmp, "Memory device [%s]: \"%s\"\n",
+                                   MemoryDeviceInfoKind_str(value->type),
+                                   vpi->id ? vpi->id : "");
+                monitor_hmp_printf(hmp, "  memaddr: 0x%" PRIx64 "\n", vpi->memaddr);
+                monitor_hmp_printf(hmp, "  size: %" PRIu64 "\n", vpi->size);
+                monitor_hmp_printf(hmp, "  memdev: %s\n", vpi->memdev);
                 break;
             case MEMORY_DEVICE_INFO_KIND_VIRTIO_MEM:
                 vmi = value->u.virtio_mem.data;
-                monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                               MemoryDeviceInfoKind_str(value->type),
-                               vmi->id ? vmi->id : "");
-                monitor_printf(mon, "  memaddr: 0x%" PRIx64 "\n", vmi->memaddr);
-                monitor_printf(mon, "  node: %" PRId64 "\n", vmi->node);
-                monitor_printf(mon, "  requested-size: %" PRIu64 "\n",
-                               vmi->requested_size);
-                monitor_printf(mon, "  size: %" PRIu64 "\n", vmi->size);
-                monitor_printf(mon, "  max-size: %" PRIu64 "\n", vmi->max_size);
-                monitor_printf(mon, "  block-size: %" PRIu64 "\n",
-                               vmi->block_size);
-                monitor_printf(mon, "  memdev: %s\n", vmi->memdev);
+                monitor_hmp_printf(hmp, "Memory device [%s]: \"%s\"\n",
+                                   MemoryDeviceInfoKind_str(value->type),
+                                   vmi->id ? vmi->id : "");
+                monitor_hmp_printf(hmp, "  memaddr: 0x%" PRIx64 "\n", vmi->memaddr);
+                monitor_hmp_printf(hmp, "  node: %" PRId64 "\n", vmi->node);
+                monitor_hmp_printf(hmp, "  requested-size: %" PRIu64 "\n",
+                                   vmi->requested_size);
+                monitor_hmp_printf(hmp, "  size: %" PRIu64 "\n", vmi->size);
+                monitor_hmp_printf(hmp, "  max-size: %" PRIu64 "\n", vmi->max_size);
+                monitor_hmp_printf(hmp, "  block-size: %" PRIu64 "\n",
+                                   vmi->block_size);
+                monitor_hmp_printf(hmp, "  memdev: %s\n", vmi->memdev);
                 break;
             case MEMORY_DEVICE_INFO_KIND_SGX_EPC:
                 se = value->u.sgx_epc.data;
-                monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                               MemoryDeviceInfoKind_str(value->type),
-                               se->id ? se->id : "");
-                monitor_printf(mon, "  memaddr: 0x%" PRIx64 "\n", se->memaddr);
-                monitor_printf(mon, "  size: %" PRIu64 "\n", se->size);
-                monitor_printf(mon, "  node: %" PRId64 "\n", se->node);
-                monitor_printf(mon, "  memdev: %s\n", se->memdev);
+                monitor_hmp_printf(hmp, "Memory device [%s]: \"%s\"\n",
+                                   MemoryDeviceInfoKind_str(value->type),
+                                   se->id ? se->id : "");
+                monitor_hmp_printf(hmp, "  memaddr: 0x%" PRIx64 "\n", se->memaddr);
+                monitor_hmp_printf(hmp, "  size: %" PRIu64 "\n", se->size);
+                monitor_hmp_printf(hmp, "  node: %" PRId64 "\n", se->node);
+                monitor_hmp_printf(hmp, "  memdev: %s\n", se->memdev);
                 break;
             case MEMORY_DEVICE_INFO_KIND_HV_BALLOON:
                 hi = value->u.hv_balloon.data;
-                monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                               MemoryDeviceInfoKind_str(value->type),
-                               hi->id ? hi->id : "");
+                monitor_hmp_printf(hmp, "Memory device [%s]: \"%s\"\n",
+                                   MemoryDeviceInfoKind_str(value->type),
+                                   hi->id ? hi->id : "");
                 if (hi->has_memaddr) {
-                    monitor_printf(mon, "  memaddr: 0x%" PRIx64 "\n",
-                                   hi->memaddr);
+                    monitor_hmp_printf(hmp, "  memaddr: 0x%" PRIx64 "\n",
+                                       hi->memaddr);
                 }
-                monitor_printf(mon, "  max-size: %" PRIu64 "\n", hi->max_size);
+                monitor_hmp_printf(hmp, "  max-size: %" PRIu64 "\n", hi->max_size);
                 if (hi->memdev) {
-                    monitor_printf(mon, "  memdev: %s\n", hi->memdev);
+                    monitor_hmp_printf(hmp, "  memdev: %s\n", hi->memdev);
                 }
                 break;
             case MEMORY_DEVICE_INFO_KIND_SP_MEM:
                 spmi = value->u.sp_mem.data;
-                monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                               MemoryDeviceInfoKind_str(value->type),
-                               spmi->id ? spmi->id : "");
-                monitor_printf(mon, "  addr: 0x%" PRIx64 "\n", spmi->addr);
-                monitor_printf(mon, "  node: %" PRId64 "\n", spmi->node);
-                monitor_printf(mon, "  size: %" PRIu64 "\n", spmi->size);
-                monitor_printf(mon, "  memdev: %s\n", spmi->memdev);
+                monitor_hmp_printf(hmp, "Memory device [%s]: \"%s\"\n",
+                                   MemoryDeviceInfoKind_str(value->type),
+                                   spmi->id ? spmi->id : "");
+                monitor_hmp_printf(hmp, "  addr: 0x%" PRIx64 "\n", spmi->addr);
+                monitor_hmp_printf(hmp, "  node: %" PRId64 "\n", spmi->node);
+                monitor_hmp_printf(hmp, "  size: %" PRIu64 "\n", spmi->size);
+                monitor_hmp_printf(hmp, "  memdev: %s\n", spmi->memdev);
                 break;
             default:
                 g_assert_not_reached();
@@ -381,11 +372,10 @@ void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_vm_generation_id(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     GuidInfo *info = qmp_query_vm_generation_id(&err);
     if (info) {
-        monitor_printf(mon, "%s\n", info->guid);
+        monitor_hmp_printf(hmp, "%s\n", info->guid);
     }
     hmp_handle_error(hmp, err);
     qapi_free_GuidInfo(info);
@@ -393,16 +383,15 @@ void hmp_info_vm_generation_id(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_memory_size_summary(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     MemoryInfo *info = qmp_query_memory_size_summary(&err);
     if (info) {
-        monitor_printf(mon, "base memory: %" PRIu64 "\n",
-                       info->base_memory);
+        monitor_hmp_printf(hmp, "base memory: %" PRIu64 "\n",
+                           info->base_memory);
 
         if (info->has_plugged_memory) {
-            monitor_printf(mon, "plugged memory: %" PRIu64 "\n",
-                           info->plugged_memory);
+            monitor_hmp_printf(hmp, "plugged memory: %" PRIu64 "\n",
+                               info->plugged_memory);
         }
 
         qapi_free_MemoryInfo(info);
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 13df7cbafe10..82130ba04698 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -252,13 +252,14 @@ bool sysbus_realize_and_unref(SysBusDevice *dev, Error **errp)
 static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
 {
     SysBusDevice *s = SYS_BUS_DEVICE(dev);
+    MonitorHMP *hmp = MONITOR_HMP(mon);
     hwaddr size;
     int i;
 
     for (i = 0; i < s->num_mmio; i++) {
         size = memory_region_size(s->mmio[i].memory);
-        monitor_printf(mon, "%*smmio " HWADDR_FMT_plx "/" HWADDR_FMT_plx "\n",
-                       indent, "", s->mmio[i].addr, size);
+        monitor_hmp_printf(hmp, "%*smmio " HWADDR_FMT_plx "/" HWADDR_FMT_plx "\n",
+                           indent, "", s->mmio[i].addr, size);
     }
 }
 
diff --git a/hw/hexagon/hexagon_tlb.c b/hw/hexagon/hexagon_tlb.c
index 2d878cee736d..576929ff224b 100644
--- a/hw/hexagon/hexagon_tlb.c
+++ b/hw/hexagon/hexagon_tlb.c
@@ -124,30 +124,32 @@ static inline uint64_t hex_tlb_virt_addr(uint64_t entry)
 
 bool hexagon_tlb_dump_entry(Monitor *mon, uint64_t entry)
 {
+    MonitorHMP *hmp = MONITOR_HMP(mon);
+
     if (GET_PTE_V(entry)) {
         uint64_t PA = hex_tlb_phys_addr(entry);
         uint64_t VA = hex_tlb_virt_addr(entry);
-        monitor_printf(mon, "0x%016" PRIx64 ": ", entry);
-        monitor_printf(mon, "V:%" PRId64 " G:%" PRId64
-                       " A1:%" PRId64 " A0:%" PRId64,
-                       GET_PTE_V(entry),
-                       GET_PTE_G(entry),
-                       GET_PTE_ATR1(entry),
-                       GET_PTE_ATR0(entry));
-        monitor_printf(mon, " ASID:0x%02" PRIx64 " VA:0x%08" PRIx64,
-                       GET_PTE_ASID(entry), VA);
-        monitor_printf(mon,
-                       " X:%" PRId64 " W:%" PRId64 " R:%" PRId64
-                       " U:%" PRId64 " C:%" PRId64,
-                       GET_PTE_X(entry),
-                       GET_PTE_W(entry),
-                       GET_PTE_R(entry),
-                       GET_PTE_U(entry),
-                       GET_PTE_C(entry));
-        monitor_printf(mon, " PA:0x%09" PRIx64 " SZ:%s (0x%" PRIx64 ")",
-                       PA, pgsize_str[hex_tlb_pgsize_type(entry)],
-                       hex_tlb_page_size_bytes(entry));
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "0x%016" PRIx64 ": ", entry);
+        monitor_hmp_printf(hmp, "V:%" PRId64 " G:%" PRId64
+                           " A1:%" PRId64 " A0:%" PRId64,
+                           GET_PTE_V(entry),
+                           GET_PTE_G(entry),
+                           GET_PTE_ATR1(entry),
+                           GET_PTE_ATR0(entry));
+        monitor_hmp_printf(hmp, " ASID:0x%02" PRIx64 " VA:0x%08" PRIx64,
+                           GET_PTE_ASID(entry), VA);
+        monitor_hmp_printf(hmp,
+                           " X:%" PRId64 " W:%" PRId64 " R:%" PRId64
+                           " U:%" PRId64 " C:%" PRId64,
+                           GET_PTE_X(entry),
+                           GET_PTE_W(entry),
+                           GET_PTE_R(entry),
+                           GET_PTE_U(entry),
+                           GET_PTE_C(entry));
+        monitor_hmp_printf(hmp, " PA:0x%09" PRIx64 " SZ:%s (0x%" PRIx64 ")",
+                           PA, pgsize_str[hex_tlb_pgsize_type(entry)],
+                           hex_tlb_page_size_bytes(entry));
+        monitor_hmp_printf(hmp, "\n");
         return true;
     }
 
diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c
index ab1eb14f99e0..5ed71583281a 100644
--- a/hw/i386/kvm/xen-stubs.c
+++ b/hw/i386/kvm/xen-stubs.c
@@ -42,12 +42,10 @@ void xen_primary_console_set_be_port(uint16_t port)
 
 void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    monitor_printf(mon, "XEN emulation is not available in this QEMU\n");
+    monitor_hmp_printf(hmp, "XEN emulation is not available in this QEMU\n");
 }
 
 void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    monitor_printf(mon, "XEN emulation is not available in this QEMU\n");
+    monitor_hmp_printf(hmp, "XEN emulation is not available in this QEMU\n");
 }
diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
index 00dff6ee8760..b2135020f27f 100644
--- a/hw/i386/kvm/xen_evtchn.c
+++ b/hw/i386/kvm/xen_evtchn.c
@@ -2346,7 +2346,6 @@ void qmp_xen_event_inject(uint32_t port, Error **errp)
 
 void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     EvtchnInfoList *iter, *info_list;
     Error *err = NULL;
 
@@ -2359,22 +2358,22 @@ void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
     for (iter = info_list; iter; iter = iter->next) {
         EvtchnInfo *info = iter->value;
 
-        monitor_printf(mon, "port %4u: vcpu: %d %s", info->port, info->vcpu,
-                       EvtchnPortType_str(info->type));
+        monitor_hmp_printf(hmp, "port %4u: vcpu: %d %s", info->port, info->vcpu,
+                           EvtchnPortType_str(info->type));
         if (info->type != EVTCHN_PORT_TYPE_IPI) {
-            monitor_printf(mon,  "(");
+            monitor_hmp_printf(hmp,  "(");
             if (info->remote_domain) {
-                monitor_printf(mon, "%s:", info->remote_domain);
+                monitor_hmp_printf(hmp, "%s:", info->remote_domain);
             }
-            monitor_printf(mon, "%d)", info->target);
+            monitor_hmp_printf(hmp, "%d)", info->target);
         }
         if (info->pending) {
-            monitor_printf(mon, " PENDING");
+            monitor_hmp_printf(hmp, " PENDING");
         }
         if (info->masked) {
-            monitor_printf(mon, " MASKED");
+            monitor_hmp_printf(hmp, " MASKED");
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
     }
 
     qapi_free_EvtchnInfoList(info_list);
@@ -2382,7 +2381,6 @@ void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int port = qdict_get_int(qdict, "port");
     Error *err = NULL;
 
@@ -2390,7 +2388,6 @@ void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
     if (err) {
         hmp_handle_error(hmp, err);
     } else {
-        monitor_printf(mon, "Delivered port %d\n", port);
+        monitor_hmp_printf(hmp, "Delivered port %d\n", port);
     }
 }
-
diff --git a/hw/i386/sgx-hmp-stub.c b/hw/i386/sgx-hmp-stub.c
index a4848ae1d1a7..b7afb26886a8 100644
--- a/hw/i386/sgx-hmp-stub.c
+++ b/hw/i386/sgx-hmp-stub.c
@@ -12,6 +12,5 @@
 
 void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    monitor_printf(mon, "SGX is not available in this QEMU\n");
+    monitor_hmp_printf(hmp, "SGX is not available in this QEMU\n");
 }
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index 77b41d234c9f..634e33e819ce 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -236,7 +236,6 @@ SgxInfo *qmp_query_sgx(Error **errp)
 
 void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     SgxEpcSectionList *section_list, *section;
     g_autoptr(SgxInfo) info = qmp_query_sgx(&err);
@@ -246,25 +245,25 @@ void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
         error_report_err(err);
         return;
     }
-    monitor_printf(mon, "SGX support: %s\n",
-                   info->sgx ? "enabled" : "disabled");
-    monitor_printf(mon, "SGX1 support: %s\n",
-                   info->sgx1 ? "enabled" : "disabled");
-    monitor_printf(mon, "SGX2 support: %s\n",
-                   info->sgx2 ? "enabled" : "disabled");
-    monitor_printf(mon, "FLC support: %s\n",
-                   info->flc ? "enabled" : "disabled");
+    monitor_hmp_printf(hmp, "SGX support: %s\n",
+                       info->sgx ? "enabled" : "disabled");
+    monitor_hmp_printf(hmp, "SGX1 support: %s\n",
+                       info->sgx1 ? "enabled" : "disabled");
+    monitor_hmp_printf(hmp, "SGX2 support: %s\n",
+                       info->sgx2 ? "enabled" : "disabled");
+    monitor_hmp_printf(hmp, "FLC support: %s\n",
+                       info->flc ? "enabled" : "disabled");
 
     section_list = info->sections;
     for (section = section_list; section; section = section->next) {
-        monitor_printf(mon, "NUMA node #%" PRId64 ": ",
-                       section->value->node);
-        monitor_printf(mon, "size=%" PRIu64 "\n",
-                       section->value->size);
+        monitor_hmp_printf(hmp, "NUMA node #%" PRId64 ": ",
+                           section->value->node);
+        monitor_hmp_printf(hmp, "size=%" PRIu64 "\n",
+                           section->value->size);
         size += section->value->size;
     }
-    monitor_printf(mon, "total size=%" PRIu64 "\n",
-                   size);
+    monitor_hmp_printf(hmp, "total size=%" PRIu64 "\n",
+                       size);
 }
 
 bool check_sgx_support(void)
diff --git a/hw/misc/auxbus.c b/hw/misc/auxbus.c
index ac2525b90fec..ffa76f83016b 100644
--- a/hw/misc/auxbus.c
+++ b/hw/misc/auxbus.c
@@ -300,10 +300,11 @@ static void aux_slave_dev_print(Monitor *mon, DeviceState *dev, int indent)
 
     s = AUX_SLAVE(dev);
 
-    monitor_printf(mon, "%*smemory " HWADDR_FMT_plx "/" HWADDR_FMT_plx "\n",
-                   indent, "",
-                   object_property_get_uint(OBJECT(s->mmio), "addr", NULL),
-                   memory_region_size(s->mmio));
+    monitor_hmp_printf(MONITOR_HMP(mon),
+                       "%*smemory " HWADDR_FMT_plx "/" HWADDR_FMT_plx "\n",
+                       indent, "",
+                       object_property_get_uint(OBJECT(s->mmio), "addr", NULL),
+                       memory_region_size(s->mmio));
 }
 
 void aux_init_mmio(AUXSlave *aux_slave, MemoryRegion *mmio)
diff --git a/hw/misc/mos6522-stub.c b/hw/misc/mos6522-stub.c
index 6a7d76292f00..154cd32ed88b 100644
--- a/hw/misc/mos6522-stub.c
+++ b/hw/misc/mos6522-stub.c
@@ -12,6 +12,5 @@
 
 void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    monitor_printf(mon, "MOS6522 VIA is not available in this QEMU\n");
+    monitor_hmp_printf(hmp, "MOS6522 VIA is not available in this QEMU\n");
 }
diff --git a/hw/net/rocker/rocker-hmp-cmds.c b/hw/net/rocker/rocker-hmp-cmds.c
index 6405ce26dd65..5099d59cc620 100644
--- a/hw/net/rocker/rocker-hmp-cmds.c
+++ b/hw/net/rocker/rocker-hmp-cmds.c
@@ -22,7 +22,6 @@
 
 void hmp_rocker(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *name = qdict_get_str(qdict, "name");
     RockerSwitch *rocker;
     Error *err = NULL;
@@ -32,16 +31,15 @@ void hmp_rocker(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "name: %s\n", rocker->name);
-    monitor_printf(mon, "id: 0x%" PRIx64 "\n", rocker->id);
-    monitor_printf(mon, "ports: %d\n", rocker->ports);
+    monitor_hmp_printf(hmp, "name: %s\n", rocker->name);
+    monitor_hmp_printf(hmp, "id: 0x%" PRIx64 "\n", rocker->id);
+    monitor_hmp_printf(hmp, "ports: %d\n", rocker->ports);
 
     qapi_free_RockerSwitch(rocker);
 }
 
 void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     RockerPortList *list, *port;
     const char *name = qdict_get_str(qdict, "name");
     Error *err = NULL;
@@ -51,17 +49,17 @@ void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "            ena/    speed/ auto\n");
-    monitor_printf(mon, "      port  link    duplex neg?\n");
+    monitor_hmp_printf(hmp, "            ena/    speed/ auto\n");
+    monitor_hmp_printf(hmp, "      port  link    duplex neg?\n");
 
     for (port = list; port; port = port->next) {
-        monitor_printf(mon, "%10s  %-4s   %-3s  %2s  %s\n",
-                       port->value->name,
-                       port->value->enabled ? port->value->link_up ?
-                       "up" : "down" : "!ena",
-                       port->value->speed == 10000 ? "10G" : "??",
-                       port->value->duplex ? "FD" : "HD",
-                       port->value->autoneg ? "Yes" : "No");
+        monitor_hmp_printf(hmp, "%10s  %-4s   %-3s  %2s  %s\n",
+                           port->value->name,
+                           port->value->enabled ? port->value->link_up ?
+                           "up" : "down" : "!ena",
+                           port->value->speed == 10000 ? "10G" : "??",
+                           port->value->duplex ? "FD" : "HD",
+                           port->value->autoneg ? "Yes" : "No");
     }
 
     qapi_free_RockerPortList(list);
@@ -69,7 +67,6 @@ void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     RockerOfDpaFlowList *list, *info;
     const char *name = qdict_get_str(qdict, "name");
     uint32_t tbl_id = qdict_get_try_int(qdict, "tbl_id", -1);
@@ -80,7 +77,7 @@ void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "prio tbl hits key(mask) --> actions\n");
+    monitor_hmp_printf(hmp, "prio tbl hits key(mask) --> actions\n");
 
     for (info = list; info; info = info->next) {
         RockerOfDpaFlow *flow = info->value;
@@ -89,54 +86,54 @@ void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
         RockerOfDpaFlowAction *action = flow->action;
 
         if (flow->hits) {
-            monitor_printf(mon, "%-4d %-3d %-4" PRIu64,
-                           key->priority, key->tbl_id, flow->hits);
+            monitor_hmp_printf(hmp, "%-4d %-3d %-4" PRIu64,
+                               key->priority, key->tbl_id, flow->hits);
         } else {
-            monitor_printf(mon, "%-4d %-3d     ",
-                           key->priority, key->tbl_id);
+            monitor_hmp_printf(hmp, "%-4d %-3d     ",
+                               key->priority, key->tbl_id);
         }
 
         if (key->has_in_pport) {
-            monitor_printf(mon, " pport %d", key->in_pport);
+            monitor_hmp_printf(hmp, " pport %d", key->in_pport);
             if (mask->has_in_pport) {
-                monitor_printf(mon, "(0x%x)", mask->in_pport);
+                monitor_hmp_printf(hmp, "(0x%x)", mask->in_pport);
             }
         }
 
         if (key->has_vlan_id) {
-            monitor_printf(mon, " vlan %d",
-                           key->vlan_id & VLAN_VID_MASK);
+            monitor_hmp_printf(hmp, " vlan %d",
+                               key->vlan_id & VLAN_VID_MASK);
             if (mask->has_vlan_id) {
-                monitor_printf(mon, "(0x%x)", mask->vlan_id);
+                monitor_hmp_printf(hmp, "(0x%x)", mask->vlan_id);
             }
         }
 
         if (key->has_tunnel_id) {
-            monitor_printf(mon, " tunnel %d", key->tunnel_id);
+            monitor_hmp_printf(hmp, " tunnel %d", key->tunnel_id);
             if (mask->has_tunnel_id) {
-                monitor_printf(mon, "(0x%x)", mask->tunnel_id);
+                monitor_hmp_printf(hmp, "(0x%x)", mask->tunnel_id);
             }
         }
 
         if (key->has_eth_type) {
             switch (key->eth_type) {
             case 0x0806:
-                monitor_printf(mon, " ARP");
+                monitor_hmp_printf(hmp, " ARP");
                 break;
             case 0x0800:
-                monitor_printf(mon, " IP");
+                monitor_hmp_printf(hmp, " IP");
                 break;
             case 0x86dd:
-                monitor_printf(mon, " IPv6");
+                monitor_hmp_printf(hmp, " IPv6");
                 break;
             case 0x8809:
-                monitor_printf(mon, " LACP");
+                monitor_hmp_printf(hmp, " LACP");
                 break;
             case 0x88cc:
-                monitor_printf(mon, " LLDP");
+                monitor_hmp_printf(hmp, " LLDP");
                 break;
             default:
-                monitor_printf(mon, " eth type 0x%04x", key->eth_type);
+                monitor_hmp_printf(hmp, " eth type 0x%04x", key->eth_type);
                 break;
             }
         }
@@ -145,15 +142,15 @@ void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
             if ((strcmp(key->eth_src, "01:00:00:00:00:00") == 0) &&
                 mask->eth_src &&
                 (strcmp(mask->eth_src, "01:00:00:00:00:00") == 0)) {
-                monitor_printf(mon, " src <any mcast/bcast>");
+                monitor_hmp_printf(hmp, " src <any mcast/bcast>");
             } else if ((strcmp(key->eth_src, "00:00:00:00:00:00") == 0) &&
                 mask->eth_src &&
                 (strcmp(mask->eth_src, "01:00:00:00:00:00") == 0)) {
-                monitor_printf(mon, " src <any ucast>");
+                monitor_hmp_printf(hmp, " src <any ucast>");
             } else {
-                monitor_printf(mon, " src %s", key->eth_src);
+                monitor_hmp_printf(hmp, " src %s", key->eth_src);
                 if (mask->eth_src) {
-                    monitor_printf(mon, "(%s)", mask->eth_src);
+                    monitor_hmp_printf(hmp, "(%s)", mask->eth_src);
                 }
             }
         }
@@ -162,56 +159,56 @@ void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
             if ((strcmp(key->eth_dst, "01:00:00:00:00:00") == 0) &&
                 mask->eth_dst &&
                 (strcmp(mask->eth_dst, "01:00:00:00:00:00") == 0)) {
-                monitor_printf(mon, " dst <any mcast/bcast>");
+                monitor_hmp_printf(hmp, " dst <any mcast/bcast>");
             } else if ((strcmp(key->eth_dst, "00:00:00:00:00:00") == 0) &&
                 mask->eth_dst &&
                 (strcmp(mask->eth_dst, "01:00:00:00:00:00") == 0)) {
-                monitor_printf(mon, " dst <any ucast>");
+                monitor_hmp_printf(hmp, " dst <any ucast>");
             } else {
-                monitor_printf(mon, " dst %s", key->eth_dst);
+                monitor_hmp_printf(hmp, " dst %s", key->eth_dst);
                 if (mask->eth_dst) {
-                    monitor_printf(mon, "(%s)", mask->eth_dst);
+                    monitor_hmp_printf(hmp, "(%s)", mask->eth_dst);
                 }
             }
         }
 
         if (key->has_ip_proto) {
-            monitor_printf(mon, " proto %d", key->ip_proto);
+            monitor_hmp_printf(hmp, " proto %d", key->ip_proto);
             if (mask->has_ip_proto) {
-                monitor_printf(mon, "(0x%x)", mask->ip_proto);
+                monitor_hmp_printf(hmp, "(0x%x)", mask->ip_proto);
             }
         }
 
         if (key->has_ip_tos) {
-            monitor_printf(mon, " TOS %d", key->ip_tos);
+            monitor_hmp_printf(hmp, " TOS %d", key->ip_tos);
             if (mask->has_ip_tos) {
-                monitor_printf(mon, "(0x%x)", mask->ip_tos);
+                monitor_hmp_printf(hmp, "(0x%x)", mask->ip_tos);
             }
         }
 
         if (key->ip_dst) {
-            monitor_printf(mon, " dst %s", key->ip_dst);
+            monitor_hmp_printf(hmp, " dst %s", key->ip_dst);
         }
 
         if (action->has_goto_tbl || action->has_group_id ||
             action->has_new_vlan_id) {
-            monitor_printf(mon, " -->");
+            monitor_hmp_printf(hmp, " -->");
         }
 
         if (action->has_new_vlan_id) {
-            monitor_printf(mon, " apply new vlan %d",
-                           ntohs(action->new_vlan_id));
+            monitor_hmp_printf(hmp, " apply new vlan %d",
+                               ntohs(action->new_vlan_id));
         }
 
         if (action->has_group_id) {
-            monitor_printf(mon, " write group 0x%08x", action->group_id);
+            monitor_hmp_printf(hmp, " write group 0x%08x", action->group_id);
         }
 
         if (action->has_goto_tbl) {
-            monitor_printf(mon, " goto tbl %d", action->goto_tbl);
+            monitor_hmp_printf(hmp, " goto tbl %d", action->goto_tbl);
         }
 
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
     }
 
     qapi_free_RockerOfDpaFlowList(list);
@@ -219,7 +216,6 @@ void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     RockerOfDpaGroupList *list, *g;
     const char *name = qdict_get_str(qdict, "name");
     uint8_t type = qdict_get_try_int(qdict, "type", 9);
@@ -230,15 +226,15 @@ void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "id (decode) --> buckets\n");
+    monitor_hmp_printf(hmp, "id (decode) --> buckets\n");
 
     for (g = list; g; g = g->next) {
         RockerOfDpaGroup *group = g->value;
         bool set = false;
 
-        monitor_printf(mon, "0x%08x", group->id);
+        monitor_hmp_printf(hmp, "0x%08x", group->id);
 
-        monitor_printf(mon, " (type %s", group->type == 0 ? "L2 interface" :
+        monitor_hmp_printf(hmp, " (type %s", group->type == 0 ? "L2 interface" :
                                          group->type == 1 ? "L2 rewrite" :
                                          group->type == 2 ? "L3 unicast" :
                                          group->type == 3 ? "L2 multicast" :
@@ -250,70 +246,70 @@ void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict)
                                          "unknown");
 
         if (group->has_vlan_id) {
-            monitor_printf(mon, " vlan %d", group->vlan_id);
+            monitor_hmp_printf(hmp, " vlan %d", group->vlan_id);
         }
 
         if (group->has_pport) {
-            monitor_printf(mon, " pport %d", group->pport);
+            monitor_hmp_printf(hmp, " pport %d", group->pport);
         }
 
         if (group->has_index) {
-            monitor_printf(mon, " index %d", group->index);
+            monitor_hmp_printf(hmp, " index %d", group->index);
         }
 
-        monitor_printf(mon, ") -->");
+        monitor_hmp_printf(hmp, ") -->");
 
         if (group->has_set_vlan_id && group->set_vlan_id) {
             set = true;
-            monitor_printf(mon, " set vlan %d",
-                           group->set_vlan_id & VLAN_VID_MASK);
+            monitor_hmp_printf(hmp, " set vlan %d",
+                               group->set_vlan_id & VLAN_VID_MASK);
         }
 
         if (group->set_eth_src) {
             if (!set) {
                 set = true;
-                monitor_printf(mon, " set");
+                monitor_hmp_printf(hmp, " set");
             }
-            monitor_printf(mon, " src %s", group->set_eth_src);
+            monitor_hmp_printf(hmp, " src %s", group->set_eth_src);
         }
 
         if (group->set_eth_dst) {
             if (!set) {
-                monitor_printf(mon, " set");
+                monitor_hmp_printf(hmp, " set");
             }
-            monitor_printf(mon, " dst %s", group->set_eth_dst);
+            monitor_hmp_printf(hmp, " dst %s", group->set_eth_dst);
         }
 
         if (group->has_ttl_check && group->ttl_check) {
-            monitor_printf(mon, " check TTL");
+            monitor_hmp_printf(hmp, " check TTL");
         }
 
         if (group->has_group_id && group->group_id) {
-            monitor_printf(mon, " group id 0x%08x", group->group_id);
+            monitor_hmp_printf(hmp, " group id 0x%08x", group->group_id);
         }
 
         if (group->has_pop_vlan && group->pop_vlan) {
-            monitor_printf(mon, " pop vlan");
+            monitor_hmp_printf(hmp, " pop vlan");
         }
 
         if (group->has_out_pport) {
-            monitor_printf(mon, " out pport %d", group->out_pport);
+            monitor_hmp_printf(hmp, " out pport %d", group->out_pport);
         }
 
         if (group->has_group_ids) {
             struct uint32List *id;
 
-            monitor_printf(mon, " groups [");
+            monitor_hmp_printf(hmp, " groups [");
             for (id = group->group_ids; id; id = id->next) {
-                monitor_printf(mon, "0x%08x", id->value);
+                monitor_hmp_printf(hmp, "0x%08x", id->value);
                 if (id->next) {
-                    monitor_printf(mon, ",");
+                    monitor_hmp_printf(hmp, ",");
                 }
             }
-            monitor_printf(mon, "]");
+            monitor_hmp_printf(hmp, "]");
         }
 
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
     }
 
     qapi_free_RockerOfDpaGroupList(list);
diff --git a/hw/pci/pci-hmp-cmds.c b/hw/pci/pci-hmp-cmds.c
index 51d95d76620e..500f821246a9 100644
--- a/hw/pci/pci-hmp-cmds.c
+++ b/hw/pci/pci-hmp-cmds.c
@@ -24,54 +24,55 @@
 #include "qapi/qapi-commands-pci.h"
 #include "qemu/cutils.h"
 
-static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
+static void hmp_info_pci_device(MonitorHMP *hmp, const PciDeviceInfo *dev)
 {
+    Monitor *mon = MONITOR(hmp);
     PciMemoryRegionList *region;
 
-    monitor_printf(mon, "  Bus %2" PRId64 ", ", dev->bus);
-    monitor_printf(mon, "device %3" PRId64 ", function %" PRId64 ":\n",
-                   dev->slot, dev->function);
-    monitor_printf(mon, "    ");
+    monitor_hmp_printf(hmp, "  Bus %2" PRId64 ", ", dev->bus);
+    monitor_hmp_printf(hmp, "device %3" PRId64 ", function %" PRId64 ":\n",
+                       dev->slot, dev->function);
+    monitor_hmp_printf(hmp, "    ");
 
     if (dev->class_info->desc) {
         monitor_puts(mon, dev->class_info->desc);
     } else {
-        monitor_printf(mon, "Class %04" PRId64, dev->class_info->q_class);
+        monitor_hmp_printf(hmp, "Class %04" PRId64, dev->class_info->q_class);
     }
 
-    monitor_printf(mon, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n",
-                   dev->id->vendor, dev->id->device);
+    monitor_hmp_printf(hmp, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n",
+                       dev->id->vendor, dev->id->device);
     if (dev->id->has_subsystem_vendor && dev->id->has_subsystem) {
-        monitor_printf(mon, "      PCI subsystem %04" PRIx64 ":%04" PRIx64 "\n",
-                       dev->id->subsystem_vendor, dev->id->subsystem);
+        monitor_hmp_printf(hmp, "      PCI subsystem %04" PRIx64 ":%04" PRIx64 "\n",
+                           dev->id->subsystem_vendor, dev->id->subsystem);
     }
 
     if (dev->has_irq) {
-        monitor_printf(mon, "      IRQ %" PRId64 ", pin %c\n",
-                       dev->irq, (char)('A' + dev->irq_pin - 1));
+        monitor_hmp_printf(hmp, "      IRQ %" PRId64 ", pin %c\n",
+                           dev->irq, (char)('A' + dev->irq_pin - 1));
     }
 
     if (dev->pci_bridge) {
-        monitor_printf(mon, "      BUS %" PRId64 ".\n",
-                       dev->pci_bridge->bus->number);
-        monitor_printf(mon, "      secondary bus %" PRId64 ".\n",
-                       dev->pci_bridge->bus->secondary);
-        monitor_printf(mon, "      subordinate bus %" PRId64 ".\n",
-                       dev->pci_bridge->bus->subordinate);
+        monitor_hmp_printf(hmp, "      BUS %" PRId64 ".\n",
+                           dev->pci_bridge->bus->number);
+        monitor_hmp_printf(hmp, "      secondary bus %" PRId64 ".\n",
+                           dev->pci_bridge->bus->secondary);
+        monitor_hmp_printf(hmp, "      subordinate bus %" PRId64 ".\n",
+                           dev->pci_bridge->bus->subordinate);
 
-        monitor_printf(mon, "      IO range [0x%04"PRIx64", 0x%04"PRIx64"]\n",
-                       dev->pci_bridge->bus->io_range->base,
-                       dev->pci_bridge->bus->io_range->limit);
+        monitor_hmp_printf(hmp, "      IO range [0x%04"PRIx64", 0x%04"PRIx64"]\n",
+                           dev->pci_bridge->bus->io_range->base,
+                           dev->pci_bridge->bus->io_range->limit);
 
-        monitor_printf(mon,
-                       "      memory range [0x%08"PRIx64", 0x%08"PRIx64"]\n",
-                       dev->pci_bridge->bus->memory_range->base,
-                       dev->pci_bridge->bus->memory_range->limit);
+        monitor_hmp_printf(hmp,
+                           "      memory range [0x%08"PRIx64", 0x%08"PRIx64"]\n",
+                           dev->pci_bridge->bus->memory_range->base,
+                           dev->pci_bridge->bus->memory_range->limit);
 
-        monitor_printf(mon, "      prefetchable memory range "
-                       "[0x%08"PRIx64", 0x%08"PRIx64"]\n",
-                       dev->pci_bridge->bus->prefetchable_range->base,
-                       dev->pci_bridge->bus->prefetchable_range->limit);
+        monitor_hmp_printf(hmp, "      prefetchable memory range "
+                           "[0x%08"PRIx64", 0x%08"PRIx64"]\n",
+                           dev->pci_bridge->bus->prefetchable_range->base,
+                           dev->pci_bridge->bus->prefetchable_range->limit);
     }
 
     for (region = dev->regions; region; region = region->next) {
@@ -80,38 +81,38 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
         addr = region->value->address;
         size = region->value->size;
 
-        monitor_printf(mon, "      BAR%" PRId64 ": ", region->value->bar);
+        monitor_hmp_printf(hmp, "      BAR%" PRId64 ": ", region->value->bar);
 
         if (!strcmp(region->value->type, "io")) {
             if (addr != PCI_BAR_UNMAPPED) {
-                monitor_printf(mon, "I/O at 0x%04" PRIx64
+                monitor_hmp_printf(hmp, "I/O at 0x%04" PRIx64
                                     " [0x%04" PRIx64 "]\n",
                                addr, addr + size - 1);
             } else {
-                monitor_printf(mon, "I/O (not mapped)\n");
+                monitor_hmp_printf(hmp, "I/O (not mapped)\n");
             }
         } else {
             if (addr != PCI_BAR_UNMAPPED) {
-                monitor_printf(mon, "%d bit%s memory at 0x%08" PRIx64
+                monitor_hmp_printf(hmp, "%d bit%s memory at 0x%08" PRIx64
                                    " [0x%08" PRIx64 "]\n",
                                region->value->mem_type_64 ? 64 : 32,
                                region->value->prefetch ? " prefetchable" : "",
                                addr, addr + size - 1);
             } else {
-                monitor_printf(mon, "%d bit%s memory (not mapped)\n",
-                               region->value->mem_type_64 ? 64 : 32,
-                               region->value->prefetch ? " prefetchable" : "");
+                monitor_hmp_printf(hmp, "%d bit%s memory (not mapped)\n",
+                                   region->value->mem_type_64 ? 64 : 32,
+                                   region->value->prefetch ? " prefetchable" : "");
             }
         }
     }
 
-    monitor_printf(mon, "      id \"%s\"\n", dev->qdev_id);
+    monitor_hmp_printf(hmp, "      id \"%s\"\n", dev->qdev_id);
 
     if (dev->pci_bridge) {
         if (dev->pci_bridge->has_devices) {
             PciDeviceInfoList *cdev;
             for (cdev = dev->pci_bridge->devices; cdev; cdev = cdev->next) {
-                hmp_info_pci_device(mon, cdev->value);
+                hmp_info_pci_device(hmp, cdev->value);
             }
         }
     }
@@ -119,7 +120,6 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
 
 void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     PciInfoList *info_list, *info;
 
     info_list = qmp_query_pci(&error_abort);
@@ -128,7 +128,7 @@ void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
         PciDeviceInfoList *dev;
 
         for (dev = info->value->devices; dev; dev = dev->next) {
-            hmp_info_pci_device(mon, dev->value);
+            hmp_info_pci_device(hmp, dev->value);
         }
     }
 
@@ -137,6 +137,7 @@ void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
 
 void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
 {
+    MonitorHMP *hmp = MONITOR_HMP(mon);
     PCIDevice *d = (PCIDevice *)dev;
     int class = pci_get_word(d->config + PCI_CLASS_DEVICE);
     const pci_class_desc *desc = get_class_desc(class);
@@ -150,30 +151,29 @@ void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
         snprintf(ctxt, sizeof(ctxt), "Class %04x", class);
     }
 
-    monitor_printf(mon, "%*sclass %s, addr %02x:%02x.%x, "
-                   "pci id %04x:%04x (sub %04x:%04x)\n",
-                   indent, "", ctxt, pci_dev_bus_num(d),
-                   PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
-                   pci_get_word(d->config + PCI_VENDOR_ID),
-                   pci_get_word(d->config + PCI_DEVICE_ID),
-                   pci_get_word(d->config + PCI_SUBSYSTEM_VENDOR_ID),
-                   pci_get_word(d->config + PCI_SUBSYSTEM_ID));
+    monitor_hmp_printf(hmp, "%*sclass %s, addr %02x:%02x.%x, "
+                       "pci id %04x:%04x (sub %04x:%04x)\n",
+                       indent, "", ctxt, pci_dev_bus_num(d),
+                       PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
+                       pci_get_word(d->config + PCI_VENDOR_ID),
+                       pci_get_word(d->config + PCI_DEVICE_ID),
+                       pci_get_word(d->config + PCI_SUBSYSTEM_VENDOR_ID),
+                       pci_get_word(d->config + PCI_SUBSYSTEM_ID));
     for (i = 0; i < PCI_NUM_REGIONS; i++) {
         r = &d->io_regions[i];
         if (!r->size) {
             continue;
         }
-        monitor_printf(mon, "%*sbar %d: %s at 0x%"FMT_PCIBUS
-                       " [0x%"FMT_PCIBUS"]\n",
-                       indent, "",
-                       i, r->type & PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
-                       r->addr, r->addr + r->size - 1);
+        monitor_hmp_printf(hmp, "%*sbar %d: %s at 0x%"FMT_PCIBUS
+                           " [0x%"FMT_PCIBUS"]\n",
+                           indent, "",
+                           i, r->type & PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
+                           r->addr, r->addr + r->size - 1);
     }
 }
 
 void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *id = qdict_get_str(qdict, "id");
     const char *error_name;
@@ -242,9 +242,9 @@ void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
     }
 
 
-    monitor_printf(mon, "OK id: %s root bus: %s, bus: %x devfn: %x.%x\n",
-                   id, pci_root_bus_path(dev), pci_dev_bus_num(dev),
-                   PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
+    monitor_hmp_printf(hmp, "OK id: %s root bus: %s, bus: %x devfn: %x.%x\n",
+                       id, pci_root_bus_path(dev), pci_dev_bus_num(dev),
+                       PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
 
 out:
     hmp_handle_error(hmp, err);
diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c
index a80e34175462..7e2797300ba0 100644
--- a/hw/pci/pci-stub.c
+++ b/hw/pci/pci-stub.c
@@ -40,8 +40,7 @@ void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    monitor_printf(mon, "PCI devices not supported\n");
+    monitor_hmp_printf(hmp, "PCI devices not supported\n");
 }
 
 /* kvm-all wants this */
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index d8afaf730639..b5e56a16cce1 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -106,7 +106,6 @@ static void write_keys(FILE *f, uint8_t *keys, uint64_t startgfn,
 
 void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     S390SKeysState *ss = s390_get_skeys_device();
     S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     uint64_t addr = qdict_get_int(qdict, "addr");
@@ -115,24 +114,24 @@ void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict)
 
     /* Quick check to see if guest is using storage keys*/
     if (!skeyclass->skeys_are_enabled(ss)) {
-        monitor_printf(mon, "Error: This guest is not using storage keys\n");
+        monitor_hmp_printf(hmp, "Error: This guest is not using storage keys\n");
         return;
     }
 
     if (!address_space_access_valid(&address_space_memory,
                                     addr & TARGET_PAGE_MASK, TARGET_PAGE_SIZE,
                                     false, MEMTXATTRS_UNSPECIFIED)) {
-        monitor_printf(mon, "Error: The given address is not valid\n");
+        monitor_hmp_printf(hmp, "Error: The given address is not valid\n");
         return;
     }
 
     r = skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key);
     if (r < 0) {
-        monitor_printf(mon, "Error: %s\n", strerror(-r));
+        monitor_hmp_printf(hmp, "Error: %s\n", strerror(-r));
         return;
     }
 
-    monitor_printf(mon, "  key: 0x%X\n", key);
+    monitor_hmp_printf(hmp, "  key: 0x%X\n", key);
 }
 
 void hmp_dump_skeys(MonitorHMP *hmp, const QDict *qdict)
diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index b4a405455901..644298f7f0b2 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -61,7 +61,6 @@ void s390_stattrib_init(void)
 
 void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     S390StAttribState *sas = s390_get_stattrib_device();
     S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
     uint64_t what = qdict_get_int(qdict, "mode");
@@ -70,14 +69,13 @@ void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict)
 
     r = sac->set_migrationmode(sas, what, &local_err);
     if (r < 0) {
-        monitor_printf(mon, "Error: %s", error_get_pretty(local_err));
+        monitor_hmp_printf(hmp, "Error: %s", error_get_pretty(local_err));
         error_free(local_err);
     }
 }
 
 void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     S390StAttribState *sas = s390_get_stattrib_device();
     S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
     uint64_t addr = qdict_get_int(qdict, "addr");
@@ -87,27 +85,27 @@ void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict)
 
     vals = g_try_malloc(buflen);
     if (!vals) {
-        monitor_printf(mon, "Error: %s\n", strerror(errno));
+        monitor_hmp_printf(hmp, "Error: %s\n", strerror(errno));
         return;
     }
 
     len = sac->peek_stattr(sas, addr / TARGET_PAGE_SIZE, buflen, vals);
     if (len < 0) {
-        monitor_printf(mon, "Error: %s", strerror(-len));
+        monitor_hmp_printf(hmp, "Error: %s", strerror(-len));
         goto out;
     }
 
-    monitor_printf(mon, "  CMMA attributes, "
-                   "pages %" PRIu64 "+%d (0x%" PRIx64 "):\n",
-                   addr / TARGET_PAGE_SIZE, len, addr & ~TARGET_PAGE_MASK);
+    monitor_hmp_printf(hmp, "  CMMA attributes, "
+                       "pages %" PRIu64 "+%d (0x%" PRIx64 "):\n",
+                       addr / TARGET_PAGE_SIZE, len, addr & ~TARGET_PAGE_MASK);
     for (cx = 0; cx < len; cx++) {
         if (cx % 8 == 7) {
-            monitor_printf(mon, "%02x\n", vals[cx]);
+            monitor_hmp_printf(hmp, "%02x\n", vals[cx]);
         } else {
-            monitor_printf(mon, "%02x", vals[cx]);
+            monitor_hmp_printf(hmp, "%02x", vals[cx]);
         }
     }
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
 
 out:
     g_free(vals);
diff --git a/hw/uefi/ovmf-log.c b/hw/uefi/ovmf-log.c
index 0d59a74ad60e..0249eea2cfe9 100644
--- a/hw/uefi/ovmf-log.c
+++ b/hw/uefi/ovmf-log.c
@@ -258,7 +258,6 @@ FirmwareLog *qmp_query_firmware_log(bool have_max_size, uint64_t max_size,
 
 void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     g_autofree gchar *log_esc = NULL;
     g_autofree guchar *log_out = NULL;
     Error *err = NULL;
@@ -278,10 +277,10 @@ void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict)
 
     if (log->version) {
         g_autofree gchar *esc = g_strescape(log->version, NULL);
-        monitor_printf(mon, "[ firmware version: %s ]\n", esc);
+        monitor_hmp_printf(hmp, "[ firmware version: %s ]\n", esc);
     }
 
     log_out = g_base64_decode(log->log, &log_len);
     log_esc = g_strescape((gchar *)log_out, "\r\n");
-    monitor_printf(mon, "%s\n", log_esc);
+    monitor_hmp_printf(hmp, "%s\n", log_esc);
 }
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 9b9b2e7c2f8f..fe3dbfa2227c 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -546,14 +546,15 @@ static const char *usb_speed(unsigned int speed)
 
 static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 {
+    MonitorHMP *hmp = MONITOR_HMP(mon);
     USBDevice *dev = USB_DEVICE(qdev);
     USBBus *bus = usb_bus_from_device(dev);
 
-    monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n",
-                   indent, "", bus->busnr, dev->addr,
-                   dev->port ? dev->port->path : "-",
-                   usb_speed(dev->speed), dev->product_desc,
-                   dev->attached ? ", attached" : "");
+    monitor_hmp_printf(hmp, "%*saddr %d.%d, port %s, speed %s, name %s%s\n",
+                       indent, "", bus->busnr, dev->addr,
+                       dev->port ? dev->port->path : "-",
+                       usb_speed(dev->speed), dev->product_desc,
+                       dev->attached ? ", attached" : "");
 }
 
 static char *usb_get_dev_path(DeviceState *qdev)
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index c02343d3a655..9b9f26a1078e 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -1922,7 +1922,6 @@ static void usb_host_auto_check(void *unused)
 
 void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     libusb_device **devs = NULL;
     struct libusb_device_descriptor ddesc;
     char port[16];
@@ -1941,14 +1940,14 @@ void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
             continue;
         }
         usb_host_get_port(devs[i], port, sizeof(port));
-        monitor_printf(mon, "  Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
-                       libusb_get_bus_number(devs[i]),
-                       libusb_get_device_address(devs[i]),
-                       port,
-                       speed_name[libusb_get_device_speed(devs[i])]);
-        monitor_printf(mon, "    Class %02x:", ddesc.bDeviceClass);
-        monitor_printf(mon, " USB device %04x:%04x",
-                       ddesc.idVendor, ddesc.idProduct);
+        monitor_hmp_printf(hmp, "  Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
+                           libusb_get_bus_number(devs[i]),
+                           libusb_get_device_address(devs[i]),
+                           port,
+                           speed_name[libusb_get_device_speed(devs[i])]);
+        monitor_hmp_printf(hmp, "    Class %02x:", ddesc.bDeviceClass);
+        monitor_hmp_printf(hmp, " USB device %04x:%04x",
+                           ddesc.idVendor, ddesc.idProduct);
         if (ddesc.iProduct) {
             libusb_device_handle *handle;
             if (libusb_open(devs[i], &handle) == 0) {
@@ -1957,10 +1956,10 @@ void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
                                                    ddesc.iProduct,
                                                    name, sizeof(name));
                 libusb_close(handle);
-                monitor_printf(mon, ", %s", name);
+                monitor_hmp_printf(hmp, ", %s", name);
             }
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
     }
     libusb_free_device_list(devs, 1);
 }
diff --git a/hw/virtio/virtio-hmp-cmds.c b/hw/virtio/virtio-hmp-cmds.c
index fb36c8b9274c..e5da6f00699d 100644
--- a/hw/virtio/virtio-hmp-cmds.c
+++ b/hw/virtio/virtio-hmp-cmds.c
@@ -12,77 +12,76 @@
 #include "qobject/qdict.h"
 
 
-static void hmp_virtio_dump_protocols(Monitor *mon,
+static void hmp_virtio_dump_protocols(MonitorHMP *hmp,
                                       VhostDeviceProtocols *pcol)
 {
     strList *pcol_list = pcol->protocols;
     while (pcol_list) {
-        monitor_printf(mon, "\t%s", pcol_list->value);
+        monitor_hmp_printf(hmp, "\t%s", pcol_list->value);
         pcol_list = pcol_list->next;
         if (pcol_list != NULL) {
-            monitor_printf(mon, ",\n");
+            monitor_hmp_printf(hmp, ",\n");
         }
     }
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
     if (pcol->has_unknown_protocols) {
-        monitor_printf(mon, "  unknown-protocols(0x%016"PRIx64")\n",
-                       pcol->unknown_protocols);
+        monitor_hmp_printf(hmp, "  unknown-protocols(0x%016"PRIx64")\n",
+                           pcol->unknown_protocols);
     }
 }
 
-static void hmp_virtio_dump_status(Monitor *mon,
+static void hmp_virtio_dump_status(MonitorHMP *hmp,
                                    VirtioDeviceStatus *status)
 {
     strList *status_list = status->statuses;
     while (status_list) {
-        monitor_printf(mon, "\t%s", status_list->value);
+        monitor_hmp_printf(hmp, "\t%s", status_list->value);
         status_list = status_list->next;
         if (status_list != NULL) {
-            monitor_printf(mon, ",\n");
+            monitor_hmp_printf(hmp, ",\n");
         }
     }
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
     if (status->has_unknown_statuses) {
-        monitor_printf(mon, "  unknown-statuses(0x%016"PRIx32")\n",
-                       status->unknown_statuses);
+        monitor_hmp_printf(hmp, "  unknown-statuses(0x%016"PRIx32")\n",
+                           status->unknown_statuses);
     }
 }
 
-static void hmp_virtio_dump_features(Monitor *mon,
+static void hmp_virtio_dump_features(MonitorHMP *hmp,
                                      VirtioDeviceFeatures *features)
 {
     strList *transport_list = features->transports;
     while (transport_list) {
-        monitor_printf(mon, "\t%s", transport_list->value);
+        monitor_hmp_printf(hmp, "\t%s", transport_list->value);
         transport_list = transport_list->next;
         if (transport_list != NULL) {
-            monitor_printf(mon, ",\n");
+            monitor_hmp_printf(hmp, ",\n");
         }
     }
 
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
     strList *list = features->dev_features;
     if (list) {
         while (list) {
-            monitor_printf(mon, "\t%s", list->value);
+            monitor_hmp_printf(hmp, "\t%s", list->value);
             list = list->next;
             if (list != NULL) {
-                monitor_printf(mon, ",\n");
+                monitor_hmp_printf(hmp, ",\n");
             }
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
     }
 
     if (features->has_unknown_dev_features) {
-        monitor_printf(mon, "  unknown-features(0x%016"PRIx64"%016"PRIx64")\n",
-                       features->unknown_dev_features2,
-                       features->unknown_dev_features);
+        monitor_hmp_printf(hmp, "  unknown-features(0x%016"PRIx64"%016"PRIx64")\n",
+                           features->unknown_dev_features2,
+                           features->unknown_dev_features);
     }
 }
 
 void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     VirtioInfoList *list = qmp_x_query_virtio(&err);
     VirtioInfoList *node;
@@ -93,14 +92,14 @@ void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict)
     }
 
     if (list == NULL) {
-        monitor_printf(mon, "No VirtIO devices\n");
+        monitor_hmp_printf(hmp, "No VirtIO devices\n");
         return;
     }
 
     node = list;
     while (node) {
-        monitor_printf(mon, "%s [%s]\n", node->value->path,
-                       node->value->name);
+        monitor_hmp_printf(hmp, "%s [%s]\n", node->value->path,
+                           node->value->name);
         node = node->next;
     }
     qapi_free_VirtioInfoList(list);
@@ -108,7 +107,6 @@ void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     VirtioStatus *s = qmp_x_query_virtio_status(path, &err);
@@ -118,68 +116,68 @@ void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "%s:\n", path);
-    monitor_printf(mon, "  device_name:             %s %s\n",
-                   s->name, s->vhost_dev ? "(vhost)" : "");
-    monitor_printf(mon, "  device_id:               %d\n", s->device_id);
-    monitor_printf(mon, "  vhost_started:           %s\n",
-                   s->vhost_started ? "true" : "false");
-    monitor_printf(mon, "  bus_name:                %s\n", s->bus_name);
-    monitor_printf(mon, "  broken:                  %s\n",
-                   s->broken ? "true" : "false");
-    monitor_printf(mon, "  disabled:                %s\n",
-                   s->disabled ? "true" : "false");
-    monitor_printf(mon, "  disable_legacy_check:    %s\n",
-                   s->disable_legacy_check ? "true" : "false");
-    monitor_printf(mon, "  started:                 %s\n",
-                   s->started ? "true" : "false");
-    monitor_printf(mon, "  use_started:             %s\n",
-                   s->use_started ? "true" : "false");
-    monitor_printf(mon, "  start_on_kick:           %s\n",
-                   s->start_on_kick ? "true" : "false");
-    monitor_printf(mon, "  use_guest_notifier_mask: %s\n",
-                   s->use_guest_notifier_mask ? "true" : "false");
-    monitor_printf(mon, "  vm_running:              %s\n",
-                   s->vm_running ? "true" : "false");
-    monitor_printf(mon, "  num_vqs:                 %"PRId64"\n", s->num_vqs);
-    monitor_printf(mon, "  queue_sel:               %d\n",
-                   s->queue_sel);
-    monitor_printf(mon, "  isr:                     %d\n", s->isr);
-    monitor_printf(mon, "  endianness:              %s\n",
-                   s->device_endian);
-    monitor_printf(mon, "  status:\n");
-    hmp_virtio_dump_status(mon, s->status);
-    monitor_printf(mon, "  Guest features:\n");
-    hmp_virtio_dump_features(mon, s->guest_features);
-    monitor_printf(mon, "  Host features:\n");
-    hmp_virtio_dump_features(mon, s->host_features);
-    monitor_printf(mon, "  Backend features:\n");
-    hmp_virtio_dump_features(mon, s->backend_features);
+    monitor_hmp_printf(hmp, "%s:\n", path);
+    monitor_hmp_printf(hmp, "  device_name:             %s %s\n",
+                       s->name, s->vhost_dev ? "(vhost)" : "");
+    monitor_hmp_printf(hmp, "  device_id:               %d\n", s->device_id);
+    monitor_hmp_printf(hmp, "  vhost_started:           %s\n",
+                       s->vhost_started ? "true" : "false");
+    monitor_hmp_printf(hmp, "  bus_name:                %s\n", s->bus_name);
+    monitor_hmp_printf(hmp, "  broken:                  %s\n",
+                       s->broken ? "true" : "false");
+    monitor_hmp_printf(hmp, "  disabled:                %s\n",
+                       s->disabled ? "true" : "false");
+    monitor_hmp_printf(hmp, "  disable_legacy_check:    %s\n",
+                       s->disable_legacy_check ? "true" : "false");
+    monitor_hmp_printf(hmp, "  started:                 %s\n",
+                       s->started ? "true" : "false");
+    monitor_hmp_printf(hmp, "  use_started:             %s\n",
+                       s->use_started ? "true" : "false");
+    monitor_hmp_printf(hmp, "  start_on_kick:           %s\n",
+                       s->start_on_kick ? "true" : "false");
+    monitor_hmp_printf(hmp, "  use_guest_notifier_mask: %s\n",
+                       s->use_guest_notifier_mask ? "true" : "false");
+    monitor_hmp_printf(hmp, "  vm_running:              %s\n",
+                       s->vm_running ? "true" : "false");
+    monitor_hmp_printf(hmp, "  num_vqs:                 %"PRId64"\n", s->num_vqs);
+    monitor_hmp_printf(hmp, "  queue_sel:               %d\n",
+                       s->queue_sel);
+    monitor_hmp_printf(hmp, "  isr:                     %d\n", s->isr);
+    monitor_hmp_printf(hmp, "  endianness:              %s\n",
+                       s->device_endian);
+    monitor_hmp_printf(hmp, "  status:\n");
+    hmp_virtio_dump_status(hmp, s->status);
+    monitor_hmp_printf(hmp, "  Guest features:\n");
+    hmp_virtio_dump_features(hmp, s->guest_features);
+    monitor_hmp_printf(hmp, "  Host features:\n");
+    hmp_virtio_dump_features(hmp, s->host_features);
+    monitor_hmp_printf(hmp, "  Backend features:\n");
+    hmp_virtio_dump_features(hmp, s->backend_features);
 
     if (s->vhost_dev) {
-        monitor_printf(mon, "  VHost:\n");
-        monitor_printf(mon, "    nvqs:           %d\n",
-                       s->vhost_dev->nvqs);
-        monitor_printf(mon, "    vq_index:       %"PRId64"\n",
-                       s->vhost_dev->vq_index);
-        monitor_printf(mon, "    max_queues:     %"PRId64"\n",
-                       s->vhost_dev->max_queues);
-        monitor_printf(mon, "    n_mem_sections: %"PRId64"\n",
-                       s->vhost_dev->n_mem_sections);
-        monitor_printf(mon, "    n_tmp_sections: %"PRId64"\n",
-                       s->vhost_dev->n_tmp_sections);
-        monitor_printf(mon, "    backend_cap:    %"PRId64"\n",
-                       s->vhost_dev->backend_cap);
-        monitor_printf(mon, "    log_enabled:    %s\n",
-                       s->vhost_dev->log_enabled ? "true" : "false");
-        monitor_printf(mon, "    log_size:       %"PRId64"\n",
-                       s->vhost_dev->log_size);
-        monitor_printf(mon, "    Features:\n");
-        hmp_virtio_dump_features(mon, s->vhost_dev->features);
-        monitor_printf(mon, "    Acked features:\n");
-        hmp_virtio_dump_features(mon, s->vhost_dev->acked_features);
-        monitor_printf(mon, "    Protocol features:\n");
-        hmp_virtio_dump_protocols(mon, s->vhost_dev->protocol_features);
+        monitor_hmp_printf(hmp, "  VHost:\n");
+        monitor_hmp_printf(hmp, "    nvqs:           %d\n",
+                           s->vhost_dev->nvqs);
+        monitor_hmp_printf(hmp, "    vq_index:       %"PRId64"\n",
+                           s->vhost_dev->vq_index);
+        monitor_hmp_printf(hmp, "    max_queues:     %"PRId64"\n",
+                           s->vhost_dev->max_queues);
+        monitor_hmp_printf(hmp, "    n_mem_sections: %"PRId64"\n",
+                           s->vhost_dev->n_mem_sections);
+        monitor_hmp_printf(hmp, "    n_tmp_sections: %"PRId64"\n",
+                           s->vhost_dev->n_tmp_sections);
+        monitor_hmp_printf(hmp, "    backend_cap:    %"PRId64"\n",
+                           s->vhost_dev->backend_cap);
+        monitor_hmp_printf(hmp, "    log_enabled:    %s\n",
+                           s->vhost_dev->log_enabled ? "true" : "false");
+        monitor_hmp_printf(hmp, "    log_size:       %"PRId64"\n",
+                           s->vhost_dev->log_size);
+        monitor_hmp_printf(hmp, "    Features:\n");
+        hmp_virtio_dump_features(hmp, s->vhost_dev->features);
+        monitor_hmp_printf(hmp, "    Acked features:\n");
+        hmp_virtio_dump_features(hmp, s->vhost_dev->acked_features);
+        monitor_hmp_printf(hmp, "    Protocol features:\n");
+        hmp_virtio_dump_protocols(hmp, s->vhost_dev->protocol_features);
     }
 
     qapi_free_VirtioStatus(s);
@@ -187,7 +185,6 @@ void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     int queue = qdict_get_int(qdict, "queue");
@@ -199,29 +196,28 @@ void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "%s:\n", path);
-    monitor_printf(mon, "  device_name:          %s (vhost)\n",
-                   s->name);
-    monitor_printf(mon, "  kick:                 %"PRId64"\n", s->kick);
-    monitor_printf(mon, "  call:                 %"PRId64"\n", s->call);
-    monitor_printf(mon, "  VRing:\n");
-    monitor_printf(mon, "    num:         %"PRId64"\n", s->num);
-    monitor_printf(mon, "    desc_phys:   0x%016"PRIx64"\n",
-                   s->desc_phys);
-    monitor_printf(mon, "    desc_size:   %"PRId32"\n", s->desc_size);
-    monitor_printf(mon, "    avail_phys:  0x%016"PRIx64"\n",
-                   s->avail_phys);
-    monitor_printf(mon, "    avail_size:  %"PRId32"\n", s->avail_size);
-    monitor_printf(mon, "    used_phys:   0x%016"PRIx64"\n",
-                   s->used_phys);
-    monitor_printf(mon, "    used_size:   %"PRId32"\n", s->used_size);
+    monitor_hmp_printf(hmp, "%s:\n", path);
+    monitor_hmp_printf(hmp, "  device_name:          %s (vhost)\n",
+                       s->name);
+    monitor_hmp_printf(hmp, "  kick:                 %"PRId64"\n", s->kick);
+    monitor_hmp_printf(hmp, "  call:                 %"PRId64"\n", s->call);
+    monitor_hmp_printf(hmp, "  VRing:\n");
+    monitor_hmp_printf(hmp, "    num:         %"PRId64"\n", s->num);
+    monitor_hmp_printf(hmp, "    desc_phys:   0x%016"PRIx64"\n",
+                       s->desc_phys);
+    monitor_hmp_printf(hmp, "    desc_size:   %"PRId32"\n", s->desc_size);
+    monitor_hmp_printf(hmp, "    avail_phys:  0x%016"PRIx64"\n",
+                       s->avail_phys);
+    monitor_hmp_printf(hmp, "    avail_size:  %"PRId32"\n", s->avail_size);
+    monitor_hmp_printf(hmp, "    used_phys:   0x%016"PRIx64"\n",
+                       s->used_phys);
+    monitor_hmp_printf(hmp, "    used_size:   %"PRId32"\n", s->used_size);
 
     qapi_free_VirtVhostQueueStatus(s);
 }
 
 void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     int queue = qdict_get_int(qdict, "queue");
@@ -232,42 +228,41 @@ void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "%s:\n", path);
-    monitor_printf(mon, "  device_name:          %s\n", s->name);
-    monitor_printf(mon, "  queue_index:          %d\n", s->queue_index);
-    monitor_printf(mon, "  inuse:                %d\n", s->inuse);
-    monitor_printf(mon, "  used_idx:             %d\n", s->used_idx);
-    monitor_printf(mon, "  signalled_used:       %d\n",
-                   s->signalled_used);
-    monitor_printf(mon, "  signalled_used_valid: %s\n",
-                   s->signalled_used_valid ? "true" : "false");
+    monitor_hmp_printf(hmp, "%s:\n", path);
+    monitor_hmp_printf(hmp, "  device_name:          %s\n", s->name);
+    monitor_hmp_printf(hmp, "  queue_index:          %d\n", s->queue_index);
+    monitor_hmp_printf(hmp, "  inuse:                %d\n", s->inuse);
+    monitor_hmp_printf(hmp, "  used_idx:             %d\n", s->used_idx);
+    monitor_hmp_printf(hmp, "  signalled_used:       %d\n",
+                       s->signalled_used);
+    monitor_hmp_printf(hmp, "  signalled_used_valid: %s\n",
+                       s->signalled_used_valid ? "true" : "false");
     if (s->has_last_avail_idx) {
-        monitor_printf(mon, "  last_avail_idx:       %d\n",
-                       s->last_avail_idx);
+        monitor_hmp_printf(hmp, "  last_avail_idx:       %d\n",
+                           s->last_avail_idx);
     }
     if (s->has_shadow_avail_idx) {
-        monitor_printf(mon, "  shadow_avail_idx:     %d\n",
-                       s->shadow_avail_idx);
+        monitor_hmp_printf(hmp, "  shadow_avail_idx:     %d\n",
+                           s->shadow_avail_idx);
     }
-    monitor_printf(mon, "  VRing:\n");
-    monitor_printf(mon, "    num:          %"PRId32"\n", s->vring_num);
-    monitor_printf(mon, "    num_default:  %"PRId32"\n",
-                   s->vring_num_default);
-    monitor_printf(mon, "    align:        %"PRId32"\n",
-                   s->vring_align);
-    monitor_printf(mon, "    desc:         0x%016"PRIx64"\n",
-                   s->vring_desc);
-    monitor_printf(mon, "    avail:        0x%016"PRIx64"\n",
-                   s->vring_avail);
-    monitor_printf(mon, "    used:         0x%016"PRIx64"\n",
-                   s->vring_used);
+    monitor_hmp_printf(hmp, "  VRing:\n");
+    monitor_hmp_printf(hmp, "    num:          %"PRId32"\n", s->vring_num);
+    monitor_hmp_printf(hmp, "    num_default:  %"PRId32"\n",
+                       s->vring_num_default);
+    monitor_hmp_printf(hmp, "    align:        %"PRId32"\n",
+                       s->vring_align);
+    monitor_hmp_printf(hmp, "    desc:         0x%016"PRIx64"\n",
+                       s->vring_desc);
+    monitor_hmp_printf(hmp, "    avail:        0x%016"PRIx64"\n",
+                       s->vring_avail);
+    monitor_hmp_printf(hmp, "    used:         0x%016"PRIx64"\n",
+                       s->vring_used);
 
     qapi_free_VirtQueueStatus(s);
 }
 
 void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *path = qdict_get_try_str(qdict, "path");
     int queue = qdict_get_int(qdict, "queue");
@@ -282,41 +277,41 @@ void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "%s:\n", path);
-    monitor_printf(mon, "  device_name: %s\n", e->name);
-    monitor_printf(mon, "  index:   %d\n", e->index);
-    monitor_printf(mon, "  desc:\n");
-    monitor_printf(mon, "    descs:\n");
+    monitor_hmp_printf(hmp, "%s:\n", path);
+    monitor_hmp_printf(hmp, "  device_name: %s\n", e->name);
+    monitor_hmp_printf(hmp, "  index:   %d\n", e->index);
+    monitor_hmp_printf(hmp, "  desc:\n");
+    monitor_hmp_printf(hmp, "    descs:\n");
 
     list = e->descs;
     while (list) {
-        monitor_printf(mon, "        addr 0x%"PRIx64" len %d",
-                       list->value->addr, list->value->len);
+        monitor_hmp_printf(hmp, "        addr 0x%"PRIx64" len %d",
+                           list->value->addr, list->value->len);
         if (list->value->flags) {
             strList *flag = list->value->flags;
-            monitor_printf(mon, " (");
+            monitor_hmp_printf(hmp, " (");
             while (flag) {
-                monitor_printf(mon, "%s", flag->value);
+                monitor_hmp_printf(hmp, "%s", flag->value);
                 flag = flag->next;
                 if (flag) {
-                    monitor_printf(mon, ", ");
+                    monitor_hmp_printf(hmp, ", ");
                 }
             }
-            monitor_printf(mon, ")");
+            monitor_hmp_printf(hmp, ")");
         }
         list = list->next;
         if (list) {
-            monitor_printf(mon, ",\n");
+            monitor_hmp_printf(hmp, ",\n");
         }
     }
-    monitor_printf(mon, "\n");
-    monitor_printf(mon, "  avail:\n");
-    monitor_printf(mon, "    flags: %d\n", e->avail->flags);
-    monitor_printf(mon, "    idx:   %d\n", e->avail->idx);
-    monitor_printf(mon, "    ring:  %d\n", e->avail->ring);
-    monitor_printf(mon, "  used:\n");
-    monitor_printf(mon, "    flags: %d\n", e->used->flags);
-    monitor_printf(mon, "    idx:   %d\n", e->used->idx);
+    monitor_hmp_printf(hmp, "\n");
+    monitor_hmp_printf(hmp, "  avail:\n");
+    monitor_hmp_printf(hmp, "    flags: %d\n", e->avail->flags);
+    monitor_hmp_printf(hmp, "    idx:   %d\n", e->avail->idx);
+    monitor_hmp_printf(hmp, "    ring:  %d\n", e->avail->ring);
+    monitor_hmp_printf(hmp, "  used:\n");
+    monitor_hmp_printf(hmp, "    flags: %d\n", e->used->flags);
+    monitor_hmp_printf(hmp, "    idx:   %d\n", e->used->idx);
 
     qapi_free_VirtioQueueElement(e);
 }
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index a563f6066bb4..4075b5b001ae 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -103,10 +103,11 @@ abort:
 
 static void xen_bus_print_dev(Monitor *mon, DeviceState *dev, int indent)
 {
+    MonitorHMP *hmp = MONITOR_HMP(mon);
     XenDevice *xendev = XEN_DEVICE(dev);
 
-    monitor_printf(mon, "%*sname = '%s' frontend_id = %u\n",
-                   indent, "", xendev->name, xendev->frontend_id);
+    monitor_hmp_printf(hmp, "%*sname = '%s' frontend_id = %u\n",
+                       indent, "", xendev->name, xendev->frontend_id);
 }
 
 static char *xen_bus_get_dev_path(DeviceState *dev)
diff --git a/include/disas/disas.h b/include/disas/disas.h
index c702b1effc1c..47daa9b4d2df 100644
--- a/include/disas/disas.h
+++ b/include/disas/disas.h
@@ -1,13 +1,15 @@
 #ifndef QEMU_DISAS_H
 #define QEMU_DISAS_H
 
+#include "monitor/hmp.h"
+
 /* Disassemble this for me please... (debugging). */
 #ifdef CONFIG_TCG
 void disas(FILE *out, const void *code, size_t size);
 void target_disas(FILE *out, CPUState *cpu, const DisasContextBase *db);
 #endif
 
-void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
+void monitor_disas(MonitorHMP *hmp, CPUState *cpu, uint64_t pc,
                    int nb_insn, bool is_physical);
 
 #ifdef CONFIG_PLUGIN
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
index 3fd17048b319..f10bf83df86d 100644
--- a/include/monitor/hmp.h
+++ b/include/monitor/hmp.h
@@ -38,10 +38,10 @@ void monitor_new_hmp(const char *id, const char *chardev_id,
 
 MonitorHMP *monitor_cur_hmp(void);
 
-int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
+int monitor_hmp_vprintf(MonitorHMP *mon, const char *fmt, va_list ap)
     G_GNUC_PRINTF(2, 0);
-int monitor_printf(Monitor *mon, const char *fmt, ...) G_GNUC_PRINTF(2, 3);
-void monitor_printc(Monitor *mon, int ch);
+int monitor_hmp_printf(MonitorHMP *mon, const char *fmt, ...) G_GNUC_PRINTF(2, 3);
+void monitor_hmp_printc(MonitorHMP *mon, int ch);
 
 void monitor_hmp_read_command(MonitorHMP *hmp, int show_prompt);
 int monitor_hmp_read_password(MonitorHMP *hmp, ReadLineFunc *readline_func,
@@ -58,7 +58,7 @@ CPUState *monitor_hmp_get_cpu(MonitorHMP *hmp);
 int monitor_hmp_get_cpu_index(MonitorHMP *hmp);
 
 bool hmp_handle_error(MonitorHMP *hmp, Error *err);
-void hmp_help_cmd(Monitor *mon, const char *name);
+void hmp_help_cmd(MonitorHMP *hmp, const char *name);
 strList *hmp_split_at_comma(const char *str);
 
 void hmp_info_name(MonitorHMP *hmp, const QDict *qdict);
@@ -114,11 +114,11 @@ void hmp_set_password(MonitorHMP *hmp, const QDict *qdict);
 void hmp_expire_password(MonitorHMP *hmp, const QDict *qdict);
 void hmp_change(MonitorHMP *hmp, const QDict *qdict);
 #ifdef CONFIG_VNC
-void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
+void hmp_change_vnc(MonitorHMP *hmp, const char *device, const char *target,
                     const char *arg, const char *read_only, bool force,
                     Error **errp);
 #endif
-void hmp_change_medium(Monitor *mon, const char *device, const char *target,
+void hmp_change_medium(MonitorHMP *hmp, const char *device, const char *target,
                        const char *arg, const char *read_only, bool force,
                        Error **errp);
 void hmp_migrate(MonitorHMP *hmp, const QDict *qdict);
diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c
index 3c0931796ce2..bdbb2aaa99db 100644
--- a/migration/dirtyrate.c
+++ b/migration/dirtyrate.c
@@ -858,34 +858,33 @@ struct DirtyRateInfo *qmp_query_dirty_rate(bool has_calc_time_unit,
 
 void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     DirtyRateInfo *info = query_dirty_rate_info(TIME_UNIT_SECOND);
 
-    monitor_printf(mon, "Status: %s\n",
-                   DirtyRateStatus_str(info->status));
-    monitor_printf(mon, "Start Time: %"PRIi64" (ms)\n",
-                   info->start_time);
+    monitor_hmp_printf(hmp, "Status: %s\n",
+                       DirtyRateStatus_str(info->status));
+    monitor_hmp_printf(hmp, "Start Time: %"PRIi64" (ms)\n",
+                       info->start_time);
     if (info->mode == DIRTY_RATE_MEASURE_MODE_PAGE_SAMPLING) {
-        monitor_printf(mon, "Sample Pages: %"PRIu64" (per GB)\n",
-                       info->sample_pages);
+        monitor_hmp_printf(hmp, "Sample Pages: %"PRIu64" (per GB)\n",
+                           info->sample_pages);
     }
-    monitor_printf(mon, "Period: %"PRIi64" (sec)\n",
-                   info->calc_time);
-    monitor_printf(mon, "Mode: %s\n",
-                   DirtyRateMeasureMode_str(info->mode));
-    monitor_printf(mon, "Dirty rate: ");
+    monitor_hmp_printf(hmp, "Period: %"PRIi64" (sec)\n",
+                       info->calc_time);
+    monitor_hmp_printf(hmp, "Mode: %s\n",
+                       DirtyRateMeasureMode_str(info->mode));
+    monitor_hmp_printf(hmp, "Dirty rate: ");
     if (info->has_dirty_rate) {
-        monitor_printf(mon, "%"PRIi64" (MB/s)\n", info->dirty_rate);
+        monitor_hmp_printf(hmp, "%"PRIi64" (MB/s)\n", info->dirty_rate);
         if (info->has_vcpu_dirty_rate) {
             DirtyRateVcpuList *rate, *head = info->vcpu_dirty_rate;
             for (rate = head; rate != NULL; rate = rate->next) {
-                monitor_printf(mon, "vcpu[%"PRIi64"], Dirty rate: %"PRIi64
-                               " (MB/s)\n", rate->value->id,
-                               rate->value->dirty_rate);
+                monitor_hmp_printf(hmp, "vcpu[%"PRIi64"], Dirty rate: %"PRIi64
+                                   " (MB/s)\n", rate->value->id,
+                                   rate->value->dirty_rate);
             }
         }
     } else {
-        monitor_printf(mon, "(not ready)\n");
+        monitor_hmp_printf(hmp, "(not ready)\n");
     }
 
     qapi_free_DirtyRateVcpuList(info->vcpu_dirty_rate);
@@ -894,7 +893,6 @@ void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int64_t sec = qdict_get_try_int(qdict, "second", 0);
     int64_t sample_pages = qdict_get_try_int(qdict, "sample_pages_per_GB", -1);
     bool has_sample_pages = (sample_pages != -1);
@@ -904,13 +902,13 @@ void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
     Error *err = NULL;
 
     if (!sec) {
-        monitor_printf(mon, "Incorrect period length specified!\n");
+        monitor_hmp_printf(hmp, "Incorrect period length specified!\n");
         return;
     }
 
     if (dirty_ring && dirty_bitmap) {
-        monitor_printf(mon, "Either dirty ring or dirty bitmap "
-                       "can be specified!\n");
+        monitor_hmp_printf(hmp, "Either dirty ring or dirty bitmap "
+                           "can be specified!\n");
         return;
     }
 
@@ -930,7 +928,7 @@ void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "Starting dirty rate measurement with period %"PRIi64
-                   " seconds\n", sec);
-    monitor_printf(mon, "[Please use 'info dirty_rate' to check results]\n");
+    monitor_hmp_printf(hmp, "Starting dirty rate measurement with period %"PRIi64
+                       " seconds\n", sec);
+    monitor_hmp_printf(hmp, "[Please use 'info dirty_rate' to check results]\n");
 }
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index 73a974259478..6fe189471899 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -36,23 +36,23 @@
 #include "options.h"
 #include "migration.h"
 
-static void migration_global_dump(Monitor *mon)
+static void migration_global_dump(MonitorHMP *hmp)
 {
     MigrationState *ms = migrate_get_current();
 
-    monitor_printf(mon, "Globals:\n");
-    monitor_printf(mon, "  store-global-state: %s\n",
-                   ms->store_global_state ? "on" : "off");
-    monitor_printf(mon, "  only-migratable: %s\n",
-                   only_migratable ? "on" : "off");
-    monitor_printf(mon, "  send-configuration: %s\n",
-                   ms->send_configuration ? "on" : "off");
-    monitor_printf(mon, "  send-section-footer: %s\n",
-                   ms->send_section_footer ? "on" : "off");
-    monitor_printf(mon, "  send-switchover-start: %s\n",
-                   ms->send_switchover_start ? "on" : "off");
-    monitor_printf(mon, "  clear-bitmap-shift: %u\n",
-                   ms->clear_bitmap_shift);
+    monitor_hmp_printf(hmp, "Globals:\n");
+    monitor_hmp_printf(hmp, "  store-global-state: %s\n",
+                       ms->store_global_state ? "on" : "off");
+    monitor_hmp_printf(hmp, "  only-migratable: %s\n",
+                       only_migratable ? "on" : "off");
+    monitor_hmp_printf(hmp, "  send-configuration: %s\n",
+                       ms->send_configuration ? "on" : "off");
+    monitor_hmp_printf(hmp, "  send-section-footer: %s\n",
+                       ms->send_section_footer ? "on" : "off");
+    monitor_hmp_printf(hmp, "  send-switchover-start: %s\n",
+                       ms->send_switchover_start ? "on" : "off");
+    monitor_hmp_printf(hmp, "  clear-bitmap-shift: %u\n",
+                       ms->clear_bitmap_shift);
 }
 
 static const gchar *format_time_str(uint64_t us)
@@ -68,11 +68,11 @@ static const gchar *format_time_str(uint64_t us)
     return g_strdup_printf("%"PRIu64" %s", us, units[index]);
 }
 
-static void migration_dump_blocktime(Monitor *mon, MigrationInfo *info)
+static void migration_dump_blocktime(MonitorHMP *hmp, MigrationInfo *info)
 {
     if (info->has_postcopy_blocktime) {
-        monitor_printf(mon, "Postcopy Blocktime (ms): %" PRIu32 "\n",
-                       info->postcopy_blocktime);
+        monitor_hmp_printf(hmp, "Postcopy Blocktime (ms): %" PRIu32 "\n",
+                           info->postcopy_blocktime);
     }
 
     if (info->has_postcopy_vcpu_blocktime) {
@@ -80,25 +80,25 @@ static void migration_dump_blocktime(Monitor *mon, MigrationInfo *info)
         const char *sep = "";
         int count = 0;
 
-        monitor_printf(mon, "Postcopy vCPU Blocktime (ms):\n [");
+        monitor_hmp_printf(hmp, "Postcopy vCPU Blocktime (ms):\n [");
 
         while (item) {
-            monitor_printf(mon, "%s%"PRIu32, sep, item->value);
+            monitor_hmp_printf(hmp, "%s%"PRIu32, sep, item->value);
             item = item->next;
             /* Each line 10 vcpu results, newline if there's more */
             sep = ((++count % 10 == 0) && item) ? ",\n  " : ", ";
         }
-        monitor_printf(mon, "]\n");
+        monitor_hmp_printf(hmp, "]\n");
     }
 
     if (info->has_postcopy_latency) {
-        monitor_printf(mon, "Postcopy Latency (ns): %" PRIu64 "\n",
-                       info->postcopy_latency);
+        monitor_hmp_printf(hmp, "Postcopy Latency (ns): %" PRIu64 "\n",
+                           info->postcopy_latency);
     }
 
     if (info->has_postcopy_non_vcpu_latency) {
-        monitor_printf(mon, "Postcopy non-vCPU Latency (ns): %" PRIu64 "\n",
-                       info->postcopy_non_vcpu_latency);
+        monitor_hmp_printf(hmp, "Postcopy non-vCPU Latency (ns): %" PRIu64 "\n",
+                           info->postcopy_non_vcpu_latency);
     }
 
     if (info->has_postcopy_vcpu_latency) {
@@ -106,29 +106,29 @@ static void migration_dump_blocktime(Monitor *mon, MigrationInfo *info)
         const char *sep = "";
         int count = 0;
 
-        monitor_printf(mon, "Postcopy vCPU Latencies (ns):\n [");
+        monitor_hmp_printf(hmp, "Postcopy vCPU Latencies (ns):\n [");
 
         while (item) {
-            monitor_printf(mon, "%s%"PRIu64, sep, item->value);
+            monitor_hmp_printf(hmp, "%s%"PRIu64, sep, item->value);
             item = item->next;
             /* Each line 10 vcpu results, newline if there's more */
             sep = ((++count % 10 == 0) && item) ? ",\n  " : ", ";
         }
-        monitor_printf(mon, "]\n");
+        monitor_hmp_printf(hmp, "]\n");
     }
 
     if (info->has_postcopy_latency_dist) {
         uint64List *item = info->postcopy_latency_dist;
         int count = 0;
 
-        monitor_printf(mon, "Postcopy Latency Distribution:\n");
+        monitor_hmp_printf(hmp, "Postcopy Latency Distribution:\n");
 
         while (item) {
             g_autofree const gchar *from = format_time_str(1UL << count);
             g_autofree const gchar *to = format_time_str(1UL << (count + 1));
 
-            monitor_printf(mon, "  [ %8s - %8s ]: %10"PRIu64"\n",
-                           from, to, item->value);
+            monitor_hmp_printf(hmp, "  [ %8s - %8s ]: %10"PRIu64"\n",
+                               from, to, item->value);
             item = item->next;
             count++;
         }
@@ -137,7 +137,6 @@ static void migration_dump_blocktime(Monitor *mon, MigrationInfo *info)
 
 void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     bool show_all = qdict_get_try_bool(qdict, "all", false);
     MigrationInfo *info;
 
@@ -145,59 +144,59 @@ void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict)
 
     if (info->blocked_reasons) {
         strList *reasons = info->blocked_reasons;
-        monitor_printf(mon, "Outgoing migration blocked:\n");
+        monitor_hmp_printf(hmp, "Outgoing migration blocked:\n");
         while (reasons) {
-            monitor_printf(mon, "  %s\n", reasons->value);
+            monitor_hmp_printf(hmp, "  %s\n", reasons->value);
             reasons = reasons->next;
         }
     }
 
     if (info->has_status) {
-        monitor_printf(mon, "Status: \t\t%s",
-                       MigrationStatus_str(info->status));
+        monitor_hmp_printf(hmp, "Status: \t\t%s",
+                           MigrationStatus_str(info->status));
         if ((info->status == MIGRATION_STATUS_FAILED ||
              info->status == MIGRATION_STATUS_POSTCOPY_PAUSED) &&
             info->error_desc) {
-            monitor_printf(mon, " (%s)\n", info->error_desc);
+            monitor_hmp_printf(hmp, " (%s)\n", info->error_desc);
         } else {
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
 
         if (info->total_time) {
-            monitor_printf(mon, "Time (ms): \t\ttotal=%" PRIu64,
-                           info->total_time);
+            monitor_hmp_printf(hmp, "Time (ms): \t\ttotal=%" PRIu64,
+                               info->total_time);
             if (info->has_setup_time) {
-                monitor_printf(mon, ", setup=%" PRIu64,
-                               info->setup_time);
+                monitor_hmp_printf(hmp, ", setup=%" PRIu64,
+                                   info->setup_time);
             }
             if (info->has_expected_downtime) {
-                monitor_printf(mon, ", exp_down=%" PRIu64,
-                               info->expected_downtime);
+                monitor_hmp_printf(hmp, ", exp_down=%" PRIu64,
+                                   info->expected_downtime);
             }
             if (info->has_downtime) {
-                monitor_printf(mon, ", down=%" PRIu64,
-                               info->downtime);
+                monitor_hmp_printf(hmp, ", down=%" PRIu64,
+                                   info->downtime);
             }
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
     }
 
     if (info->has_remaining) {
         g_autofree char *remaining = size_to_str(info->remaining);
-        monitor_printf(mon, "Remaining: \t\t%s\n", remaining);
+        monitor_hmp_printf(hmp, "Remaining: \t\t%s\n", remaining);
     }
 
     if (info->has_socket_address) {
         SocketAddressList *addr;
 
-        monitor_printf(mon, "Sockets: [\n");
+        monitor_hmp_printf(hmp, "Sockets: [\n");
 
         for (addr = info->socket_address; addr; addr = addr->next) {
             char *s = socket_uri(addr->value);
-            monitor_printf(mon, "\t%s\n", s);
+            monitor_hmp_printf(hmp, "\t%s\n", s);
             g_free(s);
         }
-        monitor_printf(mon, "]\n");
+        monitor_hmp_printf(hmp, "]\n");
     }
 
     if (info->ram) {
@@ -209,219 +208,217 @@ void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict)
         g_autofree char *str_multifd = size_to_str(info->ram->multifd_bytes);
         g_autofree char *str_postcopy = size_to_str(info->ram->postcopy_bytes);
 
-        monitor_printf(mon, "RAM info:\n");
-        monitor_printf(mon, "  Throughput (Mbps): \t%0.2f\n",
-                       info->ram->mbps);
-        monitor_printf(mon, "  Sizes: \t\tpagesize=%s, total=%s\n",
-                       str_psize, str_total);
-        monitor_printf(mon, "  Transfers: \t\ttransferred=%s, remain=%s\n",
-                       str_transferred, str_remaining);
-        monitor_printf(mon, "    Channels: \t\tprecopy=%s, "
-                       "multifd=%s, postcopy=%s",
-                       str_precopy, str_multifd, str_postcopy);
+        monitor_hmp_printf(hmp, "RAM info:\n");
+        monitor_hmp_printf(hmp, "  Throughput (Mbps): \t%0.2f\n",
+                           info->ram->mbps);
+        monitor_hmp_printf(hmp, "  Sizes: \t\tpagesize=%s, total=%s\n",
+                           str_psize, str_total);
+        monitor_hmp_printf(hmp, "  Transfers: \t\ttransferred=%s, remain=%s\n",
+                           str_transferred, str_remaining);
+        monitor_hmp_printf(hmp, "    Channels: \t\tprecopy=%s, "
+                           "multifd=%s, postcopy=%s",
+                           str_precopy, str_multifd, str_postcopy);
 
         if (info->vfio) {
             g_autofree char *str_vfio = size_to_str(info->vfio->transferred);
 
-            monitor_printf(mon, ", vfio=%s", str_vfio);
+            monitor_hmp_printf(hmp, ", vfio=%s", str_vfio);
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
 
-        monitor_printf(mon, "    Page Types: \tnormal=%" PRIu64
-                       ", zero=%" PRIu64 "\n",
-                       info->ram->normal, info->ram->duplicate);
-        monitor_printf(mon, "  Page Rates (pps): \ttransfer=%" PRIu64,
-                       info->ram->pages_per_second);
+        monitor_hmp_printf(hmp, "    Page Types: \tnormal=%" PRIu64
+                           ", zero=%" PRIu64 "\n",
+                           info->ram->normal, info->ram->duplicate);
+        monitor_hmp_printf(hmp, "  Page Rates (pps): \ttransfer=%" PRIu64,
+                           info->ram->pages_per_second);
         if (info->ram->dirty_pages_rate) {
-            monitor_printf(mon, ", dirty=%" PRIu64,
-                           info->ram->dirty_pages_rate);
+            monitor_hmp_printf(hmp, ", dirty=%" PRIu64,
+                               info->ram->dirty_pages_rate);
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
 
-        monitor_printf(mon, "  Others: \t\tdirty_syncs=%" PRIu64,
-                       info->ram->dirty_sync_count);
+        monitor_hmp_printf(hmp, "  Others: \t\tdirty_syncs=%" PRIu64,
+                           info->ram->dirty_sync_count);
         if (info->ram->postcopy_requests) {
-            monitor_printf(mon, ", postcopy_req=%" PRIu64,
-                           info->ram->postcopy_requests);
+            monitor_hmp_printf(hmp, ", postcopy_req=%" PRIu64,
+                               info->ram->postcopy_requests);
         }
         if (info->ram->downtime_bytes) {
-            monitor_printf(mon, ", downtime_bytes=%" PRIu64,
-                           info->ram->downtime_bytes);
+            monitor_hmp_printf(hmp, ", downtime_bytes=%" PRIu64,
+                               info->ram->downtime_bytes);
         }
         if (info->ram->dirty_sync_missed_zero_copy) {
-            monitor_printf(mon, ", zerocopy_fallbacks=%" PRIu64,
-                           info->ram->dirty_sync_missed_zero_copy);
+            monitor_hmp_printf(hmp, ", zerocopy_fallbacks=%" PRIu64,
+                               info->ram->dirty_sync_missed_zero_copy);
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
     }
 
     if (!show_all) {
         goto out;
     }
 
-    migration_global_dump(mon);
+    migration_global_dump(hmp);
 
     if (info->xbzrle_cache) {
-        monitor_printf(mon, "XBZRLE: size=%" PRIu64
-                       ", transferred=%" PRIu64
-                       ", pages=%" PRIu64
-                       ", miss=%" PRIu64 "\n"
-                       "  miss_rate=%0.2f"
-                       ", encode_rate=%0.2f"
-                       ", overflow=%" PRIu64 "\n",
-                       info->xbzrle_cache->cache_size,
-                       info->xbzrle_cache->bytes,
-                       info->xbzrle_cache->pages,
-                       info->xbzrle_cache->cache_miss,
-                       info->xbzrle_cache->cache_miss_rate,
-                       info->xbzrle_cache->encoding_rate,
-                       info->xbzrle_cache->overflow);
+        monitor_hmp_printf(hmp, "XBZRLE: size=%" PRIu64
+                           ", transferred=%" PRIu64
+                           ", pages=%" PRIu64
+                           ", miss=%" PRIu64 "\n"
+                           "  miss_rate=%0.2f"
+                           ", encode_rate=%0.2f"
+                           ", overflow=%" PRIu64 "\n",
+                           info->xbzrle_cache->cache_size,
+                           info->xbzrle_cache->bytes,
+                           info->xbzrle_cache->pages,
+                           info->xbzrle_cache->cache_miss,
+                           info->xbzrle_cache->cache_miss_rate,
+                           info->xbzrle_cache->encoding_rate,
+                           info->xbzrle_cache->overflow);
     }
 
     if (info->has_cpu_throttle_percentage) {
-        monitor_printf(mon, "CPU Throttle (%%): %" PRIu64 "\n",
-                       info->cpu_throttle_percentage);
+        monitor_hmp_printf(hmp, "CPU Throttle (%%): %" PRIu64 "\n",
+                           info->cpu_throttle_percentage);
     }
 
     if (info->has_dirty_limit_throttle_time_per_round) {
-        monitor_printf(mon, "Dirty-limit Throttle (us): %" PRIu64 "\n",
-                       info->dirty_limit_throttle_time_per_round);
+        monitor_hmp_printf(hmp, "Dirty-limit Throttle (us): %" PRIu64 "\n",
+                           info->dirty_limit_throttle_time_per_round);
     }
 
     if (info->has_dirty_limit_ring_full_time) {
-        monitor_printf(mon, "Dirty-limit Ring Full (us): %" PRIu64 "\n",
-                       info->dirty_limit_ring_full_time);
+        monitor_hmp_printf(hmp, "Dirty-limit Ring Full (us): %" PRIu64 "\n",
+                           info->dirty_limit_ring_full_time);
     }
 
-    migration_dump_blocktime(mon, info);
+    migration_dump_blocktime(hmp, info);
 out:
     qapi_free_MigrationInfo(info);
 }
 
 void hmp_info_migrate_capabilities(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     MigrationCapabilityStatusList *caps, *cap;
 
     caps = qmp_query_migrate_capabilities(NULL);
 
     if (caps) {
         for (cap = caps; cap; cap = cap->next) {
-            monitor_printf(mon, "%s: %s\n",
-                           MigrationCapability_str(cap->value->capability),
-                           cap->value->state ? "on" : "off");
+            monitor_hmp_printf(hmp, "%s: %s\n",
+                               MigrationCapability_str(cap->value->capability),
+                               cap->value->state ? "on" : "off");
         }
     }
 
     qapi_free_MigrationCapabilityStatusList(caps);
 }
 
-static void monitor_print_cpr_exec_command(Monitor *mon, strList *args)
+static void monitor_print_cpr_exec_command(MonitorHMP *hmp, strList *args)
 {
-    monitor_printf(mon, "%s:",
+    monitor_hmp_printf(hmp, "%s:",
         MigrationParameter_str(MIGRATION_PARAMETER_CPR_EXEC_COMMAND));
 
     while (args) {
-        monitor_printf(mon, " %s", args->value);
+        monitor_hmp_printf(hmp, " %s", args->value);
         args = args->next;
     }
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
 }
 
 void hmp_info_migrate_parameters(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     MigrationParameters *params;
     MigrationState *s = migrate_get_current();
 
     params = qmp_query_migrate_parameters(NULL);
 
     if (params) {
-        monitor_printf(mon, "%s: %" PRIu64 " ms\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " ms\n",
             MigrationParameter_str(MIGRATION_PARAMETER_ANNOUNCE_INITIAL),
             params->announce_initial);
-        monitor_printf(mon, "%s: %" PRIu64 " ms\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " ms\n",
             MigrationParameter_str(MIGRATION_PARAMETER_ANNOUNCE_MAX),
             params->announce_max);
-        monitor_printf(mon, "%s: %" PRIu64 "\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 "\n",
             MigrationParameter_str(MIGRATION_PARAMETER_ANNOUNCE_ROUNDS),
             params->announce_rounds);
-        monitor_printf(mon, "%s: %" PRIu64 " ms\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " ms\n",
             MigrationParameter_str(MIGRATION_PARAMETER_ANNOUNCE_STEP),
             params->announce_step);
         assert(params->has_throttle_trigger_threshold);
-        monitor_printf(mon, "%s: %u\n",
+        monitor_hmp_printf(hmp, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_THROTTLE_TRIGGER_THRESHOLD),
             params->throttle_trigger_threshold);
         assert(params->has_cpu_throttle_initial);
-        monitor_printf(mon, "%s: %u\n",
+        monitor_hmp_printf(hmp, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL),
             params->cpu_throttle_initial);
         assert(params->has_cpu_throttle_increment);
-        monitor_printf(mon, "%s: %u\n",
+        monitor_hmp_printf(hmp, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT),
             params->cpu_throttle_increment);
         assert(params->has_cpu_throttle_tailslow);
-        monitor_printf(mon, "%s: %s\n",
+        monitor_hmp_printf(hmp, "%s: %s\n",
             MigrationParameter_str(MIGRATION_PARAMETER_CPU_THROTTLE_TAILSLOW),
             params->cpu_throttle_tailslow ? "on" : "off");
         assert(params->has_max_cpu_throttle);
-        monitor_printf(mon, "%s: %u\n",
+        monitor_hmp_printf(hmp, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_THROTTLE),
             params->max_cpu_throttle);
         assert(params->tls_creds);
-        monitor_printf(mon, "%s: '%s'\n",
+        monitor_hmp_printf(hmp, "%s: '%s'\n",
             MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
                        params->tls_creds->u.s);
         assert(params->tls_hostname);
-        monitor_printf(mon, "%s: '%s'\n",
+        monitor_hmp_printf(hmp, "%s: '%s'\n",
             MigrationParameter_str(MIGRATION_PARAMETER_TLS_HOSTNAME),
                        params->tls_hostname->u.s);
         assert(params->tls_authz);
-        monitor_printf(mon, "%s: '%s'\n",
+        monitor_hmp_printf(hmp, "%s: '%s'\n",
             MigrationParameter_str(MIGRATION_PARAMETER_TLS_AUTHZ),
                        params->tls_authz->u.s);
         assert(params->has_max_bandwidth);
-        monitor_printf(mon, "%s: %" PRIu64 " bytes/second\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " bytes/second\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MAX_BANDWIDTH),
             params->max_bandwidth);
         assert(params->has_avail_switchover_bandwidth);
-        monitor_printf(mon, "%s: %" PRIu64 " bytes/second\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " bytes/second\n",
             MigrationParameter_str(MIGRATION_PARAMETER_AVAIL_SWITCHOVER_BANDWIDTH),
             params->avail_switchover_bandwidth);
         assert(params->has_max_postcopy_bandwidth);
-        monitor_printf(mon, "%s: %" PRIu64 " bytes/second\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " bytes/second\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MAX_POSTCOPY_BANDWIDTH),
             params->max_postcopy_bandwidth);
         assert(params->has_downtime_limit);
-        monitor_printf(mon, "%s: %" PRIu64 " ms\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " ms\n",
             MigrationParameter_str(MIGRATION_PARAMETER_DOWNTIME_LIMIT),
             params->downtime_limit);
         assert(params->has_x_checkpoint_delay);
-        monitor_printf(mon, "%s: %u ms\n",
+        monitor_hmp_printf(hmp, "%s: %u ms\n",
             MigrationParameter_str(MIGRATION_PARAMETER_X_CHECKPOINT_DELAY),
             params->x_checkpoint_delay);
-        monitor_printf(mon, "%s: %u\n",
+        monitor_hmp_printf(hmp, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MULTIFD_CHANNELS),
             params->multifd_channels);
-        monitor_printf(mon, "%s: %s\n",
+        monitor_hmp_printf(hmp, "%s: %s\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MULTIFD_COMPRESSION),
             MultiFDCompression_str(params->multifd_compression));
         assert(params->has_zero_page_detection);
-        monitor_printf(mon, "%s: %s\n",
+        monitor_hmp_printf(hmp, "%s: %s\n",
             MigrationParameter_str(MIGRATION_PARAMETER_ZERO_PAGE_DETECTION),
             qapi_enum_lookup(&ZeroPageDetection_lookup,
                 params->zero_page_detection));
-        monitor_printf(mon, "%s: %" PRIu64 " bytes\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " bytes\n",
             MigrationParameter_str(MIGRATION_PARAMETER_XBZRLE_CACHE_SIZE),
             params->xbzrle_cache_size);
 
         if (s->has_block_bitmap_mapping) {
             const BitmapMigrationNodeAliasList *bmnal;
 
-            monitor_printf(mon, "%s:\n",
-                           MigrationParameter_str(
-                               MIGRATION_PARAMETER_BLOCK_BITMAP_MAPPING));
+            monitor_hmp_printf(hmp, "%s:\n",
+                               MigrationParameter_str(
+                                   MIGRATION_PARAMETER_BLOCK_BITMAP_MAPPING));
 
             for (bmnal = params->block_bitmap_mapping;
                  bmnal;
@@ -430,47 +427,47 @@ void hmp_info_migrate_parameters(MonitorHMP *hmp, const QDict *qdict)
                 const BitmapMigrationNodeAlias *bmna = bmnal->value;
                 const BitmapMigrationBitmapAliasList *bmbal;
 
-                monitor_printf(mon, "  '%s' -> '%s'\n",
-                               bmna->node_name, bmna->alias);
+                monitor_hmp_printf(hmp, "  '%s' -> '%s'\n",
+                                   bmna->node_name, bmna->alias);
 
                 for (bmbal = bmna->bitmaps; bmbal; bmbal = bmbal->next) {
                     const BitmapMigrationBitmapAlias *bmba = bmbal->value;
 
-                    monitor_printf(mon, "    '%s' -> '%s'\n",
-                                   bmba->name, bmba->alias);
+                    monitor_hmp_printf(hmp, "    '%s' -> '%s'\n",
+                                       bmba->name, bmba->alias);
                 }
             }
         }
 
-        monitor_printf(mon, "%s: %" PRIu64 " ms\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " ms\n",
         MigrationParameter_str(MIGRATION_PARAMETER_X_VCPU_DIRTY_LIMIT_PERIOD),
         params->x_vcpu_dirty_limit_period);
 
-        monitor_printf(mon, "%s: %" PRIu64 " MB/s\n",
+        monitor_hmp_printf(hmp, "%s: %" PRIu64 " MB/s\n",
             MigrationParameter_str(MIGRATION_PARAMETER_VCPU_DIRTY_LIMIT),
             params->vcpu_dirty_limit);
 
         assert(params->has_mode);
-        monitor_printf(mon, "%s: %s\n",
+        monitor_hmp_printf(hmp, "%s: %s\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MODE),
             qapi_enum_lookup(&MigMode_lookup, params->mode));
 
         if (params->has_direct_io) {
-            monitor_printf(mon, "%s: %s\n",
-                           MigrationParameter_str(
-                               MIGRATION_PARAMETER_DIRECT_IO),
-                           params->direct_io ? "on" : "off");
+            monitor_hmp_printf(hmp, "%s: %s\n",
+                               MigrationParameter_str(
+                                   MIGRATION_PARAMETER_DIRECT_IO),
+                               params->direct_io ? "on" : "off");
         }
 
         if (params->has_x_rdma_chunk_size) {
-            monitor_printf(mon, "%s: %" PRIu64 " bytes\n",
-                           MigrationParameter_str(
-                               MIGRATION_PARAMETER_X_RDMA_CHUNK_SIZE),
-                           params->x_rdma_chunk_size);
+            monitor_hmp_printf(hmp, "%s: %" PRIu64 " bytes\n",
+                               MigrationParameter_str(
+                                   MIGRATION_PARAMETER_X_RDMA_CHUNK_SIZE),
+                               params->x_rdma_chunk_size);
         }
 
         assert(params->has_cpr_exec_command);
-        monitor_print_cpr_exec_command(mon, params->cpr_exec_command);
+        monitor_print_cpr_exec_command(hmp, params->cpr_exec_command);
     }
 
     qapi_free_MigrationParameters(params);
@@ -857,12 +854,12 @@ void hmp_migrate(MonitorHMP *hmp, const QDict *qdict)
     if (uri_cpr) {
         if (migrate_mode() != MIG_MODE_CPR_TRANSFER) {
             error_setg(&err, "-c can only be used in cpr-transfer mode");
-            hmp_handle_error(mon, err);
+            hmp_handle_error(hmp, err);
             return;
         }
 
         if (!migrate_uri_parse(uri_cpr, &channel_cpr, &err)) {
-            hmp_handle_error(mon, err);
+            hmp_handle_error(hmp, err);
             return;
         }
 
@@ -879,8 +876,8 @@ void hmp_migrate(MonitorHMP *hmp, const QDict *qdict)
         HMPMigrationStatus *status;
 
         if (!hmp->use_readline) {
-            monitor_printf(mon, "terminal does not allow synchronous "
-                           "migration, continuing detached\n");
+            monitor_hmp_printf(hmp, "terminal does not allow synchronous "
+                               "migration, continuing detached\n");
             return;
         }
         monitor_suspend(mon);
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 89cc19c2431d..1834e3c1f697 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -105,26 +105,24 @@ strList *hmp_split_at_comma(const char *str)
 
 void hmp_info_name(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     NameInfo *info;
 
     info = qmp_query_name(NULL);
     if (info->name) {
-        monitor_printf(mon, "%s\n", info->name);
+        monitor_hmp_printf(hmp, "%s\n", info->name);
     }
     qapi_free_NameInfo(info);
 }
 
 void hmp_info_version(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     VersionInfo *info;
 
     info = qmp_query_version(NULL);
 
-    monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
-                   info->qemu->major, info->qemu->minor, info->qemu->micro,
-                   info->package);
+    monitor_hmp_printf(hmp, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
+                       info->qemu->major, info->qemu->minor, info->qemu->micro,
+                       info->package);
 
     qapi_free_VersionInfo(info);
 }
@@ -145,13 +143,12 @@ void hmp_stop(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_sync_profile(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *op = qdict_get_try_str(qdict, "op");
 
     if (op == NULL) {
         bool on = qsp_is_enabled();
 
-        monitor_printf(mon, "sync-profile is %s\n", on ? "on" : "off");
+        monitor_hmp_printf(hmp, "sync-profile is %s\n", on ? "on" : "off");
         return;
     }
     if (!strcmp(op, "on")) {
@@ -179,14 +176,13 @@ void hmp_exit_preconfig(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_cpu(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int64_t cpu_index;
 
     /* XXX: drop the monitor_hmp_set_cpu() usage when all HMP commands that
             use it are converted to the QAPI */
     cpu_index = qdict_get_int(qdict, "index");
     if (monitor_hmp_set_cpu(hmp, cpu_index) < 0) {
-        monitor_printf(mon, "invalid CPU index\n");
+        monitor_hmp_printf(hmp, "invalid CPU index\n");
     }
 }
 
@@ -200,7 +196,6 @@ void hmp_cont(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_change(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *device = qdict_get_str(qdict, "device");
     const char *target = qdict_get_str(qdict, "target");
     const char *arg = qdict_get_try_str(qdict, "arg");
@@ -210,11 +205,11 @@ void hmp_change(MonitorHMP *hmp, const QDict *qdict)
 
 #ifdef CONFIG_VNC
     if (strcmp(device, "vnc") == 0) {
-        hmp_change_vnc(mon, device, target, arg, read_only, force, &err);
+        hmp_change_vnc(hmp, device, target, arg, read_only, force, &err);
     } else
 #endif
     {
-        hmp_change_medium(mon, device, target, arg, read_only, force, &err);
+        hmp_change_medium(hmp, device, target, arg, read_only, force, &err);
     }
 
     hmp_handle_error(hmp, err);
@@ -242,21 +237,20 @@ void hmp_closefd(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_iothreads(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
     IOThreadInfoList *info;
     IOThreadInfo *value;
 
     for (info = info_list; info; info = info->next) {
         value = info->value;
-        monitor_printf(mon, "%s:\n", value->id);
-        monitor_printf(mon, "  thread_id=%" PRId64 "\n", value->thread_id);
-        monitor_printf(mon, "  poll-max-ns=%" PRId64 "\n", value->poll_max_ns);
-        monitor_printf(mon, "  poll-grow=%" PRId64 "\n", value->poll_grow);
-        monitor_printf(mon, "  poll-shrink=%" PRId64 "\n", value->poll_shrink);
-        monitor_printf(mon, "  poll-weight=%" PRId64 "\n", value->poll_weight);
-        monitor_printf(mon, "  aio-max-batch=%" PRId64 "\n",
-                       value->aio_max_batch);
+        monitor_hmp_printf(hmp, "%s:\n", value->id);
+        monitor_hmp_printf(hmp, "  thread_id=%" PRId64 "\n", value->thread_id);
+        monitor_hmp_printf(hmp, "  poll-max-ns=%" PRId64 "\n", value->poll_max_ns);
+        monitor_hmp_printf(hmp, "  poll-grow=%" PRId64 "\n", value->poll_grow);
+        monitor_hmp_printf(hmp, "  poll-shrink=%" PRId64 "\n", value->poll_shrink);
+        monitor_hmp_printf(hmp, "  poll-weight=%" PRId64 "\n", value->poll_weight);
+        monitor_hmp_printf(hmp, "  aio-max-batch=%" PRId64 "\n",
+                           value->aio_max_batch);
     }
 
     qapi_free_IOThreadInfoList(info_list);
@@ -264,26 +258,23 @@ void hmp_info_iothreads(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_help(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    hmp_help_cmd(mon, qdict_get_try_str(qdict, "name"));
+    hmp_help_cmd(hmp, qdict_get_try_str(qdict, "name"));
 }
 
 void hmp_clear(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     /*
      * Send an ANSI escape sequence:
      * "\x1b[H" - move cursor to top-left
      * "\x1b[2J" - clear visible screen
      * "\x1b[3J" - clear scrollback
      */
-    monitor_printf(mon, "\x1b[H\x1b[2J\x1b[3J");
+    monitor_hmp_printf(hmp, "\x1b[H\x1b[2J\x1b[3J");
 }
 
 void hmp_info_help(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    hmp_help_cmd(mon, "info");
+    hmp_help_cmd(hmp, "info");
 }
 
 void hmp_info_sync_profile(MonitorHMP *hmp, const QDict *qdict)
@@ -299,7 +290,6 @@ void hmp_info_sync_profile(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_history(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int i;
     const char *str;
 
@@ -312,7 +302,7 @@ void hmp_info_history(MonitorHMP *hmp, const QDict *qdict)
         if (!str) {
             break;
         }
-        monitor_printf(mon, "%d: '%s'\n", i, str);
+        monitor_hmp_printf(hmp, "%d: '%s'\n", i, str);
         i++;
     }
 }
@@ -328,7 +318,6 @@ void hmp_logfile(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_log(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int mask;
     const char *items = qdict_get_str(qdict, "items");
     Error *err = NULL;
@@ -338,7 +327,7 @@ void hmp_log(MonitorHMP *hmp, const QDict *qdict)
     } else {
         mask = qemu_str_to_log_mask(items);
         if (!mask) {
-            hmp_help_cmd(mon, "log");
+            hmp_help_cmd(hmp, "log");
             return;
         }
     }
@@ -350,7 +339,6 @@ void hmp_log(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_gdbserver(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     const char *device = qdict_get_try_str(qdict, "device");
 
@@ -361,43 +349,41 @@ void hmp_gdbserver(MonitorHMP *hmp, const QDict *qdict)
     if (!gdbserver_start(device, &err)) {
         error_report_err(err);
     } else if (strcmp(device, "none") == 0) {
-        monitor_printf(mon, "Disabled gdbserver\n");
+        monitor_hmp_printf(hmp, "Disabled gdbserver\n");
     } else {
-        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
-                       device);
+        monitor_hmp_printf(hmp, "Waiting for gdb connection on device '%s'\n",
+                           device);
     }
 }
 
 void hmp_print(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int format = qdict_get_int(qdict, "format");
     hwaddr val = qdict_get_int(qdict, "val");
 
     switch(format) {
     case 'o':
-        monitor_printf(mon, "%#" HWADDR_PRIo, val);
+        monitor_hmp_printf(hmp, "0x%" HWADDR_PRIo, val);
         break;
     case 'x':
-        monitor_printf(mon, "%#" HWADDR_PRIx, val);
+        monitor_hmp_printf(hmp, "0x%" HWADDR_PRIx, val);
         break;
     case 'u':
-        monitor_printf(mon, "%" HWADDR_PRIu, val);
+        monitor_hmp_printf(hmp, "%" HWADDR_PRIu, val);
         break;
     default:
     case 'd':
-        monitor_printf(mon, "%" HWADDR_PRId, val);
+        monitor_hmp_printf(hmp, "%" HWADDR_PRId, val);
         break;
     case 'c':
-        monitor_printc(mon, val);
+        monitor_hmp_printc(hmp, val);
         break;
     }
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
 }
 
 void hmp_sum(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     uint32_t addr;
     uint16_t sum;
     uint32_t start = qdict_get_int(qdict, "start");
@@ -411,12 +397,11 @@ void hmp_sum(MonitorHMP *hmp, const QDict *qdict)
         sum = (sum >> 1) | (sum << 15);
         sum += val;
     }
-    monitor_printf(mon, "%05d\n", sum);
+    monitor_hmp_printf(hmp, "%05d\n", sum);
 }
 
 void hmp_ioport_read(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int size = qdict_get_int(qdict, "size");
     int addr = qdict_get_int(qdict, "addr");
     int has_index = qdict_haskey(qdict, "index");
@@ -445,8 +430,8 @@ void hmp_ioport_read(MonitorHMP *hmp, const QDict *qdict)
         suffix = 'l';
         break;
     }
-    monitor_printf(mon, "port%c[0x%04x] = 0x%0*x\n",
-                   suffix, addr, size * 2, val);
+    monitor_hmp_printf(hmp, "port%c[0x%04x] = 0x%0*x\n",
+                       suffix, addr, size * 2, val);
 }
 
 void hmp_ioport_write(MonitorHMP *hmp, const QDict *qdict)
@@ -473,7 +458,6 @@ void hmp_ioport_write(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_boot_set(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *local_err = NULL;
     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
 
@@ -481,7 +465,7 @@ void hmp_boot_set(MonitorHMP *hmp, const QDict *qdict)
     if (local_err) {
         error_report_err(local_err);
     } else {
-        monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
+        monitor_hmp_printf(hmp, "boot device list now set to %s\n", bootdevice);
     }
 }
 
@@ -507,7 +491,7 @@ void hmp_dumpdtb(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(MONITOR(hmp), "DTB dumped to '%s'\n", filename);
+    monitor_hmp_printf(hmp, "DTB dumped to '%s'\n", filename);
 }
 #endif
 
@@ -573,14 +557,13 @@ int monitor_hmp_get_cpu_index(MonitorHMP *hmp)
 
 void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
     int vcpu = qdict_get_try_int(qdict, "vcpu", -1);
     CPUState *cs;
 
     if (all_cpus) {
         CPU_FOREACH(cs) {
-            monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
+            monitor_hmp_printf(hmp, "\nCPU#%d\n", cs->cpu_index);
             cpu_dump_state(cs, NULL, CPU_DUMP_FPU | CPU_DUMP_VPU);
         }
     } else {
@@ -588,14 +571,14 @@ void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict)
 
         if (!cs) {
             if (vcpu >= 0) {
-                monitor_printf(mon, "CPU#%d not available\n", vcpu);
+                monitor_hmp_printf(hmp, "CPU#%d not available\n", vcpu);
             } else {
-                monitor_printf(mon, "No CPU available\n");
+                monitor_hmp_printf(hmp, "No CPU available\n");
             }
             return;
         }
 
-        monitor_printf(mon, "\nCPU#%d\n", cs->cpu_index);
+        monitor_hmp_printf(hmp, "\nCPU#%d\n", cs->cpu_index);
         cpu_dump_state(cs, NULL, CPU_DUMP_FPU | CPU_DUMP_VPU);
     }
 }
@@ -603,7 +586,6 @@ void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict)
 static void memory_dump(MonitorHMP *hmp, int count, int format, int wsize,
                         uint64_t addr, bool is_physical)
 {
-    Monitor *mon = MONITOR(hmp);
     int l, line_size, i, max_digits, len;
     uint8_t buf[16];
     uint64_t v;
@@ -612,12 +594,12 @@ static void memory_dump(MonitorHMP *hmp, int count, int format, int wsize,
     const bool big_endian = target_big_endian();
 
     if (!cs && (format == 'i' || !is_physical)) {
-        monitor_printf(mon, "Can not dump without CPU\n");
+        monitor_hmp_printf(hmp, "Can not dump without CPU\n");
         return;
     }
 
     if (format == 'i') {
-        monitor_disas(mon, cs, addr, count, is_physical);
+        monitor_disas(hmp, cs, addr, count, is_physical);
         return;
     }
 
@@ -647,7 +629,7 @@ static void memory_dump(MonitorHMP *hmp, int count, int format, int wsize,
     }
 
     while (len > 0) {
-        monitor_printf(mon, "%0*" PRIx64 ":", addr_width, addr);
+        monitor_hmp_printf(hmp, "%0*" PRIx64 ":", addr_width, addr);
         l = len;
         if (l > line_size) {
             l = line_size;
@@ -657,12 +639,12 @@ static void memory_dump(MonitorHMP *hmp, int count, int format, int wsize,
             MemTxResult r = address_space_read(as, addr,
                                                MEMTXATTRS_UNSPECIFIED, buf, l);
             if (r != MEMTX_OK) {
-                monitor_printf(mon, " Cannot access memory\n");
+                monitor_hmp_printf(hmp, " Cannot access memory\n");
                 break;
             }
         } else {
             if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
-                monitor_printf(mon, " Cannot access memory\n");
+                monitor_hmp_printf(hmp, " Cannot access memory\n");
                 break;
             }
         }
@@ -683,27 +665,27 @@ static void memory_dump(MonitorHMP *hmp, int count, int format, int wsize,
                 v = (big_endian ? ldq_be_p : ldq_le_p)(buf + i);
                 break;
             }
-            monitor_printf(mon, " ");
+            monitor_hmp_printf(hmp, " ");
             switch (format) {
             case 'o':
-                monitor_printf(mon, "0%*" PRIo64, max_digits, v);
+                monitor_hmp_printf(hmp, "0%*" PRIo64, max_digits, v);
                 break;
             case 'x':
-                monitor_printf(mon, "0x%0*" PRIx64, max_digits, v);
+                monitor_hmp_printf(hmp, "0x%0*" PRIx64, max_digits, v);
                 break;
             case 'u':
-                monitor_printf(mon, "%*" PRIu64, max_digits, v);
+                monitor_hmp_printf(hmp, "%*" PRIu64, max_digits, v);
                 break;
             case 'd':
-                monitor_printf(mon, "%*" PRId64, max_digits, v);
+                monitor_hmp_printf(hmp, "%*" PRId64, max_digits, v);
                 break;
             case 'c':
-                monitor_printc(mon, v);
+                monitor_hmp_printc(hmp, v);
                 break;
             }
             i += wsize;
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
         addr += l;
         len -= l;
     }
@@ -731,7 +713,6 @@ void hmp_physical_memory_dump(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_gpa2hva(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     hwaddr addr = qdict_get_int(qdict, "addr");
     Error *local_err = NULL;
     MemoryRegion *mr = NULL;
@@ -743,29 +724,28 @@ void hmp_gpa2hva(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
-                   " (%s) is %p\n",
-                   addr, mr->name, ptr);
+    monitor_hmp_printf(hmp, "Host virtual address for 0x%" HWADDR_PRIx
+                       " (%s) is %p\n",
+                       addr, mr->name, ptr);
 
     memory_region_unref(mr);
 }
 
 void hmp_gva2gpa(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     vaddr addr = qdict_get_int(qdict, "addr");
     CPUState *cs = monitor_hmp_get_cpu(hmp);
     TranslateForDebugResult tres;
 
     if (!cs) {
-        monitor_printf(mon, "No cpu\n");
+        monitor_hmp_printf(hmp, "No cpu\n");
         return;
     }
 
     if (!cpu_translate_for_debug(cs, addr, &tres)) {
-        monitor_printf(mon, "Unmapped\n");
+        monitor_hmp_printf(hmp, "Unmapped\n");
     } else {
-        monitor_printf(mon, "gpa: 0x%" HWADDR_PRIx "\n", tres.physaddr);
+        monitor_hmp_printf(hmp, "gpa: 0x%" HWADDR_PRIx "\n", tres.physaddr);
     }
 }
 
@@ -806,7 +786,6 @@ out:
 
 void hmp_gpa2hpa(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     hwaddr addr = qdict_get_int(qdict, "addr");
     Error *local_err = NULL;
     MemoryRegion *mr = NULL;
@@ -823,9 +802,9 @@ void hmp_gpa2hpa(MonitorHMP *hmp, const QDict *qdict)
     if (local_err) {
         error_report_err(local_err);
     } else {
-        monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
-                       " (%s) is 0x%" PRIx64 "\n",
-                       addr, mr->name, (uint64_t) physaddr);
+        monitor_hmp_printf(hmp, "Host physical address for 0x%" HWADDR_PRIx
+                           " (%s) is 0x%" PRIx64 "\n",
+                           addr, mr->name, (uint64_t) physaddr);
     }
 
     memory_region_unref(mr);
diff --git a/monitor/hmp.c b/monitor/hmp.c
index 2484a2310dff..e5f8b9c576e0 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -80,8 +80,6 @@ static void monitor_hmp_set_readline(Object *obj, bool val, Error **errp)
     hmp->use_readline = val;
 }
 
-int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
-    G_GNUC_PRINTF(2, 0);
 static void monitor_hmp_accept_input(Monitor *mon);
 static void monitor_hmp_complete(UserCreatable *uc, Error **errp);
 static bool monitor_hmp_prepare_delete(UserCreatable *uc, Error **errp);
@@ -95,7 +93,6 @@ static void monitor_hmp_class_init(ObjectClass *cls, const void *data)
                                    monitor_hmp_get_readline,
                                    monitor_hmp_set_readline);
 
-    moncls->vprintf = monitor_hmp_vprintf;
     moncls->accept_input = monitor_hmp_accept_input;
 
     ucc->complete = monitor_hmp_complete;
@@ -114,12 +111,6 @@ static void monitor_hmp_init(Object *obj)
     hmp->use_readline = true;
 }
 
-int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
-{
-    g_autofree char *buf = g_strdup_vprintf(fmt, ap);
-    return monitor_puts(mon, buf);
-}
-
 static void monitor_hmp_accept_input(Monitor *mon)
 {
     qemu_mutex_lock(&mon->mon_lock);
@@ -166,8 +157,7 @@ int monitor_hmp_read_password(MonitorHMP *hmp, ReadLineFunc *readline_func,
         /* prompt is printed on return from the command handler */
         return 0;
     } else {
-        monitor_printf(&hmp->parent_obj,
-                       "terminal does not support password prompting\n");
+        monitor_hmp_printf(hmp, "terminal does not support password prompting\n");
         return -ENOTTY;
     }
 }
@@ -319,7 +309,7 @@ static bool cmd_available(const HMPCommand *cmd)
     return phase_check(PHASE_MACHINE_READY) || cmd_can_preconfig(cmd);
 }
 
-static void help_cmd_dump_one(Monitor *mon,
+static void help_cmd_dump_one(MonitorHMP *mon,
                               const HMPCommand *cmd,
                               char **prefix_args,
                               int prefix_args_nb)
@@ -331,13 +321,13 @@ static void help_cmd_dump_one(Monitor *mon,
     }
 
     for (i = 0; i < prefix_args_nb; i++) {
-        monitor_printf(mon, "%s ", prefix_args[i]);
+        monitor_hmp_printf(mon, "%s ", prefix_args[i]);
     }
-    monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help);
+    monitor_hmp_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help);
 }
 
 /* @args[@arg_index] is the valid command need to find in @cmds */
-static void help_cmd_dump(Monitor *mon, const HMPCommand *cmds,
+static void help_cmd_dump(MonitorHMP *mon, const HMPCommand *cmds,
                           char **args, int nb_args, int arg_index)
 {
     const HMPCommand *cmd;
@@ -367,13 +357,13 @@ static void help_cmd_dump(Monitor *mon, const HMPCommand *cmds,
     }
 
     /* Command not found */
-    monitor_printf(mon, "unknown command: '");
+    monitor_hmp_printf(mon, "unknown command: '");
     for (i = 0; i <= arg_index; i++) {
-        monitor_printf(mon, "%s%s", args[i], i == arg_index ? "'\n" : " ");
+        monitor_hmp_printf(mon, "%s%s", args[i], i == arg_index ? "'\n" : " ");
     }
 }
 
-void hmp_help_cmd(Monitor *mon, const char *name)
+void hmp_help_cmd(MonitorHMP *mon, const char *name)
 {
     char *args[MAX_ARGS];
     int nb_args = 0;
@@ -383,15 +373,15 @@ void hmp_help_cmd(Monitor *mon, const char *name)
         /* special case for log, directly dump and return */
         if (!strcmp(name, "log")) {
             const QEMULogItem *item;
-            monitor_printf(mon, "Log items (comma separated):\n");
-            monitor_printf(mon, "%-15s %s\n", "none", "remove all logs");
+            monitor_hmp_printf(mon, "Log items (comma separated):\n");
+            monitor_hmp_printf(mon, "%-15s %s\n", "none", "remove all logs");
             for (item = qemu_log_items; item->mask != 0; item++) {
-                monitor_printf(mon, "%-15s %s\n", item->name, item->help);
+                monitor_hmp_printf(mon, "%-15s %s\n", item->name, item->help);
             }
 #ifdef CONFIG_TRACE_LOG
-            monitor_printf(mon, "trace:PATTERN   enable trace events\n");
-            monitor_printf(mon, "\nUse \"log trace:help\" to get a list of "
-                           "trace events.\n\n");
+            monitor_hmp_printf(mon, "trace:PATTERN   enable trace events\n");
+            monitor_hmp_printf(mon, "\nUse \"log trace:help\" to get a list of "
+                               "trace events.\n\n");
 #endif
             return;
         }
@@ -455,12 +445,12 @@ static sigjmp_buf expr_env;
 static int get_monitor_def(MonitorHMP *mon, int64_t *pval, const char *name);
 
 static G_NORETURN G_GNUC_PRINTF(2, 3)
-void expr_error(Monitor *mon, const char *fmt, ...)
+void expr_error(MonitorHMP *mon, const char *fmt, ...)
 {
     va_list ap;
     va_start(ap, fmt);
-    monitor_vprintf(mon, fmt, ap);
-    monitor_printf(mon, "\n");
+    monitor_hmp_vprintf(mon, fmt, ap);
+    monitor_hmp_printf(mon, "\n");
     va_end(ap);
     siglongjmp(expr_env, 1);
 }
@@ -475,9 +465,9 @@ static void next(void)
     }
 }
 
-static int64_t expr_sum(Monitor *mon);
+static int64_t expr_sum(MonitorHMP *mon);
 
-static int64_t expr_unary(Monitor *mon)
+static int64_t expr_unary(MonitorHMP *mon)
 {
     int64_t n;
     char *p;
@@ -535,8 +525,8 @@ static int64_t expr_unary(Monitor *mon)
                 pch++;
             }
             *q = 0;
-            if (!gdb_get_register(MONITOR_HMP(mon), &reg, buf)
-                && get_monitor_def(MONITOR_HMP(mon), &reg, buf) < 0) {
+            if (!gdb_get_register(mon, &reg, buf)
+                && get_monitor_def(mon, &reg, buf) < 0) {
                 expr_error(mon, "unknown register");
             }
             n = reg;
@@ -564,7 +554,7 @@ static int64_t expr_unary(Monitor *mon)
     return n;
 }
 
-static int64_t expr_prod(Monitor *mon)
+static int64_t expr_prod(MonitorHMP *mon)
 {
     int64_t val, val2;
     int op;
@@ -598,7 +588,7 @@ static int64_t expr_prod(Monitor *mon)
     return val;
 }
 
-static int64_t expr_logic(Monitor *mon)
+static int64_t expr_logic(MonitorHMP *mon)
 {
     int64_t val, val2;
     int op;
@@ -627,7 +617,7 @@ static int64_t expr_logic(Monitor *mon)
     return val;
 }
 
-static int64_t expr_sum(Monitor *mon)
+static int64_t expr_sum(MonitorHMP *mon)
 {
     int64_t val, val2;
     int op;
@@ -649,7 +639,7 @@ static int64_t expr_sum(Monitor *mon)
     return val;
 }
 
-static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
+static int get_expr(MonitorHMP *mon, int64_t *pval, const char **pp)
 {
     pch = *pp;
     if (sigsetjmp(expr_env, 0)) {
@@ -664,7 +654,7 @@ static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
     return 0;
 }
 
-static int get_double(Monitor *mon, double *pval, const char **pp)
+static int get_double(MonitorHMP *mon, double *pval, const char **pp)
 {
     const char *p = *pp;
     char *tailp;
@@ -672,12 +662,12 @@ static int get_double(Monitor *mon, double *pval, const char **pp)
 
     d = strtod(p, &tailp);
     if (tailp == p) {
-        monitor_printf(mon, "Number expected\n");
+        monitor_hmp_printf(mon, "Number expected\n");
         return -1;
     }
     if (d != d || d - d != 0) {
         /* NaN or infinity */
-        monitor_printf(mon, "Bad number\n");
+        monitor_hmp_printf(mon, "Bad number\n");
         return -1;
     }
     *pval = d;
@@ -788,7 +778,6 @@ static const HMPCommand *monitor_parse_command(MonitorHMP *hmp,
                                                const char **cmdp,
                                                HMPCommand *table)
 {
-    Monitor *mon = &hmp->parent_obj;
     const char *p;
     const HMPCommand *cmd;
     char cmdname[256];
@@ -801,14 +790,14 @@ static const HMPCommand *monitor_parse_command(MonitorHMP *hmp,
 
     cmd = search_dispatch_table(table, cmdname);
     if (!cmd) {
-        monitor_printf(mon, "unknown command: '%.*s'\n",
-                       (int)(p - cmdp_start), cmdp_start);
+        monitor_hmp_printf(hmp, "unknown command: '%.*s'\n",
+                           (int)(p - cmdp_start), cmdp_start);
         return NULL;
     }
     if (!cmd_available(cmd)) {
-        monitor_printf(mon, "Command '%.*s' not available "
-                            "until machine initialization has completed.\n",
-                       (int)(p - cmdp_start), cmdp_start);
+        monitor_hmp_printf(hmp, "Command '%.*s' not available "
+                           "until machine initialization has completed.\n",
+                           (int)(p - cmdp_start), cmdp_start);
         return NULL;
     }
 
@@ -832,7 +821,7 @@ static const HMPCommand *monitor_parse_command(MonitorHMP *hmp,
  * Else, insert command arguments into a QDict, and return it.
  * Note: On success, caller has to free the QDict structure.
  */
-static QDict *monitor_parse_arguments(Monitor *mon,
+static QDict *monitor_parse_arguments(MonitorHMP *mon,
                                       const char **endp,
                                       const HMPCommand *cmd)
 {
@@ -873,15 +862,15 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                 if (ret < 0) {
                     switch (c) {
                     case 'F':
-                        monitor_printf(mon, "%s: filename expected\n",
-                                       cmd->name);
+                        monitor_hmp_printf(mon, "%s: filename expected\n",
+                                           cmd->name);
                         break;
                     case 'B':
-                        monitor_printf(mon, "%s: block device name expected\n",
-                                       cmd->name);
+                        monitor_hmp_printf(mon, "%s: block device name expected\n",
+                                           cmd->name);
                         break;
                     default:
-                        monitor_printf(mon, "%s: string expected\n", cmd->name);
+                        monitor_hmp_printf(mon, "%s: string expected\n", cmd->name);
                         break;
                     }
                     goto fail;
@@ -968,8 +957,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                     }
                 next:
                     if (*p != '\0' && !qemu_isspace(*p)) {
-                        monitor_printf(mon, "invalid char in format: '%c'\n",
-                                       *p);
+                        monitor_hmp_printf(mon, "invalid char in format: '%c'\n",
+                                           *p);
                         goto fail;
                     }
                     if (format < 0) {
@@ -1030,12 +1019,12 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                 }
                 /* Check if 'i' is greater than 32-bit */
                 if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
-                    monitor_printf(mon, "\'%s\' has failed: ", cmd->name);
-                    monitor_printf(mon, "integer is for 32-bit values\n");
+                    monitor_hmp_printf(mon, "\'%s\' has failed: ", cmd->name);
+                    monitor_hmp_printf(mon, "integer is for 32-bit values\n");
                     goto fail;
                 } else if (c == 'M') {
                     if (val < 0) {
-                        monitor_printf(mon, "enter a positive value\n");
+                        monitor_hmp_printf(mon, "enter a positive value\n");
                         goto fail;
                     }
                     val *= MiB;
@@ -1060,7 +1049,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                 }
                 ret = qemu_strtosz_MiB(p, &end, &val);
                 if (ret < 0 || val > INT64_MAX) {
-                    monitor_printf(mon, "invalid size\n");
+                    monitor_hmp_printf(mon, "invalid size\n");
                     goto fail;
                 }
                 qdict_put_int(qdict, key, val);
@@ -1094,7 +1083,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                     }
                 }
                 if (*p && !qemu_isspace(*p)) {
-                    monitor_printf(mon, "Unknown unit suffix\n");
+                    monitor_hmp_printf(mon, "Unknown unit suffix\n");
                     goto fail;
                 }
                 qdict_put(qdict, key, qnum_from_double(val));
@@ -1117,7 +1106,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
                     val = false;
                 } else {
-                    monitor_printf(mon, "Expected 'on' or 'off'\n");
+                    monitor_hmp_printf(mon, "Expected 'on' or 'off'\n");
                     goto fail;
                 }
                 qdict_put_bool(qdict, key, val);
@@ -1141,8 +1130,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                     p++;
                     if (c != *p) {
                         if (!is_valid_option(p, typestr)) {
-                            monitor_printf(mon, "%s: unsupported option -%c\n",
-                                           cmd->name, *p);
+                            monitor_hmp_printf(mon, "%s: unsupported option -%c\n",
+                                               cmd->name, *p);
                             goto fail;
                         } else {
                             skip_key = 1;
@@ -1159,8 +1148,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                         }
                         ret = get_str(buf, sizeof(buf), &p);
                         if (ret < 0) {
-                            monitor_printf(mon, "%s: value expected for -%c\n",
-                                           cmd->name, *tmp);
+                            monitor_hmp_printf(mon, "%s: value expected for -%c\n",
+                                               cmd->name, *tmp);
                             goto fail;
                         }
                         qdict_put_str(qdict, key, buf);
@@ -1191,8 +1180,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                 }
                 len = strlen(p);
                 if (len <= 0) {
-                    monitor_printf(mon, "%s: string expected\n",
-                                   cmd->name);
+                    monitor_hmp_printf(mon, "%s: string expected\n",
+                                       cmd->name);
                     goto fail;
                 }
                 qdict_put_str(qdict, key, p);
@@ -1201,7 +1190,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
             break;
         default:
         bad_type:
-            monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c);
+            monitor_hmp_printf(mon, "%s: unknown type '%c'\n", cmd->name, c);
             goto fail;
         }
         g_free(key);
@@ -1212,8 +1201,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
         p++;
     }
     if (*p != '\0') {
-        monitor_printf(mon, "%s: extraneous characters at the end of line\n",
-                       cmd->name);
+        monitor_hmp_printf(mon, "%s: extraneous characters at the end of line\n",
+                           cmd->name);
         goto fail;
     }
 
@@ -1281,19 +1270,19 @@ void handle_hmp_command(MonitorHMP *hmp, const char *cmdline)
 
     if (!cmd->cmd && !cmd->cmd_info_hrt) {
         /* FIXME: is it useful to try autoload modules here ??? */
-        monitor_printf(&hmp->parent_obj, "Command \"%.*s\" is not available.\n",
-                       (int)(cmdline - cmd_start), cmd_start);
+        monitor_hmp_printf(hmp, "Command \"%.*s\" is not available.\n",
+                           (int)(cmdline - cmd_start), cmd_start);
         return;
     }
 
-    qdict = monitor_parse_arguments(&hmp->parent_obj, &cmdline, cmd);
+    qdict = monitor_parse_arguments(hmp, &cmdline, cmd);
     if (!qdict) {
         while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
             cmdline--;
         }
-        monitor_printf(&hmp->parent_obj,
-                       "Try \"help %.*s\" for more information\n",
-                       (int)(cmdline - cmd_start), cmd_start);
+        monitor_hmp_printf(hmp,
+                           "Try \"help %.*s\" for more information\n",
+                           (int)(cmdline - cmd_start), cmd_start);
         return;
     }
 
@@ -1539,7 +1528,7 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size)
         }
     } else {
         if (size == 0 || buf[size - 1] != 0) {
-            monitor_printf(&hmp->parent_obj, "corrupted command\n");
+            monitor_hmp_printf(hmp, "corrupted command\n");
         } else {
             handle_hmp_command(hmp, (char *)buf);
         }
@@ -1580,8 +1569,8 @@ static void monitor_event(void *opaque, QEMUChrEvent event)
         break;
 
     case CHR_EVENT_OPENED:
-        monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
-                       "information\n", QEMU_VERSION);
+        monitor_hmp_printf(hmp, "QEMU %s monitor - type 'help' for more "
+                           "information\n", QEMU_VERSION);
         qemu_mutex_lock(&mon->mon_lock);
         hmp->reset_seen = 1;
         if (!mon->mux_out && hmp->use_readline) {
@@ -1613,7 +1602,7 @@ static void G_GNUC_PRINTF(2, 3) monitor_readline_printf(void *opaque,
     MonitorHMP *hmp = opaque;
     va_list ap;
     va_start(ap, fmt);
-    monitor_vprintf(&hmp->parent_obj, fmt, ap);
+    monitor_hmp_vprintf(hmp, fmt, ap);
     va_end(ap);
 }
 
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
index afdda1386080..c198c12eaa00 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -108,12 +108,6 @@ typedef struct HMPCommand {
 struct MonitorClass {
     ObjectClass parent_class;
 
-    /*
-     * If non-NULL, the monitor is able to print messages
-     * for attention of the client user
-     */
-    int (*vprintf)(Monitor *mon, const char *fmt, va_list ap)
-        G_GNUC_PRINTF(2, 0);
     /*
      * If non-NULL, the monitor is able to send event
      * notifications back to the client
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 8528af6f79b8..da76e6e4ac19 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -272,58 +272,53 @@ int monitor_puts(Monitor *mon, const char *str)
     return monitor_puts_locked(mon, str);
 }
 
-int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
+int monitor_hmp_vprintf(MonitorHMP *mon, const char *fmt, va_list ap)
 {
-    MonitorClass *moncls;
+    g_autofree char *buf = g_strdup_vprintf(fmt, ap);
 
     if (!mon) {
         return -1;
     }
 
-    moncls = MONITOR_GET_CLASS(mon);
-    if (!moncls->vprintf) {
-        return -1;
-    }
-
-    return moncls->vprintf(mon, fmt, ap);
+    return monitor_puts(MONITOR(mon), buf);
 }
 
-int monitor_printf(Monitor *mon, const char *fmt, ...)
+int monitor_hmp_printf(MonitorHMP *mon, const char *fmt, ...)
 {
     int ret;
 
     va_list ap;
     va_start(ap, fmt);
-    ret = monitor_vprintf(mon, fmt, ap);
+    ret = monitor_hmp_vprintf(mon, fmt, ap);
     va_end(ap);
     return ret;
 }
 
-void monitor_printc(Monitor *mon, int c)
+void monitor_hmp_printc(MonitorHMP *mon, int c)
 {
-    monitor_printf(mon, "'");
+    monitor_hmp_printf(mon, "'");
     switch(c) {
     case '\'':
-        monitor_printf(mon, "\\'");
+        monitor_hmp_printf(mon, "\\'");
         break;
     case '\\':
-        monitor_printf(mon, "\\\\");
+        monitor_hmp_printf(mon, "\\\\");
         break;
     case '\n':
-        monitor_printf(mon, "\\n");
+        monitor_hmp_printf(mon, "\\n");
         break;
     case '\r':
-        monitor_printf(mon, "\\r");
+        monitor_hmp_printf(mon, "\\r");
         break;
     default:
         if (c >= 32 && c <= 126) {
-            monitor_printf(mon, "%c", c);
+            monitor_hmp_printf(mon, "%c", c);
         } else {
-            monitor_printf(mon, "\\x%02x", c);
+            monitor_hmp_printf(mon, "\\x%02x", c);
         }
         break;
     }
-    monitor_printf(mon, "'");
+    monitor_hmp_printf(mon, "'");
 }
 
 static MonitorQAPIEventConf monitor_qapi_event_conf[QAPI_EVENT__MAX] = {
diff --git a/net/net-hmp-cmds.c b/net/net-hmp-cmds.c
index 5b1c678f5d89..0d718d78aef9 100644
--- a/net/net-hmp-cmds.c
+++ b/net/net-hmp-cmds.c
@@ -28,26 +28,25 @@
 #include "qemu/help_option.h"
 #include "qemu/option.h"
 
-static void hmp_print_client_info(Monitor *mon, NetworkClientInfo *ci)
+static void hmp_print_client_info(MonitorHMP *hmp, NetworkClientInfo *ci)
 {
     NetFilterInfoList *f;
 
-    monitor_printf(mon, "%s: index=%" PRIu32 ",type=%s,%s\n",
-                   ci->name, ci->queue_index,
-                   NetClientDriver_str(ci->type), ci->info_str);
+    monitor_hmp_printf(hmp, "%s: index=%" PRIu32 ",type=%s,%s\n",
+                       ci->name, ci->queue_index,
+                       NetClientDriver_str(ci->type), ci->info_str);
     if (ci->filters) {
-        monitor_printf(mon, "filters:\n");
+        monitor_hmp_printf(hmp, "filters:\n");
         for (f = ci->filters; f; f = f->next) {
-            monitor_printf(mon, "  - %s: type=%s%s%s\n",
-                           f->value->name, f->value->type,
-                           f->value->info[0] ? "," : "", f->value->info);
+            monitor_hmp_printf(hmp, "  - %s: type=%s%s%s\n",
+                               f->value->name, f->value->type,
+                               f->value->info[0] ? "," : "", f->value->info);
         }
     }
 }
 
 void hmp_info_network(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     Error *err = NULL;
     g_autoptr(NetworkInfo) info = qmp_x_query_network(&err);
     NetHubInfoList *h;
@@ -60,13 +59,13 @@ void hmp_info_network(MonitorHMP *hmp, const QDict *qdict)
     for (h = info->hubs; h; h = h->next) {
         NetHubPortInfoList *p;
 
-        monitor_printf(mon, "hub %d\n", (int)h->value->id);
+        monitor_hmp_printf(hmp, "hub %d\n", (int)h->value->id);
         for (p = h->value->ports; p; p = p->next) {
             if (p->value->peer) {
-                monitor_printf(mon, " \\ %s: ", p->value->name);
-                hmp_print_client_info(mon, p->value->peer);
+                monitor_hmp_printf(hmp, " \\ %s: ", p->value->name);
+                hmp_print_client_info(hmp, p->value->peer);
             } else {
-                monitor_printf(mon, " \\ %s\n", p->value->name);
+                monitor_hmp_printf(hmp, " \\ %s\n", p->value->name);
             }
         }
     }
@@ -75,11 +74,11 @@ void hmp_info_network(MonitorHMP *hmp, const QDict *qdict)
         NetworkClientInfo *ci = entry->value;
 
         if (!ci->peer || ci->type == NET_CLIENT_DRIVER_NIC) {
-            hmp_print_client_info(mon, ci);
+            hmp_print_client_info(hmp, ci);
         } /* else it's a netdev connected to a NIC, printed with the NIC */
         if (ci->peer && ci->type == NET_CLIENT_DRIVER_NIC) {
-            monitor_printf(mon, " \\ ");
-            hmp_print_client_info(mon, ci->peer);
+            monitor_hmp_printf(hmp, " \\ ");
+            hmp_print_client_info(hmp, ci->peer);
         }
     }
 }
diff --git a/net/slirp.c b/net/slirp.c
index d5c190b48b76..6fbefa9ed1d7 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -711,22 +711,22 @@ error:
     return -1;
 }
 
-static SlirpState *slirp_lookup(Monitor *mon, const char *id)
+static SlirpState *slirp_lookup(MonitorHMP *hmp, const char *id)
 {
     if (id) {
         NetClientState *nc = qemu_find_netdev(id);
         if (!nc) {
-            monitor_printf(mon, "unrecognized netdev id '%s'\n", id);
+            monitor_hmp_printf(hmp, "unrecognized netdev id '%s'\n", id);
             return NULL;
         }
         if (strcmp(nc->model, "user")) {
-            monitor_printf(mon, "invalid device specified\n");
+            monitor_hmp_printf(hmp, "invalid device specified\n");
             return NULL;
         }
         return DO_UPCAST(SlirpState, nc, nc);
     } else {
         if (QTAILQ_EMPTY(&slirp_stacks)) {
-            monitor_printf(mon, "user mode network stack not in use\n");
+            monitor_hmp_printf(hmp, "user mode network stack not in use\n");
             return NULL;
         }
         return QTAILQ_FIRST(&slirp_stacks);
@@ -735,7 +735,6 @@ static SlirpState *slirp_lookup(Monitor *mon, const char *id)
 
 void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     /* TODO: support removing unix fwd */
     struct sockaddr_in host_addr = {
         .sin_family = AF_INET,
@@ -753,10 +752,10 @@ void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict)
     const char *arg2 = qdict_get_try_str(qdict, "arg2");
 
     if (arg2) {
-        s = slirp_lookup(mon, arg1);
+        s = slirp_lookup(hmp, arg1);
         src_str = arg2;
     } else {
-        s = slirp_lookup(mon, NULL);
+        s = slirp_lookup(hmp, NULL);
         src_str = arg1;
     }
     if (!s) {
@@ -795,12 +794,12 @@ void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict)
     err = slirp_remove_hostfwd(s->slirp, is_udp, host_addr.sin_addr, host_port);
 #endif
 
-    monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
-                   err ? "not found" : "removed");
+    monitor_hmp_printf(hmp, "host forwarding rule for %s %s\n", src_str,
+                       err ? "not found" : "removed");
     return;
 
  fail_syntax:
-    monitor_printf(mon, "invalid format\n");
+    monitor_hmp_printf(hmp, "invalid format\n");
 }
 
 static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
@@ -960,17 +959,16 @@ static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
 
 void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *redir_str;
     SlirpState *s;
     const char *arg1 = qdict_get_str(qdict, "arg1");
     const char *arg2 = qdict_get_try_str(qdict, "arg2");
 
     if (arg2) {
-        s = slirp_lookup(mon, arg1);
+        s = slirp_lookup(hmp, arg1);
         redir_str = arg2;
     } else {
-        s = slirp_lookup(mon, NULL);
+        s = slirp_lookup(hmp, NULL);
         redir_str = arg1;
     }
     if (s) {
@@ -1228,16 +1226,15 @@ UsernetInfoList *qmp_x_query_usernet(Error **errp)
 
 void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     g_autoptr(UsernetInfoList) list = NULL;
     UsernetInfoList *entry;
 
     list = qmp_x_query_usernet(&error_abort);
     for (entry = list; entry; entry = entry->next) {
         UsernetInfo *ui = entry->value;
-        monitor_printf(mon, "Hub %d (%s):\n%s",
-                       ui->has_hub_id ? (int)ui->hub_id : -1,
-                       ui->hub_name, ui->info);
+        monitor_hmp_printf(hmp, "Hub %d (%s):\n%s",
+                           ui->has_hub_id ? (int)ui->hub_id : -1,
+                           ui->hub_name, ui->info);
     }
 }
 
diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c
index 2e2eb33371e2..bbf5980332a4 100644
--- a/qom/qom-hmp-cmds.c
+++ b/qom/qom-hmp-cmds.c
@@ -20,13 +20,12 @@
 
 void hmp_qom_list(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_try_str(qdict, "path");
     ObjectPropertyInfoList *list;
     Error *err = NULL;
 
     if (path == NULL) {
-        monitor_printf(mon, "/\n");
+        monitor_hmp_printf(hmp, "/\n");
         return;
     }
 
@@ -36,8 +35,8 @@ void hmp_qom_list(MonitorHMP *hmp, const QDict *qdict)
         while (list != NULL) {
             ObjectPropertyInfo *value = list->value;
 
-            monitor_printf(mon, "%s (%s)\n",
-                           value->name, value->type);
+            monitor_hmp_printf(hmp, "%s (%s)\n",
+                               value->name, value->type);
             list = list->next;
         }
         qapi_free_ObjectPropertyInfoList(start);
@@ -75,7 +74,6 @@ void hmp_qom_set(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_qom_get(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_str(qdict, "path");
     const char *property = qdict_get_str(qdict, "property");
     Error *err = NULL;
@@ -83,7 +81,7 @@ void hmp_qom_get(MonitorHMP *hmp, const QDict *qdict)
 
     if (err == NULL) {
         GString *str = qobject_to_json_pretty(obj, true);
-        monitor_printf(mon, "%s\n", str->str);
+        monitor_hmp_printf(hmp, "%s\n", str->str);
         g_string_free(str, true);
     }
 
@@ -96,7 +94,7 @@ typedef struct QOMCompositionState {
     int indent;
 } QOMCompositionState;
 
-static void print_qom_composition(Monitor *mon, Object *obj, int indent);
+static void print_qom_composition(MonitorHMP *hmp, Object *obj, int indent);
 
 static int qom_composition_compare(const void *a, const void *b)
 {
@@ -110,7 +108,7 @@ static int insert_qom_composition_child(Object *obj, void *opaque)
     return 0;
 }
 
-static void print_qom_composition(Monitor *mon, Object *obj, int indent)
+static void print_qom_composition(MonitorHMP *hmp, Object *obj, int indent)
 {
     GArray *children = g_array_new(false, false, sizeof(Object *));
     const char *name;
@@ -121,14 +119,14 @@ static void print_qom_composition(Monitor *mon, Object *obj, int indent)
     } else {
         name = object_get_canonical_path_component(obj);
     }
-    monitor_printf(mon, "%*s/%s (%s)\n", indent, "", name,
-                   object_get_typename(obj));
+    monitor_hmp_printf(hmp, "%*s/%s (%s)\n", indent, "", name,
+                       object_get_typename(obj));
 
     object_child_foreach(obj, insert_qom_composition_child, children);
     g_array_sort(children, qom_composition_compare);
 
     for (i = 0; i < children->len; i++) {
-        print_qom_composition(mon, g_array_index(children, Object *, i),
+        print_qom_composition(hmp, g_array_index(children, Object *, i),
                               indent + 2);
     }
     g_array_free(children, TRUE);
@@ -136,7 +134,6 @@ static void print_qom_composition(Monitor *mon, Object *obj, int indent)
 
 void hmp_info_qom_tree(MonitorHMP *hmp, const QDict *dict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *path = qdict_get_try_str(dict, "path");
     Object *obj;
     bool ambiguous = false;
@@ -144,17 +141,17 @@ void hmp_info_qom_tree(MonitorHMP *hmp, const QDict *dict)
     if (path) {
         obj = object_resolve_path(path, &ambiguous);
         if (!obj) {
-            monitor_printf(mon, "Path '%s' could not be resolved.\n", path);
+            monitor_hmp_printf(hmp, "Path '%s' could not be resolved.\n", path);
             return;
         }
         if (ambiguous) {
-            monitor_printf(mon, "Warning: Path '%s' is ambiguous.\n", path);
+            monitor_hmp_printf(hmp, "Warning: Path '%s' is ambiguous.\n", path);
             return;
         }
     } else {
         obj = qdev_get_machine();
     }
-    print_qom_composition(mon, obj, 0);
+    print_qom_composition(hmp, obj, 0);
 }
 
 void hmp_object_add(MonitorHMP *hmp, const QDict *qdict)
diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
index ef69d23ff507..965565715ef2 100644
--- a/replay/replay-debugging.c
+++ b/replay/replay-debugging.c
@@ -33,11 +33,10 @@ bool replay_running_debug(void)
 
 void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     if (replay_mode == REPLAY_MODE_NONE) {
-        monitor_printf(mon, "Record/replay is not active\n");
+        monitor_hmp_printf(hmp, "Record/replay is not active\n");
     } else {
-        monitor_printf(mon,
+        monitor_hmp_printf(hmp,
             "%s execution '%s': instruction count = %"PRId64"\n",
             replay_mode == REPLAY_MODE_RECORD ? "Recording" : "Replaying",
             replay_get_filename(), replay_get_current_icount());
diff --git a/stats/stats-hmp-cmds.c b/stats/stats-hmp-cmds.c
index cd1f1deb58bc..3d556c745d61 100644
--- a/stats/stats-hmp-cmds.c
+++ b/stats/stats-hmp-cmds.c
@@ -14,11 +14,11 @@
 #include "qobject/qdict.h"
 #include "qapi/error.h"
 
-static void print_stats_schema_value(Monitor *mon, StatsSchemaValue *value)
+static void print_stats_schema_value(MonitorHMP *hmp, StatsSchemaValue *value)
 {
     const char *unit = NULL;
-    monitor_printf(mon, "    %s (%s%s", value->name, StatsType_str(value->type),
-                   value->has_unit || value->exponent ? ", " : "");
+    monitor_hmp_printf(hmp, "    %s (%s%s", value->name, StatsType_str(value->type),
+                       value->has_unit || value->exponent ? ", " : "");
 
     if (value->has_unit) {
         if (value->unit == STATS_UNIT_SECONDS) {
@@ -31,29 +31,29 @@ static void print_stats_schema_value(Monitor *mon, StatsSchemaValue *value)
     if (unit && value->base == 10 &&
         value->exponent >= -18 && value->exponent <= 18 &&
         value->exponent % 3 == 0) {
-        monitor_puts(mon, si_prefix(value->exponent));
+        monitor_puts(MONITOR(hmp), si_prefix(value->exponent));
     } else if (unit && value->base == 2 &&
                value->exponent >= 0 && value->exponent <= 60 &&
                value->exponent % 10 == 0) {
 
-        monitor_puts(mon, iec_binary_prefix(value->exponent));
+        monitor_puts(MONITOR(hmp), iec_binary_prefix(value->exponent));
     } else if (value->exponent) {
         /* Use exponential notation and write the unit's English name */
-        monitor_printf(mon, "* %d^%d%s",
-                       value->base, value->exponent,
-                       value->has_unit ? " " : "");
+        monitor_hmp_printf(hmp, "* %d^%d%s",
+                           value->base, value->exponent,
+                           value->has_unit ? " " : "");
         unit = NULL;
     }
 
     if (value->has_unit) {
-        monitor_puts(mon, unit ? unit : StatsUnit_str(value->unit));
+        monitor_puts(MONITOR(hmp), unit ? unit : StatsUnit_str(value->unit));
     }
 
     /* Print bucket size for linear histograms */
     if (value->type == STATS_TYPE_LINEAR_HISTOGRAM && value->has_bucket_size) {
-        monitor_printf(mon, ", bucket size=%d", value->bucket_size);
+        monitor_hmp_printf(hmp, ", bucket size=%d", value->bucket_size);
     }
-    monitor_printf(mon, ")");
+    monitor_hmp_printf(hmp, ")");
 }
 
 static StatsSchemaValueList *find_schema_value_list(
@@ -71,7 +71,7 @@ static StatsSchemaValueList *find_schema_value_list(
     return NULL;
 }
 
-static void print_stats_results(Monitor *mon, StatsTarget target,
+static void print_stats_results(MonitorHMP *hmp, StatsTarget target,
                                 bool show_provider,
                                 StatsResult *result,
                                 StatsSchemaList *schema)
@@ -82,14 +82,14 @@ static void print_stats_results(Monitor *mon, StatsTarget target,
     StatsList *stats_list;
 
     if (!schema_value_list) {
-        monitor_printf(mon, "failed to find schema list for %s\n",
-                       StatsProvider_str(result->provider));
+        monitor_hmp_printf(hmp, "failed to find schema list for %s\n",
+                           StatsProvider_str(result->provider));
         return;
     }
 
     if (show_provider) {
-        monitor_printf(mon, "provider: %s\n",
-                       StatsProvider_str(result->provider));
+        monitor_hmp_printf(hmp, "provider: %s\n",
+                           StatsProvider_str(result->provider));
     }
 
     for (stats_list = result->stats; stats_list;
@@ -103,31 +103,31 @@ static void print_stats_results(Monitor *mon, StatsTarget target,
         /* Find schema entry */
         while (!g_str_equal(stats->name, schema_value->name)) {
             if (!schema_value_list->next) {
-                monitor_printf(mon, "failed to find schema entry for %s\n",
-                               stats->name);
+                monitor_hmp_printf(hmp, "failed to find schema entry for %s\n",
+                                   stats->name);
                 return;
             }
             schema_value_list = schema_value_list->next;
             schema_value = schema_value_list->value;
         }
 
-        print_stats_schema_value(mon, schema_value);
+        print_stats_schema_value(hmp, schema_value);
 
         if (stats_value->type == QTYPE_QNUM) {
-            monitor_printf(mon, ": %" PRId64 "\n", stats_value->u.scalar);
+            monitor_hmp_printf(hmp, ": %" PRId64 "\n", stats_value->u.scalar);
         } else if (stats_value->type == QTYPE_QBOOL) {
-            monitor_printf(mon, ": %s\n", stats_value->u.boolean ? "yes" : "no");
+            monitor_hmp_printf(hmp, ": %s\n", stats_value->u.boolean ? "yes" : "no");
         } else if (stats_value->type == QTYPE_QLIST) {
             uint64List *list;
             int i;
 
-            monitor_printf(mon, ": ");
+            monitor_hmp_printf(hmp, ": ");
             for (list = stats_value->u.list, i = 1;
                  list;
                  list = list->next, i++) {
-                monitor_printf(mon, "[%d]=%" PRId64 " ", i, list->value);
+                monitor_hmp_printf(hmp, "[%d]=%" PRId64 " ", i, list->value);
             }
-            monitor_printf(mon, "\n");
+            monitor_hmp_printf(hmp, "\n");
         }
     }
 }
@@ -189,7 +189,6 @@ static StatsFilter *stats_filter(StatsTarget target, const char *names,
 
 void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *target_str = qdict_get_str(qdict, "target");
     const char *provider_str = qdict_get_try_str(qdict, "provider");
     const char *names = qdict_get_try_str(qdict, "names");
@@ -204,13 +203,13 @@ void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict)
 
     target = qapi_enum_parse(&StatsTarget_lookup, target_str, -1, &err);
     if (err) {
-        monitor_printf(mon, "invalid stats target %s\n", target_str);
+        monitor_hmp_printf(hmp, "invalid stats target %s\n", target_str);
         goto exit_no_print;
     }
     if (provider_str) {
         provider = qapi_enum_parse(&StatsProvider_lookup, provider_str, -1, &err);
         if (err) {
-            monitor_printf(mon, "invalid stats provider %s\n", provider_str);
+            monitor_hmp_printf(hmp, "invalid stats provider %s\n", provider_str);
             goto exit_no_print;
         }
     }
@@ -241,12 +240,12 @@ void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict)
         goto exit;
     }
     for (entry = stats; entry; entry = entry->next) {
-        print_stats_results(mon, target, provider_str == NULL, entry->value, schema);
+        print_stats_results(hmp, target, provider_str == NULL, entry->value, schema);
     }
 
 exit:
     if (err) {
-        monitor_printf(mon, "%s\n", error_get_pretty(err));
+        monitor_hmp_printf(hmp, "%s\n", error_get_pretty(err));
     }
 exit_no_print:
     error_free(err);
diff --git a/stubs/hmp-cmd-info_sev.c b/stubs/hmp-cmd-info_sev.c
index 6f2b87d1ad10..c9c1d10c165c 100644
--- a/stubs/hmp-cmd-info_sev.c
+++ b/stubs/hmp-cmd-info_sev.c
@@ -12,6 +12,5 @@
 
 void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
-    monitor_printf(mon, "SEV is not available in this QEMU\n");
+    monitor_hmp_printf(hmp, "SEV is not available in this QEMU\n");
 }
diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c
index b0c7002bd406..094b80721003 100644
--- a/stubs/monitor-core.c
+++ b/stubs/monitor-core.c
@@ -17,7 +17,7 @@ void qapi_event_emit(QAPIEvent event, QDict *qdict)
 {
 }
 
-int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
+int monitor_hmp_vprintf(MonitorHMP *mon, const char *fmt, va_list ap)
 {
     /*
      * Pretend 'g_test_message' is our monitor console to
diff --git a/system/dirtylimit-hmp-cmds.c b/system/dirtylimit-hmp-cmds.c
index 75194add7931..fb9338e9aef6 100644
--- a/system/dirtylimit-hmp-cmds.c
+++ b/system/dirtylimit-hmp-cmds.c
@@ -17,7 +17,6 @@
 
 void hmp_cancel_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     int64_t cpu_index = qdict_get_try_int(qdict, "cpu_index", -1);
     Error *err = NULL;
 
@@ -27,8 +26,8 @@ void hmp_cancel_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "[Please use 'info vcpu_dirty_limit' to query "
-                   "dirty limit for virtual CPU]\n");
+    monitor_hmp_printf(hmp, "[Please use 'info vcpu_dirty_limit' to query "
+                       "dirty limit for virtual CPU]\n");
 }
 
 void hmp_set_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
@@ -50,13 +49,12 @@ out:
 
 void hmp_info_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     DirtyLimitInfoList *info;
     g_autoptr(DirtyLimitInfoList) head = NULL;
     Error *err = NULL;
 
     if (!dirtylimit_in_service()) {
-        monitor_printf(mon, "Dirty page limit not enabled!\n");
+        monitor_hmp_printf(hmp, "Dirty page limit not enabled!\n");
         return;
     }
 
@@ -67,7 +65,7 @@ void hmp_info_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
     }
 
     for (info = head; info != NULL; info = info->next) {
-        monitor_printf(mon, "vcpu[%"PRIi64"], limit rate %"PRIi64 " (MB/s),"
+        monitor_hmp_printf(hmp, "vcpu[%"PRIi64"], limit rate %"PRIi64 " (MB/s),"
                             " current rate %"PRIi64 " (MB/s)\n",
                             info->value->cpu_index,
                             info->value->limit_rate,
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 5c2de2f53cc9..3860ada2a237 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -763,9 +763,10 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     return ret;
 }
 
-#define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
+#define qdev_printf(fmt, ...) \
+    monitor_hmp_printf(hmp, "%*s" fmt, indent, "", ## __VA_ARGS__)
 
-static void qdev_print_props(Monitor *mon, DeviceState *dev, DeviceClass *dc,
+static void qdev_print_props(MonitorHMP *hmp, DeviceState *dev, DeviceClass *dc,
                              int indent)
 {
     for (int i = 0, n = dc->props_count_; i < n; ++i) {
@@ -798,8 +799,9 @@ static void bus_print_dev(BusState *bus, Monitor *mon, DeviceState *dev, int ind
     }
 }
 
-static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
+static void qdev_print(MonitorHMP *hmp, DeviceState *dev, int indent)
 {
+    Monitor *mon = MONITOR(hmp);
     ObjectClass *class;
     NamedGPIOList *ngl;
     NamedClockList *ncl;
@@ -823,13 +825,13 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
     }
     class = object_get_class(OBJECT(dev));
     do {
-        qdev_print_props(mon, dev, DEVICE_CLASS(class), indent);
+        qdev_print_props(hmp, dev, DEVICE_CLASS(class), indent);
         class = object_class_get_parent(class);
     } while (class != object_class_by_name(TYPE_DEVICE));
     bus_print_dev(dev->parent_bus, mon, dev, indent);
 }
 
-static void qbus_print(Monitor *mon, BusState *bus, int indent, bool details)
+static void qbus_print(MonitorHMP *hmp, BusState *bus, int indent, bool details)
 {
     BusChild *kid;
 
@@ -842,10 +844,10 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent, bool details)
         qdev_printf("dev: %s, id \"%s\"\n", object_get_typename(OBJECT(dev)),
                     dev->id ? dev->id : "");
         if (details) {
-            qdev_print(mon, dev, indent + 2);
+            qdev_print(hmp, dev, indent + 2);
         }
         QLIST_FOREACH(child_bus, &dev->child_bus, sibling) {
-            qbus_print(mon, child_bus, indent + 2, details);
+            qbus_print(hmp, child_bus, indent + 2, details);
         }
     }
 }
@@ -853,11 +855,10 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent, bool details)
 
 void hmp_info_qtree(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     bool details = !qdict_get_try_bool(qdict, "brief", false);
 
     if (sysbus_get_default()) {
-        qbus_print(mon, sysbus_get_default(), 0, details);
+        qbus_print(hmp, sysbus_get_default(), 0, details);
     }
 }
 
diff --git a/system/runstate-hmp-cmds.c b/system/runstate-hmp-cmds.c
index 051ee45ee74c..ad70b53f8abf 100644
--- a/system/runstate-hmp-cmds.c
+++ b/system/runstate-hmp-cmds.c
@@ -25,33 +25,31 @@
 
 void hmp_info_status(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     StatusInfo *info;
 
     info = qmp_query_status(NULL);
 
-    monitor_printf(mon, "VM status: %s",
-                   info->running ? "running" : "paused");
+    monitor_hmp_printf(hmp, "VM status: %s",
+                       info->running ? "running" : "paused");
 
     if (!info->running && info->status != RUN_STATE_PAUSED) {
-        monitor_printf(mon, " (%s)", RunState_str(info->status));
+        monitor_hmp_printf(hmp, " (%s)", RunState_str(info->status));
     }
 
-    monitor_printf(mon, "\n");
+    monitor_hmp_printf(hmp, "\n");
 
     qapi_free_StatusInfo(info);
 }
 
 void hmp_one_insn_per_tb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *option = qdict_get_try_str(qdict, "option");
     AccelState *accel = current_accel();
     bool newval;
 
     if (!object_property_find(OBJECT(accel), "one-insn-per-tb")) {
-        monitor_printf(mon,
-                       "This accelerator does not support setting one-insn-per-tb\n");
+        monitor_hmp_printf(hmp,
+                           "This accelerator does not support setting one-insn-per-tb\n");
         return;
     }
 
@@ -60,7 +58,7 @@ void hmp_one_insn_per_tb(MonitorHMP *hmp, const QDict *qdict)
     } else if (!strcmp(option, "off")) {
         newval = false;
     } else {
-        monitor_printf(mon, "unexpected option %s\n", option);
+        monitor_hmp_printf(hmp, "unexpected option %s\n", option);
         return;
     }
     /* If the property exists then setting it can never fail */
diff --git a/system/tpm-hmp-cmds.c b/system/tpm-hmp-cmds.c
index 094c3f16cf50..35406e24d2c3 100644
--- a/system/tpm-hmp-cmds.c
+++ b/system/tpm-hmp-cmds.c
@@ -13,7 +13,6 @@
 
 void hmp_info_tpm(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
 #ifdef CONFIG_TPM
     TPMInfoList *info_list, *info;
     Error *err = NULL;
@@ -23,44 +22,44 @@ void hmp_info_tpm(MonitorHMP *hmp, const QDict *qdict)
 
     info_list = qmp_query_tpm(&err);
     if (err) {
-        monitor_printf(mon, "TPM device not supported\n");
+        monitor_hmp_printf(hmp, "TPM device not supported\n");
         error_free(err);
         return;
     }
 
     if (info_list) {
-        monitor_printf(mon, "TPM device:\n");
+        monitor_hmp_printf(hmp, "TPM device:\n");
     }
 
     for (info = info_list; info; info = info->next) {
         TPMInfo *ti = info->value;
-        monitor_printf(mon, " tpm%d: model=%s\n",
-                       c, TpmModel_str(ti->model));
+        monitor_hmp_printf(hmp, " tpm%d: model=%s\n",
+                           c, TpmModel_str(ti->model));
 
-        monitor_printf(mon, "  \\ %s: type=%s",
-                       ti->id, TpmType_str(ti->options->type));
+        monitor_hmp_printf(hmp, "  \\ %s: type=%s",
+                           ti->id, TpmType_str(ti->options->type));
 
         switch (ti->options->type) {
         case TPM_TYPE_PASSTHROUGH:
             tpo = ti->options->u.passthrough.data;
-            monitor_printf(mon, "%s%s%s%s",
-                           tpo->path ? ",path=" : "",
-                           tpo->path ?: "",
-                           tpo->cancel_path ? ",cancel-path=" : "",
-                           tpo->cancel_path ?: "");
+            monitor_hmp_printf(hmp, "%s%s%s%s",
+                               tpo->path ? ",path=" : "",
+                               tpo->path ?: "",
+                               tpo->cancel_path ? ",cancel-path=" : "",
+                               tpo->cancel_path ?: "");
             break;
         case TPM_TYPE_EMULATOR:
             teo = ti->options->u.emulator.data;
-            monitor_printf(mon, ",chardev=%s", teo->chardev);
+            monitor_hmp_printf(hmp, ",chardev=%s", teo->chardev);
             break;
         case TPM_TYPE__MAX:
             break;
         }
-        monitor_printf(mon, "\n");
+        monitor_hmp_printf(hmp, "\n");
         c++;
     }
     qapi_free_TPMInfoList(info_list);
 #else
-    monitor_printf(mon, "TPM device not supported\n");
+    monitor_hmp_printf(hmp, "TPM device not supported\n");
 #endif /* CONFIG_TPM */
 }
diff --git a/target/i386/cpu-apic.c b/target/i386/cpu-apic.c
index 3ae20f004b64..5d69ece15034 100644
--- a/target/i386/cpu-apic.c
+++ b/target/i386/cpu-apic.c
@@ -82,7 +82,6 @@ void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
 
 void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUState *cs;
 
     if (qdict_haskey(qdict, "apic-id")) {
@@ -98,7 +97,7 @@ void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict)
 
 
     if (!cs) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
     x86_cpu_dump_local_apic_state(cs, CPU_DUMP_FPU);
diff --git a/target/i386/monitor.c b/target/i386/monitor.c
index 72bcab131f77..46762540ba65 100644
--- a/target/i386/monitor.c
+++ b/target/i386/monitor.c
@@ -48,27 +48,27 @@ static hwaddr addr_canonical(CPUArchState *env, hwaddr addr)
     return addr;
 }
 
-static void print_pte(Monitor *mon, CPUArchState *env, hwaddr addr,
+static void print_pte(MonitorHMP *hmp, CPUArchState *env, hwaddr addr,
                       hwaddr pte, hwaddr mask)
 {
     addr = addr_canonical(env, addr);
 
-    monitor_printf(mon, HWADDR_FMT_plx ": " HWADDR_FMT_plx
-                   " %c%c%c%c%c%c%c%c%c\n",
-                   addr,
-                   pte & mask,
-                   pte & PG_NX_MASK ? 'X' : '-',
-                   pte & PG_GLOBAL_MASK ? 'G' : '-',
-                   pte & PG_PSE_MASK ? 'P' : '-',
-                   pte & PG_DIRTY_MASK ? 'D' : '-',
-                   pte & PG_ACCESSED_MASK ? 'A' : '-',
-                   pte & PG_PCD_MASK ? 'C' : '-',
-                   pte & PG_PWT_MASK ? 'T' : '-',
-                   pte & PG_USER_MASK ? 'U' : '-',
-                   pte & PG_RW_MASK ? 'W' : '-');
+    monitor_hmp_printf(hmp, HWADDR_FMT_plx ": " HWADDR_FMT_plx
+                       " %c%c%c%c%c%c%c%c%c\n",
+                       addr,
+                       pte & mask,
+                       pte & PG_NX_MASK ? 'X' : '-',
+                       pte & PG_GLOBAL_MASK ? 'G' : '-',
+                       pte & PG_PSE_MASK ? 'P' : '-',
+                       pte & PG_DIRTY_MASK ? 'D' : '-',
+                       pte & PG_ACCESSED_MASK ? 'A' : '-',
+                       pte & PG_PCD_MASK ? 'C' : '-',
+                       pte & PG_PWT_MASK ? 'T' : '-',
+                       pte & PG_USER_MASK ? 'U' : '-',
+                       pte & PG_RW_MASK ? 'W' : '-');
 }
 
-static void tlb_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void tlb_info_32(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     unsigned int l1, l2;
@@ -80,13 +80,13 @@ static void tlb_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
         if (pde & PG_PRESENT_MASK) {
             if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
                 /* 4M pages */
-                print_pte(mon, env, (l1 << 22), pde, ~((1 << 21) - 1));
+                print_pte(hmp, env, (l1 << 22), pde, ~((1 << 21) - 1));
             } else {
                 for(l2 = 0; l2 < 1024; l2++) {
                     pte = address_space_ldl_le(as, (pde & ~0xfff) + l2 * 4,
                                                attrs, NULL);
                     if (pte & PG_PRESENT_MASK) {
-                        print_pte(mon, env, (l1 << 22) + (l2 << 12),
+                        print_pte(hmp, env, (l1 << 22) + (l2 << 12),
                                   pte & ~PG_PSE_MASK,
                                   ~0xfff);
                     }
@@ -96,7 +96,7 @@ static void tlb_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
     }
 }
 
-static void tlb_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void tlb_info_pae32(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     unsigned int l1, l2, l3;
@@ -113,7 +113,7 @@ static void tlb_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
                 if (pde & PG_PRESENT_MASK) {
                     if (pde & PG_PSE_MASK) {
                         /* 2M pages with PAE, CR4.PSE is ignored */
-                        print_pte(mon, env, (l1 << 30) + (l2 << 21), pde,
+                        print_pte(hmp, env, (l1 << 30) + (l2 << 21), pde,
                                   ~((hwaddr)(1 << 20) - 1));
                     } else {
                         pt_addr = pde & 0x3fffffffff000ULL;
@@ -121,7 +121,7 @@ static void tlb_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
                             pte = address_space_ldq_le(as, pt_addr + l3 * 8,
                                                        attrs, NULL);
                             if (pte & PG_PRESENT_MASK) {
-                                print_pte(mon, env, (l1 << 30) + (l2 << 21)
+                                print_pte(hmp, env, (l1 << 30) + (l2 << 21)
                                           + (l3 << 12),
                                           pte & ~PG_PSE_MASK,
                                           ~(hwaddr)0xfff);
@@ -135,7 +135,7 @@ static void tlb_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
 }
 
 #ifdef TARGET_X86_64
-static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
+static void tlb_info_la48(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as,
         uint64_t l0, uint64_t pml4_addr)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
@@ -158,7 +158,7 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
 
             if (pdpe & PG_PSE_MASK) {
                 /* 1G pages, CR4.PSE is ignored */
-                print_pte(mon, env, (l0 << 48) + (l1 << 39) + (l2 << 30),
+                print_pte(hmp, env, (l0 << 48) + (l1 << 39) + (l2 << 30),
                         pdpe, 0x3ffffc0000000ULL);
                 continue;
             }
@@ -172,7 +172,7 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
 
                 if (pde & PG_PSE_MASK) {
                     /* 2M pages, CR4.PSE is ignored */
-                    print_pte(mon, env, (l0 << 48) + (l1 << 39) + (l2 << 30) +
+                    print_pte(hmp, env, (l0 << 48) + (l1 << 39) + (l2 << 30) +
                             (l3 << 21), pde, 0x3ffffffe00000ULL);
                     continue;
                 }
@@ -182,7 +182,7 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
                     pte = address_space_ldq_le(as, pt_addr + l4 * 8,
                                                attrs, NULL);
                     if (pte & PG_PRESENT_MASK) {
-                        print_pte(mon, env, (l0 << 48) + (l1 << 39) +
+                        print_pte(hmp, env, (l0 << 48) + (l1 << 39) +
                                 (l2 << 30) + (l3 << 21) + (l4 << 12),
                                 pte & ~PG_PSE_MASK, 0x3fffffffff000ULL);
                     }
@@ -192,7 +192,7 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
     }
 }
 
-static void tlb_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void tlb_info_la57(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     uint64_t l0;
@@ -203,7 +203,7 @@ static void tlb_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
     for (l0 = 0; l0 < 512; l0++) {
         pml5e = address_space_ldq_le(as, pml5_addr + l0 * 8, attrs, NULL);
         if (pml5e & PG_PRESENT_MASK) {
-            tlb_info_la48(mon, env, as, l0, pml5e & 0x3fffffffff000ULL);
+            tlb_info_la48(hmp, env, as, l0, pml5e & 0x3fffffffff000ULL);
         }
     }
 }
@@ -211,18 +211,17 @@ static void tlb_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
 
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env;
     AddressSpace *as;
 
     env = monitor_hmp_get_cpu_env(hmp);
     if (!env) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
 
     if (!(env->cr[0] & CR0_PG_MASK)) {
-        monitor_printf(mon, "PG disabled\n");
+        monitor_hmp_printf(hmp, "PG disabled\n");
         return;
     }
     as = cpu_get_address_space(env_cpu(env), X86ASIdx_MEM);
@@ -230,21 +229,21 @@ void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 #ifdef TARGET_X86_64
         if (env->hflags & HF_LMA_MASK) {
             if (env->cr[4] & CR4_LA57_MASK) {
-                tlb_info_la57(mon, env, as);
+                tlb_info_la57(hmp, env, as);
             } else {
-                tlb_info_la48(mon, env, as, 0, env->cr[3] & 0x3fffffffff000ULL);
+                tlb_info_la48(hmp, env, as, 0, env->cr[3] & 0x3fffffffff000ULL);
             }
         } else
 #endif
         {
-            tlb_info_pae32(mon, env, as);
+            tlb_info_pae32(hmp, env, as);
         }
     } else {
-        tlb_info_32(mon, env, as);
+        tlb_info_32(hmp, env, as);
     }
 }
 
-static void mem_print(Monitor *mon, CPUArchState *env,
+static void mem_print(MonitorHMP *hmp, CPUArchState *env,
                       hwaddr *pstart, int *plast_prot,
                       hwaddr end, int prot)
 {
@@ -252,14 +251,14 @@ static void mem_print(Monitor *mon, CPUArchState *env,
     prot1 = *plast_prot;
     if (prot != prot1) {
         if (*pstart != -1) {
-            monitor_printf(mon, HWADDR_FMT_plx "-" HWADDR_FMT_plx " "
-                           HWADDR_FMT_plx " %c%c%c\n",
-                           addr_canonical(env, *pstart),
-                           addr_canonical(env, end),
-                           addr_canonical(env, end - *pstart),
-                           prot1 & PG_USER_MASK ? 'u' : '-',
-                           'r',
-                           prot1 & PG_RW_MASK ? 'w' : '-');
+            monitor_hmp_printf(hmp, HWADDR_FMT_plx "-" HWADDR_FMT_plx " "
+                               HWADDR_FMT_plx " %c%c%c\n",
+                               addr_canonical(env, *pstart),
+                               addr_canonical(env, end),
+                               addr_canonical(env, end - *pstart),
+                               prot1 & PG_USER_MASK ? 'u' : '-',
+                               'r',
+                               prot1 & PG_RW_MASK ? 'w' : '-');
         }
         if (prot != 0)
             *pstart = end;
@@ -269,7 +268,7 @@ static void mem_print(Monitor *mon, CPUArchState *env,
     }
 }
 
-static void mem_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void mem_info_32(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     unsigned int l1, l2;
@@ -286,7 +285,7 @@ static void mem_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
         if (pde & PG_PRESENT_MASK) {
             if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
                 prot = pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
-                mem_print(mon, env, &start, &last_prot, end, prot);
+                mem_print(hmp, env, &start, &last_prot, end, prot);
             } else {
                 for(l2 = 0; l2 < 1024; l2++) {
                     pte = address_space_ldl_le(as, (pde & ~0xfff) + l2 * 4,
@@ -298,19 +297,19 @@ static void mem_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
                     } else {
                         prot = 0;
                     }
-                    mem_print(mon, env, &start, &last_prot, end, prot);
+                    mem_print(hmp, env, &start, &last_prot, end, prot);
                 }
             }
         } else {
             prot = 0;
-            mem_print(mon, env, &start, &last_prot, end, prot);
+            mem_print(hmp, env, &start, &last_prot, end, prot);
         }
     }
     /* Flush last range */
-    mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 32, 0);
+    mem_print(hmp, env, &start, &last_prot, (hwaddr)1 << 32, 0);
 }
 
-static void mem_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void mem_info_pae32(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     unsigned int l1, l2, l3;
@@ -334,7 +333,7 @@ static void mem_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
                     if (pde & PG_PSE_MASK) {
                         prot = pde & (PG_USER_MASK | PG_RW_MASK |
                                       PG_PRESENT_MASK);
-                        mem_print(mon, env, &start, &last_prot, end, prot);
+                        mem_print(hmp, env, &start, &last_prot, end, prot);
                     } else {
                         pt_addr = pde & 0x3fffffffff000ULL;
                         for (l3 = 0; l3 < 512; l3++) {
@@ -347,26 +346,26 @@ static void mem_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
                             } else {
                                 prot = 0;
                             }
-                            mem_print(mon, env, &start, &last_prot, end, prot);
+                            mem_print(hmp, env, &start, &last_prot, end, prot);
                         }
                     }
                 } else {
                     prot = 0;
-                    mem_print(mon, env, &start, &last_prot, end, prot);
+                    mem_print(hmp, env, &start, &last_prot, end, prot);
                 }
             }
         } else {
             prot = 0;
-            mem_print(mon, env, &start, &last_prot, end, prot);
+            mem_print(hmp, env, &start, &last_prot, end, prot);
         }
     }
     /* Flush last range */
-    mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 32, 0);
+    mem_print(hmp, env, &start, &last_prot, (hwaddr)1 << 32, 0);
 }
 
 
 #ifdef TARGET_X86_64
-static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void mem_info_la48(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     int prot, last_prot;
@@ -390,7 +389,7 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
                         prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
                                        PG_PRESENT_MASK);
                         prot &= pml4e;
-                        mem_print(mon, env, &start, &last_prot, end, prot);
+                        mem_print(hmp, env, &start, &last_prot, end, prot);
                     } else {
                         pd_addr = pdpe & 0x3fffffffff000ULL;
                         for (l3 = 0; l3 < 512; l3++) {
@@ -402,7 +401,7 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
                                     prot = pde & (PG_USER_MASK | PG_RW_MASK |
                                                   PG_PRESENT_MASK);
                                     prot &= pml4e & pdpe;
-                                    mem_print(mon, env, &start,
+                                    mem_print(hmp, env, &start,
                                               &last_prot, end, prot);
                                 } else {
                                     pt_addr = pde & 0x3fffffffff000ULL;
@@ -420,32 +419,32 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
                                         } else {
                                             prot = 0;
                                         }
-                                        mem_print(mon, env, &start,
+                                        mem_print(hmp, env, &start,
                                                   &last_prot, end, prot);
                                     }
                                 }
                             } else {
                                 prot = 0;
-                                mem_print(mon, env, &start,
+                                mem_print(hmp, env, &start,
                                           &last_prot, end, prot);
                             }
                         }
                     }
                 } else {
                     prot = 0;
-                    mem_print(mon, env, &start, &last_prot, end, prot);
+                    mem_print(hmp, env, &start, &last_prot, end, prot);
                 }
             }
         } else {
             prot = 0;
-            mem_print(mon, env, &start, &last_prot, end, prot);
+            mem_print(hmp, env, &start, &last_prot, end, prot);
         }
     }
     /* Flush last range */
-    mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 48, 0);
+    mem_print(hmp, env, &start, &last_prot, (hwaddr)1 << 48, 0);
 }
 
-static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
+static void mem_info_la57(MonitorHMP *hmp, CPUArchState *env, AddressSpace *as)
 {
     const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
     int prot, last_prot;
@@ -461,7 +460,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
         end = l0 << 48;
         if (!(pml5e & PG_PRESENT_MASK)) {
             prot = 0;
-            mem_print(mon, env, &start, &last_prot, end, prot);
+            mem_print(hmp, env, &start, &last_prot, end, prot);
             continue;
         }
 
@@ -471,7 +470,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
             end = (l0 << 48) + (l1 << 39);
             if (!(pml4e & PG_PRESENT_MASK)) {
                 prot = 0;
-                mem_print(mon, env, &start, &last_prot, end, prot);
+                mem_print(hmp, env, &start, &last_prot, end, prot);
                 continue;
             }
 
@@ -481,7 +480,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
                 end = (l0 << 48) + (l1 << 39) + (l2 << 30);
                 if (pdpe & PG_PRESENT_MASK) {
                     prot = 0;
-                    mem_print(mon, env, &start, &last_prot, end, prot);
+                    mem_print(hmp, env, &start, &last_prot, end, prot);
                     continue;
                 }
 
@@ -489,7 +488,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
                     prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
                             PG_PRESENT_MASK);
                     prot &= pml5e & pml4e;
-                    mem_print(mon, env, &start, &last_prot, end, prot);
+                    mem_print(hmp, env, &start, &last_prot, end, prot);
                     continue;
                 }
 
@@ -500,7 +499,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
                     end = (l0 << 48) + (l1 << 39) + (l2 << 30) + (l3 << 21);
                     if (pde & PG_PRESENT_MASK) {
                         prot = 0;
-                        mem_print(mon, env, &start, &last_prot, end, prot);
+                        mem_print(hmp, env, &start, &last_prot, end, prot);
                         continue;
                     }
 
@@ -508,7 +507,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
                         prot = pde & (PG_USER_MASK | PG_RW_MASK |
                                 PG_PRESENT_MASK);
                         prot &= pml5e & pml4e & pdpe;
-                        mem_print(mon, env, &start, &last_prot, end, prot);
+                        mem_print(hmp, env, &start, &last_prot, end, prot);
                         continue;
                     }
 
@@ -525,31 +524,30 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
                         } else {
                             prot = 0;
                         }
-                        mem_print(mon, env, &start, &last_prot, end, prot);
+                        mem_print(hmp, env, &start, &last_prot, end, prot);
                     }
                 }
             }
         }
     }
     /* Flush last range */
-    mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 57, 0);
+    mem_print(hmp, env, &start, &last_prot, (hwaddr)1 << 57, 0);
 }
 #endif /* TARGET_X86_64 */
 
 void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env;
     AddressSpace *as;
 
     env = monitor_hmp_get_cpu_env(hmp);
     if (!env) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
 
     if (!(env->cr[0] & CR0_PG_MASK)) {
-        monitor_printf(mon, "PG disabled\n");
+        monitor_hmp_printf(hmp, "PG disabled\n");
         return;
     }
     as = cpu_get_address_space(env_cpu(env), X86ASIdx_MEM);
@@ -557,17 +555,17 @@ void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
 #ifdef TARGET_X86_64
         if (env->hflags & HF_LMA_MASK) {
             if (env->cr[4] & CR4_LA57_MASK) {
-                mem_info_la57(mon, env, as);
+                mem_info_la57(hmp, env, as);
             } else {
-                mem_info_la48(mon, env, as);
+                mem_info_la48(hmp, env, as);
             }
         } else
 #endif
         {
-            mem_info_pae32(mon, env, as);
+            mem_info_pae32(hmp, env, as);
         }
     } else {
-        mem_info_32(mon, env, as);
+        mem_info_32(hmp, env, as);
     }
 }
 
diff --git a/target/i386/sev.c b/target/i386/sev.c
index 4473d02981ff..36a62e58be95 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -756,33 +756,32 @@ SevInfo *qmp_query_sev(Error **errp)
 
 void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     SevInfo *info = sev_get_info();
 
     if (!info || !info->enabled) {
-        monitor_printf(mon, "SEV is not enabled\n");
+        monitor_hmp_printf(hmp, "SEV is not enabled\n");
         goto out;
     }
 
-    monitor_printf(mon, "SEV type: %s\n", SevGuestType_str(info->sev_type));
-    monitor_printf(mon, "state: %s\n", SevState_str(info->state));
-    monitor_printf(mon, "build: %d\n", info->build_id);
-    monitor_printf(mon, "api version: %d.%d\n", info->api_major,
-                   info->api_minor);
+    monitor_hmp_printf(hmp, "SEV type: %s\n", SevGuestType_str(info->sev_type));
+    monitor_hmp_printf(hmp, "state: %s\n", SevState_str(info->state));
+    monitor_hmp_printf(hmp, "build: %d\n", info->build_id);
+    monitor_hmp_printf(hmp, "api version: %d.%d\n", info->api_major,
+                       info->api_minor);
 
     if (sev_snp_enabled()) {
-        monitor_printf(mon, "debug: %s\n",
-                       info->u.sev_snp.snp_policy & SEV_SNP_POLICY_DBG ? "on"
-                                                                       : "off");
-        monitor_printf(mon, "SMT allowed: %s\n",
-                       info->u.sev_snp.snp_policy & SEV_SNP_POLICY_SMT ? "on"
-                                                                       : "off");
+        monitor_hmp_printf(hmp, "debug: %s\n",
+                           info->u.sev_snp.snp_policy & SEV_SNP_POLICY_DBG ? "on"
+                                                                           : "off");
+        monitor_hmp_printf(hmp, "SMT allowed: %s\n",
+                           info->u.sev_snp.snp_policy & SEV_SNP_POLICY_SMT ? "on"
+                                                                           : "off");
     } else {
-        monitor_printf(mon, "handle: %d\n", info->u.sev.handle);
-        monitor_printf(mon, "debug: %s\n",
-                       info->u.sev.policy & SEV_POLICY_NODBG ? "off" : "on");
-        monitor_printf(mon, "key-sharing: %s\n",
-                       info->u.sev.policy & SEV_POLICY_NOKS ? "off" : "on");
+        monitor_hmp_printf(hmp, "handle: %d\n", info->u.sev.handle);
+        monitor_hmp_printf(hmp, "debug: %s\n",
+                           info->u.sev.policy & SEV_POLICY_NODBG ? "off" : "on");
+        monitor_hmp_printf(hmp, "key-sharing: %s\n",
+                           info->u.sev.policy & SEV_POLICY_NOKS ? "off" : "on");
     }
 
 out:
diff --git a/target/m68k/monitor.c b/target/m68k/monitor.c
index 5645a5d4d4f5..23c25283b27a 100644
--- a/target/m68k/monitor.c
+++ b/target/m68k/monitor.c
@@ -12,11 +12,10 @@
 
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
 
     if (!env1) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
 
diff --git a/target/ppc/monitor.c b/target/ppc/monitor.c
index 5769829bdd7e..6e8a075f5a41 100644
--- a/target/ppc/monitor.c
+++ b/target/ppc/monitor.c
@@ -13,11 +13,10 @@
 
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
 
     if (!env1) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
     dump_mmu(env1);
diff --git a/target/riscv/monitor.c b/target/riscv/monitor.c
index 4c9c0c793b36..59cc04b3d0fb 100644
--- a/target/riscv/monitor.c
+++ b/target/riscv/monitor.c
@@ -51,13 +51,13 @@ static target_ulong addr_canonical(int va_bits, target_ulong addr)
     return addr;
 }
 
-static void print_pte_header(Monitor *mon)
+static void print_pte_header(MonitorHMP *hmp)
 {
-    monitor_printf(mon, PTE_HEADER_FIELDS);
-    monitor_printf(mon, PTE_HEADER_DELIMITER);
+    monitor_hmp_printf(hmp, PTE_HEADER_FIELDS);
+    monitor_hmp_printf(hmp, PTE_HEADER_DELIMITER);
 }
 
-static void print_pte(Monitor *mon, int va_bits, target_ulong vaddr,
+static void print_pte(MonitorHMP *hmp, int va_bits, target_ulong vaddr,
                       hwaddr paddr, target_ulong size, int attr)
 {
     /* sanity check on vaddr */
@@ -69,20 +69,20 @@ static void print_pte(Monitor *mon, int va_bits, target_ulong vaddr,
         return;
     }
 
-    monitor_printf(mon, TARGET_FMT_lx " " HWADDR_FMT_plx " " TARGET_FMT_lx
-                   " %c%c%c%c%c%c%c\n",
-                   addr_canonical(va_bits, vaddr),
-                   paddr, size,
-                   attr & PTE_R ? 'r' : '-',
-                   attr & PTE_W ? 'w' : '-',
-                   attr & PTE_X ? 'x' : '-',
-                   attr & PTE_U ? 'u' : '-',
-                   attr & PTE_G ? 'g' : '-',
-                   attr & PTE_A ? 'a' : '-',
-                   attr & PTE_D ? 'd' : '-');
+    monitor_hmp_printf(hmp, TARGET_FMT_lx " " HWADDR_FMT_plx " " TARGET_FMT_lx
+                       " %c%c%c%c%c%c%c\n",
+                       addr_canonical(va_bits, vaddr),
+                       paddr, size,
+                       attr & PTE_R ? 'r' : '-',
+                       attr & PTE_W ? 'w' : '-',
+                       attr & PTE_X ? 'x' : '-',
+                       attr & PTE_U ? 'u' : '-',
+                       attr & PTE_G ? 'g' : '-',
+                       attr & PTE_A ? 'a' : '-',
+                       attr & PTE_D ? 'd' : '-');
 }
 
-static void walk_pte(Monitor *mon, AddressSpace *as,
+static void walk_pte(MonitorHMP *hmp, AddressSpace *as,
                      hwaddr base, target_ulong start,
                      int level, int ptidxbits, int ptesize, int va_bits,
                      target_ulong *vbase, hwaddr *pbase, hwaddr *last_paddr,
@@ -126,7 +126,7 @@ static void walk_pte(Monitor *mon, AddressSpace *as,
                 if ((*last_attr != attr) ||
                     (*last_paddr + *last_size != paddr) ||
                     (last_start + *last_size != start)) {
-                    print_pte(mon, va_bits, *vbase, *pbase,
+                    print_pte(hmp, va_bits, *vbase, *pbase,
                               *last_paddr + *last_size - *pbase, *last_attr);
 
                     *vbase = start;
@@ -139,7 +139,7 @@ static void walk_pte(Monitor *mon, AddressSpace *as,
                 *last_size = pgsize;
             } else {
                 /* pointer to the next level of the page table */
-                walk_pte(mon, as, paddr, start, level - 1, ptidxbits, ptesize,
+                walk_pte(hmp, as, paddr, start, level - 1, ptidxbits, ptesize,
                          va_bits, vbase, pbase, last_paddr,
                          last_size, last_attr);
             }
@@ -150,7 +150,7 @@ static void walk_pte(Monitor *mon, AddressSpace *as,
 
 }
 
-static void mem_info_svxx(Monitor *mon, CPUArchState *env)
+static void mem_info_svxx(MonitorHMP *hmp, CPUArchState *env)
 {
     AddressSpace *as = env_cpu(env)->as;
     int levels, ptidxbits, ptesize, vm, va_bits;
@@ -198,7 +198,7 @@ static void mem_info_svxx(Monitor *mon, CPUArchState *env)
     va_bits = PGSHIFT + levels * ptidxbits;
 
     /* print header */
-    print_pte_header(mon);
+    print_pte_header(hmp);
 
     vbase = -1;
     pbase = -1;
@@ -207,43 +207,42 @@ static void mem_info_svxx(Monitor *mon, CPUArchState *env)
     last_attr = 0;
 
     /* walk page tables, starting from address 0 */
-    walk_pte(mon, as, base, 0, levels - 1, ptidxbits, ptesize, va_bits,
+    walk_pte(hmp, as, base, 0, levels - 1, ptidxbits, ptesize, va_bits,
              &vbase, &pbase, &last_paddr, &last_size, &last_attr);
 
     /* don't forget the last one */
-    print_pte(mon, va_bits, vbase, pbase,
+    print_pte(hmp, va_bits, vbase, pbase,
               last_paddr + last_size - pbase, last_attr);
 }
 
 void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env;
 
     env = monitor_hmp_get_cpu_env(hmp);
     if (!env) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
 
     if (!riscv_cpu_cfg(env)->mmu) {
-        monitor_printf(mon, "S-mode MMU unavailable\n");
+        monitor_hmp_printf(hmp, "S-mode MMU unavailable\n");
         return;
     }
 
     if (riscv_cpu_mxl(env) == MXL_RV32) {
         if (!(env->satp & SATP32_MODE)) {
-            monitor_printf(mon, "No translation or protection\n");
+            monitor_hmp_printf(hmp, "No translation or protection\n");
             return;
         }
     } else {
         if (!(env->satp & SATP64_MODE)) {
-            monitor_printf(mon, "No translation or protection\n");
+            monitor_hmp_printf(hmp, "No translation or protection\n");
             return;
         }
     }
 
-    mem_info_svxx(mon, env);
+    mem_info_svxx(hmp, env);
 }
 
 #ifdef CONFIG_TCG
diff --git a/target/sh4/monitor.c b/target/sh4/monitor.c
index 4e443152bf56..62998a9a57cb 100644
--- a/target/sh4/monitor.c
+++ b/target/sh4/monitor.c
@@ -26,33 +26,32 @@
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 
-static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
+static void print_tlb(MonitorHMP *hmp, int idx, tlb_t *tlb)
 {
-    monitor_printf(mon, " tlb%i:\t"
-                   "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
-                   "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
-                   "dirty=%hhu writethrough=%hhu\n",
-                   idx,
-                   tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
-                   tlb->v, tlb->sh, tlb->c, tlb->pr,
-                   tlb->d, tlb->wt);
+    monitor_hmp_printf(hmp, " tlb%i:\t"
+                       "asid=%hhu vpn=%x\tppn=%x\tsz=%hhu size=%u\t"
+                       "v=%hhu shared=%hhu cached=%hhu prot=%hhu "
+                       "dirty=%hhu writethrough=%hhu\n",
+                       idx,
+                       tlb->asid, tlb->vpn, tlb->ppn, tlb->sz, tlb->size,
+                       tlb->v, tlb->sh, tlb->c, tlb->pr,
+                       tlb->d, tlb->wt);
 }
 
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env = monitor_hmp_get_cpu_env(hmp);
     int i;
 
     if (!env) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
 
-    monitor_printf (mon, "ITLB:\n");
+    monitor_hmp_printf(hmp, "ITLB:\n");
     for (i = 0 ; i < ITLB_SIZE ; i++)
-        print_tlb (mon, i, &env->itlb[i]);
-    monitor_printf (mon, "UTLB:\n");
+        print_tlb(hmp, i, &env->itlb[i]);
+    monitor_hmp_printf(hmp, "UTLB:\n");
     for (i = 0 ; i < UTLB_SIZE ; i++)
-        print_tlb (mon, i, &env->utlb[i]);
+        print_tlb(hmp, i, &env->utlb[i]);
 }
diff --git a/target/sparc/monitor.c b/target/sparc/monitor.c
index e826e584a918..36f109cbb568 100644
--- a/target/sparc/monitor.c
+++ b/target/sparc/monitor.c
@@ -29,11 +29,10 @@
 
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
 
     if (!env1) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
     dump_mmu(env1);
diff --git a/target/xtensa/monitor.c b/target/xtensa/monitor.c
index b7b7387706f3..b9c4089b0fb1 100644
--- a/target/xtensa/monitor.c
+++ b/target/xtensa/monitor.c
@@ -28,11 +28,10 @@
 
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
 
     if (!env1) {
-        monitor_printf(mon, "No CPU available\n");
+        monitor_hmp_printf(hmp, "No CPU available\n");
         return;
     }
     dump_mmu(env1);
diff --git a/tests/unit/test-util-sockets.c b/tests/unit/test-util-sockets.c
index b2a884529598..530a3fee3c13 100644
--- a/tests/unit/test-util-sockets.c
+++ b/tests/unit/test-util-sockets.c
@@ -75,7 +75,7 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
  */
 Monitor *monitor_cur(void) { return cur_mon; }
 Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) { abort(); }
-int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap) { abort(); }
+int monitor_hmp_vprintf(MonitorHMP *mon, const char *fmt, va_list ap) { abort(); }
 
 #ifndef _WIN32
 static void test_socket_fd_pass_name_good(void)
diff --git a/tools/qemu-vnc/clipboard.c b/tools/qemu-vnc/clipboard.c
index f62b2f294952..81a09ec5adfa 100644
--- a/tools/qemu-vnc/clipboard.c
+++ b/tools/qemu-vnc/clipboard.c
@@ -62,7 +62,7 @@ vnc_dbus_clipboard_request_cancelled(VncDBusClipboardRequest *req)
         "Cancelled clipboard request");
 
     g_clear_object(&req->invocation);
-    g_clear_handle_id(&req->timeout_id, g_source_remove);;
+    g_clear_handle_id(&req->timeout_id, g_source_remove);
 }
 
 static gboolean
@@ -137,7 +137,7 @@ vnc_dbus_clipboard_update_info(QemuClipboardInfo *info)
         vnc_dbus_clipboard_complete_request(
             req->invocation, info, req->type);
         g_clear_object(&req->invocation);
-        g_clear_handle_id(&req->timeout_id, g_source_remove);;
+        g_clear_handle_id(&req->timeout_id, g_source_remove);
         return;
     }
 
diff --git a/tools/qemu-vnc/stubs.c b/tools/qemu-vnc/stubs.c
index 26597fefaa99..0aa50a901d37 100644
--- a/tools/qemu-vnc/stubs.c
+++ b/tools/qemu-vnc/stubs.c
@@ -42,7 +42,7 @@ Monitor *monitor_set_cur(Coroutine *co, Monitor *mon)
     return NULL;
 }
 
-int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
+int monitor_hmp_vprintf(MonitorHMP *mon, const char *fmt, va_list ap)
 {
     return -1;
 }
diff --git a/trace/trace-hmp-cmds.c b/trace/trace-hmp-cmds.c
index 5a8158f4f4b6..a68f5b900d7c 100644
--- a/trace/trace-hmp-cmds.c
+++ b/trace/trace-hmp-cmds.c
@@ -49,7 +49,6 @@ void hmp_trace_event(MonitorHMP *hmp, const QDict *qdict)
 #ifdef CONFIG_TRACE_SIMPLE
 void hmp_trace_file(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *op = qdict_get_try_str(qdict, "op");
     const char *arg = qdict_get_try_str(qdict, "arg");
 
@@ -66,15 +65,14 @@ void hmp_trace_file(MonitorHMP *hmp, const QDict *qdict)
             st_set_trace_file(arg);
         }
     } else {
-        monitor_printf(mon, "unexpected argument \"%s\"\n", op);
-        hmp_help_cmd(mon, "trace-file");
+        monitor_hmp_printf(hmp, "unexpected argument \"%s\"\n", op);
+        hmp_help_cmd(hmp, "trace-file");
     }
 }
 #endif
 
 void hmp_info_trace_events(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *name = qdict_get_try_str(qdict, "name");
     TraceEventInfoList *events;
     TraceEventInfoList *elem;
@@ -91,9 +89,9 @@ void hmp_info_trace_events(MonitorHMP *hmp, const QDict *qdict)
     }
 
     for (elem = events; elem != NULL; elem = elem->next) {
-        monitor_printf(mon, "%s : state %u\n",
-                       elem->value->name,
-                       elem->value->state == TRACE_EVENT_STATE_ENABLED ? 1 : 0);
+        monitor_hmp_printf(hmp, "%s : state %u\n",
+                           elem->value->name,
+                           elem->value->state == TRACE_EVENT_STATE_ENABLED ? 1 : 0);
     }
     qapi_free_TraceEventInfoList(events);
 }
diff --git a/ui/ui-hmp-cmds.c b/ui/ui-hmp-cmds.c
index 186209fd0234..f611dd7ee457 100644
--- a/ui/ui-hmp-cmds.c
+++ b/ui/ui-hmp-cmds.c
@@ -81,20 +81,19 @@ void hmp_mouse_set(MonitorHMP *hmp, const QDict *qdict)
 
 void hmp_info_mice(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     MouseInfoList *mice_list, *mouse;
 
     mice_list = qmp_query_mice(NULL);
     if (!mice_list) {
-        monitor_printf(mon, "No mouse devices connected\n");
+        monitor_hmp_printf(hmp, "No mouse devices connected\n");
         return;
     }
 
     for (mouse = mice_list; mouse; mouse = mouse->next) {
-        monitor_printf(mon, "%c Mouse #%" PRId64 ": %s%s\n",
-                       mouse->value->current ? '*' : ' ',
-                       mouse->value->index, mouse->value->name,
-                       mouse->value->absolute ? " (absolute)" : "");
+        monitor_hmp_printf(hmp, "%c Mouse #%" PRId64 ": %s%s\n",
+                           mouse->value->current ? '*' : ' ',
+                           mouse->value->index, mouse->value->name,
+                           mouse->value->absolute ? " (absolute)" : "");
     }
 
     qapi_free_MouseInfoList(mice_list);
@@ -102,48 +101,48 @@ void hmp_info_mice(MonitorHMP *hmp, const QDict *qdict)
 
 #ifdef CONFIG_VNC
 /* Helper for hmp_info_vnc_clients, _servers */
-static void hmp_info_VncBasicInfo(Monitor *mon, VncBasicInfo *info,
+static void hmp_info_VncBasicInfo(MonitorHMP *hmp, VncBasicInfo *info,
                                   const char *name)
 {
-    monitor_printf(mon, "  %s: %s:%s (%s%s)\n",
-                   name,
-                   info->host,
-                   info->service,
-                   NetworkAddressFamily_str(info->family),
-                   info->websocket ? " (Websocket)" : "");
+    monitor_hmp_printf(hmp, "  %s: %s:%s (%s%s)\n",
+                       name,
+                       info->host,
+                       info->service,
+                       NetworkAddressFamily_str(info->family),
+                       info->websocket ? " (Websocket)" : "");
 }
 
 /* Helper displaying and auth and crypt info */
-static void hmp_info_vnc_authcrypt(Monitor *mon, const char *indent,
+static void hmp_info_vnc_authcrypt(MonitorHMP *hmp, const char *indent,
                                    VncPrimaryAuth auth,
                                    VncVencryptSubAuth *vencrypt)
 {
-    monitor_printf(mon, "%sAuth: %s (Sub: %s)\n", indent,
-                   VncPrimaryAuth_str(auth),
-                   vencrypt ? VncVencryptSubAuth_str(*vencrypt) : "none");
+    monitor_hmp_printf(hmp, "%sAuth: %s (Sub: %s)\n", indent,
+                       VncPrimaryAuth_str(auth),
+                       vencrypt ? VncVencryptSubAuth_str(*vencrypt) : "none");
 }
 
-static void hmp_info_vnc_clients(Monitor *mon, VncClientInfoList *client)
+static void hmp_info_vnc_clients(MonitorHMP *hmp, VncClientInfoList *client)
 {
     while (client) {
         VncClientInfo *cinfo = client->value;
 
-        hmp_info_VncBasicInfo(mon, qapi_VncClientInfo_base(cinfo), "Client");
-        monitor_printf(mon, "    x509_dname: %s\n",
-                       cinfo->x509_dname ?: "none");
-        monitor_printf(mon, "    sasl_username: %s\n",
-                       cinfo->sasl_username ?: "none");
+        hmp_info_VncBasicInfo(hmp, qapi_VncClientInfo_base(cinfo), "Client");
+        monitor_hmp_printf(hmp, "    x509_dname: %s\n",
+                           cinfo->x509_dname ?: "none");
+        monitor_hmp_printf(hmp, "    sasl_username: %s\n",
+                           cinfo->sasl_username ?: "none");
 
         client = client->next;
     }
 }
 
-static void hmp_info_vnc_servers(Monitor *mon, VncServerInfo2List *server)
+static void hmp_info_vnc_servers(MonitorHMP *hmp, VncServerInfo2List *server)
 {
     while (server) {
         VncServerInfo2 *sinfo = server->value;
-        hmp_info_VncBasicInfo(mon, qapi_VncServerInfo2_base(sinfo), "Server");
-        hmp_info_vnc_authcrypt(mon, "    ", sinfo->auth,
+        hmp_info_VncBasicInfo(hmp, qapi_VncServerInfo2_base(sinfo), "Server");
+        hmp_info_vnc_authcrypt(hmp, "    ", sinfo->auth,
                                sinfo->has_vencrypt ? &sinfo->vencrypt : NULL);
         server = server->next;
     }
@@ -151,7 +150,6 @@ static void hmp_info_vnc_servers(Monitor *mon, VncServerInfo2List *server)
 
 void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     VncInfo2List *info2l, *info2l_head;
     Error *err = NULL;
 
@@ -161,26 +159,26 @@ void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
     if (!info2l) {
-        monitor_printf(mon, "None\n");
+        monitor_hmp_printf(hmp, "None\n");
         return;
     }
 
     while (info2l) {
         VncInfo2 *info = info2l->value;
-        monitor_printf(mon, "%s:\n", info->id);
-        hmp_info_vnc_servers(mon, info->server);
-        hmp_info_vnc_clients(mon, info->clients);
+        monitor_hmp_printf(hmp, "%s:\n", info->id);
+        hmp_info_vnc_servers(hmp, info->server);
+        hmp_info_vnc_clients(hmp, info->clients);
         if (!info->server) {
             /*
              * The server entry displays its auth, we only need to
              * display in the case of 'reverse' connections where
              * there's no server.
              */
-            hmp_info_vnc_authcrypt(mon, "  ", info->auth,
+            hmp_info_vnc_authcrypt(hmp, "  ", info->auth,
                                info->has_vencrypt ? &info->vencrypt : NULL);
         }
         if (info->display) {
-            monitor_printf(mon, "  Display: %s\n", info->display);
+            monitor_hmp_printf(hmp, "  Display: %s\n", info->display);
         }
         info2l = info2l->next;
     }
@@ -193,7 +191,6 @@ void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict)
 #ifdef CONFIG_SPICE
 void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     SpiceChannelList *chan;
     SpiceInfo *info;
     const char *channel_name;
@@ -214,38 +211,38 @@ void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict)
     info = qmp_query_spice(NULL);
 
     if (!info->enabled) {
-        monitor_printf(mon, "Server: disabled\n");
+        monitor_hmp_printf(hmp, "Server: disabled\n");
         goto out;
     }
 
-    monitor_printf(mon, "Server:\n");
+    monitor_hmp_printf(hmp, "Server:\n");
     if (info->has_port) {
-        monitor_printf(mon, "     address: %s:%" PRId64 "\n",
-                       info->host, info->port);
+        monitor_hmp_printf(hmp, "     address: %s:%" PRId64 "\n",
+                           info->host, info->port);
     }
     if (info->has_tls_port) {
-        monitor_printf(mon, "     address: %s:%" PRId64 " [tls]\n",
-                       info->host, info->tls_port);
+        monitor_hmp_printf(hmp, "     address: %s:%" PRId64 " [tls]\n",
+                           info->host, info->tls_port);
     }
-    monitor_printf(mon, "    migrated: %s\n",
-                   info->migrated ? "true" : "false");
-    monitor_printf(mon, "        auth: %s\n", info->auth);
-    monitor_printf(mon, "    compiled: %s\n", info->compiled_version);
-    monitor_printf(mon, "  mouse-mode: %s\n",
-                   SpiceQueryMouseMode_str(info->mouse_mode));
+    monitor_hmp_printf(hmp, "    migrated: %s\n",
+                       info->migrated ? "true" : "false");
+    monitor_hmp_printf(hmp, "        auth: %s\n", info->auth);
+    monitor_hmp_printf(hmp, "    compiled: %s\n", info->compiled_version);
+    monitor_hmp_printf(hmp, "  mouse-mode: %s\n",
+                       SpiceQueryMouseMode_str(info->mouse_mode));
 
     if (!info->has_channels || info->channels == NULL) {
-        monitor_printf(mon, "Channels: none\n");
+        monitor_hmp_printf(hmp, "Channels: none\n");
     } else {
         for (chan = info->channels; chan; chan = chan->next) {
-            monitor_printf(mon, "Channel:\n");
-            monitor_printf(mon, "     address: %s:%s%s\n",
-                           chan->value->host, chan->value->port,
-                           chan->value->tls ? " [tls]" : "");
-            monitor_printf(mon, "     session: %" PRId64 "\n",
-                           chan->value->connection_id);
-            monitor_printf(mon, "     channel: %" PRId64 ":%" PRId64 "\n",
-                           chan->value->channel_type, chan->value->channel_id);
+            monitor_hmp_printf(hmp, "Channel:\n");
+            monitor_hmp_printf(hmp, "     address: %s:%s%s\n",
+                               chan->value->host, chan->value->port,
+                               chan->value->tls ? " [tls]" : "");
+            monitor_hmp_printf(hmp, "     session: %" PRId64 "\n",
+                               chan->value->connection_id);
+            monitor_hmp_printf(hmp, "     channel: %" PRId64 ":%" PRId64 "\n",
+                               chan->value->channel_type, chan->value->channel_id);
 
             channel_name = "unknown";
             if (chan->value->channel_type > 0 &&
@@ -254,7 +251,7 @@ void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict)
                 channel_name = channel_names[chan->value->channel_type];
             }
 
-            monitor_printf(mon, "     channel name: %s\n", channel_name);
+            monitor_hmp_printf(hmp, "     channel name: %s\n", channel_name);
         }
     }
 
@@ -333,7 +330,7 @@ static void hmp_change_read_arg(void *opaque, const char *password,
     monitor_hmp_read_command(opaque, 1);
 }
 
-void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
+void hmp_change_vnc(MonitorHMP *hmp, const char *device, const char *target,
                     const char *arg, const char *read_only, bool force,
                     Error **errp)
 {
@@ -346,7 +343,6 @@ void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
         return;
     }
     if (!arg) {
-        MonitorHMP *hmp = MONITOR_HMP(mon);
         monitor_hmp_read_password(hmp, hmp_change_read_arg, NULL);
     } else {
         qmp_change_vnc_password(arg, errp);
@@ -371,7 +367,6 @@ static int index_from_key(const char *key, size_t key_length)
 
 void hmp_sendkey(MonitorHMP *hmp, const QDict *qdict)
 {
-    Monitor *mon = MONITOR(hmp);
     const char *keys = qdict_get_str(qdict, "keys");
     KeyValue *v = NULL;
     KeyValueList *head = NULL, **tail = &head;
@@ -432,7 +427,7 @@ out:
     return;
 
 err_out:
-    monitor_printf(mon, "invalid parameter: %.*s\n", keyname_len, keys);
+    monitor_hmp_printf(hmp, "invalid parameter: %.*s\n", keyname_len, keys);
     goto out;
 }
 
diff --git a/util/error-report.c b/util/error-report.c
index 70cbd174ffae..c20e157780fa 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -38,7 +38,7 @@ error_vprintf_mon(const char *fmt, va_list ap)
     MonitorHMP *hmp = monitor_cur_hmp();
 
     if (hmp) {
-        return monitor_vprintf(MONITOR(hmp), fmt, ap);
+        return monitor_hmp_vprintf(hmp, fmt, ap);
     }
 
     return vfprintf(stderr, fmt, ap);
diff --git a/util/qemu-print.c b/util/qemu-print.c
index 0eecc05b0330..aabe670fda01 100644
--- a/util/qemu-print.c
+++ b/util/qemu-print.c
@@ -23,7 +23,7 @@ int qemu_vprintf(const char *fmt, va_list ap)
 {
     MonitorHMP *hmp = monitor_cur_hmp();
     if (hmp) {
-        return monitor_vprintf(MONITOR(hmp), fmt, ap);
+        return monitor_hmp_vprintf(hmp, fmt, ap);
     }
     return vprintf(fmt, ap);
 }
@@ -54,7 +54,7 @@ int qemu_vfprintf(FILE *stream, const char *fmt, va_list ap)
 {
     if (!stream) {
         MonitorHMP *hmp = monitor_cur_hmp();
-        return hmp ? monitor_vprintf(MONITOR(hmp), fmt, ap) : -1;
+        return hmp ? monitor_hmp_vprintf(hmp, fmt, ap) : -1;
     }
     return vfprintf(stream, fmt, ap);
 }

-- 
2.55.0.543.g5ebe2ebe4ea8


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 41/49] Guard HMP command implementations with CONFIG_HMP
       [not found] <20260816-qemu-no-hmp-v3-0-e53fc35bc550@redhat.com>
                   ` (2 preceding siblings ...)
  2026-08-16 19:13 ` [PATCH v3 37/49] monitor: tighten monitor_printf*() Marc-André Lureau
@ 2026-08-16 19:13 ` Marc-André Lureau
  2026-08-17 18:11   ` Jason J. Herne
  3 siblings, 1 reply; 8+ messages in thread
From: Marc-André Lureau @ 2026-08-16 19:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marc-André Lureau, Philippe Mathieu-Daudé,
	Daniel P. Berrangé, Markus Armbruster, Richard Henderson,
	Paolo Bonzini, David Woodhouse, Paul Durrant, Michael S. Tsirkin,
	Marcelo Tosatti, Mark Cave-Ayland, Halil Pasic,
	Christian Borntraeger, Jason Herne, Eric Farman, Matthew Rosato,
	Ilya Leoshkevich, David Hildenbrand, Cornelia Huck, Gerd Hoffmann,
	Hyman Huang, Peter Xu, Fabiano Rosas, Dr. David Alan Gilbert,
	Samuel Thibault, Jason Wang, Alex Bennée, Zhao Liu,
	Laurent Vivier, Nicholas Piggin, Chinmay Rath, Glenn Miles,
	Harsh Prateek Bora, Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Yoshinori Sato,
	Artyom Tarasenko, Max Filippov, kvm, qemu-ppc, qemu-s390x,
	qemu-riscv

Add #ifdef CONFIG_HMP around all hmp_* function implementations and
their HMP-only helpers across subsystems.

This covers monitor_register_hmp* callers, hmp_info_* handlers, and
HMP-only helper functions like slirp_lookup.

To link succesfully, use empty cmds tables in hmp-cmds.c (to be removed
once meson build-sys is updated with !hmp support later in the series)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 accel/accel-system.c      | 2 ++
 accel/tcg/monitor.c       | 2 ++
 hw/i386/kvm/xen-stubs.c   | 2 ++
 hw/i386/kvm/xen_evtchn.c  | 3 +++
 hw/i386/sgx.c             | 2 ++
 hw/misc/mos6522-stub.c    | 2 ++
 hw/misc/mos6522.c         | 2 ++
 hw/pci/pci-stub.c         | 2 ++
 hw/s390x/s390-skeys.c     | 2 ++
 hw/s390x/s390-stattrib.c  | 4 ++++
 hw/uefi/ovmf-log.c        | 2 ++
 hw/usb/host-libusb.c      | 6 ++++++
 migration/dirtyrate.c     | 2 ++
 monitor/hmp-cmds.c        | 5 +++++
 net/slirp.c               | 7 ++++++-
 replay/replay-debugging.c | 8 ++++++++
 replay/stubs-system.c     | 6 ++++++
 system/qdev-monitor.c     | 4 ++++
 target/i386/cpu-apic.c    | 2 ++
 target/i386/monitor.c     | 3 +++
 target/i386/sev.c         | 2 ++
 target/m68k/monitor.c     | 2 ++
 target/ppc/monitor.c      | 2 ++
 target/riscv/monitor.c    | 3 +++
 target/sh4/monitor.c      | 2 ++
 target/sparc/monitor.c    | 2 ++
 target/xtensa/monitor.c   | 2 ++
 27 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/accel/accel-system.c b/accel/accel-system.c
index 977804c4048a..1325b23864c8 100644
--- a/accel/accel-system.c
+++ b/accel/accel-system.c
@@ -109,7 +109,9 @@ void accel_init_ops_interfaces(AccelClass *ac)
 
 static void accel_ops_class_init(ObjectClass *oc, const void *data)
 {
+#ifdef CONFIG_HMP
     monitor_register_hmp_info_hrt("accel", qmp_x_accel_stats);
+#endif
 }
 
 static const TypeInfo accel_ops_type_info = {
diff --git a/accel/tcg/monitor.c b/accel/tcg/monitor.c
index 74170ddef708..5570d60753d6 100644
--- a/accel/tcg/monitor.c
+++ b/accel/tcg/monitor.c
@@ -30,9 +30,11 @@ HumanReadableText *qmp_x_query_jit(Error **errp)
     return human_readable_text_from_str(buf);
 }
 
+#ifdef CONFIG_HMP
 static void hmp_tcg_register(void)
 {
     monitor_register_hmp_info_hrt("jit", qmp_x_query_jit);
 }
 
 type_init(hmp_tcg_register);
+#endif
diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c
index 5ed71583281a..a68c739a9496 100644
--- a/hw/i386/kvm/xen-stubs.c
+++ b/hw/i386/kvm/xen-stubs.c
@@ -40,6 +40,7 @@ void xen_primary_console_set_be_port(uint16_t port)
 {
 }
 
+#ifdef CONFIG_HMP
 void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 {
     monitor_hmp_printf(hmp, "XEN emulation is not available in this QEMU\n");
@@ -49,3 +50,4 @@ void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
 {
     monitor_hmp_printf(hmp, "XEN emulation is not available in this QEMU\n");
 }
+#endif
diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
index b2135020f27f..9379383e5325 100644
--- a/hw/i386/kvm/xen_evtchn.c
+++ b/hw/i386/kvm/xen_evtchn.c
@@ -2344,6 +2344,7 @@ void qmp_xen_event_inject(uint32_t port, Error **errp)
     }
 }
 
+#ifdef CONFIG_HMP
 void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
 {
     EvtchnInfoList *iter, *info_list;
@@ -2391,3 +2392,5 @@ void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
         monitor_hmp_printf(hmp, "Delivered port %d\n", port);
     }
 }
+
+#endif
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index 634e33e819ce..11bcc7ad9a5a 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -234,6 +234,7 @@ SgxInfo *qmp_query_sgx(Error **errp)
     return info;
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
 {
     Error *err = NULL;
@@ -265,6 +266,7 @@ void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
     monitor_hmp_printf(hmp, "total size=%" PRIu64 "\n",
                        size);
 }
+#endif
 
 bool check_sgx_support(void)
 {
diff --git a/hw/misc/mos6522-stub.c b/hw/misc/mos6522-stub.c
index 154cd32ed88b..d1c141450e67 100644
--- a/hw/misc/mos6522-stub.c
+++ b/hw/misc/mos6522-stub.c
@@ -10,7 +10,9 @@
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 
+#ifdef CONFIG_HMP
 void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
 {
     monitor_hmp_printf(hmp, "MOS6522 VIA is not available in this QEMU\n");
 }
+#endif
diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c
index 1c20c7582c34..3135761a0f7b 100644
--- a/hw/misc/mos6522.c
+++ b/hw/misc/mos6522.c
@@ -497,6 +497,7 @@ void mos6522_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
     }
 }
 
+#ifdef CONFIG_HMP
 static int qmp_x_query_via_foreach(Object *obj, void *opaque)
 {
     GString *buf = opaque;
@@ -597,6 +598,7 @@ void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
     }
     monitor_puts(mon, info->human_readable_text);
 }
+#endif /* CONFIG_HMP */
 
 static const MemoryRegionOps mos6522_ops = {
     .read = mos6522_read,
diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c
index 7e2797300ba0..5fc3322627e3 100644
--- a/hw/pci/pci-stub.c
+++ b/hw/pci/pci-stub.c
@@ -34,6 +34,7 @@ PciInfoList *qmp_query_pci(Error **errp)
     return NULL;
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
 {
 }
@@ -42,6 +43,7 @@ void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
 {
     monitor_hmp_printf(hmp, "PCI devices not supported\n");
 }
+#endif
 
 /* kvm-all wants this */
 MSIMessage pci_get_msi_message(PCIDevice *dev, int vector)
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index b5e56a16cce1..c615c9dbc8a1 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -104,6 +104,7 @@ static void write_keys(FILE *f, uint8_t *keys, uint64_t startgfn,
     }
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict)
 {
     S390SKeysState *ss = s390_get_skeys_device();
@@ -144,6 +145,7 @@ void hmp_dump_skeys(MonitorHMP *hmp, const QDict *qdict)
         error_report_err(err);
     }
 }
+#endif
 
 void s390_qmp_dump_skeys(const char *filename, Error **errp)
 {
diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index 644298f7f0b2..e47a8ea36597 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -32,6 +32,7 @@
 #define STATTR_FLAG_ERROR   0x04ULL
 #define STATTR_FLAG_DONE    0x08ULL
 
+#ifdef CONFIG_HMP
 static S390StAttribState *s390_get_stattrib_device(void)
 {
     S390StAttribState *sas;
@@ -40,6 +41,7 @@ static S390StAttribState *s390_get_stattrib_device(void)
     assert(sas);
     return sas;
 }
+#endif
 
 void s390_stattrib_init(void)
 {
@@ -59,6 +61,7 @@ void s390_stattrib_init(void)
 
 /* Console commands: */
 
+#ifdef CONFIG_HMP
 void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict)
 {
     S390StAttribState *sas = s390_get_stattrib_device();
@@ -110,6 +113,7 @@ void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict)
 out:
     g_free(vals);
 }
+#endif
 
 /* Migration support: */
 
diff --git a/hw/uefi/ovmf-log.c b/hw/uefi/ovmf-log.c
index 0249eea2cfe9..c4e6a5064106 100644
--- a/hw/uefi/ovmf-log.c
+++ b/hw/uefi/ovmf-log.c
@@ -256,6 +256,7 @@ FirmwareLog *qmp_query_firmware_log(bool have_max_size, uint64_t max_size,
     return ret;
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict)
 {
     g_autofree gchar *log_esc = NULL;
@@ -284,3 +285,4 @@ void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict)
     log_esc = g_strescape((gchar *)log_out, "\r\n");
     monitor_hmp_printf(hmp, "%s\n", log_esc);
 }
+#endif
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index 9b9f26a1078e..564fe9a54795 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -184,6 +184,7 @@ static void usb_host_attach_kernel(USBHostDevice *s);
 # define HAVE_SUPER_PLUS 1
 #endif
 
+#ifdef CONFIG_HMP
 static const char *speed_name[] = {
     [LIBUSB_SPEED_UNKNOWN] = "?",
     [LIBUSB_SPEED_LOW]     = "1.5",
@@ -194,6 +195,7 @@ static const char *speed_name[] = {
     [LIBUSB_SPEED_SUPER_PLUS] = "5000+",
 #endif
 };
+#endif
 
 static const unsigned int speed_map[] = {
     [LIBUSB_SPEED_LOW]     = USB_SPEED_LOW,
@@ -1815,7 +1817,9 @@ module_kconfig(USB);
 static void usb_host_register_types(void)
 {
     type_register_static(&usb_host_dev_info);
+#ifdef CONFIG_HMP
     monitor_register_hmp("usbhost", true, hmp_info_usbhost);
+#endif
 }
 
 type_init(usb_host_register_types)
@@ -1920,6 +1924,7 @@ static void usb_host_auto_check(void *unused)
     timer_mod(usb_auto_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 2000);
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
 {
     libusb_device **devs = NULL;
@@ -1963,3 +1968,4 @@ void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
     }
     libusb_free_device_list(devs, 1);
 }
+#endif
diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c
index bdbb2aaa99db..776611fef79c 100644
--- a/migration/dirtyrate.c
+++ b/migration/dirtyrate.c
@@ -856,6 +856,7 @@ struct DirtyRateInfo *qmp_query_dirty_rate(bool has_calc_time_unit,
         has_calc_time_unit ? calc_time_unit : TIME_UNIT_SECOND);
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
 {
     DirtyRateInfo *info = query_dirty_rate_info(TIME_UNIT_SECOND);
@@ -932,3 +933,4 @@ void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
                        " seconds\n", sec);
     monitor_hmp_printf(hmp, "[Please use 'info dirty_rate' to check results]\n");
 }
+#endif
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 1834e3c1f697..3ac70c3f1123 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -42,6 +42,7 @@
 #include "disas/disas.h"
 
 /* Please update hmp-commands.hx when adding or changing commands */
+#ifdef CONFIG_HMP
 static HMPCommand hmp_info_cmds[] = {
 #include "hmp-commands-info.h"
     { NULL, NULL, },
@@ -52,6 +53,10 @@ static HMPCommand hmp_cmds[] = {
 #include "hmp-commands.h"
     { NULL, NULL, },
 };
+#else
+static HMPCommand hmp_info_cmds[] = { { NULL, NULL, }, };
+static HMPCommand hmp_cmds[] = { { NULL, NULL, }, };
+#endif
 
 HMPCommand *hmp_cmds_for_target(bool info_command)
 {
diff --git a/net/slirp.c b/net/slirp.c
index 6fbefa9ed1d7..451c0fd1ba4a 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -711,6 +711,7 @@ error:
     return -1;
 }
 
+#ifdef CONFIG_HMP
 static SlirpState *slirp_lookup(MonitorHMP *hmp, const char *id)
 {
     if (id) {
@@ -801,6 +802,7 @@ void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict)
  fail_syntax:
     monitor_hmp_printf(hmp, "invalid format\n");
 }
+#endif
 
 static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
 {
@@ -957,6 +959,7 @@ static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
     return -1;
 }
 
+#ifdef CONFIG_HMP
 void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict)
 {
     const char *redir_str;
@@ -977,8 +980,8 @@ void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict)
             error_report_err(err);
         }
     }
-
 }
+#endif
 
 #if defined(CONFIG_SMBD_COMMAND)
 
@@ -1224,6 +1227,7 @@ UsernetInfoList *qmp_x_query_usernet(Error **errp)
     return head;
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict)
 {
     g_autoptr(UsernetInfoList) list = NULL;
@@ -1237,6 +1241,7 @@ void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict)
                            ui->hub_name, ui->info);
     }
 }
+#endif
 
 static void
 net_init_slirp_configs_host(const NetdevUserHostForwardList *fwd)
diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
index 965565715ef2..4b741ea1027b 100644
--- a/replay/replay-debugging.c
+++ b/replay/replay-debugging.c
@@ -31,6 +31,7 @@ bool replay_running_debug(void)
     return replay_is_debugging;
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
 {
     if (replay_mode == REPLAY_MODE_NONE) {
@@ -42,6 +43,7 @@ void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
             replay_get_filename(), replay_get_current_icount());
     }
 }
+#endif
 
 ReplayInfo *qmp_query_replay(Error **errp)
 {
@@ -103,6 +105,7 @@ void qmp_replay_break(int64_t icount, Error **errp)
     }
 }
 
+#ifdef CONFIG_HMP
 void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
 {
     int64_t icount = qdict_get_try_int(qdict, "icount", -1LL);
@@ -114,6 +117,7 @@ void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 }
+#endif
 
 void qmp_replay_delete_break(Error **errp)
 {
@@ -124,6 +128,7 @@ void qmp_replay_delete_break(Error **errp)
     }
 }
 
+#ifdef CONFIG_HMP
 void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
 {
     Error *err = NULL;
@@ -134,6 +139,7 @@ void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 }
+#endif
 
 static char *replay_find_nearest_snapshot(int64_t icount,
                                           int64_t *snapshot_icount)
@@ -209,6 +215,7 @@ void qmp_replay_seek(int64_t icount, Error **errp)
     replay_seek(icount, replay_stop_vm, errp);
 }
 
+#ifdef CONFIG_HMP
 void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
 {
     int64_t icount = qdict_get_try_int(qdict, "icount", -1LL);
@@ -220,6 +227,7 @@ void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
         return;
     }
 }
+#endif
 
 static void replay_stop_vm_debug(void *opaque)
 {
diff --git a/replay/stubs-system.c b/replay/stubs-system.c
index 15e7411591ab..70eaf1834032 100644
--- a/replay/stubs-system.c
+++ b/replay/stubs-system.c
@@ -63,22 +63,28 @@ void replay_vmstate_init(void)
 #include "qapi/error.h"
 #include "qemu/error-report.h"
 
+#ifdef CONFIG_HMP
 void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
+
 void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
+
 void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
+
 void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
 {
     error_report("replay support not available");
 }
+#endif
+
 ReplayInfo *qmp_query_replay(Error **errp)
 {
     error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 13ac9f8f3be1..5c87fda50939 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -763,6 +763,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     return ret;
 }
 
+#ifdef CONFIG_HMP
 #define qdev_printf(fmt, ...) \
     monitor_hmp_printf(hmp, "%*s" fmt, indent, "", ## __VA_ARGS__)
 
@@ -865,6 +866,7 @@ void hmp_info_qdm(MonitorHMP *hmp, const QDict *qdict)
 {
     qdev_print_devinfos(true);
 }
+#endif /* CONFIG_HMP */
 
 void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
 {
@@ -1002,6 +1004,7 @@ void qmp_device_sync_config(const char *id, Error **errp)
     qdev_sync_config(dev, errp);
 }
 
+#ifdef CONFIG_HMP
 void hmp_device_add(MonitorHMP *hmp, const QDict *qdict)
 {
     Error *err = NULL;
@@ -1044,6 +1047,7 @@ void hmp_device_del(MonitorHMP *hmp, const QDict *qdict)
     qmp_device_del(id, &err);
     hmp_handle_error(hmp, err);
 }
+#endif
 
 void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
 {
diff --git a/target/i386/cpu-apic.c b/target/i386/cpu-apic.c
index 5d69ece15034..b6ddb5e268de 100644
--- a/target/i386/cpu-apic.c
+++ b/target/i386/cpu-apic.c
@@ -80,6 +80,7 @@ void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
      }
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict)
 {
     CPUState *cs;
@@ -102,3 +103,4 @@ void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict)
     }
     x86_cpu_dump_local_apic_state(cs, CPU_DUMP_FPU);
 }
+#endif
diff --git a/target/i386/monitor.c b/target/i386/monitor.c
index 46762540ba65..ce61132e0f53 100644
--- a/target/i386/monitor.c
+++ b/target/i386/monitor.c
@@ -31,6 +31,8 @@
 #include "qapi/qapi-commands-misc.h"
 #include "system/memory.h"
 
+#ifdef CONFIG_HMP
+
 /* Perform linear address sign extension */
 static hwaddr addr_canonical(CPUArchState *env, hwaddr addr)
 {
@@ -595,3 +597,4 @@ void hmp_mce(MonitorHMP *hmp, const QDict *qdict)
     }
     hmp_handle_error(hmp, err);
 }
+#endif
diff --git a/target/i386/sev.c b/target/i386/sev.c
index 36a62e58be95..3c6a19b79784 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -754,6 +754,7 @@ SevInfo *qmp_query_sev(Error **errp)
     return info;
 }
 
+#ifdef CONFIG_HMP
 void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
 {
     SevInfo *info = sev_get_info();
@@ -787,6 +788,7 @@ void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
 out:
     qapi_free_SevInfo(info);
 }
+#endif
 
 static int
 sev_get_pdh_info(int fd, guchar **pdh, size_t *pdh_len, guchar **cert_chain,
diff --git a/target/m68k/monitor.c b/target/m68k/monitor.c
index 23c25283b27a..e8b1b25a43c4 100644
--- a/target/m68k/monitor.c
+++ b/target/m68k/monitor.c
@@ -10,6 +10,7 @@
 #include "monitor/hmp.h"
 #include "monitor/monitor.h"
 
+#ifdef CONFIG_HMP
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
@@ -21,3 +22,4 @@ void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 
     dump_mmu(env1);
 }
+#endif
diff --git a/target/ppc/monitor.c b/target/ppc/monitor.c
index 6e8a075f5a41..5a21c01593b9 100644
--- a/target/ppc/monitor.c
+++ b/target/ppc/monitor.c
@@ -11,6 +11,7 @@
 #include "monitor/hmp.h"
 #include "cpu.h"
 
+#ifdef CONFIG_HMP
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
@@ -21,3 +22,4 @@ void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
     }
     dump_mmu(env1);
 }
+#endif
diff --git a/target/riscv/monitor.c b/target/riscv/monitor.c
index 59cc04b3d0fb..7e61ae2a4717 100644
--- a/target/riscv/monitor.c
+++ b/target/riscv/monitor.c
@@ -39,6 +39,8 @@
 #define PTE_HEADER_DELIMITER    "-------- ---------------- -------- -------\n"
 #endif
 
+#ifdef CONFIG_HMP
+
 /* Perform linear address sign extension */
 static target_ulong addr_canonical(int va_bits, target_ulong addr)
 {
@@ -244,6 +246,7 @@ void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
 
     mem_info_svxx(hmp, env);
 }
+#endif /* CONFIG_HMP */
 
 #ifdef CONFIG_TCG
 static bool reg_is_ulong_integer(CPURISCVState *env, const char *name,
diff --git a/target/sh4/monitor.c b/target/sh4/monitor.c
index 62998a9a57cb..14261c059706 100644
--- a/target/sh4/monitor.c
+++ b/target/sh4/monitor.c
@@ -26,6 +26,7 @@
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 
+#ifdef CONFIG_HMP
 static void print_tlb(MonitorHMP *hmp, int idx, tlb_t *tlb)
 {
     monitor_hmp_printf(hmp, " tlb%i:\t"
@@ -55,3 +56,4 @@ void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
     for (i = 0 ; i < UTLB_SIZE ; i++)
         print_tlb(hmp, i, &env->utlb[i]);
 }
+#endif
diff --git a/target/sparc/monitor.c b/target/sparc/monitor.c
index 36f109cbb568..ed1e76fe73f8 100644
--- a/target/sparc/monitor.c
+++ b/target/sparc/monitor.c
@@ -27,6 +27,7 @@
 #include "monitor/hmp.h"
 
 
+#ifdef CONFIG_HMP
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
@@ -37,3 +38,4 @@ void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
     }
     dump_mmu(env1);
 }
+#endif
diff --git a/target/xtensa/monitor.c b/target/xtensa/monitor.c
index b9c4089b0fb1..e0fcac8565dc 100644
--- a/target/xtensa/monitor.c
+++ b/target/xtensa/monitor.c
@@ -26,6 +26,7 @@
 #include "monitor/monitor.h"
 #include "monitor/hmp.h"
 
+#ifdef CONFIG_HMP
 void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
 {
     CPUArchState *env1 = monitor_hmp_get_cpu_env(hmp);
@@ -36,3 +37,4 @@ void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
     }
     dump_mmu(env1);
 }
+#endif

-- 
2.55.0.543.g5ebe2ebe4ea8


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP
  2026-08-16 19:12 ` [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP Marc-André Lureau
@ 2026-08-16 21:51   ` Dr. David Alan Gilbert
  2026-08-17 18:08     ` Jason J. Herne
  0 siblings, 1 reply; 8+ messages in thread
From: Dr. David Alan Gilbert @ 2026-08-16 21:51 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, Philippe Mathieu-Daudé, Daniel P. Berrangé,
	Markus Armbruster, Gerd Hoffmann, Gonglei (Arei), zhenwei pi,
	Kevin Wolf, Hanna Reitz, Paolo Bonzini, Ani Sinha,
	David Woodhouse, Paul Durrant, Michael S. Tsirkin,
	Richard Henderson, Marcelo Tosatti, Mark Cave-Ayland, Jiri Pirko,
	Jason Wang, Halil Pasic, Christian Borntraeger, Jason Herne,
	Ilya Leoshkevich, David Hildenbrand, Eric Farman, Matthew Rosato,
	Cornelia Huck, Samuel Thibault, Hyman Huang, Peter Xu,
	Fabiano Rosas, Alex Bennée, Stefan Berger, Zhao Liu,
	Laurent Vivier, Nicholas Piggin, Chinmay Rath, Glenn Miles,
	Harsh Prateek Bora, Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Yoshinori Sato,
	Artyom Tarasenko, Max Filippov, Stefan Hajnoczi, qemu-block, kvm,
	qemu-ppc, qemu-s390x, qemu-riscv

* Marc-André Lureau (marcandre.lureau@redhat.com) wrote:
> HMP commands are specific to the HMP monitor, so make the cmd function
> pointer in HMPCommand take MonitorHMP * instead of Monitor *. This
> strengthens type safety and makes the HMP-specific nature of these
> handlers explicit.
> 
> Handler functions are renamed to take MonitorHMP *hmp, with a local
> Monitor *mon = MONITOR(hmp) added where the body needs the base type.
> Following patches will drop it, since most functions are HMP specific.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>

> ---
>  audio/audio-hmp-cmds.c          |   8 +-
>  backends/cryptodev-hmp-cmds.c   |   3 +-
>  block/monitor/block-hmp-cmds.c  |  78 +++++++----
>  chardev/char-hmp-cmds.c         |  21 ++-
>  dump/dump-hmp-cmds.c            |   6 +-
>  hw/core/machine-hmp-cmds.c      |  49 ++++---
>  hw/i386/kvm/xen-stubs.c         |   6 +-
>  hw/i386/kvm/xen_evtchn.c        |   6 +-
>  hw/i386/sgx-hmp-stub.c          |   3 +-
>  hw/i386/sgx.c                   |   3 +-
>  hw/misc/mos6522-stub.c          |   3 +-
>  hw/misc/mos6522.c               |   3 +-
>  hw/net/rocker/rocker-hmp-cmds.c |  12 +-
>  hw/pci/pci-hmp-cmds.c           |   6 +-
>  hw/pci/pci-stub.c               |   5 +-
>  hw/s390x/s390-skeys.c           |   5 +-
>  hw/s390x/s390-stattrib.c        |   6 +-
>  hw/uefi/ovmf-log.c              |   3 +-
>  hw/usb/host-libusb.c            |   3 +-
>  hw/virtio/virtio-hmp-cmds.c     |  15 +-
>  include/block/block-hmp-cmds.h  |  55 ++++----
>  include/hw/usb/usb.h            |   3 +-
>  include/monitor/hmp.h           | 294 ++++++++++++++++++++--------------------
>  include/monitor/qdev.h          |   5 +-
>  include/net/net.h               |   5 +-
>  include/net/slirp.h             |   8 +-
>  migration/dirtyrate.c           |   6 +-
>  migration/migration-hmp-cmds.c  |  48 ++++---
>  monitor/hmp-cmds.c              |  96 ++++++++-----
>  monitor/hmp.c                   |  17 ++-
>  monitor/monitor-internal.h      |   2 +-
>  net/net-hmp-cmds.c              |  14 +-
>  net/slirp.c                     |   9 +-
>  qom/qom-hmp-cmds.c              |  18 ++-
>  replay/replay-debugging.c       |   9 +-
>  replay/stubs-system.c           |   8 +-
>  stats/stats-hmp-cmds.c          |   3 +-
>  stubs/hmp-cmd-info_sev.c        |   3 +-
>  system/dirtylimit-hmp-cmds.c    |   9 +-
>  system/qdev-monitor.c           |  11 +-
>  system/runstate-hmp-cmds.c      |   9 +-
>  system/tpm-hmp-cmds.c           |   3 +-
>  target/i386/cpu-apic.c          |   3 +-
>  target/i386/monitor.c           |   9 +-
>  target/i386/sev.c               |   3 +-
>  target/m68k/monitor.c           |   3 +-
>  target/ppc/monitor.c            |   3 +-
>  target/riscv/monitor.c          |   3 +-
>  target/sh4/monitor.c            |   3 +-
>  target/sparc/monitor.c          |   3 +-
>  target/xtensa/monitor.c         |   3 +-
>  trace/trace-hmp-cmds.c          |   8 +-
>  ui/ui-hmp-cmds.c                |  31 +++--
>  53 files changed, 561 insertions(+), 390 deletions(-)
> 
> diff --git a/audio/audio-hmp-cmds.c b/audio/audio-hmp-cmds.c
> index 1ffb5ebc7420..4d326ec99fdf 100644
> --- a/audio/audio-hmp-cmds.c
> +++ b/audio/audio-hmp-cmds.c
> @@ -32,8 +32,9 @@
>  
>  static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
>  
> -void hmp_info_capture(Monitor *mon, const QDict *qdict)
> +void hmp_info_capture(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int i;
>      CaptureState *s;
>  
> @@ -45,7 +46,7 @@ void hmp_info_capture(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_stopcapture(Monitor *mon, const QDict *qdict)
> +void hmp_stopcapture(MonitorHMP *hmp, const QDict *qdict)
>  {
>      int i;
>      int n = qdict_get_int(qdict, "n");
> @@ -63,8 +64,9 @@ void hmp_stopcapture(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_wavcapture(Monitor *mon, const QDict *qdict)
> +void hmp_wavcapture(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *path = qdict_get_str(qdict, "path");
>      int freq = qdict_get_try_int(qdict, "freq", 44100);
>      int bits = qdict_get_try_int(qdict, "bits", 16);
> diff --git a/backends/cryptodev-hmp-cmds.c b/backends/cryptodev-hmp-cmds.c
> index 01396d227c88..fb62428d795a 100644
> --- a/backends/cryptodev-hmp-cmds.c
> +++ b/backends/cryptodev-hmp-cmds.c
> @@ -17,8 +17,9 @@
>  #include "qobject/qdict.h"
>  
>  
> -void hmp_info_cryptodev(Monitor *mon, const QDict *qdict)
> +void hmp_info_cryptodev(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      QCryptodevInfoList *il;
>      QCryptodevBackendServiceTypeList *sl;
>      QCryptodevBackendClientList *cl;
> diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
> index 22fa03089ea3..3914b5189d56 100644
> --- a/block/monitor/block-hmp-cmds.c
> +++ b/block/monitor/block-hmp-cmds.c
> @@ -87,8 +87,9 @@ out:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_drive_add(Monitor *mon, const QDict *qdict)
> +void hmp_drive_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      DriveInfo *dinfo;
>      QemuOpts *opts;
> @@ -135,8 +136,9 @@ err:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_drive_del(Monitor *mon, const QDict *qdict)
> +void hmp_drive_del(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *id = qdict_get_str(qdict, "id");
>      BlockBackend *blk;
>      BlockDriverState *bs;
> @@ -194,8 +196,9 @@ unlock:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_commit(Monitor *mon, const QDict *qdict)
> +void hmp_commit(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      BlockBackend *blk;
>      int ret;
> @@ -232,8 +235,9 @@ end:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_drive_mirror(Monitor *mon, const QDict *qdict)
> +void hmp_drive_mirror(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *filename = qdict_get_str(qdict, "target");
>      const char *format = qdict_get_try_str(qdict, "format");
>      bool reuse = qdict_get_try_bool(qdict, "reuse", false);
> @@ -258,8 +262,9 @@ end:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_drive_backup(Monitor *mon, const QDict *qdict)
> +void hmp_drive_backup(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *filename = qdict_get_str(qdict, "target");
>      const char *format = qdict_get_try_str(qdict, "format");
> @@ -288,8 +293,9 @@ end:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
> +void hmp_block_job_set_speed(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *error = NULL;
>      const char *device = qdict_get_str(qdict, "device");
>      int64_t value = qdict_get_int(qdict, "speed");
> @@ -299,8 +305,9 @@ void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, error);
>  }
>  
> -void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
> +void hmp_block_job_cancel(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *error = NULL;
>      const char *device = qdict_get_str(qdict, "device");
>      bool force = qdict_get_try_bool(qdict, "force", false);
> @@ -310,8 +317,9 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, error);
>  }
>  
> -void hmp_block_job_pause(Monitor *mon, const QDict *qdict)
> +void hmp_block_job_pause(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *error = NULL;
>      const char *device = qdict_get_str(qdict, "device");
>  
> @@ -320,8 +328,9 @@ void hmp_block_job_pause(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, error);
>  }
>  
> -void hmp_block_job_resume(Monitor *mon, const QDict *qdict)
> +void hmp_block_job_resume(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *error = NULL;
>      const char *device = qdict_get_str(qdict, "device");
>  
> @@ -330,8 +339,9 @@ void hmp_block_job_resume(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, error);
>  }
>  
> -void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
> +void hmp_block_job_complete(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *error = NULL;
>      const char *device = qdict_get_str(qdict, "device");
>  
> @@ -340,8 +350,9 @@ void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, error);
>  }
>  
> -void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
> +void hmp_snapshot_blkdev(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *filename = qdict_get_str(qdict, "snapshot-file");
>      const char *format = qdict_get_try_str(qdict, "format");
> @@ -355,8 +366,9 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict)
> +void hmp_snapshot_blkdev_internal(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *name = qdict_get_str(qdict, "name");
>      Error *err = NULL;
> @@ -365,8 +377,9 @@ void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict)
> +void hmp_snapshot_delete_blkdev_internal(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *name = qdict_get_str(qdict, "name");
>      const char *id = qdict_get_try_str(qdict, "id");
> @@ -376,8 +389,9 @@ void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
> +void hmp_nbd_server_start(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *uri = qdict_get_str(qdict, "uri");
>      bool writable = qdict_get_try_bool(qdict, "writable", false);
>      bool all = qdict_get_try_bool(qdict, "all", false);
> @@ -438,8 +452,9 @@ exit:
>      hmp_handle_error(mon, local_err);
>  }
>  
> -void hmp_nbd_server_add(Monitor *mon, const QDict *qdict)
> +void hmp_nbd_server_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *name = qdict_get_try_str(qdict, "name");
>      bool writable = qdict_get_try_bool(qdict, "writable", false);
> @@ -456,8 +471,9 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, local_err);
>  }
>  
> -void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict)
> +void hmp_nbd_server_remove(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *name = qdict_get_str(qdict, "name");
>      bool force = qdict_get_try_bool(qdict, "force", false);
>      Error *err = NULL;
> @@ -467,16 +483,18 @@ void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict)
> +void hmp_nbd_server_stop(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_nbd_server_stop(&err);
>      hmp_handle_error(mon, err);
>  }
>  
> -void coroutine_fn hmp_block_resize(Monitor *mon, const QDict *qdict)
> +void coroutine_fn hmp_block_resize(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      int64_t size = qdict_get_int(qdict, "size");
>      Error *err = NULL;
> @@ -485,8 +503,9 @@ void coroutine_fn hmp_block_resize(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_block_stream(Monitor *mon, const QDict *qdict)
> +void hmp_block_stream(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *error = NULL;
>      const char *device = qdict_get_str(qdict, "device");
>      const char *base = qdict_get_try_str(qdict, "base");
> @@ -500,8 +519,9 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, error);
>  }
>  
> -void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
> +void hmp_block_set_io_throttle(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      char *device = (char *) qdict_get_str(qdict, "device");
>      BlockIOThrottle throttle = {
> @@ -528,8 +548,9 @@ void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_eject(Monitor *mon, const QDict *qdict)
> +void hmp_eject(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      bool force = qdict_get_try_bool(qdict, "force", false);
>      const char *device = qdict_get_str(qdict, "device");
>      Error *err = NULL;
> @@ -538,8 +559,9 @@ void hmp_eject(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_qemu_io(Monitor *mon, const QDict *qdict)
> +void hmp_qemu_io(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      bool qdev = qdict_get_try_bool(qdict, "qdev", false);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *command = qdict_get_str(qdict, "command");
> @@ -666,8 +688,9 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
>      }
>  }
>  
> -void hmp_info_block(Monitor *mon, const QDict *qdict)
> +void hmp_info_block(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      BlockInfoList *block_list, *info;
>      BlockDeviceInfoList *blockdev_list, *blockdev;
>      const char *device = qdict_get_try_str(qdict, "device");
> @@ -719,8 +742,9 @@ void hmp_info_block(Monitor *mon, const QDict *qdict)
>      qapi_free_BlockDeviceInfoList(blockdev_list);
>  }
>  
> -void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
> +void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      BlockStatsList *stats_list, *stats;
>  
>      stats_list = qmp_query_blockstats(false, false, NULL);
> @@ -757,8 +781,9 @@ void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
>      qapi_free_BlockStatsList(stats_list);
>  }
>  
> -void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
> +void hmp_info_block_jobs(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      BlockJobInfoList *list;
>  
>      list = qmp_query_block_jobs(&error_abort);
> @@ -793,8 +818,9 @@ void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
>      qapi_free_BlockJobInfoList(list);
>  }
>  
> -void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
> +void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      BlockDriverState *bs, *bs1;
>      BdrvNextIterator it1;
>      QEMUSnapshotInfo *sn_tab, *sn;
> diff --git a/chardev/char-hmp-cmds.c b/chardev/char-hmp-cmds.c
> index f377e00b6991..d4a5a3a255a5 100644
> --- a/chardev/char-hmp-cmds.c
> +++ b/chardev/char-hmp-cmds.c
> @@ -24,8 +24,9 @@
>  #include "qemu/config-file.h"
>  #include "qemu/option.h"
>  
> -void hmp_info_chardev(Monitor *mon, const QDict *qdict)
> +void hmp_info_chardev(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      ChardevInfoList *char_info, *info;
>  
>      char_info = qmp_query_chardev(NULL);
> @@ -37,8 +38,9 @@ void hmp_info_chardev(Monitor *mon, const QDict *qdict)
>      qapi_free_ChardevInfoList(char_info);
>  }
>  
> -void hmp_ringbuf_write(Monitor *mon, const QDict *qdict)
> +void hmp_ringbuf_write(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *chardev = qdict_get_str(qdict, "device");
>      const char *data = qdict_get_str(qdict, "data");
>      Error *err = NULL;
> @@ -48,8 +50,9 @@ void hmp_ringbuf_write(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
> +void hmp_ringbuf_read(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      uint32_t size = qdict_get_int(qdict, "size");
>      const char *chardev = qdict_get_str(qdict, "device");
>      char *data;
> @@ -77,8 +80,9 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
>      g_free(data);
>  }
>  
> -void hmp_chardev_add(Monitor *mon, const QDict *qdict)
> +void hmp_chardev_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *args = qdict_get_str(qdict, "args");
>      Error *err = NULL;
>      QemuOpts *opts;
> @@ -93,8 +97,9 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_chardev_change(Monitor *mon, const QDict *qdict)
> +void hmp_chardev_change(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *args = qdict_get_str(qdict, "args");
>      const char *id;
>      Error *err = NULL;
> @@ -127,16 +132,18 @@ end:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_chardev_remove(Monitor *mon, const QDict *qdict)
> +void hmp_chardev_remove(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *local_err = NULL;
>  
>      qmp_chardev_remove(qdict_get_str(qdict, "id"), &local_err);
>      hmp_handle_error(mon, local_err);
>  }
>  
> -void hmp_chardev_send_break(Monitor *mon, const QDict *qdict)
> +void hmp_chardev_send_break(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *local_err = NULL;
>  
>      qmp_chardev_send_break(qdict_get_str(qdict, "id"), &local_err);
> diff --git a/dump/dump-hmp-cmds.c b/dump/dump-hmp-cmds.c
> index 21023db6fd85..ba78ad026f1e 100644
> --- a/dump/dump-hmp-cmds.c
> +++ b/dump/dump-hmp-cmds.c
> @@ -12,8 +12,9 @@
>  #include "qapi/qapi-commands-dump.h"
>  #include "qobject/qdict.h"
>  
> -void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
> +void hmp_dump_guest_memory(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      bool win_dmp = qdict_get_try_bool(qdict, "windmp", false);
>      bool paging = qdict_get_try_bool(qdict, "paging", false);
> @@ -83,8 +84,9 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
>      g_free(prot);
>  }
>  
> -void hmp_info_dump(Monitor *mon, const QDict *qdict)
> +void hmp_info_dump(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      DumpQueryResult *result = qmp_query_dump(NULL);
>  
>      assert(result && result->status < DUMP_STATUS__MAX);
> diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
> index 1c700aad3587..48fa27f12705 100644
> --- a/hw/core/machine-hmp-cmds.c
> +++ b/hw/core/machine-hmp-cmds.c
> @@ -25,8 +25,9 @@
>  #include "system/numa.h"
>  #include "hw/core/boards.h"
>  
> -void hmp_info_cpus(Monitor *mon, const QDict *qdict)
> +void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CpuInfoFastList *cpu_list, *cpu;
>  
>      cpu_list = qmp_query_cpus_fast(NULL);
> @@ -48,8 +49,9 @@ void hmp_info_cpus(Monitor *mon, const QDict *qdict)
>      qapi_free_CpuInfoFastList(cpu_list);
>  }
>  
> -void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
> +void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err);
>      HotpluggableCPUList *saved = l;
> @@ -106,8 +108,9 @@ void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
>      qapi_free_HotpluggableCPUList(saved);
>  }
>  
> -void hmp_info_memdev(Monitor *mon, const QDict *qdict)
> +void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      MemdevList *memdev_list = qmp_query_memdev(&err);
>      MemdevList *m = memdev_list;
> @@ -147,8 +150,9 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_info_kvm(Monitor *mon, const QDict *qdict)
> +void hmp_info_kvm(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      KvmInfo *info;
>  
>      info = qmp_query_kvm(NULL);
> @@ -162,8 +166,9 @@ void hmp_info_kvm(Monitor *mon, const QDict *qdict)
>      qapi_free_KvmInfo(info);
>  }
>  
> -void hmp_info_accelerators(Monitor *mon, const QDict *qdict)
> +void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      AcceleratorInfo *info;
>      AcceleratorList *accel;
>  
> @@ -180,8 +185,9 @@ void hmp_info_accelerators(Monitor *mon, const QDict *qdict)
>      qapi_free_AcceleratorInfo(info);
>  }
>  
> -void hmp_info_uuid(Monitor *mon, const QDict *qdict)
> +void hmp_info_uuid(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      UuidInfo *info;
>  
>      info = qmp_query_uuid(NULL);
> @@ -189,8 +195,9 @@ void hmp_info_uuid(Monitor *mon, const QDict *qdict)
>      qapi_free_UuidInfo(info);
>  }
>  
> -void hmp_info_balloon(Monitor *mon, const QDict *qdict)
> +void hmp_info_balloon(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      BalloonInfo *info;
>      Error *err = NULL;
>  
> @@ -204,18 +211,19 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict)
>      qapi_free_BalloonInfo(info);
>  }
>  
> -void hmp_system_reset(Monitor *mon, const QDict *qdict)
> +void hmp_system_reset(MonitorHMP *hmp, const QDict *qdict)
>  {
>      qmp_system_reset(NULL);
>  }
>  
> -void hmp_system_powerdown(Monitor *mon, const QDict *qdict)
> +void hmp_system_powerdown(MonitorHMP *hmp, const QDict *qdict)
>  {
>      qmp_system_powerdown(NULL);
>  }
>  
> -void hmp_memsave(Monitor *mon, const QDict *qdict)
> +void hmp_memsave(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      uint32_t size = qdict_get_int(qdict, "size");
>      const char *filename = qdict_get_str(qdict, "filename");
>      uint64_t addr = qdict_get_int(qdict, "val");
> @@ -231,8 +239,9 @@ void hmp_memsave(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_pmemsave(Monitor *mon, const QDict *qdict)
> +void hmp_pmemsave(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      uint32_t size = qdict_get_int(qdict, "size");
>      const char *filename = qdict_get_str(qdict, "filename");
>      uint64_t addr = qdict_get_int(qdict, "val");
> @@ -242,24 +251,27 @@ void hmp_pmemsave(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
> +void hmp_system_wakeup(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_system_wakeup(&err);
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_nmi(Monitor *mon, const QDict *qdict)
> +void hmp_nmi(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_inject_nmi(&err);
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_balloon(Monitor *mon, const QDict *qdict)
> +void hmp_balloon(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int64_t value = qdict_get_int(qdict, "value");
>      Error *err = NULL;
>  
> @@ -267,8 +279,9 @@ void hmp_balloon(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
> +void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      MemoryDeviceInfoList *info_list = qmp_query_memory_devices(&err);
>      MemoryDeviceInfoList *info;
> @@ -370,8 +383,9 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
> +void hmp_info_vm_generation_id(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      GuidInfo *info = qmp_query_vm_generation_id(&err);
>      if (info) {
> @@ -381,8 +395,9 @@ void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict)
>      qapi_free_GuidInfo(info);
>  }
>  
> -void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict)
> +void hmp_info_memory_size_summary(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      MemoryInfo *info = qmp_query_memory_size_summary(&err);
>      if (info) {
> diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c
> index bf6ac28bef47..ab1eb14f99e0 100644
> --- a/hw/i386/kvm/xen-stubs.c
> +++ b/hw/i386/kvm/xen-stubs.c
> @@ -40,12 +40,14 @@ void xen_primary_console_set_be_port(uint16_t port)
>  {
>  }
>  
> -void hmp_xen_event_list(Monitor *mon, const QDict *qdict)
> +void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      monitor_printf(mon, "XEN emulation is not available in this QEMU\n");
>  }
>  
> -void hmp_xen_event_inject(Monitor *mon, const QDict *qdict)
> +void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      monitor_printf(mon, "XEN emulation is not available in this QEMU\n");
>  }
> diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
> index 8b243984e412..845838c372d5 100644
> --- a/hw/i386/kvm/xen_evtchn.c
> +++ b/hw/i386/kvm/xen_evtchn.c
> @@ -2344,8 +2344,9 @@ void qmp_xen_event_inject(uint32_t port, Error **errp)
>      }
>  }
>  
> -void hmp_xen_event_list(Monitor *mon, const QDict *qdict)
> +void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      EvtchnInfoList *iter, *info_list;
>      Error *err = NULL;
>  
> @@ -2379,8 +2380,9 @@ void hmp_xen_event_list(Monitor *mon, const QDict *qdict)
>      qapi_free_EvtchnInfoList(info_list);
>  }
>  
> -void hmp_xen_event_inject(Monitor *mon, const QDict *qdict)
> +void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int port = qdict_get_int(qdict, "port");
>      Error *err = NULL;
>  
> diff --git a/hw/i386/sgx-hmp-stub.c b/hw/i386/sgx-hmp-stub.c
> index cf1d9a6344b0..a4848ae1d1a7 100644
> --- a/hw/i386/sgx-hmp-stub.c
> +++ b/hw/i386/sgx-hmp-stub.c
> @@ -10,7 +10,8 @@
>  #include "monitor/hmp.h"
>  #include "monitor/monitor.h"
>  
> -void hmp_info_sgx(Monitor *mon, const QDict *qdict)
> +void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      monitor_printf(mon, "SGX is not available in this QEMU\n");
>  }
> diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
> index 7e4c509f5a4a..77b41d234c9f 100644
> --- a/hw/i386/sgx.c
> +++ b/hw/i386/sgx.c
> @@ -234,8 +234,9 @@ SgxInfo *qmp_query_sgx(Error **errp)
>      return info;
>  }
>  
> -void hmp_info_sgx(Monitor *mon, const QDict *qdict)
> +void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      SgxEpcSectionList *section_list, *section;
>      g_autoptr(SgxInfo) info = qmp_query_sgx(&err);
> diff --git a/hw/misc/mos6522-stub.c b/hw/misc/mos6522-stub.c
> index 85eb0ee36ee1..6a7d76292f00 100644
> --- a/hw/misc/mos6522-stub.c
> +++ b/hw/misc/mos6522-stub.c
> @@ -10,7 +10,8 @@
>  #include "monitor/monitor.h"
>  #include "monitor/hmp.h"
>  
> -void hmp_info_via(Monitor *mon, const QDict *qdict)
> +void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      monitor_printf(mon, "MOS6522 VIA is not available in this QEMU\n");
>  }
> diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c
> index bae766ef1782..15a6a1a75745 100644
> --- a/hw/misc/mos6522.c
> +++ b/hw/misc/mos6522.c
> @@ -586,8 +586,9 @@ static HumanReadableText *qmp_x_query_via(Error **errp)
>      return human_readable_text_from_str(buf);
>  }
>  
> -void hmp_info_via(Monitor *mon, const QDict *qdict)
> +void hmp_info_via(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      g_autoptr(HumanReadableText) info = qmp_x_query_via(&err);
>  
> diff --git a/hw/net/rocker/rocker-hmp-cmds.c b/hw/net/rocker/rocker-hmp-cmds.c
> index df40991f6d20..856aaef5e210 100644
> --- a/hw/net/rocker/rocker-hmp-cmds.c
> +++ b/hw/net/rocker/rocker-hmp-cmds.c
> @@ -20,8 +20,9 @@
>  #include "qapi/qapi-commands-rocker.h"
>  #include "qobject/qdict.h"
>  
> -void hmp_rocker(Monitor *mon, const QDict *qdict)
> +void hmp_rocker(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *name = qdict_get_str(qdict, "name");
>      RockerSwitch *rocker;
>      Error *err = NULL;
> @@ -38,8 +39,9 @@ void hmp_rocker(Monitor *mon, const QDict *qdict)
>      qapi_free_RockerSwitch(rocker);
>  }
>  
> -void hmp_rocker_ports(Monitor *mon, const QDict *qdict)
> +void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      RockerPortList *list, *port;
>      const char *name = qdict_get_str(qdict, "name");
>      Error *err = NULL;
> @@ -65,8 +67,9 @@ void hmp_rocker_ports(Monitor *mon, const QDict *qdict)
>      qapi_free_RockerPortList(list);
>  }
>  
> -void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict)
> +void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      RockerOfDpaFlowList *list, *info;
>      const char *name = qdict_get_str(qdict, "name");
>      uint32_t tbl_id = qdict_get_try_int(qdict, "tbl_id", -1);
> @@ -214,8 +217,9 @@ void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict)
>      qapi_free_RockerOfDpaFlowList(list);
>  }
>  
> -void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict)
> +void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      RockerOfDpaGroupList *list, *g;
>      const char *name = qdict_get_str(qdict, "name");
>      uint8_t type = qdict_get_try_int(qdict, "type", 9);
> diff --git a/hw/pci/pci-hmp-cmds.c b/hw/pci/pci-hmp-cmds.c
> index a5f6483cc3d2..be24aecc8ac8 100644
> --- a/hw/pci/pci-hmp-cmds.c
> +++ b/hw/pci/pci-hmp-cmds.c
> @@ -117,8 +117,9 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
>      }
>  }
>  
> -void hmp_info_pci(Monitor *mon, const QDict *qdict)
> +void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      PciInfoList *info_list, *info;
>  
>      info_list = qmp_query_pci(&error_abort);
> @@ -170,8 +171,9 @@ void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
>      }
>  }
>  
> -void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
> +void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *id = qdict_get_str(qdict, "id");
>      const char *error_name;
> diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c
> index 3397d0c82ea8..a80e34175462 100644
> --- a/hw/pci/pci-stub.c
> +++ b/hw/pci/pci-stub.c
> @@ -34,12 +34,13 @@ PciInfoList *qmp_query_pci(Error **errp)
>      return NULL;
>  }
>  
> -void hmp_info_pci(Monitor *mon, const QDict *qdict)
> +void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict)
>  {
>  }
>  
> -void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
> +void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      monitor_printf(mon, "PCI devices not supported\n");
>  }
>  
> diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
> index 7dca67d6618c..d8afaf730639 100644
> --- a/hw/s390x/s390-skeys.c
> +++ b/hw/s390x/s390-skeys.c
> @@ -104,8 +104,9 @@ static void write_keys(FILE *f, uint8_t *keys, uint64_t startgfn,
>      }
>  }
>  
> -void hmp_info_skeys(Monitor *mon, const QDict *qdict)
> +void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      S390SKeysState *ss = s390_get_skeys_device();
>      S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
>      uint64_t addr = qdict_get_int(qdict, "addr");
> @@ -134,7 +135,7 @@ void hmp_info_skeys(Monitor *mon, const QDict *qdict)
>      monitor_printf(mon, "  key: 0x%X\n", key);
>  }
>  
> -void hmp_dump_skeys(Monitor *mon, const QDict *qdict)
> +void hmp_dump_skeys(MonitorHMP *hmp, const QDict *qdict)
>  {
>      const char *filename = qdict_get_str(qdict, "filename");
>      Error *err = NULL;
> diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
> index b0f04eb30c7f..b4a405455901 100644
> --- a/hw/s390x/s390-stattrib.c
> +++ b/hw/s390x/s390-stattrib.c
> @@ -59,8 +59,9 @@ void s390_stattrib_init(void)
>  
>  /* Console commands: */
>  
> -void hmp_migrationmode(Monitor *mon, const QDict *qdict)
> +void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      S390StAttribState *sas = s390_get_stattrib_device();
>      S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
>      uint64_t what = qdict_get_int(qdict, "mode");
> @@ -74,8 +75,9 @@ void hmp_migrationmode(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_info_cmma(Monitor *mon, const QDict *qdict)
> +void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      S390StAttribState *sas = s390_get_stattrib_device();
>      S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
>      uint64_t addr = qdict_get_int(qdict, "addr");
> diff --git a/hw/uefi/ovmf-log.c b/hw/uefi/ovmf-log.c
> index 3a24afd9417d..c97622b2aad6 100644
> --- a/hw/uefi/ovmf-log.c
> +++ b/hw/uefi/ovmf-log.c
> @@ -256,8 +256,9 @@ FirmwareLog *qmp_query_firmware_log(bool have_max_size, uint64_t max_size,
>      return ret;
>  }
>  
> -void hmp_info_firmware_log(Monitor *mon, const QDict *qdict)
> +void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      g_autofree gchar *log_esc = NULL;
>      g_autofree guchar *log_out = NULL;
>      Error *err = NULL;
> diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
> index af67d5dfeb10..c02343d3a655 100644
> --- a/hw/usb/host-libusb.c
> +++ b/hw/usb/host-libusb.c
> @@ -1920,8 +1920,9 @@ static void usb_host_auto_check(void *unused)
>      timer_mod(usb_auto_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 2000);
>  }
>  
> -void hmp_info_usbhost(Monitor *mon, const QDict *qdict)
> +void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      libusb_device **devs = NULL;
>      struct libusb_device_descriptor ddesc;
>      char port[16];
> diff --git a/hw/virtio/virtio-hmp-cmds.c b/hw/virtio/virtio-hmp-cmds.c
> index a91bb7dbeda5..49f3367785ba 100644
> --- a/hw/virtio/virtio-hmp-cmds.c
> +++ b/hw/virtio/virtio-hmp-cmds.c
> @@ -80,8 +80,9 @@ static void hmp_virtio_dump_features(Monitor *mon,
>      }
>  }
>  
> -void hmp_virtio_query(Monitor *mon, const QDict *qdict)
> +void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      VirtioInfoList *list = qmp_x_query_virtio(&err);
>      VirtioInfoList *node;
> @@ -105,8 +106,9 @@ void hmp_virtio_query(Monitor *mon, const QDict *qdict)
>      qapi_free_VirtioInfoList(list);
>  }
>  
> -void hmp_virtio_status(Monitor *mon, const QDict *qdict)
> +void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *path = qdict_get_try_str(qdict, "path");
>      VirtioStatus *s = qmp_x_query_virtio_status(path, &err);
> @@ -183,8 +185,9 @@ void hmp_virtio_status(Monitor *mon, const QDict *qdict)
>      qapi_free_VirtioStatus(s);
>  }
>  
> -void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict)
> +void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *path = qdict_get_try_str(qdict, "path");
>      int queue = qdict_get_int(qdict, "queue");
> @@ -216,8 +219,9 @@ void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict)
>      qapi_free_VirtVhostQueueStatus(s);
>  }
>  
> -void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict)
> +void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *path = qdict_get_try_str(qdict, "path");
>      int queue = qdict_get_int(qdict, "queue");
> @@ -261,8 +265,9 @@ void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict)
>      qapi_free_VirtQueueStatus(s);
>  }
>  
> -void hmp_virtio_queue_element(Monitor *mon, const QDict *qdict)
> +void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *path = qdict_get_try_str(qdict, "path");
>      int queue = qdict_get_int(qdict, "queue");
> diff --git a/include/block/block-hmp-cmds.h b/include/block/block-hmp-cmds.h
> index 71113cd7efa4..0f5908958f05 100644
> --- a/include/block/block-hmp-cmds.h
> +++ b/include/block/block-hmp-cmds.h
> @@ -16,41 +16,42 @@
>  #define BLOCK_BLOCK_HMP_CMDS_H
>  
>  #include "qemu/coroutine.h"
> +#include "monitor/hmp.h"
>  
> -void hmp_drive_add(Monitor *mon, const QDict *qdict);
> +void hmp_drive_add(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_commit(Monitor *mon, const QDict *qdict);
> -void hmp_drive_del(Monitor *mon, const QDict *qdict);
> +void hmp_commit(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_drive_del(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_drive_mirror(Monitor *mon, const QDict *qdict);
> -void hmp_drive_backup(Monitor *mon, const QDict *qdict);
> +void hmp_drive_mirror(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_drive_backup(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict);
> -void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
> -void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
> -void hmp_block_job_resume(Monitor *mon, const QDict *qdict);
> -void hmp_block_job_complete(Monitor *mon, const QDict *qdict);
> +void hmp_block_job_set_speed(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_job_cancel(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_job_pause(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_job_resume(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_job_complete(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict);
> -void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict);
> -void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict);
> +void hmp_snapshot_blkdev(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_snapshot_blkdev_internal(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_snapshot_delete_blkdev_internal(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_nbd_server_start(Monitor *mon, const QDict *qdict);
> -void hmp_nbd_server_add(Monitor *mon, const QDict *qdict);
> -void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict);
> -void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict);
> +void hmp_nbd_server_start(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_nbd_server_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_nbd_server_remove(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_nbd_server_stop(MonitorHMP *hmp, const QDict *qdict);
>  
> -void coroutine_fn hmp_block_resize(Monitor *mon, const QDict *qdict);
> -void hmp_block_stream(Monitor *mon, const QDict *qdict);
> -void hmp_block_passwd(Monitor *mon, const QDict *qdict);
> -void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict);
> -void hmp_eject(Monitor *mon, const QDict *qdict);
> +void coroutine_fn hmp_block_resize(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_stream(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_passwd(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_block_set_io_throttle(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_eject(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_qemu_io(Monitor *mon, const QDict *qdict);
> +void hmp_qemu_io(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_info_block(Monitor *mon, const QDict *qdict);
> -void hmp_info_blockstats(Monitor *mon, const QDict *qdict);
> -void hmp_info_block_jobs(Monitor *mon, const QDict *qdict);
> -void hmp_info_snapshots(Monitor *mon, const QDict *qdict);
> +void hmp_info_block(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_blockstats(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_block_jobs(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_snapshots(MonitorHMP *hmp, const QDict *qdict);
>  
>  #endif
> diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h
> index 78e2ceedd7fd..cbd4711933e8 100644
> --- a/include/hw/usb/usb.h
> +++ b/include/hw/usb/usb.h
> @@ -31,6 +31,7 @@
>  #include "qemu/queue.h"
>  #include "qom/object.h"
>  #include "qapi/error.h"
> +#include "monitor/hmp.h"
>  
>  /* Constants related to the USB / PCI interaction */
>  #define USB_SBRN    0x60 /* Serial Bus Release Number Register */
> @@ -466,7 +467,7 @@ void usb_wakeup(USBEndpoint *ep, unsigned int stream);
>  void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
>  
>  /* usb-linux.c */
> -void hmp_info_usbhost(Monitor *mon, const QDict *qdict);
> +void hmp_info_usbhost(MonitorHMP *hmp, const QDict *qdict);
>  
>  /* usb ports of the VM */
>  
> diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
> index 166cd4100c63..7a270ad3f25c 100644
> --- a/include/monitor/hmp.h
> +++ b/include/monitor/hmp.h
> @@ -22,7 +22,7 @@
>  OBJECT_DECLARE_TYPE(MonitorHMP, MonitorHMPClass, MONITOR_HMP);
>  
>  #define HMP_STUB(cmd) \
> -    void hmp_##cmd(Monitor *mon, const QDict *qdict) \
> +    void hmp_##cmd(MonitorHMP *hmp, const QDict *qdict) \
>      { \
>          g_assert_not_reached(); \
>      }
> @@ -46,7 +46,7 @@ int monitor_hmp_read_password(MonitorHMP *hmp, ReadLineFunc *readline_func,
>                                void *opaque);
>  
>  void monitor_register_hmp(const char *name, bool info,
> -                          void (*cmd)(Monitor *mon, const QDict *qdict));
> +                          void (*cmd)(MonitorHMP *mon, const QDict *qdict));
>  void monitor_register_hmp_info_hrt(const char *name,
>                                     HumanReadableText *(*handler)(Error **errp));
>  
> @@ -58,58 +58,58 @@ bool hmp_handle_error(Monitor *mon, Error *err);
>  void hmp_help_cmd(Monitor *mon, const char *name);
>  strList *hmp_split_at_comma(const char *str);
>  
> -void hmp_info_name(Monitor *mon, const QDict *qdict);
> -void hmp_info_version(Monitor *mon, const QDict *qdict);
> -void hmp_info_kvm(Monitor *mon, const QDict *qdict);
> -void hmp_info_accelerators(Monitor *mon, const QDict *qdict);
> -void hmp_info_status(Monitor *mon, const QDict *qdict);
> -void hmp_info_uuid(Monitor *mon, const QDict *qdict);
> -void hmp_info_chardev(Monitor *mon, const QDict *qdict);
> -void hmp_info_mice(Monitor *mon, const QDict *qdict);
> -void hmp_info_migrate(Monitor *mon, const QDict *qdict);
> -void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
> -void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
> -void hmp_info_cpus(Monitor *mon, const QDict *qdict);
> -void hmp_info_vnc(Monitor *mon, const QDict *qdict);
> -void hmp_info_spice(Monitor *mon, const QDict *qdict);
> -void hmp_info_balloon(Monitor *mon, const QDict *qdict);
> -void hmp_info_pci(Monitor *mon, const QDict *qdict);
> -void hmp_info_tpm(Monitor *mon, const QDict *qdict);
> -void hmp_info_iothreads(Monitor *mon, const QDict *qdict);
> -void hmp_quit(Monitor *mon, const QDict *qdict);
> -void hmp_stop(Monitor *mon, const QDict *qdict);
> -void hmp_sync_profile(Monitor *mon, const QDict *qdict);
> -void hmp_system_reset(Monitor *mon, const QDict *qdict);
> -void hmp_system_powerdown(Monitor *mon, const QDict *qdict);
> -void hmp_exit_preconfig(Monitor *mon, const QDict *qdict);
> -void hmp_announce_self(Monitor *mon, const QDict *qdict);
> -void hmp_cpu(Monitor *mon, const QDict *qdict);
> -void hmp_memsave(Monitor *mon, const QDict *qdict);
> -void hmp_pmemsave(Monitor *mon, const QDict *qdict);
> -void hmp_ringbuf_write(Monitor *mon, const QDict *qdict);
> -void hmp_ringbuf_read(Monitor *mon, const QDict *qdict);
> -void hmp_cont(Monitor *mon, const QDict *qdict);
> -void hmp_system_wakeup(Monitor *mon, const QDict *qdict);
> -void hmp_nmi(Monitor *mon, const QDict *qdict);
> -void hmp_info_network(Monitor *mon, const QDict *qdict);
> -void hmp_set_link(Monitor *mon, const QDict *qdict);
> -void hmp_balloon(Monitor *mon, const QDict *qdict);
> -void hmp_loadvm(Monitor *mon, const QDict *qdict);
> -void hmp_savevm(Monitor *mon, const QDict *qdict);
> -void hmp_delvm(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_cancel(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_continue(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_incoming(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_recover(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_pause(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict);
> -void hmp_client_migrate_info(Monitor *mon, const QDict *qdict);
> -void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict);
> -void hmp_x_colo_lost_heartbeat(Monitor *mon, const QDict *qdict);
> -void hmp_set_password(Monitor *mon, const QDict *qdict);
> -void hmp_expire_password(Monitor *mon, const QDict *qdict);
> -void hmp_change(Monitor *mon, const QDict *qdict);
> +void hmp_info_name(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_version(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_kvm(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_accelerators(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_status(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_uuid(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_chardev(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_mice(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_migrate_capabilities(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_migrate_parameters(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_cpus(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_balloon(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_pci(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_tpm(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_iothreads(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_quit(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_stop(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_sync_profile(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_system_reset(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_system_powerdown(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_exit_preconfig(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_announce_self(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_cpu(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_memsave(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_pmemsave(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_ringbuf_write(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_ringbuf_read(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_cont(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_system_wakeup(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_nmi(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_network(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_set_link(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_balloon(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_loadvm(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_savevm(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_delvm(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_cancel(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_continue(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_incoming(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_recover(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_pause(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_set_capability(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_set_parameter(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_client_migrate_info(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrate_start_postcopy(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_x_colo_lost_heartbeat(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_set_password(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_expire_password(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_change(MonitorHMP *hmp, const QDict *qdict);
>  #ifdef CONFIG_VNC
>  void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
>                      const char *arg, const char *read_only, bool force,
> @@ -118,101 +118,101 @@ void hmp_change_vnc(Monitor *mon, const char *device, const char *target,
>  void hmp_change_medium(Monitor *mon, const char *device, const char *target,
>                         const char *arg, const char *read_only, bool force,
>                         Error **errp);
> -void hmp_migrate(Monitor *mon, const QDict *qdict);
> -void hmp_device_add(Monitor *mon, const QDict *qdict);
> -void hmp_device_del(Monitor *mon, const QDict *qdict);
> -void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict);
> -void hmp_netdev_add(Monitor *mon, const QDict *qdict);
> -void hmp_netdev_del(Monitor *mon, const QDict *qdict);
> -void hmp_getfd(Monitor *mon, const QDict *qdict);
> -void hmp_closefd(Monitor *mon, const QDict *qdict);
> -void hmp_mouse_move(Monitor *mon, const QDict *qdict);
> -void hmp_mouse_button(Monitor *mon, const QDict *qdict);
> -void hmp_mouse_set(Monitor *mon, const QDict *qdict);
> -void hmp_sendkey(Monitor *mon, const QDict *qdict);
> -void coroutine_fn hmp_screendump(Monitor *mon, const QDict *qdict);
> -void hmp_chardev_add(Monitor *mon, const QDict *qdict);
> -void hmp_chardev_change(Monitor *mon, const QDict *qdict);
> -void hmp_chardev_remove(Monitor *mon, const QDict *qdict);
> -void hmp_chardev_send_break(Monitor *mon, const QDict *qdict);
> -void hmp_object_add(Monitor *mon, const QDict *qdict);
> -void hmp_object_del(Monitor *mon, const QDict *qdict);
> -void hmp_info_memdev(Monitor *mon, const QDict *qdict);
> -void hmp_info_memory_devices(Monitor *mon, const QDict *qdict);
> -void hmp_qom_list(Monitor *mon, const QDict *qdict);
> -void hmp_qom_get(Monitor *mon, const QDict *qdict);
> -void hmp_qom_set(Monitor *mon, const QDict *qdict);
> -void hmp_info_qom_tree(Monitor *mon, const QDict *dict);
> -void hmp_virtio_query(Monitor *mon, const QDict *qdict);
> -void hmp_virtio_status(Monitor *mon, const QDict *qdict);
> -void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict);
> -void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict);
> -void hmp_virtio_queue_element(Monitor *mon, const QDict *qdict);
> -void hmp_xen_event_inject(Monitor *mon, const QDict *qdict);
> -void hmp_xen_event_list(Monitor *mon, const QDict *qdict);
> -void hmp_rocker(Monitor *mon, const QDict *qdict);
> -void hmp_rocker_ports(Monitor *mon, const QDict *qdict);
> -void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict);
> -void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict);
> -void hmp_info_dump(Monitor *mon, const QDict *qdict);
> -void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict);
> -void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict);
> -void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict);
> -void hmp_info_replay(Monitor *mon, const QDict *qdict);
> -void hmp_replay_break(Monitor *mon, const QDict *qdict);
> -void hmp_replay_delete_break(Monitor *mon, const QDict *qdict);
> -void hmp_replay_seek(Monitor *mon, const QDict *qdict);
> -void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict);
> -void hmp_calc_dirty_rate(Monitor *mon, const QDict *qdict);
> -void hmp_set_vcpu_dirty_limit(Monitor *mon, const QDict *qdict);
> -void hmp_cancel_vcpu_dirty_limit(Monitor *mon, const QDict *qdict);
> -void hmp_info_vcpu_dirty_limit(Monitor *mon, const QDict *qdict);
> +void hmp_migrate(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_device_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_device_del(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_dump_guest_memory(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_netdev_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_netdev_del(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_getfd(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_closefd(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_mouse_move(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_mouse_button(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_mouse_set(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_sendkey(MonitorHMP *hmp, const QDict *qdict);
> +void coroutine_fn hmp_screendump(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_chardev_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_chardev_change(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_chardev_remove(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_chardev_send_break(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_object_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_object_del(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_memdev(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_memory_devices(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_qom_list(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_qom_get(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_qom_set(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_qom_tree(MonitorHMP *hmp, const QDict *dict);
> +void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_xen_event_inject(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_xen_event_list(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_rocker(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_rocker_ports(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_rocker_of_dpa_flows(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_rocker_of_dpa_groups(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_dump(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_hotpluggable_cpus(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_vm_generation_id(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_memory_size_summary(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_set_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_cancel_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict);
>  void hmp_human_readable_text_helper(Monitor *mon,
>                                      HumanReadableText *(*qmp_handler)(Error **));
> -void hmp_info_stats(Monitor *mon, const QDict *qdict);
> -void hmp_one_insn_per_tb(Monitor *mon, const QDict *qdict);
> -void hmp_watchdog_action(Monitor *mon, const QDict *qdict);
> -void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict);
> -void hmp_info_capture(Monitor *mon, const QDict *qdict);
> -void hmp_stopcapture(Monitor *mon, const QDict *qdict);
> -void hmp_wavcapture(Monitor *mon, const QDict *qdict);
> -void hmp_trace_event(Monitor *mon, const QDict *qdict);
> -void hmp_trace_file(Monitor *mon, const QDict *qdict);
> -void hmp_info_trace_events(Monitor *mon, const QDict *qdict);
> -void hmp_help(Monitor *mon, const QDict *qdict);
> -void hmp_clear(Monitor *mon, const QDict *qdict);
> -void hmp_info_help(Monitor *mon, const QDict *qdict);
> -void hmp_info_sync_profile(Monitor *mon, const QDict *qdict);
> -void hmp_info_history(Monitor *mon, const QDict *qdict);
> -void hmp_logfile(Monitor *mon, const QDict *qdict);
> -void hmp_log(Monitor *mon, const QDict *qdict);
> -void hmp_gdbserver(Monitor *mon, const QDict *qdict);
> -void hmp_print(Monitor *mon, const QDict *qdict);
> -void hmp_sum(Monitor *mon, const QDict *qdict);
> -void hmp_ioport_read(Monitor *mon, const QDict *qdict);
> -void hmp_ioport_write(Monitor *mon, const QDict *qdict);
> -void hmp_boot_set(Monitor *mon, const QDict *qdict);
> -void hmp_info_mtree(Monitor *mon, const QDict *qdict);
> -void hmp_info_cryptodev(Monitor *mon, const QDict *qdict);
> -void hmp_dumpdtb(Monitor *mon, const QDict *qdict);
> -void hmp_info_firmware_log(Monitor *mon, const QDict *qdict);
> -void hmp_info_mem(Monitor *mon, const QDict *qdict);
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict);
> -void hmp_mce(Monitor *mon, const QDict *qdict);
> -void hmp_info_local_apic(Monitor *mon, const QDict *qdict);
> -void hmp_info_sev(Monitor *mon, const QDict *qdict);
> -void hmp_info_sgx(Monitor *mon, const QDict *qdict);
> -void hmp_info_via(Monitor *mon, const QDict *qdict);
> -void hmp_memory_dump(Monitor *mon, const QDict *qdict);
> -void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict);
> -void hmp_info_registers(Monitor *mon, const QDict *qdict);
> -void hmp_gva2gpa(Monitor *mon, const QDict *qdict);
> -void hmp_gpa2hva(Monitor *mon, const QDict *qdict);
> -void hmp_gpa2hpa(Monitor *mon, const QDict *qdict);
> +void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_one_insn_per_tb(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_watchdog_action(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_pcie_aer_inject_error(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_capture(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_stopcapture(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_wavcapture(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_trace_event(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_trace_file(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_trace_events(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_help(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_clear(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_help(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_sync_profile(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_history(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_logfile(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_log(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_gdbserver(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_print(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_sum(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_ioport_read(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_ioport_write(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_boot_set(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_mtree(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_cryptodev(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_dumpdtb(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_firmware_log(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_mce(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_sgx(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_via(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_memory_dump(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_physical_memory_dump(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_gva2gpa(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_gpa2hva(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_gpa2hpa(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_dump_skeys(Monitor *mon, const QDict *qdict);
> -void hmp_info_skeys(Monitor *mon, const QDict *qdict);
> -void hmp_info_cmma(Monitor *mon, const QDict *qdict);
> -void hmp_migrationmode(Monitor *mon, const QDict *qdict);
> +void hmp_dump_skeys(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_skeys(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_cmma(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_migrationmode(MonitorHMP *hmp, const QDict *qdict);
>  
>  #endif
> diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
> index f85f25738d58..8f7e2f616cf3 100644
> --- a/include/monitor/qdev.h
> +++ b/include/monitor/qdev.h
> @@ -2,11 +2,12 @@
>  #define MONITOR_QDEV_H
>  
>  #include "hw/core/qdev.h"
> +#include "monitor/hmp.h"
>  
>  /*** monitor commands ***/
>  
> -void hmp_info_qtree(Monitor *mon, const QDict *qdict);
> -void hmp_info_qdm(Monitor *mon, const QDict *qdict);
> +void hmp_info_qtree(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_info_qdm(MonitorHMP *hmp, const QDict *qdict);
>  void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp);
>  
>  int qdev_device_help(QemuOpts *opts);
> diff --git a/include/net/net.h b/include/net/net.h
> index a7c49c543783..626b99794806 100644
> --- a/include/net/net.h
> +++ b/include/net/net.h
> @@ -5,6 +5,7 @@
>  #include "qapi/qapi-types-net.h"
>  #include "net/queue.h"
>  #include "hw/core/qdev-properties-system.h"
> +#include "monitor/hmp.h"
>  
>  #define MAC_FMT "%02X:%02X:%02X:%02X:%02X:%02X"
>  #define MAC_ARG(x) ((uint8_t *)(x))[0], ((uint8_t *)(x))[1], \
> @@ -318,8 +319,8 @@ void net_init_clients(void);
>  void net_check_clients(void);
>  void net_client_set_link(NetClientState **ncs, int queues, bool up);
>  void net_cleanup(void);
> -void hmp_host_net_add(Monitor *mon, const QDict *qdict);
> -void hmp_host_net_remove(Monitor *mon, const QDict *qdict);
> +void hmp_host_net_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_host_net_remove(MonitorHMP *hmp, const QDict *qdict);
>  void netdev_add(QemuOpts *opts, Error **errp);
>  
>  int net_hub_id_for_client(NetClientState *nc, int *id);
> diff --git a/include/net/slirp.h b/include/net/slirp.h
> index bad3e1e2416b..38859edf58ae 100644
> --- a/include/net/slirp.h
> +++ b/include/net/slirp.h
> @@ -24,13 +24,13 @@
>  #ifndef QEMU_NET_SLIRP_H
>  #define QEMU_NET_SLIRP_H
>  
> -
>  #ifdef CONFIG_SLIRP
> +#include "monitor/hmp.h"
>  
> -void hmp_hostfwd_add(Monitor *mon, const QDict *qdict);
> -void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict);
> +void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict);
> +void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict);
>  
> -void hmp_info_usernet(Monitor *mon, const QDict *qdict);
> +void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict);
>  
>  #endif
>  
> diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c
> index b360f49efeaf..567abab321cc 100644
> --- a/migration/dirtyrate.c
> +++ b/migration/dirtyrate.c
> @@ -856,8 +856,9 @@ struct DirtyRateInfo *qmp_query_dirty_rate(bool has_calc_time_unit,
>          has_calc_time_unit ? calc_time_unit : TIME_UNIT_SECOND);
>  }
>  
> -void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict)
> +void hmp_info_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      DirtyRateInfo *info = query_dirty_rate_info(TIME_UNIT_SECOND);
>  
>      monitor_printf(mon, "Status: %s\n",
> @@ -891,8 +892,9 @@ void hmp_info_dirty_rate(Monitor *mon, const QDict *qdict)
>      g_free(info);
>  }
>  
> -void hmp_calc_dirty_rate(Monitor *mon, const QDict *qdict)
> +void hmp_calc_dirty_rate(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int64_t sec = qdict_get_try_int(qdict, "second", 0);
>      int64_t sample_pages = qdict_get_try_int(qdict, "sample_pages_per_GB", -1);
>      bool has_sample_pages = (sample_pages != -1);
> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
> index ad68fa23aa4b..8d2e8735277e 100644
> --- a/migration/migration-hmp-cmds.c
> +++ b/migration/migration-hmp-cmds.c
> @@ -135,8 +135,9 @@ static void migration_dump_blocktime(Monitor *mon, MigrationInfo *info)
>      }
>  }
>  
> -void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> +void hmp_info_migrate(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      bool show_all = qdict_get_try_bool(qdict, "all", false);
>      MigrationInfo *info;
>  
> @@ -297,8 +298,9 @@ out:
>      qapi_free_MigrationInfo(info);
>  }
>  
> -void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
> +void hmp_info_migrate_capabilities(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      MigrationCapabilityStatusList *caps, *cap;
>  
>      caps = qmp_query_migrate_capabilities(NULL);
> @@ -326,8 +328,9 @@ static void monitor_print_cpr_exec_command(Monitor *mon, strList *args)
>      monitor_printf(mon, "\n");
>  }
>  
> -void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
> +void hmp_info_migrate_parameters(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      MigrationParameters *params;
>      MigrationState *s = migrate_get_current();
>  
> @@ -473,8 +476,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
>      qapi_free_MigrationParameters(params);
>  }
>  
> -void hmp_loadvm(Monitor *mon, const QDict *qdict)
> +void hmp_loadvm(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      RunState saved_state = runstate_get();
>  
>      const char *name = qdict_get_str(qdict, "name");
> @@ -489,8 +493,9 @@ void hmp_loadvm(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_savevm(Monitor *mon, const QDict *qdict)
> +void hmp_savevm(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      save_snapshot(qdict_get_try_str(qdict, "name"),
> @@ -498,8 +503,9 @@ void hmp_savevm(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_delvm(Monitor *mon, const QDict *qdict)
> +void hmp_delvm(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *name = qdict_get_str(qdict, "name");
>  
> @@ -507,13 +513,14 @@ void hmp_delvm(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_cancel(MonitorHMP *hmp, const QDict *qdict)
>  {
>      qmp_migrate_cancel(NULL);
>  }
>  
> -void hmp_migrate_continue(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_continue(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *state = qdict_get_str(qdict, "state");
>      int val = qapi_enum_parse(&MigrationStatus_lookup, state, -1, &err);
> @@ -525,8 +532,9 @@ void hmp_migrate_continue(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_incoming(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *uri = qdict_get_str(qdict, "uri");
>      MigrationChannelList *caps = NULL;
> @@ -544,8 +552,9 @@ end:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_migrate_recover(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_recover(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *uri = qdict_get_str(qdict, "uri");
>  
> @@ -554,8 +563,9 @@ void hmp_migrate_recover(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_migrate_pause(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_pause(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_migrate_pause(&err);
> @@ -564,8 +574,9 @@ void hmp_migrate_pause(Monitor *mon, const QDict *qdict)
>  }
>  
>  
> -void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_set_capability(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *cap = qdict_get_str(qdict, "capability");
>      bool state = qdict_get_bool(qdict, "state");
>      Error *err = NULL;
> @@ -589,8 +600,9 @@ end:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_set_parameter(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *param = qdict_get_str(qdict, "parameter");
>      const char *valuestr = qdict_get_str(qdict, "value");
>      Visitor *v = string_input_visitor_new(valuestr);
> @@ -790,16 +802,18 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_migrate_start_postcopy(Monitor *mon, const QDict *qdict)
> +void hmp_migrate_start_postcopy(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      qmp_migrate_start_postcopy(&err);
>      hmp_handle_error(mon, err);
>  }
>  
>  #ifdef CONFIG_REPLICATION
> -void hmp_x_colo_lost_heartbeat(Monitor *mon, const QDict *qdict)
> +void hmp_x_colo_lost_heartbeat(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_x_colo_lost_heartbeat(&err);
> @@ -833,8 +847,9 @@ static void hmp_migrate_status_cb(void *opaque)
>      qapi_free_MigrationInfo(info);
>  }
>  
> -void hmp_migrate(Monitor *mon, const QDict *qdict)
> +void hmp_migrate(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      bool detach = qdict_get_try_bool(qdict, "detach", false);
>      bool resume = qdict_get_try_bool(qdict, "resume", false);
>      const char *uri = qdict_get_str(qdict, "uri");
> @@ -873,7 +888,6 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)
>  
>      if (!detach) {
>          HMPMigrationStatus *status;
> -        MonitorHMP *hmp = MONITOR_HMP(mon);
>  
>          if (!hmp->use_readline) {
>              monitor_printf(mon, "terminal does not allow synchronous "
> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> index 6718fec97047..afe4817b4056 100644
> --- a/monitor/hmp-cmds.c
> +++ b/monitor/hmp-cmds.c
> @@ -103,8 +103,9 @@ strList *hmp_split_at_comma(const char *str)
>      return res;
>  }
>  
> -void hmp_info_name(Monitor *mon, const QDict *qdict)
> +void hmp_info_name(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      NameInfo *info;
>  
>      info = qmp_query_name(NULL);
> @@ -114,8 +115,9 @@ void hmp_info_name(Monitor *mon, const QDict *qdict)
>      qapi_free_NameInfo(info);
>  }
>  
> -void hmp_info_version(Monitor *mon, const QDict *qdict)
> +void hmp_info_version(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      VersionInfo *info;
>  
>      info = qmp_query_version(NULL);
> @@ -127,22 +129,23 @@ void hmp_info_version(Monitor *mon, const QDict *qdict)
>      qapi_free_VersionInfo(info);
>  }
>  
> -void hmp_quit(Monitor *mon, const QDict *qdict)
> +void hmp_quit(MonitorHMP *hmp, const QDict *qdict)
>  {
> -    MonitorHMP *hmp = MONITOR_HMP(mon);
> +    Monitor *mon = MONITOR(hmp);
>      if (hmp->use_readline) {
>          monitor_suspend(mon);
>      }
>      qmp_quit(NULL);
>  }
>  
> -void hmp_stop(Monitor *mon, const QDict *qdict)
> +void hmp_stop(MonitorHMP *hmp, const QDict *qdict)
>  {
>      qmp_stop(NULL);
>  }
>  
> -void hmp_sync_profile(Monitor *mon, const QDict *qdict)
> +void hmp_sync_profile(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *op = qdict_get_try_str(qdict, "op");
>  
>      if (op == NULL) {
> @@ -166,16 +169,18 @@ void hmp_sync_profile(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_exit_preconfig(Monitor *mon, const QDict *qdict)
> +void hmp_exit_preconfig(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_x_exit_preconfig(&err);
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_cpu(Monitor *mon, const QDict *qdict)
> +void hmp_cpu(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int64_t cpu_index;
>  
>      /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
> @@ -186,16 +191,18 @@ void hmp_cpu(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_cont(Monitor *mon, const QDict *qdict)
> +void hmp_cont(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qmp_cont(&err);
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_change(Monitor *mon, const QDict *qdict)
> +void hmp_change(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *device = qdict_get_str(qdict, "device");
>      const char *target = qdict_get_str(qdict, "target");
>      const char *arg = qdict_get_try_str(qdict, "arg");
> @@ -216,8 +223,9 @@ void hmp_change(Monitor *mon, const QDict *qdict)
>  }
>  
>  #ifdef CONFIG_POSIX
> -void hmp_getfd(Monitor *mon, const QDict *qdict)
> +void hmp_getfd(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *fdname = qdict_get_str(qdict, "fdname");
>      Error *err = NULL;
>  
> @@ -226,8 +234,9 @@ void hmp_getfd(Monitor *mon, const QDict *qdict)
>  }
>  #endif
>  
> -void hmp_closefd(Monitor *mon, const QDict *qdict)
> +void hmp_closefd(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *fdname = qdict_get_str(qdict, "fdname");
>      Error *err = NULL;
>  
> @@ -235,8 +244,9 @@ void hmp_closefd(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
> +void hmp_info_iothreads(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
>      IOThreadInfoList *info;
>      IOThreadInfo *value;
> @@ -256,13 +266,15 @@ void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
>      qapi_free_IOThreadInfoList(info_list);
>  }
>  
> -void hmp_help(Monitor *mon, const QDict *qdict)
> +void hmp_help(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      hmp_help_cmd(mon, qdict_get_try_str(qdict, "name"));
>  }
>  
> -void hmp_clear(Monitor *mon, const QDict *qdict)
> +void hmp_clear(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      /*
>       * Send an ANSI escape sequence:
>       * "\x1b[H" - move cursor to top-left
> @@ -272,12 +284,13 @@ void hmp_clear(Monitor *mon, const QDict *qdict)
>      monitor_printf(mon, "\x1b[H\x1b[2J\x1b[3J");
>  }
>  
> -void hmp_info_help(Monitor *mon, const QDict *qdict)
> +void hmp_info_help(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      hmp_help_cmd(mon, "info");
>  }
>  
> -void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
> +void hmp_info_sync_profile(MonitorHMP *hmp, const QDict *qdict)
>  {
>      int64_t max = qdict_get_try_int(qdict, "max", 10);
>      bool mean = qdict_get_try_bool(qdict, "mean", false);
> @@ -288,9 +301,9 @@ void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
>      qsp_report(max, sort_by, coalesce);
>  }
>  
> -void hmp_info_history(Monitor *mon, const QDict *qdict)
> +void hmp_info_history(MonitorHMP *hmp, const QDict *qdict)
>  {
> -    MonitorHMP *hmp = MONITOR_HMP(mon);
> +    Monitor *mon = MONITOR(hmp);
>      int i;
>      const char *str;
>  
> @@ -308,7 +321,7 @@ void hmp_info_history(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_logfile(Monitor *mon, const QDict *qdict)
> +void hmp_logfile(MonitorHMP *hmp, const QDict *qdict)
>  {
>      Error *err = NULL;
>  
> @@ -317,8 +330,9 @@ void hmp_logfile(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_log(Monitor *mon, const QDict *qdict)
> +void hmp_log(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int mask;
>      const char *items = qdict_get_str(qdict, "items");
>      Error *err = NULL;
> @@ -338,8 +352,9 @@ void hmp_log(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_gdbserver(Monitor *mon, const QDict *qdict)
> +void hmp_gdbserver(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *device = qdict_get_try_str(qdict, "device");
>  
> @@ -357,8 +372,9 @@ void hmp_gdbserver(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_print(Monitor *mon, const QDict *qdict)
> +void hmp_print(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int format = qdict_get_int(qdict, "format");
>      hwaddr val = qdict_get_int(qdict, "val");
>  
> @@ -383,8 +399,9 @@ void hmp_print(Monitor *mon, const QDict *qdict)
>      monitor_printf(mon, "\n");
>  }
>  
> -void hmp_sum(Monitor *mon, const QDict *qdict)
> +void hmp_sum(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      uint32_t addr;
>      uint16_t sum;
>      uint32_t start = qdict_get_int(qdict, "start");
> @@ -401,8 +418,9 @@ void hmp_sum(Monitor *mon, const QDict *qdict)
>      monitor_printf(mon, "%05d\n", sum);
>  }
>  
> -void hmp_ioport_read(Monitor *mon, const QDict *qdict)
> +void hmp_ioport_read(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int size = qdict_get_int(qdict, "size");
>      int addr = qdict_get_int(qdict, "addr");
>      int has_index = qdict_haskey(qdict, "index");
> @@ -435,7 +453,7 @@ void hmp_ioport_read(Monitor *mon, const QDict *qdict)
>                     suffix, addr, size * 2, val);
>  }
>  
> -void hmp_ioport_write(Monitor *mon, const QDict *qdict)
> +void hmp_ioport_write(MonitorHMP *hmp, const QDict *qdict)
>  {
>      int size = qdict_get_int(qdict, "size");
>      int addr = qdict_get_int(qdict, "addr");
> @@ -457,8 +475,9 @@ void hmp_ioport_write(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_boot_set(Monitor *mon, const QDict *qdict)
> +void hmp_boot_set(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *local_err = NULL;
>      const char *bootdevice = qdict_get_str(qdict, "bootdevice");
>  
> @@ -470,7 +489,7 @@ void hmp_boot_set(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_info_mtree(Monitor *mon, const QDict *qdict)
> +void hmp_info_mtree(MonitorHMP *hmp, const QDict *qdict)
>  {
>      bool flatview = qdict_get_try_bool(qdict, "flatview", false);
>      bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false);
> @@ -481,8 +500,9 @@ void hmp_info_mtree(Monitor *mon, const QDict *qdict)
>  }
>  
>  #if defined(CONFIG_FDT)
> -void hmp_dumpdtb(Monitor *mon, const QDict *qdict)
> +void hmp_dumpdtb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *filename = qdict_get_str(qdict, "filename");
>      Error *local_err = NULL;
>  
> @@ -558,8 +578,9 @@ int monitor_get_cpu_index(Monitor *mon)
>      return cs ? cs->cpu_index : UNASSIGNED_CPU_INDEX;
>  }
>  
> -void hmp_info_registers(Monitor *mon, const QDict *qdict)
> +void hmp_info_registers(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      bool all_cpus = qdict_get_try_bool(qdict, "cpustate_all", false);
>      int vcpu = qdict_get_try_int(qdict, "vcpu", -1);
>      CPUState *cs;
> @@ -694,8 +715,9 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
>      }
>  }
>  
> -void hmp_memory_dump(Monitor *mon, const QDict *qdict)
> +void hmp_memory_dump(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int count = qdict_get_int(qdict, "count");
>      int format = qdict_get_int(qdict, "format");
>      int size = qdict_get_int(qdict, "size");
> @@ -704,8 +726,9 @@ void hmp_memory_dump(Monitor *mon, const QDict *qdict)
>      memory_dump(mon, count, format, size, addr, false);
>  }
>  
> -void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
> +void hmp_physical_memory_dump(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int count = qdict_get_int(qdict, "count");
>      int format = qdict_get_int(qdict, "format");
>      int size = qdict_get_int(qdict, "size");
> @@ -714,8 +737,9 @@ void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
>      memory_dump(mon, count, format, size, addr, true);
>  }
>  
> -void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
> +void hmp_gpa2hva(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      hwaddr addr = qdict_get_int(qdict, "addr");
>      Error *local_err = NULL;
>      MemoryRegion *mr = NULL;
> @@ -734,8 +758,9 @@ void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
>      memory_region_unref(mr);
>  }
>  
> -void hmp_gva2gpa(Monitor *mon, const QDict *qdict)
> +void hmp_gva2gpa(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      vaddr addr = qdict_get_int(qdict, "addr");
>      CPUState *cs = mon_get_cpu(mon);
>      TranslateForDebugResult tres;
> @@ -787,8 +812,9 @@ out:
>      return ret;
>  }
>  
> -void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
> +void hmp_gpa2hpa(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      hwaddr addr = qdict_get_int(qdict, "addr");
>      Error *local_err = NULL;
>      MemoryRegion *mr = NULL;
> diff --git a/monitor/hmp.c b/monitor/hmp.c
> index b4d05d47c4bf..6e6334b64685 100644
> --- a/monitor/hmp.c
> +++ b/monitor/hmp.c
> @@ -1228,12 +1228,12 @@ static void hmp_info_human_readable_text(Monitor *mon,
>      monitor_puts(mon, info->human_readable_text);
>  }
>  
> -static void handle_hmp_command_exec(Monitor *mon,
> +static void handle_hmp_command_exec(MonitorHMP *mon,
>                                      const HMPCommand *cmd,
>                                      QDict *qdict)
>  {
>      if (cmd->cmd_info_hrt) {
> -        hmp_info_human_readable_text(mon,
> +        hmp_info_human_readable_text(MONITOR(mon),
>                                       cmd->cmd_info_hrt);
>      } else {
>          cmd->cmd(mon, qdict);
> @@ -1241,7 +1241,7 @@ static void handle_hmp_command_exec(Monitor *mon,
>  }
>  
>  typedef struct HandleHmpCommandCo {
> -    Monitor *mon;
> +    MonitorHMP *mon;
>      const HMPCommand *cmd;
>      QDict *qdict;
>      bool done;
> @@ -1289,19 +1289,18 @@ void handle_hmp_command(MonitorHMP *hmp, const char *cmdline)
>  
>      if (!cmd->coroutine) {
>          /* old_mon is non-NULL when called from qmp_human_monitor_command() */
> -        Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(),
> -                                           &hmp->parent_obj);
> -        handle_hmp_command_exec(&hmp->parent_obj, cmd, qdict);
> +        Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(), MONITOR(hmp));
> +        handle_hmp_command_exec(hmp, cmd, qdict);
>          monitor_set_cur(qemu_coroutine_self(), old_mon);
>      } else {
>          HandleHmpCommandCo data = {
> -            .mon = &hmp->parent_obj,
> +            .mon = hmp,
>              .cmd = cmd,
>              .qdict = qdict,
>              .done = false,
>          };
>          Coroutine *co = qemu_coroutine_create(handle_hmp_command_co, &data);
> -        monitor_set_cur(co, &hmp->parent_obj);
> +        monitor_set_cur(co, MONITOR(hmp));
>          aio_co_enter(qemu_get_aio_context(), co);
>          AIO_WAIT_WHILE_UNLOCKED(NULL, !data.done);
>      }
> @@ -1689,7 +1688,7 @@ int hmp_compare_cmd(const char *name, const char *list)
>  }
>  
>  void monitor_register_hmp(const char *name, bool info,
> -                          void (*cmd)(Monitor *mon, const QDict *qdict))
> +                          void (*cmd)(MonitorHMP *mon, const QDict *qdict))
>  {
>      HMPCommand *table = hmp_cmds_for_target(info);
>  
> diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
> index ee9ba0c8231e..a0fa37c887ed 100644
> --- a/monitor/monitor-internal.h
> +++ b/monitor/monitor-internal.h
> @@ -77,7 +77,7 @@ typedef struct HMPCommand {
>      const char *params;
>      const char *help;
>      const char *flags; /* p=preconfig */
> -    void (*cmd)(Monitor *mon, const QDict *qdict);
> +    void (*cmd)(MonitorHMP *mon, const QDict *qdict);
>      /*
>       * If implementing a command that takes no arguments and simply
>       * prints formatted data, then leave @cmd NULL, and then set
> diff --git a/net/net-hmp-cmds.c b/net/net-hmp-cmds.c
> index 52ac8da770d9..702103b6a920 100644
> --- a/net/net-hmp-cmds.c
> +++ b/net/net-hmp-cmds.c
> @@ -45,8 +45,9 @@ static void hmp_print_client_info(Monitor *mon, NetworkClientInfo *ci)
>      }
>  }
>  
> -void hmp_info_network(Monitor *mon, const QDict *qdict)
> +void hmp_info_network(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      g_autoptr(NetworkInfo) info = qmp_x_query_network(&err);
>      NetHubInfoList *h;
> @@ -83,8 +84,9 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_set_link(Monitor *mon, const QDict *qdict)
> +void hmp_set_link(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *name = qdict_get_str(qdict, "name");
>      bool up = qdict_get_bool(qdict, "up");
>      Error *err = NULL;
> @@ -94,7 +96,7 @@ void hmp_set_link(Monitor *mon, const QDict *qdict)
>  }
>  
>  
> -void hmp_announce_self(Monitor *mon, const QDict *qdict)
> +void hmp_announce_self(MonitorHMP *hmp, const QDict *qdict)
>  {
>      const char *interfaces_str = qdict_get_try_str(qdict, "interfaces");
>      const char *id = qdict_get_try_str(qdict, "id");
> @@ -109,8 +111,9 @@ void hmp_announce_self(Monitor *mon, const QDict *qdict)
>      qapi_free_AnnounceParameters(params);
>  }
>  
> -void hmp_netdev_add(Monitor *mon, const QDict *qdict)
> +void hmp_netdev_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      QemuOpts *opts;
>      const char *type = qdict_get_try_str(qdict, "type");
> @@ -133,8 +136,9 @@ out:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_netdev_del(Monitor *mon, const QDict *qdict)
> +void hmp_netdev_del(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *id = qdict_get_str(qdict, "id");
>      Error *err = NULL;
>  
> diff --git a/net/slirp.c b/net/slirp.c
> index 9bf09a2c8bc9..d5c190b48b76 100644
> --- a/net/slirp.c
> +++ b/net/slirp.c
> @@ -733,8 +733,9 @@ static SlirpState *slirp_lookup(Monitor *mon, const char *id)
>      }
>  }
>  
> -void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict)
> +void hmp_hostfwd_remove(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      /* TODO: support removing unix fwd */
>      struct sockaddr_in host_addr = {
>          .sin_family = AF_INET,
> @@ -957,8 +958,9 @@ static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
>      return -1;
>  }
>  
> -void hmp_hostfwd_add(Monitor *mon, const QDict *qdict)
> +void hmp_hostfwd_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *redir_str;
>      SlirpState *s;
>      const char *arg1 = qdict_get_str(qdict, "arg1");
> @@ -1224,8 +1226,9 @@ UsernetInfoList *qmp_x_query_usernet(Error **errp)
>      return head;
>  }
>  
> -void hmp_info_usernet(Monitor *mon, const QDict *qdict)
> +void hmp_info_usernet(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      g_autoptr(UsernetInfoList) list = NULL;
>      UsernetInfoList *entry;
>  
> diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c
> index 47110ca58c0d..16847d1ce261 100644
> --- a/qom/qom-hmp-cmds.c
> +++ b/qom/qom-hmp-cmds.c
> @@ -18,8 +18,9 @@
>  #include "qom/object.h"
>  #include "qom/object_interfaces.h"
>  
> -void hmp_qom_list(Monitor *mon, const QDict *qdict)
> +void hmp_qom_list(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *path = qdict_get_try_str(qdict, "path");
>      ObjectPropertyInfoList *list;
>      Error *err = NULL;
> @@ -44,8 +45,9 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_qom_set(Monitor *mon, const QDict *qdict)
> +void hmp_qom_set(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const bool json = qdict_get_try_bool(qdict, "json", false);
>      const char *path = qdict_get_str(qdict, "path");
>      const char *property = qdict_get_str(qdict, "property");
> @@ -72,8 +74,9 @@ void hmp_qom_set(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_qom_get(Monitor *mon, const QDict *qdict)
> +void hmp_qom_get(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *path = qdict_get_str(qdict, "path");
>      const char *property = qdict_get_str(qdict, "property");
>      Error *err = NULL;
> @@ -132,8 +135,9 @@ static void print_qom_composition(Monitor *mon, Object *obj, int indent)
>      g_array_free(children, TRUE);
>  }
>  
> -void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
> +void hmp_info_qom_tree(MonitorHMP *hmp, const QDict *dict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *path = qdict_get_try_str(dict, "path");
>      Object *obj;
>      bool ambiguous = false;
> @@ -154,8 +158,9 @@ void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
>      print_qom_composition(mon, obj, 0);
>  }
>  
> -void hmp_object_add(Monitor *mon, const QDict *qdict)
> +void hmp_object_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *options = qdict_get_str(qdict, "object");
>      Error *err = NULL;
>  
> @@ -163,8 +168,9 @@ void hmp_object_add(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_object_del(Monitor *mon, const QDict *qdict)
> +void hmp_object_del(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *id = qdict_get_str(qdict, "id");
>      Error *err = NULL;
>  
> diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
> index 7b904a141654..ef69d23ff507 100644
> --- a/replay/replay-debugging.c
> +++ b/replay/replay-debugging.c
> @@ -31,8 +31,9 @@ bool replay_running_debug(void)
>      return replay_is_debugging;
>  }
>  
> -void hmp_info_replay(Monitor *mon, const QDict *qdict)
> +void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      if (replay_mode == REPLAY_MODE_NONE) {
>          monitor_printf(mon, "Record/replay is not active\n");
>      } else {
> @@ -103,7 +104,7 @@ void qmp_replay_break(int64_t icount, Error **errp)
>      }
>  }
>  
> -void hmp_replay_break(Monitor *mon, const QDict *qdict)
> +void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
>  {
>      int64_t icount = qdict_get_try_int(qdict, "icount", -1LL);
>      Error *err = NULL;
> @@ -124,7 +125,7 @@ void qmp_replay_delete_break(Error **errp)
>      }
>  }
>  
> -void hmp_replay_delete_break(Monitor *mon, const QDict *qdict)
> +void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
>  {
>      Error *err = NULL;
>  
> @@ -209,7 +210,7 @@ void qmp_replay_seek(int64_t icount, Error **errp)
>      replay_seek(icount, replay_stop_vm, errp);
>  }
>  
> -void hmp_replay_seek(Monitor *mon, const QDict *qdict)
> +void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
>  {
>      int64_t icount = qdict_get_try_int(qdict, "icount", -1LL);
>      Error *err = NULL;
> diff --git a/replay/stubs-system.c b/replay/stubs-system.c
> index f8e17dcf1ce9..15e7411591ab 100644
> --- a/replay/stubs-system.c
> +++ b/replay/stubs-system.c
> @@ -63,19 +63,19 @@ void replay_vmstate_init(void)
>  #include "qapi/error.h"
>  #include "qemu/error-report.h"
>  
> -void hmp_info_replay(Monitor *mon, const QDict *qdict)
> +void hmp_info_replay(MonitorHMP *hmp, const QDict *qdict)
>  {
>      error_report("replay support not available");
>  }
> -void hmp_replay_break(Monitor *mon, const QDict *qdict)
> +void hmp_replay_break(MonitorHMP *hmp, const QDict *qdict)
>  {
>      error_report("replay support not available");
>  }
> -void hmp_replay_delete_break(Monitor *mon, const QDict *qdict)
> +void hmp_replay_delete_break(MonitorHMP *hmp, const QDict *qdict)
>  {
>      error_report("replay support not available");
>  }
> -void hmp_replay_seek(Monitor *mon, const QDict *qdict)
> +void hmp_replay_seek(MonitorHMP *hmp, const QDict *qdict)
>  {
>      error_report("replay support not available");
>  }
> diff --git a/stats/stats-hmp-cmds.c b/stats/stats-hmp-cmds.c
> index b93b471b1b25..f280ad8c4314 100644
> --- a/stats/stats-hmp-cmds.c
> +++ b/stats/stats-hmp-cmds.c
> @@ -187,8 +187,9 @@ static StatsFilter *stats_filter(StatsTarget target, const char *names,
>      return filter;
>  }
>  
> -void hmp_info_stats(Monitor *mon, const QDict *qdict)
> +void hmp_info_stats(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *target_str = qdict_get_str(qdict, "target");
>      const char *provider_str = qdict_get_try_str(qdict, "provider");
>      const char *names = qdict_get_try_str(qdict, "names");
> diff --git a/stubs/hmp-cmd-info_sev.c b/stubs/hmp-cmd-info_sev.c
> index f3624423a334..6f2b87d1ad10 100644
> --- a/stubs/hmp-cmd-info_sev.c
> +++ b/stubs/hmp-cmd-info_sev.c
> @@ -10,7 +10,8 @@
>  #include "monitor/hmp.h"
>  #include "monitor/monitor.h"
>  
> -void hmp_info_sev(Monitor *mon, const QDict *qdict)
> +void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      monitor_printf(mon, "SEV is not available in this QEMU\n");
>  }
> diff --git a/system/dirtylimit-hmp-cmds.c b/system/dirtylimit-hmp-cmds.c
> index 4928d57cc8e3..4c100783778f 100644
> --- a/system/dirtylimit-hmp-cmds.c
> +++ b/system/dirtylimit-hmp-cmds.c
> @@ -15,8 +15,9 @@
>  #include "monitor/monitor.h"
>  #include "system/dirtylimit.h"
>  
> -void hmp_cancel_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
> +void hmp_cancel_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int64_t cpu_index = qdict_get_try_int(qdict, "cpu_index", -1);
>      Error *err = NULL;
>  
> @@ -30,8 +31,9 @@ void hmp_cancel_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
>                     "dirty limit for virtual CPU]\n");
>  }
>  
> -void hmp_set_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
> +void hmp_set_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      int64_t dirty_rate = qdict_get_int(qdict, "dirty_rate");
>      int64_t cpu_index = qdict_get_try_int(qdict, "cpu_index", -1);
>      Error *err = NULL;
> @@ -47,8 +49,9 @@ out:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_info_vcpu_dirty_limit(Monitor *mon, const QDict *qdict)
> +void hmp_info_vcpu_dirty_limit(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      DirtyLimitInfoList *info;
>      g_autoptr(DirtyLimitInfoList) head = NULL;
>      Error *err = NULL;
> diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
> index 00fed791cce1..e27b9724867a 100644
> --- a/system/qdev-monitor.c
> +++ b/system/qdev-monitor.c
> @@ -851,8 +851,9 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent, bool details)
>  }
>  #undef qdev_printf
>  
> -void hmp_info_qtree(Monitor *mon, const QDict *qdict)
> +void hmp_info_qtree(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      bool details = !qdict_get_try_bool(qdict, "brief", false);
>  
>      if (sysbus_get_default()) {
> @@ -860,7 +861,7 @@ void hmp_info_qtree(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_info_qdm(Monitor *mon, const QDict *qdict)
> +void hmp_info_qdm(MonitorHMP *hmp, const QDict *qdict)
>  {
>      qdev_print_devinfos(true);
>  }
> @@ -1001,8 +1002,9 @@ void qmp_device_sync_config(const char *id, Error **errp)
>      qdev_sync_config(dev, errp);
>  }
>  
> -void hmp_device_add(Monitor *mon, const QDict *qdict)
> +void hmp_device_add(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      QemuOpts *opts;
>      DeviceState *dev;
> @@ -1035,8 +1037,9 @@ out:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_device_del(Monitor *mon, const QDict *qdict)
> +void hmp_device_del(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *id = qdict_get_str(qdict, "id");
>      Error *err = NULL;
>  
> diff --git a/system/runstate-hmp-cmds.c b/system/runstate-hmp-cmds.c
> index 02d1d42bf392..834b95835339 100644
> --- a/system/runstate-hmp-cmds.c
> +++ b/system/runstate-hmp-cmds.c
> @@ -23,8 +23,9 @@
>  #include "qobject/qdict.h"
>  #include "qemu/accel.h"
>  
> -void hmp_info_status(Monitor *mon, const QDict *qdict)
> +void hmp_info_status(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      StatusInfo *info;
>  
>      info = qmp_query_status(NULL);
> @@ -41,8 +42,9 @@ void hmp_info_status(Monitor *mon, const QDict *qdict)
>      qapi_free_StatusInfo(info);
>  }
>  
> -void hmp_one_insn_per_tb(Monitor *mon, const QDict *qdict)
> +void hmp_one_insn_per_tb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *option = qdict_get_try_str(qdict, "option");
>      AccelState *accel = current_accel();
>      bool newval;
> @@ -66,8 +68,9 @@ void hmp_one_insn_per_tb(Monitor *mon, const QDict *qdict)
>                               newval, &error_abort);
>  }
>  
> -void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
> +void hmp_watchdog_action(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      WatchdogAction action;
>      char *qapi_value;
> diff --git a/system/tpm-hmp-cmds.c b/system/tpm-hmp-cmds.c
> index 9ed6ad6c4d46..094c3f16cf50 100644
> --- a/system/tpm-hmp-cmds.c
> +++ b/system/tpm-hmp-cmds.c
> @@ -11,8 +11,9 @@
>  #include "monitor/hmp.h"
>  #include "qapi/error.h"
>  
> -void hmp_info_tpm(Monitor *mon, const QDict *qdict)
> +void hmp_info_tpm(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>  #ifdef CONFIG_TPM
>      TPMInfoList *info_list, *info;
>      Error *err = NULL;
> diff --git a/target/i386/cpu-apic.c b/target/i386/cpu-apic.c
> index 04b7257ad120..2cb3147837d1 100644
> --- a/target/i386/cpu-apic.c
> +++ b/target/i386/cpu-apic.c
> @@ -80,8 +80,9 @@ void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
>       }
>  }
>  
> -void hmp_info_local_apic(Monitor *mon, const QDict *qdict)
> +void hmp_info_local_apic(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUState *cs;
>  
>      if (qdict_haskey(qdict, "apic-id")) {
> diff --git a/target/i386/monitor.c b/target/i386/monitor.c
> index 9ed772e6d7f2..f1d2a327ddad 100644
> --- a/target/i386/monitor.c
> +++ b/target/i386/monitor.c
> @@ -209,8 +209,9 @@ static void tlb_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
>  }
>  #endif /* TARGET_X86_64 */
>  
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict)
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env;
>      AddressSpace *as;
>  
> @@ -535,8 +536,9 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
>  }
>  #endif /* TARGET_X86_64 */
>  
> -void hmp_info_mem(Monitor *mon, const QDict *qdict)
> +void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env;
>      AddressSpace *as;
>  
> @@ -569,8 +571,9 @@ void hmp_info_mem(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_mce(Monitor *mon, const QDict *qdict)
> +void hmp_mce(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      X86CPU *cpu;
>      CPUState *cs;
>      int cpu_index = qdict_get_int(qdict, "cpu_index");
> diff --git a/target/i386/sev.c b/target/i386/sev.c
> index d7dcefc8ecf5..4473d02981ff 100644
> --- a/target/i386/sev.c
> +++ b/target/i386/sev.c
> @@ -754,8 +754,9 @@ SevInfo *qmp_query_sev(Error **errp)
>      return info;
>  }
>  
> -void hmp_info_sev(Monitor *mon, const QDict *qdict)
> +void hmp_info_sev(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      SevInfo *info = sev_get_info();
>  
>      if (!info || !info->enabled) {
> diff --git a/target/m68k/monitor.c b/target/m68k/monitor.c
> index 3e0df40a6b8b..0414474f2ffb 100644
> --- a/target/m68k/monitor.c
> +++ b/target/m68k/monitor.c
> @@ -10,8 +10,9 @@
>  #include "monitor/hmp.h"
>  #include "monitor/monitor.h"
>  
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict)
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env1 = mon_get_cpu_env(mon);
>  
>      if (!env1) {
> diff --git a/target/ppc/monitor.c b/target/ppc/monitor.c
> index 7c88e0e2bda0..99eda7351877 100644
> --- a/target/ppc/monitor.c
> +++ b/target/ppc/monitor.c
> @@ -11,8 +11,9 @@
>  #include "monitor/hmp.h"
>  #include "cpu.h"
>  
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict)
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env1 = mon_get_cpu_env(mon);
>  
>      if (!env1) {
> diff --git a/target/riscv/monitor.c b/target/riscv/monitor.c
> index f8042db9cdf3..496d519c978d 100644
> --- a/target/riscv/monitor.c
> +++ b/target/riscv/monitor.c
> @@ -215,8 +215,9 @@ static void mem_info_svxx(Monitor *mon, CPUArchState *env)
>                last_paddr + last_size - pbase, last_attr);
>  }
>  
> -void hmp_info_mem(Monitor *mon, const QDict *qdict)
> +void hmp_info_mem(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env;
>  
>      env = mon_get_cpu_env(mon);
> diff --git a/target/sh4/monitor.c b/target/sh4/monitor.c
> index 50324d3600c4..50da650b2e04 100644
> --- a/target/sh4/monitor.c
> +++ b/target/sh4/monitor.c
> @@ -38,8 +38,9 @@ static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
>                     tlb->d, tlb->wt);
>  }
>  
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict)
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env = mon_get_cpu_env(mon);
>      int i;
>  
> diff --git a/target/sparc/monitor.c b/target/sparc/monitor.c
> index 36f3d8d58e9d..09a15b821a1a 100644
> --- a/target/sparc/monitor.c
> +++ b/target/sparc/monitor.c
> @@ -27,8 +27,9 @@
>  #include "monitor/hmp.h"
>  
>  
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict)
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env1 = mon_get_cpu_env(mon);
>  
>      if (!env1) {
> diff --git a/target/xtensa/monitor.c b/target/xtensa/monitor.c
> index 2af84934f83d..a1082c44e11c 100644
> --- a/target/xtensa/monitor.c
> +++ b/target/xtensa/monitor.c
> @@ -26,8 +26,9 @@
>  #include "monitor/monitor.h"
>  #include "monitor/hmp.h"
>  
> -void hmp_info_tlb(Monitor *mon, const QDict *qdict)
> +void hmp_info_tlb(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      CPUArchState *env1 = mon_get_cpu_env(mon);
>  
>      if (!env1) {
> diff --git a/trace/trace-hmp-cmds.c b/trace/trace-hmp-cmds.c
> index c8f0133abecf..5a8158f4f4b6 100644
> --- a/trace/trace-hmp-cmds.c
> +++ b/trace/trace-hmp-cmds.c
> @@ -33,7 +33,7 @@
>  #include "trace/simple.h"
>  #endif
>  
> -void hmp_trace_event(Monitor *mon, const QDict *qdict)
> +void hmp_trace_event(MonitorHMP *hmp, const QDict *qdict)
>  {
>      const char *tp_name = qdict_get_str(qdict, "name");
>      bool new_state = qdict_get_bool(qdict, "option");
> @@ -47,8 +47,9 @@ void hmp_trace_event(Monitor *mon, const QDict *qdict)
>  }
>  
>  #ifdef CONFIG_TRACE_SIMPLE
> -void hmp_trace_file(Monitor *mon, const QDict *qdict)
> +void hmp_trace_file(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *op = qdict_get_try_str(qdict, "op");
>      const char *arg = qdict_get_try_str(qdict, "arg");
>  
> @@ -71,8 +72,9 @@ void hmp_trace_file(Monitor *mon, const QDict *qdict)
>  }
>  #endif
>  
> -void hmp_info_trace_events(Monitor *mon, const QDict *qdict)
> +void hmp_info_trace_events(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *name = qdict_get_try_str(qdict, "name");
>      TraceEventInfoList *events;
>      TraceEventInfoList *elem;
> diff --git a/ui/ui-hmp-cmds.c b/ui/ui-hmp-cmds.c
> index 4ef459490ba2..5f3522943c56 100644
> --- a/ui/ui-hmp-cmds.c
> +++ b/ui/ui-hmp-cmds.c
> @@ -29,7 +29,7 @@
>  
>  static int mouse_button_state;
>  
> -void hmp_mouse_move(Monitor *mon, const QDict *qdict)
> +void hmp_mouse_move(MonitorHMP *hmp, const QDict *qdict)
>  {
>      int dx, dy, dz, button;
>      const char *dx_str = qdict_get_str(qdict, "dx_str");
> @@ -53,7 +53,7 @@ void hmp_mouse_move(Monitor *mon, const QDict *qdict)
>      qemu_input_event_sync();
>  }
>  
> -void hmp_mouse_button(Monitor *mon, const QDict *qdict)
> +void hmp_mouse_button(MonitorHMP *hmp, const QDict *qdict)
>  {
>      /* HMP mouse_button bitmask: 1=L, 2=R, 4=M */
>      static uint32_t bmap[INPUT_BUTTON__MAX] = {
> @@ -71,16 +71,18 @@ void hmp_mouse_button(Monitor *mon, const QDict *qdict)
>      mouse_button_state = button_state;
>  }
>  
> -void hmp_mouse_set(Monitor *mon, const QDict *qdict)
> +void hmp_mouse_set(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>  
>      qemu_mouse_set(qdict_get_int(qdict, "index"), &err);
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_info_mice(Monitor *mon, const QDict *qdict)
> +void hmp_info_mice(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      MouseInfoList *mice_list, *mouse;
>  
>      mice_list = qmp_query_mice(NULL);
> @@ -148,8 +150,9 @@ static void hmp_info_vnc_servers(Monitor *mon, VncServerInfo2List *server)
>      }
>  }
>  
> -void hmp_info_vnc(Monitor *mon, const QDict *qdict)
> +void hmp_info_vnc(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      VncInfo2List *info2l, *info2l_head;
>      Error *err = NULL;
>  
> @@ -189,8 +192,9 @@ void hmp_info_vnc(Monitor *mon, const QDict *qdict)
>  #endif
>  
>  #ifdef CONFIG_SPICE
> -void hmp_info_spice(Monitor *mon, const QDict *qdict)
> +void hmp_info_spice(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      SpiceChannelList *chan;
>      SpiceInfo *info;
>      const char *channel_name;
> @@ -260,8 +264,9 @@ out:
>  }
>  #endif
>  
> -void hmp_set_password(Monitor *mon, const QDict *qdict)
> +void hmp_set_password(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *protocol  = qdict_get_str(qdict, "protocol");
>      const char *password  = qdict_get_str(qdict, "password");
>      const char *display = qdict_get_try_str(qdict, "display");
> @@ -295,8 +300,9 @@ out:
>      hmp_handle_error(mon, err);
>  }
>  
> -void hmp_expire_password(Monitor *mon, const QDict *qdict)
> +void hmp_expire_password(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *protocol  = qdict_get_str(qdict, "protocol");
>      const char *whenstr = qdict_get_str(qdict, "time");
>      const char *display = qdict_get_try_str(qdict, "display");
> @@ -366,8 +372,9 @@ static int index_from_key(const char *key, size_t key_length)
>      return i;
>  }
>  
> -void hmp_sendkey(Monitor *mon, const QDict *qdict)
> +void hmp_sendkey(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *keys = qdict_get_str(qdict, "keys");
>      KeyValue *v = NULL;
>      KeyValueList *head = NULL, **tail = &head;
> @@ -456,8 +463,9 @@ void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
>  
>  #ifdef CONFIG_PIXMAN
>  void coroutine_fn
> -hmp_screendump(Monitor *mon, const QDict *qdict)
> +hmp_screendump(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      const char *filename = qdict_get_str(qdict, "filename");
>      const char *id = qdict_get_try_str(qdict, "device");
>      int64_t head = qdict_get_try_int(qdict, "head", 0);
> @@ -478,8 +486,9 @@ end:
>  }
>  #endif
>  
> -void hmp_client_migrate_info(Monitor *mon, const QDict *qdict)
> +void hmp_client_migrate_info(MonitorHMP *hmp, const QDict *qdict)
>  {
> +    Monitor *mon = MONITOR(hmp);
>      Error *err = NULL;
>      const char *protocol = qdict_get_str(qdict, "protocol");
>      const char *hostname = qdict_get_str(qdict, "hostname");
> 
> -- 
> 2.55.0.543.g5ebe2ebe4ea8
> 
-- 
 -----Open up your eyes, open up your mind, open up your code -------   
/ Dr. David Alan Gilbert    |       Running GNU/Linux       | Happy  \ 
\        dave @ treblig.org |                               | In Hex /
 \ _________________________|_____ http://www.treblig.org   |_______/

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP
  2026-08-16 21:51   ` Dr. David Alan Gilbert
@ 2026-08-17 18:08     ` Jason J. Herne
  0 siblings, 0 replies; 8+ messages in thread
From: Jason J. Herne @ 2026-08-17 18:08 UTC (permalink / raw)
  To: Dr. David Alan Gilbert, Marc-André Lureau
  Cc: qemu-devel, Philippe Mathieu-Daudé, Daniel P. Berrangé,
	Markus Armbruster, Gerd Hoffmann, Gonglei (Arei), zhenwei pi,
	Kevin Wolf, Hanna Reitz, Paolo Bonzini, Ani Sinha,
	David Woodhouse, Paul Durrant, Michael S. Tsirkin,
	Richard Henderson, Marcelo Tosatti, Mark Cave-Ayland, Jiri Pirko,
	Jason Wang, Halil Pasic, Christian Borntraeger, Ilya Leoshkevich,
	David Hildenbrand, Eric Farman, Matthew Rosato, Cornelia Huck,
	Samuel Thibault, Hyman Huang, Peter Xu, Fabiano Rosas,
	Alex Bennée, Stefan Berger, Zhao Liu, Laurent Vivier,
	Nicholas Piggin, Chinmay Rath, Glenn Miles, Harsh Prateek Bora,
	Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Yoshinori Sato,
	Artyom Tarasenko, Max Filippov, Stefan Hajnoczi, qemu-block, kvm,
	qemu-ppc, qemu-s390x, qemu-riscv

On 8/16/26 5:51 PM, Dr. David Alan Gilbert wrote:
> * Marc-André Lureau (marcandre.lureau@redhat.com) wrote:
>> HMP commands are specific to the HMP monitor, so make the cmd function
>> pointer in HMPCommand take MonitorHMP * instead of Monitor *. This
>> strengthens type safety and makes the HMP-specific nature of these
>> handlers explicit.
>>
>> Handler functions are renamed to take MonitorHMP *hmp, with a local
>> Monitor *mon = MONITOR(hmp) added where the body needs the base type.
>> Following patches will drop it, since most functions are HMP specific.
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
> 
>> ---
>> ...
>>   hw/s390x/s390-skeys.c           |   5 +-
>>   hw/s390x/s390-stattrib.c        |   6 +-
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 37/49] monitor: tighten monitor_printf*()
  2026-08-16 19:13 ` [PATCH v3 37/49] monitor: tighten monitor_printf*() Marc-André Lureau
@ 2026-08-17 18:09   ` Jason J. Herne
  0 siblings, 0 replies; 8+ messages in thread
From: Jason J. Herne @ 2026-08-17 18:09 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Philippe Mathieu-Daudé, Daniel P. Berrangé,
	Markus Armbruster, Gerd Hoffmann, Gonglei (Arei), zhenwei pi,
	Kevin Wolf, Hanna Reitz, Paolo Bonzini, Alex Bennée,
	Pierrick Bouvier, Ani Sinha, Laurent Vivier, Amit Shah,
	Michael S. Tsirkin, Brian Cain, David Woodhouse, Paul Durrant,
	Richard Henderson, Marcelo Tosatti, Mark Cave-Ayland, Jiri Pirko,
	Jason Wang, Halil Pasic, Christian Borntraeger, Cornelia Huck,
	Eric Farman, Matthew Rosato, Ilya Leoshkevich, David Hildenbrand,
	Stefano Stabellini, Anthony PERARD, Edgar E. Iglesias,
	Dr. David Alan Gilbert, Hyman Huang, Peter Xu, Fabiano Rosas,
	Samuel Thibault, Stefan Berger, Zhao Liu, Nicholas Piggin,
	Chinmay Rath, Glenn Miles, Harsh Prateek Bora, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, Daniel Henrique Barboza, Liu Zhiwei,
	Chao Liu, Yoshinori Sato, Artyom Tarasenko, Max Filippov,
	Stefan Hajnoczi, qemu-block, kvm, qemu-ppc, qemu-s390x, xen-devel,
	qemu-riscv



On 8/16/26 3:13 PM, Marc-André Lureau wrote:
> Rename monitor_printf->monitor_hmp_printf, monitor_vprintf->
> monitor_hmp_vprintf, and monitor_printc->monitor_hmp_printc, changing
> the first parameter from Monitor * to MonitorHMP * to enforce type
> safety. The implementation is also simplified: monitor_hmp_vprintf now
> directly calls g_strdup_vprintf + monitor_puts, removing the virtual
> dispatch via moncls->vprintf.
> 
> The dev_print() callbacks are temporarily using the MONITOR_HMP(mon)
> cast, they are fixed in the following commits.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> ...
>   hw/pci/pci-stub.c                       |   3 +-
>   hw/s390x/s390-skeys.c                   |   9 +-
>   hw/s390x/s390-stattrib.c                |  20 +--
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 41/49] Guard HMP command implementations with CONFIG_HMP
  2026-08-16 19:13 ` [PATCH v3 41/49] Guard HMP command implementations with CONFIG_HMP Marc-André Lureau
@ 2026-08-17 18:11   ` Jason J. Herne
  0 siblings, 0 replies; 8+ messages in thread
From: Jason J. Herne @ 2026-08-17 18:11 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Philippe Mathieu-Daudé, Daniel P. Berrangé,
	Markus Armbruster, Richard Henderson, Paolo Bonzini,
	David Woodhouse, Paul Durrant, Michael S. Tsirkin,
	Marcelo Tosatti, Mark Cave-Ayland, Halil Pasic,
	Christian Borntraeger, Eric Farman, Matthew Rosato,
	Ilya Leoshkevich, David Hildenbrand, Cornelia Huck, Gerd Hoffmann,
	Hyman Huang, Peter Xu, Fabiano Rosas, Dr. David Alan Gilbert,
	Samuel Thibault, Jason Wang, Alex Bennée, Zhao Liu,
	Laurent Vivier, Nicholas Piggin, Chinmay Rath, Glenn Miles,
	Harsh Prateek Bora, Palmer Dabbelt, Alistair Francis, Weiwei Li,
	Daniel Henrique Barboza, Liu Zhiwei, Chao Liu, Yoshinori Sato,
	Artyom Tarasenko, Max Filippov, kvm, qemu-ppc, qemu-s390x,
	qemu-riscv



On 8/16/26 3:13 PM, Marc-André Lureau wrote:
> Add #ifdef CONFIG_HMP around all hmp_* function implementations and
> their HMP-only helpers across subsystems.
> 
> This covers monitor_register_hmp* callers, hmp_info_* handlers, and
> HMP-only helper functions like slirp_lookup.
> 
> To link succesfully, use empty cmds tables in hmp-cmds.c (to be removed
> once meson build-sys is updated with !hmp support later in the series)
> 
> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> ...
>   hw/s390x/s390-skeys.c     | 2 ++
>   hw/s390x/s390-stattrib.c  | 4 ++++
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-08-18 12:37 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20260816-qemu-no-hmp-v3-0-e53fc35bc550@redhat.com>
2026-08-16 19:12 ` [PATCH v3 04/49] target/i386: decouple cpu_x86_inject_mce() from Monitor Marc-André Lureau
2026-08-16 19:12 ` [PATCH v3 31/49] monitor: change HMPCommand cmd to take MonitorHMP Marc-André Lureau
2026-08-16 21:51   ` Dr. David Alan Gilbert
2026-08-17 18:08     ` Jason J. Herne
2026-08-16 19:13 ` [PATCH v3 37/49] monitor: tighten monitor_printf*() Marc-André Lureau
2026-08-17 18:09   ` Jason J. Herne
2026-08-16 19:13 ` [PATCH v3 41/49] Guard HMP command implementations with CONFIG_HMP Marc-André Lureau
2026-08-17 18:11   ` Jason J. Herne

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox