From: Ross Philipson Date: Tue, 4 Aug 2009 17:45:41 +0000 (-0400) Subject: Added SMBIOS table 2 pass-through support. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=3f0189bfaf82e3c0c2f2c5bc4a256b0433211016;p=xenclient%2Fxen-pq.git Added SMBIOS table 2 pass-through support. Changes to be committed: modified: master/series new file: master/smbios-table2.patch --- diff --git a/master/series b/master/series index b6562a3..3469dea 100644 --- a/master/series +++ b/master/series @@ -19,3 +19,4 @@ cx-initialize-safe-state igd-cmd-reg-change-for-reboot xblanker rm-oem-smbios-files.patch +smbios-table2.patch diff --git a/master/smbios-table2.patch b/master/smbios-table2.patch new file mode 100644 index 0000000..766bb65 --- /dev/null +++ b/master/smbios-table2.patch @@ -0,0 +1,156 @@ +diff --git a/tools/firmware/hvmloader/markers.h b/tools/firmware/hvmloader/markers.h +index 7673d22..48cbd49 100644 +--- a/tools/firmware/hvmloader/markers.h ++++ b/tools/firmware/hvmloader/markers.h +@@ -11,6 +11,10 @@ + #define SYS_PRODUCT_SKU_MARKER "##########################################SYS_PRODUCT_SKU_MARKER" + #define SYS_PRODUCT_FAMILY_MARKER "#######################################SYS_PRODUCT_FAMILY_MARKER" + ++#define SYS_BOARD_MANUFACTURER_MARKER "###################################SYS_BOARD_MANUFACTURER_MARKER" ++#define SYS_BOARD_PRODUCT_NAME_MARKER "###################################SYS_BOARD_PRODUCT_NAME_MARKER" ++#define SYS_BOARD_SERIAL_MARKER "#########################################SYS_BOARD_SERIAL_MARKER" ++ + #define SYS_ENCLOSURE_MANUFACTURER_MARKER "###############################SYS_ENCLOSURE_MANUFACTURER_MARKER" + #define SYS_ENCLOSURE_SERIAL_MARKER "#####################################SYS_ENCLOSURE_SERIAL_MARKER" + +@@ -54,6 +58,21 @@ struct sys_product_family_struct { + char value[65]; + } sys_product_family = {SYS_PRODUCT_FAMILY_MARKER, ""}; + ++struct sys_board_manufacturer_struct { ++ char marker[65]; ++ char value[65]; ++} sys_board_manufacturer = {SYS_BOARD_MANUFACTURER_MARKER, "Xen"}; ++ ++struct sys_board_product_name_struct { ++ char marker[65]; ++ char value[65]; ++} sys_board_product_name = {SYS_BOARD_PRODUCT_NAME_MARKER, "HVM domU"}; ++ ++struct sys_board_serial_struct { ++ char marker[65]; ++ char value[65]; ++} sys_board_serial = {SYS_BOARD_SERIAL_MARKER, ""}; ++ + struct sys_enclosure_manufacturer_struct { + char marker[65]; + char value[65]; +diff --git a/tools/firmware/hvmloader/smbios.c b/tools/firmware/hvmloader/smbios.c +index c6024c4..2337321 100644 +--- a/tools/firmware/hvmloader/smbios.c ++++ b/tools/firmware/hvmloader/smbios.c +@@ -50,6 +50,8 @@ static void * + smbios_type_1_init(void *start, const char *xen_version, + uint8_t uuid[16]); + static void * ++smbios_type_2_init(void *start); ++static void * + smbios_type_3_init(void *start); + static void * + smbios_type_4_init(void *start, unsigned int cpu_number, +@@ -122,6 +124,7 @@ write_smbios_tables(void *start, + do_struct(smbios_type_0_init(p, xen_version, xen_major_version, + xen_minor_version)); + do_struct(smbios_type_1_init(p, xen_version, uuid)); ++ do_struct(smbios_type_2_init(p)); + do_struct(smbios_type_3_init(p)); + for ( cpu_num = 1; cpu_num <= vcpus; cpu_num++ ) + do_struct(smbios_type_4_init(p, cpu_num, cpu_manufacturer)); +@@ -471,6 +474,68 @@ smbios_type_1_init(void *start, const char *xen_version, + return start+1; + } + ++/* Type 2 -- System Board */ ++static void * ++smbios_type_2_init(void *start) ++{ ++ struct smbios_type_2 *p = (struct smbios_type_2 *)start; ++ struct hvm_sminfo_table *pa_sm; ++ struct hvm_smtable_header *header; ++ uint8_t *bptr; ++ ++ /* if passed a struct, use it */ ++ pa_sm = get_hvm_sminfo_table(); ++ while (pa_sm != NULL) { ++ header = get_sminfo_by_type(pa_sm, 2, NULL); ++ if (header == NULL) ++ break; ++ if (header->sm_length < sizeof(struct smbios_type_2)) ++ break; ++ memcpy(start, ((uint8_t*)header + sizeof(struct hvm_smtable_header)), header->sm_length); ++ ++ /* fix up some bits */ ++ p->header.handle = 0x200; ++ /* NOTE: if this code is enhanced to allow multiple instances of some tables like ++ this one, chassis info, etc. then work will have to be done to match these handles */ ++ if (header->sm_length >= 13) { ++ bptr = ((uint8_t*)start) + 11; ++ if (*((uint16_t*)bptr) != 0) ++ *((uint16_t*)bptr) = 0x300; /* current chassis handle */ ++ } ++ return (start + header->sm_length); ++ } ++ ++ /* fall back to building our own */ ++ memset(p, 0, sizeof(*p)); ++ ++ p->header.type = 2; ++ p->header.length = sizeof(struct smbios_type_2); ++ p->header.handle = 0x200; ++ ++ p->manufacturer_str = 1; ++ p->product_name_str = 2; ++ p->version_str = 0; ++ p->serial_number_str = 0; ++ ++ start += sizeof(struct smbios_type_2); ++ ++ strcpy((char *)start, sys_board_manufacturer.value); ++ start += strlen(sys_board_manufacturer.value) + 1; ++ ++ strcpy((char *)start, sys_board_product_name.value); ++ start += strlen(sys_board_product_name.value) + 1; ++ ++ /* no internal defaults for this if the value is not set */ ++ if ( strlen(sys_board_serial.value) != 0 ) { ++ strcpy((char *)start, sys_board_serial.value); ++ start += strlen(sys_board_serial.value) + 1; ++ p->serial_number_str = 3; ++ } ++ ++ *((uint8_t *)start) = 0; ++ return start+1; ++} ++ + /* Type 3 -- System Enclosure */ + static void * + smbios_type_3_init(void *start) +@@ -523,8 +588,6 @@ smbios_type_3_init(void *start) + start += strlen(sys_enclosure_serial.value) + 1; + p->serial_number_str = 2; + } +- else +- p->serial_number_str = 0; + + *((uint8_t *)start) = 0; + return start+1; +diff --git a/tools/firmware/hvmloader/smbios_types.h b/tools/firmware/hvmloader/smbios_types.h +index a867657..76c177e 100644 +--- a/tools/firmware/hvmloader/smbios_types.h ++++ b/tools/firmware/hvmloader/smbios_types.h +@@ -84,6 +84,15 @@ struct smbios_type_1 { + uint8_t family_str; + } __attribute__ ((packed)); + ++/* SMBIOS type 2 - Base Board Information */ ++struct smbios_type_2 { ++ struct smbios_structure_header header; ++ uint8_t manufacturer_str; ++ uint8_t product_name_str; ++ uint8_t version_str; ++ uint8_t serial_number_str; ++} __attribute__ ((packed)); ++ + /* SMBIOS type 3 - System Enclosure */ + struct smbios_type_3 { + struct smbios_structure_header header;