Index: trunk/src/VBox/VMM/VMMR0/HMR0.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR0/HMR0.cpp	(revision 60812)
+++ trunk/src/VBox/VMM/VMMR0/HMR0.cpp	(revision 60847)
@@ -1626,4 +1626,5 @@
     pVCpu->hm.s.PendingIO.s.Port.uAndVal  = uAndVal;
     pVCpu->hm.s.PendingIO.s.Port.cbSize   = cbSize;
+/** @todo IOM will do this stuff, retire the HM feature.   */
     return;
 }
@@ -1649,4 +1650,5 @@
     pVCpu->hm.s.PendingIO.s.Port.uAndVal  = uAndVal;
     pVCpu->hm.s.PendingIO.s.Port.cbSize   = cbSize;
+/** @todo IOM will do this stuff, retire the HM feature.   */
     return;
 }
Index: trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp	(revision 60812)
+++ trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp	(revision 60847)
@@ -4986,8 +4986,10 @@
                 hmR0SvmSetPendingXcptDB(pVCpu);
             }
-            /* rcStrict is VINF_SUCCESS or in [VINF_EM_FIRST..VINF_EM_LAST]. */
+            /* rcStrict is VINF_SUCCESS, VINF_IOM_R3_IOPORT_COMMIT_WRITE, or in [VINF_EM_FIRST..VINF_EM_LAST],
+               however we can ditch VINF_IOM_R3_IOPORT_COMMIT_WRITE as it has VMCPU_FF_IOM as backup. */
             else if (   rcStrict2 != VINF_SUCCESS
                      && (rcStrict == VINF_SUCCESS || rcStrict2 < rcStrict))
                 rcStrict = rcStrict2;
+            AssertCompile(VINF_EM_LAST < VINF_IOM_R3_IOPORT_COMMIT_WRITE);
 
             HM_RESTORE_PREEMPT();
@@ -5001,5 +5003,5 @@
     if (rcStrict == VINF_IOM_R3_IOPORT_READ)
         Assert(IoExitInfo.n.u1Type == SVM_IOIO_READ);
-    else if (rcStrict == VINF_IOM_R3_IOPORT_WRITE)
+    else if (rcStrict == VINF_IOM_R3_IOPORT_WRITE || rcStrict == VINF_IOM_R3_IOPORT_COMMIT_WRITE)
         Assert(IoExitInfo.n.u1Type == SVM_IOIO_WRITE);
     else
Index: trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 60812)
+++ trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 60847)
@@ -12364,8 +12364,10 @@
                 hmR0VmxSetPendingXcptDB(pVCpu, pMixedCtx);
             }
-            /* rcStrict is VINF_SUCCESS or in [VINF_EM_FIRST..VINF_EM_LAST]. */
+            /* rcStrict is VINF_SUCCESS, VINF_IOM_R3_IOPORT_COMMIT_WRITE, or in [VINF_EM_FIRST..VINF_EM_LAST],
+               however we can ditch VINF_IOM_R3_IOPORT_COMMIT_WRITE as it has VMCPU_FF_IOM as backup. */
             else if (   rcStrict2 != VINF_SUCCESS
                      && (rcStrict == VINF_SUCCESS || rcStrict2 < rcStrict))
                 rcStrict = rcStrict2;
+            AssertCompile(VINF_EM_LAST < VINF_IOM_R3_IOPORT_COMMIT_WRITE);
 
             HM_RESTORE_PREEMPT();
@@ -12377,5 +12379,5 @@
     if (rcStrict == VINF_IOM_R3_IOPORT_READ)
         Assert(!fIOWrite);
-    else if (rcStrict == VINF_IOM_R3_IOPORT_WRITE)
+    else if (rcStrict == VINF_IOM_R3_IOPORT_WRITE || rcStrict == VINF_IOM_R3_IOPORT_COMMIT_WRITE)
         Assert(fIOWrite);
     else
Index: trunk/src/VBox/VMM/VMMR0/VMMR0.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR0/VMMR0.cpp	(revision 60812)
+++ trunk/src/VBox/VMM/VMMR0/VMMR0.cpp	(revision 60847)
@@ -761,4 +761,7 @@
             STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetIOWrite);
             break;
+        case VINF_IOM_R3_IOPORT_COMMIT_WRITE:
+            STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetIOCommitWrite);
+            break;
         case VINF_IOM_R3_MMIO_READ:
             STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIORead);
@@ -767,4 +770,7 @@
             STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIOWrite);
             break;
+        case VINF_IOM_R3_MMIO_COMMIT_WRITE:
+            STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIOCommitWrite);
+            break;
         case VINF_IOM_R3_MMIO_READ_WRITE:
             STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetMMIOReadWrite);
@@ -825,4 +831,5 @@
             break;
         case VINF_EM_RAW_TO_R3:
+            STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3Total);
             if (VM_FF_IS_PENDING(pVM, VM_FF_TM_VIRTUAL_SYNC))
                 STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3TMVirt);
@@ -840,5 +847,9 @@
                 STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3CritSect);
             else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TO_R3))
-                STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3);
+                STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3FF);
+            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_IEM))
+                STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3Iem);
+            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_IOM))
+                STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3Iom);
             else
                 STAM_COUNTER_INC(&pVM->vmm.s.StatRZRetToR3Unknown);
