@samitouri / QOSamiQemu / commits / 7c2ecb4e5e

system: guard HMP initialization paths with CONFIG_HMP

- disable default monitor when HMP is not available - hide 'readline' from -mon help text - error out on mux chardev monitor when no HMP - skip HMP monitor terminal for gdb, return E01 for 'qRcmd' remote commands Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <20260828-qemu-no-hmp-v5-28-9227de146347@redhat.com>

Marc-André Lureau committed Aug 28, 2026 at 16:04 UTC 7c2ecb4e5e0353ddacd08ce2ffdda355bb95e189
4 files changed +22 -3
chardev/char.c
+8 -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);
807 assert(permit_mux_mon);
808 +#ifdef CONFIG_HMP
809 + const char *chardev_id = qemu_opts_id(opts);
810 monitor_new_hmp(NULL, chardev_id, true, &err);
811 if (err) {
812 error_report_err(err);
@@ -813,6 +814,12 @@ static Chardev *qemu_chr_new_from_name(const char *label, const char *filename,
814 chr = NULL;
815 goto out;
816 }
817 +#else
818 + error_report("HMP monitor is disabled");
819 + object_unparent(OBJECT(chr));
820 + chr = NULL;
821 + goto out;
822 +#endif
823 }
824
825 out:
gdbstub/system.c
+8
@@ -387,10 +387,14 @@ bool gdbserver_start(const char *device, Error **errp)
387
388 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
389
390 +#ifdef CONFIG_HMP
391 /* Initialize a monitor terminal for gdb */
392 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
393 NULL, NULL, &error_abort);
394 monitor_new_hmp(NULL, mon_chr->label, false, &error_abort);
395 +#else
396 + mon_chr = NULL;
397 +#endif
398 } else {
399 qemu_chr_fe_deinit(&gdbserver_system_state.chr, true);
400 mon_chr = gdbserver_system_state.mon_chr;
@@ -524,10 +528,14 @@ void gdb_handle_query_rcmd(GArray *params, void *ctx)
528 len = len / 2;
529 gdb_hextomem(gdbserver_state.mem_buf, gdb_get_cmd_param(params, 0)->data, len);
530 g_byte_array_append(gdbserver_state.mem_buf, &zero, 1);
531 +#ifdef CONFIG_HMP
532 qemu_chr_be_write(gdbserver_system_state.mon_chr,
533 gdbserver_state.mem_buf->data,
534 gdbserver_state.mem_buf->len);
535 gdb_put_packet("OK");
536 +#else
537 + gdb_put_packet("E01");
538 +#endif
539 }
540
541 /*
qemu-options.hx
+5 -1
@@ -4993,7 +4993,11 @@ SRST
4993 ERST
4994
4995 DEF("mon", HAS_ARG, QEMU_OPTION_mon, \
4996 - "-mon [chardev=]name[,mode=readline|control][,pretty=on|off]\n", QEMU_ARCH_ALL)
4996 + "-mon [chardev=]name[,mode="
4997 +#ifdef CONFIG_HMP
4998 + "readline|"
4999 +#endif
5000 + "control][,pretty=on|off]\n", QEMU_ARCH_ALL)
5001 SRST
5002 ``-mon [chardev=]name[,mode=readline|control][,pretty=on|off]``
5003 Set up a monitor connected to the chardev ``name``.
system/vl.c
+1 -1
@@ -199,7 +199,7 @@ static int has_defaults = 1;
199 static int default_audio = 1;
200 static int default_serial = 1;
201 static int default_parallel = 1;
202 -static int default_monitor = 1;
202 +static int default_monitor = IS_ENABLED(CONFIG_HMP);
203 static int default_floppy = 1;
204 static int default_cdrom = 1;
205 static bool auto_create_sdcard = true;