Tested-by: Jim Shu On Thu, May 19, 2022 at 11:37 PM Damien Hedde wrote: > From: Mirela Grujic > > This commit allows to use the QMP command to add a cold-plugged > device like we can do with the CLI option -device. > > Note: for device_add command in qdev.json adding the 'allow-preconfig' > option has no effect because the command appears to bypass QAPI (see > TODO at qapi/qdev.json:61). The option is added there solely to > document the intent. > For the same reason, the flags have to be explicitly set in > monitor_init_qmp_commands() when the device_add command is registered. > > Signed-off-by: Mirela Grujic > Signed-off-by: Damien Hedde > --- > > v4: > + use phase_until() > + add missing flag in hmp-commands.hx > --- > qapi/qdev.json | 3 ++- > monitor/misc.c | 2 +- > softmmu/qdev-monitor.c | 4 ++++ > hmp-commands.hx | 1 + > 4 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/qapi/qdev.json b/qapi/qdev.json > index 26cd10106b..2e2de41499 100644 > --- a/qapi/qdev.json > +++ b/qapi/qdev.json > @@ -77,7 +77,8 @@ > { 'command': 'device_add', > 'data': {'driver': 'str', '*bus': 'str', '*id': 'str'}, > 'gen': false, # so we can get the additional arguments > - 'features': ['json-cli', 'json-cli-hotplug'] } > + 'features': ['json-cli', 'json-cli-hotplug'], > + 'allow-preconfig': true } > > ## > # @device_del: > diff --git a/monitor/misc.c b/monitor/misc.c > index 6c5bb82d3b..d3d413d70c 100644 > --- a/monitor/misc.c > +++ b/monitor/misc.c > @@ -233,7 +233,7 @@ static void monitor_init_qmp_commands(void) > qmp_init_marshal(&qmp_commands); > > qmp_register_command(&qmp_commands, "device_add", > - qmp_device_add, 0, 0); > + qmp_device_add, QCO_ALLOW_PRECONFIG, 0); > > QTAILQ_INIT(&qmp_cap_negotiation_commands); > qmp_register_command(&qmp_cap_negotiation_commands, > "qmp_capabilities", > diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c > index 7cbee2b0d8..c53f62be51 100644 > --- a/softmmu/qdev-monitor.c > +++ b/softmmu/qdev-monitor.c > @@ -855,6 +855,10 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, > Error **errp) > QemuOpts *opts; > DeviceState *dev; > > + if (!phase_until(PHASE_MACHINE_INITIALIZED, errp)) { > + return; > + } > + > opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, errp); > if (!opts) { > return; > diff --git a/hmp-commands.hx b/hmp-commands.hx > index 03e6a73d1f..0091b8e2dd 100644 > --- a/hmp-commands.hx > +++ b/hmp-commands.hx > @@ -672,6 +672,7 @@ ERST > .help = "add device, like -device on the command line", > .cmd = hmp_device_add, > .command_completion = device_add_completion, > + .flags = "p", > }, > > SRST > -- > 2.36.1 > > >