Index: trunk/src/VBox/VMM/VMMAll/HMAll.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMAll/HMAll.cpp	(revision 51980)
+++ trunk/src/VBox/VMM/VMMAll/HMAll.cpp	(revision 51981)
@@ -274,7 +274,7 @@
 
 /**
- * Checks if nested paging is enabled
- *
- * @returns boolean
+ * Checks if nested paging is enabled.
+ *
+ * @returns true if nested paging is active, false otherwise.
  * @param   pVM         Pointer to the VM.
  */
@@ -283,4 +283,29 @@
     return HMIsEnabled(pVM) && pVM->hm.s.fNestedPaging;
 }
+
+
+/**
+ * Checks if MSR bitmaps are available. It is assumed that when it's available
+ * it will be used as well.
+ *
+ * @returns true if MSR bitmaps are available, false otherwise.
+ * @param   pVM         Pointer to the VM.
+ */
+VMM_INT_DECL(bool) HMAreMsrBitmapsAvailable(PVM pVM)
+{
+    if (HMIsEnabled(pVM))
+    {
+        if (pVM->hm.s.svm.fSupported)
+            return true;
+
+        if (   pVM->hm.s.vmx.fSupported
+            && (pVM->hm.s.vmx.Msrs.VmxProcCtls.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS))
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
 
 /**
Index: trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 51980)
+++ trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 51981)
@@ -976,5 +976,11 @@
         }
 
-        /* Allocate the MSR-bitmap if supported by the CPU. The MSR-bitmap is for transparent accesses of specific MSRs. */
+        /*
+         * Allocate the MSR-bitmap if supported by the CPU. The MSR-bitmap is for
+         * transparent accesses of specific MSRs.
+         *
+         * If the condition for enabling MSR bitmaps changes here, don't forget to
+         * update HMIsMsrBitmapsAvailable().
+         */
         if (pVM->hm.s.vmx.Msrs.VmxProcCtls.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS)
         {
Index: trunk/src/VBox/VMM/VMMR3/GIMHv.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 51980)
+++ trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 51981)
@@ -88,4 +88,5 @@
     if (!pVM->gim.s.u32Version)
     {
+        /* Basic features. */
         pHv->uBaseFeat = 0
                        //| GIM_HV_BASE_FEAT_VP_RUNTIME_MSR
@@ -104,7 +105,13 @@
                        ;
 
+        /* Miscellaneous features. */
         pHv->uMiscFeat = GIM_HV_MISC_FEAT_TIMER_FREQ;
 
+        /* Hypervisor recommendations to the guest. */
         pHv->uHyperHints = GIM_HV_HINT_MSR_FOR_SYS_RESET;
+
+        /* Hypervisor capabilities; features used by the hypervisor. */
+        pHv->uHyperCaps  = HMIsNestedPagingActive(pVM)   ? GIM_HV_HOST_FEAT_NESTED_PAGING : 0;
+        pHv->uHyperCaps |= HMAreMsrBitmapsAvailable(pVM) ? GIM_HV_HOST_FEAT_MSR_BITMAP : 0;
     }
 
@@ -161,5 +168,5 @@
     RT_ZERO(HyperLeaf);
     HyperLeaf.uLeaf        = UINT32_C(0x40000000);
-    HyperLeaf.uEax         = UINT32_C(0x40000005); /* Minimum value for Hyper-V */
+    HyperLeaf.uEax         = UINT32_C(0x40000006); /* Minimum value for Hyper-V is 0x40000005. */
     HyperLeaf.uEbx         = 0x7263694D;           /* 'Micr' */
     HyperLeaf.uEcx         = 0x666F736F;           /* 'osof' */
@@ -203,4 +210,12 @@
     AssertLogRelRCReturn(rc, rc);
 
+    HyperLeaf.uLeaf        = UINT32_C(0x40000006);
+    HyperLeaf.uEax         = pHv->uHyperCaps;
+    HyperLeaf.uEbx         = 0;
+    HyperLeaf.uEcx         = 0;
+    HyperLeaf.uEdx         = 0;
+    rc = CPUMR3CpuIdInsert(pVM, &HyperLeaf);
+    AssertLogRelRCReturn(rc, rc);
+
     /*
      * Insert all MSR ranges of Hyper-V.
@@ -321,4 +336,5 @@
     rc = SSMR3PutU32(pSSM, pcHv->uMiscFeat);                AssertRCReturn(rc, rc);
     rc = SSMR3PutU32(pSSM, pcHv->uHyperHints);              AssertRCReturn(rc, rc);
+    rc = SSMR3PutU32(pSSM, pcHv->uHyperCaps);               AssertRCReturn(rc, rc);
 
     /*
@@ -384,4 +400,5 @@
     rc = SSMR3GetU32(pSSM, &pHv->uMiscFeat);                AssertRCReturn(rc, rc);
     rc = SSMR3GetU32(pSSM, &pHv->uHyperHints);              AssertRCReturn(rc, rc);
+    rc = SSMR3GetU32(pSSM, &pHv->uHyperCaps);               AssertRCReturn(rc, rc);
 
     /*
Index: trunk/src/VBox/VMM/include/GIMHvInternal.h
===================================================================
--- trunk/src/VBox/VMM/include/GIMHvInternal.h	(revision 51980)
+++ trunk/src/VBox/VMM/include/GIMHvInternal.h	(revision 51981)
@@ -471,8 +471,8 @@
     /** Miscellaneous features. */
     uint32_t                    uMiscFeat;
-    /** Hypervisor hints. */
+    /** Hypervisor hints to the guest. */
     uint32_t                    uHyperHints;
-    /** Alignment padding. */
-    uint32_t                    u32Alignment0;
+    /** Hypervisor capabilities. */
+    uint32_t                    uHyperCaps;
 
     /** Per-VM R0 Spinlock for protecting EMT writes to the TSC page. */
