Index: /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp	(revision 71833)
+++ /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp	(revision 71834)
@@ -456,4 +456,9 @@
 
 /**
+ * Get the SVM pause-filter count.
+ */
+# define IEM_GET_SVM_PAUSE_FILTER_COUNT(a_pVCpu)             (CPUMGetGuestSvmPauseFilterCount(a_pVCpu, IEM_GET_CTX(a_pVCpu)))
+
+/**
  * Invokes the SVM \#VMEXIT handler for the nested-guest.
  */
@@ -490,4 +495,5 @@
 # define IEM_IS_SVM_WRITE_DR_INTERCEPT_SET(a_pVCpu, a_uDr)                                (false)
 # define IEM_IS_SVM_XCPT_INTERCEPT_SET(a_pVCpu, a_uVector)                                (false)
+# define IEM_GET_SVM_PAUSE_FILTER_COUNT(a_pVCpu)                                          (0)
 # define IEM_RETURN_SVM_VMEXIT(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2)          do { return VERR_SVM_IPE_1; } while (0)
 # define IEM_RETURN_SVM_CRX_VMEXIT(a_pVCpu, a_uExitCode, a_enmAccessCrX, a_iGReg)         do { return VERR_SVM_IPE_1; } while (0)
Index: /trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h	(revision 71833)
+++ /trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h	(revision 71834)
@@ -4457,9 +4457,28 @@
         IEMOP_MNEMONIC(pause, "pause");
 #ifdef VBOX_WITH_NESTED_HWVIRT
-        /** @todo Pause filter count and threshold with SVM nested hardware virt. */
-        Assert(!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmPauseFilter);
-        Assert(!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmPauseFilterThreshold);
+        bool fCheckIntercept = true;
+        if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmPauseFilter)
+        {
+            /* TSC based pause-filter thresholding. */
+            PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
+            if (   IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmPauseFilterThreshold
+                && pCtx->hwvirt.svm.cPauseFilterThreshold > 0)
+            {
+                uint64_t const uTick = TMCpuTickGet(pVCpu);
+                if (uTick - pCtx->hwvirt.svm.uPrevPauseTick > pCtx->hwvirt.svm.cPauseFilterThreshold)
+                    pCtx->hwvirt.svm.cPauseFilter = IEM_GET_SVM_PAUSE_FILTER_COUNT(pVCpu);
+                pCtx->hwvirt.svm.uPrevPauseTick = uTick;
+            }
+
+            /* Simple pause-filter counter. */
+            if (pCtx->hwvirt.svm.cPauseFilter > 0)
+            {
+                --pCtx->hwvirt.svm.cPauseFilter;
+                fCheckIntercept = false;
+            }
+        }
+        if (fCheckIntercept)
+            IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_PAUSE, SVM_EXIT_PAUSE, 0, 0);
 #endif
-        IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_PAUSE, SVM_EXIT_PAUSE, 0, 0);
     }
     else
