Index: /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 24070)
+++ /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 24071)
@@ -1,7 +1,5 @@
 /* $Id$ */
 /** @file
- *
- * VBox storage devices:
- * LsiLogic LSI53c1030 SCSI controller.
+ * VBox storage devices: LsiLogic LSI53c1030 SCSI controller.
  */
 
@@ -21,4 +19,5 @@
  * additional information or have any questions.
  */
+
 //#define DEBUG
 #define LOG_GROUP LOG_GROUP_DEV_LSILOGICSCSI
@@ -65,5 +64,9 @@
 #define LSILOGICSCSI_PCI_SUBSYSTEM_ID         (0x8000)
 
-#define LSILOGIC_SAVED_STATE_MINOR_VERSION 1
+/** The current saved state version. */
+#define LSILOGIC_SAVED_STATE_VERSION          2
+/** The saved state version used by VirtualBox 3.0 and earlier.  It does not
+ * include the device config part. */
+#define LSILOGIC_SAVED_STATE_VERSION_VBOX_30  1
 
 /**
@@ -4794,5 +4797,5 @@
      */
     u64Start = RTTimeMilliTS();
-    do
+    for (;;)
     {
         fIdle = true;
@@ -4808,12 +4811,24 @@
             }
         }
-        if (RTTimeMilliTS() - u64Start >= cMillies)
+        if (   fIdle
+            || RTTimeMilliTS() - u64Start >= cMillies)
             break;
 
         /* Sleep for a bit. */
-        RTThreadSleep(100);
-    } while (!fIdle);
+        RTThreadSleep(100); /** @todo wait on something which can be woken up. 100ms is too long for teleporting VMs! */
+    }
 
     return fIdle;
+}
+
+static DECLCALLBACK(int) lsilogicLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
+{
+    PLSILOGICSCSI pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
+
+    /* Save the device config. */
+    for (unsigned i = 0; i < RT_ELEMENTS(pThis->aDeviceStates); i++)
+        SSMR3PutBool(pSSM, pThis->aDeviceStates[i].pDrvBase != NULL);
+
+    return VINF_SSM_DONT_CALL_AGAIN;
 }
 
@@ -4837,4 +4852,5 @@
 
     /* Every device first. */
+    lsilogicSaveLoadPrep(pDevIns, pSSM);
     for (unsigned i = 0; i < RT_ELEMENTS(pLsiLogic->aDeviceStates); i++)
     {
@@ -4896,10 +4912,29 @@
 static DECLCALLBACK(int) lsilogicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
 {
-    PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
-
-    /* We support saved states only from this and older versions. */
-    if (uVersion > LSILOGIC_SAVED_STATE_MINOR_VERSION)
+    PLSILOGICSCSI   pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
+    int             rc;
+
+    if (    uVersion != LSILOGIC_SAVED_STATE_VERSION
+        &&  uVersion != LSILOGIC_SAVED_STATE_VERSION_VBOX_30)
         return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
-    Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
+
+    /* device config */
+    if (uVersion > LSILOGIC_SAVED_STATE_VERSION_VBOX_30)
+    {
+        for (unsigned i = 0; i < RT_ELEMENTS(pLsiLogic->aDeviceStates); i++)
+        {
+            bool fPresent;
+            rc = SSMR3GetBool(pSSM, &fPresent);
+            AssertRCReturn(rc, rc);
+            if (fPresent != (pLsiLogic->aDeviceStates[i].pDrvBase != NULL))
+            {
+                LogRel(("LsiLogic: Target %u config mismatch: config=%RTbool state=%RTbool\n",
+                        i, pLsiLogic->aDeviceStates[i].pDrvBase != NULL, fPresent));
+                return VERR_SSM_LOAD_CONFIG_MISMATCH;
+            }
+        }
+    }
+    if (uPass != SSM_PASS_FINAL)
+        return VINF_SUCCESS;
 
     /* Every device first. */
@@ -4968,5 +5003,5 @@
 
     uint32_t u32;
-    int rc = SSMR3GetU32(pSSM, &u32);
+    rc = SSMR3GetU32(pSSM, &u32);
     if (RT_FAILURE(rc))
         return rc;
@@ -5414,6 +5449,6 @@
 
     /* Register save state handlers. */
-    rc = PDMDevHlpSSMRegisterEx(pDevIns, LSILOGIC_SAVED_STATE_MINOR_VERSION, sizeof(*pThis), NULL,
-                                NULL, NULL, NULL,
+    rc = PDMDevHlpSSMRegisterEx(pDevIns, LSILOGIC_SAVED_STATE_VERSION, sizeof(*pThis), NULL,
+                                NULL,                 lsilogicLiveExec, NULL,
                                 lsilogicSaveLoadPrep, lsilogicSaveExec, NULL,
                                 lsilogicSaveLoadPrep, lsilogicLoadExec, NULL);
@@ -5489,2 +5524,3 @@
 #endif /* IN_RING3 */
 #endif /* !VBOX_DEVICE_STRUCT_TESTCASE */
+
