Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef __ASMARM_ELF_H |
2 | #define __ASMARM_ELF_H | |
3 | ||
4a5222ca | 4 | #ifndef __ASSEMBLY__ |
1da177e4 LT |
5 | /* |
6 | * ELF register definitions.. | |
7 | */ | |
1da177e4 LT |
8 | #include <asm/ptrace.h> |
9 | #include <asm/user.h> | |
1da177e4 LT |
10 | |
11 | typedef unsigned long elf_greg_t; | |
12 | typedef unsigned long elf_freg_t[3]; | |
13 | ||
4a5222ca RK |
14 | #define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t)) |
15 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | |
16 | ||
17 | typedef struct user_fp elf_fpregset_t; | |
18 | #endif | |
19 | ||
1da177e4 LT |
20 | #define EM_ARM 40 |
21 | #define EF_ARM_APCS26 0x08 | |
22 | #define EF_ARM_SOFT_FLOAT 0x200 | |
23 | #define EF_ARM_EABI_MASK 0xFF000000 | |
24 | ||
25 | #define R_ARM_NONE 0 | |
26 | #define R_ARM_PC24 1 | |
27 | #define R_ARM_ABS32 2 | |
c2e26114 DJ |
28 | #define R_ARM_CALL 28 |
29 | #define R_ARM_JUMP24 29 | |
1da177e4 | 30 | |
1da177e4 LT |
31 | /* |
32 | * These are used to set parameters in the core dumps. | |
33 | */ | |
34 | #define ELF_CLASS ELFCLASS32 | |
35 | #ifdef __ARMEB__ | |
718a30a5 | 36 | #define ELF_DATA ELFDATA2MSB |
1da177e4 | 37 | #else |
718a30a5 | 38 | #define ELF_DATA ELFDATA2LSB |
1da177e4 LT |
39 | #endif |
40 | #define ELF_ARCH EM_ARM | |
41 | ||
5974eaae RK |
42 | /* |
43 | * HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP | |
44 | */ | |
45 | #define HWCAP_SWP 1 | |
46 | #define HWCAP_HALF 2 | |
47 | #define HWCAP_THUMB 4 | |
48 | #define HWCAP_26BIT 8 /* Play it safe */ | |
49 | #define HWCAP_FAST_MULT 16 | |
50 | #define HWCAP_FPA 32 | |
51 | #define HWCAP_VFP 64 | |
52 | #define HWCAP_EDSP 128 | |
53 | #define HWCAP_JAVA 256 | |
54 | #define HWCAP_IWMMXT 512 | |
99e4a6dd | 55 | #define HWCAP_CRUNCH 1024 |
6ff6340a | 56 | |
5974eaae | 57 | #ifdef __KERNEL__ |
4a5222ca RK |
58 | #ifndef __ASSEMBLY__ |
59 | /* | |
60 | * This yields a mask that user programs can use to figure out what | |
61 | * instruction set this cpu supports. | |
62 | */ | |
63 | #define ELF_HWCAP (elf_hwcap) | |
64 | extern unsigned int elf_hwcap; | |
65 | ||
66 | /* | |
67 | * This yields a string that ld.so will use to load implementation | |
68 | * specific libraries for optimization. This is more specific in | |
69 | * intent than poking at uname or /proc/cpuinfo. | |
70 | * | |
71 | * For now we just provide a fairly general string that describes the | |
72 | * processor family. This could be made more specific later if someone | |
73 | * implemented optimisations that require it. 26-bit CPUs give you | |
74 | * "v1l" for ARM2 (no SWP) and "v2l" for anything else (ARM1 isn't | |
75 | * supported). 32-bit CPUs give you "v3[lb]" for anything based on an | |
76 | * ARM6 or ARM7 core and "armv4[lb]" for anything based on a StrongARM-1 | |
77 | * core. | |
78 | */ | |
79 | #define ELF_PLATFORM_SIZE 8 | |
80 | #define ELF_PLATFORM (elf_platform) | |
81 | ||
82 | extern char elf_platform[]; | |
83 | #endif | |
84 | ||
6ff6340a DW |
85 | /* |
86 | * This is used to ensure we don't load something for the wrong architecture. | |
87 | */ | |
4a5222ca RK |
88 | #define elf_check_arch(x) ((x)->e_machine == EM_ARM && ELF_PROC_OK(x)) |
89 | ||
90 | /* | |
91 | * 32-bit code is always OK. Some cpus can do 26-bit, some can't. | |
92 | */ | |
93 | #define ELF_PROC_OK(x) (ELF_THUMB_OK(x) && ELF_26BIT_OK(x)) | |
94 | ||
95 | #define ELF_THUMB_OK(x) \ | |
96 | ((elf_hwcap & HWCAP_THUMB && ((x)->e_entry & 1) == 1) || \ | |
97 | ((x)->e_entry & 3) == 0) | |
98 | ||
99 | #define ELF_26BIT_OK(x) \ | |
100 | ((elf_hwcap & HWCAP_26BIT && (x)->e_flags & EF_ARM_APCS26) || \ | |
101 | ((x)->e_flags & EF_ARM_APCS26) == 0) | |
6ff6340a | 102 | |
1da177e4 LT |
103 | #define USE_ELF_CORE_DUMP |
104 | #define ELF_EXEC_PAGESIZE 4096 | |
105 | ||
106 | /* This is the location that an ET_DYN program is loaded if exec'ed. Typical | |
107 | use of this is to invoke "./ld.so someprog" to test out a new version of | |
108 | the loader. We need to make sure that it is out of the way of the program | |
109 | that it will "exec", and that there is sufficient room for the brk. */ | |
110 | ||
111 | #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | |
112 | ||
113 | /* When the program starts, a1 contains a pointer to a function to be | |
114 | registered with atexit, as per the SVR4 ABI. A value of 0 means we | |
115 | have no such handler. */ | |
116 | #define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0 | |
117 | ||
1da177e4 | 118 | /* |
afe4b25e LB |
119 | * Since the FPA coprocessor uses CP1 and CP2, and iWMMXt uses CP0 |
120 | * and CP1, we only enable access to the iWMMXt coprocessor if the | |
121 | * binary is EABI or softfloat (and thus, guaranteed not to use | |
122 | * FPA instructions.) | |
1da177e4 | 123 | */ |
afe4b25e LB |
124 | #define SET_PERSONALITY(ex, ibcs2) \ |
125 | do { \ | |
126 | if ((ex).e_flags & EF_ARM_APCS26) { \ | |
127 | set_personality(PER_LINUX); \ | |
128 | } else { \ | |
129 | set_personality(PER_LINUX_32BIT); \ | |
130 | if (elf_hwcap & HWCAP_IWMMXT && (ex).e_flags & (EF_ARM_EABI_MASK | EF_ARM_SOFT_FLOAT)) \ | |
131 | set_thread_flag(TIF_USING_IWMMXT); \ | |
132 | else \ | |
133 | clear_thread_flag(TIF_USING_IWMMXT); \ | |
134 | } \ | |
135 | } while (0) | |
1da177e4 LT |
136 | |
137 | #endif | |
138 | ||
139 | #endif |