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.
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.
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]
23 * Copyright (c) 1988 AT&T
26 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Global include file for all sgs ia32 based machine dependent macros,
29 * constants and declarations.
32 #ifndef _MACHDEP_X86_H
33 #define _MACHDEP_X86_H
36 #include <sys/machelf.h>
43 * Elf header information.
45 #define M_MACH_32 EM_386
46 #define M_MACH_64 EM_AMD64
49 #define M_MACH EM_AMD64
50 #define M_CLASS ELFCLASS64
53 #define M_CLASS ELFCLASS32
56 #define M_MACHPLUS M_MACH
57 #define M_DATA ELFDATA2LSB
61 * Page boundary Macros: truncate to previous page boundary and round to
62 * next page boundary (refer to generic macros in ../sgs.h also).
64 #define M_PTRUNC(X) ((X) & ~(syspagsz - 1))
65 #define M_PROUND(X) (((X) + syspagsz - 1) & ~(syspagsz - 1))
68 * Segment boundary macros: truncate to previous segment boundary and round
69 * to next page boundary.
72 #define M_SEGSIZE ELF_AMD64_MAXPGSZ
74 #define M_SEGSIZE ELF_386_MAXPGSZ
77 #define M_STRUNC(X) ((X) & ~(M_SEGSIZE - 1))
78 #define M_SROUND(X) (((X) + M_SEGSIZE - 1) & ~(M_SEGSIZE - 1))
81 * Relocation type macros.
90 * TLS static segments must be rounded to the following requirements,
91 * due to libthread stack allocation.
94 #define M_TLSSTATALIGN 0x10
96 #define M_TLSSTATALIGN 0x08
100 * Other machine dependent entities
103 #define M_SEGM_ALIGN 0x00010000
105 #define M_SEGM_ALIGN ELF_386_MAXPGSZ
109 * Values for IA32 objects
113 * Instruction encodings.
115 #define M_INST_JMP 0xe9
116 #define M_INST_PUSHL 0x68
117 #define M_SPECIAL_INST 0xff
118 #define M_PUSHL_DISP 0x35
119 #define M_PUSHL_REG_DISP 0xb3
120 #define M_JMP_DISP_IND 0x25
121 #define M_JMP_REG_DISP_IND 0xa3
124 #define M_BIND_ADJ 1 /* adjustment for end of */
125 /* elf_rtbndr() address */
128 * Provide default starting addresses. 64-bit programs can also be restricted
129 * to a 32-bit address space (SF1_SUNW_ADDR32), and these programs provide an
130 * alternative origin.
132 #define M_SEGM_ORIGIN (Addr)0x400000ULL /* default 1st segment origin */
133 #define M_SEGM_AORIGIN (Addr)0x10000ULL /* alternative 1st segment */
136 #define M_STACK_GAP (0x08000000)
137 #define M_STACK_PGS (0x00048000)
138 #define M_SEGM_ORIGIN (Addr)(M_STACK_GAP + M_STACK_PGS)
139 #define M_SEGM_AORIGIN M_SEGM_ORIGIN
143 * Make common relocation information transparent to the common code
146 #define M_REL_DT_TYPE DT_RELA /* .dynamic entry */
147 #define M_REL_DT_SIZE DT_RELASZ /* .dynamic entry */
148 #define M_REL_DT_ENT DT_RELAENT /* .dynamic entry */
149 #define M_REL_DT_COUNT DT_RELACOUNT /* .dynamic entry */
150 #define M_REL_SHT_TYPE SHT_RELA /* section header type */
151 #define M_REL_ELF_TYPE ELF_T_RELA /* data buffer type */
154 #define M_REL_DT_TYPE DT_REL /* .dynamic entry */
155 #define M_REL_DT_SIZE DT_RELSZ /* .dynamic entry */
156 #define M_REL_DT_ENT DT_RELENT /* .dynamic entry */
157 #define M_REL_DT_COUNT DT_RELCOUNT /* .dynamic entry */
158 #define M_REL_SHT_TYPE SHT_REL /* section header type */
159 #define M_REL_ELF_TYPE ELF_T_REL /* data buffer type */
164 * Make common relocation types transparent to the common code
167 #define M_R_NONE R_AMD64_NONE
168 #define M_R_GLOB_DAT R_AMD64_GLOB_DAT
169 #define M_R_COPY R_AMD64_COPY
170 #define M_R_RELATIVE R_AMD64_RELATIVE
171 #define M_R_JMP_SLOT R_AMD64_JUMP_SLOT
172 #define M_R_FPTR R_AMD64_NONE
173 #define M_R_ARRAYADDR R_AMD64_GLOB_DAT
174 #define M_R_NUM R_AMD64_NUM
176 #define M_R_NONE R_386_NONE
177 #define M_R_GLOB_DAT R_386_GLOB_DAT
178 #define M_R_COPY R_386_COPY
179 #define M_R_RELATIVE R_386_RELATIVE
180 #define M_R_JMP_SLOT R_386_JMP_SLOT
181 #define M_R_FPTR R_386_NONE
182 #define M_R_ARRAYADDR R_386_GLOB_DAT
183 #define M_R_NUM R_386_NUM
187 * The following are defined as M_R_NONE so that checks
188 * for these relocations can be performed in common code - although
189 * the checks are really only relevant to SPARC.
191 #define M_R_REGISTER M_R_NONE
194 * DT_REGISTER is not valid on i386 or amd64
196 #define M_DT_REGISTER 0xffffffff
199 * Make plt section information transparent to the common code.
201 #define M_PLT_SHF_FLAGS (SHF_ALLOC | SHF_EXECINSTR)
204 * Make default data segment and stack flags transparent to the common code.
207 #define M_DATASEG_PERM (PF_R | PF_W)
208 #define M_STACK_PERM (PF_R | PF_W)
210 #define M_DATASEG_PERM (PF_R | PF_W | PF_X)
211 #define M_STACK_PERM (PF_R | PF_W | PF_X)
215 * Define a set of identifies for special sections. These allow the sections
216 * to be ordered within the output file image. These values should be
217 * maintained consistently, where appropriate, in each platform specific header
220 * - null identifies that this section does not need to be added to the
221 * output image (ie. shared object sections or sections we're going to
222 * recreate (sym tables, string tables, relocations, etc.)).
224 * - any user defined section will be first in the associated segment.
226 * - interp and capabilities sections are next, as these are accessed
227 * immediately the first page of the image is mapped.
229 * - objects that do not provide an interp normally have a read-only
230 * .dynamic section that comes next (in this case, there is no need to
231 * update a DT_DEBUG entry at runtime).
233 * - the syminfo, hash, dynsym, dynstr and rel's are grouped together as
234 * these will all be accessed together by ld.so.1 to perform relocations.
236 * - the got and dynamic are grouped together as these may also be
237 * accessed first by ld.so.1 to perform relocations, fill in DT_DEBUG
238 * (executables only), and .got[0].
240 * - unknown sections (stabs, comments, etc.) go at the end.
242 * Note that .tlsbss/.bss are given the largest identifiers. This insures that
243 * if any unknown sections become associated to the same segment as the .bss,
244 * the .bss sections are always the last section in the segment.
246 #define M_ID_NULL 0x00
247 #define M_ID_USER 0x01
249 #define M_ID_INTERP 0x02 /* SHF_ALLOC */
250 #define M_ID_CAP 0x03
251 #define M_ID_CAPINFO 0x04
252 #define M_ID_CAPCHAIN 0x05
254 #define M_ID_DYNAMIC 0x06 /* if no .interp, then no */
255 /* DT_DEBUG is required */
256 #define M_ID_UNWINDHDR 0x07
257 #define M_ID_UNWIND 0x08
259 #define M_ID_SYMINFO 0x09
260 #define M_ID_HASH 0x0a
261 #define M_ID_LDYNSYM 0x0b /* always right before DYNSYM */
262 #define M_ID_DYNSYM 0x0c
263 #define M_ID_DYNSTR 0x0d
264 #define M_ID_VERSION 0x0e
265 #define M_ID_DYNSORT 0x0f
266 #define M_ID_REL 0x10
267 #define M_ID_PLT 0x11 /* SHF_ALLOC + SHF_EXECINSTR */
268 #define M_ID_ARRAY 0x12
269 #define M_ID_TEXT 0x13
270 #define M_ID_DATA 0x20
272 /* M_ID_USER 0x01 dual entry - listed above */
273 #define M_ID_GOT 0x03 /* SHF_ALLOC + SHF_WRITE */
274 /* M_ID_DYNAMIC 0x06 dual entry - listed above */
275 /* M_ID_UNWIND 0x08 dual entry - listed above */
277 #define M_ID_UNKNOWN 0xfb /* just before TLS */
279 #define M_ID_TLS 0xfc /* just before bss */
280 #define M_ID_TLSBSS 0xfd
281 #define M_ID_BSS 0xfe
282 #define M_ID_LBSS 0xff
284 #define M_ID_SYMTAB_NDX 0x02 /* ! SHF_ALLOC */
285 #define M_ID_SYMTAB 0x03
286 #define M_ID_STRTAB 0x04
287 #define M_ID_DYNSYM_NDX 0x05
288 #define M_ID_NOTE 0x06
295 #endif /* _MACHDEP_X86_H */