Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/dev/fbt/fbt.c
Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
#include "fbt.h" | #include "fbt.h" | ||||
MALLOC_DEFINE(M_FBT, "fbt", "Function Boundary Tracing"); | MALLOC_DEFINE(M_FBT, "fbt", "Function Boundary Tracing"); | ||||
dtrace_provider_id_t fbt_id; | dtrace_provider_id_t fbt_id; | ||||
fbt_probe_t **fbt_probetab; | fbt_probe_t **fbt_probetab; | ||||
int fbt_probetab_mask; | int fbt_probetab_mask; | ||||
static d_open_t fbt_open; | |||||
static int fbt_unload(void); | static int fbt_unload(void); | ||||
static void fbt_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); | static void fbt_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); | ||||
static void fbt_provide_module(void *, modctl_t *); | static void fbt_provide_module(void *, modctl_t *); | ||||
static void fbt_destroy(void *, dtrace_id_t, void *); | static void fbt_destroy(void *, dtrace_id_t, void *); | ||||
static void fbt_enable(void *, dtrace_id_t, void *); | static void fbt_enable(void *, dtrace_id_t, void *); | ||||
static void fbt_disable(void *, dtrace_id_t, void *); | static void fbt_disable(void *, dtrace_id_t, void *); | ||||
static void fbt_load(void *); | static void fbt_load(void *); | ||||
static void fbt_suspend(void *, dtrace_id_t, void *); | static void fbt_suspend(void *, dtrace_id_t, void *); | ||||
static void fbt_resume(void *, dtrace_id_t, void *); | static void fbt_resume(void *, dtrace_id_t, void *); | ||||
static struct cdevsw fbt_cdevsw = { | |||||
.d_version = D_VERSION, | |||||
.d_open = fbt_open, | |||||
.d_name = "fbt", | |||||
}; | |||||
static dtrace_pattr_t fbt_attr = { | static dtrace_pattr_t fbt_attr = { | ||||
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | ||||
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, | { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, | ||||
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | ||||
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | ||||
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | ||||
}; | }; | ||||
static dtrace_pops_t fbt_pops = { | static dtrace_pops_t fbt_pops = { | ||||
.dtps_provide = NULL, | .dtps_provide = NULL, | ||||
.dtps_provide_module = fbt_provide_module, | .dtps_provide_module = fbt_provide_module, | ||||
.dtps_enable = fbt_enable, | .dtps_enable = fbt_enable, | ||||
.dtps_disable = fbt_disable, | .dtps_disable = fbt_disable, | ||||
.dtps_suspend = fbt_suspend, | .dtps_suspend = fbt_suspend, | ||||
.dtps_resume = fbt_resume, | .dtps_resume = fbt_resume, | ||||
.dtps_getargdesc = fbt_getargdesc, | .dtps_getargdesc = fbt_getargdesc, | ||||
.dtps_getargval = NULL, | .dtps_getargval = NULL, | ||||
.dtps_usermode = NULL, | .dtps_usermode = NULL, | ||||
.dtps_destroy = fbt_destroy | .dtps_destroy = fbt_destroy | ||||
}; | }; | ||||
static struct cdev *fbt_cdev; | |||||
static int fbt_probetab_size; | static int fbt_probetab_size; | ||||
static int fbt_verbose = 0; | static int fbt_verbose = 0; | ||||
int | int | ||||
fbt_excluded(const char *name) | fbt_excluded(const char *name) | ||||
{ | { | ||||
if (strncmp(name, "dtrace_", 7) == 0 && | if (strncmp(name, "dtrace_", 7) == 0 && | ||||
▲ Show 20 Lines • Show All 1,130 Lines • ▼ Show 20 Lines | fbt_linker_file_cb(linker_file_t lf, void *arg) | ||||
fbt_provide_module(arg, lf); | fbt_provide_module(arg, lf); | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
fbt_load(void *dummy) | fbt_load(void *dummy) | ||||
{ | { | ||||
/* Create the /dev/dtrace/fbt entry. */ | |||||
fbt_cdev = make_dev(&fbt_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, | |||||
"dtrace/fbt"); | |||||
/* Default the probe table size if not specified. */ | /* Default the probe table size if not specified. */ | ||||
if (fbt_probetab_size == 0) | if (fbt_probetab_size == 0) | ||||
fbt_probetab_size = FBT_PROBETAB_SIZE; | fbt_probetab_size = FBT_PROBETAB_SIZE; | ||||
/* Choose the hash mask for the probe table. */ | /* Choose the hash mask for the probe table. */ | ||||
fbt_probetab_mask = fbt_probetab_size - 1; | fbt_probetab_mask = fbt_probetab_size - 1; | ||||
/* Allocate memory for the probe table. */ | /* Allocate memory for the probe table. */ | ||||
Show All 25 Lines | fbt_unload() | ||||
if ((error = dtrace_unregister(fbt_id)) != 0) | if ((error = dtrace_unregister(fbt_id)) != 0) | ||||
return (error); | return (error); | ||||
/* Free the probe table. */ | /* Free the probe table. */ | ||||
free(fbt_probetab, M_FBT); | free(fbt_probetab, M_FBT); | ||||
fbt_probetab = NULL; | fbt_probetab = NULL; | ||||
fbt_probetab_mask = 0; | fbt_probetab_mask = 0; | ||||
destroy_dev(fbt_cdev); | |||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
fbt_modevent(module_t mod __unused, int type, void *data __unused) | fbt_modevent(module_t mod __unused, int type, void *data __unused) | ||||
{ | { | ||||
int error = 0; | int error = 0; | ||||
Show All 9 Lines | fbt_modevent(module_t mod __unused, int type, void *data __unused) | ||||
default: | default: | ||||
error = EOPNOTSUPP; | error = EOPNOTSUPP; | ||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | |||||
static int | |||||
fbt_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused) | |||||
{ | |||||
return (0); | |||||
} | } | ||||
SYSINIT(fbt_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, fbt_load, NULL); | SYSINIT(fbt_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, fbt_load, NULL); | ||||
SYSUNINIT(fbt_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, fbt_unload, NULL); | SYSUNINIT(fbt_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, fbt_unload, NULL); | ||||
DEV_MODULE(fbt, fbt_modevent, NULL); | DEV_MODULE(fbt, fbt_modevent, NULL); | ||||
MODULE_VERSION(fbt, 1); | MODULE_VERSION(fbt, 1); | ||||
MODULE_DEPEND(fbt, dtrace, 1, 1, 1); | MODULE_DEPEND(fbt, dtrace, 1, 1, 1); | ||||
MODULE_DEPEND(fbt, opensolaris, 1, 1, 1); | MODULE_DEPEND(fbt, opensolaris, 1, 1, 1); |