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