Index: trunk/src/VBox/VMM/include/PGMInternal.h
===================================================================
--- trunk/src/VBox/VMM/include/PGMInternal.h	(revision 36935)
+++ trunk/src/VBox/VMM/include/PGMInternal.h	(revision 36937)
@@ -691,6 +691,4 @@
 typedef struct PGMPAGE
 {
-    /** The physical address and the Page ID. */
-    RTHCPHYS    HCPhysAndPageID;
     union
     {
@@ -698,4 +696,7 @@
         struct
         {
+            /** The physical address and the Page ID. */
+            RTHCPHYS    HCPhysAndPageID;
+
             /** 7:0   - The physical handler state
              *  (PGM_PAGE_HNDL_PHYS_STATE_*). */
@@ -722,18 +723,22 @@
             /** 31:22 - PTE index for usage tracking (page pool). */
             uint32_t    u10PteIdx   : 10;
+
+            /** Usage tracking (page pool). */
+            uint16_t    u16TrackingY;
+            /** The number of read locks on this page. */
+            uint8_t     cReadLocksY;
+            /** The number of write locks on this page. */
+            uint8_t     cWriteLocksY;
         } bit;
-        /** 32-bit integer view. */
-        uint32_t    u;
+
+        /** 64-bit integer view. */
+        uint64_t    au64[2];
         /** 16-bit view. */
-        uint16_t    au16[2];
+        uint32_t    au32[4];
+        /** 16-bit view. */
+        uint16_t    au16[8];
         /** 8-bit view. */
-        uint8_t     au8[4];
+        uint8_t     au8[16];
     } u1;
-    /** Usage tracking (page pool). */
-    uint16_t    u16TrackingY;
-    /** The number of read locks on this page. */
-    uint8_t     cReadLocksY;
-    /** The number of write locks on this page. */
-    uint8_t     cWriteLocksY;
 } PGMPAGE;
 AssertCompileSize(PGMPAGE, 16);
@@ -752,9 +757,6 @@
 #define PGM_PAGE_CLEAR(a_pPage) \
     do { \
-        (a_pPage)->HCPhysAndPageID     = 0; \
-        (a_pPage)->u1.u                = 0; \
-        (a_pPage)->u16TrackingY        = 0; \
-        (a_pPage)->cReadLocksY         = 0; \
-        (a_pPage)->cWriteLocksY        = 0; \
+        (a_pPage)->u1.au64[0] = 0; \
+        (a_pPage)->u1.au64[1] = 0; \
     } while (0)
 
@@ -767,11 +769,8 @@
         RTHCPHYS SetHCPhysTmp = (a_HCPhys); \
         AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
-        (a_pPage)->u1.u                 = 0; \
-        (a_pPage)->u16TrackingY         = 0; \
-        (a_pPage)->cReadLocksY          = 0; \
-        (a_pPage)->cWriteLocksY         = 0; \
-        (a_pPage)->HCPhysAndPageID      = (SetHCPhysTmp << (28-12)) | ((a_idPage) & UINT32_C(0x0fffffff)); \
-        (a_pPage)->u1.bit.uStateY       = (a_uState); \
-        (a_pPage)->u1.bit.uTypeY        = (a_uType); \
+        (a_pPage)->u1.bit.HCPhysAndPageID = (SetHCPhysTmp << (28-12)) | ((a_idPage) & UINT32_C(0x0fffffff)); \
+        (a_pPage)->u1.au64[1]             = 0; \
+        (a_pPage)->u1.bit.uStateY         = (a_uState); \
+        (a_pPage)->u1.bit.uTypeY          = (a_uType); \
     } while (0)
 
@@ -829,5 +828,5 @@
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_HCPHYS(a_pPage)            ( ((a_pPage)->HCPhysAndPageID >> 28) << 12 )
+#define PGM_PAGE_GET_HCPHYS(a_pPage)            ( ((a_pPage)->u1.bit.HCPhysAndPageID >> 28) << 12 )
 
 /**
@@ -840,6 +839,6 @@
         RTHCPHYS const SetHCPhysTmp = (a_HCPhys); \
         AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
-        (a_pPage)->HCPhysAndPageID = ((a_pPage)->HCPhysAndPageID & UINT32_C(0x0fffffff)) \
-                                   | (SetHCPhysTmp << (28-12)); \
+        (a_pPage)->u1.bit.HCPhysAndPageID = ((a_pPage)->u1.bit.HCPhysAndPageID & UINT32_C(0x0fffffff)) \
+                                          | (SetHCPhysTmp << (28-12)); \
     } while (0)
 
@@ -849,5 +848,5 @@
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_PAGEID(a_pPage)            (  (uint32_t)((a_pPage)->HCPhysAndPageID & UINT32_C(0x0fffffff)) )
+#define PGM_PAGE_GET_PAGEID(a_pPage)            (  (uint32_t)((a_pPage)->u1.bit.HCPhysAndPageID & UINT32_C(0x0fffffff)) )
 
 /**
@@ -858,6 +857,6 @@
 #define PGM_PAGE_SET_PAGEID(a_pPage, a_idPage) \
     do { \
-        (a_pPage)->HCPhysAndPageID = (((a_pPage)->HCPhysAndPageID) & UINT64_C(0xfffffffff0000000)) \
-                                   | ((a_idPage) & UINT32_C(0x0fffffff)); \
+        (a_pPage)->u1.bit.HCPhysAndPageID = (((a_pPage)->u1.bit.HCPhysAndPageID) & UINT64_C(0xfffffffff0000000)) \
+                                          | ((a_idPage) & UINT32_C(0x0fffffff)); \
     } while (0)
 
@@ -874,5 +873,5 @@
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_PAGE_IN_CHUNK(a_pPage)     ( (uint32_t)((a_pPage)->HCPhysAndPageID & GMM_PAGEID_IDX_MASK) )
+#define PGM_PAGE_GET_PAGE_IN_CHUNK(a_pPage)     ( (uint32_t)((a_pPage)->u1.bit.HCPhysAndPageID & GMM_PAGEID_IDX_MASK) )
 
 /**
@@ -1114,5 +1113,5 @@
 #ifdef PGM_PAGE_WITH_OPTIMIZED_HANDLER_ACCESS
 # define PGM_PAGE_HAS_ANY_HANDLERS(a_pPage) \
-    ( ((a_pPage)->u1.u & UINT16_C(0x0303)) != 0 )
+    ( ((a_pPage)->u1.au32[2] & UINT16_C(0x0303)) != 0 )
 #else
 # define PGM_PAGE_HAS_ANY_HANDLERS(a_pPage) \
@@ -1128,5 +1127,5 @@
 #ifdef PGM_PAGE_WITH_OPTIMIZED_HANDLER_ACCESS
 # define PGM_PAGE_HAS_ACTIVE_HANDLERS(a_pPage) \
-    ( ((a_pPage)->u1.u & UINT16_C(0x0202)) != 0 )
+    ( ((a_pPage)->u1.au32[2] & UINT16_C(0x0202)) != 0 )
 #else
 # define PGM_PAGE_HAS_ACTIVE_HANDLERS(a_pPage) \
@@ -1142,5 +1141,5 @@
 #ifdef PGM_PAGE_WITH_OPTIMIZED_HANDLER_ACCESS
 # define PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(a_pPage) \
-    (   ( ((a_pPage)->u1.au8[0] | (a_pPage)->u1.au8[1]) & UINT8_C(0x3) ) \
+    (   ( ((a_pPage)->u1.au8[8] | (a_pPage)->u1.au8[9]) & UINT8_C(0x3) ) \
      == PGM_PAGE_HNDL_PHYS_STATE_ALL )
 #else
@@ -1156,5 +1155,5 @@
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_TRACKING(a_pPage)          ( (a_pPage)->u16TrackingY )
+#define PGM_PAGE_GET_TRACKING(a_pPage)          ( (a_pPage)->u1.bit.u16TrackingY )
 
 /** @def PGM_PAGE_SET_TRACKING
@@ -1164,5 +1163,5 @@
  */
 #define PGM_PAGE_SET_TRACKING(a_pPage, a_u16TrackingData) \
-    do { (a_pPage)->u16TrackingY = (a_u16TrackingData); } while (0)
+    do { (a_pPage)->u1.bit.u16TrackingY = (a_u16TrackingData); } while (0)
 
 /** @def PGM_PAGE_GET_TD_CREFS
@@ -1190,5 +1189,5 @@
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_READ_LOCKS(a_pPage)        ( (a_pPage)->cReadLocksY )
+#define PGM_PAGE_GET_READ_LOCKS(a_pPage)        ( (a_pPage)->u1.bit.cReadLocksY )
 
 /** Get the write lock count.
@@ -1196,25 +1195,25 @@
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_GET_WRITE_LOCKS(a_pPage)       ( (a_pPage)->cWriteLocksY )
+#define PGM_PAGE_GET_WRITE_LOCKS(a_pPage)       ( (a_pPage)->u1.bit.cWriteLocksY )
 
 /** Decrement the read lock counter.
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_DEC_READ_LOCKS(a_pPage)        do { --(a_pPage)->cReadLocksY; } while (0)
+#define PGM_PAGE_DEC_READ_LOCKS(a_pPage)        do { --(a_pPage)->u1.bit.cReadLocksY; } while (0)
 
 /** Decrement the write lock counter.
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_DEC_WRITE_LOCKS(a_pPage)       do { --(a_pPage)->cWriteLocksY; } while (0)
+#define PGM_PAGE_DEC_WRITE_LOCKS(a_pPage)       do { --(a_pPage)->u1.bit.cWriteLocksY; } while (0)
 
 /** Increment the read lock counter.
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_INC_READ_LOCKS(a_pPage)        do { ++(a_pPage)->cReadLocksY; } while (0)
+#define PGM_PAGE_INC_READ_LOCKS(a_pPage)        do { ++(a_pPage)->u1.bit.cReadLocksY; } while (0)
 
 /** Increment the write lock counter.
  * @param   a_pPage     Pointer to the physical guest page tracking structure.
  */
-#define PGM_PAGE_INC_WRITE_LOCKS(a_pPage)       do { ++(a_pPage)->cWriteLocksY; } while (0)
+#define PGM_PAGE_INC_WRITE_LOCKS(a_pPage)       do { ++(a_pPage)->u1.bit.cWriteLocksY; } while (0)
 
 
Index: trunk/src/VBox/VMM/testcase/tstVMStructRC.cpp
===================================================================
--- trunk/src/VBox/VMM/testcase/tstVMStructRC.cpp	(revision 36935)
+++ trunk/src/VBox/VMM/testcase/tstVMStructRC.cpp	(revision 36937)
@@ -691,8 +691,8 @@
     GEN_CHECK_OFF(PGMVIRTHANDLER, aPhysToVirt);
     GEN_CHECK_SIZE(PGMPAGE);
-    GEN_CHECK_OFF(PGMPAGE, HCPhysAndPageID);
-    GEN_CHECK_OFF(PGMPAGE, cReadLocksY);
-    GEN_CHECK_OFF(PGMPAGE, cWriteLocksY);
-    GEN_CHECK_OFF(PGMPAGE, u16TrackingY);
+    GEN_CHECK_OFF(PGMPAGE, u1.bit.HCPhysAndPageID);
+    GEN_CHECK_OFF(PGMPAGE, u1.bit.cReadLocksY);
+    GEN_CHECK_OFF(PGMPAGE, u1.bit.cWriteLocksY);
+    GEN_CHECK_OFF(PGMPAGE, u1.bit.u16TrackingY);
     GEN_CHECK_SIZE(PGMRAMRANGE);
     GEN_CHECK_OFF(PGMRAMRANGE, pNextR3);
