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 #define ELF_ET_DYN_BASE 0x20000000 32 33 #define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0) 34 35 /* 36 * Our registers are always unsigned longs, whether we're a 32 bit 37 * process or 64 bit, on either a 64 bit or 32 bit kernel. 38 * 39 * This macro relies on elf_regs[i] having the right type to truncate to, 40 * either u32 or u64. It defines the body of the elf_core_copy_regs 41 * function, either the native one with elf_gregset_t elf_regs or 42 * the 32-bit one with elf_gregset_t32 elf_regs. 43 */ 44 #define PPC_ELF_CORE_COPY_REGS(elf_regs, regs) \ 45 int i, nregs = min(sizeof(*regs) / sizeof(unsigned long), \ 46 (size_t)ELF_NGREG); \ 47 for (i = 0; i < nregs; i++) \ 48 elf_regs[i] = ((unsigned long *) regs)[i]; \ 49 memset(&elf_regs[i], 0, (ELF_NGREG - i) * sizeof(elf_regs[0])) 50 51 /* Common routine for both 32-bit and 64-bit native processes */ 52 static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs, 53 struct pt_regs *regs) 54 { 55 PPC_ELF_CORE_COPY_REGS(elf_regs, regs); 56 } 57 #define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs); 58 59 typedef elf_vrregset_t elf_fpxregset_t; 60 61 /* ELF_HWCAP yields a mask that user programs can use to figure out what 62 instruction set this cpu supports. This could be done in userspace, 63 but it's not easy, and we've already done it here. */ 64 # define ELF_HWCAP (cur_cpu_spec->cpu_user_features) 65 # define ELF_HWCAP2 (cur_cpu_spec->cpu_user_features2) 66 67 /* This yields a string that ld.so will use to load implementation 68 specific libraries for optimization. This is more specific in 69 intent than poking at uname or /proc/cpuinfo. */ 70 71 #define ELF_PLATFORM (cur_cpu_spec->platform) 72 73 /* While ELF_PLATFORM indicates the ISA supported by the platform, it 74 * may not accurately reflect the underlying behavior of the hardware 75 * (as in the case of running in Power5+ compatibility mode on a 76 * Power6 machine). ELF_BASE_PLATFORM allows ld.so to load libraries 77 * that are tuned for the real hardware. 78 */ 79 #define ELF_BASE_PLATFORM (powerpc_base_platform) 80 81 #ifdef __powerpc64__ 82 # define ELF_PLAT_INIT(_r, load_addr) do { \ 83 _r->gpr[2] = load_addr; \ 84 } while (0) 85 #endif /* __powerpc64__ */ 86 87 #ifdef __powerpc64__ 88 # define SET_PERSONALITY(ex) \ 89 do { \ 90 if (((ex).e_flags & 0x3) == 2) \ 91 set_thread_flag(TIF_ELF2ABI); \ 92 else \ 93 clear_thread_flag(TIF_ELF2ABI); \ 94 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ 95 set_thread_flag(TIF_32BIT); \ 96 else \ 97 clear_thread_flag(TIF_32BIT); \ 98 if (personality(current->personality) != PER_LINUX32) \ 99 set_personality(PER_LINUX | \ 100 (current->personality & (~PER_MASK))); \ 101 } while (0) 102 /* 103 * An executable for which elf_read_implies_exec() returns TRUE will 104 * have the READ_IMPLIES_EXEC personality flag set automatically. This 105 * is only required to work around bugs in old 32bit toolchains. Since 106 * the 64bit ABI has never had these issues dont enable the workaround 107 * even if we have an executable stack. 108 */ 109 # define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \ 110 (exec_stk == EXSTACK_DEFAULT) : 0) 111 #else 112 # define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT) 113 #endif /* __powerpc64__ */ 114 115 extern int dcache_bsize; 116 extern int icache_bsize; 117 extern int ucache_bsize; 118 119 /* vDSO has arch_setup_additional_pages */ 120 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 121 struct linux_binprm; 122 extern int arch_setup_additional_pages(struct linux_binprm *bprm, 123 int uses_interp); 124 #define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b) 125 126 /* 1GB for 64bit, 8MB for 32bit */ 127 #define STACK_RND_MASK (is_32bit_task() ? \ 128 (0x7ff >> (PAGE_SHIFT - 12)) : \ 129 (0x3ffff >> (PAGE_SHIFT - 12))) 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 #ifdef CONFIG_PPC64 140 141 #define get_cache_geometry(level) \ 142 (ppc64_caches.level.assoc << 16 | ppc64_caches.level.line_size) 143 144 #define ARCH_DLINFO_CACHE_GEOMETRY \ 145 NEW_AUX_ENT(AT_L1I_CACHESIZE, ppc64_caches.l1i.size); \ 146 NEW_AUX_ENT(AT_L1I_CACHEGEOMETRY, get_cache_geometry(l1i)); \ 147 NEW_AUX_ENT(AT_L1D_CACHESIZE, ppc64_caches.l1d.size); \ 148 NEW_AUX_ENT(AT_L1D_CACHEGEOMETRY, get_cache_geometry(l1d)); \ 149 NEW_AUX_ENT(AT_L2_CACHESIZE, ppc64_caches.l2.size); \ 150 NEW_AUX_ENT(AT_L2_CACHEGEOMETRY, get_cache_geometry(l2)); \ 151 NEW_AUX_ENT(AT_L3_CACHESIZE, ppc64_caches.l3.size); \ 152 NEW_AUX_ENT(AT_L3_CACHEGEOMETRY, get_cache_geometry(l3)) 153 154 #else 155 #define ARCH_DLINFO_CACHE_GEOMETRY 156 #endif 157 158 /* 159 * The requirements here are: 160 * - keep the final alignment of sp (sp & 0xf) 161 * - make sure the 32-bit value at the first 16 byte aligned position of 162 * AUXV is greater than 16 for glibc compatibility. 163 * AT_IGNOREPPC is used for that. 164 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC, 165 * even if DLINFO_ARCH_ITEMS goes to zero or is undefined. 166 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes 167 */ 168 #define ARCH_DLINFO \ 169 do { \ 170 /* Handle glibc compatibility. */ \ 171 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \ 172 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \ 173 /* Cache size items */ \ 174 NEW_AUX_ENT(AT_DCACHEBSIZE, dcache_bsize); \ 175 NEW_AUX_ENT(AT_ICACHEBSIZE, icache_bsize); \ 176 NEW_AUX_ENT(AT_UCACHEBSIZE, ucache_bsize); \ 177 VDSO_AUX_ENT(AT_SYSINFO_EHDR, current->mm->context.vdso_base); \ 178 ARCH_DLINFO_CACHE_GEOMETRY; \ 179 } while (0) 180 181 #endif /* _ASM_POWERPC_ELF_H */ 182