diff options
Diffstat (limited to 'arch/arm/include/asm/elf.h')
-rw-r--r-- | arch/arm/include/asm/elf.h | 72 |
1 files changed, 34 insertions, 38 deletions
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index 4ca751627489..5be016980c19 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h | |||
@@ -3,7 +3,6 @@ | |||
3 | 3 | ||
4 | #include <asm/hwcap.h> | 4 | #include <asm/hwcap.h> |
5 | 5 | ||
6 | #ifndef __ASSEMBLY__ | ||
7 | /* | 6 | /* |
8 | * ELF register definitions.. | 7 | * ELF register definitions.. |
9 | */ | 8 | */ |
@@ -17,12 +16,34 @@ typedef unsigned long elf_freg_t[3]; | |||
17 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | 16 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; |
18 | 17 | ||
19 | typedef struct user_fp elf_fpregset_t; | 18 | typedef struct user_fp elf_fpregset_t; |
20 | #endif | ||
21 | 19 | ||
22 | #define EM_ARM 40 | 20 | #define EM_ARM 40 |
23 | #define EF_ARM_APCS26 0x08 | 21 | |
24 | #define EF_ARM_SOFT_FLOAT 0x200 | 22 | #define EF_ARM_EABI_MASK 0xff000000 |
25 | #define EF_ARM_EABI_MASK 0xFF000000 | 23 | #define EF_ARM_EABI_UNKNOWN 0x00000000 |
24 | #define EF_ARM_EABI_VER1 0x01000000 | ||
25 | #define EF_ARM_EABI_VER2 0x02000000 | ||
26 | #define EF_ARM_EABI_VER3 0x03000000 | ||
27 | #define EF_ARM_EABI_VER4 0x04000000 | ||
28 | #define EF_ARM_EABI_VER5 0x05000000 | ||
29 | |||
30 | #define EF_ARM_BE8 0x00800000 /* ABI 4,5 */ | ||
31 | #define EF_ARM_LE8 0x00400000 /* ABI 4,5 */ | ||
32 | #define EF_ARM_MAVERICK_FLOAT 0x00000800 /* ABI 0 */ | ||
33 | #define EF_ARM_VFP_FLOAT 0x00000400 /* ABI 0 */ | ||
34 | #define EF_ARM_SOFT_FLOAT 0x00000200 /* ABI 0 */ | ||
35 | #define EF_ARM_OLD_ABI 0x00000100 /* ABI 0 */ | ||
36 | #define EF_ARM_NEW_ABI 0x00000080 /* ABI 0 */ | ||
37 | #define EF_ARM_ALIGN8 0x00000040 /* ABI 0 */ | ||
38 | #define EF_ARM_PIC 0x00000020 /* ABI 0 */ | ||
39 | #define EF_ARM_MAPSYMSFIRST 0x00000010 /* ABI 2 */ | ||
40 | #define EF_ARM_APCS_FLOAT 0x00000010 /* ABI 0, floats in fp regs */ | ||
41 | #define EF_ARM_DYNSYMSUSESEGIDX 0x00000008 /* ABI 2 */ | ||
42 | #define EF_ARM_APCS_26 0x00000008 /* ABI 0 */ | ||
43 | #define EF_ARM_SYMSARESORTED 0x00000004 /* ABI 1,2 */ | ||
44 | #define EF_ARM_INTERWORK 0x00000004 /* ABI 0 */ | ||
45 | #define EF_ARM_HASENTRY 0x00000002 /* All */ | ||
46 | #define EF_ARM_RELEXEC 0x00000001 /* All */ | ||
26 | 47 | ||
27 | #define R_ARM_NONE 0 | 48 | #define R_ARM_NONE 0 |
28 | #define R_ARM_PC24 1 | 49 | #define R_ARM_PC24 1 |
@@ -41,7 +62,6 @@ typedef struct user_fp elf_fpregset_t; | |||
41 | #endif | 62 | #endif |
42 | #define ELF_ARCH EM_ARM | 63 | #define ELF_ARCH EM_ARM |
43 | 64 | ||
44 | #ifndef __ASSEMBLY__ | ||
45 | /* | 65 | /* |
46 | * This yields a string that ld.so will use to load implementation | 66 | * This yields a string that ld.so will use to load implementation |
47 | * specific libraries for optimization. This is more specific in | 67 | * specific libraries for optimization. This is more specific in |
@@ -59,25 +79,17 @@ typedef struct user_fp elf_fpregset_t; | |||
59 | #define ELF_PLATFORM (elf_platform) | 79 | #define ELF_PLATFORM (elf_platform) |
60 | 80 | ||
61 | extern char elf_platform[]; | 81 | extern char elf_platform[]; |
62 | #endif | ||
63 | 82 | ||
64 | /* | 83 | struct elf32_hdr; |
65 | * This is used to ensure we don't load something for the wrong architecture. | ||
66 | */ | ||
67 | #define elf_check_arch(x) ((x)->e_machine == EM_ARM && ELF_PROC_OK(x)) | ||
68 | 84 | ||
69 | /* | 85 | /* |
70 | * 32-bit code is always OK. Some cpus can do 26-bit, some can't. | 86 | * This is used to ensure we don't load something for the wrong architecture. |
71 | */ | 87 | */ |
72 | #define ELF_PROC_OK(x) (ELF_THUMB_OK(x) && ELF_26BIT_OK(x)) | 88 | extern int elf_check_arch(const struct elf32_hdr *); |
73 | 89 | #define elf_check_arch elf_check_arch | |
74 | #define ELF_THUMB_OK(x) \ | ||
75 | ((elf_hwcap & HWCAP_THUMB && ((x)->e_entry & 1) == 1) || \ | ||
76 | ((x)->e_entry & 3) == 0) | ||
77 | 90 | ||
78 | #define ELF_26BIT_OK(x) \ | 91 | extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int); |
79 | ((elf_hwcap & HWCAP_26BIT && (x)->e_flags & EF_ARM_APCS26) || \ | 92 | #define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk) |
80 | ((x)->e_flags & EF_ARM_APCS26) == 0) | ||
81 | 93 | ||
82 | #define USE_ELF_CORE_DUMP | 94 | #define USE_ELF_CORE_DUMP |
83 | #define ELF_EXEC_PAGESIZE 4096 | 95 | #define ELF_EXEC_PAGESIZE 4096 |
@@ -94,23 +106,7 @@ extern char elf_platform[]; | |||
94 | have no such handler. */ | 106 | have no such handler. */ |
95 | #define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0 | 107 | #define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0 |
96 | 108 | ||
97 | /* | 109 | extern void elf_set_personality(const struct elf32_hdr *); |
98 | * Since the FPA coprocessor uses CP1 and CP2, and iWMMXt uses CP0 | 110 | #define SET_PERSONALITY(ex, ibcs2) elf_set_personality(&(ex)) |
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.) | ||
102 | */ | ||
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) | ||
115 | 111 | ||
116 | #endif | 112 | #endif |