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