1
2
3
4
5
6
7
8#ifndef _ASM_ELF_H
9#define _ASM_ELF_H
10
11#include <linux/fs.h>
12#include <uapi/linux/elf.h>
13
14#include <asm/cpu-info.h>
15#include <asm/current.h>
16
17
18
19#define EF_MIPS_ARCH_1 0x00000000
20#define EF_MIPS_ARCH_2 0x10000000
21#define EF_MIPS_ARCH_3 0x20000000
22#define EF_MIPS_ARCH_4 0x30000000
23#define EF_MIPS_ARCH_5 0x40000000
24#define EF_MIPS_ARCH_32 0x50000000
25#define EF_MIPS_ARCH_64 0x60000000
26#define EF_MIPS_ARCH_32R2 0x70000000
27#define EF_MIPS_ARCH_64R2 0x80000000
28
29
30#define EF_MIPS_ABI_O32 0x00001000
31#define EF_MIPS_ABI_O64 0x00002000
32
33#define PT_MIPS_REGINFO 0x70000000
34#define PT_MIPS_RTPROC 0x70000001
35#define PT_MIPS_OPTIONS 0x70000002
36#define PT_MIPS_ABIFLAGS 0x70000003
37
38
39#define EF_MIPS_NOREORDER 0x00000001
40#define EF_MIPS_PIC 0x00000002
41#define EF_MIPS_CPIC 0x00000004
42#define EF_MIPS_ABI2 0x00000020
43#define EF_MIPS_OPTIONS_FIRST 0x00000080
44#define EF_MIPS_32BITMODE 0x00000100
45#define EF_MIPS_FP64 0x00000200
46#define EF_MIPS_ABI 0x0000f000
47#define EF_MIPS_ARCH 0xf0000000
48
49#define DT_MIPS_RLD_VERSION 0x70000001
50#define DT_MIPS_TIME_STAMP 0x70000002
51#define DT_MIPS_ICHECKSUM 0x70000003
52#define DT_MIPS_IVERSION 0x70000004
53#define DT_MIPS_FLAGS 0x70000005
54 #define RHF_NONE 0x00000000
55 #define RHF_HARDWAY 0x00000001
56 #define RHF_NOTPOT 0x00000002
57 #define RHF_SGI_ONLY 0x00000010
58#define DT_MIPS_BASE_ADDRESS 0x70000006
59#define DT_MIPS_CONFLICT 0x70000008
60#define DT_MIPS_LIBLIST 0x70000009
61#define DT_MIPS_LOCAL_GOTNO 0x7000000a
62#define DT_MIPS_CONFLICTNO 0x7000000b
63#define DT_MIPS_LIBLISTNO 0x70000010
64#define DT_MIPS_SYMTABNO 0x70000011
65#define DT_MIPS_UNREFEXTNO 0x70000012
66#define DT_MIPS_GOTSYM 0x70000013
67#define DT_MIPS_HIPAGENO 0x70000014
68#define DT_MIPS_RLD_MAP 0x70000016
69
70#define R_MIPS_NONE 0
71#define R_MIPS_16 1
72#define R_MIPS_32 2
73#define R_MIPS_REL32 3
74#define R_MIPS_26 4
75#define R_MIPS_HI16 5
76#define R_MIPS_LO16 6
77#define R_MIPS_GPREL16 7
78#define R_MIPS_LITERAL 8
79#define R_MIPS_GOT16 9
80#define R_MIPS_PC16 10
81#define R_MIPS_CALL16 11
82#define R_MIPS_GPREL32 12
83
84
85#define R_MIPS_UNUSED1 13
86#define R_MIPS_UNUSED2 14
87#define R_MIPS_UNUSED3 15
88#define R_MIPS_SHIFT5 16
89#define R_MIPS_SHIFT6 17
90#define R_MIPS_64 18
91#define R_MIPS_GOT_DISP 19
92#define R_MIPS_GOT_PAGE 20
93#define R_MIPS_GOT_OFST 21
94
95
96
97
98#define R_MIPS_GOTHI16 22
99#define R_MIPS_GOTLO16 23
100#define R_MIPS_SUB 24
101#define R_MIPS_INSERT_A 25
102#define R_MIPS_INSERT_B 26
103#define R_MIPS_DELETE 27
104#define R_MIPS_HIGHER 28
105#define R_MIPS_HIGHEST 29
106
107
108
109
110#define R_MIPS_CALLHI16 30
111#define R_MIPS_CALLLO16 31
112
113
114
115#define R_MIPS_LOVENDOR 100
116#define R_MIPS_HIVENDOR 127
117
118#define SHN_MIPS_ACCOMON 0xff00
119#define SHN_MIPS_TEXT 0xff01
120#define SHN_MIPS_DATA 0xff02
121#define SHN_MIPS_SCOMMON 0xff03
122#define SHN_MIPS_SUNDEFINED 0xff04
123
124#define SHT_MIPS_LIST 0x70000000
125#define SHT_MIPS_CONFLICT 0x70000002
126#define SHT_MIPS_GPTAB 0x70000003
127#define SHT_MIPS_UCODE 0x70000004
128#define SHT_MIPS_DEBUG 0x70000005
129#define SHT_MIPS_REGINFO 0x70000006
130#define SHT_MIPS_PACKAGE 0x70000007
131#define SHT_MIPS_PACKSYM 0x70000008
132#define SHT_MIPS_RELD 0x70000009
133#define SHT_MIPS_IFACE 0x7000000b
134#define SHT_MIPS_CONTENT 0x7000000c
135#define SHT_MIPS_OPTIONS 0x7000000d
136#define SHT_MIPS_SHDR 0x70000010
137#define SHT_MIPS_FDESC 0x70000011
138#define SHT_MIPS_EXTSYM 0x70000012
139#define SHT_MIPS_DENSE 0x70000013
140#define SHT_MIPS_PDESC 0x70000014
141#define SHT_MIPS_LOCSYM 0x70000015
142#define SHT_MIPS_AUXSYM 0x70000016
143#define SHT_MIPS_OPTSYM 0x70000017
144#define SHT_MIPS_LOCSTR 0x70000018
145#define SHT_MIPS_LINE 0x70000019
146#define SHT_MIPS_RFDESC 0x7000001a
147#define SHT_MIPS_DELTASYM 0x7000001b
148#define SHT_MIPS_DELTAINST 0x7000001c
149#define SHT_MIPS_DELTACLASS 0x7000001d
150#define SHT_MIPS_DWARF 0x7000001e
151#define SHT_MIPS_DELTADECL 0x7000001f
152#define SHT_MIPS_SYMBOL_LIB 0x70000020
153#define SHT_MIPS_EVENTS 0x70000021
154#define SHT_MIPS_TRANSLATE 0x70000022
155#define SHT_MIPS_PIXIE 0x70000023
156#define SHT_MIPS_XLATE 0x70000024
157#define SHT_MIPS_XLATE_DEBUG 0x70000025
158#define SHT_MIPS_WHIRL 0x70000026
159#define SHT_MIPS_EH_REGION 0x70000027
160#define SHT_MIPS_XLATE_OLD 0x70000028
161#define SHT_MIPS_PDR_EXCEPTION 0x70000029
162
163#define SHF_MIPS_GPREL 0x10000000
164#define SHF_MIPS_MERGE 0x20000000
165#define SHF_MIPS_ADDR 0x40000000
166#define SHF_MIPS_STRING 0x80000000
167#define SHF_MIPS_NOSTRIP 0x08000000
168#define SHF_MIPS_LOCAL 0x04000000
169#define SHF_MIPS_NAMES 0x02000000
170#define SHF_MIPS_NODUPES 0x01000000
171
172#ifndef ELF_ARCH
173
174#define ELF_NGREG 45
175#define ELF_NFPREG 33
176
177typedef unsigned long elf_greg_t;
178typedef elf_greg_t elf_gregset_t[ELF_NGREG];
179
180typedef double elf_fpreg_t;
181typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
182
183struct mips_elf_abiflags_v0 {
184 uint16_t version;
185 uint8_t isa_level;
186 uint8_t isa_rev;
187
188 uint8_t gpr_size;
189 uint8_t cpr1_size;
190 uint8_t cpr2_size;
191 uint8_t fp_abi;
192 uint32_t isa_ext;
193 uint32_t ases;
194 uint32_t flags1;
195 uint32_t flags2;
196};
197
198#define MIPS_ABI_FP_ANY 0
199#define MIPS_ABI_FP_DOUBLE 1
200#define MIPS_ABI_FP_SINGLE 2
201#define MIPS_ABI_FP_SOFT 3
202#define MIPS_ABI_FP_OLD_64 4
203#define MIPS_ABI_FP_XX 5
204#define MIPS_ABI_FP_64 6
205#define MIPS_ABI_FP_64A 7
206
207#ifdef CONFIG_32BIT
208
209
210
211
212
213
214
215#ifdef CONFIG_MIPS_O32_FP64_SUPPORT
216# define __MIPS_O32_FP64_MUST_BE_ZERO 0
217#else
218# define __MIPS_O32_FP64_MUST_BE_ZERO EF_MIPS_FP64
219#endif
220
221
222
223
224#define elf_check_arch(hdr) \
225({ \
226 int __res = 1; \
227 struct elfhdr *__h = (hdr); \
228 \
229 if (__h->e_machine != EM_MIPS) \
230 __res = 0; \
231 if (__h->e_ident[EI_CLASS] != ELFCLASS32) \
232 __res = 0; \
233 if ((__h->e_flags & EF_MIPS_ABI2) != 0) \
234 __res = 0; \
235 if (((__h->e_flags & EF_MIPS_ABI) != 0) && \
236 ((__h->e_flags & EF_MIPS_ABI) != EF_MIPS_ABI_O32)) \
237 __res = 0; \
238 if (__h->e_flags & __MIPS_O32_FP64_MUST_BE_ZERO) \
239 __res = 0; \
240 \
241 __res; \
242})
243
244
245
246
247#define ELF_CLASS ELFCLASS32
248
249#endif
250
251#ifdef CONFIG_64BIT
252
253
254
255#define elf_check_arch(hdr) \
256({ \
257 int __res = 1; \
258 struct elfhdr *__h = (hdr); \
259 \
260 if (__h->e_machine != EM_MIPS) \
261 __res = 0; \
262 if (__h->e_ident[EI_CLASS] != ELFCLASS64) \
263 __res = 0; \
264 \
265 __res; \
266})
267
268
269
270
271#define ELF_CLASS ELFCLASS64
272
273#endif
274
275
276
277
278#ifdef __MIPSEB__
279#define ELF_DATA ELFDATA2MSB
280#elif defined(__MIPSEL__)
281#define ELF_DATA ELFDATA2LSB
282#endif
283#define ELF_ARCH EM_MIPS
284
285#endif
286
287struct mips_abi;
288
289extern struct mips_abi mips_abi;
290extern struct mips_abi mips_abi_32;
291extern struct mips_abi mips_abi_n32;
292
293#ifdef CONFIG_32BIT
294
295#define SET_PERSONALITY2(ex, state) \
296do { \
297 if (personality(current->personality) != PER_LINUX) \
298 set_personality(PER_LINUX); \
299 \
300 clear_thread_flag(TIF_HYBRID_FPREGS); \
301 set_thread_flag(TIF_32BIT_FPREGS); \
302 \
303 mips_set_personality_fp(state); \
304 \
305 current->thread.abi = &mips_abi; \
306 \
307 current->thread.fpu.fcr31 = boot_cpu_data.fpu_csr31; \
308} while (0)
309
310#endif
311
312#ifdef CONFIG_64BIT
313
314#ifdef CONFIG_MIPS32_N32
315#define __SET_PERSONALITY32_N32() \
316 do { \
317 set_thread_flag(TIF_32BIT_ADDR); \
318 current->thread.abi = &mips_abi_n32; \
319 } while (0)
320#else
321#define __SET_PERSONALITY32_N32() \
322 do { } while (0)
323#endif
324
325#ifdef CONFIG_MIPS32_O32
326#define __SET_PERSONALITY32_O32(ex, state) \
327 do { \
328 set_thread_flag(TIF_32BIT_REGS); \
329 set_thread_flag(TIF_32BIT_ADDR); \
330 clear_thread_flag(TIF_HYBRID_FPREGS); \
331 set_thread_flag(TIF_32BIT_FPREGS); \
332 \
333 mips_set_personality_fp(state); \
334 \
335 current->thread.abi = &mips_abi_32; \
336 } while (0)
337#else
338#define __SET_PERSONALITY32_O32(ex, state) \
339 do { } while (0)
340#endif
341
342#ifdef CONFIG_MIPS32_COMPAT
343#define __SET_PERSONALITY32(ex, state) \
344do { \
345 if ((((ex).e_flags & EF_MIPS_ABI2) != 0) && \
346 ((ex).e_flags & EF_MIPS_ABI) == 0) \
347 __SET_PERSONALITY32_N32(); \
348 else \
349 __SET_PERSONALITY32_O32(ex, state); \
350} while (0)
351#else
352#define __SET_PERSONALITY32(ex, state) do { } while (0)
353#endif
354
355#define SET_PERSONALITY2(ex, state) \
356do { \
357 unsigned int p; \
358 \
359 clear_thread_flag(TIF_32BIT_REGS); \
360 clear_thread_flag(TIF_32BIT_FPREGS); \
361 clear_thread_flag(TIF_HYBRID_FPREGS); \
362 clear_thread_flag(TIF_32BIT_ADDR); \
363 \
364 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
365 __SET_PERSONALITY32(ex, state); \
366 else \
367 current->thread.abi = &mips_abi; \
368 \
369 current->thread.fpu.fcr31 = boot_cpu_data.fpu_csr31; \
370 \
371 p = personality(current->personality); \
372 if (p != PER_LINUX32 && p != PER_LINUX) \
373 set_personality(PER_LINUX); \
374} while (0)
375
376#endif
377
378#define CORE_DUMP_USE_REGSET
379#define ELF_EXEC_PAGESIZE PAGE_SIZE
380
381
382
383
384
385#define ELF_HWCAP (elf_hwcap)
386extern unsigned int elf_hwcap;
387#include <asm/hwcap.h>
388
389
390
391
392
393
394
395#define ELF_PLATFORM __elf_platform
396extern const char *__elf_platform;
397
398
399
400
401
402#define ELF_PLAT_INIT(_r, load_addr) do { \
403 _r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \
404 _r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \
405 _r->regs[9] = _r->regs[10] = _r->regs[11] = _r->regs[12] = 0; \
406 _r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \
407 _r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \
408 _r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \
409 _r->regs[25] = _r->regs[26] = _r->regs[27] = _r->regs[28] = 0; \
410 _r->regs[30] = _r->regs[31] = 0; \
411} while (0)
412
413
414
415
416
417
418#ifndef ELF_ET_DYN_BASE
419#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
420#endif
421
422#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
423struct linux_binprm;
424extern int arch_setup_additional_pages(struct linux_binprm *bprm,
425 int uses_interp);
426
427struct arch_elf_state {
428 int fp_abi;
429 int interp_fp_abi;
430 int overall_fp_mode;
431};
432
433#define MIPS_ABI_FP_UNKNOWN (-1)
434
435#define INIT_ARCH_ELF_STATE { \
436 .fp_abi = MIPS_ABI_FP_UNKNOWN, \
437 .interp_fp_abi = MIPS_ABI_FP_UNKNOWN, \
438 .overall_fp_mode = -1, \
439}
440
441extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf,
442 bool is_interp, struct arch_elf_state *state);
443
444extern int arch_check_elf(void *ehdr, bool has_interpreter,
445 struct arch_elf_state *state);
446
447extern void mips_set_personality_fp(struct arch_elf_state *state);
448
449#endif
450