0001
0002
0003
0004
0005 #ifndef _ASM_POWERPC_ELF_H
0006 #define _ASM_POWERPC_ELF_H
0007
0008 #include <linux/sched.h> /* for task_struct */
0009 #include <asm/page.h>
0010 #include <asm/string.h>
0011 #include <uapi/asm/elf.h>
0012
0013
0014
0015
0016 #define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)
0017 #define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
0018
0019 #define CORE_DUMP_USE_REGSET
0020 #define ELF_EXEC_PAGESIZE PAGE_SIZE
0021
0022
0023
0024
0025
0026
0027 #define ELF_ET_DYN_BASE (is_32bit_task() ? 0x000400000UL : \
0028 0x100000000UL)
0029
0030 #define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0)
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #define PPC_ELF_CORE_COPY_REGS(elf_regs, regs) \
0042 int i, nregs = min(sizeof(*regs) / sizeof(unsigned long), \
0043 (size_t)ELF_NGREG); \
0044 for (i = 0; i < nregs; i++) \
0045 elf_regs[i] = ((unsigned long *) regs)[i]; \
0046 memset(&elf_regs[i], 0, (ELF_NGREG - i) * sizeof(elf_regs[0]))
0047
0048
0049 static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
0050 struct pt_regs *regs)
0051 {
0052 PPC_ELF_CORE_COPY_REGS(elf_regs, regs);
0053 }
0054 #define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs);
0055
0056
0057
0058
0059 # define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
0060 # define ELF_HWCAP2 (cur_cpu_spec->cpu_user_features2)
0061
0062
0063
0064
0065
0066 #define ELF_PLATFORM (cur_cpu_spec->platform)
0067
0068
0069
0070
0071
0072
0073
0074 #define ELF_BASE_PLATFORM (powerpc_base_platform)
0075
0076 #ifdef __powerpc64__
0077 # define ELF_PLAT_INIT(_r, load_addr) do { \
0078 _r->gpr[2] = load_addr; \
0079 } while (0)
0080 #endif
0081
0082 #ifdef __powerpc64__
0083 # define SET_PERSONALITY(ex) \
0084 do { \
0085 if (((ex).e_flags & 0x3) == 2) \
0086 set_thread_flag(TIF_ELF2ABI); \
0087 else \
0088 clear_thread_flag(TIF_ELF2ABI); \
0089 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
0090 set_thread_flag(TIF_32BIT); \
0091 else \
0092 clear_thread_flag(TIF_32BIT); \
0093 if (personality(current->personality) != PER_LINUX32) \
0094 set_personality(PER_LINUX | \
0095 (current->personality & (~PER_MASK))); \
0096 } while (0)
0097
0098
0099
0100
0101
0102
0103
0104 # define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \
0105 (exec_stk == EXSTACK_DEFAULT) : 0)
0106 #else
0107 # define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)
0108 #endif
0109
0110 extern int dcache_bsize;
0111 extern int icache_bsize;
0112 extern int ucache_bsize;
0113
0114
0115 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
0116 struct linux_binprm;
0117 extern int arch_setup_additional_pages(struct linux_binprm *bprm,
0118 int uses_interp);
0119 #define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b)
0120
0121
0122 #define STACK_RND_MASK (is_32bit_task() ? \
0123 (0x7ff >> (PAGE_SHIFT - 12)) : \
0124 (0x3ffff >> (PAGE_SHIFT - 12)))
0125
0126 #ifdef CONFIG_SPU_BASE
0127
0128 #define NT_SPU 1
0129
0130 #define ARCH_HAVE_EXTRA_ELF_NOTES
0131
0132 #endif
0133
0134 #ifdef CONFIG_PPC64
0135
0136 #define get_cache_geometry(level) \
0137 (ppc64_caches.level.assoc << 16 | ppc64_caches.level.line_size)
0138
0139 #define ARCH_DLINFO_CACHE_GEOMETRY \
0140 NEW_AUX_ENT(AT_L1I_CACHESIZE, ppc64_caches.l1i.size); \
0141 NEW_AUX_ENT(AT_L1I_CACHEGEOMETRY, get_cache_geometry(l1i)); \
0142 NEW_AUX_ENT(AT_L1D_CACHESIZE, ppc64_caches.l1d.size); \
0143 NEW_AUX_ENT(AT_L1D_CACHEGEOMETRY, get_cache_geometry(l1d)); \
0144 NEW_AUX_ENT(AT_L2_CACHESIZE, ppc64_caches.l2.size); \
0145 NEW_AUX_ENT(AT_L2_CACHEGEOMETRY, get_cache_geometry(l2)); \
0146 NEW_AUX_ENT(AT_L3_CACHESIZE, ppc64_caches.l3.size); \
0147 NEW_AUX_ENT(AT_L3_CACHEGEOMETRY, get_cache_geometry(l3))
0148
0149 #else
0150 #define ARCH_DLINFO_CACHE_GEOMETRY
0151 #endif
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 #define COMMON_ARCH_DLINFO \
0164 do { \
0165 \
0166 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
0167 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
0168 \
0169 NEW_AUX_ENT(AT_DCACHEBSIZE, dcache_bsize); \
0170 NEW_AUX_ENT(AT_ICACHEBSIZE, icache_bsize); \
0171 NEW_AUX_ENT(AT_UCACHEBSIZE, 0); \
0172 VDSO_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long)current->mm->context.vdso);\
0173 ARCH_DLINFO_CACHE_GEOMETRY; \
0174 } while (0)
0175
0176 #define ARCH_DLINFO \
0177 do { \
0178 COMMON_ARCH_DLINFO; \
0179 NEW_AUX_ENT(AT_MINSIGSTKSZ, get_min_sigframe_size()); \
0180 } while (0)
0181
0182 #define COMPAT_ARCH_DLINFO \
0183 do { \
0184 COMMON_ARCH_DLINFO; \
0185 NEW_AUX_ENT(AT_MINSIGSTKSZ, get_min_sigframe_size_compat()); \
0186 } while (0)
0187
0188
0189 void relocate(unsigned long final_address);
0190
0191 struct func_desc {
0192 unsigned long addr;
0193 unsigned long toc;
0194 unsigned long env;
0195 };
0196
0197 #endif