conv.h revision 4734:a4708faa3e85
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 (c) 1988 AT&T
24 *	  All Rights Reserved
25 *
26 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
27 * Use is subject to license terms.
28 */
29
30#ifndef	_CONV_H
31#define	_CONV_H
32
33#pragma ident	"%Z%%M%	%I%	%E% SMI"
34
35/*
36 * Global include file for conversion library.
37 */
38
39#include <stdlib.h>
40#include <libelf.h>
41#include <dlfcn.h>
42#include <libld.h>
43#include <sgs.h>
44#include <machdep.h>
45
46#ifdef	__cplusplus
47extern "C" {
48#endif
49
50/*
51 * Configuration features available - maintained here (instead of debug.h)
52 * to save libconv from having to include debug.h which results in numerous
53 * "declared but not used or defined" lint errors.
54 */
55#define	CONF_EDLIBPATH	0x000100	/* ELF default library path */
56#define	CONF_ESLIBPATH	0x000200	/* ELF secure library path */
57#define	CONF_ADLIBPATH	0x000400	/* AOUT default library path */
58#define	CONF_ASLIBPATH	0x000800	/* AOUT secure library path */
59#define	CONF_DIRCFG	0x001000	/* directory configuration available */
60#define	CONF_OBJALT	0x002000	/* object alternatives available */
61#define	CONF_MEMRESV	0x004000	/* memory reservation required */
62#define	CONF_ENVS	0x008000	/* environment variables available */
63#define	CONF_FLTR	0x010000	/* filter information available */
64#define	CONF_FEATMSK	0xffff00
65
66/*
67 * Buffer types:
68 *
69 * Many of the routines in this module require the user to supply a
70 * buffer into which the desired strings may be written. These are
71 * all arrays of characters, and might be defined as simple arrays
72 * of char. The problem with that approach is that when such an array
73 * is passed to a function, the C language considers it to have the
74 * type (char *), without any regard to its length. Not all of our
75 * buffers have the same length, and we want to ensure that the compiler
76 * will refuse to compile code that passes the wrong type of buffer to
77 * a given routine. The solution is to define the buffers as unions
78 * that contain the needed array, and then to pass the given union
79 * by address. The compiler will catch attempts to pass the wrong type
80 * of pointer, and the size of a structure/union is implicit in its type.
81 *
82 * A nice side effect of this approach is that we can use a union with
83 * multiple buffers to handle the cases where a given routine needs
84 * more than one type of buffer. The end result is a single buffer large
85 * enough to handle any of the subcases, but no larger.
86 */
87
88/*
89 * Size of buffer used by conv_invalid_val():
90 *
91 * Various values that can't be matched to a symbolic definition are converted
92 * to a numeric string.
93 *
94 * The buffer size reflects the maximum number of digits needed to
95 * display an integer as text, plus a trailing null, and with room for
96 * a leading "0x" if hexidecimal display is selected.
97 */
98#define	CONV32_INV_BUFSIZE	12
99typedef union {
100	char			buf[CONV32_INV_BUFSIZE];
101} Conv32_inv_buf_t;
102
103#define	CONV64_INV_BUFSIZE	22
104typedef union {
105	char			buf[CONV64_INV_BUFSIZE];
106} Conv64_inv_buf_t;
107
108
109
110/* conv_ehdr_flags() */
111#define	CONF_EHDR_FLAGS_BASE_BUFSIZE	69
112#define	CONV32_EHDR_FLAGS_BUFSIZE	\
113	(CONF_EHDR_FLAGS_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
114typedef union {
115	Conv32_inv_buf_t	inv_buf;
116	char			buf[CONV32_EHDR_FLAGS_BUFSIZE];
117} Conv32_ehdr_flags_buf_t;
118
119#define	CONV64_EHDR_FLAGS_BUFSIZE	\
120	(CONF_EHDR_FLAGS_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
121typedef union {
122	Conv64_inv_buf_t	inv_buf;
123	char			buf[CONV64_EHDR_FLAGS_BUFSIZE];
124} Conv64_ehdr_flags_buf_t;
125
126
127/* conv_reject_desc() */
128typedef union {
129	Conv32_inv_buf_t	inv_buf;
130	Conv32_ehdr_flags_buf_t	flags_buf;
131} Conv32_reject_desc_buf_t;
132
133typedef union {
134	Conv64_inv_buf_t	inv_buf;
135	Conv64_ehdr_flags_buf_t	flags_buf;
136} Conv64_reject_desc_buf_t;
137
138
139/*
140 * conv_cap_val_hw1()
141 *
142 * This size is based on the maximum number of hardware capabilities
143 * that exist.  See common/elfcap.
144 */
145#define	CONV_CAP_VAL_HW1_BUFSIZE	195
146
147typedef union {
148	Conv32_inv_buf_t	inv_buf;
149	char			buf[CONV_CAP_VAL_HW1_BUFSIZE];
150} Conv32_cap_val_hw1_buf_t;
151
152typedef union {
153	Conv64_inv_buf_t	inv_buf;
154	char			buf[CONV_CAP_VAL_HW1_BUFSIZE];
155} Conv64_cap_val_hw1_buf_t;
156
157
158/*
159 * conv_cap_val_sf1()
160 *
161 * This size is based on the maximum number of software capabilities
162 * that exist.  See common/elfcap.
163 */
164#define	CONV_CAP_VAL_SF1_BUFSIZE	45
165
166typedef union {
167	Conv32_inv_buf_t	inv_buf;
168	char			buf[CONV_CAP_VAL_SF1_BUFSIZE];
169} Conv32_cap_val_sf1_buf_t;
170
171typedef union {
172	Conv64_inv_buf_t	inv_buf;
173	char			buf[CONV_CAP_VAL_SF1_BUFSIZE];
174} Conv64_cap_val_sf1_buf_t;
175
176
177
178/* conv_cap_val_buf() */
179typedef union {
180	Conv32_inv_buf_t		inv_buf;
181	Conv32_cap_val_hw1_buf_t	cap_val_hw1_buf;
182	Conv32_cap_val_sf1_buf_t	cap_val_sf1_buf;
183} Conv32_cap_val_buf_t;
184
185typedef union {
186	Conv64_inv_buf_t		inv_buf;
187	Conv64_cap_val_hw1_buf_t	cap_val_hw1_buf;
188	Conv64_cap_val_sf1_buf_t	cap_val_sf1_buf;
189} Conv64_cap_val_buf_t;
190
191
192/* conv_config_feat() */
193#define	CONV_CONFIG_FEAT_BUFSIZE	195
194
195typedef union {
196	Conv32_inv_buf_t	inv_buf;
197	char			buf[CONV_CONFIG_FEAT_BUFSIZE];
198} Conv32_config_feat_buf_t;
199
200typedef union {
201	Conv64_inv_buf_t	inv_buf;
202	char			buf[CONV_CONFIG_FEAT_BUFSIZE];
203} Conv64_config_feat_buf_t;
204
205
206/* conv_config_obj() */
207#define	CONV_CONFIG_OBJ_BUFSIZE		154
208
209typedef union {
210	Conv32_inv_buf_t	inv_buf;
211	char			buf[CONV_CONFIG_OBJ_BUFSIZE];
212} Conv32_config_obj_buf_t;
213
214typedef union {
215	Conv64_inv_buf_t	inv_buf;
216	char			buf[CONV_CONFIG_OBJ_BUFSIZE];
217} Conv64_config_obj_buf_t;
218
219
220/* conv_dl_mode() */
221#define	CONV_DL_MODE_BUFSIZE		122
222
223typedef union {
224	Conv32_inv_buf_t	inv_buf;
225	char			buf[CONV_DL_MODE_BUFSIZE];
226} Conv32_dl_mode_buf_t;
227
228typedef union {
229	Conv64_inv_buf_t	inv_buf;
230	char			buf[CONV_DL_MODE_BUFSIZE];
231} Conv64_dl_mode_buf_t;
232
233
234/* conv_dl_flag() */
235#define	CONV_DL_FLAG_BUFSIZE		195
236
237typedef union {
238	Conv32_inv_buf_t	inv_buf;
239	char			buf[CONV_DL_FLAG_BUFSIZE];
240} Conv32_dl_flag_buf_t;
241
242typedef union {
243	Conv64_inv_buf_t	inv_buf;
244	char			buf[CONV_DL_FLAG_BUFSIZE];
245} Conv64_dl_flag_buf_t;
246
247
248/* conv_grphdl_flags() */
249#define	CONV_GRPHDL_FLAGS_BUFSIZE	80
250
251typedef union {
252	Conv32_inv_buf_t	inv_buf;
253	char			buf[CONV_GRPHDL_FLAGS_BUFSIZE];
254} Conv32_grphdl_flags_buf_t;
255
256typedef union {
257	Conv64_inv_buf_t	inv_buf;
258	char			buf[CONV_GRPHDL_FLAGS_BUFSIZE];
259} Conv64_grphdl_flags_buf_t;
260
261
262/* conv_grpdesc_flags() */
263#define	CONV_GRPDESC_FLAGS_BUFSIZE	80
264
265typedef union {
266	Conv32_inv_buf_t	inv_buf;
267	char			buf[CONV_GRPDESC_FLAGS_BUFSIZE];
268} Conv32_grpdesc_flags_buf_t;
269
270typedef union {
271	Conv64_inv_buf_t	inv_buf;
272	char			buf[CONV_GRPDESC_FLAGS_BUFSIZE];
273} Conv64_grpdesc_flags_buf_t;
274
275
276/* conv_seg_flags() */
277#define	CONV_SEG_FLAGS_BUFSIZE		186
278
279typedef union {
280	Conv32_inv_buf_t	inv_buf;
281	char			buf[CONV_SEG_FLAGS_BUFSIZE];
282} Conv32_seg_flags_buf_t;
283
284typedef union {
285	Conv64_inv_buf_t	inv_buf;
286	char			buf[CONV_SEG_FLAGS_BUFSIZE];
287} Conv64_seg_flags_buf_t;
288
289
290/* conv_dyn_posflag1() */
291#define	CONF_DYN_POSFLAG1_BASE_BUFSIZE	23
292#define	CONV32_DYN_POSFLAG1_BUFSIZE	\
293	(CONF_DYN_POSFLAG1_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
294typedef union {
295	Conv32_inv_buf_t	inv_buf;
296	char			buf[CONV32_DYN_POSFLAG1_BUFSIZE];
297} Conv32_dyn_posflag1_buf_t;
298
299#define	CONV64_DYN_POSFLAG1_BUFSIZE	\
300	(CONF_DYN_POSFLAG1_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
301typedef union {
302	Conv64_inv_buf_t	inv_buf;
303	char			buf[CONV64_DYN_POSFLAG1_BUFSIZE];
304} Conv64_dyn_posflag1_buf_t;
305
306
307/* conv_dyn_flag() */
308#define	CONF_DYN_FLAG_BASE_BUFSIZE	48
309#define	CONV32_DYN_FLAG_BUFSIZE	\
310	(CONF_DYN_FLAG_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
311typedef union {
312	Conv32_inv_buf_t	inv_buf;
313	char			buf[CONV32_DYN_FLAG_BUFSIZE];
314} Conv32_dyn_flag_buf_t;
315
316#define	CONV64_DYN_FLAG_BUFSIZE	\
317	(CONF_DYN_FLAG_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
318typedef union {
319	Conv64_inv_buf_t	inv_buf;
320	char			buf[CONV64_DYN_FLAG_BUFSIZE];
321} Conv64_dyn_flag_buf_t;
322
323
324/* conv_dyn_flag1() */
325#define	CONF_DYN_FLAG1_BASE_BUFSIZE	223
326#define	CONV32_DYN_FLAG1_BUFSIZE	\
327	(CONF_DYN_FLAG1_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
328typedef union {
329	Conv32_inv_buf_t	inv_buf;
330	char			buf[CONV32_DYN_FLAG1_BUFSIZE];
331} Conv32_dyn_flag1_buf_t;
332
333#define	CONV64_DYN_FLAG1_BUFSIZE	\
334	(CONF_DYN_FLAG1_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
335typedef union {
336	Conv64_inv_buf_t	inv_buf;
337	char			buf[CONV64_DYN_FLAG1_BUFSIZE];
338} Conv64_dyn_flag1_buf_t;
339
340
341/* conv_dyn_feature1() */
342#define	CONF_DYN_FEATURE1_BASE_BUFSIZE	20
343#define	CONV32_DYN_FEATURE1_BUFSIZE	\
344	(CONF_DYN_FEATURE1_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
345typedef union {
346	Conv32_inv_buf_t	inv_buf;
347	char			buf[CONV32_DYN_FEATURE1_BUFSIZE];
348} Conv32_dyn_feature1_buf_t;
349
350#define	CONV64_DYN_FEATURE1_BUFSIZE	\
351	(CONF_DYN_FEATURE1_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
352typedef union {
353	Conv64_inv_buf_t	inv_buf;
354	char			buf[CONV64_DYN_FEATURE1_BUFSIZE];
355} Conv64_dyn_feature1_buf_t;
356
357
358/* conv_bnd_type() */
359#define	CONF_BND_TYPE_BASE_BUFSIZE	29
360#define	CONV32_BND_TYPE_BUFSIZE	\
361	(CONF_BND_TYPE_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
362typedef union {
363	Conv32_inv_buf_t	inv_buf;
364	char			buf[CONV32_BND_TYPE_BUFSIZE];
365} Conv32_bnd_type_buf_t;
366
367#define	CONV64_BND_TYPE_BUFSIZE	\
368	(CONF_BND_TYPE_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
369typedef union {
370	Conv64_inv_buf_t	inv_buf;
371	char			buf[CONV64_BND_TYPE_BUFSIZE];
372} Conv64_bnd_type_buf_t;
373
374
375/* conv_bnd_obj() */
376#define	CONF_BND_OBJ_BASE_BUFSIZE	38
377#define	CONV32_BND_OBJ_BUFSIZE	\
378	(CONF_BND_OBJ_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
379typedef union {
380	Conv32_inv_buf_t	inv_buf;
381	char			buf[CONV32_BND_OBJ_BUFSIZE];
382} Conv32_bnd_obj_buf_t;
383
384#define	CONV64_BND_OBJ_BUFSIZE	\
385	(CONF_BND_OBJ_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
386typedef union {
387	Conv64_inv_buf_t	inv_buf;
388	char			buf[CONV64_BND_OBJ_BUFSIZE];
389} Conv64_bnd_obj_buf_t;
390
391
392/* conv_phdr_flags() */
393#define	CONF_PHDR_FLAGS_BASE_BUFSIZE	35
394#define	CONV32_PHDR_FLAGS_BUFSIZE	\
395	(CONF_PHDR_FLAGS_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
396typedef union {
397	Conv32_inv_buf_t	inv_buf;
398	char			buf[CONV32_PHDR_FLAGS_BUFSIZE];
399} Conv32_phdr_flags_buf_t;
400
401#define	CONV64_PHDR_FLAGS_BUFSIZE	\
402	(CONF_PHDR_FLAGS_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
403typedef union {
404	Conv64_inv_buf_t	inv_buf;
405	char			buf[CONV64_PHDR_FLAGS_BUFSIZE];
406} Conv64_phdr_flags_buf_t;
407
408
409/* conv_sec_flags() */
410#define	CONF_SEC_FLAGS_BASE_BUFSIZE	168
411#define	CONV32_SEC_FLAGS_BUFSIZE	\
412	(CONF_SEC_FLAGS_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
413typedef union {
414	Conv32_inv_buf_t	inv_buf;
415	char			buf[CONV32_SEC_FLAGS_BUFSIZE];
416} Conv32_sec_flags_buf_t;
417
418#define	CONV64_SEC_FLAGS_BUFSIZE	\
419	(CONF_SEC_FLAGS_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
420typedef union {
421	Conv64_inv_buf_t	inv_buf;
422	char			buf[CONV64_SEC_FLAGS_BUFSIZE];
423} Conv64_sec_flags_buf_t;
424
425
426/* conv_dwarf_ehe() */
427#define	CONV_DWARF_EHE_BUFSIZE		33
428typedef union {
429	Conv32_inv_buf_t	inv_buf;
430	char			buf[CONV_DWARF_EHE_BUFSIZE];
431} Conv32_dwarf_ehe_buf_t;
432typedef union {
433	Conv64_inv_buf_t	inv_buf;
434	char			buf[CONV_DWARF_EHE_BUFSIZE];
435} Conv64_dwarf_ehe_buf_t;
436
437
438
439/*
440 * Generic names for class specific buffer types above
441 */
442#if	defined(_ELF64)
443#define	CONV_INV_BUFSIZE		CONV64_INV_BUFSIZE
444#define	CONV_EHDR_FLAGS_BUFSIZE		CONV64_EHDR_FLAGS_BUFSIZE
445#define	CONV_DYN_POSFLAG1_BUFSIZE	CONV64_DYN_POSFLAG1_BUFSIZE
446#define	CONV_DYN_FLAG_BUFSIZE		CONV64_DYN_FLAG_BUFSIZE
447#define	CONV_DYN_FLAG1_BUFSIZE		CONV64_DYN_FLAG1_BUFSIZE
448#define	CONV_DYN_FEATURE1_BUFSIZE	CONV64_DYN_FEATURE1_BUFSIZE
449#define	CONV_BND_TYPE_BUFSIZE		CONV64_BND_TYPE_BUFSIZE
450#define	CONV_BND_OBJ_BUFSIZE		CONV64_BND_OBJ_BUFSIZE
451#define	CONV_PHDR_FLAGS_BUFSIZE		CONV64_PHDR_FLAGS_BUFSIZE
452#define	CONV_SEC_FLAGS_BUFSIZE		CONV64_SEC_FLAGS_BUFSIZE
453
454#define	Conv_inv_buf_t			Conv64_inv_buf_t
455#define	Conv_ehdr_flags_buf_t		Conv64_ehdr_flags_buf_t
456#define	Conv_reject_desc_buf_t		Conv64_reject_desc_buf_t
457#define	Conv_cap_val_hw1_buf_t		Conv64_cap_val_hw1_buf_t
458#define	Conv_cap_val_sf1_buf_t		Conv64_cap_val_sf1_buf_t
459#define	Conv_cap_val_buf_t		Conv64_cap_val_buf_t
460#define	Conv_config_feat_buf_t		Conv64_config_feat_buf_t
461#define	Conv_config_obj_buf_t		Conv64_config_obj_buf_t
462#define	Conv_dl_mode_buf_t		Conv64_dl_mode_buf_t
463#define	Conv_dl_flag_buf_t		Conv64_dl_flag_buf_t
464#define	Conv_grphdl_flags_buf_t		Conv64_grphdl_flags_buf_t
465#define	Conv_grpdesc_flags_buf_t	Conv64_grpdesc_flags_buf_t
466#define	Conv_seg_flags_buf_t		Conv64_seg_flags_buf_t
467#define	Conv_dyn_posflag1_buf_t		Conv64_dyn_posflag1_buf_t
468#define	Conv_dyn_flag_buf_t		Conv64_dyn_flag_buf_t
469#define	Conv_dyn_flag1_buf_t		Conv64_dyn_flag1_buf_t
470#define	Conv_dyn_feature1_buf_t		Conv64_dyn_feature1_buf_t
471#define	Conv_bnd_type_buf_t		Conv64_bnd_type_buf_t
472#define	Conv_bnd_obj_buf_t		Conv64_bnd_obj_buf_t
473#define	Conv_phdr_flags_buf_t		Conv64_phdr_flags_buf_t
474#define	Conv_sec_flags_buf_t		Conv64_sec_flags_buf_t
475#define	Conv_dwarf_ehe_buf_t		Conv64_dwarf_ehe_buf_t
476#else
477#define	CONV_INV_BUFSIZE		CONV32_INV_BUFSIZE
478#define	CONV_EHDR_FLAGS_BUFSIZE		CONV32_EHDR_FLAGS_BUFSIZE
479#define	CONV_DYN_POSFLAG1_BUFSIZE	CONV32_DYN_POSFLAG1_BUFSIZE
480#define	CONV_DYN_FLAG_BUFSIZE		CONV32_DYN_FLAG_BUFSIZE
481#define	CONV_DYN_FLAG1_BUFSIZE		CONV32_DYN_FLAG1_BUFSIZE
482#define	CONV_DYN_FEATURE1_BUFSIZE	CONV32_DYN_FEATURE1_BUFSIZE
483#define	CONV_BND_TYPE_BUFSIZE		CONV32_BND_TYPE_BUFSIZE
484#define	CONV_BND_OBJ_BUFSIZE		CONV32_BND_OBJ_BUFSIZE
485#define	CONV_PHDR_FLAGS_BUFSIZE		CONV32_PHDR_FLAGS_BUFSIZE
486#define	CONV_SEC_FLAGS_BUFSIZE		CONV32_SEC_FLAGS_BUFSIZE
487
488#define	Conv_inv_buf_t			Conv32_inv_buf_t
489#define	Conv_ehdr_flags_buf_t		Conv32_ehdr_flags_buf_t
490#define	Conv_reject_desc_buf_t		Conv32_reject_desc_buf_t
491#define	Conv_cap_val_hw1_buf_t		Conv32_cap_val_hw1_buf_t
492#define	Conv_cap_val_sf1_buf_t		Conv32_cap_val_sf1_buf_t
493#define	Conv_cap_val_buf_t		Conv32_cap_val_buf_t
494#define	Conv_config_feat_buf_t		Conv32_config_feat_buf_t
495#define	Conv_config_obj_buf_t		Conv32_config_obj_buf_t
496#define	Conv_dl_mode_buf_t		Conv32_dl_mode_buf_t
497#define	Conv_dl_flag_buf_t		Conv32_dl_flag_buf_t
498#define	Conv_grphdl_flags_buf_t		Conv32_grphdl_flags_buf_t
499#define	Conv_grpdesc_flags_buf_t	Conv32_grpdesc_flags_buf_t
500#define	Conv_seg_flags_buf_t		Conv32_seg_flags_buf_t
501#define	Conv_dyn_posflag1_buf_t		Conv32_dyn_posflag1_buf_t
502#define	Conv_dyn_flag_buf_t		Conv32_dyn_flag_buf_t
503#define	Conv_dyn_flag1_buf_t		Conv32_dyn_flag1_buf_t
504#define	Conv_dyn_feature1_buf_t		Conv32_dyn_feature1_buf_t
505#define	Conv_bnd_type_buf_t		Conv32_bnd_type_buf_t
506#define	Conv_bnd_obj_buf_t		Conv32_bnd_obj_buf_t
507#define	Conv_phdr_flags_buf_t		Conv32_phdr_flags_buf_t
508#define	Conv_sec_flags_buf_t		Conv32_sec_flags_buf_t
509#define	Conv_dwarf_ehe_buf_t		Conv32_dwarf_ehe_buf_t
510#endif
511
512
513
514
515/*
516 * Flags that alter standard formatting for conversion routines.
517 */
518#define	CONV_FMT_DECIMAL	0x01	/* conv_invalid_val() should print */
519					/*    integer print as decimal */
520					/*    (default is hex) */
521#define	CONV_FMT_SPACE		0x02	/* conv_invalid_val() should append */
522					/*    a space after the number.  */
523#define	CONV_FMT_ALTDUMP	0x04	/* Output strings using the versions */
524					/*    used by the dump program. */
525#define	CONV_FMT_ALTFILE	0x08	/* Output strings in the form used */
526					/*    by the file(1) command */
527#define	CONV_FMT_ALTCRLE	0x10	/* Output strings in the form used */
528					/*    by the crle(1) command */
529
530/*
531 * Mask of CONV_FMT bits that reflect a desire to use alternate strings.
532 */
533#define	CONV_FMTALTMASK	(CONV_FMT_ALTDUMP | CONV_FMT_ALTFILE)
534
535/*
536 * The expansion of bit-field data items is driven from a value descriptor and
537 * the conv_expn_field() routine.
538 */
539typedef struct {
540	Xword		v_val;		/* expansion value */
541	const char	*v_msg;		/* associated message string */
542} Val_desc;
543
544/*
545 * conv_expn_field() is willing to supply default strings for the
546 * prefix, separator, and suffix arguments, if they are passed as NULL.
547 * The caller needs to know how much room to allow for these items.
548 * These values supply those sizes.
549 */
550#define	CONV_EXPN_FIELD_DEF_PREFIX_SIZE	2	/* Default is "[ " */
551#define	CONV_EXPN_FIELD_DEF_SEP_SIZE	1	/* Default is " " */
552#define	CONV_EXPN_FIELD_DEF_SUFFIX_SIZE	2	/* Default is " ]" */
553
554/*
555 * conv_expn_field() requires a large number of inputs, many of which
556 * can be NULL to accept default behavior. An argument of the following
557 * type is used to supply them.
558 */
559typedef struct {
560	char *buf;		/* Buffer to receive generated string */
561	size_t bufsize;		/* sizeof(buf) */
562	const Val_desc *vdp;	/* Array of value descriptors, giving the */
563				/*	possible bit values, and their */
564				/*	corresponding strings. Note that the */
565				/*	final element must contain only NULL */
566				/*	values. This terminates the list. */
567	const char **lead_str;	/* NULL, or array of pointers to strings to */
568				/*	be output at the head of the list. */
569				/*	Last entry must be NULL. */
570	Xword oflags;		/* Bits for which output strings are desired */
571	Xword rflags;		/* Bits for which a numeric value should be */
572				/*	output if vdp does not provide str. */
573				/*	Must be a proper subset of oflags */
574	const char *prefix;	/* NULL, or string to prefix output with */
575				/*	If NULL, "[ " is used. */
576	const char *sep;	/* NULL, or string to separate output items */
577				/*	with. If NULL, " " is used. */
578	const char *suffix;	/* NULL, or string to suffix output with */
579				/*	If NULL, " ]" is used. */
580} CONV_EXPN_FIELD_ARG;
581
582/*
583 * Define all generic interfaces.
584 */
585extern	uchar_t		conv_check_native(char **, char **);
586extern	const char	*conv_config_feat(int, Conv_config_feat_buf_t *);
587extern	const char	*conv_config_obj(ushort_t, Conv_config_obj_buf_t *);
588extern	const char	*conv_config_upm(const char *, const char *,
589			    const char *, size_t);
590extern	const char	*conv_def_tag(Symref, Conv_inv_buf_t *);
591extern	const char	*conv_demangle_name(const char *);
592extern	const char	*conv_dl_flag(int, int, Conv_dl_flag_buf_t *);
593extern	const char	*conv_dl_mode(int, int, Conv_dl_mode_buf_t *);
594extern	const char	*conv_dwarf_ehe(uint_t, Conv_dwarf_ehe_buf_t *);
595extern	const char	*conv_elfdata_type(Elf_Type, Conv_inv_buf_t *);
596extern	const char	*conv_grphdl_flags(uint_t, Conv_grphdl_flags_buf_t *);
597extern	const char	*conv_grpdesc_flags(uint_t, Conv_grpdesc_flags_buf_t *);
598extern	Isa_desc	*conv_isalist(void);
599extern	const char	*conv_lddstub(int);
600extern	const char	*conv_seg_flags(Half, Conv_seg_flags_buf_t *);
601extern	int		conv_sys_eclass();
602extern	Uts_desc	*conv_uts(void);
603extern	const char	*conv_ver_flags(Half);
604extern	const char	*conv_ver_index(Versym, int, Conv_inv_buf_t *);
605
606
607/*
608 * Define all class specific routines.
609 */
610#if	defined(_ELF64)
611#define	conv_bnd_obj		conv64_bnd_obj
612#define	conv_bnd_type		conv64_bnd_type
613#define	conv_cap_tag		conv64_cap_tag
614#define	conv_cap_val		conv64_cap_val
615#define	conv_cap_val_hw1	conv64_cap_val_hw1
616#define	conv_cap_val_sf1	conv64_cap_val_sf1
617#define	conv_dyn_feature1	conv64_dyn_feature1
618#define	conv_dyn_flag1		conv64_dyn_flag1
619#define	conv_dyn_flag		conv64_dyn_flag
620#define	conv_dyn_posflag1	conv64_dyn_posflag1
621#define	conv_dyn_tag		conv64_dyn_tag
622#define	conv_ehdr_class		conv64_ehdr_class
623#define	conv_ehdr_data		conv64_ehdr_data
624#define	conv_ehdr_flags		conv64_ehdr_flags
625#define	conv_ehdr_mach		conv64_ehdr_mach
626#define	conv_ehdr_osabi		conv64_ehdr_osabi
627#define	conv_ehdr_type		conv64_ehdr_type
628#define	conv_ehdr_vers		conv64_ehdr_vers
629#define	conv_expn_field		conv64_expn_field
630#define	conv_invalid_val	conv64_invalid_val
631#define	conv_phdr_flags		conv64_phdr_flags
632#define	conv_phdr_type		conv64_phdr_type
633#define	conv_reject_desc	conv64_reject_desc
634#define	conv_reloc_type		conv64_reloc_type
635#define	conv_reloc_type_static	conv64_reloc_type_static
636#define	conv_reloc_386_type	conv64_reloc_386_type
637#define	conv_reloc_amd64_type	conv64_reloc_amd64_type
638#define	conv_reloc_SPARC_type	conv64_reloc_SPARC_type
639#define	conv_sec_flags		conv64_sec_flags
640#define	conv_sec_linkinfo	conv64_sec_linkinfo
641#define	conv_sec_type		conv64_sec_type
642#define	conv_sym_info_bind	conv64_sym_info_bind
643#define	conv_sym_info_type	conv64_sym_info_type
644#define	conv_sym_shndx		conv64_sym_shndx
645#define	conv_sym_other		conv64_sym_other
646#define	conv_sym_value		conv64_sym_value
647#define	conv_sym_SPARC_value	conv64_sym_SPARC_value
648#else
649#define	conv_bnd_obj		conv32_bnd_obj
650#define	conv_bnd_type		conv32_bnd_type
651#define	conv_cap_tag		conv32_cap_tag
652#define	conv_cap_val		conv32_cap_val
653#define	conv_cap_val_hw1	conv32_cap_val_hw1
654#define	conv_cap_val_sf1	conv32_cap_val_sf1
655#define	conv_dyn_feature1	conv32_dyn_feature1
656#define	conv_dyn_flag1		conv32_dyn_flag1
657#define	conv_dyn_flag		conv32_dyn_flag
658#define	conv_dyn_posflag1	conv32_dyn_posflag1
659#define	conv_dyn_tag		conv32_dyn_tag
660#define	conv_ehdr_class		conv32_ehdr_class
661#define	conv_ehdr_data		conv32_ehdr_data
662#define	conv_ehdr_flags		conv32_ehdr_flags
663#define	conv_ehdr_mach		conv32_ehdr_mach
664#define	conv_ehdr_osabi		conv32_ehdr_osabi
665#define	conv_ehdr_type		conv32_ehdr_type
666#define	conv_ehdr_vers		conv32_ehdr_vers
667#define	conv_expn_field		conv32_expn_field
668#define	conv_invalid_val	conv32_invalid_val
669#define	conv_phdr_flags		conv32_phdr_flags
670#define	conv_phdr_type		conv32_phdr_type
671#define	conv_reject_desc	conv32_reject_desc
672#define	conv_reloc_type		conv32_reloc_type
673#define	conv_reloc_type_static	conv32_reloc_type_static
674#define	conv_reloc_386_type	conv32_reloc_386_type
675#define	conv_reloc_amd64_type	conv32_reloc_amd64_type
676#define	conv_reloc_SPARC_type	conv32_reloc_SPARC_type
677#define	conv_sec_flags		conv32_sec_flags
678#define	conv_sec_linkinfo	conv32_sec_linkinfo
679#define	conv_sec_type		conv32_sec_type
680#define	conv_sym_info_bind	conv32_sym_info_bind
681#define	conv_sym_info_type	conv32_sym_info_type
682#define	conv_sym_shndx		conv32_sym_shndx
683#define	conv_sym_other		conv32_sym_other
684#define	conv_sym_value		conv32_sym_value
685#define	conv_sym_SPARC_value	conv32_sym_SPARC_value
686#endif
687
688extern	const char	*conv_bnd_obj(uint_t, Conv_bnd_obj_buf_t *);
689extern	const char	*conv_bnd_type(uint_t, Conv_bnd_type_buf_t *);
690extern	const char	*conv_cap_tag(Xword, Conv_inv_buf_t *);
691extern	const char	*conv_cap_val(Xword, Xword, Half, Conv_cap_val_buf_t *);
692extern	const char	*conv_cap_val_hw1(Xword, Half,
693			    Conv_cap_val_hw1_buf_t *);
694extern	const char	*conv_cap_val_sf1(Xword, Half,
695			    Conv_cap_val_sf1_buf_t *);
696extern	const char	*conv_dyn_flag1(Xword, Conv_dyn_flag1_buf_t *);
697extern	const char	*conv_dyn_flag(Xword, int, Conv_dyn_flag_buf_t *);
698extern	const char	*conv_dyn_posflag1(Xword, int,
699			    Conv_dyn_posflag1_buf_t *);
700extern	const char	*conv_dyn_tag(Xword, Half, int, Conv_inv_buf_t *);
701extern	const char	*conv_dyn_feature1(Xword, int,
702			    Conv_dyn_feature1_buf_t *);
703extern	const char	*conv_ehdr_class(uchar_t, int, Conv_inv_buf_t *);
704extern	const char	*conv_ehdr_data(uchar_t, int, Conv_inv_buf_t *);
705extern	const char	*conv_ehdr_flags(Half, Word, Conv_ehdr_flags_buf_t *);
706extern	const char	*conv_ehdr_mach(Half, int, Conv_inv_buf_t *);
707extern	const char	*conv_ehdr_osabi(uchar_t, int, Conv_inv_buf_t *);
708extern	const char	*conv_ehdr_type(Half, int, Conv_inv_buf_t *);
709extern	const char	*conv_ehdr_vers(Word, int, Conv_inv_buf_t *);
710extern	int		conv_expn_field(CONV_EXPN_FIELD_ARG *);
711extern	const char	*conv_invalid_val(Conv_inv_buf_t *, Xword, int);
712extern	const char	*conv_phdr_flags(Word, Conv_phdr_flags_buf_t *);
713extern	const char	*conv_phdr_type(Half, Word, int, Conv_inv_buf_t *);
714extern	const char	*conv_reject_desc(Rej_desc *, Conv_reject_desc_buf_t *);
715extern	const char	*conv_reloc_type(Half, Word, int, Conv_inv_buf_t *);
716extern	const char	*conv_reloc_type_static(Half, Word, int);
717extern	const char	*conv_reloc_386_type(Word, int, Conv_inv_buf_t *);
718extern	const char	*conv_reloc_amd64_type(Word, int, Conv_inv_buf_t *);
719extern	const char	*conv_reloc_SPARC_type(Word, int, Conv_inv_buf_t *);
720extern	const char	*conv_sec_flags(Xword, Conv_sec_flags_buf_t *);
721extern	const char	*conv_sec_linkinfo(Word, Xword, Conv_inv_buf_t *);
722extern	const char	*conv_sec_type(Half, Word, int, Conv_inv_buf_t *);
723extern	const char	*conv_sym_info_bind(uchar_t, int, Conv_inv_buf_t *);
724extern	const char	*conv_sym_info_type(Half, uchar_t, int,
725			    Conv_inv_buf_t *);
726extern	const char	*conv_sym_shndx(Half, Conv_inv_buf_t *);
727extern	const char	*conv_sym_other(uchar_t, Conv_inv_buf_t *);
728extern	const char	*conv_sym_value(Half, uchar_t, Addr, Conv_inv_buf_t *);
729extern	const char	*conv_sym_SPARC_value(Addr, int, Conv_inv_buf_t *);
730
731#ifdef	__cplusplus
732}
733#endif
734
735#endif /* _CONV_H */
736