Index: /trunk/include/VBox/sup.h
===================================================================
--- /trunk/include/VBox/sup.h	(revision 76467)
+++ /trunk/include/VBox/sup.h	(revision 76468)
@@ -29,6 +29,4 @@
 #include <VBox/cdefs.h>
 #include <VBox/types.h>
-#include <VBox/vmm/hm_vmx.h>
-#include <VBox/vmm/hm_svm.h>
 #include <iprt/assert.h>
 #include <iprt/stdarg.h>
@@ -117,7 +115,33 @@
     union
     {
-        VMXMSRS     vmx;
-        SVMMSRS     svm;
-    } u ;
+        struct
+        {
+            uint64_t        u64FeatCtrl;
+            uint64_t        u64Basic;
+            uint64_t        u64PinCtls;
+            uint64_t        u64ProcCtls;
+            uint64_t        u64ProcCtls2;
+            uint64_t        u64ExitCtls;
+            uint64_t        u64EntryCtls;
+            uint64_t        u64TruePinCtls;
+            uint64_t        u64TrueProcCtls;
+            uint64_t        u64TrueEntryCtls;
+            uint64_t        u64TrueExitCtls;
+            uint64_t        u64Misc;
+            uint64_t        u64Cr0Fixed0;
+            uint64_t        u64Cr0Fixed1;
+            uint64_t        u64Cr4Fixed0;
+            uint64_t        u64Cr4Fixed1;
+            uint64_t        u64VmcsEnum;
+            uint64_t        u64VmFunc;
+            uint64_t        u64EptVpidCaps;
+            uint64_t        a_u64Reserved[9];
+        } vmx;
+        struct
+        {
+            uint64_t        u64MsrHwcr;
+            uint64_t        u64Padding[27];
+        }svm;
+    } u;
 } SUPHWVIRTMSRS;
 AssertCompileSize(SUPHWVIRTMSRS, 224);
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp	(revision 76467)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp	(revision 76468)
@@ -4625,8 +4625,8 @@
             g_HwvirtMsrs.u.vmx.u64FeatCtrl  = ASMRdMsr(MSR_IA32_FEATURE_CONTROL);
             g_HwvirtMsrs.u.vmx.u64Basic     = ASMRdMsr(MSR_IA32_VMX_BASIC);
-            g_HwvirtMsrs.u.vmx.PinCtls.u    = ASMRdMsr(MSR_IA32_VMX_PINBASED_CTLS);
-            g_HwvirtMsrs.u.vmx.ProcCtls.u   = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS);
-            g_HwvirtMsrs.u.vmx.ExitCtls.u   = ASMRdMsr(MSR_IA32_VMX_EXIT_CTLS);
-            g_HwvirtMsrs.u.vmx.EntryCtls.u  = ASMRdMsr(MSR_IA32_VMX_ENTRY_CTLS);
+            g_HwvirtMsrs.u.vmx.u64PinCtls   = ASMRdMsr(MSR_IA32_VMX_PINBASED_CTLS);
+            g_HwvirtMsrs.u.vmx.u64ProcCtls  = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS);
+            g_HwvirtMsrs.u.vmx.u64ExitCtls  = ASMRdMsr(MSR_IA32_VMX_EXIT_CTLS);
+            g_HwvirtMsrs.u.vmx.u64EntryCtls = ASMRdMsr(MSR_IA32_VMX_ENTRY_CTLS);
             g_HwvirtMsrs.u.vmx.u64Misc      = ASMRdMsr(MSR_IA32_VMX_MISC);
             g_HwvirtMsrs.u.vmx.u64Cr0Fixed0 = ASMRdMsr(MSR_IA32_VMX_CR0_FIXED0);
@@ -4638,16 +4638,16 @@
             if (RT_BF_GET(g_HwvirtMsrs.u.vmx.u64Basic, VMX_BF_BASIC_TRUE_CTLS))
             {
-                g_HwvirtMsrs.u.vmx.TruePinCtls.u   = ASMRdMsr(MSR_IA32_VMX_TRUE_PINBASED_CTLS);
-                g_HwvirtMsrs.u.vmx.TrueProcCtls.u  = ASMRdMsr(MSR_IA32_VMX_TRUE_PROCBASED_CTLS);
-                g_HwvirtMsrs.u.vmx.TrueEntryCtls.u = ASMRdMsr(MSR_IA32_VMX_TRUE_ENTRY_CTLS);
-                g_HwvirtMsrs.u.vmx.TrueExitCtls.u  = ASMRdMsr(MSR_IA32_VMX_TRUE_EXIT_CTLS);
-            }
-
-            uint32_t const fProcCtlsAllowed1 = g_HwvirtMsrs.u.vmx.ProcCtls.n.allowed1;
+                g_HwvirtMsrs.u.vmx.u64TruePinCtls   = ASMRdMsr(MSR_IA32_VMX_TRUE_PINBASED_CTLS);
+                g_HwvirtMsrs.u.vmx.u64TrueProcCtls  = ASMRdMsr(MSR_IA32_VMX_TRUE_PROCBASED_CTLS);
+                g_HwvirtMsrs.u.vmx.u64TrueEntryCtls = ASMRdMsr(MSR_IA32_VMX_TRUE_ENTRY_CTLS);
+                g_HwvirtMsrs.u.vmx.u64TrueExitCtls  = ASMRdMsr(MSR_IA32_VMX_TRUE_EXIT_CTLS);
+            }
+
+            uint32_t const fProcCtlsAllowed1 = RT_HI_U32(g_HwvirtMsrs.u.vmx.u64ProcCtls);
             if (fProcCtlsAllowed1 & VMX_PROC_CTLS_USE_SECONDARY_CTLS)
             {
-                g_HwvirtMsrs.u.vmx.ProcCtls2.u = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS2);
-
-                uint32_t const fProcCtls2Allowed1 = g_HwvirtMsrs.u.vmx.ProcCtls2.n.allowed1;
+                g_HwvirtMsrs.u.vmx.u64ProcCtls2 = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS2);
+
+                uint32_t const fProcCtls2Allowed1 = RT_HI_U32(g_HwvirtMsrs.u.vmx.u64ProcCtls2);
                 if (fProcCtls2Allowed1 & (VMX_PROC_CTLS2_EPT | VMX_PROC_CTLS2_VPID))
                     g_HwvirtMsrs.u.vmx.u64EptVpidCaps = ASMRdMsr(MSR_IA32_VMX_EPT_VPID_CAP);
Index: /trunk/src/VBox/VMM/VMMR0/HMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMR0.cpp	(revision 76467)
+++ /trunk/src/VBox/VMM/VMMR0/HMR0.cpp	(revision 76468)
@@ -478,5 +478,5 @@
              * Timer Does Not Count Down at the Rate Specified" CPU erratum.
              */
-            uint32_t const fPinCtls = g_HmR0.hwvirt.Msrs.u.vmx.PinCtls.n.allowed1;
+            uint32_t const fPinCtls = RT_HI_U32(g_HmR0.hwvirt.Msrs.u.vmx.u64PinCtls);
             if (fPinCtls & VMX_PIN_CTLS_PREEMPT_TIMER)
             {
@@ -1176,5 +1176,24 @@
         pVM->hm.s.vmx.u64HostEfer           = g_HmR0.hwvirt.u.vmx.u64HostEfer;
         pVM->hm.s.vmx.u64HostSmmMonitorCtl  = g_HmR0.hwvirt.u.vmx.u64HostSmmMonitorCtl;
-        pVM->hm.s.vmx.Msrs                  = g_HmR0.hwvirt.Msrs.u.vmx;
+
+        pVM->hm.s.vmx.Msrs.u64FeatCtrl      = g_HmR0.hwvirt.Msrs.u.vmx.u64FeatCtrl;
+        pVM->hm.s.vmx.Msrs.u64Basic         = g_HmR0.hwvirt.Msrs.u.vmx.u64Basic;
+        pVM->hm.s.vmx.Msrs.PinCtls.u        = g_HmR0.hwvirt.Msrs.u.vmx.u64PinCtls;
+        pVM->hm.s.vmx.Msrs.ProcCtls.u       = g_HmR0.hwvirt.Msrs.u.vmx.u64ProcCtls;
+        pVM->hm.s.vmx.Msrs.ProcCtls2.u      = g_HmR0.hwvirt.Msrs.u.vmx.u64ProcCtls2;
+        pVM->hm.s.vmx.Msrs.ExitCtls.u       = g_HmR0.hwvirt.Msrs.u.vmx.u64ExitCtls;
+        pVM->hm.s.vmx.Msrs.EntryCtls.u      = g_HmR0.hwvirt.Msrs.u.vmx.u64EntryCtls;
+        pVM->hm.s.vmx.Msrs.TruePinCtls.u    = g_HmR0.hwvirt.Msrs.u.vmx.u64TruePinCtls;
+        pVM->hm.s.vmx.Msrs.TrueProcCtls.u   = g_HmR0.hwvirt.Msrs.u.vmx.u64TrueProcCtls;
+        pVM->hm.s.vmx.Msrs.TrueEntryCtls.u  = g_HmR0.hwvirt.Msrs.u.vmx.u64TrueEntryCtls;
+        pVM->hm.s.vmx.Msrs.TrueExitCtls.u   = g_HmR0.hwvirt.Msrs.u.vmx.u64TrueExitCtls;
+        pVM->hm.s.vmx.Msrs.u64Misc          = g_HmR0.hwvirt.Msrs.u.vmx.u64Misc;
+        pVM->hm.s.vmx.Msrs.u64Cr0Fixed0     = g_HmR0.hwvirt.Msrs.u.vmx.u64Cr0Fixed0;
+        pVM->hm.s.vmx.Msrs.u64Cr0Fixed1     = g_HmR0.hwvirt.Msrs.u.vmx.u64Cr0Fixed1;
+        pVM->hm.s.vmx.Msrs.u64Cr4Fixed0     = g_HmR0.hwvirt.Msrs.u.vmx.u64Cr4Fixed0;
+        pVM->hm.s.vmx.Msrs.u64Cr4Fixed1     = g_HmR0.hwvirt.Msrs.u.vmx.u64Cr4Fixed1;
+        pVM->hm.s.vmx.Msrs.u64VmcsEnum      = g_HmR0.hwvirt.Msrs.u.vmx.u64VmcsEnum;
+        pVM->hm.s.vmx.Msrs.u64VmFunc        = g_HmR0.hwvirt.Msrs.u.vmx.u64VmFunc;
+        pVM->hm.s.vmx.Msrs.u64EptVpidCaps   = g_HmR0.hwvirt.Msrs.u.vmx.u64EptVpidCaps;
     }
     else if (pVM->hm.s.svm.fSupported)
Index: /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 76467)
+++ /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 76468)
@@ -1150,6 +1150,5 @@
      * invalidated when flushing by VPID.
      */
-    PCVMXMSRS pMsrs = &pHwvirtMsrs->u.vmx;
-    if (pMsrs->u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS)
+    if (pHwvirtMsrs->u.vmx.u64EptVpidCaps & MSR_IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS)
     {
         hmR0VmxFlushEpt(NULL /* pVCpu */, VMXTLBFLUSHEPT_ALL_CONTEXTS);
Index: /trunk/src/VBox/VMM/VMMR3/CPUM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/CPUM.cpp	(revision 76467)
+++ /trunk/src/VBox/VMM/VMMR3/CPUM.cpp	(revision 76468)
@@ -1750,7 +1750,27 @@
             {
                 if (fCaps & SUPVTCAPS_VT_X)
-                    pMsrs->hwvirt.vmx = HwvirtMsrs.u.vmx;
+                {
+                    pMsrs->hwvirt.vmx.u64FeatCtrl       = HwvirtMsrs.u.vmx.u64FeatCtrl;
+                    pMsrs->hwvirt.vmx.u64Basic          = HwvirtMsrs.u.vmx.u64Basic;
+                    pMsrs->hwvirt.vmx.PinCtls.u         = HwvirtMsrs.u.vmx.u64PinCtls;
+                    pMsrs->hwvirt.vmx.ProcCtls.u        = HwvirtMsrs.u.vmx.u64ProcCtls;
+                    pMsrs->hwvirt.vmx.ProcCtls2.u       = HwvirtMsrs.u.vmx.u64ProcCtls2;
+                    pMsrs->hwvirt.vmx.ExitCtls.u        = HwvirtMsrs.u.vmx.u64ExitCtls;
+                    pMsrs->hwvirt.vmx.EntryCtls.u       = HwvirtMsrs.u.vmx.u64EntryCtls;
+                    pMsrs->hwvirt.vmx.TruePinCtls.u     = HwvirtMsrs.u.vmx.u64TruePinCtls;
+                    pMsrs->hwvirt.vmx.TrueProcCtls.u    = HwvirtMsrs.u.vmx.u64TrueProcCtls;
+                    pMsrs->hwvirt.vmx.TrueEntryCtls.u   = HwvirtMsrs.u.vmx.u64TrueEntryCtls;
+                    pMsrs->hwvirt.vmx.TrueExitCtls.u    = HwvirtMsrs.u.vmx.u64TrueExitCtls;
+                    pMsrs->hwvirt.vmx.u64Misc           = HwvirtMsrs.u.vmx.u64Misc;
+                    pMsrs->hwvirt.vmx.u64Cr0Fixed0      = HwvirtMsrs.u.vmx.u64Cr0Fixed0;
+                    pMsrs->hwvirt.vmx.u64Cr0Fixed1      = HwvirtMsrs.u.vmx.u64Cr0Fixed1;
+                    pMsrs->hwvirt.vmx.u64Cr4Fixed0      = HwvirtMsrs.u.vmx.u64Cr4Fixed0;
+                    pMsrs->hwvirt.vmx.u64Cr4Fixed1      = HwvirtMsrs.u.vmx.u64Cr4Fixed1;
+                    pMsrs->hwvirt.vmx.u64VmcsEnum       = HwvirtMsrs.u.vmx.u64VmcsEnum;
+                    pMsrs->hwvirt.vmx.u64VmFunc         = HwvirtMsrs.u.vmx.u64VmFunc;
+                    pMsrs->hwvirt.vmx.u64EptVpidCaps    = HwvirtMsrs.u.vmx.u64EptVpidCaps;
+                }
                 else
-                    pMsrs->hwvirt.svm = HwvirtMsrs.u.svm;
+                    pMsrs->hwvirt.svm.u64MsrHwcr = HwvirtMsrs.u.svm.u64MsrHwcr;
                 return VINF_SUCCESS;
             }
