xref: /illumos-gate/usr/src/uts/common/sys/mdesc.h (revision 350b21149ccca29970f4e8cd25afd3aa6b238887)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_MDESC_H_
28 #define	_MDESC_H_
29 
30 #include <sys/types.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 
37 /*
38  * Each logical domain is detailed via a (Virtual) Machine Description
39  * available to each guest Operating System courtesy of a
40  * Hypervisor service.
41  */
42 
43 
44 
45 #ifdef	_ASM
46 #define	U8(_s)	_s
47 #define	U16(_s)	_s
48 #define	U32(_s)	_s
49 #define	U64(_s)	_s
50 #else
51 #define	U8(_s)	((uint8_t)(_s))
52 #define	U16(_s)	((uint16_t)(_s))
53 #define	U32(_s)	((uint32_t)(_s))
54 #define	U64(_s)	((uint64_t)(_s))
55 #endif
56 
57 
58 
59 
60 
61 	/* the version this library understands */
62 
63 #define	MD_HEADER_VERS_OFF	0x0
64 #define	MD_HEADER_NODE_OFF	0x4
65 #define	MD_HEADER_NAME_OFF	0x8
66 #define	MD_HEADER_DATA_OFF	0xc
67 
68 #define	MD_HEADER_SIZE	0x10
69 
70 #define	MD_TRANSPORT_VERSION	U32(0x10000)
71 
72 #define	MD_ELEMENT_SIZE	0x10
73 
74 #define	MDE_ILLEGAL_IDX		U64(-1)
75 
76 #define	MDET_LIST_END	U8(0x0)
77 #define	MDET_NULL	U8(' ')
78 #define	MDET_NODE	U8('N')
79 #define	MDET_NODE_END	U8('E')
80 #define	MDET_PROP_ARC	U8('a')
81 #define	MDET_PROP_VAL	U8('v')
82 #define	MDET_PROP_STR	U8('s')
83 #define	MDET_PROP_DAT	U8('d')
84 
85 
86 #ifndef _ASM	/* { */
87 
88 /*
89  * Opaque handles for use in external interfaces
90  */
91 
92 typedef void			*md_t;
93 
94 typedef uint64_t		mde_cookie_t;
95 #define	MDE_INVAL_ELEM_COOKIE	((mde_cookie_t)-1)
96 
97 typedef	uint32_t		mde_str_cookie_t;
98 #define	MDE_INVAL_STR_COOKIE	((mde_str_cookie_t)-1)
99 
100 typedef uint64_t		md_diff_cookie_t;
101 #define	MD_INVAL_DIFF_COOKIE	((md_diff_cookie_t)-1)
102 
103 #define	MDESC_INVAL_GEN		(0)
104 
105 /*
106  * External structure for MD diff interface
107  */
108 typedef struct {
109 	uint8_t		type;		/* property type */
110 	char		*namep;		/* property name */
111 } md_prop_match_t;
112 
113 
114 /*
115  * Walk callback function return codes
116  */
117 #define	MDE_WALK_ERROR	-1	/* Terminate walk with error */
118 #define	MDE_WALK_NEXT	0	/* Continue to next node */
119 #define	MDE_WALK_DONE	1	/* Terminate walk with success */
120 
121 /*
122  * The function prototype for a walker callback function.
123  * The machine description session, parent node, current node,
124  * and private data are given to the callback.
125  *
126  * The parent node is given to the callback to provide context
127  * on how the walker arrived at this location.  While the node
128  * may have many parents, it will be visited only once, this
129  * provides context on how the walker arrived at the node.
130  *
131  * Input		Description
132  * -------------------	----------------------------------------
133  * md_t *		Pointer to md session
134  * mde_cookie_t		Index of parent node to provide context
135  * mde_cookie_t		The current node in the walk
136  * void *		Private data for the walking function
137  */
138 typedef int md_walk_fn_t(md_t *, mde_cookie_t, mde_cookie_t, void *);
139 
140 
141 /*
142  * External Interface
143  */
144 
145 extern md_t		*md_init_intern(uint64_t *,
146 				void *(*allocp)(size_t),
147 				void (*freep)(void *, size_t));
148 
149 extern int		md_fini(md_t *);
150 
151 extern int		md_node_count(md_t *);
152 
153 extern mde_str_cookie_t md_find_name(md_t *, char *namep);
154 
155 extern mde_cookie_t	md_root_node(md_t *);
156 
157 extern uint64_t		md_get_gen(md_t *);
158 
159 extern size_t		md_get_bin_size(md_t *);
160 
161 extern int		md_scan_dag(md_t *,
162 				mde_cookie_t,
163 				mde_str_cookie_t,
164 				mde_str_cookie_t,
165 				mde_cookie_t *);
166 
167 extern int		md_walk_dag(md_t *,
168 				mde_cookie_t,
169 				mde_str_cookie_t,
170 				mde_str_cookie_t,
171 				md_walk_fn_t,
172 				void *);
173 
174 extern int		md_get_prop_val(md_t *,
175 				mde_cookie_t,
176 				char *,
177 				uint64_t *);
178 
179 extern int		md_get_prop_str(md_t *,
180 				mde_cookie_t,
181 				char *,
182 				char **);
183 
184 extern int		md_get_prop_data(md_t *,
185 				mde_cookie_t,
186 				char *,
187 				uint8_t **,
188 				int *);
189 
190 extern int		md_get_prop_arcs(md_t *,
191 				mde_cookie_t,
192 				char *,
193 				mde_cookie_t *,
194 				size_t);
195 
196 
197 extern md_diff_cookie_t	md_diff_init(md_t *,
198 				mde_cookie_t,
199 				md_t *,
200 				mde_cookie_t,
201 				char *,
202 				md_prop_match_t *);
203 
204 extern int		md_diff_added(md_diff_cookie_t,
205 				mde_cookie_t **);
206 
207 extern int		md_diff_removed(md_diff_cookie_t,
208 				mde_cookie_t **);
209 
210 extern int		md_diff_matched(md_diff_cookie_t,
211 				mde_cookie_t **,
212 				mde_cookie_t **);
213 
214 extern int		md_diff_fini(md_diff_cookie_t);
215 
216 
217 #endif	/* } _ASM */
218 
219 
220 
221 /*
222  * ioctl info for mdesc device
223  */
224 
225 #define	MDESCIOC	('m' << 24 | 'd' << 16 | 'd' << 8)
226 
227 #define	MDESCIOCGSZ	(MDESCIOC | 1)   /* Get quote buffer size */
228 #define	MDESCIOCSSZ	(MDESCIOC | 2)   /* Set new quote buffer size */
229 #define	MDESCIOCDISCARD	(MDESCIOC | 3)   /* Discard quotes and reset */
230 
231 #ifdef __cplusplus
232 }
233 #endif
234 
235 #endif	/* _MDESC_H_ */
236