Index: /trunk/src/VBox/VMM/IOMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/IOMInternal.h	(revision 22923)
+++ /trunk/src/VBox/VMM/IOMInternal.h	(revision 22924)
@@ -30,4 +30,5 @@
 #include <VBox/pdmcritsect.h>
 #include <VBox/param.h>
+#include <iprt/assert.h>
 #include <iprt/avl.h>
 
@@ -130,4 +131,5 @@
     STAMCOUNTER                 WriteRZToR3;
 } IOMMMIOSTATS;
+AssertCompileMemberAlignment(IOMMMIOSTATS, ReadR3, 8);
 /** Pointer to I/O port statistics. */
 typedef IOMMMIOSTATS *PIOMMMIOSTATS;
@@ -241,5 +243,5 @@
     /** Avl node core with the port as Key. */
     AVLOIOPORTNODECORE          Core;
-#if HC_ARCH_BITS == 64 && !defined(RT_OS_WINDOWS)
+#if HC_ARCH_BITS != 64 || !defined(RT_OS_WINDOWS)
     uint32_t                    u32Alignment; /**< The sizeof(Core) differs. */
 #endif
@@ -267,4 +269,5 @@
     STAMCOUNTER                 OutRZToR3;
 } IOMIOPORTSTATS;
+AssertCompileMemberAlignment(IOMIOPORTSTATS, InR3, 8);
 /** Pointer to I/O port statistics. */
 typedef IOMIOPORTSTATS *PIOMIOPORTSTATS;
Index: /trunk/src/VBox/VMM/MMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/MMInternal.h	(revision 22923)
+++ /trunk/src/VBox/VMM/MMInternal.h	(revision 22924)
@@ -28,4 +28,5 @@
 #include <VBox/stam.h>
 #include <VBox/pdmcritsect.h>
+#include <iprt/assert.h>
 #include <iprt/avl.h>
 #include <iprt/critsect.h>
@@ -67,4 +68,8 @@
     struct MMHEAP          *pHeap;
 #ifdef MMR3HEAP_WITH_STATISTICS
+# if HC_ARCH_BITS == 32
+    /** Aligning the statistics on an 8 byte boundrary (for uint64_t and STAM). */
+    void                   *pvAlignment;
+# endif
     /** Number of allocation. */
     uint64_t                cAllocations;
@@ -83,6 +88,10 @@
 #endif
 } MMHEAPSTAT;
+#ifdef MMR3HEAP_WITH_STATISTICS
+AssertCompileMemberAlignment(MMHEAPSTAT, cAllocations, 8);
+#endif
 /** Pointer to heap statistics record. */
 typedef MMHEAPSTAT *PMMHEAPSTAT;
+
 
 
@@ -169,4 +178,5 @@
     size_t                  cbCurAllocated;
 } MMUKHEAPSTAT;
+AssertCompileMemberAlignment(MMUKHEAPSTAT, cAllocations, 8);
 /** Pointer to heap statistics record. */
 typedef MMUKHEAPSTAT *PMMUKHEAPSTAT;
@@ -203,7 +213,12 @@
     /** The VM handle. */
     PUVM                    pUVM;
+#if HC_ARCH_BITS == 32
+    /** Aligning the statistics on an 8 byte boundrary (for uint64_t and STAM). */
+    void                   *pvAlignment;
+#endif
     /** Heap global statistics. */
     MMUKHEAPSTAT            Stat;
 } MMUKHEAP;
+AssertCompileMemberAlignment(MMUKHEAP, Stat, 8);
 /** Pointer to MM Heap structure. */
 typedef MMUKHEAP *PMMUKHEAP;
@@ -277,4 +292,5 @@
     uint32_t                cbMaxAllocated;
 } MMHYPERSTAT;
+AssertCompileMemberAlignment(MMHYPERSTAT, cAllocations, 8);
 /** Pointer to hypervisor heap statistics record. */
 typedef MMHYPERSTAT *PMMHYPERSTAT;
@@ -536,4 +552,8 @@
     /** Number of free pages in pool. */
     uint32_t                            cFreePages;
+# if HC_ARCH_BITS == 32
+    /** Aligning the statistics on an 8 byte boundrary. */
+    uint32_t                            u32Alignment;
+# endif
     /** Number of alloc calls. */
     STAMCOUNTER                         cAllocCalls;
@@ -548,4 +568,8 @@
 #endif
 } MMPAGEPOOL;
+AssertCompileMemberAlignment(MMPAGEPOOL, cSubPools, 4);
+#ifdef VBOX_WITH_STATISTICS
+AssertCompileMemberAlignment(MMPAGEPOOL, cAllocCalls, 8);
+#endif
 /** Pointer to page pool. */
 typedef MMPAGEPOOL *PMMPAGEPOOL;
Index: /trunk/src/VBox/VMM/PDMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/PDMInternal.h	(revision 22923)
+++ /trunk/src/VBox/VMM/PDMInternal.h	(revision 22924)
@@ -30,4 +30,5 @@
 #include <VBox/vusb.h>
 #include <VBox/pdmasynccompletion.h>
+#include <iprt/assert.h>
 #include <iprt/critsect.h>
 #ifdef IN_RING3
@@ -215,8 +216,6 @@
     /** Pointer to the VM - GCPtr. */
     PVMRC                           pVMRC;
-#if HC_ARCH_BITS == 64
     /** Alignment padding. */
     uint32_t                        padding;
-#endif
     /** Event semaphore that is scheduled to be signaled upon leaving the
      * critical section. This is Ring-3 only of course. */
@@ -233,4 +232,6 @@
     STAMPROFILEADV                  StatLocked;
 } PDMCRITSECTINT;
+AssertCompileMemberAlignment(PDMCRITSECTINT, StatContentionRZLock, 8);
+/** Pointer to private critical section data. */
 typedef PDMCRITSECTINT *PPDMCRITSECTINT;
 
@@ -912,6 +913,5 @@
     /** Queue in which devhlp tasks are queued for R3 execution - RC Ptr. */
     RCPTRTYPE(PPDMQUEUE)            pDevHlpQueueRC;
-
-    RTUINT                          uPadding1; /**< Alignment padding. */
+    RTRCPTR                         uPadding1; /**< Alignment padding. */
 
     /** Linked list of timer driven PDM queues. */
@@ -946,4 +946,8 @@
     /** Pointer to the heap base (MMIO2 ring-3 mapping). NULL if not registered. */
     RTR3PTR                         pvVMMDevHeap;
+#if HC_ARCH_BITS == 32
+    /** Alignment padding. */
+    uint32_t                        u32Padding2;
+#endif
     /** The heap size. */
     RTUINT                          cbVMMDevHeap;
@@ -967,4 +971,7 @@
     STAMCOUNTER                     StatQueuedCritSectLeaves;
 } PDM;
+AssertCompileMemberAlignment(PDM, GCPhysVMMDevHeap, sizeof(RTGCPHYS));
+AssertCompileMemberAlignment(PDM, CritSect, 8);
+AssertCompileMemberAlignment(PDM, StatQueuedCritSectLeaves, 8);
 /** Pointer to PDM VM instance data. */
 typedef PDM *PPDM;
Index: /trunk/src/VBox/VMM/PGMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/PGMInternal.h	(revision 22923)
+++ /trunk/src/VBox/VMM/PGMInternal.h	(revision 22924)
@@ -37,7 +37,7 @@
 #include <VBox/gmm.h>
 #include <VBox/hwaccm.h>
-#include <iprt/avl.h>
 #include <iprt/asm.h>
 #include <iprt/assert.h>
+#include <iprt/avl.h>
 #include <iprt/critsect.h>
 
@@ -1748,4 +1748,6 @@
     /** Set if the cache is enabled. */
     bool                        fCacheEnabled;
+    /** Alignment padding. */
+    bool                        afPadding1[3];
 #endif /* PGMPOOL_WITH_CACHE */
 #ifdef PGMPOOL_WITH_MONITORING
@@ -1760,6 +1762,10 @@
     /** Access handler, R3. */
     R3PTRTYPE(PFNPGMR3PHYSHANDLER)  pfnAccessHandlerR3;
-    /** The access handler description (HC ptr). */
+    /** The access handler description (R3 ptr). */
     R3PTRTYPE(const char *)         pszAccessHandler;
+# if HC_ARCH_BITS == 32
+    /** Alignment padding. */
+    uint32_t                    u32Padding2;
+# endif
     /* Next available slot. */
     uint32_t                    idxFreeDirtyPage;
@@ -1896,4 +1902,12 @@
     PGMPOOLPAGE                 aPages[PGMPOOL_IDX_FIRST];
 } PGMPOOL, *PPGMPOOL, **PPPGMPOOL;
+#ifdef PGMPOOL_WITH_MONITORING
+AssertCompileMemberAlignment(PGMPOOL, iModifiedHead, 8);
+AssertCompileMemberAlignment(PGMPOOL, aDirtyPages, 8);
+#endif
+#ifdef VBOX_WITH_STATISTICS
+AssertCompileMemberAlignment(PGMPOOL, StatAlloc, 8);
+#endif
+AssertCompileMemberAlignment(PGMPOOL, aPages, 8);
 
 
@@ -2267,5 +2281,5 @@
     bool                            fRamPreAlloc;
     /** Alignment padding. */
-    bool                            afAlignment0[11];
+    bool                            afAlignment0[7];
 
     /*
@@ -2337,5 +2351,5 @@
     RTGCPTR                         GCPtrCR3Mapping;
 #if HC_ARCH_BITS == 64 && GC_ARCH_BITS == 32
-    uint32_t                        u32Alignment;
+    uint32_t                        u32Alignment1;
 #endif
 
@@ -2394,4 +2408,8 @@
     /** The address of the ring-0 mapping cache if we're making use of it.  */
     RTR0PTR                         pvR0DynMapUsed;
+#if HC_ARCH_BITS == 32
+    /** Alignment padding that makes the next member start on a 8 byte boundrary. */
+    uint32_t                        u32Alignment2;
+#endif
 
     /** PGM critical section.
@@ -2415,4 +2433,6 @@
      * (Only used in strict builds.) */
     bool                            fNoMorePhysWrites;
+    /** Alignment padding that makes the next member start on a 8 byte boundrary. */
+    bool                            afAlignment3[HC_ARCH_BITS == 32 ? 7: 3];
 
     /**
@@ -2427,4 +2447,6 @@
         R3R0PTRTYPE(PAVLU32NODECORE) pTree;
 #endif
+        /** The chunk age tree, ordered by ageing sequence number. */
+        R3PTRTYPE(PAVLLU32NODECORE) pAgeTree;
         /** The chunk mapping TLB. */
         PGMCHUNKR3MAPTLB            Tlb;
@@ -2434,6 +2456,4 @@
          * @cfgm    PGM/MaxRing3Chunks */
         uint32_t                    cMax;
-        /** The chunk age tree, ordered by ageing sequence number. */
-        R3PTRTYPE(PAVLLU32NODECORE) pAgeTree;
         /** The current time. */
         uint32_t                    iNow;
@@ -2566,4 +2586,13 @@
 #endif
 } PGM;
+AssertCompileMemberAlignment(PGM, paDynPageMap32BitPTEsGC, 8);
+AssertCompileMemberAlignment(PGM, HCPhysInterPD, 8);
+AssertCompileMemberAlignment(PGM, aHCPhysDynPageMapCache, 8);
+AssertCompileMemberAlignment(PGM, CritSect, 8);
+AssertCompileMemberAlignment(PGM, ChunkR3Map, 8);
+AssertCompileMemberAlignment(PGM, PhysTlbHC, 8);
+AssertCompileMemberAlignment(PGM, HCPhysZeroPg, 8);
+AssertCompileMemberAlignment(PGM, aHandyPages, 8);
+AssertCompileMemberAlignment(PGM, cRelocations, 8);
 /** Pointer to the PGM instance data. */
 typedef PGM *PPGM;
Index: /trunk/src/VBox/VMM/STAM.cpp
===================================================================
--- /trunk/src/VBox/VMM/STAM.cpp	(revision 22923)
+++ /trunk/src/VBox/VMM/STAM.cpp	(revision 22924)
@@ -597,4 +597,53 @@
         Assert(stamR3SlashCompare(pCur->pszName, pszName) > 0);
 
+#ifdef VBOX_STRICT
+    /*
+     * Check alignment requirements.
+     */
+    switch (enmType)
+    {
+            /* 8 byte / 64-bit */
+        case STAMTYPE_U64:
+        case STAMTYPE_U64_RESET:
+        case STAMTYPE_X64:
+        case STAMTYPE_X64_RESET:
+        case STAMTYPE_COUNTER:
+        case STAMTYPE_PROFILE:
+        case STAMTYPE_PROFILE_ADV:
+            AssertMsg(!((uintptr_t)pvSample & 7), ("%p - %s\n", pvSample, pszName));
+            break;
+
+            /* 4 byte / 32-bit */
+        case STAMTYPE_RATIO_U32:
+        case STAMTYPE_RATIO_U32_RESET:
+        case STAMTYPE_U32:
+        case STAMTYPE_U32_RESET:
+        case STAMTYPE_X32:
+        case STAMTYPE_X32_RESET:
+            AssertMsg(!((uintptr_t)pvSample & 3), ("%p - %s\n", pvSample, pszName));
+            break;
+
+            /* 2 byte / 32-bit */
+        case STAMTYPE_U16:
+        case STAMTYPE_U16_RESET:
+        case STAMTYPE_X16:
+        case STAMTYPE_X16_RESET:
+            AssertMsg(!((uintptr_t)pvSample & 1), ("%p - %s\n", pvSample, pszName));
+            break;
+
+            /* 1 byte / 8-bit / unaligned */
+        case STAMTYPE_U8:
+        case STAMTYPE_U8_RESET:
+        case STAMTYPE_X8:
+        case STAMTYPE_X8_RESET:
+        case STAMTYPE_CALLBACK:
+            break;
+
+        default:
+            AssertMsgFailed(("%d\n", enmType));
+            break;
+    }
+#endif /* VBOX_STRICT */
+
     /*
      * Create a new node and insert it at the current location.
Index: /trunk/src/VBox/VMM/VMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/VMInternal.h	(revision 22923)
+++ /trunk/src/VBox/VMM/VMInternal.h	(revision 22924)
@@ -25,4 +25,5 @@
 #include <VBox/cdefs.h>
 #include <VBox/vmapi.h>
+#include <iprt/assert.h>
 #include <setjmp.h>
 
@@ -361,4 +362,6 @@
      * If clear the VMR3Destroy() caller does so. */
     bool                            fEMTDoesTheCleanup;
+    /** Align the next bit. */
+    bool                            afAlignment[5];
 
     /** @name Generic Halt data
@@ -393,4 +396,6 @@
             /** How many times we've blocked while cBlockedNS and cBlockedTooLongNS has been accumulating. */
             uint32_t                cBlocks;
+            /** Align the next member. */
+            uint32_t                u32Alignment;
             /** Avg. time spend oversleeping when blocking. (Re-calculated every so often.) */
             uint64_t                cNSBlockedTooLongAvg;
@@ -450,4 +455,7 @@
     /** @} */
 } VMINTUSERPERVMCPU;
+AssertCompileMemberAlignment(VMINTUSERPERVMCPU, u64HaltsStartTS, 8);
+AssertCompileMemberAlignment(VMINTUSERPERVMCPU, Halt.Method12.cNSBlockedTooLongAvg, 8);
+AssertCompileMemberAlignment(VMINTUSERPERVMCPU, StatHaltYield, 8);
 
 /** Pointer to the VM internal data kept in the UVM. */
