Index: /trunk/src/VBox/VMM/VMMR3/PGM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PGM.cpp	(revision 58778)
+++ /trunk/src/VBox/VMM/VMMR3/PGM.cpp	(revision 58779)
@@ -1312,4 +1312,5 @@
     pVM->pgm.s.GCPhys4MBPSEMask = RT_BIT_64(32) - 1; /* default; checked later */
     pVM->pgm.s.GCPtrPrevRamRangeMapping = MM_HYPER_AREA_ADDRESS;
+    pVM->pgm.s.fRestoreVirginRomPagesDuringReset = false;
 
     rc = CFGMR3QueryBoolDef(CFGMR3GetRoot(pVM), "RamPreAlloc", &pVM->pgm.s.fRamPreAlloc,
Index: /trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp	(revision 58778)
+++ /trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp	(revision 58779)
@@ -3573,7 +3573,7 @@
         }
 
-#ifdef VBOX_STRICT
         /*
-         * Verify that the virgin page is unchanged if possible.
+         * Restore virgin ROM pages after a saved state load or check that the
+         * virgin pages are unchanged if possible.
          */
         if (pRom->pvOriginal)
@@ -3581,4 +3581,5 @@
             size_t         cbSrcLeft = pRom->cbOriginal;
             uint8_t const *pbSrcPage = (uint8_t const *)pRom->pvOriginal;
+            bool           fChanged = false;
             for (uint32_t iPage = 0; iPage < cPages && cbSrcLeft > 0; iPage++, pbSrcPage += PAGE_SIZE)
             {
@@ -3591,20 +3592,27 @@
                 if (memcmp(pvDstPage, pbSrcPage, RT_MIN(cbSrcLeft, PAGE_SIZE)))
                 {
-# ifdef DEBUG_bird /* This is darn handy for EFI debugging w/ snapshots, should be made default later. */
-                    void *pvDstPageW;
-                    rc = pgmPhysPageMap(pVM, &pRom->aPages[iPage].Virgin, GCPhys, &pvDstPageW);
-                    AssertRCReturn(rc, rc);
-                    memcpy(pvDstPageW, pbSrcPage, RT_MIN(cbSrcLeft, PAGE_SIZE));
-# else
-                    LogRel(("pgmR3PhysRomReset: %RGp rom page changed (%s) - loaded saved state?\n",
-                            GCPhys, pRom->pszDesc));
-# endif
+                    if (pVM->pgm.s.fRestoreVirginRomPagesDuringReset)
+                    {
+                        void *pvDstPageW;
+                        rc = pgmPhysPageMap(pVM, &pRom->aPages[iPage].Virgin, GCPhys, &pvDstPageW);
+                        AssertLogRelRCReturn(rc, rc);
+                        memcpy(pvDstPageW, pbSrcPage, RT_MIN(cbSrcLeft, PAGE_SIZE));
+                        fChanged = true;
+                    }
+                    else
+                    {
+#ifdef VBOX_STRICT
+                        LogRel(("pgmR3PhysRomReset: %RGp rom page changed (%s)?\n", GCPhys, pRom->pszDesc));
+#endif
+                    }
                 }
                 cbSrcLeft -= RT_MIN(cbSrcLeft, PAGE_SIZE);
             }
-        }
-#endif
-    }
-
+            if (fChanged)
+                LogRel(("PGM: ROM \"%s\" changed - restored original\n", pRom->pszDesc));
+        }
+    }
+
+    pVM->pgm.s.fRestoreVirginRomPagesDuringReset = false;
     return VINF_SUCCESS;
 }
Index: /trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp	(revision 58778)
+++ /trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp	(revision 58779)
@@ -336,4 +336,6 @@
                                 ("The \"%s\" ROM was not found in the saved state. Probably due to some misconfiguration\n",
                                  pRom->pszDesc));
+
+            pVM->pgm.s.fRestoreVirginRomPagesDuringReset = true;
             return VINF_SUCCESS;        /* the end */
         }
Index: /trunk/src/VBox/VMM/include/PGMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/PGMInternal.h	(revision 58778)
+++ /trunk/src/VBox/VMM/include/PGMInternal.h	(revision 58779)
@@ -3245,6 +3245,8 @@
     /** The number of MMIO2 regions (serves as the next MMIO2 ID). */
     uint8_t                         cMmio2Regions;
-    /** Alignment padding that makes the next member start on a 8 byte boundary. */
-    bool                            afAlignment1[1];
+    /** Flag indicating that ROM pages should be restored to their original
+     * during reset. Primary use is for getting firmware updates when the
+     * VM is reset after a saved state was loaded. */
+    bool                            fRestoreVirginRomPagesDuringReset;
 
     /** Indicates that PGMR3FinalizeMappings has been called and that further
Index: /trunk/src/VBox/VMM/testcase/tstVMStruct.h
===================================================================
--- /trunk/src/VBox/VMM/testcase/tstVMStruct.h	(revision 58778)
+++ /trunk/src/VBox/VMM/testcase/tstVMStruct.h	(revision 58779)
@@ -674,4 +674,5 @@
     GEN_CHECK_OFF(PGM, paDynPageMapPaePTEsGC);
     GEN_CHECK_OFF(PGM, enmHostMode);
+    GEN_CHECK_OFF(PGM, fRestoreVirginRomPagesDuringReset);
     GEN_CHECK_OFF(PGM, GCPhys4MBPSEMask);
     GEN_CHECK_OFF(PGM, pRamRangesXR3);
