Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
elf.h
Go to the documentation of this file.
1 /*
2  * ELF register definitions..
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  */
9 #ifndef _ASM_POWERPC_ELF_H
10 #define _ASM_POWERPC_ELF_H
11 
12 #include <linux/sched.h> /* for task_struct */
13 #include <asm/page.h>
14 #include <asm/string.h>
15 #include <uapi/asm/elf.h>
16 
17 /*
18  * This is used to ensure we don't load something for the wrong architecture.
19  */
20 #define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)
21 #define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
22 
23 #define CORE_DUMP_USE_REGSET
24 #define ELF_EXEC_PAGESIZE PAGE_SIZE
25 
26 /* This is the location that an ET_DYN program is loaded if exec'ed. Typical
27  use of this is to invoke "./ld.so someprog" to test out a new version of
28  the loader. We need to make sure that it is out of the way of the program
29  that it will "exec", and that there is sufficient room for the brk. */
30 
31 extern unsigned long randomize_et_dyn(unsigned long base);
32 #define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000))
33 
34 /*
35  * Our registers are always unsigned longs, whether we're a 32 bit
36  * process or 64 bit, on either a 64 bit or 32 bit kernel.
37  *
38  * This macro relies on elf_regs[i] having the right type to truncate to,
39  * either u32 or u64. It defines the body of the elf_core_copy_regs
40  * function, either the native one with elf_gregset_t elf_regs or
41  * the 32-bit one with elf_gregset_t32 elf_regs.
42  */
43 #define PPC_ELF_CORE_COPY_REGS(elf_regs, regs) \
44  int i, nregs = min(sizeof(*regs) / sizeof(unsigned long), \
45  (size_t)ELF_NGREG); \
46  for (i = 0; i < nregs; i++) \
47  elf_regs[i] = ((unsigned long *) regs)[i]; \
48  memset(&elf_regs[i], 0, (ELF_NGREG - i) * sizeof(elf_regs[0]))
49 
50 /* Common routine for both 32-bit and 64-bit native processes */
51 static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
52  struct pt_regs *regs)
53 {
54  PPC_ELF_CORE_COPY_REGS(elf_regs, regs);
55 }
56 #define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs);
57 
59 
60 /* ELF_HWCAP yields a mask that user programs can use to figure out what
61  instruction set this cpu supports. This could be done in userspace,
62  but it's not easy, and we've already done it here. */
63 # define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
64 
65 /* This yields a string that ld.so will use to load implementation
66  specific libraries for optimization. This is more specific in
67  intent than poking at uname or /proc/cpuinfo. */
68 
69 #define ELF_PLATFORM (cur_cpu_spec->platform)
70 
71 /* While ELF_PLATFORM indicates the ISA supported by the platform, it
72  * may not accurately reflect the underlying behavior of the hardware
73  * (as in the case of running in Power5+ compatibility mode on a
74  * Power6 machine). ELF_BASE_PLATFORM allows ld.so to load libraries
75  * that are tuned for the real hardware.
76  */
77 #define ELF_BASE_PLATFORM (powerpc_base_platform)
78 
79 #ifdef __powerpc64__
80 # define ELF_PLAT_INIT(_r, load_addr) do { \
81  _r->gpr[2] = load_addr; \
82 } while (0)
83 #endif /* __powerpc64__ */
84 
85 #ifdef __powerpc64__
86 # define SET_PERSONALITY(ex) \
87 do { \
88  if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
89  set_thread_flag(TIF_32BIT); \
90  else \
91  clear_thread_flag(TIF_32BIT); \
92  if (personality(current->personality) != PER_LINUX32) \
93  set_personality(PER_LINUX | \
94  (current->personality & (~PER_MASK))); \
95 } while (0)
96 /*
97  * An executable for which elf_read_implies_exec() returns TRUE will
98  * have the READ_IMPLIES_EXEC personality flag set automatically. This
99  * is only required to work around bugs in old 32bit toolchains. Since
100  * the 64bit ABI has never had these issues dont enable the workaround
101  * even if we have an executable stack.
102  */
103 # define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \
104  (exec_stk == EXSTACK_DEFAULT) : 0)
105 #else
106 # define SET_PERSONALITY(ex) \
107  set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
108 # define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)
109 #endif /* __powerpc64__ */
110 
111 extern int dcache_bsize;
112 extern int icache_bsize;
113 extern int ucache_bsize;
114 
115 /* vDSO has arch_setup_additional_pages */
116 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
117 struct linux_binprm;
118 extern int arch_setup_additional_pages(struct linux_binprm *bprm,
119  int uses_interp);
120 #define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b)
121 
122 /* 1GB for 64bit, 8MB for 32bit */
123 #define STACK_RND_MASK (is_32bit_task() ? \
124  (0x7ff >> (PAGE_SHIFT - 12)) : \
125  (0x3ffff >> (PAGE_SHIFT - 12)))
126 
127 extern unsigned long arch_randomize_brk(struct mm_struct *mm);
128 #define arch_randomize_brk arch_randomize_brk
129 
130 
131 #ifdef CONFIG_SPU_BASE
132 /* Notes used in ET_CORE. Note name is "SPU/<fd>/<filename>". */
133 #define NT_SPU 1
134 
135 #define ARCH_HAVE_EXTRA_ELF_NOTES
136 
137 #endif /* CONFIG_SPU_BASE */
138 
139 #endif /* _ASM_POWERPC_ELF_H */