xref: /onnv-gate/usr/src/cmd/ldmad/mdesc_mutable.h (revision 11596:e9010337bcd3)
1*11596SJason.Beloro@Sun.COM /*
2*11596SJason.Beloro@Sun.COM  * CDDL HEADER START
3*11596SJason.Beloro@Sun.COM  *
4*11596SJason.Beloro@Sun.COM  * The contents of this file are subject to the terms of the
5*11596SJason.Beloro@Sun.COM  * Common Development and Distribution License (the "License").
6*11596SJason.Beloro@Sun.COM  * You may not use this file except in compliance with the License.
7*11596SJason.Beloro@Sun.COM  *
8*11596SJason.Beloro@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11596SJason.Beloro@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*11596SJason.Beloro@Sun.COM  * See the License for the specific language governing permissions
11*11596SJason.Beloro@Sun.COM  * and limitations under the License.
12*11596SJason.Beloro@Sun.COM  *
13*11596SJason.Beloro@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*11596SJason.Beloro@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11596SJason.Beloro@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*11596SJason.Beloro@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*11596SJason.Beloro@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*11596SJason.Beloro@Sun.COM  *
19*11596SJason.Beloro@Sun.COM  * CDDL HEADER END
20*11596SJason.Beloro@Sun.COM  */
21*11596SJason.Beloro@Sun.COM 
22*11596SJason.Beloro@Sun.COM /*
23*11596SJason.Beloro@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24*11596SJason.Beloro@Sun.COM  * Use is subject to license terms.
25*11596SJason.Beloro@Sun.COM  */
26*11596SJason.Beloro@Sun.COM 
27*11596SJason.Beloro@Sun.COM #ifndef	_MDESC_MUTABLE_H_
28*11596SJason.Beloro@Sun.COM #define	_MDESC_MUTABLE_H_
29*11596SJason.Beloro@Sun.COM 
30*11596SJason.Beloro@Sun.COM #ifdef DEBUG
31*11596SJason.Beloro@Sun.COM #include <assert.h>
32*11596SJason.Beloro@Sun.COM #endif
33*11596SJason.Beloro@Sun.COM 
34*11596SJason.Beloro@Sun.COM #ifdef __cplusplus
35*11596SJason.Beloro@Sun.COM extern "C" {
36*11596SJason.Beloro@Sun.COM #endif
37*11596SJason.Beloro@Sun.COM 
38*11596SJason.Beloro@Sun.COM #ifdef DEBUG
39*11596SJason.Beloro@Sun.COM 
40*11596SJason.Beloro@Sun.COM #define	ASSERT(_s)	assert(_s)
41*11596SJason.Beloro@Sun.COM 
42*11596SJason.Beloro@Sun.COM #else	/* DEBUG */
43*11596SJason.Beloro@Sun.COM 
44*11596SJason.Beloro@Sun.COM #define	ASSERT(_s)
45*11596SJason.Beloro@Sun.COM 
46*11596SJason.Beloro@Sun.COM #endif	/* DEBUG */
47*11596SJason.Beloro@Sun.COM 
48*11596SJason.Beloro@Sun.COM #define	MD_ALIGNMENT_SIZE	0x10
49*11596SJason.Beloro@Sun.COM #define	MD_OFFSET_UNDEF		(uint32_t)-1
50*11596SJason.Beloro@Sun.COM /*
51*11596SJason.Beloro@Sun.COM  * List management macros for mutable MD structure
52*11596SJason.Beloro@Sun.COM  */
53*11596SJason.Beloro@Sun.COM #define	CHAIN(_type, _chain)						\
54*11596SJason.Beloro@Sun.COM 	struct {							\
55*11596SJason.Beloro@Sun.COM 		_type	*startp;					\
56*11596SJason.Beloro@Sun.COM 		_type	*endp;						\
57*11596SJason.Beloro@Sun.COM 		int	count;						\
58*11596SJason.Beloro@Sun.COM 	} _chain
59*11596SJason.Beloro@Sun.COM 
60*11596SJason.Beloro@Sun.COM #define	CHAIN_ITER(_chain, _itv)					\
61*11596SJason.Beloro@Sun.COM 	for ((_itv) = CHAIN_START(_chain); (_itv) != NULL;		\
62*11596SJason.Beloro@Sun.COM 		(_itv) = (_itv)->nextp)
63*11596SJason.Beloro@Sun.COM 
64*11596SJason.Beloro@Sun.COM #define	CHAIN_START(_name)	((_name).startp)
65*11596SJason.Beloro@Sun.COM #define	CHAIN_LENGTH(_name)	((_name).count)
66*11596SJason.Beloro@Sun.COM 
67*11596SJason.Beloro@Sun.COM /*
68*11596SJason.Beloro@Sun.COM  * Add node _nodep to the end of _chain via the required 'nextp' element.
69*11596SJason.Beloro@Sun.COM  */
70*11596SJason.Beloro@Sun.COM #define	CHAIN_ADD(_chain, _nodep)					\
71*11596SJason.Beloro@Sun.COM 	do {								\
72*11596SJason.Beloro@Sun.COM 		if ((_chain).startp == NULL) {				\
73*11596SJason.Beloro@Sun.COM 			(_chain).startp = (_nodep);			\
74*11596SJason.Beloro@Sun.COM 		} else {						\
75*11596SJason.Beloro@Sun.COM 			(_chain).endp->nextp = (_nodep);		\
76*11596SJason.Beloro@Sun.COM 		}							\
77*11596SJason.Beloro@Sun.COM 		(_chain).endp = (_nodep);				\
78*11596SJason.Beloro@Sun.COM 		(_nodep)->nextp = NULL;					\
79*11596SJason.Beloro@Sun.COM 		(_chain).count++;					\
80*11596SJason.Beloro@Sun.COM 	NOTE(CONSTCOND) } while (0)
81*11596SJason.Beloro@Sun.COM 
82*11596SJason.Beloro@Sun.COM /*
83*11596SJason.Beloro@Sun.COM  * Internal definitions.
84*11596SJason.Beloro@Sun.COM  */
85*11596SJason.Beloro@Sun.COM 
86*11596SJason.Beloro@Sun.COM typedef struct md_string md_string_t;
87*11596SJason.Beloro@Sun.COM typedef struct md_data_block md_data_block_t;
88*11596SJason.Beloro@Sun.COM typedef struct md_prop md_prop_t;
89*11596SJason.Beloro@Sun.COM typedef struct md_node md_node_t;
90*11596SJason.Beloro@Sun.COM typedef struct mmd mmd_t;
91*11596SJason.Beloro@Sun.COM 
92*11596SJason.Beloro@Sun.COM struct md_string {
93*11596SJason.Beloro@Sun.COM 	md_string_t	*nextp;
94*11596SJason.Beloro@Sun.COM 	char		*strp;
95*11596SJason.Beloro@Sun.COM 	int		size;	/* strlen()+1 */
96*11596SJason.Beloro@Sun.COM 	uint32_t	hash;
97*11596SJason.Beloro@Sun.COM 	int		ref_cnt;
98*11596SJason.Beloro@Sun.COM 	uint32_t	build_offset;
99*11596SJason.Beloro@Sun.COM };
100*11596SJason.Beloro@Sun.COM 
101*11596SJason.Beloro@Sun.COM struct md_data_block {
102*11596SJason.Beloro@Sun.COM 	md_data_block_t *nextp;
103*11596SJason.Beloro@Sun.COM 	uint8_t		*datap;
104*11596SJason.Beloro@Sun.COM 	uint32_t	size;
105*11596SJason.Beloro@Sun.COM 	uint32_t	hash;
106*11596SJason.Beloro@Sun.COM 	int		ref_cnt;
107*11596SJason.Beloro@Sun.COM 	uint32_t	build_offset;
108*11596SJason.Beloro@Sun.COM };
109*11596SJason.Beloro@Sun.COM 
110*11596SJason.Beloro@Sun.COM struct md_prop {
111*11596SJason.Beloro@Sun.COM 	uint8_t		type;
112*11596SJason.Beloro@Sun.COM 	md_string_t	*sp;
113*11596SJason.Beloro@Sun.COM 	union {
114*11596SJason.Beloro@Sun.COM 		uint64_t	value;
115*11596SJason.Beloro@Sun.COM 		struct {
116*11596SJason.Beloro@Sun.COM 			boolean_t	is_ptr;
117*11596SJason.Beloro@Sun.COM 			union {
118*11596SJason.Beloro@Sun.COM 				uint64_t	index;
119*11596SJason.Beloro@Sun.COM 				md_node_t	*nodep;
120*11596SJason.Beloro@Sun.COM 			} val;
121*11596SJason.Beloro@Sun.COM 		} arc;
122*11596SJason.Beloro@Sun.COM 		md_data_block_t *dbp;
123*11596SJason.Beloro@Sun.COM 	} d;
124*11596SJason.Beloro@Sun.COM 	md_prop_t	*nextp;
125*11596SJason.Beloro@Sun.COM };
126*11596SJason.Beloro@Sun.COM 
127*11596SJason.Beloro@Sun.COM struct md_node {
128*11596SJason.Beloro@Sun.COM 	md_string_t	*typep;
129*11596SJason.Beloro@Sun.COM 	CHAIN(md_prop_t, prop_list);
130*11596SJason.Beloro@Sun.COM 	md_node_t	*nextp;
131*11596SJason.Beloro@Sun.COM 	int		build_index;	/* for building a binary md & cloning */
132*11596SJason.Beloro@Sun.COM 	int		next_index;	/* for building a binary md */
133*11596SJason.Beloro@Sun.COM 	char		seen;		/* seen flag (md_scan_dag/md_scour) */
134*11596SJason.Beloro@Sun.COM 	char		deleted;	/* pending deletion flag */
135*11596SJason.Beloro@Sun.COM };
136*11596SJason.Beloro@Sun.COM 
137*11596SJason.Beloro@Sun.COM struct mmd {
138*11596SJason.Beloro@Sun.COM 	CHAIN(md_node_t, node_list);
139*11596SJason.Beloro@Sun.COM 	CHAIN(md_string_t, string_list);
140*11596SJason.Beloro@Sun.COM 	CHAIN(md_data_block_t, data_block_list);
141*11596SJason.Beloro@Sun.COM };
142*11596SJason.Beloro@Sun.COM 
143*11596SJason.Beloro@Sun.COM md_node_t *md_new_node(mmd_t *mdp, char *sp);
144*11596SJason.Beloro@Sun.COM int md_add_value_property(mmd_t *mdp,
145*11596SJason.Beloro@Sun.COM     md_node_t *nodep, char *sp, uint64_t value);
146*11596SJason.Beloro@Sun.COM int md_add_string_property(mmd_t *mdp, md_node_t *nodep, char *sp, char *bufp);
147*11596SJason.Beloro@Sun.COM int md_add_data_property(mmd_t *mdp, md_node_t *nodep, char *sp, int len,
148*11596SJason.Beloro@Sun.COM     uint8_t *bufp);
149*11596SJason.Beloro@Sun.COM int md_gen_bin(mmd_t *mdp, uint8_t **bufpp);
150*11596SJason.Beloro@Sun.COM md_node_t *md_link_new_node(mmd_t *mdp, char *nodenamep, md_node_t *parentnodep,
151*11596SJason.Beloro@Sun.COM     char *linktonewp, char *linkbackp);
152*11596SJason.Beloro@Sun.COM mmd_t *md_new_md(void);
153*11596SJason.Beloro@Sun.COM void md_free_node(mmd_t *mdp, md_node_t *nodep);
154*11596SJason.Beloro@Sun.COM void md_destroy(mmd_t *);
155*11596SJason.Beloro@Sun.COM 
156*11596SJason.Beloro@Sun.COM #ifdef __cplusplus
157*11596SJason.Beloro@Sun.COM }
158*11596SJason.Beloro@Sun.COM #endif
159*11596SJason.Beloro@Sun.COM 
160*11596SJason.Beloro@Sun.COM #endif	/* _MDESC_MUTABLE_H_ */
161