Index: /trunk/src/VBox/VMM/PDM.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDM.cpp	(revision 23583)
+++ /trunk/src/VBox/VMM/PDM.cpp	(revision 23584)
@@ -660,5 +660,5 @@
         SSMR3PutU32(pSSM, pDevIns->iInstance);
     }
-    return SSMR3PutU32(pSSM, ~0); /* terminator */
+    return SSMR3PutU32(pSSM, UINT32_MAX); /* terminator */
 }
 
@@ -819,24 +819,22 @@
     /*
      * Load the list of devices and verify that they are all there.
-     *
-     * We boldly ASSUME that the order is fixed and that it's a good, this
-     * makes it way easier to validate...
-     */
-    uint32_t i = 0;
-    PPDMDEVINS pDevIns = pVM->pdm.s.pDevInstances;
-    for (;; pDevIns = pDevIns->Internal.s.pNextR3, i++)
-    {
-        /* Get the separator / terminator. */
+     */
+    for (PPDMDEVINS pDevIns = pVM->pdm.s.pDevInstances; pDevIns; pDevIns = pDevIns->Internal.s.pNextR3)
+        pDevIns->Internal.s.fIntFlags &= PDMDEVINSINT_FLAGS_FOUND;
+
+    for (uint32_t i = 0; ; i++)
+    {
+        /* Get the sequence number / terminator. */
         uint32_t    u32Sep;
         int rc = SSMR3GetU32(pSSM, &u32Sep);
         if (RT_FAILURE(rc))
             return rc;
-        if (u32Sep == (uint32_t)~0)
+        if (u32Sep == UINT32_MAX)
             break;
         if (u32Sep != i)
             AssertMsgFailedReturn(("Out of seqence. u32Sep=%#x i=%#x\n", u32Sep, i), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
 
-        /* get the name and instance number. */
-        char szDeviceName[sizeof(pDevIns->pDevReg->szDeviceName)];
+        /* Get the name and instance number. */
+        char szDeviceName[RT_SIZEOFMEMB(PDMDEVREG, szDeviceName)];
         rc = SSMR3GetStrZ(pSSM, szDeviceName, sizeof(szDeviceName));
         if (RT_FAILURE(rc))
@@ -847,5 +845,14 @@
             return rc;
 
-        /* compare */
+        /* Try locate it. */
+        PPDMDEVINS pDevIns;
+        for (pDevIns = pVM->pdm.s.pDevInstances; pDevIns; pDevIns = pDevIns->Internal.s.pNextR3)
+            if (   !strcmp(szDeviceName, pDevIns->pDevReg->szDeviceName)
+                && pDevIns->iInstance == iInstance)
+            {
+                AssertLogRelReturn(!(pDevIns->Internal.s.fIntFlags & PDMDEVINSINT_FLAGS_FOUND), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+                pDevIns->Internal.s.fIntFlags |= PDMDEVINSINT_FLAGS_FOUND;
+                break;
+            }
         if (!pDevIns)
         {
@@ -853,25 +860,17 @@
             if (SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
                 AssertFailedReturn(VERR_SSM_LOAD_CONFIG_MISMATCH);
-            break;
-        }
-        if (    strcmp(szDeviceName, pDevIns->pDevReg->szDeviceName)
-            ||  pDevIns->iInstance != iInstance)
-        {
-            LogRel(("u32Sep=%d loaded '%s'/%d  configured '%s'/%d\n",
-                    u32Sep, szDeviceName, iInstance, pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
+        }
+    }
+
+    /*
+     * Check that no additional devices were configured.
+     */
+    for (PPDMDEVINS pDevIns = pVM->pdm.s.pDevInstances; pDevIns; pDevIns = pDevIns->Internal.s.pNextR3)
+        if (!(pDevIns->Internal.s.fIntFlags & PDMDEVINSINT_FLAGS_FOUND))
+        {
+            LogRel(("Device '%s'/%d not found in the saved state\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
             if (SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
                 AssertFailedReturn(VERR_SSM_LOAD_CONFIG_MISMATCH);
         }
-    }
-
-    /*
-     * Too many devices?
-     */
-    if (pDevIns)
-    {
-        LogRel(("Device '%s'/%d not found in saved state\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
-        if (SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
-            AssertFailedReturn(VERR_SSM_LOAD_CONFIG_MISMATCH);
-    }
 
     return VINF_SUCCESS;
Index: /trunk/src/VBox/VMM/PDMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/PDMInternal.h	(revision 23583)
+++ /trunk/src/VBox/VMM/PDMInternal.h	(revision 23584)
@@ -126,7 +126,14 @@
     /** RC pointer to associated PCI bus structure. */
     RCPTRTYPE(PPDMPCIBUS)           pPciBusRC;
-    /** Alignment padding. */
-    RTRCPTR                         Alignment1;
+
+    /** Flags, see PDMDEVINSINT_FLAGS_XXX. */
+    uint32_t                        fIntFlags;
 } PDMDEVINSINT;
+
+/** @name PDMDEVINSINT::fIntFlags
+ * @{ */
+/** Used by pdmR3Load to mark device instances it found in the saved state. */
+#define PDMDEVINSINT_FLAGS_FOUND         RT_BIT_32(0)
+/** @} */
 
 
