qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Roy Hopkins <roy.hopkins@suse.com>
Cc: qemu-devel@nongnu.org, "Paolo Bonzini" <pbonzini@redhat.com>,
	"Stefano Garzarella" <sgarzare@redhat.com>,
	"Marcelo Tosatti" <mtosatti@redhat.com>,
	"Michael S . Tsirkin" <mst@redhat.com>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Sergio Lopez" <slp@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Alistair Francis" <alistair@alistair23.me>,
	"Peter Xu" <peterx@redhat.com>,
	"David Hildenbrand" <david@redhat.com>,
	"Igor Mammedov" <imammedo@redhat.com>,
	"Tom Lendacky" <thomas.lendacky@amd.com>,
	"Michael Roth" <michael.roth@amd.com>,
	"Ani Sinha" <anisinha@redhat.com>,
	"Jörg Roedel" <jroedel@suse.com>
Subject: Re: [PATCH v4 04/17] hw/i386: Add igvm-cfg object and processing for IGVM files
Date: Wed, 24 Jul 2024 18:08:24 +0100	[thread overview]
Message-ID: <ZqE1CF0nhvE9vQ5G@redhat.com> (raw)
In-Reply-To: <f8cd2ee02a96d48ce835a552b5a31c2cc63790fc.1720004383.git.roy.hopkins@suse.com>

On Wed, Jul 03, 2024 at 12:05:42PM +0100, Roy Hopkins wrote:
> An IGVM file contains configuration of guest state that should be
> applied during configuration of the guest, before the guest is started.
> 
> This patch allows the user to add an igvm-cfg object to an X86 machine
> configuration that allows an IGVM file to be configured that will be
> applied to the guest before it is started.
> 
> If an IGVM configuration is provided then the IGVM file is processed at
> the end of the board initialization, before the state transition to
> PHASE_MACHINE_INITIALIZED.
> 
> Signed-off-by: Roy Hopkins <roy.hopkins@suse.com>
> ---
>  include/hw/i386/x86.h |  3 +++
>  hw/i386/pc.c          | 12 ++++++++++++
>  hw/i386/pc_piix.c     | 10 ++++++++++
>  hw/i386/pc_q35.c      | 10 ++++++++++
>  qemu-options.hx       | 25 +++++++++++++++++++++++++
>  5 files changed, 60 insertions(+)
> 
> diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
> index d43cb3908e..4abe3afaba 100644
> --- a/include/hw/i386/x86.h
> +++ b/include/hw/i386/x86.h
> @@ -25,6 +25,7 @@
>  #include "hw/intc/ioapic.h"
>  #include "hw/isa/isa.h"
>  #include "qom/object.h"
> +#include "sysemu/igvm-cfg.h"
>  
>  struct X86MachineClass {
>      /*< private >*/
> @@ -97,6 +98,8 @@ struct X86MachineState {
>       * which means no limitation on the guest's bus locks.
>       */
>      uint64_t bus_lock_ratelimit;
> +
> +    IgvmCfgState *igvm;
>  };
>  
>  #define X86_MACHINE_SMM              "smm"
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 77415064c6..03d29e9e48 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1825,6 +1825,18 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
>      object_class_property_add_bool(oc, "fd-bootchk",
>          pc_machine_get_fd_bootchk,
>          pc_machine_set_fd_bootchk);
> +
> +#if defined(CONFIG_IGVM)
> +    object_class_property_add_link(oc, "igvm-cfg",
> +                                   TYPE_IGVM_CFG,
> +                                   offsetof(X86MachineState, igvm),
> +                                   object_property_allow_set_link,
> +                                   OBJ_PROP_LINK_STRONG);
> +    object_class_property_set_description(oc, "igvm-cfg",
> +                                          "Set IGVM configuration");
> +#endif
> +
> +
>  }
>  
>  static const TypeInfo pc_machine_info = {
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 9445b07b4f..d537dd50fb 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -365,6 +365,16 @@ static void pc_init1(MachineState *machine, const char *pci_type)
>                                 x86_nvdimm_acpi_dsmio,
>                                 x86ms->fw_cfg, OBJECT(pcms));
>      }
> +
> +#if defined(CONFIG_IGVM)
> +    /* Apply guest state from IGVM if supplied */
> +    if (x86ms->igvm) {
> +        if (IGVM_CFG_GET_CLASS(x86ms->igvm)
> +                ->process(x86ms->igvm, machine->cgs, &error_fatal) == -1) {
> +            return;

g_assert_not_reached() instead of return, since &error_fatal should
ensure we never get this far.  Also suggest "< 0" rather than "== -1"
as the more common QEMU pattern.

> +        }
> +    }
> +#endif
>  }
>  
>  typedef enum PCSouthBridgeOption {
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 71d3c6d122..d4d66be5a5 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -329,6 +329,16 @@ static void pc_q35_init(MachineState *machine)
>                                 x86_nvdimm_acpi_dsmio,
>                                 x86ms->fw_cfg, OBJECT(pcms));
>      }
> +
> +#if defined(CONFIG_IGVM)
> +    /* Apply guest state from IGVM if supplied */
> +    if (x86ms->igvm) {
> +        if (IGVM_CFG_GET_CLASS(x86ms->igvm)
> +                ->process(x86ms->igvm, machine->cgs, &error_fatal) == -1) {
> +            return;

Same note as for piix above.

> +        }
> +    }
> +#endif
>  }
>  
>  #define DEFINE_Q35_MACHINE(major, minor) \
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 8ca7f34ef0..fd36390416 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -5719,6 +5719,31 @@ SRST
>                   -machine ...,memory-encryption=sev0 \\
>                   .....
>  
> +    ``-object igvm-cfg,file=file``
> +        Create an IGVM configuration object that defines the initial state
> +        of the guest using a file in that conforms to the Independent Guest
> +        Virtual Machine (IGVM) file format.
> +
> +        The ``file`` parameter is used to specify the IGVM file to load.
> +        When provided, the IGVM file is used to populate the initial
> +        memory of the virtual machine and, depending on the platform, can
> +        define the initial processor state, memory map and parameters.
> +
> +        The IGVM file is expected to contain the firmware for the virtual
> +        machine, therefore an ``igvm-cfg`` object cannot be provided along
> +        with other ways of specifying firmware, such as the ``-bios``
> +        parameter on x86 machines.
> +
> +        e.g to launch a machine providing the firmware in an IGVM file
> +
> +        .. parsed-literal::
> +
> +             # |qemu_system_x86| \\
> +                 ...... \\
> +                 -object igvm-cfg,id=igvm0,file=bios.igvm \\
> +                 -machine ...,igvm-cfg=igvm0 \\
> +                 .....
> +
>      ``-object authz-simple,id=id,identity=string``
>          Create an authorization object that will control access to
>          network services.
> -- 
> 2.43.0
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



  reply	other threads:[~2024-07-24 17:09 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-03 11:05 [PATCH v4 00/17] Introduce support for IGVM files Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 01/17] meson: Add optional dependency on IGVM library Roy Hopkins
2024-07-24 16:26   ` Daniel P. Berrangé
2024-07-03 11:05 ` [PATCH v4 02/17] backends/confidential-guest-support: Add functions to support IGVM Roy Hopkins
2024-07-24 16:47   ` Daniel P. Berrangé
2024-07-03 11:05 ` [PATCH v4 03/17] backends/igvm: Add IGVM loader and configuration Roy Hopkins
2024-07-24 16:59   ` Daniel P. Berrangé
2024-07-29 13:35   ` Stefano Garzarella
2024-07-03 11:05 ` [PATCH v4 04/17] hw/i386: Add igvm-cfg object and processing for IGVM files Roy Hopkins
2024-07-24 17:08   ` Daniel P. Berrangé [this message]
2024-07-03 11:05 ` [PATCH v4 05/17] i386/pc_sysfw: Ensure sysfw flash configuration does not conflict with IGVM Roy Hopkins
2024-07-24 17:13   ` Daniel P. Berrangé
2024-08-13 10:42     ` Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 06/17] sev: Fix error handling in sev_encrypt_flash() Roy Hopkins
2024-07-24 17:19   ` Daniel P. Berrangé
2024-07-03 11:05 ` [PATCH v4 07/17] sev: Update launch_update_data functions to use Error handling Roy Hopkins
2024-07-24 17:21   ` Daniel P. Berrangé
2024-07-03 11:05 ` [PATCH v4 08/17] target/i386: Allow setting of R_LDTR and R_TR with cpu_x86_load_seg_cache() Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 09/17] i386/sev: Refactor setting of reset vector and initial CPU state Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 10/17] i386/sev: Implement ConfidentialGuestSupport functions for SEV Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 11/17] docs/system: Add documentation on support for IGVM Roy Hopkins
2024-07-24 17:25   ` Daniel P. Berrangé
2024-07-29 13:41   ` Stefano Garzarella
2024-07-03 11:05 ` [PATCH v4 12/17] docs/interop/firmware.json: Add igvm to FirmwareDevice Roy Hopkins
2024-07-24 17:27   ` Daniel P. Berrangé
2024-07-03 11:05 ` [PATCH v4 13/17] backends/confidential-guest-support: Add set_guest_policy() function Roy Hopkins
2024-07-24 17:30   ` Daniel P. Berrangé
2024-07-03 11:05 ` [PATCH v4 14/17] backends/igvm: Process initialization sections in IGVM file Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 15/17] backends/igvm: Handle policy for SEV guests Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 16/17] i386/sev: Add implementation of CGS set_guest_policy() Roy Hopkins
2024-07-03 11:05 ` [PATCH v4 17/17] sev: Provide sev_features flags from IGVM VMSA to KVM_SEV_INIT2 Roy Hopkins
2024-07-20 18:26 ` [PATCH v4 00/17] Introduce support for IGVM files Michael S. Tsirkin
2024-08-13  9:53   ` Roy Hopkins
2024-08-13 10:21     ` Michael S. Tsirkin
2024-07-24 16:29 ` Daniel P. Berrangé
2024-08-02 15:57   ` Roy Hopkins
2024-08-02 16:03     ` Daniel P. Berrangé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZqE1CF0nhvE9vQ5G@redhat.com \
    --to=berrange@redhat.com \
    --cc=alistair@alistair23.me \
    --cc=anisinha@redhat.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=imammedo@redhat.com \
    --cc=jroedel@suse.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=michael.roth@amd.com \
    --cc=mst@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=roy.hopkins@suse.com \
    --cc=sgarzare@redhat.com \
    --cc=slp@redhat.com \
    --cc=thomas.lendacky@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).