Index: /trunk/src/VBox/Devices/EFI/DevEFI.cpp
===================================================================
--- /trunk/src/VBox/Devices/EFI/DevEFI.cpp	(revision 43711)
+++ /trunk/src/VBox/Devices/EFI/DevEFI.cpp	(revision 43712)
@@ -96,8 +96,10 @@
     uint64_t        cbAbove4GB;
 
-    uint64_t cbRam;
-
-    uint64_t cbRamHole;
-
+    uint64_t        cbRam;
+
+    uint64_t        cbRamHole;
+
+    /** The size of the DMI tables */
+    uint16_t        cbDmiTables;
     /** The DMI tables. */
     uint8_t         au8DMIPage[0x1000];
@@ -113,7 +115,7 @@
 
     /* Device properties buffer */
-    uint8_t*           pu8DeviceProps;
+    uint8_t*        pu8DeviceProps;
     /* Device properties buffer size */
-    uint32_t           u32DevicePropsLen;
+    uint32_t        u32DevicePropsLen;
 
     /* Virtual machine front side bus frequency */
@@ -474,5 +476,5 @@
      * Plan some structures in RAM.
      */
-    FwCommonPlantSmbiosAndDmiHdrs(pDevIns);
+    FwCommonPlantSmbiosAndDmiHdrs(pDevIns, pThis->cbDmiTables);
     if (pThis->u8IOAPIC)
         FwCommonPlantMpsFloatPtr(pDevIns);
@@ -1018,26 +1020,33 @@
                               "UUID\0"
                               "IOAPIC\0"
-                              "DmiBIOSVendor\0"
-                              "DmiBIOSVersion\0"
+                              "DmiBIOSFirmwareMajor\0"
+                              "DmiBIOSFirmwareMinor\0"
                               "DmiBIOSReleaseDate\0"
                               "DmiBIOSReleaseMajor\0"
                               "DmiBIOSReleaseMinor\0"
-                              "DmiBIOSFirmwareMajor\0"
-                              "DmiBIOSFirmwareMinor\0"
-                              "DmiSystemSKU\0"
+                              "DmiBIOSVendor\0"
+                              "DmiBIOSVersion\0"
                               "DmiSystemFamily\0"
                               "DmiSystemProduct\0"
                               "DmiSystemSerial\0"
+                              "DmiSystemSKU\0"
                               "DmiSystemUuid\0"
                               "DmiSystemVendor\0"
                               "DmiSystemVersion\0"
+                              "DmiBoardAssetTag\0"
+                              "DmiBoardBoardType\0"
+                              "DmiBoardLocInChass\0"
+                              "DmiBoardProduct\0"
+                              "DmiBoardSerial\0"
+                              "DmiBoardVendor\0"
+                              "DmiBoardVersion\0"
+                              "DmiChassisAssetTag\0"
+                              "DmiChassisSerial\0"
                               "DmiChassisVendor\0"
                               "DmiChassisVersion\0"
-                              "DmiChassisSerial\0"
-                              "DmiChassisAssetTag\0"
-#ifdef VBOX_WITH_DMI_OEMSTRINGS
+                              "DmiProcManufacturer\0"
+                              "DmiProcVersion\0"
                               "DmiOEMVBoxVer\0"
                               "DmiOEMVBoxRev\0"
-#endif
                               "DmiUseHostInfo\0"
                               "DmiExposeMemoryTable\0"
@@ -1227,7 +1236,6 @@
      * XXX I wonder if we really need these tables as there is no SMBIOS header...
      */
-    uint16_t cbDmiTablesDummy;
     rc = FwCommonPlantDMITable(pDevIns, pThis->au8DMIPage, VBOX_DMI_TABLE_SIZE, &pThis->aUuid,
-                               pDevIns->pCfg, pThis->cCpus, &cbDmiTablesDummy);
+                               pDevIns->pCfg, pThis->cCpus, &pThis->cbDmiTables);
     AssertRCReturn(rc, rc);
     if (pThis->u8IOAPIC)
Index: /trunk/src/VBox/Devices/EFI/DevOVMF.cpp
===================================================================
--- /trunk/src/VBox/Devices/EFI/DevOVMF.cpp	(revision 43711)
+++ /trunk/src/VBox/Devices/EFI/DevOVMF.cpp	(revision 43712)
@@ -124,8 +124,10 @@
     uint64_t        cbAbove4GB;
 
-    uint64_t cbRam;
-
-    uint64_t cbRamHole;
-
+    uint64_t        cbRam;
+
+    uint64_t        cbRamHole;
+
+    /** The size of the DMI tables */
+    uint16_t        cbDmiTables;
     /** The DMI tables. */
     uint8_t         au8DMIPage[0x1000];
@@ -141,7 +143,7 @@
 
     /* Device properties buffer */
-    uint8_t*           pu8DeviceProps;
+    uint8_t*        pu8DeviceProps;
     /* Device properties buffer size */
-    uint32_t           u32DevicePropsLen;
+    uint32_t        u32DevicePropsLen;
 
     /* Virtual machine front side bus frequency */
@@ -157,5 +159,6 @@
     uint32_t        u32UgaVertical;
     NVRAMDESC       NVRAM;
-    struct {
+    struct
+    {
         PPDMIBASE    pDrvBase;
         PDMIBASE     IBase;
@@ -906,5 +909,5 @@
      * Plan some structures in RAM.
      */
-    FwCommonPlantSmbiosAndDmiHdrs(pDevIns);
+    FwCommonPlantSmbiosAndDmiHdrs(pDevIns, pThis->cbDmiTables);
     if (pThis->u8IOAPIC)
         FwCommonPlantMpsFloatPtr(pDevIns);
@@ -1219,26 +1222,33 @@
                               "UUID\0"
                               "IOAPIC\0"
-                              "DmiBIOSVendor\0"
-                              "DmiBIOSVersion\0"
+                              "DmiBIOSFirmwareMajor\0"
+                              "DmiBIOSFirmwareMinor\0"
                               "DmiBIOSReleaseDate\0"
                               "DmiBIOSReleaseMajor\0"
                               "DmiBIOSReleaseMinor\0"
-                              "DmiBIOSFirmwareMajor\0"
-                              "DmiBIOSFirmwareMinor\0"
-                              "DmiSystemSKU\0"
+                              "DmiBIOSVendor\0"
+                              "DmiBIOSVersion\0"
                               "DmiSystemFamily\0"
                               "DmiSystemProduct\0"
                               "DmiSystemSerial\0"
+                              "DmiSystemSKU\0"
                               "DmiSystemUuid\0"
                               "DmiSystemVendor\0"
                               "DmiSystemVersion\0"
+                              "DmiBoardAssetTag\0"
+                              "DmiBoardBoardType\0"
+                              "DmiBoardLocInChass\0"
+                              "DmiBoardProduct\0"
+                              "DmiBoardSerial\0"
+                              "DmiBoardVendor\0"
+                              "DmiBoardVersion\0"
+                              "DmiChassisAssetTag\0"
+                              "DmiChassisSerial\0"
                               "DmiChassisVendor\0"
                               "DmiChassisVersion\0"
-                              "DmiChassisSerial\0"
-                              "DmiChassisAssetTag\0"
-#ifdef VBOX_WITH_DMI_OEMSTRINGS
+                              "DmiProcManufacturer\0"
+                              "DmiProcVersion\0"
                               "DmiOEMVBoxVer\0"
                               "DmiOEMVBoxRev\0"
-#endif
                               "DmiUseHostInfo\0"
                               "DmiExposeMemoryTable\0"
@@ -1447,5 +1457,5 @@
     uint16_t cbDmiTablesDummy;
     rc = FwCommonPlantDMITable(pDevIns, pThis->au8DMIPage, VBOX_DMI_TABLE_SIZE, &pThis->aUuid,
-                               pDevIns->pCfg, pThis->cCpus, &cbDmiTablesDummy);
+                               pDevIns->pCfg, pThis->cCpus, &pThis->cbDmiTables);
     AssertRCReturn(rc, rc);
     if (pThis->u8IOAPIC)
Index: /trunk/src/VBox/Devices/PC/BIOS/orgs.asm
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS/orgs.asm	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/BIOS/orgs.asm	(revision 43712)
@@ -1790,2 +1790,3 @@
 
 		end
+
Index: /trunk/src/VBox/Devices/PC/BIOS/smidmi.inc
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS/smidmi.inc	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/BIOS/smidmi.inc	(revision 43712)
@@ -64,7 +64,7 @@
 		db	'_DMI_'		; signature
 		db	0		; checksum (set by biossums)
-		dw	VBOX_DMI_TABLE_SIZE	; DMI tables length
-		dd	VBOX_DMI_TABLE_BASE	; DMI tables base
-		dw	VBOX_DMI_TABLE_ENTR	; DMI tables entries
-		db	VBOX_DMI_TABLE_VER	; DMI version
+		dw	0	        ; DMI tables length (set by DevPcBios)
+		dd	VBOX_DMI_TABLE_BASE ; DMI tables base
+		dw	VBOX_DMI_TABLE_ENTR ; DMI tables entries
+		db	VBOX_DMI_TABLE_VER ; DMI version
 		db	0		; Just for alignment (16 bytes total)
Index: /trunk/src/VBox/Devices/PC/BIOS/vbdmismi.inc
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS/vbdmismi.inc	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/BIOS/vbdmismi.inc	(revision 43712)
@@ -3,5 +3,5 @@
 VBOX_DMI_TABLE_BASE	equ	0E1000h
 VBOX_DMI_TABLE_VER	equ	25h
-VBOX_DMI_TABLE_ENTR	equ	5
+VBOX_DMI_TABLE_ENTR	equ	9
 VBOX_DMI_TABLE_SIZE	equ	352
 
Index: /trunk/src/VBox/Devices/PC/DevFwCommon.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevFwCommon.cpp	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/DevFwCommon.cpp	(revision 43712)
@@ -631,5 +631,4 @@
         CHECKSIZE(sizeof(*pSystemInf));
         START_STRUCT(pSystemInf);
-        iStrNr                       = 1;
         pSystemInf->header.u8Type    = 1; /* System Information */
         pSystemInf->header.u8Length  = sizeof(*pSystemInf);
@@ -671,6 +670,5 @@
         PDMIBOARDINF pBoardInf       = (PDMIBOARDINF)pszStr;
         CHECKSIZE(sizeof(*pBoardInf));
-        pszStr                       = (char *)(pBoardInf + 1);
-        iStrNr                       = 1;
+        START_STRUCT(pBoardInf);
         int iDmiBoardBoardType;
         pBoardInf->header.u8Type     = 2; /* Board Information */
@@ -737,5 +735,4 @@
         CHECKSIZE(sizeof(*pProcessorInf));
         START_STRUCT(pProcessorInf);
-        iStrNr                             = 1;
         if (fDmiExposeProcessorInf)
             pProcessorInf->header.u8Type   = 4; /* Processor Information */
@@ -855,5 +852,4 @@
         CHECKSIZE(sizeof(*pOEMStrings));
         START_STRUCT(pOEMStrings);
-        iStrNr                        = 1;
 #ifdef VBOX_WITH_DMI_OEMSTRINGS
         pOEMStrings->header.u8Type    = 0xb; /* OEM Strings */
@@ -900,5 +896,5 @@
  * @param   pDevIns    The device instance data.
  */
-void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns)
+void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns, uint16_t cbDmiTables)
 {
     struct
@@ -906,5 +902,6 @@
         struct SMBIOSHDR     smbios;
         struct DMIMAINHDR    dmi;
-    } aBiosHeaders =
+    }
+    aBiosHeaders =
     {
         // The SMBIOS header
@@ -923,5 +920,5 @@
             { 0x5f, 0x44, 0x4d, 0x49, 0x5f },  // "_DMI_" signature
             0x00,                              // checksum
-            VBOX_DMI_TABLE_SIZE,               // DMI tables length
+            0,                                 // DMI tables length
             VBOX_DMI_TABLE_BASE,               // DMI tables base
             VBOX_DMI_TABLE_ENTR,               // DMI tables entries
@@ -930,6 +927,7 @@
     };
 
-    aBiosHeaders.smbios.u8Checksum = fwCommonChecksum((uint8_t*)&aBiosHeaders.smbios, sizeof(aBiosHeaders.smbios));
-    aBiosHeaders.dmi.u8Checksum    = fwCommonChecksum((uint8_t*)&aBiosHeaders.dmi,    sizeof(aBiosHeaders.dmi));
+    aBiosHeaders.dmi.u16TablesLength = cbDmiTables;
+    aBiosHeaders.smbios.u8Checksum   = fwCommonChecksum((uint8_t*)&aBiosHeaders.smbios, sizeof(aBiosHeaders.smbios));
+    aBiosHeaders.dmi.u8Checksum      = fwCommonChecksum((uint8_t*)&aBiosHeaders.dmi,    sizeof(aBiosHeaders.dmi));
 
     PDMDevHlpPhysWrite(pDevIns, 0xfe300, &aBiosHeaders, sizeof(aBiosHeaders));
Index: /trunk/src/VBox/Devices/PC/DevFwCommon.h
===================================================================
--- /trunk/src/VBox/Devices/PC/DevFwCommon.h	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/DevFwCommon.h	(revision 43712)
@@ -29,5 +29,5 @@
 /* Plant DMI table */
 int FwCommonPlantDMITable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, PCRTUUID pUuid, PCFGMNODE pCfg, uint16_t cCpus, uint16_t *pcbDmiTables);
-void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns);
+void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns, uint16_t cbDmiTables);
 
 /* Plant MPS table */
Index: /trunk/src/VBox/Devices/PC/DevPcBios.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevPcBios.cpp	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/DevPcBios.cpp	(revision 43712)
@@ -1171,6 +1171,4 @@
     }
 
-    const uint8_t  *pu8PcBiosBinary;
-    uint32_t        cbPcBiosBinary;
     if (pThis->pszPcBiosFile)
     {
@@ -1242,6 +1240,6 @@
                                        g_cbPcBiosBinary);
     }
-    pu8PcBiosBinary = pThis->pu8PcBios;
-    cbPcBiosBinary  = pThis->cbPcBios;
+    const uint8_t *pu8PcBiosBinary = pThis->pu8PcBios;
+    uint32_t       cbPcBiosBinary  = pThis->cbPcBios;
 
     /*
@@ -1264,17 +1262,22 @@
         return rc;
 
-    /* If the DMI table is located at the expected place, patch the DMI table length and the checksum. */
-    if (   pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x00] == '_'
-        && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x01] == 'D'
-        && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x02] == 'M'
-        && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x03] == 'I'
-        && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x04] == '_')
-    {
-        *(uint16_t*)&pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x06] = cbDmiTables;
-        uint8_t u8Sum = 0;
-        for (unsigned i = 0; i < pThis->cbPcBios; i++)
-            if (i != VBOX_DMI_TABLE_OFFSET + 0x05)
-                u8Sum += pThis->pu8PcBios[i];
-        pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x05] = -u8Sum;
+    for (unsigned i = 0; i < pThis->cbPcBios; i += 16)
+    {
+        /* If the DMI table is located at the expected place, patch the DMI table length and the checksum. */
+        if (   pThis->pu8PcBios[i + 0x00] == '_'
+            && pThis->pu8PcBios[i + 0x01] == 'D'
+            && pThis->pu8PcBios[i + 0x02] == 'M'
+            && pThis->pu8PcBios[i + 0x03] == 'I'
+            && pThis->pu8PcBios[i + 0x04] == '_'
+            && *(uint16_t*)&pThis->pu8PcBios[i + 0x06] == 0)
+        {
+            *(uint16_t*)&pThis->pu8PcBios[i + 0x06] = cbDmiTables;
+            uint8_t u8Sum = 0;
+            for (unsigned j = 0; j < pThis->cbPcBios; j++)
+                if (j != i + 0x05)
+                    u8Sum += pThis->pu8PcBios[j];
+            pThis->pu8PcBios[i + 0x05] = -u8Sum;
+            break;
+        }
     }
 
Index: /trunk/src/VBox/Devices/PC/DevPcBios.h
===================================================================
--- /trunk/src/VBox/Devices/PC/DevPcBios.h	(revision 43711)
+++ /trunk/src/VBox/Devices/PC/DevPcBios.h	(revision 43712)
@@ -28,5 +28,4 @@
  */
 #define VBOX_DMI_TABLE_ENTR         9
-#define VBOX_DMI_TABLE_OFFSET       0xff40
 
 /** def VBOX_DMI_TABLE_SIZE
