smbios: get rid of smbios_legacy global

clean up smbios_set_defaults() which is reused by legacy
and non legacy machines from being aware of 'legacy' notion
and need to turn it off. And push legacy handling up to
PC machine code where it's relevant.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Ani Sinha <anisinha@redhat.com>
Acked-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Tested-by: Fiona Ebner <f.ebner@proxmox.com>
Message-Id: <20240314152302.2324164-7-imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Igor Mammedov 2024-03-14 16:22:47 +01:00 committed by Michael S. Tsirkin
parent e94e0a833b
commit b3854ce8a7
6 changed files with 23 additions and 27 deletions

View File

@ -1650,7 +1650,7 @@ static void virt_build_smbios(VirtMachineState *vms)
} }
smbios_set_defaults("QEMU", product, smbios_set_defaults("QEMU", product,
vmc->smbios_old_sys_ver ? "1.0" : mc->name, false, vmc->smbios_old_sys_ver ? "1.0" : mc->name,
true, SMBIOS_ENTRY_POINT_TYPE_64); true, SMBIOS_ENTRY_POINT_TYPE_64);
/* build the array of physical mem area from base_memmap */ /* build the array of physical mem area from base_memmap */

View File

@ -63,15 +63,16 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg)
if (pcmc->smbios_defaults) { if (pcmc->smbios_defaults) {
/* These values are guest ABI, do not change */ /* These values are guest ABI, do not change */
smbios_set_defaults("QEMU", mc->desc, mc->name, smbios_set_defaults("QEMU", mc->desc, mc->name,
pcmc->smbios_legacy_mode, pcmc->smbios_uuid_encoded, pcmc->smbios_uuid_encoded,
pcms->smbios_entry_point_type); pcms->smbios_entry_point_type);
} }
/* tell smbios about cpuid version and features */ /* tell smbios about cpuid version and features */
smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]); smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]);
smbios_tables = smbios_get_table_legacy(ms->smp.cpus, &smbios_tables_len); if (pcmc->smbios_legacy_mode) {
if (smbios_tables) { smbios_tables = smbios_get_table_legacy(ms->smp.cpus,
&smbios_tables_len);
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES, fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
smbios_tables, smbios_tables_len); smbios_tables, smbios_tables_len);
return; return;

View File

@ -355,7 +355,7 @@ static void virt_build_smbios(LoongArchMachineState *lams)
return; return;
} }
smbios_set_defaults("QEMU", product, mc->name, false, smbios_set_defaults("QEMU", product, mc->name,
true, SMBIOS_ENTRY_POINT_TYPE_64); true, SMBIOS_ENTRY_POINT_TYPE_64);
smbios_get_tables(ms, NULL, 0, &smbios_tables, &smbios_tables_len, smbios_get_tables(ms, NULL, 0, &smbios_tables, &smbios_tables_len,

View File

@ -1275,7 +1275,7 @@ static void virt_build_smbios(RISCVVirtState *s)
product = "KVM Virtual Machine"; product = "KVM Virtual Machine";
} }
smbios_set_defaults("QEMU", product, mc->name, false, smbios_set_defaults("QEMU", product, mc->name,
true, SMBIOS_ENTRY_POINT_TYPE_64); true, SMBIOS_ENTRY_POINT_TYPE_64);
if (riscv_is_32bit(&s->soc[0])) { if (riscv_is_32bit(&s->soc[0])) {

View File

@ -54,7 +54,6 @@ struct smbios_table {
static uint8_t *smbios_entries; static uint8_t *smbios_entries;
static size_t smbios_entries_len; static size_t smbios_entries_len;
static bool smbios_legacy = true;
static bool smbios_uuid_encoded = true; static bool smbios_uuid_encoded = true;
/* end: legacy structures & constants for <= 2.0 machines */ /* end: legacy structures & constants for <= 2.0 machines */
@ -633,9 +632,16 @@ static void smbios_build_type_1_fields(void)
uint8_t *smbios_get_table_legacy(uint32_t expected_t4_count, size_t *length) uint8_t *smbios_get_table_legacy(uint32_t expected_t4_count, size_t *length)
{ {
if (!smbios_legacy) { /* drop unwanted version of command-line file blob(s) */
*length = 0; g_free(smbios_tables);
return NULL; smbios_tables = NULL;
/* also complain if fields were given for types > 1 */
if (find_next_bit(have_fields_bitmap,
SMBIOS_MAX_TYPE + 1, 2) < SMBIOS_MAX_TYPE + 1) {
error_report("can't process fields for smbios "
"types > 1 on machine versions < 2.1!");
exit(1);
} }
if (!smbios_immutable) { if (!smbios_immutable) {
@ -1129,28 +1135,13 @@ void smbios_set_default_processor_family(uint16_t processor_family)
} }
void smbios_set_defaults(const char *manufacturer, const char *product, void smbios_set_defaults(const char *manufacturer, const char *product,
const char *version, bool legacy_mode, const char *version,
bool uuid_encoded, SmbiosEntryPointType ep_type) bool uuid_encoded, SmbiosEntryPointType ep_type)
{ {
smbios_have_defaults = true; smbios_have_defaults = true;
smbios_legacy = legacy_mode;
smbios_uuid_encoded = uuid_encoded; smbios_uuid_encoded = uuid_encoded;
smbios_ep_type = ep_type; smbios_ep_type = ep_type;
/* drop unwanted version of command-line file blob(s) */
if (smbios_legacy) {
g_free(smbios_tables);
/* in legacy mode, also complain if fields were given for types > 1 */
if (find_next_bit(have_fields_bitmap,
SMBIOS_MAX_TYPE+1, 2) < SMBIOS_MAX_TYPE+1) {
error_report("can't process fields for smbios "
"types > 1 on machine versions < 2.1!");
exit(1);
}
} else {
g_free(smbios_entries);
}
SMBIOS_SET_DEFAULT(type1.manufacturer, manufacturer); SMBIOS_SET_DEFAULT(type1.manufacturer, manufacturer);
SMBIOS_SET_DEFAULT(type1.product, product); SMBIOS_SET_DEFAULT(type1.product, product);
SMBIOS_SET_DEFAULT(type1.version, version); SMBIOS_SET_DEFAULT(type1.version, version);
@ -1226,6 +1217,10 @@ void smbios_get_tables(MachineState *ms,
{ {
unsigned i, dimm_cnt, offset; unsigned i, dimm_cnt, offset;
/* drop unwanted (legacy) version of command-line file blob(s) */
g_free(smbios_entries);
smbios_entries = NULL;
if (!smbios_immutable) { if (!smbios_immutable) {
smbios_build_type_0_table(); smbios_build_type_0_table();
smbios_build_type_1_table(); smbios_build_type_1_table();

View File

@ -310,7 +310,7 @@ struct smbios_type_127 {
void smbios_entry_add(QemuOpts *opts, Error **errp); void smbios_entry_add(QemuOpts *opts, Error **errp);
void smbios_set_cpuid(uint32_t version, uint32_t features); void smbios_set_cpuid(uint32_t version, uint32_t features);
void smbios_set_defaults(const char *manufacturer, const char *product, void smbios_set_defaults(const char *manufacturer, const char *product,
const char *version, bool legacy_mode, const char *version,
bool uuid_encoded, SmbiosEntryPointType ep_type); bool uuid_encoded, SmbiosEntryPointType ep_type);
void smbios_set_default_processor_family(uint16_t processor_family); void smbios_set_default_processor_family(uint16_t processor_family);
uint8_t *smbios_get_table_legacy(uint32_t expected_t4_count, size_t *length); uint8_t *smbios_get_table_legacy(uint32_t expected_t4_count, size_t *length);