Index: /trunk/include/VBox/types.h
===================================================================
--- /trunk/include/VBox/types.h	(revision 31443)
+++ /trunk/include/VBox/types.h	(revision 31444)
@@ -825,16 +825,14 @@
 /**
  * Page mapping lock.
- *
  */
 typedef struct PGMPAGEMAPLOCK
 {
-    /** @todo see PGMPhysIsPageMappingLockValid for possibly incorrect assumptions */
 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
-    /** Just a dummy for the time being. */
-    uint32_t    u32Dummy;
-    uint32_t    u32Dummy1;
-# if HC_ARCH_BITS == 64
-    uint32_t    u32Align[2];
-# endif
+    /** The locked page. */
+    void       *pvPage;
+    /** Pointer to the CPU that made the mapping.
+     * In ring-0 and raw-mode context we don't intend to ever allow long term
+     * locking and this is a way of making sure we're still on the same CPU. */
+    PVMCPU      pVCpu;
 #else
     /** Pointer to the PGMPAGE and lock type.
Index: /trunk/src/VBox/VMM/PGMInline.h
===================================================================
--- /trunk/src/VBox/VMM/PGMInline.h	(revision 31443)
+++ /trunk/src/VBox/VMM/PGMInline.h	(revision 31444)
@@ -500,23 +500,4 @@
     }
     AssertFatalMsgFailed(("pgmPoolMapPageV2Inlined invalid page index %x\n", pPage->idx));
-}
-
-/**
- * Temporarily maps one host page specified by HC physical address, returning
- * pointer within the page.
- *
- * Be WARNED that the dynamic page mapping area is small, 8 pages, thus the space is
- * reused after 8 mappings (or perhaps a few more if you score with the cache).
- *
- * @returns The address corresponding to HCPhys.
- * @param   pVM         The VM handle.
- * @param   HCPhys      HC Physical address of the page.
- */
-DECLINLINE(void *) pgmRZDynMapHCPageOff(PVM pVM, RTHCPHYS HCPhys RTLOG_COMMA_SRC_POS_DECL)
-{
-    void *pv;
-    pgmRZDynMapHCPageInlined(VMMGetCpu(pVM), HCPhys & ~(RTHCPHYS)PAGE_OFFSET_MASK, &pv RTLOG_COMMA_SRC_POS_ARGS);
-    pv = (void *)((uintptr_t)pv | ((uintptr_t)HCPhys & PAGE_OFFSET_MASK));
-    return pv;
 }
 
Index: /trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp	(revision 31443)
+++ /trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp	(revision 31444)
@@ -1128,5 +1128,12 @@
      */
 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
-    *ppv = pgmRZDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) | (GCPhys & PAGE_OFFSET_MASK) RTLOG_COMMA_SRC_POS);
+    void *pv;
+    rc = pgmRZDynMapHCPageInlined(VMMGetCpu(pVM),
+                                  PGM_PAGE_GET_HCPHYS(pPage),
+                                  &pv
+                                  RTLOG_COMMA_SRC_POS);
+    if (RT_FAILURE(rc))
+        return rc;
+    *ppv = (void *)((uintptr_t)pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
 #else
     PPGMPAGEMAPTLBE pTlbe;
@@ -1166,5 +1173,12 @@
      */
 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
-    *ppv = pgmRZDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) | (GCPhys & PAGE_OFFSET_MASK) RTLOG_COMMA_SRC_POS); /** @todo add a read only flag? */
+    void *pv;
+    int rc = pgmRZDynMapHCPageInlined(VMMGetCpu(pVM),
+                                      PGM_PAGE_GET_HCPHYS(pPage),
+                                      &pv
+                                      RTLOG_COMMA_SRC_POS); /** @todo add a read only flag? */
+    if (RT_FAILURE(rc))
+        return rc;
+    *ppv = (void *)((uintptr_t)pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
 #else
     PPGMPAGEMAPTLBE pTlbe;
@@ -1224,13 +1238,21 @@
         if (RT_SUCCESS(rc))
         {
-            *ppv = pgmRZDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) | (GCPhys & PAGE_OFFSET_MASK) RTLOG_COMMA_SRC_POS); /** @todo add a read only flag? */
-# if 0
-            pLock->pvMap = 0;
-            pLock->pvPage = pPage;
-# else
-            pLock->u32Dummy = UINT32_MAX;
-# endif
             AssertMsg(rc == VINF_SUCCESS || rc == VINF_PGM_SYNC_CR3 /* not returned */, ("%Rrc\n", rc));
-            rc = VINF_SUCCESS;
+
+            PVMCPU pVCpu = VMMGetCpu(pVM);
+            void  *pv;
+            rc = pgmRZDynMapHCPageInlined(pVCpu,
+                                          PGM_PAGE_GET_HCPHYS(pPage),
+                                          &pv
+                                          RTLOG_COMMA_SRC_POS);
+            if (RT_SUCCESS(rc))
+            {
+                AssertRCSuccess(rc);
+
+                pv = (void *)((uintptr_t)pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
+                *ppv = pv;
+                pLock->pvPage = pv;
+                pLock->pVCpu  = pVCpu;
+            }
         }
     }
@@ -1335,13 +1357,19 @@
         else
         {
-            *ppv = pgmRZDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) | (GCPhys & PAGE_OFFSET_MASK) RTLOG_COMMA_SRC_POS); /** @todo add a read only flag? */
-# if 0
-            pLock->pvMap = 0;
-            pLock->pvPage = pPage;
-# else
-            pLock->u32Dummy = UINT32_MAX;
-# endif
-            AssertMsg(rc == VINF_SUCCESS || rc == VINF_PGM_SYNC_CR3 /* not returned */, ("%Rrc\n", rc));
-            rc = VINF_SUCCESS;
+            PVMCPU pVCpu = VMMGetCpu(pVM);
+            void  *pv;
+            rc = pgmRZDynMapHCPageInlined(pVCpu,
+                                          PGM_PAGE_GET_HCPHYS(pPage),
+                                          &pv
+                                          RTLOG_COMMA_SRC_POS); /** @todo add a read only flag? */
+            if (RT_SUCCESS(rc))
+            {
+                AssertRCSuccess(rc);
+
+                pv = (void *)((uintptr_t)pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
+                *ppv = pv;
+                pLock->pvPage = pv;
+                pLock->pVCpu  = pVCpu;
+            }
         }
     }
@@ -1479,7 +1507,9 @@
 {
 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
-    /* currently nothing to do here. */
-    Assert(pLock->u32Dummy == UINT32_MAX);
-    pLock->u32Dummy = 0;
+    Assert(pLock->pvPage != NULL);
+    Assert(pLock->pVCpu == VMMGetCpu(pVM));
+    PGM_DYNMAP_UNUSED_HINT(pLock->pVCpu, pLock->pvPage);
+    pLock->pVCpu  = NULL;
+    pLock->pvPage = NULL;
 
 #else
