Index: /trunk/src/VBox/Devices/Graphics/DevVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 23984)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 23985)
@@ -2636,12 +2636,7 @@
     uint32_t u32Dummy;
 
+#ifndef VBOX /* checked by the caller. */
     if (version_id > VGA_SAVEDSTATE_VERSION)
-#ifndef VBOX
         return -EINVAL;
-#else /* VBOX */
-    {
-        Log(("vga_load: version_id=%d - UNKNOWN\n", version_id));
-        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
-    }
 #endif /* VBOX */
 
@@ -4607,6 +4602,9 @@
 
     src = pThis->vram_ptrR3;
-    if (src) {
-        for (col = 0; col < num_cols; ++col) pHlp->pfnPrintf(pHlp, "-"); pHlp->pfnPrintf(pHlp, "\n");
+    if (src)
+    {
+        for (col = 0; col < num_cols; ++col)
+            pHlp->pfnPrintf(pHlp, "-");
+        pHlp->pfnPrintf(pHlp, "\n");
         for (row = 0; row < num_rows; ++row)
         {
@@ -4618,5 +4616,7 @@
             pHlp->pfnPrintf(pHlp, "\n");
         }
-        for (col = 0; col < num_cols; ++col) pHlp->pfnPrintf(pHlp, "-"); pHlp->pfnPrintf(pHlp, "\n");
+        for (col = 0; col < num_cols; ++col)
+            pHlp->pfnPrintf(pHlp, "-");
+        pHlp->pfnPrintf(pHlp, "\n");
     }
     else
@@ -5344,18 +5344,38 @@
 
 
-/* -=-=-=-=-=- Ring3: Misc Wrappers -=-=-=-=-=- */
+/* -=-=-=-=-=- Ring3: Misc Wrappers & Sidekicks -=-=-=-=-=- */
 
 /**
- * Saves a state of the VGA device.
- *
- * @returns VBox status code.
- * @param   pDevIns     The device instance.
- * @param   pSSMHandle  The handle to save the state to.
+ * Saves a important bits of the VGA device config.
+ *
+ * @param   pThis       The VGA instance data.
+ * @param   pSSM        The saved state handle.
  */
-static DECLCALLBACK(int) vgaR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
-{
-    vga_save(pSSMHandle, PDMINS_2_DATA(pDevIns, PVGASTATE));
-#ifdef VBOX_WITH_HGSMI
-    return vboxVBVASaveStateExec(pDevIns, pSSMHandle);
+static void vgaR3SaveConfig(PVGASTATE pThis, PSSMHANDLE pSSM)
+{
+    SSMR3PutU32(pSSM, pThis->vram_size);
+    SSMR3PutU32(pSSM, pThis->cMonitors);
+}
+
+
+/**
+ * @copydoc FNSSMDEVLIVEEXEC
+ */
+static DECLCALLBACK(int) vgaR3LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
+{
+    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
+    Assert(uPass == 0); NOREF(uPass);
+    vgaR3SaveConfig(pThis, pSSM);
+    return VINF_SSM_DONT_CALL_AGAIN;
+}
+
+
+/**
+ * @copydoc FNSSMDEVSAVEPREP
+ */
+static DECLCALLBACK(int) vgaR3SavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
+{
+#ifdef VBOX_WITH_VIDEOHWACCEL
+    return vboxVBVASaveStatePrep(pDevIns, pSSM);
 #else
     return VINF_SUCCESS;
@@ -5363,40 +5383,92 @@
 }
 
-#ifdef VBOX_WITH_VIDEOHWACCEL
-static DECLCALLBACK(int) vgaR3SavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
-{
-    return vboxVBVASaveStatePrep(pDevIns, pSSM);
-}
-#endif
 
 /**
- * Loads a saved VGA device state.
- *
- * @returns VBox status code.
- * @param   pDevIns     The device instance.
- * @param   pSSMHandle  The handle to the saved state.
- * @param   uVersion    The data unit version number.
- * @param   uPass       The data pass.
+ * @copydoc FNSSMDEVSAVEEXEC
  */
-static DECLCALLBACK(int) vgaR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle, uint32_t uVersion, uint32_t uPass)
-{
-    Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
-    int rc = vga_load(pSSMHandle, PDMINS_2_DATA(pDevIns, PVGASTATE), uVersion);
-    if (RT_FAILURE(rc))
-        return rc;
+static DECLCALLBACK(int) vgaR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
+{
+    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
+    vgaR3SaveConfig(pThis, pSSM);
+    vga_save(pSSM, PDMINS_2_DATA(pDevIns, PVGASTATE));
 #ifdef VBOX_WITH_HGSMI
-    return vboxVBVALoadStateExec(pDevIns, pSSMHandle, uVersion);
+    SSMR3PutBool(pSSM, true);
+    return vboxVBVASaveStateExec(pDevIns, pSSM);
+#else
+    SSMR3PutBool(pSSM, false);
+    return VINF_SUCCESS;
+#endif
+}
+
+
+/**
+ * @copydoc FNSSMDEVSAVEEXEC
+ */
+static DECLCALLBACK(int) vgaR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
+{
+    PVGASTATE   pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
+    int         rc;
+
+    if (    uVersion != VGA_SAVEDSTATE_VERSION
+        &&  uVersion != VGA_SAVEDSTATE_VERSION_HGSMI
+        &&  uVersion != VGA_SAVEDSTATE_VERSION_PRE_HGSMI)
+        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
+
+    if (uVersion > VGA_SAVEDSTATE_VERSION_HGSMI)
+    {
+        /* Check the config */
+        uint32_t cbVRam;
+        rc = SSMR3GetU32(pSSM, &cbVRam);
+        AssertRCReturn(rc, rc);
+        if (pThis->vram_size != cbVRam)
+        {
+            LogRel(("DevVGA: VRAM size changed: config=%#x state=%#x\n", pThis->vram_size, cbVRam));
+            return VERR_SSM_LOAD_CONFIG_MISMATCH;
+        }
+
+        uint32_t cMonitors;
+        rc = SSMR3GetU32(pSSM, &cMonitors);
+        AssertRCReturn(rc, rc);
+        if (pThis->cMonitors != cMonitors)
+        {
+            LogRel(("DevVGA: Monitor count changed: config=%u state=%u\n", pThis->cMonitors, cMonitors));
+            return VERR_SSM_LOAD_CONFIG_MISMATCH;
+        }
+    }
+
+    if (uPass == SSM_PASS_FINAL)
+    {
+        rc = vga_load(pSSM, pThis, uVersion);
+        if (RT_FAILURE(rc))
+            return rc;
+        bool fWithHgsmi = uVersion == VGA_SAVEDSTATE_VERSION_HGSMI;
+        if (uVersion > VGA_SAVEDSTATE_VERSION_HGSMI)
+        {
+            rc = SSMR3GetBool(pSSM, &fWithHgsmi);
+            AssertRCReturn(rc, rc);
+        }
+        if (fWithHgsmi)
+        {
+#ifdef VBOX_WITH_HGSMI
+            rc = vboxVBVALoadStateExec(pDevIns, pSSM, uVersion);
+            AssertRCReturn(rc, rc);
+#else
+            AssertLogRelFailedReturn(VERR_SSM_LOAD_CONFIG_MISMATCH);
+#endif
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * @copydoc FNSSMDEVLOADDONE
+ */
+static DECLCALLBACK(int) vgaR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
+{
+#ifdef VBOX_WITH_HGSMI
+    return vboxVBVALoadStateDone(pDevIns, pSSM);
 #else
     return VINF_SUCCESS;
-#endif
-}
-
-/** @copydoc FNSSMDEVLOADDONE */
-static DECLCALLBACK(int) vgaR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
-{
-#ifndef VBOX_WITH_HGSMI
-    return VINF_SUCCESS;
-#else
-    return vboxVBVALoadStateDone(pDevIns, pSSM);
 #endif
 }
@@ -6037,11 +6109,7 @@
     /* save */
     rc = PDMDevHlpSSMRegisterEx(pDevIns, VGA_SAVEDSTATE_VERSION, sizeof(*pThis), NULL,
-                                NULL, NULL, NULL,
-#ifdef VBOX_WITH_VIDEOHWACCEL
+                                NULL,          vgaR3LiveExec, NULL,
                                 vgaR3SavePrep, vgaR3SaveExec, NULL,
-#else
-                                NULL, vgaR3SaveExec, NULL,
-#endif
-                                NULL, vgaR3LoadExec, vgaR3LoadDone);
+                                NULL,          vgaR3LoadExec, vgaR3LoadDone);
     if (RT_FAILURE(rc))
         return rc;
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 23984)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 23985)
@@ -49,9 +49,7 @@
 #endif /* VBOX_WITH_HGSMI */
 
-#ifdef VBOX_WITH_HGSMI
-# define VGA_SAVEDSTATE_VERSION  3
-#else
-# define VGA_SAVEDSTATE_VERSION  2
-#endif
+#define VGA_SAVEDSTATE_VERSION              4
+#define VGA_SAVEDSTATE_VERSION_HGSMI        3
+#define VGA_SAVEDSTATE_VERSION_PRE_HGSMI    2
 
 #define MSR_COLOR_EMULATION 0x01
