0
|
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, Version 1.0 only
|
|
6 * (the "License"). You may not use this file except in compliance
|
|
7 * with the License.
|
|
8 *
|
|
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
|
10 * or http://www.opensolaris.org/os/licensing.
|
|
11 * See the License for the specific language governing permissions
|
|
12 * and limitations under the License.
|
|
13 *
|
|
14 * When distributing Covered Code, include this CDDL HEADER in each
|
|
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
|
16 * If applicable, add the following below this CDDL HEADER, with the
|
|
17 * fields enclosed by brackets "[]" replaced with your own identifying
|
|
18 * information: Portions Copyright [yyyy] [name of copyright owner]
|
|
19 *
|
|
20 * CDDL HEADER END
|
|
21 */
|
|
22 /*
|
|
23 * Copyright (c) 1988 AT&T
|
|
24 * All Rights Reserved
|
|
25 *
|
|
26 *
|
|
27 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
|
|
28 * Use is subject to license terms.
|
|
29 *
|
|
30 * Global include file for all sgs SPARC machine dependent macros, constants
|
|
31 * and declarations.
|
|
32 */
|
|
33
|
|
34 #ifndef _MACHDEP_H
|
|
35 #define _MACHDEP_H
|
|
36
|
|
37 #pragma ident "%Z%%M% %I% %E% SMI"
|
|
38
|
|
39 #include <link.h>
|
|
40 #include <sys/machelf.h>
|
|
41
|
|
42 #ifdef __cplusplus
|
|
43 extern "C" {
|
|
44 #endif
|
|
45
|
|
46 /*
|
|
47 * Elf header information.
|
|
48 */
|
|
49 #ifdef _ELF64
|
|
50 #define M_MACH EM_SPARCV9
|
|
51 #define M_CLASS ELFCLASS64
|
|
52 #else
|
|
53 #define M_MACH EM_SPARC
|
|
54 #define M_CLASS ELFCLASS32
|
|
55 #endif
|
|
56 #define M_MACHPLUS EM_SPARC32PLUS
|
|
57 #define M_DATA ELFDATA2MSB
|
|
58 #define M_FLAGSPLUS EF_SPARC_32PLUS
|
|
59
|
|
60 /*
|
|
61 * Page boundary Macros: truncate to previous page boundary and round to
|
|
62 * next page boundary (refer to generic macros in ../sgs.h also).
|
|
63 */
|
|
64 #define M_PTRUNC(X) ((X) & ~(syspagsz - 1))
|
|
65 #define M_PROUND(X) (((X) + syspagsz - 1) & ~(syspagsz - 1))
|
|
66
|
|
67 /*
|
|
68 * Segment boundary macros: truncate to previous segment boundary and round
|
|
69 * to next page boundary.
|
|
70 */
|
|
71 #ifndef M_SEGSIZE
|
|
72 #define M_SEGSIZE ELF_SPARC_MAXPGSZ
|
|
73 #endif
|
|
74 #define M_STRUNC(X) ((X) & ~(M_SEGSIZE - 1))
|
|
75 #define M_SROUND(X) (((X) + M_SEGSIZE - 1) & ~(M_SEGSIZE - 1))
|
|
76
|
|
77
|
|
78 /*
|
|
79 * TLS static segments must be rounded to the following requirements,
|
|
80 * due to libthread stack allocation.
|
|
81 */
|
|
82 #if defined(_ELF64)
|
|
83 #define M_TLSSTATALIGN 0x10
|
|
84 #else
|
|
85 #define M_TLSSTATALIGN 0x8
|
|
86 #endif
|
|
87
|
|
88
|
|
89 /*
|
|
90 * Instruction encodings.
|
|
91 */
|
|
92 #define M_SAVESP64 0x9de3bfc0 /* save %sp, -64, %sp */
|
|
93 #define M_CALL 0x40000000
|
|
94 #define M_JMPL 0x81c06000 /* jmpl %g1 + simm13, %g0 */
|
|
95 #define M_SETHIG0 0x01000000 /* sethi %hi(val), %g0 */
|
|
96 #define M_SETHIG1 0x03000000 /* sethi %hi(val), %g1 */
|
|
97 #define M_STO7G1IM 0xde206000 /* st %o7,[%g1 + %lo(val)] */
|
|
98 #define M_SUBFPSPG1 0x8227800e /* sub %fp,%sp,%g1 */
|
|
99 #define M_NOP 0x01000000 /* sethi 0, %o0 (nop) */
|
|
100 #define M_BA_A 0x30800000 /* ba,a */
|
|
101 #define M_BA_A_PT 0x30480000 /* ba,a %icc, <dst> */
|
|
102 #define M_MOVO7TOG1 0x8210000f /* mov %o7, %g1 */
|
|
103 #define M_MOVO7TOG5 0x8a10000f /* mov %o7, %g5 */
|
|
104 #define M_MOVI7TOG1 0x8210001f /* mov %i7, %g1 */
|
|
105 #define M_BA_A_XCC 0x30680000 /* ba,a %xcc */
|
|
106 #define M_JMPL_G5G0 0x81c16000 /* jmpl %g5 + 0, %g0 */
|
|
107 #define M_XNOR_G5G1 0x82396000 /* xnor %g5, 0, %g1 */
|
|
108
|
|
109
|
|
110 #define M_BIND_ADJ 4 /* adjustment for end of */
|
|
111 /* elf_rtbndr() address */
|
|
112
|
|
113
|
|
114 /*
|
|
115 * Plt and Got information; the first few .got and .plt entries are reserved
|
|
116 * PLT[0] jump to dynamic linker
|
|
117 * GOT[0] address of _DYNAMIC
|
|
118 */
|
|
119 #define M_PLT_INSSIZE 4 /* single plt instruction size */
|
|
120 #define M_GOT_XDYNAMIC 0 /* got index for _DYNAMIC */
|
|
121 #define M_GOT_XNumber 1 /* reserved no. of got entries */
|
|
122
|
|
123 /*
|
|
124 * ELF32 bit PLT constants
|
|
125 */
|
|
126 #define M32_PLT_ENTSIZE 12 /* 32bit plt entry size in bytes */
|
|
127
|
|
128 /*
|
|
129 * ELF64 bit PLT constants
|
|
130 */
|
|
131 #define M64_PLT_NEARPLTS 0x8000 /* # of NEAR PLTS we can have */
|
|
132 #define M64_PLT_ENTSIZE 32 /* plt entry size in bytes */
|
|
133 #define M64_PLT_FENTSIZE 24 /* size of far plt is 6 instructions */
|
|
134 /* x 4bytes */
|
|
135 #define M64_PLT_PSIZE 8 /* size of PLTP pointer */
|
|
136 #define M64_PLT_FBLKCNTS 160 /* # of plts in far PLT blocks */
|
|
137 #define M64_PLT_FBLOCKSZ (M64_PLT_FBLKCNTS *\
|
|
138 M64_PLT_ENTSIZE) /* size of far PLT block */
|
|
139
|
|
140
|
|
141 #ifdef _ELF64
|
|
142 #define M_PLT_ENTSIZE M64_PLT_ENTSIZE /* plt entry size in bytes */
|
|
143 #define M_PLT_XNumber 4 /* reserved no. of plt entries */
|
|
144 #define M_PLT_ALIGN 256 /* alignment of .plt section */
|
|
145 #define M_PLT_RESERVSZ (M_PLT_XNumber * \
|
|
146 M_PLT_ENTSIZE) /* first 4 plt's reserved */
|
|
147 #define M_GOT_ENTSIZE 8 /* got entry size in bytes */
|
|
148 #define M_GOT_MAXSMALL 1024 /* maximum no. of small gots */
|
|
149 #else /* Elf32 */
|
|
150 #define M_PLT_ENTSIZE M32_PLT_ENTSIZE /* plt entry size in bytes */
|
|
151 #define M_PLT_XNumber 4 /* reserved no. of plt entries */
|
|
152 #define M_PLT_ALIGN M_WORD_ALIGN /* alignment of .plt section */
|
|
153 #define M_PLT_RESERVSZ (M_PLT_XNumber * \
|
|
154 M_PLT_ENTSIZE) /* first 4 plt's reserved */
|
|
155 #define M_GOT_ENTSIZE 4 /* got entry size in bytes */
|
|
156 #define M_GOT_MAXSMALL 2048 /* maximum no. of small gots */
|
|
157 #endif /* _ELF64 */
|
|
158 /* transition flags for got sizing */
|
|
159 #define M_GOT_LARGE (Sword)(-M_GOT_MAXSMALL - 1)
|
|
160 #define M_GOT_SMALL (Sword)(-M_GOT_MAXSMALL - 2)
|
|
161
|
|
162
|
|
163 /*
|
|
164 * Other machine dependent entities
|
|
165 */
|
|
166 #ifdef _ELF64
|
|
167 #define M_SEGM_ALIGN ELF_SPARCV9_MAXPGSZ
|
|
168 /*
|
|
169 * Put 64-bit programs above 4 gigabytes to help insure correctness,
|
|
170 * so any 64-bit programs that truncate pointers will fault now instead of
|
|
171 * corrupting itself and dying mysteriously.
|
|
172 */
|
|
173 #define M_SEGM_ORIGIN (Addr)0x100000000ULL /* default first segment offset */
|
|
174 #define M_WORD_ALIGN 8
|
|
175 #else
|
|
176 #define M_SEGM_ALIGN ELF_SPARC_MAXPGSZ
|
|
177 #define M_SEGM_ORIGIN (Addr)0x10000 /* default first segment offset */
|
|
178 #define M_WORD_ALIGN 4
|
|
179 #endif
|
|
180
|
|
181
|
|
182
|
|
183
|
|
184 /*
|
|
185 * Make machine class dependent functions transparent to the common code
|
|
186 */
|
|
187 #ifdef _ELF64
|
|
188 #define ELF_R_TYPE ELF64_R_TYPE_ID
|
|
189 #define ELF_R_INFO ELF64_R_INFO
|
|
190 #define ELF_R_SYM ELF64_R_SYM
|
|
191 #define ELF_R_TYPE_DATA ELF64_R_TYPE_DATA
|
|
192 #define ELF_R_TYPE_INFO ELF64_R_TYPE_INFO
|
|
193 #define ELF_ST_BIND ELF64_ST_BIND
|
|
194 #define ELF_ST_TYPE ELF64_ST_TYPE
|
|
195 #define ELF_ST_INFO ELF64_ST_INFO
|
|
196 #define ELF_ST_VISIBILITY ELF64_ST_VISIBILITY
|
|
197 #define ELF_M_SYM ELF64_M_SYM
|
|
198 #define ELF_M_SIZE ELF64_M_SIZE
|
|
199 #define ELF_M_INFO ELF64_M_INFO
|
|
200 #define elf_checksum elf64_checksum
|
|
201 #define elf_fsize elf64_fsize
|
|
202 #define elf_getehdr elf64_getehdr
|
|
203 #define elf_getphdr elf64_getphdr
|
|
204 #define elf_newehdr elf64_newehdr
|
|
205 #define elf_newphdr elf64_newphdr
|
|
206 #define elf_getshdr elf64_getshdr
|
|
207 #else /* Elf32 */
|
|
208 #define ELF_R_TYPE ELF32_R_TYPE
|
|
209 #define ELF_R_INFO ELF32_R_INFO
|
|
210 #define ELF_R_SYM ELF32_R_SYM
|
|
211 #define ELF_M_SYM ELF32_M_SYM
|
|
212 #define ELF_M_SIZE ELF32_M_SIZE
|
|
213 #define ELF_M_INFO ELF32_M_INFO
|
|
214 /* Elf64 can hide extra offset in r_info */
|
|
215 #define ELF_R_TYPE_DATA(x) (0)
|
|
216 #define ELF_R_TYPE_INFO(xoff, type) (type)
|
|
217 #define ELF_ST_BIND ELF32_ST_BIND
|
|
218 #define ELF_ST_TYPE ELF32_ST_TYPE
|
|
219 #define ELF_ST_INFO ELF32_ST_INFO
|
|
220 #define ELF_ST_VISIBILITY ELF32_ST_VISIBILITY
|
|
221 #define elf_checksum elf32_checksum
|
|
222 #define elf_fsize elf32_fsize
|
|
223 #define elf_getehdr elf32_getehdr
|
|
224 #define elf_getphdr elf32_getphdr
|
|
225 #define elf_newehdr elf32_newehdr
|
|
226 #define elf_newphdr elf32_newphdr
|
|
227 #define elf_getshdr elf32_getshdr
|
|
228 #endif /* Elf32 */
|
|
229
|
|
230
|
|
231 /*
|
|
232 * Make common relocation information transparent to the common code
|
|
233 */
|
|
234 #define M_REL_DT_TYPE DT_RELA /* .dynamic entry */
|
|
235 #define M_REL_DT_SIZE DT_RELASZ /* .dynamic entry */
|
|
236 #define M_REL_DT_ENT DT_RELAENT /* .dynamic entry */
|
|
237 #define M_REL_DT_COUNT DT_RELACOUNT /* .dynamic entry */
|
|
238 #define M_REL_SHT_TYPE SHT_RELA /* section header type */
|
|
239 #define M_REL_ELF_TYPE ELF_T_RELA /* data buffer type */
|
|
240
|
|
241 #define M_REL_CONTYPSTR conv_reloc_SPARC_type_str
|
|
242
|
|
243 /*
|
|
244 * Make common relocation types transparent to the common code
|
|
245 */
|
|
246 #define M_R_NONE R_SPARC_NONE
|
|
247 #define M_R_GLOB_DAT R_SPARC_GLOB_DAT
|
|
248 #define M_R_COPY R_SPARC_COPY
|
|
249 #define M_R_RELATIVE R_SPARC_RELATIVE
|
|
250 #define M_R_JMP_SLOT R_SPARC_JMP_SLOT
|
|
251 #define M_R_REGISTER R_SPARC_REGISTER
|
|
252 #define M_R_FPTR R_SPARC_NONE
|
|
253 #define M_R_NUM R_SPARC_NUM
|
|
254
|
|
255 /*
|
|
256 * Length of R_SPARC_
|
|
257 */
|
|
258 #define M_R_STR_LEN 8
|
|
259
|
|
260 #ifdef _ELF64
|
|
261 #define M_R_ARRAYADDR R_SPARC_64
|
|
262 #define M_R_DTPMOD R_SPARC_TLS_DTPMOD64
|
|
263 #define M_R_DTPOFF R_SPARC_TLS_DTPOFF64
|
|
264 #define M_R_TPOFF R_SPARC_TLS_TPOFF64
|
|
265 #else /* _ELF32 */
|
|
266 #define M_R_ARRAYADDR R_SPARC_32
|
|
267 #define M_R_DTPMOD R_SPARC_TLS_DTPMOD32
|
|
268 #define M_R_DTPOFF R_SPARC_TLS_DTPOFF32
|
|
269 #define M_R_TPOFF R_SPARC_TLS_TPOFF32
|
|
270 #endif /* _ELF64 */
|
|
271
|
|
272
|
|
273 /*
|
|
274 * Make register symbols transparent to common code
|
|
275 */
|
|
276 #define M_DT_REGISTER DT_SPARC_REGISTER
|
|
277
|
|
278 /*
|
|
279 * PLTRESERVE is not relevant on sparc
|
|
280 */
|
|
281 #define M_DT_PLTRESERVE 0xffffffff
|
|
282
|
|
283
|
|
284 /*
|
|
285 * Make plt section information transparent to the common code.
|
|
286 */
|
|
287 #define M_PLT_SHF_FLAGS (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR)
|
|
288
|
|
289 /*
|
|
290 * Make data segment information transparent to the common code.
|
|
291 */
|
|
292 #define M_DATASEG_PERM (PF_R | PF_W | PF_X)
|
|
293
|
|
294 /*
|
|
295 * Define a set of identifies for special sections. These allow the sections
|
|
296 * to be ordered within the output file image. These values should be
|
|
297 * maintained consistently, where appropriate, in each platform specific header
|
|
298 * file.
|
|
299 *
|
|
300 * o null identifies that this section does not need to be added to the
|
|
301 * output image (ie. shared object sections or sections we're going to
|
|
302 * recreate (sym tables, string tables, relocations, etc.)).
|
|
303 *
|
|
304 * o any user defined section will be first in the associated segment.
|
|
305 *
|
|
306 * o interp and capabilities sections are next, as these are accessed
|
|
307 * immediately the first page of the image is mapped.
|
|
308 *
|
|
309 * o the syminfo, hash, dynsym, dynstr and rel's are grouped together as
|
|
310 * these will all be accessed first by ld.so.1 to perform relocations.
|
|
311 *
|
|
312 * o the got, dynamic, and plt are grouped together as these may also be
|
|
313 * accessed first by ld.so.1 to perform relocations, fill in DT_DEBUG
|
|
314 * (executables only), and .plt[0].
|
|
315 *
|
|
316 * o unknown sections (stabs, comments etc.) go at the end.
|
|
317 *
|
|
318 * Note that .tlsbss/.bss are given the largest identifiers. This insures that
|
|
319 * if any unknown sections become associated to the same segment as the .bss,
|
|
320 * the .bss sections are always the last section in the segment.
|
|
321 */
|
|
322 #define M_ID_NULL 0x00
|
|
323 #define M_ID_USER 0x01
|
|
324
|
|
325 #define M_ID_INTERP 0x02 /* SHF_ALLOC */
|
|
326 #define M_ID_CAP 0x03
|
|
327 #define M_ID_SYMINFO 0x04
|
|
328 #define M_ID_HASH 0x05
|
|
329 #define M_ID_DYNSYM 0x06
|
|
330 #define M_ID_DYNSTR 0x07
|
|
331 #define M_ID_VERSION 0x08
|
|
332 #define M_ID_REL 0x09
|
|
333 #define M_ID_TEXT 0x0b /* SHF_ALLOC + SHF_EXECINSTR */
|
|
334 #define M_ID_DATA 0x0c
|
|
335
|
|
336 /* M_ID_USER 0x01 dual entry - listed above */
|
|
337 #define M_ID_GOTDATA 0x02 /* SHF_ALLOC + SHF_WRITE */
|
|
338 #define M_ID_GOT 0x03
|
|
339 #define M_ID_PLT 0x04
|
|
340 #define M_ID_DYNAMIC 0x05
|
|
341 #define M_ID_ARRAY 0x06
|
|
342
|
|
343 #define M_ID_UNKNOWN 0xfc /* just before TLS */
|
|
344
|
|
345 #define M_ID_TLS 0xfd /* just before bss */
|
|
346 #define M_ID_TLSBSS 0xfe
|
|
347 #define M_ID_BSS 0xff
|
|
348
|
|
349 #define M_ID_SYMTAB_NDX 0x02 /* ! SHF_ALLOC */
|
|
350 #define M_ID_SYMTAB 0x03
|
|
351 #define M_ID_STRTAB 0x04
|
|
352 #define M_ID_DYNSYM_NDX 0x05
|
|
353 #define M_ID_NOTE 0x06
|
|
354
|
|
355 #ifdef __cplusplus
|
|
356 }
|
|
357 #endif
|
|
358
|
|
359 #endif /* _MACHDEP_H */
|