Table definitions for types 4 and 17 are only up to v2.0, so add fields specified in smbios v2.3, as expected (and advertised) by the SeaBIOS smbios entry point structure.
In particular, OS X guests insist on type 17 being v2.3 compliant, to avoid GUI crashes when "about this mac" is chosen in the Finder menu.
Signed-off-by: Gabriel Somlo somlo@cmu.edu --- hw/i386/smbios.c | 9 +++++++++ include/hw/i386/smbios.h | 13 +++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c index b1f1d46..f7a9a92 100644 --- a/hw/i386/smbios.c +++ b/hw/i386/smbios.c @@ -499,6 +499,9 @@ static void smbios_build_type_4_table(unsigned instance) t->l1_cache_handle = 0xFFFF; /* N/A */ t->l2_cache_handle = 0xFFFF; /* N/A */ t->l3_cache_handle = 0xFFFF; /* N/A */ + SMBIOS_TABLE_SET_STR(4, serial_number_str, type4.serial); + SMBIOS_TABLE_SET_STR(4, asset_tag_number_str, type4.asset); + SMBIOS_TABLE_SET_STR(4, part_number_str, type4.part);
SMBIOS_BUILD_TABLE_POST; smbios_type4_count++; @@ -557,6 +560,11 @@ static void smbios_build_type_17_table(unsigned instance, ram_addr_t size) SMBIOS_TABLE_SET_STR(17, bank_locator_str, type17.bank); t->memory_type = 0x07; /* RAM */ t->type_detail = 0; /* hardcoded in SeaBIOS */ + t->speed = 0; /* Unknown */ + SMBIOS_TABLE_SET_STR(17, manufacturer_str, type17.manufacturer); + SMBIOS_TABLE_SET_STR(17, serial_number_str, type17.serial); + SMBIOS_TABLE_SET_STR(17, asset_tag_number_str, type17.asset); + SMBIOS_TABLE_SET_STR(17, part_number_str, type17.part);
SMBIOS_BUILD_TABLE_POST; } @@ -673,6 +681,7 @@ void smbios_set_defaults(const char *manufacturer, SMBIOS_SET_DEFAULT(type4.version, version); */ SMBIOS_SET_DEFAULT(type17.loc_pfx, "DIMM"); + SMBIOS_SET_DEFAULT(type17.manufacturer, manufacturer); }
uint8_t *smbios_get_table(size_t *length) diff --git a/include/hw/i386/smbios.h b/include/hw/i386/smbios.h index 2a0d384..6bde151 100644 --- a/include/hw/i386/smbios.h +++ b/include/hw/i386/smbios.h @@ -100,7 +100,7 @@ struct smbios_type_3 { /* contained elements follow */ } QEMU_PACKED;
-/* SMBIOS type 4 - Processor Information (v2.0) */ +/* SMBIOS type 4 - Processor Information (v2.3) */ struct smbios_type_4 { struct smbios_structure_header header; uint8_t socket_designation_str; @@ -118,6 +118,10 @@ struct smbios_type_4 { uint16_t l1_cache_handle; uint16_t l2_cache_handle; uint16_t l3_cache_handle; + uint8_t serial_number_str; + uint8_t asset_tag_number_str; + uint8_t part_number_str; + } QEMU_PACKED;
/* SMBIOS type 16 - Physical Memory Array */ @@ -131,7 +135,7 @@ struct smbios_type_16 { uint16_t number_of_memory_devices; } QEMU_PACKED;
-/* SMBIOS type 17 - Memory Device */ +/* SMBIOS type 17 - Memory Device (v2.3) */ struct smbios_type_17 { struct smbios_structure_header header; uint16_t physical_memory_array_handle; @@ -145,6 +149,11 @@ struct smbios_type_17 { uint8_t bank_locator_str; uint8_t memory_type; uint16_t type_detail; + uint16_t speed; + uint8_t manufacturer_str; + uint8_t serial_number_str; + uint8_t asset_tag_number_str; + uint8_t part_number_str; } QEMU_PACKED;
/* SMBIOS type 19 - Memory Array Mapped Address */