1#ifndef _ASM_X86_ELF_H
2#define _ASM_X86_ELF_H
3
4
5
6
7
8#include <asm/ptrace.h>
9#include <asm/user.h>
10#include <asm/auxvec.h>
11
12typedef unsigned long elf_greg_t;
13
14#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
15typedef elf_greg_t elf_gregset_t[ELF_NGREG];
16
17typedef struct user_i387_struct elf_fpregset_t;
18
19#ifdef __i386__
20
21typedef struct user_fxsr_struct elf_fpxregset_t;
22
23#define R_386_NONE 0
24#define R_386_32 1
25#define R_386_PC32 2
26#define R_386_GOT32 3
27#define R_386_PLT32 4
28#define R_386_COPY 5
29#define R_386_GLOB_DAT 6
30#define R_386_JMP_SLOT 7
31#define R_386_RELATIVE 8
32#define R_386_GOTOFF 9
33#define R_386_GOTPC 10
34#define R_386_NUM 11
35
36
37
38
39#define ELF_CLASS ELFCLASS32
40#define ELF_DATA ELFDATA2LSB
41#define ELF_ARCH EM_386
42
43#else
44
45
46#define R_X86_64_NONE 0
47#define R_X86_64_64 1
48#define R_X86_64_PC32 2
49#define R_X86_64_GOT32 3
50#define R_X86_64_PLT32 4
51#define R_X86_64_COPY 5
52#define R_X86_64_GLOB_DAT 6
53#define R_X86_64_JUMP_SLOT 7
54#define R_X86_64_RELATIVE 8
55#define R_X86_64_GOTPCREL 9
56
57#define R_X86_64_32 10
58#define R_X86_64_32S 11
59#define R_X86_64_16 12
60#define R_X86_64_PC16 13
61#define R_X86_64_8 14
62#define R_X86_64_PC8 15
63
64#define R_X86_64_NUM 16
65
66
67
68
69#define ELF_CLASS ELFCLASS64
70#define ELF_DATA ELFDATA2LSB
71#define ELF_ARCH EM_X86_64
72
73#endif
74
75#include <asm/vdso.h>
76
77extern unsigned int vdso_enabled;
78
79
80
81
82#define elf_check_arch_ia32(x) \
83 (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
84
85#include <asm/processor.h>
86#include <asm/system.h>
87
88#ifdef CONFIG_X86_32
89#include <asm/desc.h>
90
91#define elf_check_arch(x) elf_check_arch_ia32(x)
92
93
94
95
96
97
98
99
100
101
102
103#define ELF_PLAT_INIT(_r, load_addr) \
104 do { \
105 _r->bx = 0; _r->cx = 0; _r->dx = 0; \
106 _r->si = 0; _r->di = 0; _r->bp = 0; \
107 _r->ax = 0; \
108} while (0)
109
110
111
112
113
114
115#define ELF_CORE_COPY_REGS_COMMON(pr_reg, regs) \
116do { \
117 pr_reg[0] = regs->bx; \
118 pr_reg[1] = regs->cx; \
119 pr_reg[2] = regs->dx; \
120 pr_reg[3] = regs->si; \
121 pr_reg[4] = regs->di; \
122 pr_reg[5] = regs->bp; \
123 pr_reg[6] = regs->ax; \
124 pr_reg[7] = regs->ds & 0xffff; \
125 pr_reg[8] = regs->es & 0xffff; \
126 pr_reg[9] = regs->fs & 0xffff; \
127 pr_reg[11] = regs->orig_ax; \
128 pr_reg[12] = regs->ip; \
129 pr_reg[13] = regs->cs & 0xffff; \
130 pr_reg[14] = regs->flags; \
131 pr_reg[15] = regs->sp; \
132 pr_reg[16] = regs->ss & 0xffff; \
133} while (0);
134
135#define ELF_CORE_COPY_REGS(pr_reg, regs) \
136do { \
137 ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\
138 pr_reg[10] = get_user_gs(regs); \
139} while (0);
140
141#define ELF_CORE_COPY_KERNEL_REGS(pr_reg, regs) \
142do { \
143 ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\
144 savesegment(gs, pr_reg[10]); \
145} while (0);
146
147#define ELF_PLATFORM (utsname()->machine)
148#define set_personality_64bit() do { } while (0)
149
150#else
151
152
153
154
155#define elf_check_arch(x) \
156 ((x)->e_machine == EM_X86_64)
157
158#define compat_elf_check_arch(x) elf_check_arch_ia32(x)
159
160static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp)
161{
162 loadsegment(fs, 0);
163 loadsegment(ds, __USER32_DS);
164 loadsegment(es, __USER32_DS);
165 load_gs_index(0);
166 regs->ip = ip;
167 regs->sp = sp;
168 regs->flags = X86_EFLAGS_IF;
169 regs->cs = __USER32_CS;
170 regs->ss = __USER32_DS;
171}
172
173static inline void elf_common_init(struct thread_struct *t,
174 struct pt_regs *regs, const u16 ds)
175{
176 regs->ax = regs->bx = regs->cx = regs->dx = 0;
177 regs->si = regs->di = regs->bp = 0;
178 regs->r8 = regs->r9 = regs->r10 = regs->r11 = 0;
179 regs->r12 = regs->r13 = regs->r14 = regs->r15 = 0;
180 t->fs = t->gs = 0;
181 t->fsindex = t->gsindex = 0;
182 t->ds = t->es = ds;
183}
184
185#define ELF_PLAT_INIT(_r, load_addr) \
186do { \
187 elf_common_init(¤t->thread, _r, 0); \
188 clear_thread_flag(TIF_IA32); \
189} while (0)
190
191#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
192 elf_common_init(¤t->thread, regs, __USER_DS)
193
194#define compat_start_thread(regs, ip, sp) \
195do { \
196 start_ia32_thread(regs, ip, sp); \
197 set_fs(USER_DS); \
198} while (0)
199
200#define COMPAT_SET_PERSONALITY(ex) \
201do { \
202 if (test_thread_flag(TIF_IA32)) \
203 clear_thread_flag(TIF_ABI_PENDING); \
204 else \
205 set_thread_flag(TIF_ABI_PENDING); \
206 current->personality |= force_personality32; \
207} while (0)
208
209#define COMPAT_ELF_PLATFORM ("i686")
210
211
212
213
214
215
216
217#define ELF_CORE_COPY_REGS(pr_reg, regs) \
218do { \
219 unsigned v; \
220 (pr_reg)[0] = (regs)->r15; \
221 (pr_reg)[1] = (regs)->r14; \
222 (pr_reg)[2] = (regs)->r13; \
223 (pr_reg)[3] = (regs)->r12; \
224 (pr_reg)[4] = (regs)->bp; \
225 (pr_reg)[5] = (regs)->bx; \
226 (pr_reg)[6] = (regs)->r11; \
227 (pr_reg)[7] = (regs)->r10; \
228 (pr_reg)[8] = (regs)->r9; \
229 (pr_reg)[9] = (regs)->r8; \
230 (pr_reg)[10] = (regs)->ax; \
231 (pr_reg)[11] = (regs)->cx; \
232 (pr_reg)[12] = (regs)->dx; \
233 (pr_reg)[13] = (regs)->si; \
234 (pr_reg)[14] = (regs)->di; \
235 (pr_reg)[15] = (regs)->orig_ax; \
236 (pr_reg)[16] = (regs)->ip; \
237 (pr_reg)[17] = (regs)->cs; \
238 (pr_reg)[18] = (regs)->flags; \
239 (pr_reg)[19] = (regs)->sp; \
240 (pr_reg)[20] = (regs)->ss; \
241 (pr_reg)[21] = current->thread.fs; \
242 (pr_reg)[22] = current->thread.gs; \
243 asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \
244 asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \
245 asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \
246 asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \
247} while (0);
248
249
250#define ELF_PLATFORM ("x86_64")
251extern void set_personality_64bit(void);
252extern unsigned int sysctl_vsyscall32;
253extern int force_personality32;
254
255#endif
256
257#define CORE_DUMP_USE_REGSET
258#define USE_ELF_CORE_DUMP
259#define ELF_EXEC_PAGESIZE 4096
260
261
262
263
264
265
266#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
267
268
269
270
271
272#define ELF_HWCAP (boot_cpu_data.x86_capability[0])
273
274
275
276
277
278
279
280
281#define SET_PERSONALITY(ex) set_personality_64bit()
282
283
284
285
286
287#define elf_read_implies_exec(ex, executable_stack) \
288 (executable_stack != EXSTACK_DISABLE_X)
289
290struct task_struct;
291
292#define ARCH_DLINFO_IA32(vdso_enabled) \
293do { \
294 if (vdso_enabled) { \
295 NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
296 NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
297 } \
298} while (0)
299
300#ifdef CONFIG_X86_32
301
302#define STACK_RND_MASK (0x7ff)
303
304#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO))
305
306#define ARCH_DLINFO ARCH_DLINFO_IA32(vdso_enabled)
307
308
309
310#else
311
312#define VDSO_HIGH_BASE 0xffffe000U
313
314
315#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff)
316
317#define ARCH_DLINFO \
318do { \
319 if (vdso_enabled) \
320 NEW_AUX_ENT(AT_SYSINFO_EHDR, \
321 (unsigned long)current->mm->context.vdso); \
322} while (0)
323
324#define AT_SYSINFO 32
325
326#define COMPAT_ARCH_DLINFO ARCH_DLINFO_IA32(sysctl_vsyscall32)
327
328#define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000)
329
330#endif
331
332#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso)
333
334#define VDSO_ENTRY \
335 ((unsigned long)VDSO32_SYMBOL(VDSO_CURRENT_BASE, vsyscall))
336
337struct linux_binprm;
338
339#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
340extern int arch_setup_additional_pages(struct linux_binprm *bprm,
341 int uses_interp);
342
343extern int syscall32_setup_pages(struct linux_binprm *, int exstack);
344#define compat_arch_setup_additional_pages syscall32_setup_pages
345
346extern unsigned long arch_randomize_brk(struct mm_struct *mm);
347#define arch_randomize_brk arch_randomize_brk
348
349#endif
350