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