Index: /trunk/include/VBox/vm.h
===================================================================
--- /trunk/include/VBox/vm.h	(revision 22884)
+++ /trunk/include/VBox/vm.h	(revision 22885)
@@ -134,5 +134,5 @@
         struct PGMCPU       s;
 #endif
-        char                padding[32*1024];   /* multiple of 64 */
+        char                padding[28*1024];   /* multiple of 64 */
     } pgm;
 
@@ -143,5 +143,5 @@
         struct HWACCMCPU    s;
 #endif
-        char                padding[6144];      /* multiple of 64 */
+        char                padding[5248];      /* multiple of 64 */
     } hwaccm;
 
@@ -152,5 +152,5 @@
         struct EMCPU        s;
 #endif
-        char                padding[2048];      /* multiple of 64 */
+        char                padding[1280];      /* multiple of 64 */
     } em;
 
@@ -179,5 +179,5 @@
         struct VMMCPU       s;
 #endif
-        char                padding[384];       /* multiple of 64 */
+        char                padding[256];       /* multiple of 64 */
     } vmm;
 
@@ -210,4 +210,6 @@
     } dbgf;
 
+    /** Align at page boundrary. */
+    uint8_t                 abReserved[HC_ARCH_BITS == 32 ? 448 : 64];
 } VMCPU;
 
@@ -716,5 +718,5 @@
      * @remark  Assume interrupts disabled.
      */
-    RTRCPTR             pfnVMMGCGuestToHostAsmGuestCtx/*(int32_t eax, CPUMCTXCORE Ctx)*/;
+    RTRCPTR                     pfnVMMGCGuestToHostAsmGuestCtx/*(int32_t eax, CPUMCTXCORE Ctx)*/;
 
     /**
@@ -731,5 +733,5 @@
      * @remark  Assume interrupts disabled.
      */
-    RTRCPTR             pfnVMMGCGuestToHostAsmHyperCtx/*(int32_t eax, PCPUMCTXCORE ecx)*/;
+    RTRCPTR                     pfnVMMGCGuestToHostAsmHyperCtx/*(int32_t eax, PCPUMCTXCORE ecx)*/;
 
     /**
@@ -743,5 +745,5 @@
      * @remark  Assume interrupts disabled.
      */
-    RTRCPTR             pfnVMMGCGuestToHostAsm/*(int32_t eax)*/;
+    RTRCPTR                     pfnVMMGCGuestToHostAsm/*(int32_t eax)*/;
     /** @} */
 
@@ -749,8 +751,8 @@
     /** @name Various VM data owned by VM.
      * @{ */
-    RTTHREAD            uPadding1;
+    RTTHREAD                    uPadding1;
     /** The native handle of ThreadEMT. Getting the native handle
      * is generally faster than getting the IPRT one (except on OS/2 :-). */
-    RTNATIVETHREAD      uPadding2;
+    RTNATIVETHREAD              uPadding2;
     /** @} */
 
@@ -759,21 +761,21 @@
      * @{ */
     /** Raw ring-3 indicator.  */
-    bool                fRawR3Enabled;
+    bool                        fRawR3Enabled;
     /** Raw ring-0 indicator. */
-    bool                fRawR0Enabled;
+    bool                        fRawR0Enabled;
     /** PATM enabled flag.
      * This is placed here for performance reasons. */
-    bool                fPATMEnabled;
+    bool                        fPATMEnabled;
     /** CSAM enabled flag.
      * This is placed here for performance reasons. */
-    bool                fCSAMEnabled;
+    bool                        fCSAMEnabled;
     /** Hardware VM support is available and enabled.
      * This is placed here for performance reasons. */
-    bool                fHWACCMEnabled;
+    bool                        fHWACCMEnabled;
     /** Hardware VM support is required and non-optional.
      * This is initialized together with the rest of the VM structure. */
-    bool                fHwVirtExtForced;
+    bool                        fHwVirtExtForced;
     /** PARAV enabled flag. */
-    bool                fPARAVEnabled;
+    bool                        fPARAVEnabled;
     /** @} */
 
@@ -781,35 +783,35 @@
     /* padding to make gnuc put the StatQemuToGC where msc does. */
 #if HC_ARCH_BITS == 32
-    uint32_t            padding0;
+    uint32_t                    padding0;
 #endif
 
     /** Profiling the total time from Qemu to GC. */
-    STAMPROFILEADV      StatTotalQemuToGC;
+    STAMPROFILEADV              StatTotalQemuToGC;
     /** Profiling the total time from GC to Qemu. */
-    STAMPROFILEADV      StatTotalGCToQemu;
+    STAMPROFILEADV              StatTotalGCToQemu;
     /** Profiling the total time spent in GC. */
-    STAMPROFILEADV      StatTotalInGC;
+    STAMPROFILEADV              StatTotalInGC;
     /** Profiling the total time spent not in Qemu. */
-    STAMPROFILEADV      StatTotalInQemu;
+    STAMPROFILEADV              StatTotalInQemu;
     /** Profiling the VMMSwitcher code for going to GC. */
-    STAMPROFILEADV      StatSwitcherToGC;
+    STAMPROFILEADV              StatSwitcherToGC;
     /** Profiling the VMMSwitcher code for going to HC. */
-    STAMPROFILEADV      StatSwitcherToHC;
-    STAMPROFILEADV      StatSwitcherSaveRegs;
-    STAMPROFILEADV      StatSwitcherSysEnter;
-    STAMPROFILEADV      StatSwitcherDebug;
-    STAMPROFILEADV      StatSwitcherCR0;
-    STAMPROFILEADV      StatSwitcherCR4;
-    STAMPROFILEADV      StatSwitcherJmpCR3;
-    STAMPROFILEADV      StatSwitcherRstrRegs;
-    STAMPROFILEADV      StatSwitcherLgdt;
-    STAMPROFILEADV      StatSwitcherLidt;
-    STAMPROFILEADV      StatSwitcherLldt;
-    STAMPROFILEADV      StatSwitcherTSS;
+    STAMPROFILEADV              StatSwitcherToHC;
+    STAMPROFILEADV              StatSwitcherSaveRegs;
+    STAMPROFILEADV              StatSwitcherSysEnter;
+    STAMPROFILEADV              StatSwitcherDebug;
+    STAMPROFILEADV              StatSwitcherCR0;
+    STAMPROFILEADV              StatSwitcherCR4;
+    STAMPROFILEADV              StatSwitcherJmpCR3;
+    STAMPROFILEADV              StatSwitcherRstrRegs;
+    STAMPROFILEADV              StatSwitcherLgdt;
+    STAMPROFILEADV              StatSwitcherLidt;
+    STAMPROFILEADV              StatSwitcherLldt;
+    STAMPROFILEADV              StatSwitcherTSS;
 
 /** @todo Realign everything on 64 byte boundaries to better match the
  *        cache-line size. */
     /* padding - the unions must be aligned on 32 bytes boundraries. */
-    uint32_t            padding[HC_ARCH_BITS == 32 ? 4+8 : 6];
+    uint32_t                padding[HC_ARCH_BITS == 32 ? 4+8 : 6];
 
     /** CPUM part. */
@@ -819,5 +821,5 @@
         struct CPUM s;
 #endif
-        char        padding[2048];        /* multiple of 32 */
+        uint8_t     padding[1472];      /* multiple of 64 */
     } cpum;
 
@@ -828,5 +830,5 @@
         struct VMM  s;
 #endif
-        char        padding[1600];       /* multiple of 32 */
+        uint8_t     padding[1536];      /* multiple of 64 */
     } vmm;
 
@@ -837,5 +839,5 @@
         struct PGM  s;
 #endif
-        char        padding[16*1024];   /* multiple of 32 */
+        uint8_t     padding[5184];      /* multiple of 64 */
     } pgm;
 
@@ -846,5 +848,5 @@
         struct HWACCM s;
 #endif
-        char        padding[8192];       /* multiple of 32 */
+        uint8_t     padding[5376];      /* multiple of 64 */
     } hwaccm;
 
@@ -855,5 +857,5 @@
         struct TRPM s;
 #endif
-        char        padding[5344];      /* multiple of 32 */
+        uint8_t     padding[5184];      /* multiple of 64 */
     } trpm;
 
@@ -864,5 +866,5 @@
         struct SELM s;
 #endif
-        char        padding[544];      /* multiple of 32 */
+        uint8_t     padding[576];       /* multiple of 64 */
     } selm;
 
@@ -873,15 +875,6 @@
         struct MM   s;
 #endif
-        char        padding[192];       /* multiple of 32 */
+        uint8_t     padding[192];       /* multiple of 64 */
     } mm;
-
-    /** CFGM part. */
-    union
-    {
-#ifdef ___CFGMInternal_h
-        struct CFGM s;
-#endif
-        char        padding[32];        /* multiple of 32 */
-    } cfgm;
 
     /** PDM part. */
@@ -891,5 +884,5 @@
         struct PDM s;
 #endif
-        char        padding[1824];      /* multiple of 32 */
+        uint8_t     padding[1024];      /* multiple of 64 */
     } pdm;
 
@@ -900,5 +893,5 @@
         struct IOM s;
 #endif
-        char        padding[4544];      /* multiple of 32 */
+        uint8_t     padding[768];       /* multiple of 64 */
     } iom;
 
@@ -909,5 +902,5 @@
         struct PATM s;
 #endif
-        char        padding[768];       /* multiple of 32 */
+        uint8_t     padding[768];       /* multiple of 64 */
     } patm;
 
@@ -918,15 +911,6 @@
         struct CSAM s;
 #endif
-        char        padding[3328];    /* multiple of 32 */
+        uint8_t     padding[1024];      /* multiple of 64 */
     } csam;
-
-    /** PARAV part. */
-    union
-    {
-#ifdef ___PARAVInternal_h
-        struct PARAV s;
-#endif
-        char        padding[128];
-    } parav;
 
     /** EM part. */
@@ -936,5 +920,5 @@
         struct EM   s;
 #endif
-        char        padding[256];         /* multiple of 32 */
+        uint8_t     padding[256];       /* multiple of 64 */
     } em;
 
@@ -945,5 +929,5 @@
         struct TM   s;
 #endif
-        char        padding[2112];      /* multiple of 32 */
+        uint8_t     padding[2112];      /* multiple of 64 */
     } tm;
 
@@ -954,5 +938,5 @@
         struct DBGF s;
 #endif
-        char        padding[2368];      /* multiple of 32 */
+        uint8_t     padding[2368];      /* multiple of 64 */
     } dbgf;
 
@@ -963,15 +947,6 @@
         struct SSM  s;
 #endif
-        char        padding[32];        /* multiple of 32 */
+        uint8_t     padding[64];        /* multiple of 64 */
     } ssm;
-
-    /** VM part. */
-    union
-    {
-#ifdef ___VMInternal_h
-        struct VMINT    s;
-#endif
-        char        padding[768];       /* multiple of 32 */
-    } vm;
 
     /** REM part. */
@@ -985,13 +960,45 @@
  * Must be multiple of 32 and coherent with REM_ENV_SIZE from REMInternal.h. */
 # define VM_REM_SIZE        0x11100
-        char        padding[VM_REM_SIZE];   /* multiple of 32 */
+        uint8_t     padding[VM_REM_SIZE];   /* multiple of 32 */
     } rem;
 
+    /* ---- begin small stuff ---- */
+
+    /** VM part. */
+    union
+    {
+#ifdef ___VMInternal_h
+        struct VMINT    s;
+#endif
+        uint8_t     padding[24];        /* multiple of 8 */
+    } vm;
+
+    /** PARAV part. */
+    union
+    {
+#ifdef ___PARAVInternal_h
+        struct PARAV s;
+#endif
+        uint8_t     padding[24];        /* multiple of 8 */
+    } parav;
+
+    /** CFGM part. */
+    union
+    {
+#ifdef ___CFGMInternal_h
+        struct CFGM s;
+#endif
+        uint8_t     padding[8];         /* multiple of 8 */
+    } cfgm;
+
     /** Padding for aligning the cpu array on a 64 byte boundrary. */
-    uint32_t    u32Reserved2[8];
+    uint8_t         abReserved2[8 + (HC_ARCH_BITS == 32 ? 3712 : 0)];
+
+    /* ---- end small stuff ---- */
 
     /** VMCPU array for the configured number of virtual CPUs.
-     * Must be aligned on a 64-byte boundrary.  */
-    VMCPU       aCpus[1];
+     * Must be aligned on a page boundrary for TLB hit reasons as well as
+     * alignment of VMCPU members. */
+    VMCPU           aCpus[1];
 } VM;
 
Index: /trunk/include/VBox/vm.mac
===================================================================
--- /trunk/include/VBox/vm.mac	(revision 22884)
+++ /trunk/include/VBox/vm.mac	(revision 22885)
@@ -97,6 +97,6 @@
 
     alignb 64
-    .cpum                   resb 2048
-    .vmm                    resb 1024
+    .cpum                   resb 1472
+    .vmm                    resb 1536
 
 endstruc
Index: /trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
===================================================================
--- /trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp	(revision 22884)
+++ /trunk/src/VBox/Devices/testcase/tstDeviceStructSize.cpp	(revision 22885)
@@ -134,8 +134,13 @@
     do \
     { \
-        if ( RT_OFFSETOF(strct, member) & ((align) - 1) ) \
-        { \
-            printf("%s::%s offset=%d expected alignment %d, meaning %d off\n", #strct, #member, RT_OFFSETOF(strct, member), \
-                   align, RT_OFFSETOF(strct, member) & (align - 1)); \
+        if (RT_OFFSETOF(strct, member) & ((align) - 1) ) \
+        { \
+            printf("%s::%s offset=%#x (%u) expected alignment %x, meaning %#x (%u) off\n", \
+                   #strct, #member, \
+                   (unsigned)RT_OFFSETOF(strct, member), \
+                   (unsigned)RT_OFFSETOF(strct, member), \
+                   (unsigned)(align), \
+                   (unsigned)((align) - RT_OFFSETOF(strct, member) & ((align) - 1)), \
+                   (unsigned)((align) - RT_OFFSETOF(strct, member) & ((align) - 1)) ); \
             rc++; \
         } \
@@ -149,5 +154,11 @@
         if (RT_ALIGN_Z(sizeof(type), (align)) != sizeof(type)) \
         { \
-            printf("%s size=%#x, align=%#x %#x bytes off\n", #type, (int)sizeof(type), (align), (int)RT_ALIGN_Z(sizeof(type), align) - (int)sizeof(type)); \
+            printf("%s size=%#x (%u), align=%#x %#x (%u) bytes off\n", \
+                   #type, \
+                   (unsigned)sizeof(type), \
+                   (unsigned)sizeof(type), \
+                   (align), \
+                   (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type), \
+                   (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type)); \
             rc++; \
         } \
@@ -157,5 +168,5 @@
  * Checks that a internal struct padding is big enough.
  */
-#define CHECK_PADDING(strct, member) \
+#define CHECK_PADDING(strct, member, align) \
     do \
     { \
@@ -164,5 +175,11 @@
         { \
             printf("padding of %s::%s is too small, padding=%d struct=%d correct=%d\n", #strct, #member, \
-                   (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), 32)); \
+                   (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
+            rc++; \
+        } \
+        else if (RT_ALIGN_Z(sizeof(p->member.padding), (align)) != sizeof(p->member.padding)) \
+        { \
+            printf("padding of %s::%s is misaligned, padding=%d correct=%d\n", #strct, #member, \
+                   (int)sizeof(p->member.padding), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
             rc++; \
         } \
Index: /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp
===================================================================
--- /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp	(revision 22884)
+++ /trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp	(revision 22885)
@@ -94,7 +94,7 @@
 #include <stdio.h>
 
-#define GEN_CHECK_SIZE(s)   printf("    CHECK_SIZE(%s, %d);\n", #s, (int)sizeof(s))
-#define GEN_CHECK_OFF(s, m) printf("    CHECK_OFF(%s, %d, %s);\n", #s, (int)RT_OFFSETOF(s, m), #m)
-#define GEN_CHECK_PADDING(s, m) printf("    CHECK_PADDING(%s, %s);\n", #s, #m)
+#define GEN_CHECK_SIZE(s)           printf("    CHECK_SIZE(%s, %d);\n", #s, (int)sizeof(s))
+#define GEN_CHECK_OFF(s, m)         printf("    CHECK_OFF(%s, %d, %s);\n", #s, (int)RT_OFFSETOF(s, m), #m)
+#define GEN_CHECK_PADDING(s, m, a)  printf("    CHECK_PADDING(%s, %s, %u);\n", #s, #m, (a))
 
 int main()
@@ -141,5 +141,5 @@
     GEN_CHECK_OFF(PCIDEVICE, Int.s.pfnBridgeConfigRead);
     GEN_CHECK_OFF(PCIDEVICE, Int.s.pfnBridgeConfigWrite);
-    GEN_CHECK_PADDING(PCIDEVICE, Int);
+    GEN_CHECK_PADDING(PCIDEVICE, Int, 8);
     GEN_CHECK_SIZE(PIIX3State);
     GEN_CHECK_SIZE(PCIBUS);
Index: /trunk/src/VBox/VMM/VM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VM.cpp	(revision 22884)
+++ /trunk/src/VBox/VMM/VM.cpp	(revision 22885)
@@ -1896,4 +1896,5 @@
     rc = CPUMR3Term(pVM);
     AssertRC(rc);
+    SSMR3Term(pVM);
     rc = PDMR3CritSectTerm(pVM);
     AssertRC(rc);
Index: /trunk/src/VBox/VMM/testcase/tstHelp.h
===================================================================
--- /trunk/src/VBox/VMM/testcase/tstHelp.h	(revision 22884)
+++ /trunk/src/VBox/VMM/testcase/tstHelp.h	(revision 22885)
@@ -70,8 +70,13 @@
     do \
     { \
-        if ( RT_OFFSETOF(strct, member) & ((align) - 1) ) \
+        if (RT_OFFSETOF(strct, member) & ((align) - 1) ) \
         { \
-            printf("%s::%s offset=%#x expected alignment %x, meaning %#x off\n", #strct, #member, (unsigned)RT_OFFSETOF(strct, member), \
-                   (unsigned)(align), (unsigned)(RT_OFFSETOF(strct, member) & ((align) - 1))); \
+            printf("%s::%s offset=%#x (%u) expected alignment %x, meaning %#x (%u) off\n", \
+                   #strct, #member, \
+                   (unsigned)RT_OFFSETOF(strct, member), \
+                   (unsigned)RT_OFFSETOF(strct, member), \
+                   (unsigned)(align), \
+                   (unsigned)((align) - RT_OFFSETOF(strct, member) & ((align) - 1)), \
+                   (unsigned)((align) - RT_OFFSETOF(strct, member) & ((align) - 1)) ); \
             rc++; \
         } \
@@ -85,6 +90,11 @@
         if (RT_ALIGN_Z(sizeof(type), (align)) != sizeof(type)) \
         { \
-            printf("%s size=%#x, align=%#x %#x bytes off\n", #type, (int)sizeof(type), \
-                  (align), (int)RT_ALIGN_Z(sizeof(type), align) - (int)sizeof(type)); \
+            printf("%s size=%#x (%u), align=%#x %#x (%u) bytes off\n", \
+                   #type, \
+                   (unsigned)sizeof(type), \
+                   (unsigned)sizeof(type), \
+                   (align), \
+                   (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type), \
+                   (unsigned)RT_ALIGN_Z(sizeof(type), align) - (unsigned)sizeof(type)); \
             rc++; \
         } \
@@ -94,5 +104,5 @@
  * Checks that a internal struct padding is big enough.
  */
-#define CHECK_PADDING(strct, member) \
+#define CHECK_PADDING(strct, member, align) \
     do \
     { \
@@ -101,5 +111,11 @@
         { \
             printf("padding of %s::%s is too small, padding=%d struct=%d correct=%d\n", #strct, #member, \
-                   (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), 64)); \
+                   (int)sizeof(p->member.padding), (int)sizeof(p->member.s), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
+            rc++; \
+        } \
+        else if (RT_ALIGN_Z(sizeof(p->member.padding), (align)) != sizeof(p->member.padding)) \
+        { \
+            printf("padding of %s::%s is misaligned, padding=%d correct=%d\n", #strct, #member, \
+                   (int)sizeof(p->member.padding), (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
             rc++; \
         } \
Index: /trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
===================================================================
--- /trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp	(revision 22884)
+++ /trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp	(revision 22885)
@@ -73,17 +73,29 @@
     printf("struct VM: %d bytes\n", (int)sizeof(VM));
 
-#define CHECK_PADDING_VM(member) \
+#define CHECK_PADDING_VM(align, member) \
     do \
     { \
-        CHECK_PADDING(VM, member); \
-        CHECK_MEMBER_ALIGNMENT(VM, member, 32); \
+        CHECK_PADDING(VM, member, align); \
+        CHECK_MEMBER_ALIGNMENT(VM, member, align); \
+        VM *p; \
+        if (sizeof(p->member.padding) >= (ssize_t)sizeof(p->member.s) + 128 + sizeof(p->member.s) / 20) \
+            printf("warning: VM::%-8s: padding=%-5d s=%-5d -> %-4d  suggest=%-5u\n", \
+                   #member, (int)sizeof(p->member.padding), (int)sizeof(p->member.s), \
+                   (int)sizeof(p->member.padding) - (int)sizeof(p->member.s), \
+                   (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
     } while (0)
 
 
-#define CHECK_PADDING_VMCPU(member) \
+#define CHECK_PADDING_VMCPU(align, member) \
     do \
     { \
-        CHECK_PADDING(VMCPU, member); \
-        CHECK_MEMBER_ALIGNMENT(VMCPU, member, 32); \
+        CHECK_PADDING(VMCPU, member, align); \
+        CHECK_MEMBER_ALIGNMENT(VMCPU, member, align); \
+        VMCPU *p; \
+        if (sizeof(p->member.padding) >= (ssize_t)sizeof(p->member.s) + 128 + sizeof(p->member.s) / 20) \
+            printf("warning: VMCPU::%-8s: padding=%-5d s=%-5d -> %-4d  suggest=%-5u\n", \
+                   #member, (int)sizeof(p->member.padding), (int)sizeof(p->member.s), \
+                   (int)sizeof(p->member.padding) - (int)sizeof(p->member.s), \
+                   (int)RT_ALIGN_Z(sizeof(p->member.s), (align))); \
     } while (0)
 
@@ -137,30 +149,36 @@
     CHECK_SIZE(X86PML4, PAGE_SIZE);
 
-    CHECK_PADDING_VM(cfgm);
-    CHECK_PADDING_VM(cpum);
-    CHECK_PADDING_VM(dbgf);
-    CHECK_PADDING_VM(em);
-    CHECK_PADDING_VM(iom);
-    CHECK_PADDING_VM(mm);
-    CHECK_PADDING_VM(pdm);
-    CHECK_PADDING_VM(pgm);
-    CHECK_PADDING_VM(selm);
-    CHECK_PADDING_VM(tm);
-    CHECK_PADDING_VM(trpm);
-    CHECK_PADDING_VM(vm);
-    CHECK_PADDING_VM(vmm);
-    CHECK_PADDING_VM(ssm);
-    CHECK_PADDING_VM(rem);
-    CHECK_PADDING_VM(hwaccm);
-    CHECK_PADDING_VM(patm);
-    CHECK_PADDING_VM(csam);
-
-    CHECK_PADDING_VMCPU(cpum);
-    CHECK_PADDING_VMCPU(pgm);
-    CHECK_PADDING_VMCPU(em);
-    CHECK_PADDING_VMCPU(hwaccm);
-    CHECK_PADDING_VMCPU(trpm);
-    CHECK_PADDING_VMCPU(tm);
-    CHECK_PADDING_VMCPU(vmm);
+    CHECK_PADDING_VM(64, cpum);
+    CHECK_PADDING_VM(64, vmm);
+    CHECK_PADDING_VM(64, pgm);
+    CHECK_PADDING_VM(64, hwaccm);
+    CHECK_PADDING_VM(64, trpm);
+    CHECK_PADDING_VM(64, selm);
+    CHECK_PADDING_VM(64, mm);
+    CHECK_PADDING_VM(64, pdm);
+    CHECK_PADDING_VM(64, iom);
+    CHECK_PADDING_VM(64, patm);
+    CHECK_PADDING_VM(64, csam);
+    CHECK_PADDING_VM(64, em);
+    CHECK_PADDING_VM(64, tm);
+    CHECK_PADDING_VM(64, dbgf);
+    CHECK_PADDING_VM(64, ssm);
+    CHECK_PADDING_VM(64, rem);
+    CHECK_PADDING_VM(8, vm);
+#ifdef VBOX_WITH_VMI
+    CHECK_PADDING_VM(8, parav);
+#endif
+    CHECK_PADDING_VM(8, cfgm);
+
+    CHECK_PADDING_VMCPU(64, cpum);
+    CHECK_PADDING_VMCPU(64, pgm);
+    CHECK_PADDING_VMCPU(64, hwaccm);
+    CHECK_PADDING_VMCPU(64, em);
+    CHECK_PADDING_VMCPU(64, trpm);
+    CHECK_PADDING_VMCPU(64, tm);
+    CHECK_PADDING_VMCPU(64, vmm);
+    CHECK_PADDING_VMCPU(64, pdm);
+    CHECK_PADDING_VMCPU(64, iom);
+    CHECK_PADDING_VMCPU(64, dbgf);
 
     CHECK_MEMBER_ALIGNMENT(VM, selm.s.Tss, 16);
@@ -207,14 +225,8 @@
     CHECK_MEMBER_ALIGNMENT(VM, rem.s.StatsInQEMU, 8);
     CHECK_MEMBER_ALIGNMENT(VM, rem.s.Env, 32);
-    CHECK_MEMBER_ALIGNMENT(VM, aCpus, 64);
-
-    /* vmcpu */
-    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum, 64);
-    CHECK_MEMBER_ALIGNMENT(VMCPU, vmm, 32);
-    CHECK_MEMBER_ALIGNMENT(VMCPU, pgm, 32);
-    CHECK_MEMBER_ALIGNMENT(VMCPU, em, 32);
-    CHECK_MEMBER_ALIGNMENT(VMCPU, hwaccm, 32);
-    CHECK_MEMBER_ALIGNMENT(VMCPU, tm, 32);
-    CHECK_SIZE_ALIGNMENT(VMCPU, 32);
+
+    /* the VMCPUs are page aligned TLB hit reassons. */
+    CHECK_MEMBER_ALIGNMENT(VM, aCpus, 4096);
+    CHECK_SIZE_ALIGNMENT(VMCPU, 4096);
 
     /* cpumctx */
@@ -268,9 +280,9 @@
     /* pdm */
     CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 64);
-    CHECK_PADDING(PDMDEVINS, Internal);
+    CHECK_PADDING(PDMDEVINS, Internal, 1);
     CHECK_MEMBER_ALIGNMENT(PDMUSBINS, achInstanceData, 16);
-    CHECK_PADDING(PDMUSBINS, Internal);
+    CHECK_PADDING(PDMUSBINS, Internal, 1);
     CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 16);
-    CHECK_PADDING(PDMDRVINS, Internal);
+    CHECK_PADDING(PDMDRVINS, Internal, 1);
     CHECK_PADDING2(PDMCRITSECT);
     CHECK_MEMBER_ALIGNMENT(PGMPOOLPAGE, idx, sizeof(uint16_t));
