Index: /trunk/src/VBox/VMM/VBoxVMMR3-dtrace.d
===================================================================
--- /trunk/src/VBox/VMM/VBoxVMMR3-dtrace.d	(revision 40375)
+++ /trunk/src/VBox/VMM/VBoxVMMR3-dtrace.d	(revision 40375)
@@ -0,0 +1,36 @@
+/* $Id$ */
+/** @file
+ * VBoxVMM - Static ring-3 dtrace probes.
+ */
+
+/*
+ * Copyright (C) 2009-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+provider vboxvmmr3
+{
+    probe em__state__changed(void *a_pVCpu, int a_enmOldState, int a_enmNewState, int a_rc);
+    probe em__state__unchanged(void *a_pVCpu, int a_enmState, int a_rc);
+    probe em__raw__run__pre(void *a_pVCpu, void *a_pCtx);
+    probe em__raw__run__ret(void *a_pVCpu, void *a_pCtx, int a_rc);
+    probe em__raw__ff__high(void *a_pVCpu, unsigned int a_fGlobal, unsigned int a_fLocal, int a_rc);
+    probe em__raw__ff__all(void *a_pVCpu, unsigned int a_fGlobal, unsigned int a_fLocal, int a_rc);
+    probe em__raw__ff__all_ret(void *a_pVCpu, int a_rc);
+    probe em__raw__ff__raw(void *a_pVCpu, unsigned int a_fGlobal, unsigned int a_fLocal);
+    probe em__raw__ff__raw_ret(void *a_pVCpu, int a_rc);
+};
+
+#pragma D attributes Evolving/Evolving/Common provider vboxdd provider
+#pragma D attributes Private/Private/Unknown  provider vboxdd module
+#pragma D attributes Private/Private/Unknown  provider vboxdd function
+#pragma D attributes Evolving/Evolving/Common provider vboxdd name
+#pragma D attributes Evolving/Evolving/Common provider vboxdd args
+
Index: /trunk/src/VBox/VMM/VMMR3/EM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/EM.cpp	(revision 40374)
+++ /trunk/src/VBox/VMM/VMMR3/EM.cpp	(revision 40375)
@@ -44,5 +44,4 @@
 #include <VBox/vmm/iom.h>
 #include <VBox/vmm/dbgf.h>
-#include <VBox/vmm/dbgftrace.h>
 #include <VBox/vmm/pgm.h>
 #ifdef VBOX_WITH_REM
@@ -69,4 +68,5 @@
 #include <VBox/disopcode.h>
 #include <VBox/vmm/dbgf.h>
+#include "VMMTracing.h"
 
 #include <iprt/asm.h>
@@ -1103,4 +1103,5 @@
             STAM_REL_PROFILE_ADV_SUSPEND(&pVCpu->em.s.StatREMTotal, a);
             rc = emR3ForcedActions(pVM, pVCpu, rc);
+            VBOXVMMR3_EM_FF_ALL_RET(pVCpu, rc);
             STAM_REL_PROFILE_ADV_RESUME(&pVCpu->em.s.StatREMTotal, a);
             if (    rc != VINF_SUCCESS
@@ -1330,4 +1331,6 @@
 int emR3HighPriorityPostForcedActions(PVM pVM, PVMCPU pVCpu, int rc)
 {
+    VBOXVMMR3_EM_FF_HIGH(pVCpu, pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions, rc);
+
     if (VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_PDM_CRITSECT))
         PDMCritSectFF(pVCpu);
@@ -1381,4 +1384,5 @@
                 rc = rc2; \
         } while (0)
+    VBOXVMMR3_EM_FF_ALL(pVCpu, pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions, rc);
 
     /*
@@ -1885,4 +1889,5 @@
             {
                 rc = emR3ForcedActions(pVM, pVCpu, rc);
+                VBOXVMMR3_EM_FF_ALL_RET(pVCpu, rc);
                 if (   (   rc == VINF_EM_RESCHEDULE_REM
                         || rc == VINF_EM_RESCHEDULE_HWACC)
@@ -1910,5 +1915,5 @@
                  */
                 case VINF_EM_RESCHEDULE_RAW:
-                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_RAW: %d -> %d (EMSTATE_RAW)\n", pVCpu->em.s.enmState, EMSTATE_RAW));
+                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_RAW: %d -> %d (EMSTATE_RAW)\n", enmOldState, EMSTATE_RAW));
                     pVCpu->em.s.enmState = EMSTATE_RAW;
                     break;
@@ -1918,5 +1923,5 @@
                  */
                 case VINF_EM_RESCHEDULE_HWACC:
-                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_HWACC: %d -> %d (EMSTATE_HWACC)\n", pVCpu->em.s.enmState, EMSTATE_HWACC));
+                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_HWACC: %d -> %d (EMSTATE_HWACC)\n", enmOldState, EMSTATE_HWACC));
                     Assert(!pVCpu->em.s.fForceRAW);
                     pVCpu->em.s.enmState = EMSTATE_HWACC;
@@ -1927,5 +1932,5 @@
                  */
                 case VINF_EM_RESCHEDULE_REM:
-                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_REM)\n", pVCpu->em.s.enmState, EMSTATE_REM));
+                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_REM)\n", enmOldState, EMSTATE_REM));
                     pVCpu->em.s.enmState = EMSTATE_REM;
                     break;
@@ -1935,5 +1940,5 @@
                  */
                 case VINF_EM_RESUME:
-                    Log2(("EMR3ExecuteVM: VINF_EM_RESUME: %d -> VINF_EM_RESCHEDULE\n", pVCpu->em.s.enmState));
+                    Log2(("EMR3ExecuteVM: VINF_EM_RESUME: %d -> VINF_EM_RESCHEDULE\n", enmOldState));
                     /* Don't reschedule in the halted or wait for SIPI case. */
                     if (    pVCpu->em.s.enmPrevState == EMSTATE_WAIT_SIPI
@@ -1951,5 +1956,5 @@
                 {
                     EMSTATE enmState = emR3Reschedule(pVM, pVCpu, pVCpu->em.s.pCtx);
-                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE: %d -> %d (%s)\n", pVCpu->em.s.enmState, enmState, emR3GetStateName(enmState)));
+                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE: %d -> %d (%s)\n", enmOldState, enmState, emR3GetStateName(enmState)));
                     pVCpu->em.s.enmState = enmState;
                     break;
@@ -1960,5 +1965,5 @@
                  */
                 case VINF_EM_HALT:
-                    Log2(("EMR3ExecuteVM: VINF_EM_HALT: %d -> %d\n", pVCpu->em.s.enmState, EMSTATE_HALTED));
+                    Log2(("EMR3ExecuteVM: VINF_EM_HALT: %d -> %d\n", enmOldState, EMSTATE_HALTED));
                     pVCpu->em.s.enmState = EMSTATE_HALTED;
                     break;
@@ -1969,5 +1974,5 @@
                 case VINF_EM_WAIT_SIPI:
                     Assert(pVCpu->idCpu != 0);
-                    Log2(("EMR3ExecuteVM: VINF_EM_WAIT_SIPI: %d -> %d\n", pVCpu->em.s.enmState, EMSTATE_WAIT_SIPI));
+                    Log2(("EMR3ExecuteVM: VINF_EM_WAIT_SIPI: %d -> %d\n", enmOldState, EMSTATE_WAIT_SIPI));
                     pVCpu->em.s.enmState = EMSTATE_WAIT_SIPI;
                     break;
@@ -1978,7 +1983,7 @@
                  */
                 case VINF_EM_SUSPEND:
-                    Log2(("EMR3ExecuteVM: VINF_EM_SUSPEND: %d -> %d\n", pVCpu->em.s.enmState, EMSTATE_SUSPENDED));
-                    Assert(pVCpu->em.s.enmState != EMSTATE_SUSPENDED);
-                    pVCpu->em.s.enmPrevState = pVCpu->em.s.enmState;
+                    Log2(("EMR3ExecuteVM: VINF_EM_SUSPEND: %d -> %d\n", enmOldState, EMSTATE_SUSPENDED));
+                    Assert(enmOldState != EMSTATE_SUSPENDED);
+                    pVCpu->em.s.enmPrevState = enmOldState;
                     pVCpu->em.s.enmState     = EMSTATE_SUSPENDED;
                     break;
@@ -1993,5 +1998,5 @@
                     {
                         EMSTATE enmState = emR3Reschedule(pVM, pVCpu, pVCpu->em.s.pCtx);
-                        Log2(("EMR3ExecuteVM: VINF_EM_RESET: %d -> %d (%s)\n", pVCpu->em.s.enmState, enmState, emR3GetStateName(enmState)));
+                        Log2(("EMR3ExecuteVM: VINF_EM_RESET: %d -> %d (%s)\n", enmOldState, enmState, emR3GetStateName(enmState)));
                         pVCpu->em.s.enmState = enmState;
                     }
@@ -2009,5 +2014,5 @@
                 case VINF_EM_OFF:
                     pVCpu->em.s.enmState = EMSTATE_TERMINATING;
-                    Log2(("EMR3ExecuteVM: returns VINF_EM_OFF (%d -> %d)\n", pVCpu->em.s.enmState, EMSTATE_TERMINATING));
+                    Log2(("EMR3ExecuteVM: returns VINF_EM_OFF (%d -> %d)\n", enmOldState, EMSTATE_TERMINATING));
                     TMR3NotifySuspend(pVM, pVCpu);
                     STAM_REL_PROFILE_ADV_STOP(&pVCpu->em.s.StatTotal, x);
@@ -2019,5 +2024,5 @@
                 case VINF_EM_TERMINATE:
                     pVCpu->em.s.enmState = EMSTATE_TERMINATING;
-                    Log(("EMR3ExecuteVM returns VINF_EM_TERMINATE (%d -> %d)\n", pVCpu->em.s.enmState, EMSTATE_TERMINATING));
+                    Log(("EMR3ExecuteVM returns VINF_EM_TERMINATE (%d -> %d)\n", enmOldState, EMSTATE_TERMINATING));
                     if (pVM->enmVMState < VMSTATE_DESTROYING) /* ugly */
                         TMR3NotifySuspend(pVM, pVCpu);
@@ -2030,7 +2035,7 @@
                  */
                 case VINF_EM_NO_MEMORY:
-                    Log2(("EMR3ExecuteVM: VINF_EM_NO_MEMORY: %d -> %d\n", pVCpu->em.s.enmState, EMSTATE_SUSPENDED));
-                    Assert(pVCpu->em.s.enmState != EMSTATE_SUSPENDED);
-                    pVCpu->em.s.enmPrevState = pVCpu->em.s.enmState;
+                    Log2(("EMR3ExecuteVM: VINF_EM_NO_MEMORY: %d -> %d\n", enmOldState, EMSTATE_SUSPENDED));
+                    Assert(enmOldState != EMSTATE_SUSPENDED);
+                    pVCpu->em.s.enmPrevState = enmOldState;
                     pVCpu->em.s.enmState = EMSTATE_SUSPENDED;
                     TMR3NotifySuspend(pVM, pVCpu);
@@ -2058,12 +2063,12 @@
                 case VINF_EM_DBG_BREAKPOINT:
                 case VINF_EM_DBG_STEP:
-                    if (pVCpu->em.s.enmState == EMSTATE_RAW)
+                    if (enmOldState == EMSTATE_RAW)
                     {
-                        Log2(("EMR3ExecuteVM: %Rrc: %d -> %d\n", rc, pVCpu->em.s.enmState, EMSTATE_DEBUG_GUEST_RAW));
+                        Log2(("EMR3ExecuteVM: %Rrc: %d -> %d\n", rc, enmOldState, EMSTATE_DEBUG_GUEST_RAW));
                         pVCpu->em.s.enmState = EMSTATE_DEBUG_GUEST_RAW;
                     }
                     else
                     {
-                        Log2(("EMR3ExecuteVM: %Rrc: %d -> %d\n", rc, pVCpu->em.s.enmState, EMSTATE_DEBUG_GUEST_REM));
+                        Log2(("EMR3ExecuteVM: %Rrc: %d -> %d\n", rc, enmOldState, EMSTATE_DEBUG_GUEST_REM));
                         pVCpu->em.s.enmState = EMSTATE_DEBUG_GUEST_REM;
                     }
@@ -2076,5 +2081,5 @@
                 case VINF_EM_DBG_HYPER_BREAKPOINT:
                 case VINF_EM_DBG_HYPER_ASSERTION:
-                    Log2(("EMR3ExecuteVM: %Rrc: %d -> %d\n", rc, pVCpu->em.s.enmState, EMSTATE_DEBUG_HYPER));
+                    Log2(("EMR3ExecuteVM: %Rrc: %d -> %d\n", rc, enmOldState, EMSTATE_DEBUG_HYPER));
                     pVCpu->em.s.enmState = EMSTATE_DEBUG_HYPER;
                     break;
@@ -2084,5 +2089,5 @@
                  */
                 case VERR_VMM_RING0_ASSERTION:
-                    Log(("EMR3ExecuteVM: %Rrc: %d -> %d (EMSTATE_GURU_MEDITATION)\n", rc, pVCpu->em.s.enmState, EMSTATE_GURU_MEDITATION));
+                    Log(("EMR3ExecuteVM: %Rrc: %d -> %d (EMSTATE_GURU_MEDITATION)\n", rc, enmOldState, EMSTATE_GURU_MEDITATION));
                     pVCpu->em.s.enmState = EMSTATE_GURU_MEDITATION;
                     break;
@@ -2101,5 +2106,5 @@
                         rc = VERR_EM_INTERNAL_ERROR;
                     }
-                    Log(("EMR3ExecuteVM: %Rrc: %d -> %d (EMSTATE_GURU_MEDITATION)\n", rc, pVCpu->em.s.enmState, EMSTATE_GURU_MEDITATION));
+                    Log(("EMR3ExecuteVM: %Rrc: %d -> %d (EMSTATE_GURU_MEDITATION)\n", rc, enmOldState, EMSTATE_GURU_MEDITATION));
                     pVCpu->em.s.enmState = EMSTATE_GURU_MEDITATION;
                     break;
@@ -2112,7 +2117,6 @@
             if (enmOldState != enmNewState)
             {
-#ifdef DBGFTRACE_ENABLED
-                RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "em-outer %d: %d -> %d", rc, enmOldState, enmNewState);
-#endif
+                VBOXVMMR3_EM_STATE_CHANGED(pVCpu, enmOldState, enmNewState, rc);
+
                 /* Clear MWait flags. */
                 if (   enmOldState == EMSTATE_HALTED
@@ -2129,8 +2133,6 @@
                 }
             }
-#ifdef DBGFTRACE_ENABLED
             else
-                RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "em-outer %d: %d", rc, enmOldState);
-#endif
+                VBOXVMMR3_EM_STATE_UNCHANGED(pVCpu, enmNewState, rc);
 
             STAM_PROFILE_ADV_STOP(&pVCpu->em.s.StatTotal, x); /* (skip this in release) */
@@ -2138,7 +2140,7 @@
 
             /*
-             * Act on the state.
+             * Act on the new state.
              */
-            switch (pVCpu->em.s.enmState)
+            switch (enmNewState)
             {
                 /*
Index: /trunk/src/VBox/VMM/VMMR3/EMHwaccm.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/EMHwaccm.cpp	(revision 40374)
+++ /trunk/src/VBox/VMM/VMMR3/EMHwaccm.cpp	(revision 40375)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2012 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -46,4 +46,5 @@
 #include <VBox/disopcode.h>
 #include <VBox/vmm/dbgf.h>
+#include "VMMTracing.h"
 
 #include <iprt/asm.h>
@@ -584,4 +585,5 @@
         {
             rc = emR3ForcedActions(pVM, pVCpu, rc);
+            VBOXVMMR3_EM_FF_ALL_RET(pVCpu, rc);
             if (    rc != VINF_SUCCESS
                 &&  rc != VINF_EM_RESCHEDULE_HWACC)
Index: /trunk/src/VBox/VMM/VMMR3/EMRaw.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/EMRaw.cpp	(revision 40374)
+++ /trunk/src/VBox/VMM/VMMR3/EMRaw.cpp	(revision 40375)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2012 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -30,5 +30,4 @@
 #include <VBox/vmm/iom.h>
 #include <VBox/vmm/dbgf.h>
-#include <VBox/vmm/dbgftrace.h>
 #include <VBox/vmm/pgm.h>
 #ifdef VBOX_WITH_REM
@@ -49,4 +48,5 @@
 #include <VBox/disopcode.h>
 #include <VBox/vmm/dbgf.h>
+#include "VMMTracing.h"
 
 #include <VBox/log.h>
@@ -173,4 +173,5 @@
         {
             rc = emR3RawForcedActions(pVM, pVCpu, pCtx);
+            VBOXVMMR3_EM_FF_RAW_RET(pVCpu, rc);
             if (rc != VINF_SUCCESS)
                 return rc;
@@ -1201,5 +1202,7 @@
 VMMR3DECL(int) EMR3CheckRawForcedActions(PVM pVM, PVMCPU pVCpu)
 {
-    return emR3RawForcedActions(pVM, pVCpu, pVCpu->em.s.pCtx);
+    int rc = emR3RawForcedActions(pVM, pVCpu, pVCpu->em.s.pCtx);
+    VBOXVMMR3_EM_FF_RAW_RET(pVCpu, rc);
+    return rc;
 }
 
@@ -1222,5 +1225,5 @@
      * Also note that SELMR3UpdateFromCPUM may trigger VM_FF_SELM_SYNC_TSS.
      */
-
+    VBOXVMMR3_EM_FF_RAW(pVCpu, pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions);
 
     /*
@@ -1384,8 +1387,6 @@
             ||  VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
         {
-#ifdef DBGFTRACE_ENABLED
-            RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "em-raw ff %08x/%08x pre", pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions);
-#endif
             rc = emR3RawForcedActions(pVM, pVCpu, pCtx);
+            VBOXVMMR3_EM_FF_RAW_RET(pVCpu, rc);
             if (rc != VINF_SUCCESS)
                 break;
@@ -1418,4 +1419,5 @@
             {
                 rc = emR3RawForcedActions(pVM, pVCpu, pCtx);
+                VBOXVMMR3_EM_FF_RAW_RET(pVCpu, rc);
                 if (rc != VINF_SUCCESS)
                 {
@@ -1451,9 +1453,8 @@
         {
             STAM_PROFILE_START(&pVCpu->em.s.StatRAWExec, c);
+            VBOXVMMR3_EM_RAW_RUN_PRE(pVCpu, pCtx);
             rc = VMMR3RawRunGC(pVM, pVCpu);
+            VBOXVMMR3_EM_RAW_RUN_RET(pVCpu, pCtx, rc);
             STAM_PROFILE_STOP(&pVCpu->em.s.StatRAWExec, c);
-#ifdef DBGFTRACE_ENABLED
-            RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "em-raw run => %d", rc);
-#endif
         }
         else
@@ -1549,10 +1550,8 @@
         {
             Assert(pCtx->eflags.Bits.u1VM || (pCtx->ss & X86_SEL_RPL) != 1);
-#ifdef DBGFTRACE_ENABLED
-            RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "em-raw ff %08x/%08x post", pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions);
-#endif
 
             STAM_REL_PROFILE_ADV_SUSPEND(&pVCpu->em.s.StatRAWTotal, a);
             rc = emR3ForcedActions(pVM, pVCpu, rc);
+            VBOXVMMR3_EM_FF_ALL_RET(pVCpu, rc);
             STAM_REL_PROFILE_ADV_RESUME(&pVCpu->em.s.StatRAWTotal, a);
             if (    rc != VINF_SUCCESS
Index: /trunk/src/VBox/VMM/include/VMMTracing.h
===================================================================
--- /trunk/src/VBox/VMM/include/VMMTracing.h	(revision 40375)
+++ /trunk/src/VBox/VMM/include/VMMTracing.h	(revision 40375)
@@ -0,0 +1,107 @@
+/* $Id$ */
+/** @file
+ * VBoxVMM - Trace point macros for the VMM.
+ */
+
+/*
+ * Copyright (C) 2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+
+#ifndef ___VMMTracing_h___
+#define ___VMMTracing_h___
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#ifdef DOXYGEN_RUNNING
+# undef VBOX_WITH_DTRACE
+# undef VBOX_WITH_DTRACE_R3
+# undef VBOX_WITH_DTRACE_R0
+# undef VBOX_WITH_DTRACE_RC
+# define DBGFTRACE_ENABLED
+#endif
+#include <VBox/vmm/dbgftrace.h>
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** Gets the trace buffer handle from a VMCPU pointer. */
+#define VMCPU_TO_HTB(a_pVCpu)     ((a_pVCpu)->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf))
+
+/** Gets the trace buffer handle from a VMCPU pointer. */
+#define VM_TO_HTB(a_pVM)          ((a_pVM)->CTX_SUFF(hTraceBuf))
+
+
+/** @name Ring-3 trace points.
+ * @{
+ */
+#ifdef IN_RING3
+# ifdef VBOX_WITH_DTRACE_R3
+#  include "VBoxVMMR3-dtrace.h"
+
+# elif defined(DBGFTRACE_ENABLED)
+#  define VBOXVMMR3_EM_STATE_CHANGED(a_pVCpu, a_enmOldState, a_enmNewState, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-state-changed %d -> %d (rc=%d)", a_enmOldState, a_enmNewState, a_rc)
+#  define VBOXVMMR3_EM_STATE_UNCHANGED(a_pVCpu, a_enmState, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-state-unchanged %d (rc=%d)", a_enmState, a_rc)
+#   define VBOXVMMR3_EM_RAW_RUN_PRE(a_pVCpu, a_pCtx) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-raw-pre %04x:%08llx", (a_pCtx)->cs, (a_pCtx)->rip)
+#   define VBOXVMMR3_EM_RAW_RUN_RET(a_pVCpu, a_pCtx, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-raw-ret %04x:%08llx rc=%d", (a_pCtx)->cs, (a_pCtx)->rip, (a_rc))
+#   define VBOXVMMR3_EM_FF_HIGH(a_pVCpu, a_fGlobal, a_fLocal, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-ff-high vm=%#x cpu=%#x rc=%d", (a_fGlobal), (a_fLocal), (a_rc))
+#   define VBOXVMMR3_EM_FF_ALL(a_pVCpu, a_fGlobal, a_fLocal, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-ff-all vm=%#x cpu=%#x rc=%d", (a_fGlobal), (a_fLocal), (a_rc))
+#   define VBOXVMMR3_EM_FF_ALL_RET(a_pVCpu, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-ff-all-ret %d", (a_rc))
+#   define VBOXVMMR3_EM_FF_RAW(a_pVCpu, a_fGlobal, a_fLocal) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-ff-raw vm=%#x cpu=%#x", (a_fGlobal), (a_fLocal))
+#   define VBOXVMMR3_EM_FF_RAW_RET(a_pVCpu, a_rc) \
+        RTTraceBufAddMsgF(VMCPU_TO_HTB(a_pVCpu), "em-ff-raw-ret %d", (a_rc))
+
+# else
+#   define VBOXVMMR3_EM_STATE_CHANGED(a_pVCpu, a_enmOldState, a_enmNewState, a_rc) do { } while (0)
+#   define VBOXVMMR3_EM_STATE_UNCHANGED(a_pVCpu, a_enmState, a_rc) do { } while (0)
+#   define VBOXVMMR3_EM_RAW_RUN_PRE(a_pVCpu, a_pCtx) do { } while (0)
+#   define VBOXVMMR3_EM_RAW_RUN_RET(a_pVCpu, a_pCtx, a_rc) do { } while (0)
+#   define VBOXVMMR3_EM_FF_HIGH(a_pVCpu, a_fGlobal, a_fLocal, a_rc) do { } while (0)
+#   define VBOXVMMR3_EM_FF_ALL(a_pVCpu, a_fGlobal, a_fLocal, a_rc) do { } while (0)
+#   define VBOXVMMR3_EM_FF_ALL_RET(a_pVCpu, a_rc) do { } while (0)
+#   define VBOXVMMR3_EM_FF_RAW(a_pVCpu, a_fGlobal, a_fLocal) do { } while (0)
+#   define VBOXVMMR3_EM_FF_RAW_RET(a_pVCpu, a_rc) do { } while (0)
+
+# endif
+#endif  /* IN_RING3 */
+
+
+/** @name Ring-0 trace points.
+ * @{
+ */
+#ifdef IN_RING0
+# ifdef VBOX_WITH_DTRACE_R0
+#  include "VBoxVMMR0-dtrace.h"
+
+# elif defined(DBGFTRACE_ENABLED)
+
+# else
+
+# endif
+#endif /* IN_RING0*/
+/** @} */
+
+
+/** @} */
+
+#endif
+
