On Tue, Aug 13, 2024 at 04:01:06PM GMT, 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>
>Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
>---
> hw/i386/pc.c | 12 ++++++++++++
> hw/i386/pc_piix.c | 10 ++++++++++
> hw/i386/pc_q35.c | 10 ++++++++++
> include/hw/i386/x86.h | 3 +++
> qemu-options.hx | 25 +++++++++++++++++++++++++
> 5 files changed, 60 insertions(+)
>
>diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>index c74931d577..30bbe05e3e 100644
>--- a/hw/i386/pc.c
>+++ b/hw/i386/pc.c
>@@ -1827,6 +1827,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 d9e69243b4..78367985b4 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) < 0) {
>+ g_assert_not_reached();
>+ }
>+ }
>+#endif
> }
>
> typedef enum PCSouthBridgeOption {
>diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
>index 9d108b194e..08ef8dc17a 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) < 0) {
>+ g_assert_not_reached();
>+ }
>+ }
>+#endif
> }
>
> #define DEFINE_Q35_MACHINE(major, minor) \
>diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
>index d43cb3908e..01ac29acf6 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;
>+
>+ IgvmCfg *igvm;
> };
>
> #define X86_MACHINE_SMM "smm"
>diff --git a/qemu-options.hx b/qemu-options.hx
>index cee0da2014..b6eee49075 100644
>--- a/qemu-options.hx
>+++ b/qemu-options.hx
>@@ -5927,6 +5927,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 \\
>+ .....
>+
Should we mention that this is supported only by `q35` and `pc` machines?
> ``-object authz-simple,id=id,identity=string``
> Create an authorization object that will control access to
> network services.
>--
>2.43.0
>