1#ifndef _ASM_POWERPC_ELF_H
2#define _ASM_POWERPC_ELF_H
3
4#ifdef __KERNEL__
5#include <linux/sched.h>
6#include <asm/page.h>
7#include <asm/string.h>
8#endif
9
10#include <linux/types.h>
11
12#include <asm/ptrace.h>
13#include <asm/cputable.h>
14#include <asm/auxvec.h>
15
16
17#define R_PPC_NONE 0
18#define R_PPC_ADDR32 1
19#define R_PPC_ADDR24 2
20#define R_PPC_ADDR16 3
21#define R_PPC_ADDR16_LO 4
22#define R_PPC_ADDR16_HI 5
23#define R_PPC_ADDR16_HA 6
24#define R_PPC_ADDR14 7
25#define R_PPC_ADDR14_BRTAKEN 8
26#define R_PPC_ADDR14_BRNTAKEN 9
27#define R_PPC_REL24 10
28#define R_PPC_REL14 11
29#define R_PPC_REL14_BRTAKEN 12
30#define R_PPC_REL14_BRNTAKEN 13
31#define R_PPC_GOT16 14
32#define R_PPC_GOT16_LO 15
33#define R_PPC_GOT16_HI 16
34#define R_PPC_GOT16_HA 17
35#define R_PPC_PLTREL24 18
36#define R_PPC_COPY 19
37#define R_PPC_GLOB_DAT 20
38#define R_PPC_JMP_SLOT 21
39#define R_PPC_RELATIVE 22
40#define R_PPC_LOCAL24PC 23
41#define R_PPC_UADDR32 24
42#define R_PPC_UADDR16 25
43#define R_PPC_REL32 26
44#define R_PPC_PLT32 27
45#define R_PPC_PLTREL32 28
46#define R_PPC_PLT16_LO 29
47#define R_PPC_PLT16_HI 30
48#define R_PPC_PLT16_HA 31
49#define R_PPC_SDAREL16 32
50#define R_PPC_SECTOFF 33
51#define R_PPC_SECTOFF_LO 34
52#define R_PPC_SECTOFF_HI 35
53#define R_PPC_SECTOFF_HA 36
54
55
56#define R_PPC_TLS 67
57#define R_PPC_DTPMOD32 68
58#define R_PPC_TPREL16 69
59#define R_PPC_TPREL16_LO 70
60#define R_PPC_TPREL16_HI 71
61#define R_PPC_TPREL16_HA 72
62#define R_PPC_TPREL32 73
63#define R_PPC_DTPREL16 74
64#define R_PPC_DTPREL16_LO 75
65#define R_PPC_DTPREL16_HI 76
66#define R_PPC_DTPREL16_HA 77
67#define R_PPC_DTPREL32 78
68#define R_PPC_GOT_TLSGD16 79
69#define R_PPC_GOT_TLSGD16_LO 80
70#define R_PPC_GOT_TLSGD16_HI 81
71#define R_PPC_GOT_TLSGD16_HA 82
72#define R_PPC_GOT_TLSLD16 83
73#define R_PPC_GOT_TLSLD16_LO 84
74#define R_PPC_GOT_TLSLD16_HI 85
75#define R_PPC_GOT_TLSLD16_HA 86
76#define R_PPC_GOT_TPREL16 87
77#define R_PPC_GOT_TPREL16_LO 88
78#define R_PPC_GOT_TPREL16_HI 89
79#define R_PPC_GOT_TPREL16_HA 90
80#define R_PPC_GOT_DTPREL16 91
81#define R_PPC_GOT_DTPREL16_LO 92
82#define R_PPC_GOT_DTPREL16_HI 93
83#define R_PPC_GOT_DTPREL16_HA 94
84
85
86#define R_PPC_NUM 95
87
88
89
90
91
92
93
94
95
96
97#define ELF_NGREG 48
98#define ELF_NFPREG 33
99
100typedef unsigned long elf_greg_t64;
101typedef elf_greg_t64 elf_gregset_t64[ELF_NGREG];
102
103typedef unsigned int elf_greg_t32;
104typedef elf_greg_t32 elf_gregset_t32[ELF_NGREG];
105typedef elf_gregset_t32 compat_elf_gregset_t;
106
107
108
109
110#ifdef __powerpc64__
111# define ELF_NVRREG32 33
112# define ELF_NVRREG 34
113# define ELF_NVSRHALFREG 32
114# define ELF_GREG_TYPE elf_greg_t64
115#else
116# define ELF_NEVRREG 34
117# define ELF_NVRREG 33
118# define ELF_GREG_TYPE elf_greg_t32
119# define ELF_ARCH EM_PPC
120# define ELF_CLASS ELFCLASS32
121# define ELF_DATA ELFDATA2MSB
122#endif
123
124#ifndef ELF_ARCH
125# define ELF_ARCH EM_PPC64
126# define ELF_CLASS ELFCLASS64
127# define ELF_DATA ELFDATA2MSB
128 typedef elf_greg_t64 elf_greg_t;
129 typedef elf_gregset_t64 elf_gregset_t;
130#else
131
132 typedef elf_greg_t32 elf_greg_t;
133 typedef elf_gregset_t32 elf_gregset_t;
134#endif
135
136
137typedef double elf_fpreg_t;
138typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159typedef __vector128 elf_vrreg_t;
160typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
161#ifdef __powerpc64__
162typedef elf_vrreg_t elf_vrregset_t32[ELF_NVRREG32];
163typedef elf_fpreg_t elf_vsrreghalf_t32[ELF_NVSRHALFREG];
164#endif
165
166#ifdef __KERNEL__
167
168
169
170#define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)
171#define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
172
173#define CORE_DUMP_USE_REGSET
174#define ELF_EXEC_PAGESIZE PAGE_SIZE
175
176
177
178
179
180
181extern unsigned long randomize_et_dyn(unsigned long base);
182#define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000))
183
184
185
186
187
188
189
190
191
192
193#define PPC_ELF_CORE_COPY_REGS(elf_regs, regs) \
194 int i, nregs = min(sizeof(*regs) / sizeof(unsigned long), \
195 (size_t)ELF_NGREG); \
196 for (i = 0; i < nregs; i++) \
197 elf_regs[i] = ((unsigned long *) regs)[i]; \
198 memset(&elf_regs[i], 0, (ELF_NGREG - i) * sizeof(elf_regs[0]))
199
200
201static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
202 struct pt_regs *regs)
203{
204 PPC_ELF_CORE_COPY_REGS(elf_regs, regs);
205}
206#define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs);
207
208typedef elf_vrregset_t elf_fpxregset_t;
209
210
211
212
213# define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
214
215
216
217
218
219#define ELF_PLATFORM (cur_cpu_spec->platform)
220
221
222
223
224
225
226
227#define ELF_BASE_PLATFORM (powerpc_base_platform)
228
229#ifdef __powerpc64__
230# define ELF_PLAT_INIT(_r, load_addr) do { \
231 _r->gpr[2] = load_addr; \
232} while (0)
233#endif
234
235#ifdef __powerpc64__
236# define SET_PERSONALITY(ex) \
237do { \
238 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
239 set_thread_flag(TIF_32BIT); \
240 else \
241 clear_thread_flag(TIF_32BIT); \
242 if (personality(current->personality) != PER_LINUX32) \
243 set_personality(PER_LINUX | \
244 (current->personality & (~PER_MASK))); \
245} while (0)
246
247
248
249
250
251
252
253# define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \
254 (exec_stk == EXSTACK_DEFAULT) : 0)
255#else
256# define SET_PERSONALITY(ex) \
257 set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
258# define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)
259#endif
260
261extern int dcache_bsize;
262extern int icache_bsize;
263extern int ucache_bsize;
264
265
266#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
267struct linux_binprm;
268extern int arch_setup_additional_pages(struct linux_binprm *bprm,
269 int uses_interp);
270#define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b)
271
272
273#define STACK_RND_MASK (is_32bit_task() ? \
274 (0x7ff >> (PAGE_SHIFT - 12)) : \
275 (0x3ffff >> (PAGE_SHIFT - 12)))
276
277extern unsigned long arch_randomize_brk(struct mm_struct *mm);
278#define arch_randomize_brk arch_randomize_brk
279
280#endif
281
282
283
284
285
286
287
288
289
290
291
292#define ARCH_DLINFO \
293do { \
294 \
295 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
296 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
297 \
298 NEW_AUX_ENT(AT_DCACHEBSIZE, dcache_bsize); \
299 NEW_AUX_ENT(AT_ICACHEBSIZE, icache_bsize); \
300 NEW_AUX_ENT(AT_UCACHEBSIZE, ucache_bsize); \
301 VDSO_AUX_ENT(AT_SYSINFO_EHDR, current->mm->context.vdso_base); \
302} while (0)
303
304
305#define R_PPC64_NONE R_PPC_NONE
306#define R_PPC64_ADDR32 R_PPC_ADDR32
307#define R_PPC64_ADDR24 R_PPC_ADDR24
308#define R_PPC64_ADDR16 R_PPC_ADDR16
309#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO
310#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI
311#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA
312#define R_PPC64_ADDR14 R_PPC_ADDR14
313#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN
314#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN
315#define R_PPC64_REL24 R_PPC_REL24
316#define R_PPC64_REL14 R_PPC_REL14
317#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN
318#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN
319#define R_PPC64_GOT16 R_PPC_GOT16
320#define R_PPC64_GOT16_LO R_PPC_GOT16_LO
321#define R_PPC64_GOT16_HI R_PPC_GOT16_HI
322#define R_PPC64_GOT16_HA R_PPC_GOT16_HA
323
324#define R_PPC64_COPY R_PPC_COPY
325#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT
326#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT
327#define R_PPC64_RELATIVE R_PPC_RELATIVE
328
329#define R_PPC64_UADDR32 R_PPC_UADDR32
330#define R_PPC64_UADDR16 R_PPC_UADDR16
331#define R_PPC64_REL32 R_PPC_REL32
332#define R_PPC64_PLT32 R_PPC_PLT32
333#define R_PPC64_PLTREL32 R_PPC_PLTREL32
334#define R_PPC64_PLT16_LO R_PPC_PLT16_LO
335#define R_PPC64_PLT16_HI R_PPC_PLT16_HI
336#define R_PPC64_PLT16_HA R_PPC_PLT16_HA
337
338#define R_PPC64_SECTOFF R_PPC_SECTOFF
339#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO
340#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI
341#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA
342#define R_PPC64_ADDR30 37
343#define R_PPC64_ADDR64 38
344#define R_PPC64_ADDR16_HIGHER 39
345#define R_PPC64_ADDR16_HIGHERA 40
346#define R_PPC64_ADDR16_HIGHEST 41
347#define R_PPC64_ADDR16_HIGHESTA 42
348#define R_PPC64_UADDR64 43
349#define R_PPC64_REL64 44
350#define R_PPC64_PLT64 45
351#define R_PPC64_PLTREL64 46
352#define R_PPC64_TOC16 47
353#define R_PPC64_TOC16_LO 48
354#define R_PPC64_TOC16_HI 49
355#define R_PPC64_TOC16_HA 50
356#define R_PPC64_TOC 51
357#define R_PPC64_PLTGOT16 52
358#define R_PPC64_PLTGOT16_LO 53
359#define R_PPC64_PLTGOT16_HI 54
360#define R_PPC64_PLTGOT16_HA 55
361
362#define R_PPC64_ADDR16_DS 56
363#define R_PPC64_ADDR16_LO_DS 57
364#define R_PPC64_GOT16_DS 58
365#define R_PPC64_GOT16_LO_DS 59
366#define R_PPC64_PLT16_LO_DS 60
367#define R_PPC64_SECTOFF_DS 61
368#define R_PPC64_SECTOFF_LO_DS 62
369#define R_PPC64_TOC16_DS 63
370#define R_PPC64_TOC16_LO_DS 64
371#define R_PPC64_PLTGOT16_DS 65
372#define R_PPC64_PLTGOT16_LO_DS 66
373
374
375#define R_PPC64_TLS 67
376#define R_PPC64_DTPMOD64 68
377#define R_PPC64_TPREL16 69
378#define R_PPC64_TPREL16_LO 70
379#define R_PPC64_TPREL16_HI 71
380#define R_PPC64_TPREL16_HA 72
381#define R_PPC64_TPREL64 73
382#define R_PPC64_DTPREL16 74
383#define R_PPC64_DTPREL16_LO 75
384#define R_PPC64_DTPREL16_HI 76
385#define R_PPC64_DTPREL16_HA 77
386#define R_PPC64_DTPREL64 78
387#define R_PPC64_GOT_TLSGD16 79
388#define R_PPC64_GOT_TLSGD16_LO 80
389#define R_PPC64_GOT_TLSGD16_HI 81
390#define R_PPC64_GOT_TLSGD16_HA 82
391#define R_PPC64_GOT_TLSLD16 83
392#define R_PPC64_GOT_TLSLD16_LO 84
393#define R_PPC64_GOT_TLSLD16_HI 85
394#define R_PPC64_GOT_TLSLD16_HA 86
395#define R_PPC64_GOT_TPREL16_DS 87
396#define R_PPC64_GOT_TPREL16_LO_DS 88
397#define R_PPC64_GOT_TPREL16_HI 89
398#define R_PPC64_GOT_TPREL16_HA 90
399#define R_PPC64_GOT_DTPREL16_DS 91
400#define R_PPC64_GOT_DTPREL16_LO_DS 92
401#define R_PPC64_GOT_DTPREL16_HI 93
402#define R_PPC64_GOT_DTPREL16_HA 94
403#define R_PPC64_TPREL16_DS 95
404#define R_PPC64_TPREL16_LO_DS 96
405#define R_PPC64_TPREL16_HIGHER 97
406#define R_PPC64_TPREL16_HIGHERA 98
407#define R_PPC64_TPREL16_HIGHEST 99
408#define R_PPC64_TPREL16_HIGHESTA 100
409#define R_PPC64_DTPREL16_DS 101
410#define R_PPC64_DTPREL16_LO_DS 102
411#define R_PPC64_DTPREL16_HIGHER 103
412#define R_PPC64_DTPREL16_HIGHERA 104
413#define R_PPC64_DTPREL16_HIGHEST 105
414#define R_PPC64_DTPREL16_HIGHESTA 106
415
416
417#define R_PPC64_NUM 107
418
419
420struct ppc64_opd_entry
421{
422 unsigned long funcaddr;
423 unsigned long r2;
424};
425
426#ifdef __KERNEL__
427
428#ifdef CONFIG_SPU_BASE
429
430#define NT_SPU 1
431
432#define ARCH_HAVE_EXTRA_ELF_NOTES
433
434#endif
435
436#endif
437
438#endif
439