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 18 static d_open_t prototype_open; 19 static int prototype_unload(void); 20 static void prototype_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); 21 static void prototype_provide(void *, dtrace_probedesc_t *); 22 static void prototype_destroy(void *, dtrace_id_t, void *); 23 static void prototype_enable(void *, dtrace_id_t, void *); 24 static void prototype_disable(void *, dtrace_id_t, void *); 25 static void prototype_load(void *); 26 27 static struct cdevsw prototype_cdevsw = { 28 .d_version = D_VERSION, 29 .d_open = prototype_open, 30 .d_name = "prototype", 31 }; 32 33 static 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 41 static dtrace_pops_t prototype_pops = { 42 .dtps_provide = prototype_provide, 43 .dtps_provide_module = NULL, 44 .dtps_enable = prototype_enable, 45 .dtps_disable = prototype_disable, 46 .dtps_suspend = NULL, 47 .dtps_resume = NULL, 48 .dtps_getargdesc = prototype_getargdesc, 49 .dtps_getargval = NULL, 50 .dtps_usermode = NULL, 51 .dtps_destroy = prototype_destroy 52 }; 53 54 static struct cdev *prototype_cdev; 55 static dtrace_provider_id_t prototype_id; 56 57 static void 58 prototype_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc) 59 { 60 } 61 62 static void 63 prototype_provide(void *arg, dtrace_probedesc_t *desc) 64 { 65 } 66 67 static void 68 prototype_destroy(void *arg, dtrace_id_t id, void *parg) 69 { 70 } 71 72 static void 73 prototype_enable(void *arg, dtrace_id_t id, void *parg) 74 { 75 } 76 77 static void 78 prototype_disable(void *arg, dtrace_id_t id, void *parg) 79 { 80 } 81 82 static void 83 prototype_load(void *dummy) 84 { 85 /* 86 * Create the /dev/dtrace/prototype entry. 87 * XXX: Remove this if the provider does not need any customs ioctls. 88 */ 89 prototype_cdev = make_dev(&prototype_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, 90 "dtrace/prototype"); 91 92 if (dtrace_register("prototype", &prototype_attr, DTRACE_PRIV_USER, 93 NULL, &prototype_pops, NULL, &prototype_id) != 0) 94 return; 95 } 96 97 98 static int 99 prototype_unload(void) 100 { 101 int error = 0; 102 103 if ((error = dtrace_unregister(prototype_id)) != 0) 104 return (error); 105 106 destroy_dev(prototype_cdev); 107 108 return (error); 109 } 110 111 static int 112 prototype_modevent(module_t mod __unused, int type, void *data __unused) 113 { 114 int error = 0; 115 116 switch (type) { 117 case MOD_LOAD: 118 break; 119 120 case MOD_UNLOAD: 121 break; 122 123 case MOD_SHUTDOWN: 124 break; 125 126 default: 127 error = EOPNOTSUPP; 128 break; 129 130 } 131 132 return (error); 133 } 134 135 static int 136 prototype_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused) 137 { 138 return (0); 139 } 140 141 SYSINIT(prototype_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_load, NULL); 142 SYSUNINIT(prototype_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_unload, NULL); 143 144 DEV_MODULE(prototype, prototype_modevent, NULL); 145 MODULE_VERSION(prototype, 1); 146 MODULE_DEPEND(prototype, dtrace, 1, 1, 1); 147 MODULE_DEPEND(prototype, opensolaris, 1, 1, 1); 148