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 | ||
5974eaae | 44 | #ifdef __KERNEL__ |
4a5222ca | 45 | #ifndef __ASSEMBLY__ |
4a5222ca RK |
46 | /* |
47 | * This yields a string that ld.so will use to load implementation | |
48 | * specific libraries for optimization. This is more specific in | |
49 | * intent than poking at uname or /proc/cpuinfo. | |
50 | * | |
51 | * For now we just provide a fairly general string that describes the | |
52 | * processor family. This could be made more specific later if someone | |
53 | * implemented optimisations that require it. 26-bit CPUs give you | |
54 | * "v1l" for ARM2 (no SWP) and "v2l" for anything else (ARM1 isn't | |
55 | * supported). 32-bit CPUs give you "v3[lb]" for anything based on an | |
56 | * ARM6 or ARM7 core and "armv4[lb]" for anything based on a StrongARM-1 | |
57 | * core. | |
58 | */ | |
59 | #define ELF_PLATFORM_SIZE 8 | |
60 | #define ELF_PLATFORM (elf_platform) | |
61 | ||
62 | extern char elf_platform[]; | |
63 | #endif | |
64 | ||
6ff6340a DW |
65 | /* |
66 | * This is used to ensure we don't load something for the wrong architecture. | |
67 | */ | |
4a5222ca RK |
68 | #define elf_check_arch(x) ((x)->e_machine == EM_ARM && ELF_PROC_OK(x)) |
69 | ||
70 | /* | |
71 | * 32-bit code is always OK. Some cpus can do 26-bit, some can't. | |
72 | */ | |
73 | #define ELF_PROC_OK(x) (ELF_THUMB_OK(x) && ELF_26BIT_OK(x)) | |
74 | ||
75 | #define ELF_THUMB_OK(x) \ | |
76 | ((elf_hwcap & HWCAP_THUMB && ((x)->e_entry & 1) == 1) || \ | |
77 | ((x)->e_entry & 3) == 0) | |
78 | ||
79 | #define ELF_26BIT_OK(x) \ | |
80 | ((elf_hwcap & HWCAP_26BIT && (x)->e_flags & EF_ARM_APCS26) || \ | |
81 | ((x)->e_flags & EF_ARM_APCS26) == 0) | |
6ff6340a | 82 | |
1da177e4 LT |
83 | #define USE_ELF_CORE_DUMP |
84 | #define ELF_EXEC_PAGESIZE 4096 | |
85 | ||
86 | /* This is the location that an ET_DYN program is loaded if exec'ed. Typical | |
87 | use of this is to invoke "./ld.so someprog" to test out a new version of | |
88 | the loader. We need to make sure that it is out of the way of the program | |
89 | that it will "exec", and that there is sufficient room for the brk. */ | |
90 | ||
91 | #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | |
92 | ||
93 | /* When the program starts, a1 contains a pointer to a function to be | |
94 | registered with atexit, as per the SVR4 ABI. A value of 0 means we | |
95 | have no such handler. */ | |
96 | #define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0 | |
97 | ||
1da177e4 | 98 | /* |
afe4b25e LB |
99 | * Since the FPA coprocessor uses CP1 and CP2, and iWMMXt uses CP0 |
100 | * and CP1, we only enable access to the iWMMXt coprocessor if the | |
101 | * binary is EABI or softfloat (and thus, guaranteed not to use | |
102 | * FPA instructions.) | |
1da177e4 | 103 | */ |
afe4b25e LB |
104 | #define SET_PERSONALITY(ex, ibcs2) \ |
105 | do { \ | |
106 | if ((ex).e_flags & EF_ARM_APCS26) { \ | |
107 | set_personality(PER_LINUX); \ | |
108 | } else { \ | |
109 | set_personality(PER_LINUX_32BIT); \ | |
110 | if (elf_hwcap & HWCAP_IWMMXT && (ex).e_flags & (EF_ARM_EABI_MASK | EF_ARM_SOFT_FLOAT)) \ | |
111 | set_thread_flag(TIF_USING_IWMMXT); \ | |
112 | else \ | |
113 | clear_thread_flag(TIF_USING_IWMMXT); \ | |
114 | } \ | |
115 | } while (0) | |
1da177e4 LT |
116 | |
117 | #endif | |
118 | ||
119 | #endif |