From: Mirela Grujic <mirela.gru...@greensocs.com> The command returns current machine initialization phase. >From now on, the MachineInitPhase enum is generated from the QAPI schema.
Signed-off-by: Mirela Grujic <mirela.gru...@greensocs.com> Signed-off-by: Damien Hedde <damien.he...@greensocs.com> Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com> --- v3: + add 'unstable' feature + bump to version 7.0 --- qapi/machine.json | 60 ++++++++++++++++++++++++++++++++++++++ include/hw/qdev-core.h | 30 ++----------------- hw/core/machine-qmp-cmds.c | 9 ++++++ hw/core/qdev.c | 5 ++++ 4 files changed, 76 insertions(+), 28 deletions(-) diff --git a/qapi/machine.json b/qapi/machine.json index 067e3f5378..8e9a8afb1d 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -1557,3 +1557,63 @@ { 'command': 'x-query-usb', 'returns': 'HumanReadableText', 'features': [ 'unstable' ] } + +## +# @MachineInitPhase: +# +# Enumeration of machine initialization phases. +# +# @no-machine: machine does not exist +# +# @machine-created: machine is created, but its accelerator is not +# +# @accel-created: accelerator is created, but the machine properties have not +# been validated and machine initialization is not done yet +# +# @initialized: machine is initialized, thus creating any embedded devices and +# validating machine properties. Devices created at this time are +# considered to be cold-plugged. +# +# @ready: QEMU is ready to start CPUs and devices created at this time are +# considered to be hot-plugged. The monitor is not restricted to +# "preconfig" commands. +# +# Since: 7.0 +## +{ 'enum': 'MachineInitPhase', + 'data': [ 'no-machine', 'machine-created', 'accel-created', 'initialized', + 'ready' ] } + +## +# @MachineInitPhaseStatus: +# +# Information about machine initialization phase +# +# @phase: the machine initialization phase +# +# Since: 7.0 +## +{ 'struct': 'MachineInitPhaseStatus', + 'data': { 'phase': 'MachineInitPhase' } } + +## +# @query-machine-phase: +# +# Return machine initialization phase +# +# Features: +# @unstable: This command is part of the experimental preconfig mode. +# +# Since: 7.0 +# +# Returns: MachineInitPhaseStatus +# +# Example: +# +# -> { "execute": "query-machine-phase" } +# <- { "return": { "phase": "initialized" } } +# +## +{ 'command': 'query-machine-phase', 'returns': 'MachineInitPhaseStatus', + 'features' : ['unstable'], + 'allow-preconfig': true } diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index ef2d612d39..ac856821ab 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -1,6 +1,7 @@ #ifndef QDEV_CORE_H #define QDEV_CORE_H +#include "qapi/qapi-types-machine.h" #include "qemu/queue.h" #include "qemu/bitmap.h" #include "qemu/rcu.h" @@ -847,35 +848,8 @@ void device_listener_unregister(DeviceListener *listener); */ bool qdev_should_hide_device(const QDict *opts, bool from_json, Error **errp); -typedef enum MachineInitPhase { - /* current_machine is NULL. */ - MACHINE_INIT_PHASE_NO_MACHINE, - - /* current_machine is not NULL, but current_machine->accel is NULL. */ - MACHINE_INIT_PHASE_MACHINE_CREATED, - - /* - * current_machine->accel is not NULL, but the machine properties have - * not been validated and machine_class->init has not yet been called. - */ - MACHINE_INIT_PHASE_ACCEL_CREATED, - - /* - * machine_class->init has been called, thus creating any embedded - * devices and validating machine properties. Devices created at - * this time are considered to be cold-plugged. - */ - MACHINE_INIT_PHASE_INITIALIZED, - - /* - * QEMU is ready to start CPUs and devices created at this time - * are considered to be hot-plugged. The monitor is not restricted - * to "preconfig" commands. - */ - MACHINE_INIT_PHASE_READY, -} MachineInitPhase; - extern bool phase_check(MachineInitPhase phase); extern void phase_advance(MachineInitPhase phase); +extern MachineInitPhase phase_get(void); #endif diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c index ddbdc5212f..19f9da4c2d 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c @@ -244,3 +244,12 @@ HumanReadableText *qmp_x_query_numa(Error **errp) done: return human_readable_text_from_str(buf); } + +MachineInitPhaseStatus *qmp_query_machine_phase(Error **errp) +{ + MachineInitPhaseStatus *status = g_malloc0(sizeof(*status)); + + status->phase = phase_get(); + + return status; +} diff --git a/hw/core/qdev.c b/hw/core/qdev.c index ccfd6f0dc4..f22c050c89 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -921,6 +921,11 @@ void phase_advance(MachineInitPhase phase) machine_phase = phase; } +MachineInitPhase phase_get(void) +{ + return machine_phase; +} + static const TypeInfo device_type_info = { .name = TYPE_DEVICE, .parent = TYPE_OBJECT, -- 2.33.0