Tested-by: Jim Shu <jim....@sifive.com>

On Thu, May 19, 2022 at 11:36 PM Damien Hedde <damien.he...@greensocs.com>
wrote:

> phase_until() now supports the following transitions:
> + accel-created -> machine-initialized
> + machine-initialized -> machine-ready
>
> As a consequence we can now support the use of qmp_exit_preconfig()
> from phases _accel-created_ and _machine-initialized_.
>
> This commit is a preparation to support cold plugging a device
> using qapi (which will be introduced in a following commit). For this
> we need fine grain control of the phase.
>
> Signed-off-by: Damien Hedde <damien.he...@greensocs.com>
> Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
> ---
>
> v5: update due to refactor of previous commit
> ---
>  softmmu/vl.c | 26 +++++++++++++++++++++-----
>  1 file changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index 7f8d15b5b8..ea15e37973 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -2698,8 +2698,9 @@ static void qemu_machine_creation_done(void)
>
>  void qmp_x_exit_preconfig(Error **errp)
>  {
> -    if (phase_check(PHASE_MACHINE_INITIALIZED)) {
> -        error_setg(errp, "The command is permitted only before machine
> initialization");
> +    if (phase_check(PHASE_MACHINE_READY)) {
> +        error_setg(errp, "The command is permitted only before"
> +                         " machine is ready");
>          return;
>      }
>      phase_until(PHASE_MACHINE_READY, errp);
> @@ -2707,9 +2708,6 @@ void qmp_x_exit_preconfig(Error **errp)
>
>  static void qemu_phase_ready(Error **errp)
>  {
> -    qemu_init_board();
> -    /* phase is now PHASE_MACHINE_INITIALIZED. */
> -    qemu_create_cli_devices();
>      cxl_fixed_memory_window_link_targets(errp);
>      qemu_machine_creation_done();
>      /* Phase is now PHASE_MACHINE_READY. */
> @@ -2749,6 +2747,24 @@ bool phase_until(MachineInitPhase phase, Error
> **errp)
>
>          switch (cur_phase) {
>          case PHASE_ACCEL_CREATED:
> +            qemu_init_board();
> +            /* Phase is now PHASE_MACHINE_INITIALIZED. */
> +            /*
> +             * Handle CLI devices now in order leave this case in a state
> +             * where we can cold plug devices with QMP. The following call
> +             * handles the CLI options:
> +             * + -fw_cfg (has side effects on device cold plug)
> +             * + -device
> +             */
> +            qemu_create_cli_devices();
> +            /*
> +             * At this point all CLI options are handled apart:
> +             * + -S (autostart)
> +             * + -incoming
> +             */
> +            break;
> +
> +        case PHASE_MACHINE_INITIALIZED:
>              qemu_phase_ready(errp);
>              break;
>
> --
> 2.36.1
>
>
>

Reply via email to