On Thu, Sep 23, 2021 at 2:17 AM Damien Hedde <damien.hedde@greensocs.com> wrote:
>
> From: Mirela Grujic <mirela.grujic@greensocs.com>
>
> The x-machine-init QMP command is available only if the -preconfig option
> is used and the current machine initialization phase is accel-created.
>
> The command triggers QEMU to enter machine initialized phase and wait
> for the QMP configuration. In future commits, we will add the possiblity
> to create devices at this point.
>
> To exit the initialized phase use the x-exit-preconfig QMP command.
>
> Signed-off-by: Mirela Grujic <mirela.grujic@greensocs.com>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> qapi/machine.json | 23 +++++++++++++++++++++++
> softmmu/vl.c | 19 +++++++++++++++----
> 2 files changed, 38 insertions(+), 4 deletions(-)
>
> diff --git a/qapi/machine.json b/qapi/machine.json
> index 969d37fb03..56330c0e8e 100644
> --- a/qapi/machine.json
> +++ b/qapi/machine.json
> @@ -1368,3 +1368,26 @@
> ##
> { 'command': 'query-machine-phase', 'returns': 'MachineInitPhaseStatus',
> 'allow-preconfig': true }
> +
> +##
> +# @x-machine-init:
> +#
> +# Enter machine initialized phase
> +#
> +# Since: 6.2
> +#
> +# Returns: If successful, nothing
> +#
> +# Notes: This command will trigger QEMU to execute initialization steps
> +# that are required to enter the machine initialized phase. The command
> +# is available only if the -preconfig command line option was passed and
> +# if the machine is currently in the accel-created phase. To exit the
> +# machine initialized phase use the x-exit-preconfig command.
> +#
> +# Example:
> +#
> +# -> { "execute": "x-machine-init" }
> +# <- { "return": {} }
> +#
> +##
> +{ 'command': 'x-machine-init', 'allow-preconfig': true }
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index d2552ba8ac..84c5132ad7 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -123,6 +123,7 @@
> #include "qapi/qapi-visit-qom.h"
> #include "qapi/qapi-commands-ui.h"
> #include "qapi/qmp/qdict.h"
> +#include "qapi/qapi-commands-machine.h"
> #include "qapi/qmp/qerror.h"
> #include "sysemu/iothread.h"
> #include "qemu/guest-random.h"
> @@ -2610,10 +2611,16 @@ static void qemu_init_displays(void)
> }
> }
>
> -static void qemu_init_board(void)
> +void qmp_x_machine_init(Error **errp)
> {
> MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
>
> + if (phase_check(MACHINE_INIT_PHASE_INITIALIZED)) {
> + error_setg(errp, "The command is permitted only before "
> + "the machine is initialized");
> + return;
> + }
> +
> if (machine_class->default_ram_id && current_machine->ram_size &&
> numa_uses_legacy_mem() && !current_machine->ram_memdev_id) {
> create_default_memdev(current_machine, mem_path);
> @@ -2692,12 +2699,16 @@ static void qemu_machine_creation_done(void)
>
> void qmp_x_exit_preconfig(Error **errp)
> {
> - if (phase_check(MACHINE_INIT_PHASE_INITIALIZED)) {
> - error_setg(errp, "The command is permitted only before machine initialization");
> + if (phase_check(MACHINE_INIT_PHASE_READY)) {
> + error_setg(errp, "The command is permitted only before "
> + "the machine is ready");
> return;
> }
>
> - qemu_init_board();
> + if (!phase_check(MACHINE_INIT_PHASE_INITIALIZED)) {
> + qmp_x_machine_init(errp);
> + }
> +
> qemu_create_cli_devices();
> qemu_machine_creation_done();
>
> --
> 2.33.0
>
>