xref: /titanic_44/usr/src/uts/common/sys/hook.h (revision 381a2a9a387f449fab7d0c7e97c4184c26963abf)
1*381a2a9aSdr146992 /*
2*381a2a9aSdr146992  * CDDL HEADER START
3*381a2a9aSdr146992  *
4*381a2a9aSdr146992  * The contents of this file are subject to the terms of the
5*381a2a9aSdr146992  * Common Development and Distribution License (the "License").
6*381a2a9aSdr146992  * You may not use this file except in compliance with the License.
7*381a2a9aSdr146992  *
8*381a2a9aSdr146992  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*381a2a9aSdr146992  * or http://www.opensolaris.org/os/licensing.
10*381a2a9aSdr146992  * See the License for the specific language governing permissions
11*381a2a9aSdr146992  * and limitations under the License.
12*381a2a9aSdr146992  *
13*381a2a9aSdr146992  * When distributing Covered Code, include this CDDL HEADER in each
14*381a2a9aSdr146992  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*381a2a9aSdr146992  * If applicable, add the following below this CDDL HEADER, with the
16*381a2a9aSdr146992  * fields enclosed by brackets "[]" replaced with your own identifying
17*381a2a9aSdr146992  * information: Portions Copyright [yyyy] [name of copyright owner]
18*381a2a9aSdr146992  *
19*381a2a9aSdr146992  * CDDL HEADER END
20*381a2a9aSdr146992  */
21*381a2a9aSdr146992 /*
22*381a2a9aSdr146992  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23*381a2a9aSdr146992  * Use is subject to license terms.
24*381a2a9aSdr146992  */
25*381a2a9aSdr146992 
26*381a2a9aSdr146992 /*
27*381a2a9aSdr146992  * This file includes definitions of kernel hook framework components
28*381a2a9aSdr146992  */
29*381a2a9aSdr146992 
30*381a2a9aSdr146992 #ifndef _SYS_HOOK_H
31*381a2a9aSdr146992 #define	_SYS_HOOK_H
32*381a2a9aSdr146992 
33*381a2a9aSdr146992 #pragma ident	"%Z%%M%	%I%	%E% SMI"
34*381a2a9aSdr146992 
35*381a2a9aSdr146992 #include <sys/queue.h>
36*381a2a9aSdr146992 
37*381a2a9aSdr146992 #ifdef	__cplusplus
38*381a2a9aSdr146992 extern "C" {
39*381a2a9aSdr146992 #endif
40*381a2a9aSdr146992 
41*381a2a9aSdr146992 /*
42*381a2a9aSdr146992  * Definition exposed to hook provider and consumer
43*381a2a9aSdr146992  */
44*381a2a9aSdr146992 
45*381a2a9aSdr146992 #define	HOOK_VERSION	1
46*381a2a9aSdr146992 
47*381a2a9aSdr146992 typedef uintptr_t hook_data_t;
48*381a2a9aSdr146992 
49*381a2a9aSdr146992 struct hook_event_int;
50*381a2a9aSdr146992 typedef struct hook_event_int *hook_event_token_t;
51*381a2a9aSdr146992 
52*381a2a9aSdr146992 typedef int (* hook_func_t)(hook_event_token_t, hook_data_t);
53*381a2a9aSdr146992 
54*381a2a9aSdr146992 /*
55*381a2a9aSdr146992  * Hook
56*381a2a9aSdr146992  */
57*381a2a9aSdr146992 typedef struct hook {
58*381a2a9aSdr146992 	int32_t		h_version;	/* version number */
59*381a2a9aSdr146992 	hook_func_t	h_func;		/* callback func */
60*381a2a9aSdr146992 	char		*h_name;	/* name of this hook */
61*381a2a9aSdr146992 	int		h_flags;	/* extra hook properties */
62*381a2a9aSdr146992 } hook_t;
63*381a2a9aSdr146992 
64*381a2a9aSdr146992 #define	HOOK_INIT(x, fn, r)			\
65*381a2a9aSdr146992 	do {					\
66*381a2a9aSdr146992 		(x)->h_version = HOOK_VERSION;	\
67*381a2a9aSdr146992 		(x)->h_func = (fn);		\
68*381a2a9aSdr146992 		(x)->h_name = (r);		\
69*381a2a9aSdr146992 		(x)->h_flags = 0;		\
70*381a2a9aSdr146992 		_NOTE(CONSTCOND)		\
71*381a2a9aSdr146992 	} while (0)
72*381a2a9aSdr146992 
73*381a2a9aSdr146992 /*
74*381a2a9aSdr146992  * Family
75*381a2a9aSdr146992  */
76*381a2a9aSdr146992 typedef struct hook_family {
77*381a2a9aSdr146992 	int32_t		hf_version;	/* version number */
78*381a2a9aSdr146992 	char		*hf_name;	/* family name */
79*381a2a9aSdr146992 } hook_family_t;
80*381a2a9aSdr146992 
81*381a2a9aSdr146992 #define	HOOK_FAMILY_INIT(x, y)			\
82*381a2a9aSdr146992 	do {					\
83*381a2a9aSdr146992 		(x)->hf_version = HOOK_VERSION;	\
84*381a2a9aSdr146992 		(x)->hf_name = (y);		\
85*381a2a9aSdr146992 		_NOTE(CONSTCOND)		\
86*381a2a9aSdr146992 	} while (0)
87*381a2a9aSdr146992 
88*381a2a9aSdr146992 /*
89*381a2a9aSdr146992  * Event
90*381a2a9aSdr146992  */
91*381a2a9aSdr146992 typedef struct hook_event {
92*381a2a9aSdr146992 	int32_t		he_version;	/* version number */
93*381a2a9aSdr146992 	char		*he_name;	/* name of this hook list */
94*381a2a9aSdr146992 	int		he_flags;	/* 1 = multiple entries allowed */
95*381a2a9aSdr146992 	boolean_t	he_interested;	/* true if callback exist */
96*381a2a9aSdr146992 } hook_event_t;
97*381a2a9aSdr146992 
98*381a2a9aSdr146992 #define	HOOK_RDONLY	0x1		/* Callbacks must not change data */
99*381a2a9aSdr146992 					/* Multiple callbacks are allowed */
100*381a2a9aSdr146992 
101*381a2a9aSdr146992 #define	HOOK_EVENT_INIT(x, y)			\
102*381a2a9aSdr146992 	do {					\
103*381a2a9aSdr146992 		(x)->he_version = HOOK_VERSION;	\
104*381a2a9aSdr146992 		(x)->he_name = (y);		\
105*381a2a9aSdr146992 		(x)->he_flags = 0;		\
106*381a2a9aSdr146992 		(x)->he_interested = B_FALSE;	\
107*381a2a9aSdr146992 		_NOTE(CONSTCOND)		\
108*381a2a9aSdr146992 	} while (0)
109*381a2a9aSdr146992 
110*381a2a9aSdr146992 
111*381a2a9aSdr146992 #ifdef	__cplusplus
112*381a2a9aSdr146992 }
113*381a2a9aSdr146992 #endif
114*381a2a9aSdr146992 
115*381a2a9aSdr146992 #endif /* _SYS_HOOK_H */
116