elf.h revision 84751
1/*-
2 * Copyright (c) 1996-1997 John D. Polstra.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/ia64/include/elf.h 84751 2001-10-10 09:00:27Z dfr $
27 */
28
29#ifndef _MACHINE_ELF_H_
30#define	_MACHINE_ELF_H_ 1
31
32/*
33 * ELF definitions for the IA-64 architecture.
34 */
35
36#include <sys/elf64.h>	/* Definitions common to all 64 bit architectures. */
37
38#define	__ELF_WORD_SIZE	64	/* Used by <sys/elf_generic.h> */
39#include <sys/elf_generic.h>
40
41#define	ELF_ARCH	EM_IA_64
42
43#define	ELF_MACHINE_OK(x) ((x) == EM_IA_64)
44
45/*
46 * Auxiliary vector entries for passing information to the interpreter.
47 *
48 * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
49 * but POSIX lays claim to all symbols ending with "_t".
50 */
51
52typedef struct {	/* Auxiliary vector entry on initial stack */
53	int	a_type;			/* Entry type. */
54	union {
55		long	a_val;		/* Integer value. */
56		void	*a_ptr;		/* Address. */
57		void	(*a_fcn)(void);	/* Function pointer (not used). */
58	} a_un;
59} Elf64_Auxinfo;
60
61__ElfType(Auxinfo);
62
63/*
64 * Types of dynamic symbol hash table bucket and chain elements.
65 *
66 * This is inconsistent among 64 bit architectures, so a machine dependent
67 * typedef is required.
68 */
69
70typedef Elf64_Off Elf64_Hashelt;
71
72__ElfType(Hashelt);
73
74/* Values for a_type. */
75#define	AT_NULL		0	/* Terminates the vector. */
76#define	AT_IGNORE	1	/* Ignored entry. */
77#define	AT_EXECFD	2	/* File descriptor of program to load. */
78#define	AT_PHDR		3	/* Program header of program already loaded. */
79#define	AT_PHENT	4	/* Size of each program header entry. */
80#define	AT_PHNUM	5	/* Number of program header entries. */
81#define	AT_PAGESZ	6	/* Page size in bytes. */
82#define	AT_BASE		7	/* Interpreter's base address. */
83#define	AT_FLAGS	8	/* Flags (unused for i386). */
84#define	AT_ENTRY	9	/* Where interpreter should transfer control. */
85
86/*
87 * The following non-standard values are used for passing information
88 * from John Polstra's testbed program to the dynamic linker.  These
89 * are expected to go away soon.
90 *
91 * Unfortunately, these overlap the Linux non-standard values, so they
92 * must not be used in the same context.
93 */
94#define	AT_BRK		10	/* Starting point for sbrk and brk. */
95#define	AT_DEBUG	11	/* Debugging level. */
96
97/*
98 * The following non-standard values are used in Linux ELF binaries.
99 */
100#define	AT_NOTELF	10	/* Program is not ELF ?? */
101#define	AT_UID		11	/* Real uid. */
102#define	AT_EUID		12	/* Effective uid. */
103#define	AT_GID		13	/* Real gid. */
104#define	AT_EGID		14	/* Effective gid. */
105
106#define	AT_COUNT	15	/* Count of defined aux entry types. */
107
108/*
109 * Values for e_flags.
110 */
111#define	EF_IA_64_MASKOS		0x00ff000f
112#define	EF_IA_64_ABI64		0x00000010
113#define	EF_IA_64_REDUCEDFP	0x00000020
114#define	EF_IA_64_CONS_GP	0x00000040
115#define	EF_IA_64_NOFUNCDESC_CONS_GP 0x00000080
116#define	EF_IA_64_ABSOLUTE	0x00000100
117#define	EF_IA_64_ARCH		0xff000000
118
119/*
120 * Section types.
121 */
122#define	SHT_IA_64_EXT		0x70000000
123#define	SHT_IA_64_UNWIND	0x70000001
124#define	SHT_IA_64_LOPSREG	0x78000000
125#define	SHT_IA_64_HIPSREG	0x7fffffff
126
127/*
128 * Section attribute flags.
129 */
130#define	SHF_IA_64_SHORT		0x10000000
131#define	SHF_IA_64_NORECOV	0x20000000
132
133/*
134 * Relocation types.
135 */
136
137/*	Name			Value	   Field	Calculation */
138#define	R_IA64_NONE		0	/* None */
139#define	R_IA64_IMM14		0x21	/* immediate14	S + A */
140#define	R_IA64_IMM22		0x22	/* immediate22	S + A */
141#define	R_IA64_IMM64		0x23	/* immediate64	S + A */
142#define	R_IA64_DIR32MSB		0x24	/* word32 MSB	S + A */
143#define	R_IA64_DIR32LSB		0x25	/* word32 LSB	S + A */
144#define	R_IA64_DIR64MSB		0x26	/* word64 MSB	S + A */
145#define	R_IA64_DIR64LSB		0x27	/* word64 LSB	S + A */
146#define	R_IA64_GPREL22		0x2a	/* immediate22	@gprel(S + A) */
147#define	R_IA64_GPREL64I		0x2b	/* immediate64	@gprel(S + A) */
148#define	R_IA64_GPREL64MSB	0x2e	/* word64 MSB	@gprel(S + A) */
149#define	R_IA64_GPREL64LSB	0x2f	/* word64 LSB	@gprel(S + A) */
150#define	R_IA64_LTOFF22		0x32	/* immediate22	@ltoff(S + A) */
151#define	R_IA64_LTOFF64I		0x33	/* immediate64	@ltoff(S + A) */
152#define	R_IA64_PLTOFF22		0x3a	/* immediate22	@pltoff(S + A) */
153#define	R_IA64_PLTOFF64I	0x3b	/* immediate64	@pltoff(S + A) */
154#define	R_IA64_PLTOFF64MSB	0x3e	/* word64 MSB	@pltoff(S + A) */
155#define	R_IA64_PLTOFF64LSB	0x3f	/* word64 LSB	@pltoff(S + A) */
156#define	R_IA64_FPTR64I		0x43	/* immediate64	@fptr(S + A) */
157#define	R_IA64_FPTR32MSB	0x44	/* word32 MSB	@fptr(S + A) */
158#define	R_IA64_FPTR32LSB	0x45	/* word32 LSB	@fptr(S + A) */
159#define	R_IA64_FPTR64MSB	0x46	/* word64 MSB	@fptr(S + A) */
160#define	R_IA64_FPTR64LSB	0x47	/* word64 LSB	@fptr(S + A) */
161#define	R_IA64_PCREL21B		0x49	/* immediate21 form1 S + A - P */
162#define	R_IA64_PCREL21M		0x4a	/* immediate21 form2 S + A - P */
163#define	R_IA64_PCREL21F		0x4b	/* immediate21 form3 S + A - P */
164#define	R_IA64_PCREL32MSB	0x4c	/* word32 MSB	S + A - P */
165#define	R_IA64_PCREL32LSB	0x4d	/* word32 LSB	S + A - P */
166#define	R_IA64_PCREL64MSB	0x4e	/* word64 MSB	S + A - P */
167#define	R_IA64_PCREL64LSB	0x4f	/* word64 LSB	S + A - P */
168#define	R_IA64_LTOFF_FPTR22	0x52	/* immediate22	@ltoff(@fptr(S + A)) */
169#define	R_IA64_LTOFF_FPTR64I	0x53	/* immediate64	@ltoff(@fptr(S + A)) */
170#define	R_IA64_LTOFF_FPTR32MSB	0x54	/* word32 MSB	@ltoff(@fptr(S + A)) */
171#define	R_IA64_LTOFF_FPTR32LSB	0x55	/* word32 LSB	@ltoff(@fptr(S + A)) */
172#define	R_IA64_LTOFF_FPTR64MSB	0x56	/* word64 MSB	@ltoff(@fptr(S + A)) */
173#define	R_IA64_LTOFF_FPTR64LSB	0x57	/* word64 LSB	@ltoff(@fptr(S + A)) */
174#define	R_IA64_SEGREL32MSB	0x5c	/* word32 MSB	@segrel(S + A) */
175#define	R_IA64_SEGREL32LSB	0x5d	/* word32 LSB	@segrel(S + A) */
176#define	R_IA64_SEGREL64MSB	0x5e	/* word64 MSB	@segrel(S + A) */
177#define	R_IA64_SEGREL64LSB	0x5f	/* word64 LSB	@segrel(S + A) */
178#define	R_IA64_SECREL32MSB	0x64	/* word32 MSB	@secrel(S + A) */
179#define	R_IA64_SECREL32LSB	0x65	/* word32 LSB	@secrel(S + A) */
180#define	R_IA64_SECREL64MSB	0x66	/* word64 MSB	@secrel(S + A) */
181#define	R_IA64_SECREL64LSB	0x67	/* word64 LSB	@secrel(S + A) */
182#define	R_IA64_REL32MSB		0x6c	/* word32 MSB	BD + A */
183#define	R_IA64_REL32LSB		0x6d	/* word32 LSB	BD + A */
184#define	R_IA64_REL64MSB		0x6e	/* word64 MSB	BD + A */
185#define	R_IA64_REL64LSB		0x6f	/* word64 LSB	BD + A */
186#define	R_IA64_LTV32MSB		0x74	/* word32 MSB	S + A */
187#define	R_IA64_LTV32LSB		0x75	/* word32 LSB	S + A */
188#define	R_IA64_LTV64MSB		0x76	/* word64 MSB	S + A */
189#define	R_IA64_LTV64LSB		0x77	/* word64 LSB	S + A */
190#define	R_IA64_IPLTMSB		0x80	/* function descriptor MSB special */
191#define	R_IA64_IPLTLSB		0x81	/* function descriptor LSB speciaal */
192#define	R_IA64_SUB		0x85	/* immediate64	A - S */
193#define	R_IA64_LTOFF22X		0x86	/* immediate22	special */
194#define	R_IA64_LDXMOV		0x87	/* immediate22	special */
195
196/* Define "machine" characteristics */
197#define	ELF_TARG_CLASS	ELFCLASS64
198#define	ELF_TARG_DATA	ELFDATA2LSB
199#define	ELF_TARG_MACH	EM_IA_64
200#define	ELF_TARG_VER	1
201
202/* Processor specific dynmamic section tags. */
203
204#define DT_IA64_PLT_RESERVE     0x70000000
205
206#ifdef _KERNEL
207
208/*
209 * On the ia64 we load the dynamic linker where a userland call
210 * to mmap(0, ...) would put it.  The rationale behind this
211 * calculation is that it leaves room for the heap to grow to
212 * its maximum allowed size.
213 */
214#define	ELF_RTLD_ADDR(vmspace) \
215    (round_page((vm_offset_t)(vmspace)->vm_daddr + MAXDSIZ))
216
217#endif /* _KERNEL */
218#endif /* !_MACHINE_ELF_H_ */
219