@samitouri / QOSamiQemu / commits / 7e3ce81383

monitor: pass chardev ID into monitor constructor instead of object

Current the monitor_new_hmp/monitor_new_qmp constructors accept a Chardev object pointer. To facilitate the next commit which will introduce a QOM property for the character device ID, switch to accepting an chardev ID in the constructor. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-ID: <20260706135824.2623960-7-berrange@redhat.com> Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Daniel P. Berrangé committed Jul 6, 2026 at 14:57 UTC 7e3ce813830502bb944e2b90f0ce6d3c4b43d644
7 files changed +39 -26
chardev/char.c
+2 -1
@@ -804,8 +804,9 @@ static Chardev *qemu_chr_new_from_name(const char *label, const char *filename,
804 }
805
806 if (qemu_opt_get_bool(opts, "mux", 0)) {
807 + const char *chardev_id = qemu_opts_id(opts);
808 assert(permit_mux_mon);
808 - monitor_new_hmp(NULL, chr, true, &err);
809 + monitor_new_hmp(NULL, chardev_id, true, &err);
810 if (err) {
811 error_report_err(err);
812 object_unparent(OBJECT(chr));
gdbstub/system.c
+1 -1
@@ -390,7 +390,7 @@ bool gdbserver_start(const char *device, Error **errp)
390 /* Initialize a monitor terminal for gdb */
391 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
392 NULL, NULL, &error_abort);
393 - monitor_new_hmp(NULL, mon_chr, false, &error_abort);
393 + monitor_new_hmp(NULL, mon_chr->label, false, &error_abort);
394 } else {
395 qemu_chr_fe_deinit(&gdbserver_system_state.chr, true);
396 mon_chr = gdbserver_system_state.mon_chr;
include/monitor/monitor.h
+2 -2
@@ -29,9 +29,9 @@ bool monitor_cur_is_qmp(void);
29 void monitor_init_globals(void);
30 void monitor_init_globals_core(void);
31 char *monitor_compat_id(void);
32 -void monitor_new_qmp(const char *id, Chardev *chr,
32 +void monitor_new_qmp(const char *id, const char *chardev_id,
33 bool pretty, Error **errp);
34 -void monitor_new_hmp(const char *id, Chardev *chr,
34 +void monitor_new_hmp(const char *id, const char *chardev_id,
35 bool use_readline, Error **errp);
36 int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp);
37 int monitor_new_opts(QemuOpts *opts, Error **errp);
monitor/hmp.c
+16 -6
@@ -39,6 +39,7 @@
39 #include "qemu/base-arch-defs.h"
40 #include "qemu/target-info.h"
41 #include "qemu/units.h"
42 +#include "qapi/error.h"
43 #include "exec/gdbstub.h"
44 #include "system/block-backend.h"
45 #include "trace.h"
@@ -1538,16 +1539,25 @@ static void monitor_readline_flush(void *opaque)
1539 monitor_flush(&mon->parent_obj);
1540 }
1541
1541 -void monitor_new_hmp(const char *id, Chardev *chr,
1542 +void monitor_new_hmp(const char *id, const char *chardev_id,
1543 bool use_readline, Error **errp)
1544 {
1545 MonitorHMP *mon;
1546 g_autofree char *autoid = id ? NULL : monitor_compat_id();
1546 - Object *obj = object_new_with_props(TYPE_MONITOR_HMP,
1547 - object_get_objects_root(),
1548 - id ? id : autoid,
1549 - errp,
1550 - NULL);
1547 + Chardev *chr;
1548 + Object *obj;
1549 +
1550 + chr = qemu_chr_find(chardev_id);
1551 + if (chr == NULL) {
1552 + error_setg(errp, "chardev \"%s\" not found", chardev_id);
1553 + return;
1554 + }
1555 +
1556 + obj = object_new_with_props(TYPE_MONITOR_HMP,
1557 + object_get_objects_root(),
1558 + id ? id : autoid,
1559 + errp,
1560 + NULL);
1561 if (!obj) {
1562 return;
1563 }
monitor/monitor.c
+2 -9
@@ -741,13 +741,6 @@ char *monitor_compat_id(void)
741 int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp)
742 {
743 ERRP_GUARD();
744 - Chardev *chr;
745 -
746 - chr = qemu_chr_find(opts->chardev);
747 - if (chr == NULL) {
748 - error_setg(errp, "chardev \"%s\" not found", opts->chardev);
749 - return -1;
750 - }
744
745 if (!opts->has_mode) {
746 opts->mode = allow_hmp ? MONITOR_MODE_READLINE : MONITOR_MODE_CONTROL;
@@ -755,7 +748,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp)
748
749 switch (opts->mode) {
750 case MONITOR_MODE_CONTROL:
758 - monitor_new_qmp(opts->id, chr, opts->pretty, errp);
751 + monitor_new_qmp(opts->id, opts->chardev, opts->pretty, errp);
752 break;
753 case MONITOR_MODE_READLINE:
754 if (!allow_hmp) {
@@ -766,7 +759,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp)
759 error_setg(errp, "'pretty' is not compatible with HMP monitors");
760 return -1;
761 }
769 - monitor_new_hmp(opts->id, chr, true, errp);
762 + monitor_new_hmp(opts->id, opts->chardev, true, errp);
763 break;
764 default:
765 g_assert_not_reached();
monitor/qmp.c
+15 -6
@@ -527,16 +527,25 @@ static void monitor_qmp_setup_handlers_bh(void *opaque)
527 monitor_list_append(&mon->parent_obj);
528 }
529
530 -void monitor_new_qmp(const char *id, Chardev *chr,
530 +void monitor_new_qmp(const char *id, const char *chardev_id,
531 bool pretty, Error **errp)
532 {
533 MonitorQMP *mon;
534 g_autofree char *autoid = id ? NULL : monitor_compat_id();
535 - Object *obj = object_new_with_props(TYPE_MONITOR_QMP,
536 - object_get_objects_root(),
537 - id ? id : autoid,
538 - errp,
539 - NULL);
535 + Chardev *chr;
536 + Object *obj;
537 +
538 + chr = qemu_chr_find(chardev_id);
539 + if (chr == NULL) {
540 + error_setg(errp, "chardev \"%s\" not found", chardev_id);
541 + return;
542 + }
543 +
544 + obj = object_new_with_props(TYPE_MONITOR_QMP,
545 + object_get_objects_root(),
546 + id ? id : autoid,
547 + errp,
548 + NULL);
549 if (!obj) {
550 return;
551 }
stubs/monitor-internal.c
+1 -1
@@ -8,7 +8,7 @@ int monitor_get_fd(Monitor *mon, const char *name, Error **errp)
8 return -1;
9 }
10
11 -void monitor_new_hmp(const char *id, Chardev *chr,
11 +void monitor_new_hmp(const char *id, const char *chardev_id,
12 bool use_readline, Error **errp)
13 {
14 }