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