]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/dev/dtrace/sdt.c
xnu-3247.1.106.tar.gz
[apple/xnu.git] / bsd / dev / dtrace / sdt.c
index bca167f015f66cadf5b7ab20d05feaa4b0ae7685..f31f21be13eefcba1d01f552dc5512ae81d1680d 100644 (file)
@@ -40,6 +40,7 @@
 #include <sys/fcntl.h>
 #include <miscfs/devfs/devfs.h>
 
+
 #include <sys/dtrace.h>
 #include <sys/dtrace_impl.h>
 
 #include <sys/sdt_impl.h>
 extern int dtrace_kernel_symbol_mode;
 
+/* #include <machine/trap.h */
 struct savearea_t; /* Used anonymously */
-typedef kern_return_t (*perfCallback)(int, struct savearea_t *, uintptr_t *, int);
 
-#if defined(__i386__) || defined(__x86_64__)
+#if   defined(__x86_64__)
+typedef kern_return_t (*perfCallback)(int, struct savearea_t *, uintptr_t *, int);
 extern perfCallback tempDTraceTrapHook;
-extern kern_return_t fbt_perfCallback(int, struct savearea_t *, int, int);
-
+extern kern_return_t fbt_perfCallback(int, struct savearea_t *, uintptr_t *, int);
 #define        SDT_PATCHVAL    0xf0
 #define        SDT_AFRAMES             6
 #else
@@ -63,11 +64,7 @@ extern kern_return_t fbt_perfCallback(int, struct savearea_t *, int, int);
 
 #define        SDT_PROBETAB_SIZE       0x1000          /* 4k entries -- 16K total */
 
-#if defined(__x86_64__)
-#define DTRACE_PROBE_PREFIX "_dtrace_probeDOLLAR"
-#else
 #define DTRACE_PROBE_PREFIX "_dtrace_probe$"
-#endif
 
 static dev_info_t              *sdt_devi;
 static int                     sdt_verbose = 0;
@@ -157,6 +154,10 @@ __sdt_provide_module(void *arg, struct modctl *ctl)
                        mp->sdt_nprobes++;
                }
 
+#if 0          
+               printf ("__sdt_provide_module:  sdpd=0x%p  sdp=0x%p  name=%s, id=%d\n", sdpd, sdp, nname, sdp->sdp_id);
+#endif         
+
                sdp->sdp_hashnext =
                    sdt_probetab[SDT_ADDR2NDX(sdpd->sdpd_offset)];
                sdt_probetab[SDT_ADDR2NDX(sdpd->sdpd_offset)] = sdp;
@@ -174,7 +175,11 @@ sdt_destroy(void *arg, dtrace_id_t id, void *parg)
 #pragma unused(arg,id)
        sdt_probe_t *sdp = parg, *old, *last, *hash;
        int ndx;
+
 #if !defined(__APPLE__)
+       /*
+        * APPLE NOTE:  sdt probes for kexts not yet implemented
+        */
        struct modctl *ctl = sdp->sdp_ctl;
 
        if (ctl != NULL && ctl->mod_loadcnt == sdp->sdp_loadcnt) {
@@ -343,6 +348,9 @@ sdt_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
        return (DDI_SUCCESS);
 }
 
+/*
+ * APPLE NOTE:  sdt_detach not implemented
+ */
 #if !defined(__APPLE__)
 /*ARGSUSED*/
 static int
@@ -375,100 +383,8 @@ sdt_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
 
        return (DDI_SUCCESS);
 }
+#endif /* __APPLE__ */
 
-/*ARGSUSED*/
-static int
-sdt_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
-{
-       int error;
-
-       switch (infocmd) {
-       case DDI_INFO_DEVT2DEVINFO:
-               *result = (void *)sdt_devi;
-               error = DDI_SUCCESS;
-               break;
-       case DDI_INFO_DEVT2INSTANCE:
-               *result = (void *)0;
-               error = DDI_SUCCESS;
-               break;
-       default:
-               error = DDI_FAILURE;
-       }
-       return (error);
-}
-
-/*ARGSUSED*/
-static int
-sdt_open(dev_t *devp, int flag, int otyp, cred_t *cred_p)
-{
-       return (0);
-}
-
-static struct cb_ops sdt_cb_ops = {
-       sdt_open,               /* open */
-       nodev,                  /* close */
-       nulldev,                /* strategy */
-       nulldev,                /* print */
-       nodev,                  /* dump */
-       nodev,                  /* read */
-       nodev,                  /* write */
-       nodev,                  /* ioctl */
-       nodev,                  /* devmap */
-       nodev,                  /* mmap */
-       nodev,                  /* segmap */
-       nochpoll,               /* poll */
-       ddi_prop_op,            /* cb_prop_op */
-       0,                      /* streamtab  */
-       D_NEW | D_MP            /* Driver compatibility flag */
-};
-
-static struct dev_ops sdt_ops = {
-       DEVO_REV,               /* devo_rev, */
-       0,                      /* refcnt  */
-       sdt_info,               /* get_dev_info */
-       nulldev,                /* identify */
-       nulldev,                /* probe */
-       sdt_attach,             /* attach */
-       sdt_detach,             /* detach */
-       nodev,                  /* reset */
-       &sdt_cb_ops,            /* driver operations */
-       NULL,                   /* bus operations */
-       nodev                   /* dev power */
-};
-
-/*
- * Module linkage information for the kernel.
- */
-static struct modldrv modldrv = {
-       &mod_driverops,         /* module type (this is a pseudo driver) */
-       "Statically Defined Tracing",   /* name of module */
-       &sdt_ops,               /* driver ops */
-};
-
-static struct modlinkage modlinkage = {
-       MODREV_1,
-       (void *)&modldrv,
-       NULL
-};
-
-int
-_init(void)
-{
-       return (mod_install(&modlinkage));
-}
-
-int
-_info(struct modinfo *modinfop)
-{
-       return (mod_info(&modlinkage, modinfop));
-}
-
-int
-_fini(void)
-{
-       return (mod_remove(&modlinkage));
-}
-#else
 d_open_t _sdt_open;
 
 int _sdt_open(dev_t dev, int flags, int devtype, struct proc *p)
@@ -508,14 +424,6 @@ static struct module g_sdt_mach_module;
 #include <mach-o/nlist.h>
 #include <libkern/kernel_mach_header.h>
 
-#if defined(__LP64__)
-#define KERNEL_MAGIC MH_MAGIC_64
-typedef struct nlist_64 kernel_nlist_t;
-#else
-#define KERNEL_MAGIC MH_MAGIC
-typedef struct nlist kernel_nlist_t;
-#endif
-
 void sdt_init( void )
 {
        if (0 == gSDTInited)
@@ -528,7 +436,11 @@ void sdt_init( void )
                        return;
                }
 
-               if (KERNEL_MAGIC != _mh_execute_header.magic) {
+               if (dtrace_fbt_probes_restricted()) {
+                       return;
+               }
+
+               if (MH_MAGIC_KERNEL != _mh_execute_header.magic) {
                        g_sdt_kernctl.mod_address = (vm_address_t)NULL;
                        g_sdt_kernctl.mod_size = 0;
                } else {
@@ -638,7 +550,12 @@ void sdt_init( void )
                                        strncpy(sdpd->sdpd_func, prev_name, len); /* NUL termination is ensured. */
                                        
                                        sdpd->sdpd_offset = *(unsigned long *)sym[i].n_value;
-                                       
+
+#if 0
+                                       printf("sdt_init: sdpd_offset=0x%lx, n_value=0x%lx, name=%s\n",
+                                           sdpd->sdpd_offset,  *(unsigned long *)sym[i].n_value, name);
+#endif
+
                                        sdpd->sdpd_next = g_sdt_mach_module.sdt_probes;
                                        g_sdt_mach_module.sdt_probes = sdpd;
                                } else {
@@ -681,11 +598,11 @@ sdt_provide_module(void *arg, struct modctl *ctl)
                }
                g_sdt_mach_module.sdt_probes = NULL;
        } else {
-               /* FIXME -- sdt in kext not yet supported */
+               /*
+                * APPLE NOTE:  sdt probes for kexts not yet implemented
+                */
        }
        
        /* Need to mark this module as completed */
        ctl->mod_flags |= MODCTL_SDT_PROBES_PROVIDED;
 }
-
-#endif /* __APPLE__ */