Message ID | 20200908165438.1008942-6-berrange@redhat.com |
---|---|
State | New |
Headers | show |
Series | Add support for loading SMBIOS OEM strings from a file | expand |
On 9/8/20 6:54 PM, Daniel P. Berrangé wrote: > The i440fx and Q35 machine types are both hardcoded to use the legacy > SMBIOS 2.1 entry point. This is a sensible conservative choice because > SeaBIOS only supports SMBIOS 2.1 > > EDK2, however, can also support SMBIOS 3.0 and QEMU already uses this on > the ARM virt machine type. > > This adds a property to allow the choice of SMBIOS entry point versions > For example to opt in to version 3.0 > > $QEMU -machine q35,smbios_ep=3_0 > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > hw/i386/pc.c | 26 ++++++++++++++++++++++++++ > hw/i386/pc_piix.c | 2 +- > hw/i386/pc_q35.c | 2 +- > include/hw/i386/pc.h | 3 +++ > 4 files changed, 31 insertions(+), 2 deletions(-) > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index d11daacc23..cfce279eed 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -81,6 +81,7 @@ > #include "hw/mem/nvdimm.h" > #include "qapi/error.h" > #include "qapi/qapi-visit-common.h" > +#include "qapi/qapi-visit-machine.h" > #include "qapi/visitor.h" > #include "hw/core/cpu.h" > #include "hw/usb.h" > @@ -1834,6 +1835,23 @@ static void pc_machine_set_pit(Object *obj, bool value, Error **errp) > pcms->pit_enabled = value; > } > > +static void pc_machine_get_smbios_ep(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + PCMachineState *pcms = PC_MACHINE(obj); > + SmbiosEntryPointType smbios_ep = pcms->smbios_ep; > + > + visit_type_SmbiosEntryPointType(v, name, &smbios_ep, errp); > +} > + > +static void pc_machine_set_smbios_ep(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + PCMachineState *pcms = PC_MACHINE(obj); > + > + visit_type_SmbiosEntryPointType(v, name, &pcms->smbios_ep, errp); > +} > + > static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v, > const char *name, void *opaque, > Error **errp) > @@ -1879,6 +1897,8 @@ static void pc_machine_initfn(Object *obj) > pcms->vmport = ON_OFF_AUTO_OFF; > #endif /* CONFIG_VMPORT */ > pcms->max_ram_below_4g = 0; /* use default */ > + pcms->smbios_ep = SMBIOS_ENTRY_POINT_TYPE_2_1; > + > /* acpi build is enabled by default if machine supports it */ > pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; > pcms->smbus_enabled = true; > @@ -2004,6 +2024,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) > > object_class_property_add_bool(oc, PC_MACHINE_PIT, > pc_machine_get_pit, pc_machine_set_pit); > + > + object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str", > + pc_machine_get_smbios_ep, pc_machine_set_smbios_ep, > + NULL, NULL); > + object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP, > + "SMBIOS Entry Point version [v2_1, v3_0]"); > } > > static const TypeInfo pc_machine_info = { > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c > index 1c5bc6ae6e..3626e5425f 100644 > --- a/hw/i386/pc_piix.c > +++ b/hw/i386/pc_piix.c > @@ -179,7 +179,7 @@ static void pc_init1(MachineState *machine, > smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)", > mc->name, pcmc->smbios_legacy_mode, > pcmc->smbios_uuid_encoded, > - SMBIOS_ENTRY_POINT_TYPE_2_1); > + pcms->smbios_ep); > } > > /* allocate ram and load rom/bios */ > diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c > index cc202407c7..7cf08fa364 100644 > --- a/hw/i386/pc_q35.c > +++ b/hw/i386/pc_q35.c > @@ -204,7 +204,7 @@ static void pc_q35_init(MachineState *machine) > smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", > mc->name, pcmc->smbios_legacy_mode, > pcmc->smbios_uuid_encoded, > - SMBIOS_ENTRY_POINT_TYPE_2_1); > + pcms->smbios_ep); > } > > /* allocate ram and load rom/bios */ > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h > index fe52e165b2..f5d2ebcb49 100644 > --- a/include/hw/i386/pc.h > +++ b/include/hw/i386/pc.h > @@ -10,6 +10,7 @@ > > #include "hw/acpi/acpi_dev_interface.h" > #include "hw/hotplug.h" > +#include "hw/firmware/smbios.h" > > #define HPET_INTCAP "hpet-intcap" > > @@ -38,6 +39,7 @@ struct PCMachineState { > /* Configuration options: */ > uint64_t max_ram_below_4g; > OnOffAuto vmport; > + SmbiosEntryPointType smbios_ep; > > bool acpi_build_enabled; > bool smbus_enabled; > @@ -59,6 +61,7 @@ struct PCMachineState { > #define PC_MACHINE_SMBUS "smbus" > #define PC_MACHINE_SATA "sata" > #define PC_MACHINE_PIT "pit" > +#define PC_MACHINE_SMBIOS_EP "smbios-ep" > > /** > * PCMachineClass: >
On 09/08/20 18:54, Daniel P. Berrangé wrote: > The i440fx and Q35 machine types are both hardcoded to use the legacy > SMBIOS 2.1 entry point. This is a sensible conservative choice because > SeaBIOS only supports SMBIOS 2.1 > > EDK2, however, can also support SMBIOS 3.0 and QEMU already uses this on > the ARM virt machine type. > > This adds a property to allow the choice of SMBIOS entry point versions > For example to opt in to version 3.0 > > $QEMU -machine q35,smbios_ep=3_0 s/smbios_ep/smbios-ep/ Thanks Laszlo > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > --- > hw/i386/pc.c | 26 ++++++++++++++++++++++++++ > hw/i386/pc_piix.c | 2 +- > hw/i386/pc_q35.c | 2 +- > include/hw/i386/pc.h | 3 +++ > 4 files changed, 31 insertions(+), 2 deletions(-) > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index d11daacc23..cfce279eed 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -81,6 +81,7 @@ > #include "hw/mem/nvdimm.h" > #include "qapi/error.h" > #include "qapi/qapi-visit-common.h" > +#include "qapi/qapi-visit-machine.h" > #include "qapi/visitor.h" > #include "hw/core/cpu.h" > #include "hw/usb.h" > @@ -1834,6 +1835,23 @@ static void pc_machine_set_pit(Object *obj, bool value, Error **errp) > pcms->pit_enabled = value; > } > > +static void pc_machine_get_smbios_ep(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + PCMachineState *pcms = PC_MACHINE(obj); > + SmbiosEntryPointType smbios_ep = pcms->smbios_ep; > + > + visit_type_SmbiosEntryPointType(v, name, &smbios_ep, errp); > +} > + > +static void pc_machine_set_smbios_ep(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + PCMachineState *pcms = PC_MACHINE(obj); > + > + visit_type_SmbiosEntryPointType(v, name, &pcms->smbios_ep, errp); > +} > + > static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v, > const char *name, void *opaque, > Error **errp) > @@ -1879,6 +1897,8 @@ static void pc_machine_initfn(Object *obj) > pcms->vmport = ON_OFF_AUTO_OFF; > #endif /* CONFIG_VMPORT */ > pcms->max_ram_below_4g = 0; /* use default */ > + pcms->smbios_ep = SMBIOS_ENTRY_POINT_TYPE_2_1; > + > /* acpi build is enabled by default if machine supports it */ > pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; > pcms->smbus_enabled = true; > @@ -2004,6 +2024,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) > > object_class_property_add_bool(oc, PC_MACHINE_PIT, > pc_machine_get_pit, pc_machine_set_pit); > + > + object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str", > + pc_machine_get_smbios_ep, pc_machine_set_smbios_ep, > + NULL, NULL); > + object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP, > + "SMBIOS Entry Point version [v2_1, v3_0]"); > } > > static const TypeInfo pc_machine_info = { > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c > index 1c5bc6ae6e..3626e5425f 100644 > --- a/hw/i386/pc_piix.c > +++ b/hw/i386/pc_piix.c > @@ -179,7 +179,7 @@ static void pc_init1(MachineState *machine, > smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)", > mc->name, pcmc->smbios_legacy_mode, > pcmc->smbios_uuid_encoded, > - SMBIOS_ENTRY_POINT_TYPE_2_1); > + pcms->smbios_ep); > } > > /* allocate ram and load rom/bios */ > diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c > index cc202407c7..7cf08fa364 100644 > --- a/hw/i386/pc_q35.c > +++ b/hw/i386/pc_q35.c > @@ -204,7 +204,7 @@ static void pc_q35_init(MachineState *machine) > smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", > mc->name, pcmc->smbios_legacy_mode, > pcmc->smbios_uuid_encoded, > - SMBIOS_ENTRY_POINT_TYPE_2_1); > + pcms->smbios_ep); > } > > /* allocate ram and load rom/bios */ > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h > index fe52e165b2..f5d2ebcb49 100644 > --- a/include/hw/i386/pc.h > +++ b/include/hw/i386/pc.h > @@ -10,6 +10,7 @@ > > #include "hw/acpi/acpi_dev_interface.h" > #include "hw/hotplug.h" > +#include "hw/firmware/smbios.h" > > #define HPET_INTCAP "hpet-intcap" > > @@ -38,6 +39,7 @@ struct PCMachineState { > /* Configuration options: */ > uint64_t max_ram_below_4g; > OnOffAuto vmport; > + SmbiosEntryPointType smbios_ep; > > bool acpi_build_enabled; > bool smbus_enabled; > @@ -59,6 +61,7 @@ struct PCMachineState { > #define PC_MACHINE_SMBUS "smbus" > #define PC_MACHINE_SATA "sata" > #define PC_MACHINE_PIT "pit" > +#define PC_MACHINE_SMBIOS_EP "smbios-ep" > > /** > * PCMachineClass: >
diff --git a/hw/i386/pc.c b/hw/i386/pc.c index d11daacc23..cfce279eed 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -81,6 +81,7 @@ #include "hw/mem/nvdimm.h" #include "qapi/error.h" #include "qapi/qapi-visit-common.h" +#include "qapi/qapi-visit-machine.h" #include "qapi/visitor.h" #include "hw/core/cpu.h" #include "hw/usb.h" @@ -1834,6 +1835,23 @@ static void pc_machine_set_pit(Object *obj, bool value, Error **errp) pcms->pit_enabled = value; } +static void pc_machine_get_smbios_ep(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + SmbiosEntryPointType smbios_ep = pcms->smbios_ep; + + visit_type_SmbiosEntryPointType(v, name, &smbios_ep, errp); +} + +static void pc_machine_set_smbios_ep(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + + visit_type_SmbiosEntryPointType(v, name, &pcms->smbios_ep, errp); +} + static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -1879,6 +1897,8 @@ static void pc_machine_initfn(Object *obj) pcms->vmport = ON_OFF_AUTO_OFF; #endif /* CONFIG_VMPORT */ pcms->max_ram_below_4g = 0; /* use default */ + pcms->smbios_ep = SMBIOS_ENTRY_POINT_TYPE_2_1; + /* acpi build is enabled by default if machine supports it */ pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; pcms->smbus_enabled = true; @@ -2004,6 +2024,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) object_class_property_add_bool(oc, PC_MACHINE_PIT, pc_machine_get_pit, pc_machine_set_pit); + + object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str", + pc_machine_get_smbios_ep, pc_machine_set_smbios_ep, + NULL, NULL); + object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP, + "SMBIOS Entry Point version [v2_1, v3_0]"); } static const TypeInfo pc_machine_info = { diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 1c5bc6ae6e..3626e5425f 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -179,7 +179,7 @@ static void pc_init1(MachineState *machine, smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)", mc->name, pcmc->smbios_legacy_mode, pcmc->smbios_uuid_encoded, - SMBIOS_ENTRY_POINT_TYPE_2_1); + pcms->smbios_ep); } /* allocate ram and load rom/bios */ diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index cc202407c7..7cf08fa364 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -204,7 +204,7 @@ static void pc_q35_init(MachineState *machine) smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", mc->name, pcmc->smbios_legacy_mode, pcmc->smbios_uuid_encoded, - SMBIOS_ENTRY_POINT_TYPE_2_1); + pcms->smbios_ep); } /* allocate ram and load rom/bios */ diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index fe52e165b2..f5d2ebcb49 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -10,6 +10,7 @@ #include "hw/acpi/acpi_dev_interface.h" #include "hw/hotplug.h" +#include "hw/firmware/smbios.h" #define HPET_INTCAP "hpet-intcap" @@ -38,6 +39,7 @@ struct PCMachineState { /* Configuration options: */ uint64_t max_ram_below_4g; OnOffAuto vmport; + SmbiosEntryPointType smbios_ep; bool acpi_build_enabled; bool smbus_enabled; @@ -59,6 +61,7 @@ struct PCMachineState { #define PC_MACHINE_SMBUS "smbus" #define PC_MACHINE_SATA "sata" #define PC_MACHINE_PIT "pit" +#define PC_MACHINE_SMBIOS_EP "smbios-ep" /** * PCMachineClass:
The i440fx and Q35 machine types are both hardcoded to use the legacy SMBIOS 2.1 entry point. This is a sensible conservative choice because SeaBIOS only supports SMBIOS 2.1 EDK2, however, can also support SMBIOS 3.0 and QEMU already uses this on the ARM virt machine type. This adds a property to allow the choice of SMBIOS entry point versions For example to opt in to version 3.0 $QEMU -machine q35,smbios_ep=3_0 Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- hw/i386/pc.c | 26 ++++++++++++++++++++++++++ hw/i386/pc_piix.c | 2 +- hw/i386/pc_q35.c | 2 +- include/hw/i386/pc.h | 3 +++ 4 files changed, 31 insertions(+), 2 deletions(-)