1 |
1275 |
phoenix |
#ifndef __ASMi386_ELF_H
|
2 |
|
|
#define __ASMi386_ELF_H
|
3 |
|
|
|
4 |
|
|
/*
|
5 |
|
|
* ELF register definitions..
|
6 |
|
|
*/
|
7 |
|
|
|
8 |
|
|
#include <asm/ptrace.h>
|
9 |
|
|
#include <asm/user.h>
|
10 |
|
|
|
11 |
|
|
#include <linux/utsname.h>
|
12 |
|
|
|
13 |
|
|
typedef unsigned long elf_greg_t;
|
14 |
|
|
|
15 |
|
|
#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
|
16 |
|
|
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
17 |
|
|
|
18 |
|
|
typedef struct user_i387_struct elf_fpregset_t;
|
19 |
|
|
typedef struct user_fxsr_struct elf_fpxregset_t;
|
20 |
|
|
|
21 |
|
|
/*
|
22 |
|
|
* This is used to ensure we don't load something for the wrong architecture.
|
23 |
|
|
*/
|
24 |
|
|
#define elf_check_arch(x) \
|
25 |
|
|
(((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
|
26 |
|
|
|
27 |
|
|
/*
|
28 |
|
|
* These are used to set parameters in the core dumps.
|
29 |
|
|
*/
|
30 |
|
|
#define ELF_CLASS ELFCLASS32
|
31 |
|
|
#define ELF_DATA ELFDATA2LSB
|
32 |
|
|
#define ELF_ARCH EM_386
|
33 |
|
|
|
34 |
|
|
/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx
|
35 |
|
|
contains a pointer to a function which might be registered using `atexit'.
|
36 |
|
|
This provides a mean for the dynamic linker to call DT_FINI functions for
|
37 |
|
|
shared libraries that have been loaded before the code runs.
|
38 |
|
|
|
39 |
|
|
A value of 0 tells we have no such handler.
|
40 |
|
|
|
41 |
|
|
We might as well make sure everything else is cleared too (except for %esp),
|
42 |
|
|
just to make things more deterministic.
|
43 |
|
|
*/
|
44 |
|
|
#define ELF_PLAT_INIT(_r, load_addr) do { \
|
45 |
|
|
_r->ebx = 0; _r->ecx = 0; _r->edx = 0; \
|
46 |
|
|
_r->esi = 0; _r->edi = 0; _r->ebp = 0; \
|
47 |
|
|
_r->eax = 0; \
|
48 |
|
|
} while (0)
|
49 |
|
|
|
50 |
|
|
#define USE_ELF_CORE_DUMP
|
51 |
|
|
#define ELF_EXEC_PAGESIZE 4096
|
52 |
|
|
|
53 |
|
|
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
|
54 |
|
|
use of this is to invoke "./ld.so someprog" to test out a new version of
|
55 |
|
|
the loader. We need to make sure that it is out of the way of the program
|
56 |
|
|
that it will "exec", and that there is sufficient room for the brk. */
|
57 |
|
|
|
58 |
|
|
#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
|
59 |
|
|
|
60 |
|
|
/* Wow, the "main" arch needs arch dependent functions too.. :) */
|
61 |
|
|
|
62 |
|
|
/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is
|
63 |
|
|
now struct_user_regs, they are different) */
|
64 |
|
|
|
65 |
|
|
#define ELF_CORE_COPY_REGS(pr_reg, regs) \
|
66 |
|
|
pr_reg[0] = regs->ebx; \
|
67 |
|
|
pr_reg[1] = regs->ecx; \
|
68 |
|
|
pr_reg[2] = regs->edx; \
|
69 |
|
|
pr_reg[3] = regs->esi; \
|
70 |
|
|
pr_reg[4] = regs->edi; \
|
71 |
|
|
pr_reg[5] = regs->ebp; \
|
72 |
|
|
pr_reg[6] = regs->eax; \
|
73 |
|
|
pr_reg[7] = regs->xds; \
|
74 |
|
|
pr_reg[8] = regs->xes; \
|
75 |
|
|
/* fake once used fs and gs selectors? */ \
|
76 |
|
|
pr_reg[9] = regs->xds; /* was fs and __fs */ \
|
77 |
|
|
pr_reg[10] = regs->xds; /* was gs and __gs */ \
|
78 |
|
|
pr_reg[11] = regs->orig_eax; \
|
79 |
|
|
pr_reg[12] = regs->eip; \
|
80 |
|
|
pr_reg[13] = regs->xcs; \
|
81 |
|
|
pr_reg[14] = regs->eflags; \
|
82 |
|
|
pr_reg[15] = regs->esp; \
|
83 |
|
|
pr_reg[16] = regs->xss;
|
84 |
|
|
|
85 |
|
|
/* This yields a mask that user programs can use to figure out what
|
86 |
|
|
instruction set this CPU supports. This could be done in user space,
|
87 |
|
|
but it's not easy, and we've already done it here. */
|
88 |
|
|
|
89 |
|
|
#define ELF_HWCAP (boot_cpu_data.x86_capability[0])
|
90 |
|
|
|
91 |
|
|
/* This yields a string that ld.so will use to load implementation
|
92 |
|
|
specific libraries for optimization. This is more specific in
|
93 |
|
|
intent than poking at uname or /proc/cpuinfo.
|
94 |
|
|
|
95 |
|
|
For the moment, we have only optimizations for the Intel generations,
|
96 |
|
|
but that could change... */
|
97 |
|
|
|
98 |
|
|
#define ELF_PLATFORM (system_utsname.machine)
|
99 |
|
|
|
100 |
|
|
#ifdef __KERNEL__
|
101 |
|
|
#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
|
102 |
|
|
#endif
|
103 |
|
|
|
104 |
|
|
#endif
|