xref: /freebsd-src/sys/cddl/dev/prototype.c (revision cbfe997563d24cdbfe77d1763f2582fbace3ee2f)
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