Index: /trunk/src/VBox/VMM/PGMPool.cpp
===================================================================
--- /trunk/src/VBox/VMM/PGMPool.cpp	(revision 29886)
+++ /trunk/src/VBox/VMM/PGMPool.cpp	(revision 29887)
@@ -753,11 +753,33 @@
      *       recently removed MMIO ranges around that might otherwise end up asserting in pgmPoolTracDerefGCPhysHint
      */
-    pgmPoolResetDirtyPages(pVM);
+    for (unsigned i = 0; i < RT_ELEMENTS(pPool->aIdxDirtyPages); i++)
+	{
+		PPGMPOOLPAGE pPage;
+	    unsigned     idxPage;
+
+	    if (pPool->aIdxDirtyPages[i] == NIL_PGMPOOL_IDX)
+			continue;
+
+	    idxPage = pPool->aIdxDirtyPages[i];
+		AssertRelease(idxPage != NIL_PGMPOOL_IDX);
+		pPage = &pPool->aPages[idxPage];
+		Assert(pPage->idx == idxPage);
+		Assert(pPage->iMonitoredNext == NIL_PGMPOOL_IDX && pPage->iMonitoredPrev == NIL_PGMPOOL_IDX);
+
+	    AssertMsg(pPage->fDirty, ("Page %RGp (slot=%d) not marked dirty!", pPage->GCPhys, i));
+
+		Log(("Reactivate dirty page %RGp\n", pPage->GCPhys));
+
+		/* First write protect the page again to catch all write accesses. (before checking for changes -> SMP) */
+	    int rc = PGMHandlerPhysicalReset(pVM, pPage->GCPhys);
+		Assert(rc == VINF_SUCCESS);
+		pPage->fDirty = false;
+
+        pPool->aIdxDirtyPages[i] = NIL_PGMPOOL_IDX;
+	}
 
     /* Clear all dirty pages. */
     pPool->idxFreeDirtyPage = 0;
     pPool->cDirtyPages      = 0;
-    for (unsigned i = 0; i < RT_ELEMENTS(pPool->aIdxDirtyPages); i++)
-        pPool->aIdxDirtyPages[i] = NIL_PGMPOOL_IDX;
 #endif
 
