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 33typedef struct ctf_preamble { 34 __uint16_t ctp_magic; 35 __uint8_t ctp_version; 36 __uint8_t ctp_flags; 37} ctf_preamble_t; 38 39typedef 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 56typedef struct ctf_lblent { 57 __uint32_t ctl_label; 58 __uint32_t ctl_typeidx; 59} ctf_lblent_t; 60 61struct 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 70struct 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 79struct 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 90struct 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 104struct ctf_array_v2 { 105 __uint16_t cta_contents; 106 __uint16_t cta_index; 107 __uint32_t cta_nelems; 108}; 109 110struct ctf_array_v3 { 111 __uint32_t cta_contents; 112 __uint32_t cta_index; 113 __uint32_t cta_nelems; 114}; 115 116struct ctf_member_v2 { 117 __uint32_t ctm_name; 118 __uint16_t ctm_type; 119 __uint16_t ctm_offset; 120}; 121 122struct ctf_member_v3 { 123 __uint32_t ctm_name; 124 __uint32_t ctm_type; 125 __uint32_t ctm_offset; 126}; 127 128struct 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 136struct 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 146typedef 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 */ 281typedef struct ctf_array_v2 ctf_array_t; 282typedef struct ctf_member_v2 ctf_member_t; 283typedef struct ctf_lmember_v2 ctf_lmember_t; 284typedef struct ctf_type_v2 ctf_type_t; 285typedef 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