Index: /trunk/src/VBox/VMM/PGMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/PGMInternal.h	(revision 16044)
+++ /trunk/src/VBox/VMM/PGMInternal.h	(revision 16045)
@@ -2907,4 +2907,5 @@
 
 void            pgmR3HandlerPhysicalUpdateAll(PVM pVM);
+bool            pgmHandlerPhysicalIsAll(PVM pVM, RTGCPHYS GCPhys);
 int             pgmHandlerVirtualFindByPhysAddr(PVM pVM, RTGCPHYS GCPhys, PPGMVIRTHANDLER *ppVirt, unsigned *piPage);
 DECLCALLBACK(int) pgmHandlerVirtualResetOne(PAVLROGCPTRNODECORE pNode, void *pvUser);
Index: /trunk/src/VBox/VMM/PGMPhys.cpp
===================================================================
--- /trunk/src/VBox/VMM/PGMPhys.cpp	(revision 16044)
+++ /trunk/src/VBox/VMM/PGMPhys.cpp	(revision 16045)
@@ -2463,8 +2463,21 @@
                 /* nothing */;
 #endif
-            else if (PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) /* catches MMIO */
-                rc = VERR_PGM_PHYS_TLB_CATCH_ALL;
-            else if (fWritable && PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
-                rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
+            else if (PGM_PAGE_HAS_ANY_HANDLERS(pPage))
+            {
+                if (PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) /* catches MMIO */
+                    rc = VERR_PGM_PHYS_TLB_CATCH_ALL;
+                else if (fWritable && PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
+                    rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
+                else
+                {
+                    /* Temporariliy disabled phycial handler(s), since the recompiler
+                       doesn't get notified when it's reset we'll have to pretend its
+                       operating normally. */
+                    if (pgmHandlerPhysicalIsAll(pVM, GCPhys))
+                        rc = VERR_PGM_PHYS_TLB_CATCH_ALL;
+                    else
+                        rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
+                }
+            }
             else
                 rc = VINF_SUCCESS;
Index: /trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp	(revision 16044)
+++ /trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp	(revision 16045)
@@ -1065,15 +1065,37 @@
     if (pCur)
     {
-        if (    GCPhys >= pCur->Core.Key
-            &&  GCPhys <= pCur->Core.KeyLast)
-        {
-            Assert(     pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
-                   ||   pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_ALL
-                   ||   pCur->enmType == PGMPHYSHANDLERTYPE_MMIO);
-            return true;
-        }
+        Assert(GCPhys >= pCur->Core.Key && GCPhys <= pCur->Core.KeyLast);
+        Assert(     pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
+               ||   pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_ALL
+               ||   pCur->enmType == PGMPHYSHANDLERTYPE_MMIO);
+        return true;
     }
 
     return false;
+}
+
+
+/**
+ * Checks if it's an disabled all access handler or write access handler at the
+ * given address.
+ *
+ * @returns true if it's an all access handler, false if it's a write access
+ *          handler.
+ * @param   pVM         Pointer to the shared VM structure.
+ * @param   GCPhys      The address of the page with a disabled handler.
+ *
+ * @remarks The caller, PGMR3PhysTlbGCPhys2Ptr, must hold the PGM lock.
+ */
+bool pgmHandlerPhysicalIsAll(PVM pVM, RTGCPHYS GCPhys)
+{
+    PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)RTAvlroGCPhysRangeGet(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys);
+    AssertReturn(pCur, true);
+    Assert(     pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
+           ||   pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_ALL
+           ||   pCur->enmType == PGMPHYSHANDLERTYPE_MMIO); /* sanity */
+    /* Only whole pages can be disabled. */
+    Assert(   pCur->Core.Key     <= (GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK)
+           && pCur->Core.KeyLast >= (GCPhys | PAGE_OFFSET_MASK);
+    return pCur->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE;
 }
 
