1179237Sjb/* 2179237Sjb * This file is freeware. You are free to use it and add your own 3179237Sjb * license. 4179237Sjb * 5179237Sjb * $FreeBSD$ 6179237Sjb * 7179237Sjb */ 8179237Sjb 9179237Sjb#include <sys/cdefs.h> 10179237Sjb#include <sys/param.h> 11179237Sjb#include <sys/systm.h> 12179237Sjb#include <sys/conf.h> 13179237Sjb#include <sys/kernel.h> 14179237Sjb#include <sys/module.h> 15179237Sjb 16179237Sjb#include <sys/dtrace.h> 17179237Sjb 18179237Sjbstatic d_open_t prototype_open; 19179237Sjbstatic int prototype_unload(void); 20179237Sjbstatic void prototype_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *); 21179237Sjbstatic void prototype_provide(void *, dtrace_probedesc_t *); 22179237Sjbstatic void prototype_destroy(void *, dtrace_id_t, void *); 23179237Sjbstatic void prototype_enable(void *, dtrace_id_t, void *); 24179237Sjbstatic void prototype_disable(void *, dtrace_id_t, void *); 25179237Sjbstatic void prototype_load(void *); 26179237Sjb 27179237Sjbstatic struct cdevsw prototype_cdevsw = { 28179237Sjb .d_version = D_VERSION, 29179237Sjb .d_open = prototype_open, 30179237Sjb .d_name = "prototype", 31179237Sjb}; 32179237Sjb 33179237Sjbstatic dtrace_pattr_t prototype_attr = { 34179237Sjb{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, 35179237Sjb{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, 36179237Sjb{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, 37179237Sjb{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, 38179237Sjb{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, 39179237Sjb}; 40179237Sjb 41179237Sjbstatic dtrace_pops_t prototype_pops = { 42179237Sjb prototype_provide, 43179237Sjb NULL, 44179237Sjb prototype_enable, 45179237Sjb prototype_disable, 46179237Sjb NULL, 47179237Sjb NULL, 48179237Sjb prototype_getargdesc, 49179237Sjb NULL, 50179237Sjb NULL, 51179237Sjb prototype_destroy 52179237Sjb}; 53179237Sjb 54179237Sjbstatic struct cdev *prototype_cdev; 55179237Sjbstatic dtrace_provider_id_t prototype_id; 56179237Sjb 57179237Sjbstatic void 58179237Sjbprototype_getargdesc(void *arg, dtrace_id_t id, void *parg, dtrace_argdesc_t *desc) 59179237Sjb{ 60179237Sjb} 61179237Sjb 62179237Sjbstatic void 63179237Sjbprototype_provide(void *arg, dtrace_probedesc_t *desc) 64179237Sjb{ 65179237Sjb} 66179237Sjb 67179237Sjbstatic void 68179237Sjbprototype_destroy(void *arg, dtrace_id_t id, void *parg) 69179237Sjb{ 70179237Sjb} 71179237Sjb 72179237Sjbstatic void 73179237Sjbprototype_enable(void *arg, dtrace_id_t id, void *parg) 74179237Sjb{ 75179237Sjb} 76179237Sjb 77179237Sjbstatic void 78179237Sjbprototype_disable(void *arg, dtrace_id_t id, void *parg) 79179237Sjb{ 80179237Sjb} 81179237Sjb 82179237Sjbstatic void 83179237Sjbprototype_load(void *dummy) 84179237Sjb{ 85179237Sjb /* Create the /dev/dtrace/prototype entry. */ 86179237Sjb prototype_cdev = make_dev(&prototype_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, 87179237Sjb "dtrace/prototype"); 88179237Sjb 89179237Sjb if (dtrace_register("prototype", &prototype_attr, DTRACE_PRIV_USER, 90179237Sjb NULL, &prototype_pops, NULL, &prototype_id) != 0) 91179237Sjb return; 92179237Sjb} 93179237Sjb 94179237Sjb 95179237Sjbstatic int 96179237Sjbprototype_unload() 97179237Sjb{ 98179237Sjb int error = 0; 99179237Sjb 100179237Sjb if ((error = dtrace_unregister(prototype_id)) != 0) 101179237Sjb return (error); 102179237Sjb 103179237Sjb destroy_dev(prototype_cdev); 104179237Sjb 105179237Sjb return (error); 106179237Sjb} 107179237Sjb 108179237Sjbstatic int 109179237Sjbprototype_modevent(module_t mod __unused, int type, void *data __unused) 110179237Sjb{ 111179237Sjb int error = 0; 112179237Sjb 113179237Sjb switch (type) { 114179237Sjb case MOD_LOAD: 115179237Sjb break; 116179237Sjb 117179237Sjb case MOD_UNLOAD: 118179237Sjb break; 119179237Sjb 120179237Sjb case MOD_SHUTDOWN: 121179237Sjb break; 122179237Sjb 123179237Sjb default: 124179237Sjb error = EOPNOTSUPP; 125179237Sjb break; 126179237Sjb 127179237Sjb } 128179237Sjb 129179237Sjb return (error); 130179237Sjb} 131179237Sjb 132179237Sjbstatic int 133179237Sjbprototype_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused) 134179237Sjb{ 135179237Sjb return (0); 136179237Sjb} 137179237Sjb 138179237SjbSYSINIT(prototype_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_load, NULL); 139179237SjbSYSUNINIT(prototype_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, prototype_unload, NULL); 140179237Sjb 141179237SjbDEV_MODULE(prototype, prototype_modevent, NULL); 142179237SjbMODULE_VERSION(prototype, 1); 143179237SjbMODULE_DEPEND(prototype, dtrace, 1, 1, 1); 144179237SjbMODULE_DEPEND(prototype, opensolaris, 1, 1, 1); 145