1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1988 AT&T
* All Rights Reserved
*
* Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
*
* Global include file for all sgs SPARC machine dependent macros, constants
* and declarations.
*/
#ifndef _MACHDEP_SPARC_H
#define _MACHDEP_SPARC_H
#include <link.h>
#include <sys/machelf.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Elf header information.
*/
#define M_MACH_32 EM_SPARC
#define M_MACH_64 EM_SPARCV9
#ifdef _ELF64
#define M_MACH EM_SPARCV9
#define M_CLASS ELFCLASS64
#else
#define M_MACH EM_SPARC
#define M_CLASS ELFCLASS32
#endif
#define M_MACHPLUS EM_SPARC32PLUS
#define M_DATA ELFDATA2MSB
#define M_FLAGSPLUS EF_SPARC_32PLUS
/*
* Page boundary Macros: truncate to previous page boundary and round to
* next page boundary (refer to generic macros in ../sgs.h also).
*/
#define M_PTRUNC(X) ((X) & ~(syspagsz - 1))
#define M_PROUND(X) (((X) + syspagsz - 1) & ~(syspagsz - 1))
/*
* Segment boundary macros: truncate to previous segment boundary and round
* to next page boundary.
*/
#ifndef M_SEGSIZE
#define M_SEGSIZE ELF_SPARC_MAXPGSZ
#endif
#define M_STRUNC(X) ((X) & ~(M_SEGSIZE - 1))
#define M_SROUND(X) (((X) + M_SEGSIZE - 1) & ~(M_SEGSIZE - 1))
/*
* Relocation type macro.
*/
#define M_RELOC Rela
/*
* TLS static segments must be rounded to the following requirements,
* due to libthread stack allocation.
*/
#if defined(_ELF64)
#define M_TLSSTATALIGN 0x10
#else
#define M_TLSSTATALIGN 0x08
#endif
/*
* Instruction encodings.
*/
#define M_SAVESP64 0x9de3bfc0 /* save %sp, -64, %sp */
#define M_CALL 0x40000000
#define M_JMPL 0x81c06000 /* jmpl %g1 + simm13, %g0 */
#define M_SETHIG0 0x01000000 /* sethi %hi(val), %g0 */
#define M_SETHIG1 0x03000000 /* sethi %hi(val), %g1 */
#define M_STO7G1IM 0xde206000 /* st %o7,[%g1 + %lo(val)] */
#define M_SUBFPSPG1 0x8227800e /* sub %fp,%sp,%g1 */
#define M_NOP 0x01000000 /* sethi 0, %o0 (nop) */
#define M_BA_A 0x30800000 /* ba,a */
#define M_BA_A_PT 0x30480000 /* ba,a %icc, <dst> */
#define M_MOVO7TOG1 0x8210000f /* mov %o7, %g1 */
#define M_MOVO7TOG5 0x8a10000f /* mov %o7, %g5 */
#define M_MOVI7TOG1 0x8210001f /* mov %i7, %g1 */
#define M_BA_A_XCC 0x30680000 /* ba,a %xcc */
#define M_JMPL_G5G0 0x81c16000 /* jmpl %g5 + 0, %g0 */
#define M_XNOR_G5G1 0x82396000 /* xnor %g5, 0, %g1 */
#define M_BIND_ADJ 4 /* adjustment for end of */
/* elf_rtbndr() address */
/* transition flags for got sizing */
#define M_GOT_LARGE (Sword)(-M_GOT_MAXSMALL - 1)
#define M_GOT_SMALL (Sword)(-M_GOT_MAXSMALL - 2)
#define M_GOT_MIXED (Sword)(-M_GOT_MAXSMALL - 3)
/*
* Other machine dependent entities
*/
#ifdef _ELF64
#define M_SEGM_ALIGN ELF_SPARCV9_MAXPGSZ
/*
* Put default 64-bit programs above 4 gigabytes to help insure correctness, so
* that any 64-bit programs that truncate pointers will fault now instead of
* corrupting itself and dying mysteriously. 64-bit programs can also be
* restricted to a 32-bit address space (SF1_SUNW_ADDR32), and these programs
* provide an alternative origin.
*/
#define M_SEGM_ORIGIN (Addr)0x100000000ULL /* default 1st segment origin */
#define M_SEGM_AORIGIN (Addr)0x100000ULL /* alternative 1st segment */
/* origin */
#else
#define M_SEGM_ALIGN ELF_SPARC_MAXPGSZ
#define M_SEGM_ORIGIN (Addr)0x10000 /* default 1st segment origin */
#define M_SEGM_AORIGIN M_SEGM_ORIGIN /* alternative 1st segment */
/* origin */
#endif
/*
* Make common relocation information transparent to the common code
*/
#define M_REL_DT_TYPE DT_RELA /* .dynamic entry */
#define M_REL_DT_SIZE DT_RELASZ /* .dynamic entry */
#define M_REL_DT_ENT DT_RELAENT /* .dynamic entry */
#define M_REL_DT_COUNT DT_RELACOUNT /* .dynamic entry */
#define M_REL_SHT_TYPE SHT_RELA /* section header type */
#define M_REL_ELF_TYPE ELF_T_RELA /* data buffer type */
/*
* Make common relocation types transparent to the common code
*/
#define M_R_NONE R_SPARC_NONE
#define M_R_GLOB_DAT R_SPARC_GLOB_DAT
#define M_R_COPY R_SPARC_COPY
#define M_R_RELATIVE R_SPARC_RELATIVE
#define M_R_JMP_SLOT R_SPARC_JMP_SLOT
#define M_R_REGISTER R_SPARC_REGISTER
#define M_R_FPTR R_SPARC_NONE
#define M_R_NUM R_SPARC_NUM
#ifdef _ELF64
#define M_R_ARRAYADDR R_SPARC_64
#define M_R_DTPMOD R_SPARC_TLS_DTPMOD64
#define M_R_DTPOFF R_SPARC_TLS_DTPOFF64
#define M_R_TPOFF R_SPARC_TLS_TPOFF64
#else /* _ELF32 */
#define M_R_ARRAYADDR R_SPARC_32
#define M_R_DTPMOD R_SPARC_TLS_DTPMOD32
#define M_R_DTPOFF R_SPARC_TLS_DTPOFF32
#define M_R_TPOFF R_SPARC_TLS_TPOFF32
#endif /* _ELF64 */
/*
* Make register symbols transparent to common code
*/
#define M_DT_REGISTER DT_SPARC_REGISTER
/*
* Make plt section information transparent to the common code.
*/
#define M_PLT_SHF_FLAGS (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR)
/*
* Make default data segment and stack flags transparent to the common code.
*/
#define M_DATASEG_PERM (PF_R | PF_W | PF_X)
#ifdef _ELF64
#define M_STACK_PERM (PF_R | PF_W)
#else
#define M_STACK_PERM (PF_R | PF_W | PF_X)
#endif
/*
* Define a set of identifies for special sections. These allow the sections
* to be ordered within the output file image. These values should be
* maintained consistently, where appropriate, in each platform specific header
* file.
*
* - null identifies that this section does not need to be added to the
* output image (ie. shared object sections or sections we're going to
* recreate (sym tables, string tables, relocations, etc.)).
*
* - any user defined section will be first in the associated segment.
*
* - interp and capabilities sections are next, as these are accessed
* immediately the first page of the image is mapped.
*
* - objects that do not provide an interp normally have a read-only
* .dynamic section that comes next (in this case, there is no need to
* update a DT_DEBUG entry at runtime).
*
* - the syminfo, hash, dynsym, dynstr and rel's are grouped together as
* these will all be accessed together by ld.so.1 to perform relocations.
*
* - the got, dynamic, and plt are grouped together as these may also be
* accessed first by ld.so.1 to perform relocations, fill in DT_DEBUG
* (executables only), and .plt[0].
*
* - unknown sections (stabs, comments, etc.) go at the end.
*
* Note that .tlsbss/.bss are given the largest identifiers. This insures that
* if any unknown sections become associated to the same segment as the .bss,
* the .bss sections are always the last section in the segment.
*/
#define M_ID_NULL 0x00
#define M_ID_USER 0x01
#define M_ID_INTERP 0x02 /* SHF_ALLOC */
#define M_ID_CAP 0x03
#define M_ID_CAPINFO 0x04
#define M_ID_CAPCHAIN 0x05
#define M_ID_DYNAMIC 0x06 /* if no .interp, then no */
/* DT_DEBUG is required */
#define M_ID_UNWINDHDR 0x07
#define M_ID_UNWIND 0x08
#define M_ID_SYMINFO 0x09
#define M_ID_HASH 0x0a
#define M_ID_LDYNSYM 0x0b /* always right before DYNSYM */
#define M_ID_DYNSYM 0x0c
#define M_ID_DYNSTR 0x0d
#define M_ID_VERSION 0x0e
#define M_ID_DYNSORT 0x0f
#define M_ID_REL 0x10
#define M_ID_ARRAY 0x11
#define M_ID_TEXT 0x12 /* SHF_ALLOC + SHF_EXECINSTR */
#define M_ID_DATA 0x20
/* M_ID_USER 0x01 dual entry - listed above */
#define M_ID_GOTDATA 0x02 /* SHF_ALLOC + SHF_WRITE */
#define M_ID_GOT 0x03
#define M_ID_PLT 0x04
/* M_ID_DYNAMIC 0x06 dual entry - listed above */
/* M_ID_UNWIND 0x08 dual entry - listed above */
#define M_ID_UNKNOWN 0xfc /* just before TLS */
#define M_ID_TLS 0xfd /* just before bss */
#define M_ID_TLSBSS 0xfe
#define M_ID_BSS 0xff
#define M_ID_SYMTAB_NDX 0x02 /* ! SHF_ALLOC */
#define M_ID_SYMTAB 0x03
#define M_ID_STRTAB 0x04
#define M_ID_DYNSYM_NDX 0x05
#define M_ID_NOTE 0x06
#ifdef __cplusplus
}
#endif
#endif /* _MACHDEP_SPARC_H */
|