]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/sun4v/include/cddl/mdesc_impl.h
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / sun4v / include / cddl / mdesc_impl.h
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  * $FreeBSD$
21  */
22
23 /*
24  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
25  * Use is subject to license terms.
26  */
27
28 #ifndef _MDESC_IMPL_H_
29 #define _MDESC_IMPL_H_
30
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #define LIBMD_MAGIC     0x4d61636844657363ULL   /* MachDesc */
37
38 #ifndef _ASM
39
40         /*
41          * Internal definitions
42          */
43
44
45 /*
46  * Each MD has the following header to
47  * provide information about each section of the MD.
48  *
49  * There are 3 sections:
50  * The description list, the name table and the data block.
51  *
52  * All values are stored in network byte order.
53  *
54  * Elements in the first (description list) section are defined by their
55  * index location within the node block. An index is simply the byte offset
56  * within the block / element size (16bytes). All elements are refered to
57  * by their index, to avoid bugs related to alignment etc.
58  *
59  * The name_len field holds the storage length of an ASCII name, NOT the strlen.
60  * The header fields are written in network
61  * byte order.
62  */
63
64 struct md_header_s {
65         uint32_t        transport_version;
66         uint32_t        node_blk_sz;    /* size in bytes of the node block */
67         uint32_t        name_blk_sz;    /* size in bytes of the name block */
68         uint32_t        data_blk_sz;    /* size in bytes of the data block */
69 };
70
71 typedef struct md_header_s md_header_t;
72
73
74
75 #if defined(_BIG_ENDIAN) && !defined(lint)
76 #define mdtoh8(x)       ((uint8_t)(x))
77 #define mdtoh16(x)      ((uint16_t)(x))
78 #define mdtoh32(x)      ((uint32_t)(x))
79 #define mdtoh64(x)      ((uint64_t)(x))
80 #define htomd8(x)       (x)
81 #define htomd16(x)      (x)
82 #define htomd32(x)      (x)
83 #define htomd64(x)      (x)
84 #else
85 #define mdtoh8(x)       ((uint8_t)(x))
86 extern  uint16_t        mdtoh16(uint16_t);
87 extern  uint32_t        mdtoh32(uint32_t);
88 extern  uint64_t        mdtoh64(uint64_t);
89 #define htomd8(x)       ((uint8_t)(x))
90 extern  uint16_t        htomd16(uint16_t);
91 extern  uint32_t        htomd32(uint32_t);
92 extern  uint64_t        htomd64(uint64_t);
93 #endif
94
95
96
97 struct MD_ELEMENT {
98         uint8_t         tag;
99         uint8_t         name_len;
100         uint16_t        _reserved;
101         uint32_t        name_offset;    /* mde_str_cookie_t */
102         union {
103                 struct {
104                         uint32_t        len;
105                         uint32_t        offset;
106                 } prop_data;                    /* for PROP_DATA and PROP_STR */
107                 uint64_t        prop_val;       /* for PROP_VAL */
108                 uint64_t        prop_idx;       /* for PROP_ARC and NODE */
109         } d;
110 };
111
112 typedef struct MD_ELEMENT md_element_t;
113
114 struct MACHINE_DESCRIPTION {
115         caddr_t         caddr;
116
117         void            *(*allocp)(size_t);
118         void            (*freep)(void *, size_t);
119
120         md_header_t     *headerp;
121         md_element_t    *mdep;
122         char            *namep;
123         uint8_t         *datap;
124
125         int             node_blk_size;
126         int             name_blk_size;
127         int             data_blk_size;
128
129         int             element_count;
130         int             node_count;
131
132         mde_cookie_t    root_node;
133
134         int             size;
135         uint64_t        gen;
136
137         uint64_t        md_magic;
138 };
139
140 typedef struct MACHINE_DESCRIPTION md_impl_t;
141
142 #define MDE_TAG(_p)                     mdtoh8((_p)->tag)
143 #define MDE_NAME(_p)                    mdtoh32((_p)->name_offset)
144 #define MDE_NAME_LEN(_p)                mdtoh32((_p)->name_len)
145 #define MDE_PROP_DATA_OFFSET(_p)        mdtoh32((_p)->d.prop_data.offset)
146 #define MDE_PROP_DATA_LEN(_p)           mdtoh32((_p)->d.prop_data.len)
147 #define MDE_PROP_VALUE(_p)              mdtoh64((_p)->d.prop_val)
148 #define MDE_PROP_INDEX(_p)              mdtoh64((_p)->d.prop_idx)
149
150 extern mde_str_cookie_t md_ident_name_str(char *);
151
152 extern mde_cookie_t     md_find_node_prop(md_impl_t *,
153                                 mde_cookie_t,
154                                 mde_str_cookie_t,
155                                 int);
156 #endif  /* _ASM */
157
158 #ifdef __cplusplus
159 }
160 #endif
161
162 #endif  /* _MDESC_IMPL_H_ */