1 /* $OpenBSD: ctf.h,v 1.5 2017/08/13 14:56:05 nayden Exp $ */ 2 3 /*- 4 * SPDX-License-Identifier: ISC 5 * 6 * Copyright (c) 2016 Martin Pieuchot <mpi@openbsd.org> 7 * Copyright (c) 2022 The FreeBSD Foundation 8 * 9 * Permission to use, copy, modify, and distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 */ 21 22 #ifndef _SYS_CTF_H_ 23 #define _SYS_CTF_H_ 24 25 #include <sys/_types.h> 26 27 /* 28 * CTF ``Compact ANSI-C Type Format'' ABI header file. 29 * 30 * See the ctf(5) manual page for a detailed description of the format. 31 */ 32 33 typedef struct ctf_preamble { 34 __uint16_t ctp_magic; 35 __uint8_t ctp_version; 36 __uint8_t ctp_flags; 37 } ctf_preamble_t; 38 39 typedef struct ctf_header { 40 struct ctf_preamble cth_preamble; 41 #define cth_magic cth_preamble.ctp_magic 42 #define cth_version cth_preamble.ctp_version 43 #define cth_flags cth_preamble.ctp_flags 44 __uint32_t cth_parlabel; 45 __uint32_t cth_parname; 46 __uint32_t cth_lbloff; 47 __uint32_t cth_objtoff; 48 __uint32_t cth_funcoff; 49 __uint32_t cth_typeoff; 50 __uint32_t cth_stroff; 51 __uint32_t cth_strlen; 52 } ctf_header_t; 53 54 #define CTF_F_COMPRESS (1 << 0) /* zlib compression */ 55 56 typedef struct ctf_lblent { 57 __uint32_t ctl_label; 58 __uint32_t ctl_typeidx; 59 } ctf_lblent_t; 60 61 struct ctf_stype_v2 { 62 __uint32_t ctt_name; 63 __uint16_t ctt_info; 64 union { 65 __uint16_t _size; 66 __uint16_t _type; 67 } _u; 68 }; 69 70 struct ctf_stype_v3 { 71 __uint32_t ctt_name; 72 __uint32_t ctt_info; 73 union { 74 __uint32_t _size; 75 __uint32_t _type; 76 } _u; 77 }; 78 79 struct ctf_type_v2 { 80 __uint32_t ctt_name; 81 __uint16_t ctt_info; 82 union { 83 __uint16_t _size; 84 __uint16_t _type; 85 } _u; 86 __uint32_t ctt_lsizehi; 87 __uint32_t ctt_lsizelo; 88 }; 89 90 struct ctf_type_v3 { 91 __uint32_t ctt_name; 92 __uint32_t ctt_info; 93 union { 94 __uint32_t _size; 95 __uint32_t _type; 96 } _u; 97 __uint32_t ctt_lsizehi; 98 __uint32_t ctt_lsizelo; 99 }; 100 101 #define ctt_size _u._size 102 #define ctt_type _u._type 103 104 struct ctf_array_v2 { 105 __uint16_t cta_contents; 106 __uint16_t cta_index; 107 __uint32_t cta_nelems; 108 }; 109 110 struct ctf_array_v3 { 111 __uint32_t cta_contents; 112 __uint32_t cta_index; 113 __uint32_t cta_nelems; 114 }; 115 116 struct ctf_member_v2 { 117 __uint32_t ctm_name; 118 __uint16_t ctm_type; 119 __uint16_t ctm_offset; 120 }; 121 122 struct ctf_member_v3 { 123 __uint32_t ctm_name; 124 __uint32_t ctm_type; 125 __uint32_t ctm_offset; 126 }; 127 128 struct ctf_lmember_v2 { 129 __uint32_t ctlm_name; 130 __uint16_t ctlm_type; 131 __uint16_t ctlm_pad; 132 __uint32_t ctlm_offsethi; 133 __uint32_t ctlm_offsetlo; 134 }; 135 136 struct ctf_lmember_v3 { 137 __uint32_t ctlm_name; 138 __uint32_t ctlm_type; 139 __uint32_t ctlm_offsethi; 140 __uint32_t ctlm_offsetlo; 141 }; 142 143 #define CTF_V2_LSTRUCT_THRESH (1 << 13) 144 #define CTF_V3_LSTRUCT_THRESH (1 << 29) 145 146 typedef struct ctf_enum { 147 __uint32_t cte_name; 148 __int32_t cte_value; 149 } ctf_enum_t; 150 151 #define CTF_MAGIC 0xcff1 152 #define CTF_VERSION CTF_VERSION_3 153 #define CTF_VERSION_3 3 154 #define CTF_VERSION_2 2 155 #define CTF_VERSION_1 1 156 157 #define CTF_MAX_NAME 0x7fffffff 158 159 #define CTF_V2_MAX_VLEN 0x03ff 160 #define CTF_V2_MAX_SIZE 0xfffe 161 #define CTF_V2_LSIZE_SENT (CTF_V2_MAX_SIZE + 1) /* sentinel for cts vs ctt */ 162 163 #define CTF_V3_MAX_VLEN 0x00ffffff 164 #define CTF_V3_MAX_SIZE 0xfffffffeu 165 #define CTF_V3_LSIZE_SENT (CTF_V3_MAX_SIZE + 1) 166 167 #define CTF_V2_PARENT_SHIFT 15 168 #define CTF_V2_MAX_TYPE 0xffff 169 #define CTF_V2_TYPE_ISPARENT(id) ((id) < 0x8000) 170 #define CTF_V2_TYPE_ISCHILD(id) ((id) > 0x7fff) 171 #define CTF_V2_TYPE_TO_INDEX(type) ((type) & 0x7fff) 172 #define CTF_V2_INDEX_TO_TYPE(type, ischild) \ 173 (((type) & 0x7fff) | ((ischild) != 0 ? 0x8000 : 0)) 174 #define CTF_V2_TYPE_INFO(kind, isroot, vlen) \ 175 (((kind) << 11) | ((isroot) != 0 ? (1 << 10) : 0) | \ 176 ((vlen) & CTF_V2_MAX_VLEN)) 177 178 #define CTF_V3_PARENT_SHIFT 31 179 #define CTF_V3_MAX_TYPE 0xfffffffeu 180 #define CTF_V3_TYPE_ISPARENT(id) ((__uint32_t)(id) < 0x80000000u) 181 #define CTF_V3_TYPE_ISCHILD(id) ((__uint32_t)(id) > 0x7fffffffu) 182 #define CTF_V3_TYPE_TO_INDEX(type) ((type) & 0x7fffffffu) 183 #define CTF_V3_INDEX_TO_TYPE(type, ischild) \ 184 (((type) & 0x7fffffffu) | ((ischild) != 0 ? 0x80000000u : 0)) 185 #define CTF_V3_TYPE_INFO(kind, isroot, vlen) \ 186 (((kind) << 26) | ((isroot) != 0 ? (1 << 25) : 0) | \ 187 ((vlen) & CTF_V3_MAX_VLEN)) 188 189 #define CTF_STRTAB_0 0 190 #define CTF_STRTAB_1 1 191 192 #define CTF_TYPE_NAME(t, o) (((t) << 31) | ((o) & ((1u << 31) - 1))) 193 194 /* 195 * Info macro. 196 */ 197 #define CTF_V2_INFO_VLEN(i) ((i) & CTF_V2_MAX_VLEN) 198 #define CTF_V2_INFO_ISROOT(i) (((i) & 0x0400) >> 10) 199 #define CTF_V2_INFO_KIND(i) (((i) & 0xf800) >> 11) 200 201 #define CTF_V3_INFO_VLEN(i) ((i) & CTF_V3_MAX_VLEN) 202 #define CTF_V3_INFO_ISROOT(i) (((i) & 0x02000000) >> 25) 203 #define CTF_V3_INFO_KIND(i) (((i) & 0xfc000000) >> 26) 204 205 #define CTF_K_UNKNOWN 0 206 #define CTF_K_INTEGER 1 207 #define CTF_K_FLOAT 2 208 #define CTF_K_POINTER 3 209 #define CTF_K_ARRAY 4 210 #define CTF_K_FUNCTION 5 211 #define CTF_K_STRUCT 6 212 #define CTF_K_UNION 7 213 #define CTF_K_ENUM 8 214 #define CTF_K_FORWARD 9 215 #define CTF_K_TYPEDEF 10 216 #define CTF_K_VOLATILE 11 217 #define CTF_K_CONST 12 218 #define CTF_K_RESTRICT 13 219 #define CTF_K_MAX 63 220 221 /* 222 * Integer/Float Encoding macro. 223 */ 224 #define _CTF_ENCODING(e) (((e) & 0xff000000) >> 24) 225 #define _CTF_OFFSET(e) (((e) & 0x00ff0000) >> 16) 226 #define _CTF_BITS(e) (((e) & 0x0000ffff)) 227 #define _CTF_DATA(encoding, offset, bits) \ 228 (((encoding) << 24) | ((offset) << 16) | (bits)) 229 230 #define CTF_INT_ENCODING(e) _CTF_ENCODING(e) 231 #define CTF_INT_SIGNED (1 << 0) 232 #define CTF_INT_CHAR (1 << 1) 233 #define CTF_INT_BOOL (1 << 2) 234 #define CTF_INT_VARARGS (1 << 3) 235 #define CTF_INT_OFFSET(e) _CTF_OFFSET(e) 236 #define CTF_INT_BITS(e) _CTF_BITS(e) 237 #define CTF_INT_DATA(e, o, b) _CTF_DATA(e, o, b) 238 239 #define CTF_FP_ENCODING(e) _CTF_ENCODING(e) 240 #define CTF_FP_SINGLE 1 241 #define CTF_FP_DOUBLE 2 242 #define CTF_FP_CPLX 3 243 #define CTF_FP_DCPLX 4 244 #define CTF_FP_LDCPLX 5 245 #define CTF_FP_LDOUBLE 6 246 #define CTF_FP_INTRVL 7 247 #define CTF_FP_DINTRVL 8 248 #define CTF_FP_LDINTRVL 9 249 #define CTF_FP_IMAGRY 10 250 #define CTF_FP_DIMAGRY 11 251 #define CTF_FP_LDIMAGRY 12 252 #define CTF_FP_OFFSET(e) _CTF_OFFSET(e) 253 #define CTF_FP_BITS(e) _CTF_BITS(e) 254 #define CTF_FP_DATA(e, o, b) _CTF_DATA(e, o, b) 255 256 /* 257 * Name reference macro. 258 */ 259 #define CTF_NAME_STID(n) ((n) >> 31) 260 #define CTF_NAME_OFFSET(n) ((n) & CTF_MAX_NAME) 261 262 /* 263 * Type macro. 264 */ 265 #define CTF_SIZE_TO_LSIZE_HI(s) ((uint32_t)((uint64_t)(s) >> 32)) 266 #define CTF_SIZE_TO_LSIZE_LO(s) ((uint32_t)(s)) 267 #define CTF_TYPE_LSIZE(t) \ 268 (((uint64_t)(t)->ctt_lsizehi) << 32 | (t)->ctt_lsizelo) 269 270 /* 271 * Member macro. 272 */ 273 #define CTF_LMEM_OFFSET(m) \ 274 (((__uint64_t)(m)->ctlm_offsethi) << 32 | (m)->ctlm_offsetlo) 275 #define CTF_OFFSET_TO_LMEMHI(off) ((__uint32_t)((__uint64_t)(off) >> 32)) 276 #define CTF_OFFSET_TO_LMEMLO(off) ((__uint32_t)(off)) 277 278 /* 279 * Compatibility for pre-v3 code. 280 */ 281 typedef struct ctf_array_v2 ctf_array_t; 282 typedef struct ctf_member_v2 ctf_member_t; 283 typedef struct ctf_lmember_v2 ctf_lmember_t; 284 typedef struct ctf_type_v2 ctf_type_t; 285 typedef struct ctf_stype_v2 ctf_stype_t; 286 287 #define CTF_INFO_KIND CTF_V2_INFO_KIND 288 #define CTF_INFO_VLEN CTF_V2_INFO_VLEN 289 #define CTF_INFO_ISROOT CTF_V2_INFO_ISROOT 290 #define CTF_TYPE_INFO CTF_V2_TYPE_INFO 291 #define CTF_TYPE_ISPARENT CTF_V2_TYPE_ISPARENT 292 #define CTF_TYPE_ISCHILD CTF_V2_TYPE_ISCHILD 293 #define CTF_TYPE_TO_INDEX CTF_V2_TYPE_TO_INDEX 294 #define CTF_INDEX_TO_TYPE CTF_V2_INDEX_TO_TYPE 295 #define CTF_LSIZE_SENT CTF_V2_LSIZE_SENT 296 #define CTF_LSTRUCT_THRESH CTF_V2_LSTRUCT_THRESH 297 #define CTF_MAX_SIZE CTF_V2_MAX_SIZE 298 #define CTF_MAX_TYPE CTF_V2_MAX_TYPE 299 #define CTF_MAX_VLEN CTF_V2_MAX_VLEN 300 301 #endif /* _SYS_CTF_H_ */ 302