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