Skip to content

Commit

Permalink
smbios: don't check type4 structures in legacy mode
Browse files Browse the repository at this point in the history
legacy mode doesn't support structures of type 2 and more,
and CLI has a check for '-smbios type' option, however it's
still possible to sneak in type4 as a blob with '-smbios file'
option. However doing the later makes SMBIOS tables broken
since SeaBIOS doesn't expect that.

Rather than trying to add support for type4 to legacy code
(both QEMU and SeaBIOS), simplify smbios_get_table_legacy()
by dropping not relevant check in legacy code and error out
on type4 blob.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Ani Sinha <anisinha@redhat.com>
Tested-by: Fiona Ebner <f.ebner@proxmox.com>
Message-Id: <20240314152302.2324164-9-imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Igor Mammedov authored and mstsirkin committed Mar 18, 2024
1 parent cba59fe commit 9cd7fd6
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 7 deletions.
3 changes: 1 addition & 2 deletions hw/i386/fw_cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,7 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg)
smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]);

if (pcmc->smbios_legacy_mode) {
smbios_tables = smbios_get_table_legacy(ms->smp.cpus,
&smbios_tables_len);
smbios_tables = smbios_get_table_legacy(&smbios_tables_len);
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
smbios_tables, smbios_tables_len);
return;
Expand Down
18 changes: 14 additions & 4 deletions hw/smbios/smbios.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,14 +545,17 @@ opts_init(smbios_register_config);
*/
#define SMBIOS_21_MAX_TABLES_LEN 0xffff

static void smbios_validate_table(uint32_t expected_t4_count)
static void smbios_check_type4_count(uint32_t expected_t4_count)
{
if (smbios_type4_count && smbios_type4_count != expected_t4_count) {
error_report("Expected %d SMBIOS Type 4 tables, got %d instead",
expected_t4_count, smbios_type4_count);
exit(1);
}
}

static void smbios_validate_table(void)
{
if (smbios_ep_type == SMBIOS_ENTRY_POINT_TYPE_32 &&
smbios_tables_len > SMBIOS_21_MAX_TABLES_LEN) {
error_report("SMBIOS 2.1 table length %zu exceeds %d",
Expand Down Expand Up @@ -637,7 +640,7 @@ 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(size_t *length)
{
int i;
size_t usr_offset;
Expand All @@ -650,6 +653,12 @@ uint8_t *smbios_get_table_legacy(uint32_t expected_t4_count, size_t *length)
exit(1);
}

if (test_bit(4, have_binfile_bitmap)) {
error_report("can't process table for smbios "
"type 4 on machine versions < 2.1!");
exit(1);
}

g_free(smbios_entries);
smbios_entries_len = sizeof(uint16_t);
smbios_entries = g_malloc0(smbios_entries_len);
Expand All @@ -676,7 +685,7 @@ uint8_t *smbios_get_table_legacy(uint32_t expected_t4_count, size_t *length)

smbios_build_type_0_fields();
smbios_build_type_1_fields();
smbios_validate_table(expected_t4_count);
smbios_validate_table();
*length = smbios_entries_len;
return smbios_entries;
}
Expand Down Expand Up @@ -1304,7 +1313,8 @@ void smbios_get_tables(MachineState *ms,
smbios_build_type_41_table(errp);
smbios_build_type_127_table();

smbios_validate_table(ms->smp.sockets);
smbios_check_type4_count(ms->smp.sockets);
smbios_validate_table();
smbios_entry_point_setup();

/* return tables blob and entry point (anchor), and their sizes */
Expand Down
2 changes: 1 addition & 1 deletion include/hw/firmware/smbios.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
const char *version,
bool uuid_encoded, SmbiosEntryPointType ep_type);
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(size_t *length);
void smbios_get_tables(MachineState *ms,
const struct smbios_phys_mem_area *mem_array,
const unsigned int mem_array_size,
Expand Down

0 comments on commit 9cd7fd6

Please sign in to comment.