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