elf.h 4.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/*
 * ELF register definitions..
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */
9 10
#ifndef _ASM_POWERPC_ELF_H
#define _ASM_POWERPC_ELF_H
L
Linus Torvalds 已提交
11

12 13 14 15
#include <linux/sched.h>	/* for task_struct */
#include <asm/page.h>
#include <asm/string.h>
#include <uapi/asm/elf.h>
L
Linus Torvalds 已提交
16 17 18 19 20

/*
 * This is used to ensure we don't load something for the wrong architecture.
 */
#define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)
21
#define compat_elf_check_arch(x)	((x)->e_machine == EM_PPC)
L
Linus Torvalds 已提交
22

23
#define CORE_DUMP_USE_REGSET
24
#define ELF_EXEC_PAGESIZE	PAGE_SIZE
L
Linus Torvalds 已提交
25 26 27 28 29 30

/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
   use of this is to invoke "./ld.so someprog" to test out a new version of
   the loader.  We need to make sure that it is out of the way of the program
   that it will "exec", and that there is sufficient room for the brk.  */

A
Anton Blanchard 已提交
31 32
extern unsigned long randomize_et_dyn(unsigned long base);
#define ELF_ET_DYN_BASE		(randomize_et_dyn(0x20000000))
L
Linus Torvalds 已提交
33

34 35
#define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0)

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/*
 * Our registers are always unsigned longs, whether we're a 32 bit
 * process or 64 bit, on either a 64 bit or 32 bit kernel.
 *
 * This macro relies on elf_regs[i] having the right type to truncate to,
 * either u32 or u64.  It defines the body of the elf_core_copy_regs
 * function, either the native one with elf_gregset_t elf_regs or
 * the 32-bit one with elf_gregset_t32 elf_regs.
 */
#define PPC_ELF_CORE_COPY_REGS(elf_regs, regs) \
	int i, nregs = min(sizeof(*regs) / sizeof(unsigned long), \
			   (size_t)ELF_NGREG);			  \
	for (i = 0; i < nregs; i++) \
		elf_regs[i] = ((unsigned long *) regs)[i]; \
	memset(&elf_regs[i], 0, (ELF_NGREG - i) * sizeof(elf_regs[0]))

/* Common routine for both 32-bit and 64-bit native processes */
B
Becky Bruce 已提交
53
static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
54
					  struct pt_regs *regs)
L
Linus Torvalds 已提交
55
{
56
	PPC_ELF_CORE_COPY_REGS(elf_regs, regs);
L
Linus Torvalds 已提交
57
}
B
Becky Bruce 已提交
58
#define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs);
L
Linus Torvalds 已提交
59

60 61
typedef elf_vrregset_t elf_fpxregset_t;

B
Becky Bruce 已提交
62
/* ELF_HWCAP yields a mask that user programs can use to figure out what
L
Linus Torvalds 已提交
63 64
   instruction set this cpu supports.  This could be done in userspace,
   but it's not easy, and we've already done it here.  */
B
Becky Bruce 已提交
65
# define ELF_HWCAP	(cur_cpu_spec->cpu_user_features)
M
Michael Neuling 已提交
66
# define ELF_HWCAP2	(cur_cpu_spec->cpu_user_features2)
L
Linus Torvalds 已提交
67 68 69

/* This yields a string that ld.so will use to load implementation
   specific libraries for optimization.  This is more specific in
70
   intent than poking at uname or /proc/cpuinfo.  */
L
Linus Torvalds 已提交
71

72
#define ELF_PLATFORM	(cur_cpu_spec->platform)
73 74 75 76 77 78 79 80

/* While ELF_PLATFORM indicates the ISA supported by the platform, it
 * may not accurately reflect the underlying behavior of the hardware
 * (as in the case of running in Power5+ compatibility mode on a
 * Power6 machine).  ELF_BASE_PLATFORM allows ld.so to load libraries
 * that are tuned for the real hardware.
 */
#define ELF_BASE_PLATFORM (powerpc_base_platform)
L
Linus Torvalds 已提交
81

82 83 84 85 86
#ifdef __powerpc64__
# define ELF_PLAT_INIT(_r, load_addr)	do {	\
	_r->gpr[2] = load_addr; 		\
} while (0)
#endif /* __powerpc64__ */
L
Linus Torvalds 已提交
87

B
Becky Bruce 已提交
88
#ifdef __powerpc64__
89
# define SET_PERSONALITY(ex)					\
L
Linus Torvalds 已提交
90
do {								\
R
Rusty Russell 已提交
91 92
	if (((ex).e_flags & 0x3) == 2)				\
		set_thread_flag(TIF_ELF2ABI);			\
L
Linus Torvalds 已提交
93
	if ((ex).e_ident[EI_CLASS] == ELFCLASS32)		\
94
		set_thread_flag(TIF_32BIT);			\
L
Linus Torvalds 已提交
95
	else							\
96
		clear_thread_flag(TIF_32BIT);			\
97
	if (personality(current->personality) != PER_LINUX32)	\
98 99
		set_personality(PER_LINUX |			\
			(current->personality & (~PER_MASK)));	\
L
Linus Torvalds 已提交
100 101 102
} while (0)
/*
 * An executable for which elf_read_implies_exec() returns TRUE will
A
Anton Blanchard 已提交
103 104 105 106
 * have the READ_IMPLIES_EXEC personality flag set automatically. This
 * is only required to work around bugs in old 32bit toolchains. Since
 * the 64bit ABI has never had these issues dont enable the workaround
 * even if we have an executable stack.
L
Linus Torvalds 已提交
107
 */
108
# define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \
109
		(exec_stk == EXSTACK_DEFAULT) : 0)
B
Becky Bruce 已提交
110
#else 
111
# define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)
B
Becky Bruce 已提交
112
#endif /* __powerpc64__ */
L
Linus Torvalds 已提交
113 114 115 116 117

extern int dcache_bsize;
extern int icache_bsize;
extern int ucache_bsize;

118 119
/* vDSO has arch_setup_additional_pages */
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
L
Linus Torvalds 已提交
120
struct linux_binprm;
121
extern int arch_setup_additional_pages(struct linux_binprm *bprm,
122
				       int uses_interp);
123
#define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b)
L
Linus Torvalds 已提交
124

125 126 127 128 129
/* 1GB for 64bit, 8MB for 32bit */
#define STACK_RND_MASK (is_32bit_task() ? \
	(0x7ff >> (PAGE_SHIFT - 12)) : \
	(0x3ffff >> (PAGE_SHIFT - 12)))

130 131 132
extern unsigned long arch_randomize_brk(struct mm_struct *mm);
#define arch_randomize_brk arch_randomize_brk

133

134
#ifdef CONFIG_SPU_BASE
135 136 137 138
/* Notes used in ET_CORE. Note name is "SPU/<fd>/<filename>". */
#define NT_SPU		1

#define ARCH_HAVE_EXTRA_ELF_NOTES
139 140

#endif /* CONFIG_SPU_BASE */
141

B
Becky Bruce 已提交
142
#endif /* _ASM_POWERPC_ELF_H */