Index: /trunk/Config.kmk
===================================================================
--- /trunk/Config.kmk	(revision 41342)
+++ /trunk/Config.kmk	(revision 41343)
@@ -2673,4 +2673,5 @@
 endef
 
+
 #
 # VBoxTpG tool - Disabled, only generate the header.
@@ -2683,4 +2684,23 @@
 endef
 TOOL_VBoxTpG-Disabled_DTRACE_OBJ_NOT_NEEDED := $(KBUILD_OSES)
+
+
+#
+# dtrace+VBoxTpG tool for ring-3 to ring-0 pointer conversion.
+#
+TOOL_DTraceAndVBoxTpG = DTrace and the VirtualBox Tracepoint Generator working together on static ring-3 probes.
+TOOL_DTraceAndVBoxTpG_EXTENDS = StandardDTrace
+TOOL_DTraceAndVBoxTpG_DTRACE_DEPEND   = $(VBOX_VBOXTPG)
+TOOL_DTraceAndVBoxTpG_DTRACE_HDR_CMDS =
+define TOOL_DTraceAndVBoxTpG_DTRACE_HDR_CMDS
+	$(TOOL_StandardDTrace_DTRACE_HDR_CMDS)
+	$(QUIET)$(VBOX_VBOXTPG) --generate-wrapper-header --host-$(VBOX_HC_ARCH_BITS)-bit --ring-3-context \
+		$(filter-out -C, $(filter-out -h,$(flags))) \
+		-o "$(out).tmp" -s "$(source)"
+	$(APPEND) "$(out).tmp"
+	$(SED) -e 's/\(#define.*\)(arg0/\1_ORIGINAL(arg0/' --append "$(out).tmp" "$(out)"
+	$(MV) -f -- "$(out).tmp" "$(out)"
+endef
+TOOL_DTraceAndVBoxTpG_DTRACE_OBJ_CMDS = $(TOOL_StandardDTrace_DTRACE_OBJ_CMDS)
 
 
@@ -3217,5 +3237,5 @@
 TEMPLATE_VBOXR3EXE_USES                = dtrace
 if defined(VBOX_WITH_DTRACE_R3) && defined(VBOX_WITH_NATIVE_DTRACE)
- TEMPLATE_VBOXR3EXE_DTRACETOOL         = StandardDTrace
+ TEMPLATE_VBOXR3EXE_DTRACETOOL         = DTraceAndVBoxTpG
  TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS   = -C
  TEMPLATE_VBOXR3EXE_DTRACE_HDR_FLAGS   = -C
Index: /trunk/include/VBox/VBoxTpG.h
===================================================================
--- /trunk/include/VBox/VBoxTpG.h	(revision 41342)
+++ /trunk/include/VBox/VBoxTpG.h	(revision 41343)
@@ -413,7 +413,7 @@
 # define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      (a_pCtx)
 #else
-# define VTG_VM_TO_R0(a_pVM)                     ((a_pVM)->pVMR0)
-# define VTG_VMCPU_TO_R0(a_pVCpu)                VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pVCpu)
-# define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pCtx)
+# define VTG_VM_TO_R0(a_pVM)                     ((a_pVM)   ? (a_pVM)->pVMR0                                : NIL_RTR0PTR)
+# define VTG_VMCPU_TO_R0(a_pVCpu)                ((a_pVCpu) ? VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pVCpu) : NIL_RTR0PTR)
+# define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      ((a_pVCpu) ? VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pCtx)  : NIL_RTR0PTR)
 #endif
 /** @} */
Index: /trunk/src/bldprogs/VBoxTpG.cpp
===================================================================
--- /trunk/src/bldprogs/VBoxTpG.cpp	(revision 41342)
+++ /trunk/src/bldprogs/VBoxTpG.cpp	(revision 41343)
@@ -1144,5 +1144,4 @@
             generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
             ScmStreamPrintf(pStrm,
-                            ");\n"
                             "# define %s("
                             , szTmp);
