#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
#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;
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;
#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) {
return (DDI_SUCCESS);
}
+/*
+ * APPLE NOTE: sdt_detach not implemented
+ */
#if !defined(__APPLE__)
/*ARGSUSED*/
static int
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)
#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)
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 {
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 {
}
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__ */