aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-arm
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-arm')
-rw-r--r--include/asm-arm/elf.h48
1 files changed, 16 insertions, 32 deletions
diff --git a/include/asm-arm/elf.h b/include/asm-arm/elf.h
index f3929307a56b..642382d2c9f0 100644
--- a/include/asm-arm/elf.h
+++ b/include/asm-arm/elf.h
@@ -114,40 +114,24 @@ extern char elf_platform[];
114 have no such handler. */ 114 have no such handler. */
115#define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0 115#define ELF_PLAT_INIT(_r, load_addr) (_r)->ARM_r0 = 0
116 116
117#ifndef CONFIG_IWMMXT
118
119/* Old NetWinder binaries were compiled in such a way that the iBCS
120 heuristic always trips on them. Until these binaries become uncommon
121 enough not to care, don't trust the `ibcs' flag here. In any case
122 there is no other ELF system currently supported by iBCS.
123 @@ Could print a warning message to encourage users to upgrade. */
124#define SET_PERSONALITY(ex,ibcs2) \
125 set_personality(((ex).e_flags & EF_ARM_APCS26 ? PER_LINUX : PER_LINUX_32BIT))
126
127#else
128
129/* 117/*
130 * All iWMMXt capable CPUs don't support 26-bit mode. Yet they can run 118 * Since the FPA coprocessor uses CP1 and CP2, and iWMMXt uses CP0
131 * legacy binaries which used to contain FPA11 floating point instructions 119 * and CP1, we only enable access to the iWMMXt coprocessor if the
132 * that have always been emulated by the kernel. PFA11 and iWMMXt overlap 120 * binary is EABI or softfloat (and thus, guaranteed not to use
133 * on coprocessor 1 space though. We therefore must decide if given task 121 * FPA instructions.)
134 * is allowed to use CP 0 and 1 for iWMMXt, or if they should be blocked
135 * at all times for the prefetch exception handler to catch FPA11 opcodes
136 * and emulate them. The best indication to discriminate those two cases
137 * is the SOFT_FLOAT flag in the ELF header.
138 */ 122 */
139 123#define SET_PERSONALITY(ex, ibcs2) \
140#define SET_PERSONALITY(ex,ibcs2) \ 124 do { \
141do { \ 125 if ((ex).e_flags & EF_ARM_APCS26) { \
142 set_personality(PER_LINUX_32BIT); \ 126 set_personality(PER_LINUX); \
143 if (((ex).e_flags & EF_ARM_EABI_MASK) || \ 127 } else { \
144 ((ex).e_flags & EF_ARM_SOFT_FLOAT)) \ 128 set_personality(PER_LINUX_32BIT); \
145 set_thread_flag(TIF_USING_IWMMXT); \ 129 if (elf_hwcap & HWCAP_IWMMXT && (ex).e_flags & (EF_ARM_EABI_MASK | EF_ARM_SOFT_FLOAT)) \
146 else \ 130 set_thread_flag(TIF_USING_IWMMXT); \
147 clear_thread_flag(TIF_USING_IWMMXT); \ 131 else \
148} while (0) 132 clear_thread_flag(TIF_USING_IWMMXT); \
149 133 } \
150#endif 134 } while (0)
151 135
152#endif 136#endif
153 137