I have provided a qmp interface for getting the list of qdevified devices that have been registered with SaveVMHandlers.
Signed-off-by: Sanidhya Kashyap <sanidhya.ii...@gmail.com> --- qapi-schema.json | 22 ++++++++++++++++++++++ qmp-commands.hx | 25 +++++++++++++++++++++++++ savevm.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/qapi-schema.json b/qapi-schema.json index b11aad2..996e6b5 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3480,3 +3480,25 @@ # Since: 2.1 ## { 'command': 'rtc-reset-reinjection' } + +## +# @VMstatesQdevDevices +# +# list of qdevified devices that are registered with SaveStateEntry +# +# @device: list of qdevified device names +# +# Since 2.2 +## +{ 'type': 'VMStatesQdevDevices', + 'data': { 'device': ['str'] } } + +## +# @query-qdev-devices +# +# returns the VMStatesQdevDevices that have the associated value +# +# Since 2.2 +## +{ 'command': 'query-qdev-devices', + 'returns': 'VMStatesQdevDevices' } diff --git a/qmp-commands.hx b/qmp-commands.hx index 4be4765..2e20032 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -3755,3 +3755,28 @@ Example: <- { "return": {} } EQMP + + { + .name = "query-qdev-devices", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_query_qdev_devices, + }, + +SQMP +query-qdev-devices +------------------ + +Shows registered Qdevified devices + + +Example (1): + +-> { "execute": "query-qdev-devices" } +<- { "return": [ + { + "devices": [ "kvm-tpr-opt", "piix4_pm" ] + } + ] + } + +EQMP diff --git a/savevm.c b/savevm.c index 0255fa0..7c1600a 100644 --- a/savevm.c +++ b/savevm.c @@ -1167,6 +1167,40 @@ void do_savevm(Monitor *mon, const QDict *qdict) } } +static strList *create_qdev_list(const char *name, strList *list) +{ + strList *temp_list; + int len; + + if (!list) { + list = g_malloc0(sizeof(strList)); + len = strlen(name); + list->value = g_malloc0(sizeof(char)*(len+1)); + strcpy(list->value, name); + list->next = NULL; + return list; + } + temp_list = g_malloc0(sizeof(strList)); + len = strlen(name); + temp_list->value = g_malloc0(sizeof(char)*(len+1)); + strcpy(temp_list->value, name); + temp_list->next = list; + list = temp_list; + return list; +} + +VMStatesQdevDevices *qmp_query_qdev_devices(Error **errp) +{ + VMStatesQdevResetEntry *qre; + VMStatesQdevDevices *qdev_devices = g_malloc0(sizeof(VMStatesQdevDevices)); + + QTAILQ_FOREACH(qre, &vmstate_reset_handlers, entry) { + qdev_devices->device = create_qdev_list(qre->device_name, + qdev_devices->device); + } + return qdev_devices; +} + void qmp_xen_save_devices_state(const char *filename, Error **errp) { QEMUFile *f; -- 1.9.3