Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 65302)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 65303)
@@ -463,4 +463,5 @@
     SSMFIELD_ENTRY_IGN_GCPHYS(      VMSVGAState, GCPhysFIFO),
     SSMFIELD_ENTRY_IGNORE(          VMSVGAState, cbFIFO),
+    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, cbFIFOConfig),
     SSMFIELD_ENTRY(                 VMSVGAState, u32SVGAId),
     SSMFIELD_ENTRY(                 VMSVGAState, fEnabled),
@@ -4439,4 +4440,5 @@
              * Mapping the FIFO RAM.
              */
+            AssertLogRelMsg(cb == pThis->svga.cbFIFO, ("cb=%#RGp cbFIFO=%#x\n", cb, pThis->svga.cbFIFO));
             rc = PDMDevHlpMMIOExMap(pDevIns, pPciDev, iRegion, GCPhysAddress);
             AssertRC(rc);
@@ -4454,5 +4456,5 @@
             {
                 pThis->svga.GCPhysFIFO = GCPhysAddress;
-                Log(("vmsvgaR3IORegionMap: FIFO address = %RGp\n", GCPhysAddress));
+                Log(("vmsvgaR3IORegionMap: GCPhysFIFO=%RGp cbFIFO=%#x\n", GCPhysAddress, pThis->svga.cbFIFO));
             }
         }
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h	(revision 65302)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h	(revision 65303)
@@ -26,5 +26,7 @@
 
 /** Default FIFO size. */
-#define VMSVGA_FIFO_SIZE                _128K
+#define VMSVGA_FIFO_SIZE                _2M
+/** The old FIFO size. */
+#define VMSVGA_FIFO_SIZE_OLD            _128K
 
 /** Default scratch region size. */
@@ -159,6 +161,9 @@
     /** Guest physical address of the FIFO memory range. */
     RTGCPHYS                    GCPhysFIFO;
-    /** Size in bytes of the FIFO memory range. */
+    /** Size in bytes of the FIFO memory range.
+     * This may be smaller than cbFIFOConfig after restoring an old VM state.  */
     uint32_t                    cbFIFO;
+    /** The configured FIFO size. */
+    uint32_t                    cbFIFOConfig;
     /** SVGA id. */
     uint32_t                    u32SVGAId;
@@ -176,8 +181,6 @@
     /** Guest OS identifier. */
     uint32_t                    u32GuestId;
-    /** Scratch region size. */
+    /** Scratch region size (VMSVGAState::au32ScratchRegion). */
     uint32_t                    cScratchRegion;
-    /** Scratch array. */
-    uint32_t                    au32ScratchRegion[VMSVGA_SCRATCH_SIZE];
     /** Irq status. */
     uint32_t                    u32IrqStatus;
@@ -190,5 +193,4 @@
     /** Register caps. */
     uint32_t                    u32RegCaps;
-    uint32_t                    Padding2;
     /** Physical address of command mmio range. */
     RTIOPORT                    BasePort;
@@ -233,4 +235,8 @@
     PGMPHYSHANDLERTYPE          hFifoAccessHandlerType;
 #endif
+
+    /** Scratch array.
+     * Putting this at the end since it's big it probably not . */
+    uint32_t                    au32ScratchRegion[VMSVGA_SCRATCH_SIZE];
 
     STAMCOUNTER                 StatRegBitsPerPixelWr;
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 65302)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 65303)
@@ -5496,4 +5496,62 @@
 
 
+#ifdef VBOX_WITH_VMSVGA /* Currently not needed in the non-VMSVGA mode, but keeping it flexible for later. */
+/**
+ * @interface_method_impl{PDMPCIDEV,pfnRegionLoadChangeHookR3}
+ */
+static DECLCALLBACK(int) vgaR3PciRegionLoadChangeHook(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t iRegion,
+                                                      uint64_t cbRegion, PCIADDRESSSPACE enmType,
+                                                      PFNPCIIOREGIONOLDSETTER pfnOldSetter)
+{
+    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
+
+# ifdef VBOX_WITH_VMSVGA
+    /*
+     * The VMSVGA changed the default FIFO size from 128KB to 2MB after 5.1.
+     */
+    if (pThis->fVMSVGAEnabled)
+    {
+        if (iRegion == 2 /*FIFO*/)
+        {
+            /* Make sure it's still 32-bit memory.  Ignore fluxtuations in the prefetch flag */
+            AssertLogRelMsgReturn(!(enmType & (PCI_ADDRESS_SPACE_IO | PCI_ADDRESS_SPACE_BAR64)), ("enmType=%#x\n", enmType),
+                                  VERR_VGA_UNEXPECTED_PCI_REGION_LOAD_CHANGE);
+
+            /* If the size didn't change we're fine, so just return already. */
+            if (cbRegion == pThis->svga.cbFIFO)
+                return VINF_SUCCESS;
+
+            /* If the size is larger than the current configuration, refuse to load. */
+            AssertLogRelMsgReturn(cbRegion <= pThis->svga.cbFIFOConfig,
+                                  ("cbRegion=%#RGp cbFIFOConfig=%#x cbFIFO=%#x\n",
+                                   cbRegion, pThis->svga.cbFIFOConfig, pThis->svga.cbFIFO),
+                                  VERR_SSM_LOAD_CONFIG_MISMATCH);
+
+            /* Adjust the size down. */
+            int rc = PDMDevHlpMMIOExReduce(pDevIns, pPciDev, iRegion, cbRegion);
+            AssertLogRelMsgRCReturn(rc,
+                                    ("cbRegion=%#RGp cbFIFOConfig=%#x cbFIFO=%#x: %Rrc\n",
+                                     cbRegion, pThis->svga.cbFIFOConfig, pThis->svga.cbFIFO, rc),
+                                    rc);
+            pThis->svga.cbFIFO = cbRegion;
+            return rc;
+
+        }
+        /* Emulate callbacks for 5.1 and older saved states by recursion. */
+        else if (iRegion == UINT32_MAX)
+        {
+            int rc = vgaR3PciRegionLoadChangeHook(pDevIns, pPciDev, 2, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM, NULL);
+            if (RT_SUCCESS(rc))
+                rc = pfnOldSetter(pPciDev, 2, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM);
+            return rc;
+        }
+    }
+# endif /* VBOX_WITH_VMSVGA */
+
+    return VERR_VGA_UNEXPECTED_PCI_REGION_LOAD_CHANGE;
+}
+#endif /* VBOX_WITH_VMSVGA */
+
+
 /* -=-=-=-=-=- Ring3: Misc Wrappers & Sidekicks -=-=-=-=-=- */
 
@@ -6137,4 +6195,5 @@
     AssertLogRelMsgReturn(pThis->svga.cbFIFO <=  _16M, ("cbFIFO=%#x\n", pThis->svga.cbFIFO), VERR_OUT_OF_RANGE);
     AssertLogRelMsgReturn(RT_IS_POWER_OF_TWO(pThis->svga.cbFIFO), ("cbFIFO=%#x\n", pThis->svga.cbFIFO), VERR_NOT_POWER_OF_TWO);
+    pThis->svga.cbFIFOConfig = pThis->svga.cbFIFO;
     Log(("VMSVGA: VMSVGAFifoSize  = %#x (%'u)\n", pThis->svga.cbFIFO, pThis->svga.cbFIFO));
 #endif
@@ -6259,4 +6318,5 @@
         if (RT_FAILURE(rc))
             return rc;
+        pThis->Dev.pfnRegionLoadChangeHookR3 = vgaR3PciRegionLoadChangeHook;
     }
     else
Index: /trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
===================================================================
--- /trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp	(revision 65302)
+++ /trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp	(revision 65303)
@@ -366,4 +366,6 @@
     CHECK_MEMBER_ALIGNMENT(VGASTATE, svga, 8);
     CHECK_MEMBER_ALIGNMENT(VGASTATE, svga.u64HostWindowId, 8);
+    CHECK_MEMBER_ALIGNMENT(VGASTATE, svga.au32ScratchRegion, 8);
+    CHECK_MEMBER_ALIGNMENT(VGASTATE, svga.StatRegBitsPerPixelWr, 8);
 #endif
     CHECK_MEMBER_ALIGNMENT(VGASTATE, cMonitors, 8);
Index: /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
===================================================================
--- /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp	(revision 65302)
+++ /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp	(revision 65303)
@@ -323,10 +323,37 @@
     GEN_CHECK_OFF(VGASTATE, svga.GCPhysFIFO);
     GEN_CHECK_OFF(VGASTATE, svga.cbFIFO);
+    GEN_CHECK_OFF(VGASTATE, svga.cbFIFOConfig);
+    GEN_CHECK_OFF(VGASTATE, svga.u32SVGAId);
+    GEN_CHECK_OFF(VGASTATE, svga.fConfigured);
+    GEN_CHECK_OFF(VGASTATE, svga.fBusy);
+    GEN_CHECK_OFF(VGASTATE, svga.fTraces);
+    GEN_CHECK_OFF(VGASTATE, svga.u32GuestId);
+    GEN_CHECK_OFF(VGASTATE, svga.cScratchRegion);
+    GEN_CHECK_OFF(VGASTATE, svga.u32IrqStatus);
+    GEN_CHECK_OFF(VGASTATE, svga.u32IrqMask);
+    GEN_CHECK_OFF(VGASTATE, svga.u32PitchLock);
+    GEN_CHECK_OFF(VGASTATE, svga.u32CurrentGMRId);
+    GEN_CHECK_OFF(VGASTATE, svga.u32RegCaps);
     GEN_CHECK_OFF(VGASTATE, svga.BasePort);
+    GEN_CHECK_OFF(VGASTATE, svga.u32IndexReg);
+    GEN_CHECK_OFF(VGASTATE, svga.pSupDrvSession);
+    GEN_CHECK_OFF(VGASTATE, svga.FIFORequestSem);
+    GEN_CHECK_OFF(VGASTATE, svga.FIFOExtCmdSem);
     GEN_CHECK_OFF(VGASTATE, svga.pFIFOIOThread);
     GEN_CHECK_OFF(VGASTATE, svga.uWidth);
+    GEN_CHECK_OFF(VGASTATE, svga.uHeight);
+    GEN_CHECK_OFF(VGASTATE, svga.uBpp);
+    GEN_CHECK_OFF(VGASTATE, svga.cbScanline);
+    GEN_CHECK_OFF(VGASTATE, svga.u32MaxWidth);
+    GEN_CHECK_OFF(VGASTATE, svga.u32MaxHeight);
+    GEN_CHECK_OFF(VGASTATE, svga.viewport);
     GEN_CHECK_OFF(VGASTATE, svga.u32ActionFlags);
     GEN_CHECK_OFF(VGASTATE, svga.f3DEnabled);
     GEN_CHECK_OFF(VGASTATE, svga.fVRAMTracking);
+    GEN_CHECK_OFF(VGASTATE, svga.u8FIFOExtCommand);
+    GEN_CHECK_OFF(VGASTATE, svga.fFifoExtCommandWakeup);
+    GEN_CHECK_OFF(VGASTATE, svga.au32ScratchRegion);
+    GEN_CHECK_OFF(VGASTATE, svga.StatRegBitsPerPixelWr);
+    GEN_CHECK_OFF(VGASTATE, svga.StatRegWriteOnlyRd);
 #endif
     GEN_CHECK_OFF(VGASTATE, cMonitors);
