Index: /trunk/src/VBox/Devices/EFI/DevEFI.cpp
===================================================================
--- /trunk/src/VBox/Devices/EFI/DevEFI.cpp	(revision 26727)
+++ /trunk/src/VBox/Devices/EFI/DevEFI.cpp	(revision 26728)
@@ -480,11 +480,12 @@
                                &pThis->aUuid,
                                pDevIns->pCfg,
-                               true /* fPutSmbiosHeaders */);
+                               /*fPutSmbiosHeaders=*/true);
     Assert(RT_SUCCESS(rc));
 
     if (pThis->u8IOAPIC)
         FwCommonPlantMpsTable(pDevIns,
-                          pThis->au8DMIPage + VBOX_DMI_TABLE_SIZE,
-                          pThis->cCpus);
+                              pThis->au8DMIPage + VBOX_DMI_TABLE_SIZE,
+                              _4K - VBOX_DMI_TABLE_SIZE,
+                              pThis->cCpus);
     rc = PDMDevHlpROMRegister(pDevIns, VBOX_DMI_TABLE_BASE, _4K, pThis->au8DMIPage,
                               PGMPHYS_ROM_FLAGS_PERMANENT_BINARY, "DMI tables");
@@ -1145,5 +1146,5 @@
     pThis->u64TscFrequency = RTMpGetMaxFrequency(0) * 1024 * 1024;// TMCpuTicksPerSecond(PDMDevHlpGetVM(pDevIns));
     if (pThis->u64TscFrequency == 0)
-        pThis->u64TscFrequency = 2500000000;
+        pThis->u64TscFrequency = UINT64_C(2500000000);
     /* Multiplier is read from MSR_IA32_PERF_STATUS, and now is hardcoded as 4 */
     pThis->u64FsbFrequency = pThis->u64TscFrequency / 4;
Index: /trunk/src/VBox/Devices/PC/DevFwCommon.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevFwCommon.cpp	(revision 26727)
+++ /trunk/src/VBox/Devices/PC/DevFwCommon.cpp	(revision 26728)
@@ -338,5 +338,5 @@
  * @param   pDevIns             The device instance.
  * @param   pTable              Where to create the DMI table.
- * @param   cbMax               The max size of the DMI table.
+ * @param   cbMax               The maximum size of the DMI table.
  * @param   pUuid               Pointer to the UUID to use if the DmiUuid
  *                              configuration string isn't present.
@@ -344,5 +344,6 @@
  * @param   fPutSmbiosHeaders   Plant SMBIOS headers if true.
  */
-int FwCommonPlantDMITable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, PCRTUUID pUuid, PCFGMNODE pCfg, bool fPutSmbiosHeaders)
+int FwCommonPlantDMITable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, PCRTUUID pUuid,
+                          PCFGMNODE pCfg, bool fPutSmbiosHeaders)
 {
 #define CHECKSIZE(cbWant) \
@@ -418,4 +419,11 @@
     }
 
+#define TERM_STRUCT \
+    { \
+        *pszStr++                    = '\0'; /* terminate set of text strings */ \
+        if (iStrNr == 1) \
+            *pszStr++                = '\0'; /* terminate a structure without strings */ \
+    }
+
     bool fForceDefault = false;
 #ifdef VBOX_BIOS_DMI_FALLBACK
@@ -528,5 +536,5 @@
                                          /* any more?? */
                                          ;
-        *pszStr++                    = '\0';
+        TERM_STRUCT;
 
         /***********************************
@@ -569,5 +577,5 @@
         pSystemInf->u8SKUNumber      = 0;
         READCFGSTR(pSystemInf->u8Family, DmiSystemFamily);
-        *pszStr++                    = '\0';
+        TERM_STRUCT;
 
         /********************************************
@@ -602,5 +610,5 @@
         pChassis->u8ContElemRecLen   = 0; /* no contained elements */
 # endif
-        *pszStr++                    = '\0';
+        TERM_STRUCT;
 
         /*****************************
@@ -626,5 +634,5 @@
         RTStrPrintf(szTmp, sizeof(szTmp), "vboxRev_%u", RTBldCfgRevision());
         READCFGSTRDEF(pOEMStrings->u8VBoxRevision, "DmiOEMVBoxRev", szTmp);
-        *pszStr++                    = '\0';
+        TERM_STRUCT;
 
         /* End-of-table marker - includes padding to account for fixed table size. */
@@ -709,7 +717,9 @@
  *
  * @param   pDevIns    The device instance data.
- * @param   addr       physical address in guest memory.
+ * @param   pTable     Where to write the table.
+ * @param   cbMax      The maximum size of the MPS table.
+ * @param   cCpus      The number of guest CPUs.
  */
-void FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, uint16_t cCpus)
+void FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, uint16_t cCpus)
 {
     /* configuration table */
@@ -792,7 +802,7 @@
     pCfgTab->u8Checksum            = fwCommonChecksum(pTable, pCfgTab->u16Length);
 
-    AssertMsg(pCfgTab->u16Length < 0x1000 - 0x100,
+    AssertMsg(pCfgTab->u16Length < cbMax,
               ("VBOX_MPS_TABLE_SIZE=%d, maximum allowed size is %d",
-              pCfgTab->u16Length, 0x1000-0x100));
+              pCfgTab->u16Length, cbMax));
 
     MPSFLOATPTR floatPtr;
Index: /trunk/src/VBox/Devices/PC/DevFwCommon.h
===================================================================
--- /trunk/src/VBox/Devices/PC/DevFwCommon.h	(revision 26727)
+++ /trunk/src/VBox/Devices/PC/DevFwCommon.h	(revision 26728)
@@ -32,8 +32,9 @@
 
 /* Plant DMI table */
-int FwCommonPlantDMITable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, PCRTUUID pUuid, PCFGMNODE pCfg, bool fPutSmbiosHeaders);
+int FwCommonPlantDMITable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, PCRTUUID pUuid,
+                          PCFGMNODE pCfg, bool fPutSmbiosHeaders);
 
 /* Plant MPS table */
-void FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, uint16_t cCpus);
+void FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, uint16_t cCpus);
 
 #endif
Index: /trunk/src/VBox/Devices/PC/DevPcBios.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevPcBios.cpp	(revision 26727)
+++ /trunk/src/VBox/Devices/PC/DevPcBios.cpp	(revision 26728)
@@ -747,5 +747,6 @@
 
     if (pThis->u8IOAPIC)
-        FwCommonPlantMpsTable(pDevIns, pThis->au8DMIPage + VBOX_DMI_TABLE_SIZE, pThis->cCpus);
+        FwCommonPlantMpsTable(pDevIns, pThis->au8DMIPage + VBOX_DMI_TABLE_SIZE,
+                              _4K - VBOX_DMI_TABLE_SIZE, pThis->cCpus);
 
     /*
@@ -1022,9 +1023,11 @@
     uuid.Gen.u16TimeMid = RT_H2BE_U16(uuid.Gen.u16TimeMid);
     uuid.Gen.u16TimeHiAndVersion = RT_H2BE_U16(uuid.Gen.u16TimeHiAndVersion);
-    rc = FwCommonPlantDMITable(pDevIns, pThis->au8DMIPage, VBOX_DMI_TABLE_SIZE, &uuid, pCfg, false /*fPutSmbiosHeaders*/);
+    rc = FwCommonPlantDMITable(pDevIns, pThis->au8DMIPage,
+                               VBOX_DMI_TABLE_SIZE, &uuid, pCfg, /*fPutSmbiosHeaders=*/false);
     if (RT_FAILURE(rc))
         return rc;
     if (pThis->u8IOAPIC)
-        FwCommonPlantMpsTable(pDevIns, pThis->au8DMIPage + VBOX_DMI_TABLE_SIZE, pThis->cCpus);
+        FwCommonPlantMpsTable(pDevIns, pThis->au8DMIPage + VBOX_DMI_TABLE_SIZE,
+                              _4K - VBOX_DMI_TABLE_SIZE, pThis->cCpus);
 
     rc = PDMDevHlpROMRegister(pDevIns, VBOX_DMI_TABLE_BASE, _4K, pThis->au8DMIPage,
Index: /trunk/src/VBox/Devices/PC/DevPcBios.h
===================================================================
--- /trunk/src/VBox/Devices/PC/DevPcBios.h	(revision 26727)
+++ /trunk/src/VBox/Devices/PC/DevPcBios.h	(revision 26728)
@@ -27,5 +27,13 @@
 #define VBOX_DMI_TABLE_VER           0x25
 #define VBOX_DMI_TABLE_ENTR          5
-#define VBOX_DMI_TABLE_SIZE          0x100
+
+/** def VBOX_DMI_TABLE_SIZE
+ *
+ * Must not be bigger than the minimal size of the DMI tables + 255 because
+ * the length field of the the DMI end-of-table marker is 8 bits only. And
+ * the size should be at least 16-byte aligned for a proper alignment of
+ * the MPS table.
+ */
+#define VBOX_DMI_TABLE_SIZE          352
 
 /** @def VBOX_VMI_BIOS_BASE
@@ -38,4 +46,6 @@
 
 /** @def VBOX_LANBOOT_SEG
+ *
+ * Should usually start right after the DMI BIOS page
  */
 #define VBOX_LANBOOT_SEG             0xe200
