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 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/types.h> 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 39 /* 40 * Each logical domain is detailed via a (Virtual) Machine Description 41 * available to each guest Operating System courtesy of a 42 * Hypervisor service. 43 */ 44 45 46 47 #ifdef _ASM 48 #define U8(_s) _s 49 #define U16(_s) _s 50 #define U32(_s) _s 51 #define U64(_s) _s 52 #else 53 #define U8(_s) ((uint8_t)(_s)) 54 #define U16(_s) ((uint16_t)(_s)) 55 #define U32(_s) ((uint32_t)(_s)) 56 #define U64(_s) ((uint64_t)(_s)) 57 #endif 58 59 60 61 62 63 /* the version this library understands */ 64 65 #define MD_HEADER_VERS_OFF 0x0 66 #define MD_HEADER_NODE_OFF 0x4 67 #define MD_HEADER_NAME_OFF 0x8 68 #define MD_HEADER_DATA_OFF 0xc 69 70 #define MD_HEADER_SIZE 0x10 71 72 #define MD_TRANSPORT_VERSION U32(0x10000) 73 74 #define MD_ELEMENT_SIZE 0x10 75 76 #define MDE_ILLEGAL_IDX U64(-1) 77 78 #define MDET_LIST_END U8(0x0) 79 #define MDET_NULL U8(' ') 80 #define MDET_NODE U8('N') 81 #define MDET_NODE_END U8('E') 82 #define MDET_PROP_ARC U8('a') 83 #define MDET_PROP_VAL U8('v') 84 #define MDET_PROP_STR U8('s') 85 #define MDET_PROP_DAT U8('d') 86 87 88 #ifndef _ASM /* { */ 89 90 /* 91 * Opaque handles for use in external interfaces 92 */ 93 94 typedef void *md_t; 95 96 typedef uint64_t mde_cookie_t; 97 #define MDE_INVAL_ELEM_COOKIE ((mde_cookie_t)-1) 98 99 typedef uint32_t mde_str_cookie_t; 100 #define MDE_INVAL_STR_COOKIE ((mde_str_cookie_t)-1) 101 102 typedef uint64_t md_diff_cookie_t; 103 #define MD_INVAL_DIFF_COOKIE ((md_diff_cookie_t)-1) 104 105 #define MDESC_INVAL_GEN (0) 106 107 /* 108 * External structure for MD diff interface 109 */ 110 typedef struct { 111 uint8_t type; /* property type */ 112 char *namep; /* property name */ 113 } md_prop_match_t; 114 115 116 /* 117 * Walk callback function return codes 118 */ 119 #define MDE_WALK_ERROR -1 /* Terminate walk with error */ 120 #define MDE_WALK_NEXT 0 /* Continue to next node */ 121 #define MDE_WALK_DONE 1 /* Terminate walk with success */ 122 123 /* 124 * The function prototype for a walker callback function. 125 * The machine description session, parent node, current node, 126 * and private data are given to the callback. 127 * 128 * The parent node is given to the callback to provide context 129 * on how the walker arrived at this location. While the node 130 * may have many parents, it will be visited only once, this 131 * provides context on how the walker arrived at the node. 132 * 133 * Input Description 134 * ------------------- ---------------------------------------- 135 * md_t * Pointer to md session 136 * mde_cookie_t Index of parent node to provide context 137 * mde_cookie_t The current node in the walk 138 * void * Private data for the walking function 139 */ 140 typedef int md_walk_fn_t(md_t *, mde_cookie_t, mde_cookie_t, void *); 141 142 143 /* 144 * External Interface 145 */ 146 147 extern md_t *md_init_intern(uint64_t *, 148 void *(*allocp)(size_t), 149 void (*freep)(void *, size_t)); 150 151 extern int md_fini(md_t *); 152 153 extern int md_node_count(md_t *); 154 155 extern mde_str_cookie_t md_find_name(md_t *, char *namep); 156 157 extern mde_cookie_t md_root_node(md_t *); 158 159 extern uint64_t md_get_gen(md_t *); 160 161 extern size_t md_get_bin_size(md_t *); 162 163 extern int md_scan_dag(md_t *, 164 mde_cookie_t, 165 mde_str_cookie_t, 166 mde_str_cookie_t, 167 mde_cookie_t *); 168 169 extern int md_walk_dag(md_t *, 170 mde_cookie_t, 171 mde_str_cookie_t, 172 mde_str_cookie_t, 173 md_walk_fn_t, 174 void *); 175 176 extern int md_get_prop_val(md_t *, 177 mde_cookie_t, 178 char *, 179 uint64_t *); 180 181 extern int md_get_prop_str(md_t *, 182 mde_cookie_t, 183 char *, 184 char **); 185 186 extern int md_get_prop_data(md_t *, 187 mde_cookie_t, 188 char *, 189 uint8_t **, 190 int *); 191 192 extern int md_get_prop_arcs(md_t *, 193 mde_cookie_t, 194 char *, 195 mde_cookie_t *, 196 size_t); 197 198 199 extern md_diff_cookie_t md_diff_init(md_t *, 200 mde_cookie_t, 201 md_t *, 202 mde_cookie_t, 203 char *, 204 md_prop_match_t *); 205 206 extern int md_diff_added(md_diff_cookie_t, 207 mde_cookie_t **); 208 209 extern int md_diff_removed(md_diff_cookie_t, 210 mde_cookie_t **); 211 212 extern int md_diff_matched(md_diff_cookie_t, 213 mde_cookie_t **, 214 mde_cookie_t **); 215 216 extern int md_diff_fini(md_diff_cookie_t); 217 218 219 #endif /* } _ASM */ 220 221 222 223 /* 224 * ioctl info for mdesc device 225 */ 226 227 #define MDESCIOC ('m' << 24 | 'd' << 16 | 'd' << 8) 228 229 #define MDESCIOCGSZ (MDESCIOC | 1) /* Get quote buffer size */ 230 #define MDESCIOCSSZ (MDESCIOC | 2) /* Set new quote buffer size */ 231 #define MDESCIOCDISCARD (MDESCIOC | 3) /* Discard quotes and reset */ 232 233 #ifdef __cplusplus 234 } 235 #endif 236 237 #endif /* _MDESC_H_ */ 238