Index: /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 80654)
+++ /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 80655)
@@ -4539,13 +4539,14 @@
  *
  * @returns true if we need to load guest EFER, false otherwise.
- * @param   pVCpu   The cross context virtual CPU structure.
+ * @param   pVCpu           The cross context virtual CPU structure.
+ * @param   pVmxTransient   The VMX-transient structure.
  *
  * @remarks Requires EFER, CR4.
  * @remarks No-long-jump zone!!!
  */
-static bool hmR0VmxShouldSwapEferMsr(PCVMCPUCC pVCpu)
+static bool hmR0VmxShouldSwapEferMsr(PCVMCPUCC pVCpu, PCVMXTRANSIENT pVmxTransient)
 {
 #ifdef HMVMX_ALWAYS_SWAP_EFER
-    RT_NOREF(pVCpu);
+    RT_NOREF2(pVCpu, pVmxTransient);
     return true;
 #else
@@ -4554,4 +4555,18 @@
     uint64_t const u64HostEfer  = pVM->hm.s.vmx.u64HostMsrEfer;
     uint64_t const u64GuestEfer = pCtx->msrEFER;
+
+# ifdef VBOX_WITH_NESTED_HWVIRT_VMX
+    /*
+     * For nested-guests, we shall honor swapping the EFER MSR when requested by
+     * the nested-guest.
+     */
+    if (   pVmxTransient->fIsNestedGuest
+        && (   CPUMIsGuestVmxEntryCtlsSet(pVCpu, pCtx, VMX_ENTRY_CTLS_LOAD_EFER_MSR)
+            || CPUMIsGuestVmxExitCtlsSet(pVCpu, pCtx, VMX_EXIT_CTLS_SAVE_EFER_MSR)
+            || CPUMIsGuestVmxExitCtlsSet(pVCpu, pCtx, VMX_EXIT_CTLS_LOAD_EFER_MSR)))
+        return true;
+# else
+    RT_NOREF(pVmxTransient);
+#endif
 
     /*
@@ -4663,5 +4678,5 @@
              */
             if (   pVM->hm.s.vmx.fSupportsVmcsEfer
-                && hmR0VmxShouldSwapEferMsr(pVCpu))
+                && hmR0VmxShouldSwapEferMsr(pVCpu, pVmxTransient))
                 fVal |= VMX_ENTRY_CTLS_LOAD_EFER_MSR;
             else
@@ -4730,5 +4745,5 @@
              */
             if (   pVM->hm.s.vmx.fSupportsVmcsEfer
-                && hmR0VmxShouldSwapEferMsr(pVCpu))
+                && hmR0VmxShouldSwapEferMsr(pVCpu, pVmxTransient))
             {
                 fVal |= VMX_EXIT_CTLS_SAVE_EFER_MSR
@@ -6442,5 +6457,5 @@
         HMVMX_CPUMCTX_ASSERT(pVCpu, CPUMCTX_EXTRN_EFER);
 
-        if (hmR0VmxShouldSwapEferMsr(pVCpu))
+        if (hmR0VmxShouldSwapEferMsr(pVCpu, pVmxTransient))
         {
             /*
