xref: /illumos-gate/usr/src/cmd/sgs/include/sgs.h (revision cdd3e9a818787b4def17c9f707f435885ce0ed31)
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  *
27  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Copyright 2022 Oxide Computer Company
29  *
30  * Global include file for all sgs.
31  */
32 
33 #ifndef	_SGS_H
34 #define	_SGS_H
35 
36 #ifdef	__cplusplus
37 extern "C" {
38 #endif
39 
40 /* <assert.h> keys off of NDEBUG */
41 #ifdef	DEBUG
42 #undef	NDEBUG
43 #else
44 #define	NDEBUG
45 #endif
46 
47 #ifndef	_ASM
48 #include <sys/types.h>
49 #include <sys/machelf.h>
50 #include <sys/stddef.h>
51 #include <stdlib.h>
52 #include <stdarg.h>
53 #include <libelf.h>
54 #include <assert.h>
55 #include <alist.h>
56 #endif	/* _ASM */
57 
58 /*
59  * Software identification.
60  */
61 #define	SGS		""
62 #define	SGU_PKG		"Software Generation Utilities"
63 #define	SGU_REL		"(SGU) Solaris-ELF (4.0)"
64 
65 
66 #ifndef _ASM
67 
68 /*
69  * link_ver_string[] contains a version string for use by the link-editor
70  * and all other linker components. It is found in libconv, and is
71  * generated by sgs/libconv/common/bld_vernote.ksh. That script produces
72  * libconv/{plat}/vernote.s, which is in turn assembled/linked into
73  * libconv.
74  */
75 extern const char link_ver_string[];
76 /*
77  * Macro to round to next double word boundary.
78  */
79 #define	S_DROUND(x)	(((x) + sizeof (double) - 1) & ~(sizeof (double) - 1))
80 
81 /*
82  * General align and round macros.
83  */
84 #define	S_ALIGN(x, a)	((x) & ~(((a) ? (a) : 1) - 1))
85 #define	S_ROUND(x, a)   (((x) + (((a) ? (a) : 1) - 1)) & ~(((a) ? (a) : 1) - 1))
86 
87 /*
88  * Bit manipulation macros; generic bit mask and is `v' in the range
89  * supportable in `n' bits?
90  */
91 #define	S_MASK(n)	((1 << (n)) - 1)
92 #define	S_INRANGE(v, n)	(((-(1 << (n)) - 1) < (v)) && ((v) < (1 << (n))))
93 
94 
95 /*
96  * Yet another definition of the OFFSETOF macro, used with the AVL routines.
97  */
98 #define	SGSOFFSETOF(s, m)	offsetof(s, m)
99 
100 /*
101  * When casting between integer and pointer types, gcc will complain
102  * if the integer type used is not large enough to hold the pointer
103  * value without loss. Although a dubious practice in general, this
104  * is sometimes done by design. In those cases, the general solution
105  * is to introduce an intermediate cast to widen the integer value. The
106  * CAST_PTRINT macro does this, and its use documents the fact that
107  * the programmer is doing that sort of cast.
108  */
109 #ifdef __GNUC__
110 #define	CAST_PTRINT(cast, value) ((cast)(uintptr_t)value)
111 #else
112 #define	CAST_PTRINT(cast, value) ((cast)value)
113 #endif
114 
115 /*
116  * General typedefs.
117  */
118 typedef enum {
119 	FALSE = 0,
120 	TRUE = 1
121 } Boolean;
122 
123 /*
124  * Types of errors (used by veprintf()), together with a generic error return
125  * value.
126  */
127 typedef enum {
128 	ERR_NONE,		/* plain message */
129 	ERR_WARNING_NF,		/* warning that cannot be promoted to fatal */
130 	ERR_WARNING,		/* warning that can be promoted to fatal */
131 	ERR_GUIDANCE,		/* guidance warning that can be promoted */
132 	ERR_FATAL,		/* fatal error */
133 	ERR_ELF,		/* fatal libelf error */
134 	ERR_NUM			/* # of Error codes. Must be last */
135 } Error;
136 
137 /*
138  * Type used to represent line numbers within files, and a corresponding
139  * printing macro for it.
140  */
141 typedef ulong_t Lineno;
142 #define	EC_LINENO(_x) EC_XWORD(_x)			/* "llu" */
143 
144 
145 #if defined(_LP64) && !defined(_ELF64)
146 #define	S_ERROR		(~(uint_t)0)
147 #else
148 #define	S_ERROR		(~(uintptr_t)0)
149 #endif
150 
151 /*
152  * CTF currently does not handle automatic array variables sized via function
153  * arguments (VLA arrays) properly, when the code is compiled with gcc.
154  * Adding 1 to the size is a workaround.  VLA_SIZE, and its use, should be
155  * pulled when CTF is fixed or replaced.
156  */
157 #ifdef __GNUC__
158 #define	VLA_SIZE(_arg)	((_arg) + 1)
159 #else
160 #define	VLA_SIZE(_arg)	(_arg)
161 #endif
162 
163 /*
164  * Structure to maintain rejected files elf information.  Files that are not
165  * applicable to the present link-edit are rejected and a search for an
166  * appropriate file may be resumed.  The first rejected files information is
167  * retained so that a better error diagnostic can be given should an appropriate
168  * file not be located.
169  */
170 typedef struct {
171 	ushort_t	rej_type;	/* SGS_REJ_ value */
172 	ushort_t	rej_flags;	/* additional information */
173 	uint_t		rej_info;	/* numeric and string information */
174 	const char	*rej_str;	/*	associated with error */
175 	const char	*rej_name;	/* object name - expanded library */
176 					/*	name and archive members */
177 } Rej_desc;
178 
179 #define	SGS_REJ_NONE		0
180 #define	SGS_REJ_MACH		1	/* wrong ELF machine type */
181 #define	SGS_REJ_CLASS		2	/* wrong ELF class (32-bit/64-bit) */
182 #define	SGS_REJ_DATA		3	/* wrong ELF data format (MSG/LSB) */
183 #define	SGS_REJ_TYPE		4	/* bad ELF type */
184 #define	SGS_REJ_BADFLAG		5	/* bad ELF flags value */
185 #define	SGS_REJ_MISFLAG		6	/* mismatched ELF flags value */
186 #define	SGS_REJ_VERSION		7	/* mismatched ELF/lib version */
187 #define	SGS_REJ_HAL		8	/* HAL R1 extensions required */
188 #define	SGS_REJ_US3		9	/* Sun UltraSPARC III extensions */
189 					/*	required */
190 #define	SGS_REJ_STR		10	/* generic error - info is a string */
191 #define	SGS_REJ_UNKFILE		11	/* unknown file type */
192 #define	SGS_REJ_UNKCAP		12	/* unknown capabilities */
193 #define	SGS_REJ_HWCAP_1		13	/* hardware capabilities mismatch */
194 #define	SGS_REJ_SFCAP_1		14	/* software capabilities mismatch */
195 #define	SGS_REJ_MACHCAP		15	/* machine capability mismatch */
196 #define	SGS_REJ_PLATCAP		16	/* platform capability mismatch */
197 #define	SGS_REJ_HWCAP_2		17	/* hardware capabilities mismatch */
198 #define	SGS_REJ_ARCHIVE		18	/* archive used in invalid context */
199 #define	SGS_REJ_KMOD		19	/* object is a kernel module */
200 #define	SGS_REJ_HWCAP_3		20	/* hardware capabilities mismatch */
201 #define	SGS_REJ_NUM		21
202 
203 
204 #define	FLG_REJ_ALTER		0x01	/* object name is an alternative */
205 
206 /*
207  * Data structures (defined in libld.h).
208  */
209 typedef	struct audit_desc	Audit_desc;
210 typedef	struct audit_info	Audit_info;
211 typedef	struct audit_list	Audit_list;
212 typedef struct cap_desc		Cap_desc;
213 typedef struct ent_desc		Ent_desc;
214 typedef	struct group_desc	Group_desc;
215 typedef struct ifl_desc		Ifl_desc;
216 typedef struct is_desc		Is_desc;
217 typedef struct isa_desc		Isa_desc;
218 typedef struct isa_opt		Isa_opt;
219 typedef struct os_desc		Os_desc;
220 typedef struct ofl_desc		Ofl_desc;
221 typedef	struct rel_cache	Rel_cache;
222 typedef	struct rel_cachebuf	Rel_cachebuf;
223 typedef	struct rel_aux_cachebuf	Rel_aux_cachebuf;
224 typedef struct rel_aux		Rel_aux;
225 typedef struct rel_desc		Rel_desc;
226 typedef	struct sdf_desc		Sdf_desc;
227 typedef	struct sdv_desc		Sdv_desc;
228 typedef struct sec_order	Sec_order;
229 typedef struct sg_desc		Sg_desc;
230 typedef struct sort_desc	Sort_desc;
231 typedef	struct sym_avlnode	Sym_avlnode;
232 typedef struct sym_aux		Sym_aux;
233 typedef struct sym_desc		Sym_desc;
234 typedef	struct uts_desc		Uts_desc;
235 typedef struct ver_desc		Ver_desc;
236 typedef struct ver_index	Ver_index;
237 
238 /*
239  * Data structures defined in rtld.h.
240  */
241 typedef struct lm_list		Lm_list;
242 #ifdef _SYSCALL32
243 typedef struct lm_list32	Lm_list32;
244 #endif	/* _SYSCALL32 */
245 
246 /*
247  * For the various utilities that include sgs.h
248  */
249 extern void	eprintf(Lm_list *, Error, const char *, ...);
250 extern void	veprintf(Lm_list *, Error, const char *, va_list);
251 extern uint_t	sgs_str_hash(const char *);
252 extern uint_t	findprime(uint_t);
253 
254 #endif /* _ASM */
255 
256 #ifdef	__cplusplus
257 }
258 #endif
259 
260 
261 #endif /* _SGS_H */
262