Index: /trunk/Config.kmk
===================================================================
--- /trunk/Config.kmk	(revision 40974)
+++ /trunk/Config.kmk	(revision 40975)
@@ -620,8 +620,4 @@
  VBOX_WITH_DTRACE_R0DRV = 1
 endif
-# Set this to enable all kernel driver dtrace probes.
-if1of ($(KBUILD_TARGET), darwin solaris)
- VBOX_WITH_NATIVE_DTRACE_R0DRV = 1
-endif
 # Set this to enable dtrace probes in platform agnostic kernel code.
 ifn1of ($(KBUILD_TARGET), os2)
@@ -632,4 +628,8 @@
 # Set this to enable support for dtrace probes in guest code.
 #VBOX_WITH_DTRACE_GST = 1
+# Set this to indicate that the host shipts with DTrace.
+if1of ($(KBUILD_TARGET), darwin solaris freebsd)
+ VBOX_WITH_NATIVE_DTRACE = 1
+endif
 ## @}
 
@@ -2944,6 +2944,6 @@
  TEMPLATE_VBOXR0DRV_DTRACETOOL         = VBoxTpG
  TEMPLATE_VBOXR0DRV_DEFS              += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0DRV
- ifdef VBOX_WITH_NATIVE_DTRACE_R0DRV
-  TEMPLATE_VBOXR0DRV_DEFS             += VBOX_WITH_NATIVE_DTRACE_R0DRV
+ ifdef VBOX_WITH_NATIVE_DTRACE
+  TEMPLATE_VBOXR0DRV_DEFS             += VBOX_WITH_NATIVE_DTRACE
  endif
 else
@@ -3201,13 +3201,20 @@
 TEMPLATE_VBOXR3EXE_ASFLAGS.x86         = $(VBOX_ASFLAGS32)
 TEMPLATE_VBOXR3EXE_ASFLAGS.amd64       = $(VBOX_ASFLAGS64)
+TEMPLATE_VBOXR3EXE_DEFS                = IN_RING3 $(ARCH_BITS_DEFS)
 TEMPLATE_VBOXR3EXE_USES                = dtrace
 ifdef VBOX_WITH_DTRACE_R3
- TEMPLATE_VBOXR3EXE_DTRACETOOL         = StandardDTrace
- TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS   = -C
- TEMPLATE_VBOXR3EXE_DTRACE_HDR_FLAGS   = -C
+ ifdef VBOX_WITH_NATIVE_DTRACE
+  TEMPLATE_VBOXR3EXE_DTRACETOOL        = StandardDTrace
+  TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS  = -C
+  TEMPLATE_VBOXR3EXE_DTRACE_HDR_FLAGS  = -C
+  TEMPLATE_VBOXR3EXE_DEFS             += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_NATIVE_DTRACE
+ else
+  TEMPLATE_VBOXR3EXE_DTRACETOOL        = VBoxTpG
+  TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS  = --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
+  TEMPLATE_VBOXR3EXE_DEFS             += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3
+ endif
 else
  TEMPLATE_VBOXR3EXE_DTRACETOOL         = VBoxTpG-Disabled
 endif
-TEMPLATE_VBOXR3EXE_DEFS                = IN_RING3 $(ARCH_BITS_DEFS)
 TEMPLATE_VBOXR3EXE_LIBS.kprofile       = $(LIB_KPROFILE)
 ifeq ($(KBUILD_TARGET),win)
@@ -3309,4 +3316,8 @@
 	-Wl,--rpath-link,$(L4_LIBDIR)
 TEMPLATE_VBOXR3EXE_LDFLAGS.linux       = -Wl,-z,noexecstack $(VBOX_LD_as_needed)
+ifdef VBOX_WITH_DTRACE_R3
+ TEMPLATE_VBOXR3EXE_LDFLAGS.linux     += -Wl,--verbose
+endif
+
  ifeq ($(KBUILD_TARGET),linux)
 TEMPLATE_VBOXR3EXE_LIBS                = pthread m rt dl
Index: /trunk/src/VBox/HostDrivers/Support/Makefile.kmk
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/Makefile.kmk	(revision 40974)
+++ /trunk/src/VBox/HostDrivers/Support/Makefile.kmk	(revision 40975)
@@ -313,5 +313,5 @@
   	SUPDrvTracer.cpp \
  	SUPDrv.d
- ifdef VBOX_WITH_NATIVE_DTRACE_R0DRV
+ ifdef VBOX_WITH_NATIVE_DTRACE
   VBoxDrv_SOURCES        += \
   	SUPDrv-dtrace.cpp
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp	(revision 40974)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp	(revision 40975)
@@ -218,5 +218,5 @@
     dtrace_provider_id_t    idProvider   = pProv->TracerData.DTrace.idProvider;
     AssertPtrReturnVoid(idProvider);
-    
+
     AssertPtrReturnVoid(pProv->pHdr);
     PVTGPROBELOC            pProbeLoc    = pProv->pHdr->paProbLocs;
@@ -837,6 +837,6 @@
 }
 
-#ifndef VBOX_WITH_NATIVE_DTRACE_R0DRV
-# error "VBOX_WITH_NATIVE_DTRACE_R0DRV is not defined as it should"
+#ifndef VBOX_WITH_NATIVE_DTRACE
+# error "VBOX_WITH_NATIVE_DTRACE is not defined as it should"
 #endif
 
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h	(revision 40974)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h	(revision 40975)
@@ -661,5 +661,5 @@
 DECLASM(void)   supdrvTracerProbeFireStub(void);
 
-#ifdef VBOX_WITH_NATIVE_DTRACE_R0DRV
+#ifdef VBOX_WITH_NATIVE_DTRACE
 const SUPDRVTRACERREG * VBOXCALL supdrvDTraceInit(void);
 #endif
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp	(revision 40974)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp	(revision 40975)
@@ -1424,5 +1424,5 @@
         RTListInit(&pDevExt->TracerProviderZombieList);
 
-#ifdef VBOX_WITH_NATIVE_DTRACE_R0DRV
+#ifdef VBOX_WITH_NATIVE_DTRACE
         pDevExt->pTracerOps = supdrvDTraceInit();
         if (pDevExt->pTracerOps)
Index: /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp	(revision 40974)
+++ /trunk/src/VBox/HostDrivers/Support/SUPLib.cpp	(revision 40975)
@@ -2387,2 +2387,14 @@
 }
 
+extern "C"
+{
+    SUPDECL(void) SUPTracerFireProbe(uint32_t idProbe, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2,
+                                     uintptr_t uArg3, uintptr_t uArg4);
+}
+
+SUPDECL(void) SUPTracerFireProbe(uint32_t idProbe, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2,
+                                 uintptr_t uArg3, uintptr_t uArg4)
+{
+    /* C and stubbed for now. */
+}
+
Index: /trunk/src/VBox/VMM/VMMR3/VM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/VM.cpp	(revision 40974)
+++ /trunk/src/VBox/VMM/VMMR3/VM.cpp	(revision 40975)
@@ -72,4 +72,7 @@
 
 #include <VBox/sup.h>
+#if defined(VBOX_WITH_DTRACE_R3) && !defined(VBOX_WITH_NATIVE_DTRACE)
+# include <VBox/VBoxTpG.h>
+#endif
 #include <VBox/dbg.h>
 #include <VBox/err.h>
@@ -156,4 +159,8 @@
         return VINF_SUCCESS;
 
+#if defined(VBOX_WITH_DTRACE_R3) && !defined(VBOX_WITH_NATIVE_DTRACE)
+    //SUPR3TracerRegisterModule(&g_VTGObjHeader, "VBoxVMM");
+#endif
+
     /*
      * We're done.
@@ -162,5 +169,4 @@
     return VINF_SUCCESS;
 }
-
 
 
Index: /trunk/src/bldprogs/VBoxTpG.cpp
===================================================================
--- /trunk/src/bldprogs/VBoxTpG.cpp	(revision 40974)
+++ /trunk/src/bldprogs/VBoxTpG.cpp	(revision 40975)
@@ -183,4 +183,5 @@
 static const char          *g_pszProbeFnName            = "SUPR0TracerFireProbe";
 static bool                 g_fProbeFnImported          = true;
+static bool                 g_fPic                      = false;
 /** @} */
 
@@ -750,5 +751,5 @@
                     g_fProbeFnImported ? "IMP" : "",
                     g_pszProbeFnName);
-    if (fMachO64 && g_fProbeFnImported)
+    if (fMachO64 && g_fProbeFnImported && !g_fPic)
         ScmStreamPrintf(pStrm,
                         "g_pfnVtgProbeFn:\n"
@@ -792,5 +793,14 @@
              */
             if (g_cBits == 32)
-                ScmStreamPrintf(pStrm, g_fProbeFnImported ?
+                ScmStreamPrintf(pStrm, g_fPic ?
+                                "        call    .mov_ecx_eip_plus_5\n"
+                                ".got_eip:\n"
+                                "        add     ecx, _GLOBAL_OFFSET_TABLE + ($$ - .got_eip) wrt ..gotpc\n"
+                                "        mov     ecx, [%s@GOT + ecx]\n"
+                                "        jmp     ecx\n"
+                                ".mov_ecx_eip_plus_5:\n"
+                                "        pop     ecx\n"
+                                "        jmp     ecx\n"
+                                : g_fProbeFnImported ?
                                 "        mov     ecx, IMP2(%s)\n"
                                 "        jmp     ecx\n"
@@ -809,6 +819,8 @@
                                 "        jmp     [g_pfnVtgProbeFn wrt rip]\n");
             else
-                ScmStreamPrintf(pStrm, g_fProbeFnImported ?
-                                "        lea     rax, [IMP2(%s)]\n" //??? macho64?
+                ScmStreamPrintf(pStrm, g_fPic ?
+                                "        jmp     [rel %s wrt ..got]\n"
+                                : g_fProbeFnImported ?
+                                "        lea     rax, [IMP2(%s)]\n"
                                 "        jmp     rax\n"
                                 :
@@ -2043,6 +2055,8 @@
         kVBoxTpGOpt_AssemblerOutputOpt,
         kVBoxTpGOpt_AssemblerOption,
+        kVBoxTpGOpt_Pic,
         kVBoxTpGOpt_ProbeFnName,
         kVBoxTpGOpt_ProbeFnImported,
+        kVBoxTpGOpt_ProbeFnNotImported,
         kVBoxTpGOpt_End
     };
@@ -2065,6 +2079,8 @@
         { "--assembler-output-opt",             kVBoxTpGOpt_AssemblerOutputOpt,         RTGETOPT_REQ_STRING  },
         { "--assembler-option",                 kVBoxTpGOpt_AssemblerOption,            RTGETOPT_REQ_STRING  },
+        { "--pic",                              kVBoxTpGOpt_Pic,                        RTGETOPT_REQ_NOTHING },
         { "--probe-fn-name",                    kVBoxTpGOpt_ProbeFnName,                RTGETOPT_REQ_STRING  },
-        { "--probe-fn-imported",                kVBoxTpGOpt_ProbeFnImported,            RTGETOPT_REQ_BOOL    },
+        { "--probe-fn-imported",                kVBoxTpGOpt_ProbeFnImported,            RTGETOPT_REQ_NOTHING },
+        { "--probe-fn-not-imported",            kVBoxTpGOpt_ProbeFnNotImported,         RTGETOPT_REQ_NOTHING },
         /** @todo We're missing a bunch of assembler options! */
     };
@@ -2189,4 +2205,8 @@
                 break;
 
+            case kVBoxTpGOpt_Pic:
+                g_fPic = true;
+                break;
+
             case kVBoxTpGOpt_ProbeFnName:
                 g_pszProbeFnName = ValueUnion.psz;
@@ -2194,5 +2214,9 @@
 
             case kVBoxTpGOpt_ProbeFnImported:
-                g_pszProbeFnName = ValueUnion.psz;
+                g_fProbeFnImported = true;
+                break;
+
+            case kVBoxTpGOpt_ProbeFnNotImported:
+                g_fProbeFnImported = false;
                 break;
 
