Index: /trunk/include/VBox/vmm/pdmcritsect.h
===================================================================
--- /trunk/include/VBox/vmm/pdmcritsect.h	(revision 37581)
+++ /trunk/include/VBox/vmm/pdmcritsect.h	(revision 37582)
@@ -60,6 +60,5 @@
 VMMDECL(void)       PDMCritSectLeave(PPDMCRITSECT pCritSect);
 VMMDECL(bool)       PDMCritSectIsOwner(PCPDMCRITSECT pCritSect);
-VMMDECL(bool)       PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, VMCPUID idCpu);
-VMMDECL(bool)       PDMCritSectIsOwned(PCPDMCRITSECT pCritSect);
+VMMDECL(bool)       PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, PVMCPU pVCpu);
 VMMDECL(bool)       PDMCritSectIsInitialized(PCPDMCRITSECT pCritSect);
 VMMDECL(bool)       PDMCritSectHasWaiters(PCPDMCRITSECT pCritSect);
Index: /trunk/src/VBox/Devices/PC/DevAPIC.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 37581)
+++ /trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 37582)
@@ -1448,5 +1448,5 @@
     Assert(pApic->pTimerR3 == pTimer);
     Assert(pApic->fTimerArmed);
-    Assert(PDMCritSectIsOwned(pDev->pCritSectR3));
+    Assert(PDMCritSectIsOwner(pDev->pCritSectR3));
     Assert(TMTimerIsLockOwner(pTimer));
 
Index: /trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp	(revision 37581)
+++ /trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp	(revision 37582)
@@ -210,5 +210,4 @@
         ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
         Assert(pCritSect->s.Core.cNestings > 1);
-        ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
         return VINF_SUCCESS;
     }
@@ -418,5 +417,4 @@
         ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
         Assert(pCritSect->s.Core.cNestings > 1);
-        ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
         return VINF_SUCCESS;
     }
@@ -683,5 +681,6 @@
     if (pCritSect->s.Core.NativeThreadOwner != pVCpu->hNativeThread)
         return false;
-    return (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0;
+    return (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0
+        || pCritSect->s.Core.cNestings > 1;
 #endif
 }
@@ -694,36 +693,18 @@
  * @returns false if not owner.
  * @param   pCritSect   The critical section.
- * @param   idCpu       VCPU id
- */
-VMMDECL(bool) PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, VMCPUID idCpu)
+ * @param   pVCpu       The virtual CPU handle.
+ */
+VMMDECL(bool) PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, PVMCPU pVCpu)
 {
 #ifdef IN_RING3
-    NOREF(idCpu);
+    NOREF(pVCpu);
     return RTCritSectIsOwner(&pCritSect->s.Core);
 #else
-    PVM pVM = pCritSect->s.CTX_SUFF(pVM);
-    AssertPtr(pVM);
-    Assert(idCpu < pVM->cCpus);
-    return pCritSect->s.Core.NativeThreadOwner == pVM->aCpus[idCpu].hNativeThread
-        && (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0;
-#endif
-}
-
-
-/**
- * Checks if somebody currently owns the critical section.
- *
- * @returns true if locked.
- * @returns false if not locked.
- *
- * @param   pCritSect   The critical section.
- *
- * @remarks This doesn't prove that no deadlocks will occur later on; it's
- *          just a debugging tool
- */
-VMMDECL(bool) PDMCritSectIsOwned(PCPDMCRITSECT pCritSect)
-{
-    return pCritSect->s.Core.NativeThreadOwner != NIL_RTNATIVETHREAD
-        && (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0;
+    Assert(&pVCpu->CTX_SUFF(pVM)->aCpus[pVCpu->idCpu] == pVCpu);
+    if (pCritSect->s.Core.NativeThreadOwner != pVCpu->hNativeThread)
+        return false;
+    return (pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK) == 0
+        || pCritSect->s.Core.cNestings > 1;
+#endif
 }
 
Index: /trunk/src/VBox/VMM/VMMR0/PGMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/PGMR0.cpp	(revision 37581)
+++ /trunk/src/VBox/VMM/VMMR0/PGMR0.cpp	(revision 37582)
@@ -68,5 +68,5 @@
 VMMR0DECL(int) PGMR0PhysAllocateHandyPages(PVM pVM, PVMCPU pVCpu)
 {
-    Assert(PDMCritSectIsOwnerEx(&pVM->pgm.s.CritSect, pVCpu->idCpu));
+    Assert(PDMCritSectIsOwnerEx(&pVM->pgm.s.CritSect, pVCpu));
 
     /*
@@ -181,5 +181,5 @@
 VMMR0DECL(int) PGMR0PhysAllocateLargeHandyPage(PVM pVM, PVMCPU pVCpu)
 {
-    Assert(PDMCritSectIsOwnerEx(&pVM->pgm.s.CritSect, pVCpu->idCpu));
+    Assert(PDMCritSectIsOwnerEx(&pVM->pgm.s.CritSect, pVCpu));
 
     Assert(!pVM->pgm.s.cLargeHandyPages);
