--- /dev/null
+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;