1 /* 2 * This file is freeware. You are free to use it and add your own 3 * license. 4 * 5 */ 6 7 #include <sys/param.h> 8 #include <sys/systm.h> 9 #include <sys/conf.h> 10 #include <sys/kernel.h> 11 #include <sys/module.h> 12 13 #include <sys/dtrace.h> 14 15 static d_open_t prototype_open; 16 static int prototype_unload(void); 17 static void prototype_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); 18 static void prototype_provide(void *, dtrace_probedesc_t *); 19 static void prototype_destroy(void *, dtrace_id_t, void *); 20 static void prototype_enable(void *, dtrace_id_t, void *); 21 static void prototype_disable(void *, dtrace_id_t, void *); 22 static void prototype_load(void *); 23 24 static struct cdevsw prototype_cdevsw = { 25 .d_version = D_VERSION, 26 .d_open = prototype_open, 27 .d_name = "prototype", 28 }; 29 30 static dtrace_pattr_t prototype_attr = { 31 { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, 32 { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, 33 { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, 34 { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, 35 { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, 36 }; 37 38 static dtrace_pops_t prototype_pops = { 39 .dtps_provide = prototype_provide, 40 .dtps_provide_module = NULL, 41 .dtps_enable = prototype_enable, 42 .dtps_disable = prototype_disable, 43 .dtps_suspend = NULL, 44 .dtps_resume = NULL, 45 .dtps_getargdesc = prototype_getargdesc, 46 .dtps_getargval = NULL, 47 .dtps_usermode = NULL, 48 .dtps_destroy = prototype_destroy 49 }; 50 51 static struct cdev *prototype_cdev; 52 static dtrace_provider_id_t prototype_id; 53 54 static void 55 prototype_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc) 56 { 57 } 58 59 static void 60 prototype_provide(void *arg, dtrace_probedesc_t *desc) 61 { 62 } 63 64 static void 65 prototype_destroy(void *arg, dtrace_id_t id, void *parg) 66 { 67 } 68 69 static void 70 prototype_enable(void *arg, dtrace_id_t id, void *parg) 71 { 72 } 73 74 static void 75 prototype_disable(void *arg, dtrace_id_t id, void *parg) 76 { 77 } 78 79 static void 80 prototype_load(void *dummy) 81 { 82 /* 83 * Create the /dev/dtrace/prototype entry. 84 * XXX: Remove this if the provider does not need any customs ioctls. 85 */ 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 95 static int 96 prototype_unload(void) 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 108 static int 109 prototype_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 132 static int 133 prototype_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused) 134 { 135 return (0); 136 } 137 138 SYSINIT(prototype_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_load, NULL); 139 SYSUNINIT(prototype_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_unload, NULL); 140 141 DEV_MODULE(prototype, prototype_modevent, NULL); 142 MODULE_VERSION(prototype, 1); 143 MODULE_DEPEND(prototype, dtrace, 1, 1, 1); 144 MODULE_DEPEND(prototype, opensolaris, 1, 1, 1); 145