Index: /trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp	(revision 78525)
+++ /trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp	(revision 78526)
@@ -1428,5 +1428,5 @@
 {
     RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
-    *puValue = 0;
+    *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64EptVpidCaps;
     return VINF_SUCCESS;
 }
Index: /trunk/src/VBox/VMM/VMMR3/CPUM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/CPUM.cpp	(revision 78525)
+++ /trunk/src/VBox/VMM/VMMR3/CPUM.cpp	(revision 78526)
@@ -1525,5 +1525,4 @@
      *   - True VM-entry VM-execution controls.
      *   - True VM-exit VM-execution controls.
-     *   - EPT/VPID capabilities.
      */
 
@@ -1690,4 +1689,23 @@
     /* VMCS Enumeration. */
     pGuestVmxMsrs->u64VmcsEnum = VMX_V_VMCS_MAX_INDEX << VMX_BF_VMCS_ENUM_HIGHEST_IDX_SHIFT;
+
+    /* VPID and EPT Capabilities. */
+    {
+        /*
+         * INVVPID instruction always causes a VM-exit unconditionally, so we are free to fake
+         * and emulate any INVVPID flush type. However, it only makes sense to expose the types
+         * when INVVPID instruction is supported just to be more compatible with guest
+         * hypervisors that may make assumptions by only looking at this MSR even though they
+         * are technically supposed to refer to bit 37 of MSR_IA32_VMX_PROC_CTLS2 first.
+         *
+         * See Intel spec. 25.1.2 "Instructions That Cause VM Exits Unconditionally".
+         * See Intel spec. 30.3 "VMX Instructions".
+         */
+        uint8_t const fVpid = pGuestFeatures->fVmxVpid;
+        pGuestVmxMsrs->u64EptVpidCaps = RT_BF_MAKE(VMX_BF_EPT_VPID_CAP_INVVPID,                           fVpid)
+                                      | RT_BF_MAKE(VMX_BF_EPT_VPID_CAP_INVVPID_SINGLE_CTX,                fVpid & 1)
+                                      | RT_BF_MAKE(VMX_BF_EPT_VPID_CAP_INVVPID_ALL_CTX,                   fVpid & 1)
+                                      | RT_BF_MAKE(VMX_BF_EPT_VPID_CAP_INVVPID_SINGLE_CTX_RETAIN_GLOBALS, fVpid & 1);
+    }
 
     /* VM Functions. */
@@ -1845,5 +1863,5 @@
     EmuFeat.fVmxRdtscp                = 1;
     EmuFeat.fVmxVirtX2ApicMode        = 0;
-    EmuFeat.fVmxVpid                  = 0;
+    EmuFeat.fVmxVpid                  = 0;  /** @todo NSTVMX: enable this. */
     EmuFeat.fVmxWbinvdExit            = 1;
     EmuFeat.fVmxUnrestrictedGuest     = 0;
