Index: src/VBox/Devices/EFI/DevEFI.cpp
===================================================================
--- src/VBox/Devices/EFI/DevEFI.cpp	(revision 100800)
+++ src/VBox/Devices/EFI/DevEFI.cpp	(working copy)
@@ -1557,7 +1557,9 @@
                                   "UgaHorizontalResolution|"   // legacy
                                   "UgaVerticalResolution|"     // legacy
                                   "GraphicsResolution|"
-                                  "NvramFile", "");
+                                  "NvramFile|"
+                                  "MpsOEMId|"
+                                  "MpsProductId", "");
 
     /* CPU count (optional). */
     rc = pHlp->pfnCFGMQueryU32Def(pCfg, "NumCPUs", &pThisCC->cCpus, 1);
@@ -1787,9 +1789,10 @@
 
     if (pThisCC->u8IOAPIC)
     {
-        FwCommonPlantMpsTable(pDevIns,
-                              pThisCC->au8DMIPage /* aka VBOX_DMI_TABLE_BASE */ + VBOX_DMI_TABLE_SIZE + VBOX_DMI_HDR_SIZE,
-                              _4K - VBOX_DMI_TABLE_SIZE - VBOX_DMI_HDR_SIZE, pThisCC->cCpus);
+        rc = FwCommonPlantMpsTable(pDevIns,
+                                   pThisCC->au8DMIPage /* aka VBOX_DMI_TABLE_BASE */ + VBOX_DMI_TABLE_SIZE + VBOX_DMI_HDR_SIZE,
+                                   _4K - VBOX_DMI_TABLE_SIZE - VBOX_DMI_HDR_SIZE, pThisCC->cCpus);
+        AssertRCReturn(rc, rc);
         FwCommonPlantMpsFloatPtr(pDevIns, VBOX_DMI_TABLE_BASE + VBOX_DMI_TABLE_SIZE + VBOX_DMI_HDR_SIZE);
     }
 
Index: src/VBox/Devices/PC/DevFwCommon.cpp
===================================================================
--- src/VBox/Devices/PC/DevFwCommon.cpp	(revision 100800)
+++ src/VBox/Devices/PC/DevFwCommon.cpp	(working copy)
@@ -1088,6 +1088,29 @@
 }
 
 /**
+ * Copies pszSrc into pu8Dest with up to cbRequiredLen characters.
+ * If pszSrc is shorter, the string is padded with whitespaces.
+ * If pszSrc is longer than the required length, extraneous chars are discarded.
+ * 
+ * @param pu8Dest          Pointer to destination array.
+ * @param pszSrc           Pointer to source string.
+ * @param cbRequiredLen    Size of the destionation array.
+ */
+static void fwSetPaddedString(uint8_t *pu8Dest, const char *pszSrc, size_t cbRequiredLen)
+{
+    size_t cbSrc = strlen(pszSrc);
+    if (cbSrc >= cbRequiredLen)
+    {
+        memcpy(pu8Dest, pszSrc, cbRequiredLen);
+    }
+    else
+    {
+        memcpy(pu8Dest, pszSrc, cbSrc);
+        memset(&pu8Dest[cbSrc], ' ', cbRequiredLen - cbSrc);
+    }
+}
+
+/**
  * Construct the MPS table for implanting as a ROM page.
  *
  * Only applicable if IOAPIC is active!
@@ -1118,16 +1141,31 @@
  * @param   cbMax      The maximum size of the MPS table.
  * @param   cCpus      The number of guest CPUs.
  */
-void FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, uint16_t cCpus)
+int FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, uint16_t cCpus)
 {
     RT_NOREF1(cbMax);
 
+    PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3;
+    PCFGMNODE pCfg = pDevIns->pCfg;
+
+    char *pszMpsOemId;
+    int rc = pHlp->pfnCFGMQueryStringAllocDef(pCfg, "MpsOEMId", &pszMpsOemId, "VBOXCPU ");
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Querying \"MpsOEMId\" failed"));
+
+    char *pszMpsProductId;
+    rc = pHlp->pfnCFGMQueryStringAllocDef(pCfg, "MpsProductId", &pszMpsProductId, "VirtualBox  ");
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Querying \"MpsProductId\" failed"));
+
     /* configuration table */
     PMPSCFGTBLHEADER pCfgTab      = (MPSCFGTBLHEADER*)pTable;
     memcpy(pCfgTab->au8Signature, "PCMP", 4);
     pCfgTab->u8SpecRev             =  4;    /* 1.4 */
-    memcpy(pCfgTab->au8OemId, "VBOXCPU ", 8);
-    memcpy(pCfgTab->au8ProductId, "VirtualBox  ", 12);
+    fwSetPaddedString(pCfgTab->au8OemId, pszMpsOemId, sizeof(pCfgTab->au8OemId));
+    fwSetPaddedString(pCfgTab->au8ProductId, pszMpsProductId, sizeof(pCfgTab->au8ProductId));
     pCfgTab->u32OemTablePtr        =  0;
     pCfgTab->u16OemTableSize       =  0;
     pCfgTab->u16EntryCount         =  0;    /* Incremented as we go. */
@@ -1246,6 +1284,8 @@
     AssertMsg(pCfgTab->u16Length < cbMax,
               ("VBOX_MPS_TABLE_SIZE=%d, maximum allowed size is %d",
               pCfgTab->u16Length, cbMax));
+
+    return VINF_SUCCESS;
 }
 
 /**
Index: src/VBox/Devices/PC/DevFwCommon.h
===================================================================
--- src/VBox/Devices/PC/DevFwCommon.h	(revision 100800)
+++ src/VBox/Devices/PC/DevFwCommon.h	(working copy)
@@ -39,7 +39,7 @@
 void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns, uint8_t *pHdr, uint16_t cbDmiTables, uint16_t cNumDmiTables);
 
 /* Plant MPS table */
-void FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, uint16_t cCpus);
+int FwCommonPlantMpsTable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, uint16_t cCpus);
 void FwCommonPlantMpsFloatPtr(PPDMDEVINS pDevIns, uint32_t u32MpTableAddr);
 
 #endif /* !VBOX_INCLUDED_SRC_PC_DevFwCommon_h */
Index: src/VBox/Devices/PC/DevPcBios.cpp
===================================================================
--- src/VBox/Devices/PC/DevPcBios.cpp	(revision 100800)
+++ src/VBox/Devices/PC/DevPcBios.cpp	(working copy)
@@ -1462,6 +1462,8 @@
                                   "|DmiExposeProcInf"
                                   "|CheckShutdownStatusForSoftReset"
                                   "|ClearShutdownStatusOnHardReset"
+                                  "|MpsOEMId"
+                                  "|MpsProductId"
                                   ,
                                   "NetBoot");
     /*
@@ -1823,8 +1825,10 @@
     if (pThis->u8IOAPIC)
     {
         pThis->u32MPTableAddr = VBOX_DMI_TABLE_BASE + VBOX_DMI_TABLE_SIZE;
-        FwCommonPlantMpsTable(pDevIns, pThis->au8DMIPage /* aka VBOX_DMI_TABLE_BASE */ + VBOX_DMI_TABLE_SIZE,
-                              _4K - VBOX_DMI_TABLE_SIZE, pThis->cCpus);
+        rc = FwCommonPlantMpsTable(pDevIns, pThis->au8DMIPage /* aka VBOX_DMI_TABLE_BASE */ + VBOX_DMI_TABLE_SIZE,
+                                   _4K - VBOX_DMI_TABLE_SIZE, pThis->cCpus);
+        if (RT_FAILURE(rc))
+            return rc;
         LogRel(("PcBios: MPS table at %08x\n", pThis->u32MPTableAddr));
     }
 
