Message ID | 20200908165438.1008942-5-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: > This refactoring prepares for exposing the SMBIOS entry point type as a > machine property on x86. > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > --- > hw/arm/virt.c | 2 +- > hw/i386/pc_piix.c | 2 +- > hw/i386/pc_q35.c | 2 +- > hw/smbios/smbios.c | 9 +++++---- > include/hw/firmware/smbios.h | 9 ++------- > qapi/machine.json | 12 ++++++++++++ > 6 files changed, 22 insertions(+), 14 deletions(-) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index acf9bfbece..fd32b10f75 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -1450,7 +1450,7 @@ static void virt_build_smbios(VirtMachineState *vms) > > smbios_set_defaults("QEMU", product, > vmc->smbios_old_sys_ver ? "1.0" : mc->name, false, > - true, SMBIOS_ENTRY_POINT_30); > + true, SMBIOS_ENTRY_POINT_TYPE_3_0); > > smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len, > &smbios_anchor, &smbios_anchor_len); > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c > index 32b1453e6a..1c5bc6ae6e 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_21); > + SMBIOS_ENTRY_POINT_TYPE_2_1); > } > > /* allocate ram and load rom/bios */ > diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c > index 0cb9c18cd4..cc202407c7 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_21); > + SMBIOS_ENTRY_POINT_TYPE_2_1); > } > > /* allocate ram and load rom/bios */ > diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c > index 3c87be6c91..c99c9b01ae 100644 > --- a/hw/smbios/smbios.c > +++ b/hw/smbios/smbios.c > @@ -61,7 +61,7 @@ uint8_t *smbios_tables; > size_t smbios_tables_len; > unsigned smbios_table_max; > unsigned smbios_table_cnt; > -static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_21; > +static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_2_1; > > static SmbiosEntryPoint ep; > > @@ -383,7 +383,7 @@ static void smbios_validate_table(MachineState *ms) > exit(1); > } > > - if (smbios_ep_type == SMBIOS_ENTRY_POINT_21 && > + if (smbios_ep_type == SMBIOS_ENTRY_POINT_TYPE_2_1 && > smbios_tables_len > SMBIOS_21_MAX_TABLES_LEN) { > error_report("SMBIOS 2.1 table length %zu exceeds %d", > smbios_tables_len, SMBIOS_21_MAX_TABLES_LEN); > @@ -831,7 +831,7 @@ void smbios_set_defaults(const char *manufacturer, const char *product, > static void smbios_entry_point_setup(void) > { > switch (smbios_ep_type) { > - case SMBIOS_ENTRY_POINT_21: > + case SMBIOS_ENTRY_POINT_TYPE_2_1: > memcpy(ep.ep21.anchor_string, "_SM_", 4); > memcpy(ep.ep21.intermediate_anchor_string, "_DMI_", 5); > ep.ep21.length = sizeof(struct smbios_21_entry_point); > @@ -854,7 +854,7 @@ static void smbios_entry_point_setup(void) > ep.ep21.structure_table_address = cpu_to_le32(0); > > break; > - case SMBIOS_ENTRY_POINT_30: > + case SMBIOS_ENTRY_POINT_TYPE_3_0: > memcpy(ep.ep30.anchor_string, "_SM3_", 5); > ep.ep30.length = sizeof(struct smbios_30_entry_point); > ep.ep30.entry_point_revision = 1; > @@ -939,6 +939,7 @@ void smbios_get_tables(MachineState *ms, > *tables = smbios_tables; > *tables_len = smbios_tables_len; > *anchor = (uint8_t *)&ep; > + g_printerr("Total len %zu\n", smbios_tables_len); This seems to belong to patch 2 of this series: "hw/smbios: report error if table size is too large" Otherwise: Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > > /* calculate length based on anchor string */ > if (!strncmp((char *)&ep, "_SM_", 4)) { > diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h > index 02a0ced0a0..cb1299ad7a 100644 > --- a/include/hw/firmware/smbios.h > +++ b/include/hw/firmware/smbios.h > @@ -1,6 +1,8 @@ > #ifndef QEMU_SMBIOS_H > #define QEMU_SMBIOS_H > > +#include "qapi/qapi-types-machine.h" > + > /* > * SMBIOS Support > * > @@ -23,13 +25,6 @@ struct smbios_phys_mem_area { > uint64_t length; > }; > > -/* > - * SMBIOS spec defined tables > - */ > -typedef enum SmbiosEntryPointType { > - SMBIOS_ENTRY_POINT_21, > - SMBIOS_ENTRY_POINT_30, > -} SmbiosEntryPointType; > > /* SMBIOS Entry Point > * There are two types of entry points defined in the SMBIOS specification > diff --git a/qapi/machine.json b/qapi/machine.json > index abc6fd0477..a58cf2694f 100644 > --- a/qapi/machine.json > +++ b/qapi/machine.json > @@ -937,3 +937,15 @@ > 'data': 'NumaOptions', > 'allow-preconfig': true > } > + > +## > +# @SmbiosEntryPointType: > +# > +# @2_1: SMBIOS version 2.1 > +# > +# @3_0: SMBIOS version 3.0 > +# > +# Since: 5.2 > +## > +{ 'enum': 'SmbiosEntryPointType', > + 'data': [ '2_1', '3_0' ] } >
On 9/8/20 6:54 PM, Daniel P. Berrangé wrote: > This refactoring prepares for exposing the SMBIOS entry point type as a > machine property on x86. > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > --- > hw/arm/virt.c | 2 +- > hw/i386/pc_piix.c | 2 +- > hw/i386/pc_q35.c | 2 +- > hw/smbios/smbios.c | 9 +++++---- > include/hw/firmware/smbios.h | 9 ++------- > qapi/machine.json | 12 ++++++++++++ > 6 files changed, 22 insertions(+), 14 deletions(-) > [...] > diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h > index 02a0ced0a0..cb1299ad7a 100644 > --- a/include/hw/firmware/smbios.h > +++ b/include/hw/firmware/smbios.h > @@ -1,6 +1,8 @@ > #ifndef QEMU_SMBIOS_H > #define QEMU_SMBIOS_H > > +#include "qapi/qapi-types-machine.h" Actually to reduce the churn pulled in ... > + > /* > * SMBIOS Support > * > @@ -23,13 +25,6 @@ struct smbios_phys_mem_area { > uint64_t length; > }; > > -/* > - * SMBIOS spec defined tables > - */ > -typedef enum SmbiosEntryPointType { > - SMBIOS_ENTRY_POINT_21, > - SMBIOS_ENTRY_POINT_30, > -} SmbiosEntryPointType; > > /* SMBIOS Entry Point > * There are two types of entry points defined in the SMBIOS specification > diff --git a/qapi/machine.json b/qapi/machine.json > index abc6fd0477..a58cf2694f 100644 > --- a/qapi/machine.json > +++ b/qapi/machine.json > @@ -937,3 +937,15 @@ > 'data': 'NumaOptions', > 'allow-preconfig': true > } > + > +## > +# @SmbiosEntryPointType: > +# > +# @2_1: SMBIOS version 2.1 > +# > +# @3_0: SMBIOS version 3.0 > +# > +# Since: 5.2 > +## > +{ 'enum': 'SmbiosEntryPointType', > + 'data': [ '2_1', '3_0' ] } > ... this could be a good opportunity to add a new qapi/firmware-smbios.json (or firmware.json?) and eventually update docs/interop/firmware.json.
On Tue, Sep 08, 2020 at 08:29:43PM +0200, Philippe Mathieu-Daudé wrote: > On 9/8/20 6:54 PM, Daniel P. Berrangé wrote: > > This refactoring prepares for exposing the SMBIOS entry point type as a > > machine property on x86. > > > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > > --- > > hw/arm/virt.c | 2 +- > > hw/i386/pc_piix.c | 2 +- > > hw/i386/pc_q35.c | 2 +- > > hw/smbios/smbios.c | 9 +++++---- > > include/hw/firmware/smbios.h | 9 ++------- > > qapi/machine.json | 12 ++++++++++++ > > 6 files changed, 22 insertions(+), 14 deletions(-) > > > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > > index acf9bfbece..fd32b10f75 100644 > > --- a/hw/arm/virt.c > > +++ b/hw/arm/virt.c > > @@ -1450,7 +1450,7 @@ static void virt_build_smbios(VirtMachineState *vms) > > > > smbios_set_defaults("QEMU", product, > > vmc->smbios_old_sys_ver ? "1.0" : mc->name, false, > > - true, SMBIOS_ENTRY_POINT_30); > > + true, SMBIOS_ENTRY_POINT_TYPE_3_0); > > > > smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len, > > &smbios_anchor, &smbios_anchor_len); > > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c > > index 32b1453e6a..1c5bc6ae6e 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_21); > > + SMBIOS_ENTRY_POINT_TYPE_2_1); > > } > > > > /* allocate ram and load rom/bios */ > > diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c > > index 0cb9c18cd4..cc202407c7 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_21); > > + SMBIOS_ENTRY_POINT_TYPE_2_1); > > } > > > > /* allocate ram and load rom/bios */ > > diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c > > index 3c87be6c91..c99c9b01ae 100644 > > --- a/hw/smbios/smbios.c > > +++ b/hw/smbios/smbios.c > > @@ -61,7 +61,7 @@ uint8_t *smbios_tables; > > size_t smbios_tables_len; > > unsigned smbios_table_max; > > unsigned smbios_table_cnt; > > -static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_21; > > +static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_2_1; > > > > static SmbiosEntryPoint ep; > > > > @@ -383,7 +383,7 @@ static void smbios_validate_table(MachineState *ms) > > exit(1); > > } > > > > - if (smbios_ep_type == SMBIOS_ENTRY_POINT_21 && > > + if (smbios_ep_type == SMBIOS_ENTRY_POINT_TYPE_2_1 && > > smbios_tables_len > SMBIOS_21_MAX_TABLES_LEN) { > > error_report("SMBIOS 2.1 table length %zu exceeds %d", > > smbios_tables_len, SMBIOS_21_MAX_TABLES_LEN); > > @@ -831,7 +831,7 @@ void smbios_set_defaults(const char *manufacturer, const char *product, > > static void smbios_entry_point_setup(void) > > { > > switch (smbios_ep_type) { > > - case SMBIOS_ENTRY_POINT_21: > > + case SMBIOS_ENTRY_POINT_TYPE_2_1: > > memcpy(ep.ep21.anchor_string, "_SM_", 4); > > memcpy(ep.ep21.intermediate_anchor_string, "_DMI_", 5); > > ep.ep21.length = sizeof(struct smbios_21_entry_point); > > @@ -854,7 +854,7 @@ static void smbios_entry_point_setup(void) > > ep.ep21.structure_table_address = cpu_to_le32(0); > > > > break; > > - case SMBIOS_ENTRY_POINT_30: > > + case SMBIOS_ENTRY_POINT_TYPE_3_0: > > memcpy(ep.ep30.anchor_string, "_SM3_", 5); > > ep.ep30.length = sizeof(struct smbios_30_entry_point); > > ep.ep30.entry_point_revision = 1; > > @@ -939,6 +939,7 @@ void smbios_get_tables(MachineState *ms, > > *tables = smbios_tables; > > *tables_len = smbios_tables_len; > > *anchor = (uint8_t *)&ep; > > + g_printerr("Total len %zu\n", smbios_tables_len); > > This seems to belong to patch 2 of this series: > "hw/smbios: report error if table size is too large" Actually it doens't belong anywhere. This is debug junk from investigating EDK2/SeaBIOS flaws > > Otherwise: > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > Regards, Daniel
On Tue, Sep 08, 2020 at 05:54:37PM +0100, Daniel P. Berrangé wrote: > This refactoring prepares for exposing the SMBIOS entry point type as a > machine property on x86. > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > --- [...] > +## > +# @SmbiosEntryPointType: > +# > +# @2_1: SMBIOS version 2.1 > +# > +# @3_0: SMBIOS version 3.0 > +# > +# Since: 5.2 > +## > +{ 'enum': 'SmbiosEntryPointType', > + 'data': [ '2_1', '3_0' ] } Markus, Michael Roth: would it be OK to extend QAPI to accept dots in enum values? I would like to reuse Daniel's patch, but I would prefer to use "2.1" and "3.0" as option values.
diff --git a/hw/arm/virt.c b/hw/arm/virt.c index acf9bfbece..fd32b10f75 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -1450,7 +1450,7 @@ static void virt_build_smbios(VirtMachineState *vms) smbios_set_defaults("QEMU", product, vmc->smbios_old_sys_ver ? "1.0" : mc->name, false, - true, SMBIOS_ENTRY_POINT_30); + true, SMBIOS_ENTRY_POINT_TYPE_3_0); smbios_get_tables(MACHINE(vms), NULL, 0, &smbios_tables, &smbios_tables_len, &smbios_anchor, &smbios_anchor_len); diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 32b1453e6a..1c5bc6ae6e 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_21); + SMBIOS_ENTRY_POINT_TYPE_2_1); } /* allocate ram and load rom/bios */ diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 0cb9c18cd4..cc202407c7 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_21); + SMBIOS_ENTRY_POINT_TYPE_2_1); } /* allocate ram and load rom/bios */ diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c index 3c87be6c91..c99c9b01ae 100644 --- a/hw/smbios/smbios.c +++ b/hw/smbios/smbios.c @@ -61,7 +61,7 @@ uint8_t *smbios_tables; size_t smbios_tables_len; unsigned smbios_table_max; unsigned smbios_table_cnt; -static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_21; +static SmbiosEntryPointType smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_2_1; static SmbiosEntryPoint ep; @@ -383,7 +383,7 @@ static void smbios_validate_table(MachineState *ms) exit(1); } - if (smbios_ep_type == SMBIOS_ENTRY_POINT_21 && + if (smbios_ep_type == SMBIOS_ENTRY_POINT_TYPE_2_1 && smbios_tables_len > SMBIOS_21_MAX_TABLES_LEN) { error_report("SMBIOS 2.1 table length %zu exceeds %d", smbios_tables_len, SMBIOS_21_MAX_TABLES_LEN); @@ -831,7 +831,7 @@ void smbios_set_defaults(const char *manufacturer, const char *product, static void smbios_entry_point_setup(void) { switch (smbios_ep_type) { - case SMBIOS_ENTRY_POINT_21: + case SMBIOS_ENTRY_POINT_TYPE_2_1: memcpy(ep.ep21.anchor_string, "_SM_", 4); memcpy(ep.ep21.intermediate_anchor_string, "_DMI_", 5); ep.ep21.length = sizeof(struct smbios_21_entry_point); @@ -854,7 +854,7 @@ static void smbios_entry_point_setup(void) ep.ep21.structure_table_address = cpu_to_le32(0); break; - case SMBIOS_ENTRY_POINT_30: + case SMBIOS_ENTRY_POINT_TYPE_3_0: memcpy(ep.ep30.anchor_string, "_SM3_", 5); ep.ep30.length = sizeof(struct smbios_30_entry_point); ep.ep30.entry_point_revision = 1; @@ -939,6 +939,7 @@ void smbios_get_tables(MachineState *ms, *tables = smbios_tables; *tables_len = smbios_tables_len; *anchor = (uint8_t *)&ep; + g_printerr("Total len %zu\n", smbios_tables_len); /* calculate length based on anchor string */ if (!strncmp((char *)&ep, "_SM_", 4)) { diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h index 02a0ced0a0..cb1299ad7a 100644 --- a/include/hw/firmware/smbios.h +++ b/include/hw/firmware/smbios.h @@ -1,6 +1,8 @@ #ifndef QEMU_SMBIOS_H #define QEMU_SMBIOS_H +#include "qapi/qapi-types-machine.h" + /* * SMBIOS Support * @@ -23,13 +25,6 @@ struct smbios_phys_mem_area { uint64_t length; }; -/* - * SMBIOS spec defined tables - */ -typedef enum SmbiosEntryPointType { - SMBIOS_ENTRY_POINT_21, - SMBIOS_ENTRY_POINT_30, -} SmbiosEntryPointType; /* SMBIOS Entry Point * There are two types of entry points defined in the SMBIOS specification diff --git a/qapi/machine.json b/qapi/machine.json index abc6fd0477..a58cf2694f 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -937,3 +937,15 @@ 'data': 'NumaOptions', 'allow-preconfig': true } + +## +# @SmbiosEntryPointType: +# +# @2_1: SMBIOS version 2.1 +# +# @3_0: SMBIOS version 3.0 +# +# Since: 5.2 +## +{ 'enum': 'SmbiosEntryPointType', + 'data': [ '2_1', '3_0' ] }
This refactoring prepares for exposing the SMBIOS entry point type as a machine property on x86. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- hw/arm/virt.c | 2 +- hw/i386/pc_piix.c | 2 +- hw/i386/pc_q35.c | 2 +- hw/smbios/smbios.c | 9 +++++---- include/hw/firmware/smbios.h | 9 ++------- qapi/machine.json | 12 ++++++++++++ 6 files changed, 22 insertions(+), 14 deletions(-)