blob: 6abf0a163233af0c1ff0837b70e2f964b8f4b0ad [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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 */
David Howellsc3617f72012-10-09 09:47:26 +01009#ifndef _ASM_POWERPC_ELF_H
10#define _ASM_POWERPC_ELF_H
Linus Torvalds1da177e2005-04-16 15:20:36 -070011
David Howellsc3617f72012-10-09 09:47:26 +010012#include <linux/sched.h> /* for task_struct */
13#include <asm/page.h>
14#include <asm/string.h>
15#include <uapi/asm/elf.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016
Linus Torvalds1da177e2005-04-16 15:20:36 -070017/*
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)
Roland McGrath01e31db2008-01-02 17:03:11 -080021#define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
Linus Torvalds1da177e2005-04-16 15:20:36 -070022
Roland McGrath81970382007-12-20 03:58:12 -080023#define CORE_DUMP_USE_REGSET
Olof Johansson637a6ff2005-09-20 13:47:41 +100024#define ELF_EXEC_PAGESIZE PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070025
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
Anton Blanchard501cb162009-02-22 01:50:07 +000031extern unsigned long randomize_et_dyn(unsigned long base);
32#define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000))
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
Roland McGrath5f149cf2007-10-16 23:26:55 -070034/*
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 */
Becky Brucea99eb2e2005-09-19 19:17:27 -050051static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
Roland McGrath5f149cf2007-10-16 23:26:55 -070052 struct pt_regs *regs)
Linus Torvalds1da177e2005-04-16 15:20:36 -070053{
Roland McGrath5f149cf2007-10-16 23:26:55 -070054 PPC_ELF_CORE_COPY_REGS(elf_regs, regs);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055}
Becky Brucea99eb2e2005-09-19 19:17:27 -050056#define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
Mark Nelson1f7d6662007-10-16 23:25:40 -070058typedef elf_vrregset_t elf_fpxregset_t;
59
Becky Brucea99eb2e2005-09-19 19:17:27 -050060/* ELF_HWCAP yields a mask that user programs can use to figure out what
Linus Torvalds1da177e2005-04-16 15:20:36 -070061 instruction set this cpu supports. This could be done in userspace,
62 but it's not easy, and we've already done it here. */
Becky Brucea99eb2e2005-09-19 19:17:27 -050063# define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
Paul Mackerras80f15dc2006-01-14 10:11:39 +110064
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
Nathan Lynch9115d132008-07-16 09:58:51 +100071/* 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
Kumar Gala400d2212005-09-27 15:13:12 -050079#ifdef __powerpc64__
Paul Mackerras06d67d52005-10-10 22:29:05 +100080# define ELF_PLAT_INIT(_r, load_addr) do { \
81 _r->gpr[2] = load_addr; \
Becky Brucea99eb2e2005-09-19 19:17:27 -050082} while (0)
Becky Brucea99eb2e2005-09-19 19:17:27 -050083#endif /* __powerpc64__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -070084
Becky Brucea99eb2e2005-09-19 19:17:27 -050085#ifdef __powerpc64__
Martin Schwidefsky0b592682008-10-16 15:39:57 +020086# define SET_PERSONALITY(ex) \
Linus Torvalds1da177e2005-04-16 15:20:36 -070087do { \
Linus Torvalds1da177e2005-04-16 15:20:36 -070088 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
Andreas Schwab94f28da2010-01-30 10:20:59 +000089 set_thread_flag(TIF_32BIT); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070090 else \
Andreas Schwab94f28da2010-01-30 10:20:59 +000091 clear_thread_flag(TIF_32BIT); \
Paul Mackerrasce10d972005-06-08 21:59:15 +100092 if (personality(current->personality) != PER_LINUX32) \
Eric B Munsona91a03e2008-07-01 02:12:13 +100093 set_personality(PER_LINUX | \
94 (current->personality & (~PER_MASK))); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070095} while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -070096/*
97 * An executable for which elf_read_implies_exec() returns TRUE will
Anton Blancharda2f95a52005-05-01 08:58:45 -070098 * 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.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102 */
Denis Kirjanovcab175f2010-08-27 03:49:11 +0000103# define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \
Kumar Galad89ebca2009-04-28 03:32:36 +0000104 (exec_stk == EXSTACK_DEFAULT) : 0)
Becky Brucea99eb2e2005-09-19 19:17:27 -0500105#else
Andreas Schwab59e4c3a22009-04-16 06:22:01 +0000106# define SET_PERSONALITY(ex) \
107 set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
Kumar Galad89ebca2009-04-28 03:32:36 +0000108# define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)
Becky Brucea99eb2e2005-09-19 19:17:27 -0500109#endif /* __powerpc64__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111extern int dcache_bsize;
112extern int icache_bsize;
113extern int ucache_bsize;
114
Benjamin Herrenschmidta7f290d2005-11-11 21:15:21 +1100115/* vDSO has arch_setup_additional_pages */
116#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117struct linux_binprm;
Benjamin Herrenschmidta7f290d2005-11-11 21:15:21 +1100118extern int arch_setup_additional_pages(struct linux_binprm *bprm,
Martin Schwidefskyfc5243d2008-12-25 13:38:35 +0100119 int uses_interp);
Phil Carmody497888c2011-07-14 15:07:13 +0300120#define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121
Anton Blanchard2dadb982009-02-22 01:50:02 +0000122/* 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
Anton Blanchard912f9ee2009-02-22 01:50:04 +0000127extern unsigned long arch_randomize_brk(struct mm_struct *mm);
128#define arch_randomize_brk arch_randomize_brk
129
Adrian Bunk178f8d72008-06-24 03:48:28 +1000130
Arnd Bergmanne0555952006-11-27 19:18:55 +0100131#ifdef CONFIG_SPU_BASE
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +0100132/* Notes used in ET_CORE. Note name is "SPU/<fd>/<filename>". */
133#define NT_SPU 1
134
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +0100135#define ARCH_HAVE_EXTRA_ELF_NOTES
Michael Ellermane5501492007-09-19 14:38:12 +1000136
137#endif /* CONFIG_SPU_BASE */
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +0100138
Becky Brucea99eb2e2005-09-19 19:17:27 -0500139#endif /* _ASM_POWERPC_ELF_H */