Index: /trunk/src/VBox/VMM/MMPagePool.cpp
===================================================================
--- /trunk/src/VBox/VMM/MMPagePool.cpp	(revision 6868)
+++ /trunk/src/VBox/VMM/MMPagePool.cpp	(revision 6869)
@@ -494,4 +494,5 @@
         AssertRelease(pVM->mm.s.pvDummyPage);
         pVM->mm.s.HCPhysDummyPage = mmPagePoolPtr2Phys(pVM->mm.s.pPagePool, pVM->mm.s.pvDummyPage);
+        AssertRelease(!(pVM->mm.s.HCPhysDummyPage & ~X86_PTE_PAE_PG_MASK));
     }
     return pVM->mm.s.pvDummyPage;
Index: /trunk/src/VBox/VMM/PGMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/PGMInternal.h	(revision 6868)
+++ /trunk/src/VBox/VMM/PGMInternal.h	(revision 6869)
@@ -508,6 +508,6 @@
  * of information into as few bits as possible. The format is also subject
  * to change (there is one comming up soon). Which means that for we'll be
- * using PGM_PAGE_GET_* and PGM_PAGE_SET_* macros for all accessess to the
- * structure.
+ * using PGM_PAGE_GET_*, PGM_PAGE_IS_ and PGM_PAGE_SET_* macros for *all*
+ * accessess to the structure.
  */
 typedef struct PGMPAGE
@@ -516,7 +516,7 @@
     RTHCPHYS    HCPhys;
     /** The page state. */
-    uint32_t    u2State : 2;
+    uint32_t    u2StateX : 2;
     /** Flag indicating that a write monitored page was written to when set. */
-    uint32_t    fWrittenTo : 1;
+    uint32_t    fWrittenToX : 1;
     /** For later. */
     uint32_t    fSomethingElse : 1;
@@ -524,5 +524,5 @@
      * @todo  Merge with HCPhys once we've liberated HCPhys of its stuff.
      *        The HCPhys will be 100% static. */
-    uint32_t    idPage : 28;
+    uint32_t    idPageX : 28;
     /** The page type (PGMPAGETYPE). */
     uint32_t    u3Type : 3;
@@ -537,5 +537,52 @@
 typedef PPGMPAGE *PPPGMPAGE;
 
-/** @name The Page state, PGMPAGE::u2State.
+
+/**
+ * Clears the page structure.
+ * @param   pPage       Pointer to the physical guest page tracking structure.
+ */
+#define PGM_PAGE_CLEAR(pPage) \
+    do { \
+        (pPage)->HCPhys         = 0; \
+        (pPage)->u2StateX       = 0; \
+        (pPage)->fWrittenToX    = 0; \
+        (pPage)->fSomethingElse = 0; \
+        (pPage)->idPageX        = 0; \
+        (pPage)->u3Type         = 0; \
+        (pPage)->u29B           = 0; \
+    } while (0)
+
+/**
+ * Clears the page structure.
+ * @param   pPage       Pointer to the physical guest page tracking structure.
+ */
+#define PGM_PAGE_INIT(pPage, _HCPhys, _idPage, _uType, _uState) \
+    do { \
+        (pPage)->HCPhys         = (_HCPhys); \
+        (pPage)->u2StateX       = (_uState); \
+        (pPage)->fWrittenToX    = 0; \
+        (pPage)->fSomethingElse = 0; \
+        (pPage)->idPageX        = (_idPage); \
+        (pPage)->u3Type         = (_uType); \
+        (pPage)->u29B           = 0; \
+    } while (0)
+
+/**
+ * Clears the page structure.
+ * @param   pPage       Pointer to the physical guest page tracking structure.
+ */
+#ifdef VBOX_WITH_NEW_PHYS_CODE
+# define PGM_PAGE_INIT_ZERO(pPage, pVM, _uType)  \
+    PGM_PAGE_INIT(pPage, (pVM)->pgm.s.HCPhysZeroPg, NIL_GMM_PAGEID, PGM_PAGE_STATE_ZERO, (_uType))
+#else
+# define PGM_PAGE_INIT_ZERO(pPage, pVM, _uType)  \
+    PGM_PAGE_INIT(pPage, 0, NIL_GMM_PAGEID, PGM_PAGE_STATE_ZERO, (_uType))
+#endif
+/** Temporary hack. Replaced by PGM_PAGE_INIT_ZERO once the old code is kicked out. */
+# define PGM_PAGE_INIT_ZERO_REAL(pPage, pVM, _uType)  \
+    PGM_PAGE_INIT(pPage, (pVM)->pgm.s.HCPhysZeroPg, NIL_GMM_PAGEID, PGM_PAGE_STATE_ZERO, (_uType))
+
+
+/** @name The Page state, PGMPAGE::u2StateX.
  * @{ */
 /** The zero page.
@@ -562,5 +609,5 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_STATE(pPage)       ( (pPage)->u2State )
+#define PGM_PAGE_GET_STATE(pPage)       ( (pPage)->u2StateX )
 
 /**
@@ -570,5 +617,5 @@
  */
 #define PGM_PAGE_SET_STATE(pPage, _uState) \
-                                        do { (pPage)->u2State = (_uState); } while (0)
+                                        do { (pPage)->u2StateX = (_uState); } while (0)
 
 
@@ -594,5 +641,5 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_PAGEID(pPage)      ( (pPage)->idPage )
+#define PGM_PAGE_GET_PAGEID(pPage)      ( (pPage)->idPageX )
 /* later:
 #define PGM_PAGE_GET_PAGEID(pPage)      (   ((uint32_t)(pPage)->HCPhys >> (48 - 12))
@@ -603,5 +650,5 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_SET_PAGEID(pPage, _idPage)  do { (pPage)->idPage = (_idPage); } while (0)
+#define PGM_PAGE_SET_PAGEID(pPage, _idPage)  do { (pPage)->idPageX = (_idPage); } while (0)
 /* later:
 #define PGM_PAGE_SET_PAGEID(pPage, _idPage)  do { (pPage)->HCPhys = (((pPage)->HCPhys) & UINT64_C(0x0000fffffffff000)) \
@@ -615,5 +662,5 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_CHUNKID(pPage)     ( (pPage)->idPage >> GMM_CHUNKID_SHIFT )
+#define PGM_PAGE_GET_CHUNKID(pPage)     ( (pPage)->idPageX >> GMM_CHUNKID_SHIFT )
 /* later:
 #if GMM_CHUNKID_SHIFT == 12
@@ -634,5 +681,5 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_PAGE_IN_CHUNK(pPage)   ( (pPage)->idPage & GMM_PAGEID_IDX_MASK )
+#define PGM_PAGE_GET_PAGE_IN_CHUNK(pPage)   ( (pPage)->idPageX & GMM_PAGEID_IDX_MASK )
 /* later:
 #if GMM_CHUNKID_SHIFT <= 12
@@ -680,5 +727,5 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_IS_ZERO(pPage)         ( (pPage)->u2State == PGM_PAGE_STATE_ZERO )
+#define PGM_PAGE_IS_ZERO(pPage)         ( (pPage)->u2StateX == PGM_PAGE_STATE_ZERO )
 
 /**
@@ -687,6 +734,25 @@
  * @param   pPage       Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_IS_SHARED(pPage)        ( (pPage)->u2State == PGM_PAGE_STATE_SHARED )
-
+#define PGM_PAGE_IS_SHARED(pPage)        ( (pPage)->u2StateX == PGM_PAGE_STATE_SHARED )
+
+
+/**
+ * Marks the paget as written to (for GMM change monitoring).
+ * @param   pPage       Pointer to the physical guest page tracking structure.
+ */
+#define PGM_PAGE_SET_WRITTEN_TO(pPage)      do { (pPage)->fWrittenToX = 1; } while (0)
+
+/**
+ * Clears the written-to indicator.
+ * @param   pPage       Pointer to the physical guest page tracking structure.
+ */
+#define PGM_PAGE_CLEAR_WRITTEN_TO(pPage)    do { (pPage)->fWrittenToX = 0; } while (0)
+
+/**
+ * Checks if the page was marked as written-to.
+ * @returns true/false.
+ * @param   pPage       Pointer to the physical guest page tracking structure.
+ */
+#define PGM_PAGE_IS_WRITTEN_TO(pPage)       ( (pPage)->fWrittenToX )
 
 /**
Index: /trunk/src/VBox/VMM/PGMPhys.cpp
===================================================================
--- /trunk/src/VBox/VMM/PGMPhys.cpp	(revision 6868)
+++ /trunk/src/VBox/VMM/PGMPhys.cpp	(revision 6869)
@@ -227,17 +227,5 @@
     RTGCPHYS iPage = cPages;
     while (iPage-- > 0)
-    {
-#ifdef VBOX_WITH_NEW_PHYS_CODE
-        pNew->aPages[iPage].HCPhys = pVM->pgm.s.HCPhysZeroPg;
-#else
-        pNew->aPages[iPage].HCPhys = 0;
-#endif
-        pNew->aPages[iPage].fWrittenTo = 0;
-        pNew->aPages[iPage].fSomethingElse = 0;
-        pNew->aPages[iPage].u29B = 0;
-        PGM_PAGE_SET_TYPE(&pNew->aPages[iPage],   PGMPAGETYPE_RAM);
-        PGM_PAGE_SET_STATE(&pNew->aPages[iPage],  PGM_PAGE_STATE_ZERO);
-        PGM_PAGE_SET_PAGEID(&pNew->aPages[iPage], NIL_GMM_PAGEID);
-    }
+        PGM_PAGE_INIT_ZERO(&pNew->aPages[iPage], pVM, PGMPAGETYPE_RAM);
 
     /*
@@ -512,11 +500,9 @@
                 for (uint32_t iPage = 0; iPage < cPages; iPage++, pPage++, pRomPage++)
                 {
-                    pPage->fWrittenTo = 0;
-                    pPage->fSomethingElse = 0;
-                    pPage->u29B = 0;
-                    PGM_PAGE_SET_TYPE(pPage,   PGMPAGETYPE_ROM);
-                    PGM_PAGE_SET_HCPHYS(pPage, pReq->aPages[iPage].HCPhysGCPhys);
-                    PGM_PAGE_SET_STATE(pPage,  PGM_PAGE_STATE_ALLOCATED);
-                    PGM_PAGE_SET_PAGEID(pPage, pReq->aPages[iPage].idPage);
+                    PGM_PAGE_INIT(pPage,
+                                  pReq->aPages[iPage].HCPhysGCPhys,
+                                  pReq->aPages[iPage].idPage,
+                                  PGMPAGETYPE_ROM,
+                                  PGM_PAGE_STATE_ALLOCATED);
 
                     pRomPage->Virgin = *pPage;
@@ -591,14 +577,6 @@
                     {
                         PPGMROMPAGE pPage = &pRomNew->aPages[iPage];
-
-                        pPage->Shadow.HCPhys = 0;
-                        pPage->Shadow.fWrittenTo = 0;
-                        pPage->Shadow.fSomethingElse = 0;
-                        pPage->Shadow.u29B = 0;
-                        PGM_PAGE_SET_TYPE(  &pPage->Shadow, PGMPAGETYPE_ROM_SHADOW);
-                        PGM_PAGE_SET_STATE( &pPage->Shadow, PGM_PAGE_STATE_ZERO);
-                        PGM_PAGE_SET_PAGEID(&pPage->Shadow, pReq->aPages[iPage].idPage);
-
-                        pRomNew->aPages[iPage].enmProt = PGMROMPROT_READ_ROM_WRITE_IGNORE;
+                        pPage->enmProt = PGMROMPROT_READ_ROM_WRITE_IGNORE;
+                        PGM_PAGE_INIT_ZERO_REAL(&pPage->Shadow, pVM, PGMPAGETYPE_ROM_SHADOW);
                     }
 
@@ -787,11 +765,5 @@
                     for (iPage = 0; iPage < cPages; iPage++)
                         if (PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) != PGM_PAGE_STATE_ZERO)
-                        {
-                            PGM_PAGE_SET_STATE( &pRom->aPages[iPage].Shadow, PGM_PAGE_STATE_ZERO);
-                            PGM_PAGE_SET_HCPHYS(&pRom->aPages[iPage].Shadow, pVM->pgm.s.HCPhysZeroPg);
-                            PGM_PAGE_SET_PAGEID(&pRom->aPages[iPage].Shadow, NIL_GMM_PAGEID);
-                            pRom->aPages[iPage].Shadow.fWrittenTo = false;
-                            iReqPage++;
-                        }
+                            PGM_PAGE_INIT_ZERO_REAL(&pRom->aPages[iPage].Shadow, pVM, PGMPAGETYPE_ROM_SHADOW);
                 }
             }
@@ -909,5 +881,5 @@
                     *pOld = *pRamPage;
                     *pRamPage = *pNew;
-                    /** @todo sync the volatile flags (handlers) when these have been moved out of HCPhys. */
+                    /** @todo preserve the volatile flags (handlers) when these have been moved out of HCPhys! */
                 }
             }
@@ -1050,11 +1022,8 @@
             while (iPage-- > 0)
             {
-                pNew->aPages[iPage].HCPhys = (paPages[iPage].Phys & X86_PTE_PAE_PG_MASK) | fFlags; /** @todo PAGE FLAGS */
-                pNew->aPages[iPage].fWrittenTo = 0;
-                pNew->aPages[iPage].fSomethingElse = 0;
-                pNew->aPages[iPage].u29B = 0;
-                PGM_PAGE_SET_PAGEID(&pNew->aPages[iPage],   NIL_GMM_PAGEID);
-                PGM_PAGE_SET_TYPE(&pNew->aPages[iPage],     fFlags & MM_RAM_FLAGS_MMIO2 ? PGMPAGETYPE_MMIO2 : PGMPAGETYPE_RAM);
-                PGM_PAGE_SET_STATE(&pNew->aPages[iPage],    PGM_PAGE_STATE_ALLOCATED);
+                PGM_PAGE_INIT(&pNew->aPages[iPage], paPages[iPage].Phys & X86_PTE_PAE_PG_MASK, NIL_GMM_PAGEID,
+                              fFlags & MM_RAM_FLAGS_MMIO2 ? PGMPAGETYPE_MMIO2 : PGMPAGETYPE_RAM,
+                              PGM_PAGE_STATE_ALLOCATED);
+                pNew->aPages[iPage].HCPhys |= fFlags; /** @todo PAGE FLAGS*/
             }
         }
@@ -1071,11 +1040,6 @@
             while (iPage-- > 0)
             {
+                PGM_PAGE_INIT(&pNew->aPages[iPage], 0, NIL_GMM_PAGEID, PGMPAGETYPE_RAM, PGM_PAGE_STATE_ZERO);
                 pNew->aPages[iPage].HCPhys = fFlags; /** @todo PAGE FLAGS */
-                pNew->aPages[iPage].fWrittenTo = 0;
-                pNew->aPages[iPage].fSomethingElse = 0;
-                pNew->aPages[iPage].u29B = 0;
-                PGM_PAGE_SET_PAGEID(&pNew->aPages[iPage],   NIL_GMM_PAGEID);
-                PGM_PAGE_SET_TYPE(&pNew->aPages[iPage],     PGMPAGETYPE_RAM);
-                PGM_PAGE_SET_STATE(&pNew->aPages[iPage],    PGM_PAGE_STATE_ZERO);
             }
         }
@@ -1083,14 +1047,9 @@
         {
             Assert(fFlags == (MM_RAM_FLAGS_RESERVED | MM_RAM_FLAGS_MMIO));
-            RTHCPHYS HCPhysDummyPage = (MMR3PageDummyHCPhys(pVM) & X86_PTE_PAE_PG_MASK) | fFlags; /** @todo PAGE FLAGS */
+            RTHCPHYS HCPhysDummyPage = MMR3PageDummyHCPhys(pVM);
             while (iPage-- > 0)
             {
-                pNew->aPages[iPage].HCPhys = HCPhysDummyPage; /** @todo PAGE FLAGS */
-                pNew->aPages[iPage].fWrittenTo = 0;
-                pNew->aPages[iPage].fSomethingElse = 0;
-                pNew->aPages[iPage].u29B = 0;
-                PGM_PAGE_SET_PAGEID(&pNew->aPages[iPage],   NIL_GMM_PAGEID);
-                PGM_PAGE_SET_TYPE(&pNew->aPages[iPage],     PGMPAGETYPE_MMIO);
-                PGM_PAGE_SET_STATE(&pNew->aPages[iPage],    PGM_PAGE_STATE_ZERO);
+                PGM_PAGE_INIT(&pNew->aPages[iPage], HCPhysDummyPage, NIL_GMM_PAGEID, PGMPAGETYPE_MMIO, PGM_PAGE_STATE_ZERO);
+                pNew->aPages[iPage].HCPhys |= fFlags; /** @todo PAGE FLAGS*/
             }
         }
Index: /trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp	(revision 6868)
+++ /trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp	(revision 6869)
@@ -425,9 +425,9 @@
 int pgmPhysPageMakeWritable(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys)
 {
-    switch (pPage->u2State)
+    switch (PGM_PAGE_GET_STATE(pPage))
     {
         case PGM_PAGE_STATE_WRITE_MONITORED:
-            pPage->fWrittenTo = true;
-            pPage->u2State = PGM_PAGE_STATE_ALLOCATED;
+            PGM_PAGE_SET_WRITTEN_TO(pPage);
+            PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ALLOCATED);
             /* fall thru */
         default: /* to shut up GCC */
@@ -641,5 +641,5 @@
          */
         PPGMPAGE pPage = pTlbe->pPage;
-        if (RT_UNLIKELY(pPage->u2State != PGM_PAGE_STATE_ALLOCATED))
+        if (RT_UNLIKELY(PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED))
         {
             rc = pgmPhysPageMakeWritable(pVM, pPage, GCPhys);
