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