1/* 2 * This file is freeware. You are free to use it and add your own 3 * license. 4 * 5 * $FreeBSD$ 6 * 7 */ 8 9#include <sys/cdefs.h> 10#include <sys/param.h> 11#include <sys/systm.h> 12#include <sys/conf.h> 13#include <sys/kernel.h> 14#include <sys/module.h> 15 16#include <sys/dtrace.h> 17 18static d_open_t prototype_open; 19static int prototype_unload(void); 20static void prototype_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); 21static void prototype_provide(void *, dtrace_probedesc_t *); 22static void prototype_destroy(void *, dtrace_id_t, void *); 23static void prototype_enable(void *, dtrace_id_t, void *); 24static void prototype_disable(void *, dtrace_id_t, void *); 25static void prototype_load(void *); 26 27static struct cdevsw prototype_cdevsw = { 28 .d_version = D_VERSION, 29 .d_open = prototype_open, 30 .d_name = "prototype", 31}; 32 33static dtrace_pattr_t prototype_attr = { 34{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, 35{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, 36{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, 37{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, 38{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, 39}; 40 41static dtrace_pops_t prototype_pops = { 42 prototype_provide, 43 NULL, 44 prototype_enable, 45 prototype_disable, 46 NULL, 47 NULL, 48 prototype_getargdesc, 49 NULL, 50 NULL, 51 prototype_destroy 52}; 53 54static struct cdev *prototype_cdev; 55static dtrace_provider_id_t prototype_id; 56 57static void 58prototype_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc) 59{ 60} 61 62static void 63prototype_provide(void *arg, dtrace_probedesc_t *desc) 64{ 65} 66 67static void 68prototype_destroy(void *arg, dtrace_id_t id, void *parg) 69{ 70} 71 72static void 73prototype_enable(void *arg, dtrace_id_t id, void *parg) 74{ 75} 76 77static void 78prototype_disable(void *arg, dtrace_id_t id, void *parg) 79{ 80} 81 82static void 83prototype_load(void *dummy) 84{ 85 /* Create the /dev/dtrace/prototype entry. */ 86 prototype_cdev = make_dev(&prototype_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, 87 "dtrace/prototype"); 88 89 if (dtrace_register("prototype", &prototype_attr, DTRACE_PRIV_USER, 90 NULL, &prototype_pops, NULL, &prototype_id) != 0) 91 return; 92} 93 94 95static int 96prototype_unload() 97{ 98 int error = 0; 99 100 if ((error = dtrace_unregister(prototype_id)) != 0) 101 return (error); 102 103 destroy_dev(prototype_cdev); 104 105 return (error); 106} 107 108static int 109prototype_modevent(module_t mod __unused, int type, void *data __unused) 110{ 111 int error = 0; 112 113 switch (type) { 114 case MOD_LOAD: 115 break; 116 117 case MOD_UNLOAD: 118 break; 119 120 case MOD_SHUTDOWN: 121 break; 122 123 default: 124 error = EOPNOTSUPP; 125 break; 126 127 } 128 129 return (error); 130} 131 132static int 133prototype_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused) 134{ 135 return (0); 136} 137 138SYSINIT(prototype_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_load, NULL); 139SYSUNINIT(prototype_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_unload, NULL); 140 141DEV_MODULE(prototype, prototype_modevent, NULL); 142MODULE_VERSION(prototype, 1); 143MODULE_DEPEND(prototype, dtrace, 1, 1, 1); 144MODULE_DEPEND(prototype, opensolaris, 1, 1, 1); 145