]> xenbits.xen.org Git - xenclient/xen-pq.git/commitdiff
Added SMBIOS table 2 pass-through support.
authorRoss Philipson <ross.philipson@citrix.com>
Tue, 4 Aug 2009 17:45:41 +0000 (13:45 -0400)
committerRoss Philipson <ross.philipson@citrix.com>
Tue, 4 Aug 2009 17:45:41 +0000 (13:45 -0400)
 Changes to be committed:
modified:   master/series
new file:   master/smbios-table2.patch

master/series
master/smbios-table2.patch [new file with mode: 0644]

index b6562a3cf062cb0d73993040319063de7901bffc..3469deabc993b8c5a1d04cb459ef4301a3e67fe4 100644 (file)
@@ -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 (file)
index 0000000..766bb65
--- /dev/null
@@ -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;