1#ifndef __ASM_SH_ELF_H
2#define __ASM_SH_ELF_H
3
4#include <asm/auxvec.h>
5#include <asm/ptrace.h>
6#include <asm/user.h>
7
8/* SH relocation types  */
9#define	R_SH_NONE		0
10#define	R_SH_DIR32		1
11#define	R_SH_REL32		2
12#define	R_SH_DIR8WPN		3
13#define	R_SH_IND12W		4
14#define	R_SH_DIR8WPL		5
15#define	R_SH_DIR8WPZ		6
16#define	R_SH_DIR8BP		7
17#define	R_SH_DIR8W		8
18#define	R_SH_DIR8L		9
19#define	R_SH_SWITCH16		25
20#define	R_SH_SWITCH32		26
21#define	R_SH_USES		27
22#define	R_SH_COUNT		28
23#define	R_SH_ALIGN		29
24#define	R_SH_CODE		30
25#define	R_SH_DATA		31
26#define	R_SH_LABEL		32
27#define	R_SH_SWITCH8		33
28#define	R_SH_GNU_VTINHERIT	34
29#define	R_SH_GNU_VTENTRY	35
30#define	R_SH_TLS_GD_32		144
31#define	R_SH_TLS_LD_32		145
32#define	R_SH_TLS_LDO_32		146
33#define	R_SH_TLS_IE_32		147
34#define	R_SH_TLS_LE_32		148
35#define	R_SH_TLS_DTPMOD32	149
36#define	R_SH_TLS_DTPOFF32	150
37#define	R_SH_TLS_TPOFF32	151
38#define	R_SH_GOT32		160
39#define	R_SH_PLT32		161
40#define	R_SH_COPY		162
41#define	R_SH_GLOB_DAT		163
42#define	R_SH_JMP_SLOT		164
43#define	R_SH_RELATIVE		165
44#define	R_SH_GOTOFF		166
45#define	R_SH_GOTPC		167
46/* Keep this the last entry.  */
47#define	R_SH_NUM		256
48
49/*
50 * ELF register definitions..
51 */
52
53typedef unsigned long elf_greg_t;
54
55#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
56typedef elf_greg_t elf_gregset_t[ELF_NGREG];
57
58typedef struct user_fpu_struct elf_fpregset_t;
59
60/*
61 * This is used to ensure we don't load something for the wrong architecture.
62 */
63#define elf_check_arch(x) ( (x)->e_machine == EM_SH )
64
65/*
66 * These are used to set parameters in the core dumps.
67 */
68#define ELF_CLASS	ELFCLASS32
69#ifdef __LITTLE_ENDIAN__
70#define ELF_DATA	ELFDATA2LSB
71#else
72#define ELF_DATA	ELFDATA2MSB
73#endif
74#define ELF_ARCH	EM_SH
75
76#define USE_ELF_CORE_DUMP
77#define ELF_EXEC_PAGESIZE	PAGE_SIZE
78
79/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
80   use of this is to invoke "./ld.so someprog" to test out a new version of
81   the loader.  We need to make sure that it is out of the way of the program
82   that it will "exec", and that there is sufficient room for the brk.  */
83
84#define ELF_ET_DYN_BASE         (2 * TASK_SIZE / 3)
85
86
87#define ELF_CORE_COPY_REGS(_dest,_regs)				\
88	memcpy((char *) &_dest, (char *) _regs,			\
89	       sizeof(struct pt_regs));
90
91/* This yields a mask that user programs can use to figure out what
92   instruction set this CPU supports.  This could be done in user space,
93   but it's not easy, and we've already done it here.  */
94
95#define ELF_HWCAP	(boot_cpu_data.flags)
96
97/* This yields a string that ld.so will use to load implementation
98   specific libraries for optimization.  This is more specific in
99   intent than poking at uname or /proc/cpuinfo.
100
101   For the moment, we have only optimizations for the Intel generations,
102   but that could change... */
103
104#define ELF_PLATFORM  (NULL)
105
106#define ELF_PLAT_INIT(_r, load_addr) \
107  do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
108       _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
109       _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
110       _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \
111       _r->sr = SR_FD; } while (0)
112
113#ifdef __KERNEL__
114#define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX_32BIT)
115struct task_struct;
116extern int dump_task_regs (struct task_struct *, elf_gregset_t *);
117extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);
118
119#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
120#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)
121#endif
122
123#ifdef CONFIG_VSYSCALL
124/* vDSO has arch_setup_additional_pages */
125#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
126struct linux_binprm;
127extern int arch_setup_additional_pages(struct linux_binprm *bprm,
128				       int executable_stack);
129
130extern unsigned int vdso_enabled;
131extern void __kernel_vsyscall;
132
133#define VDSO_BASE		((unsigned long)current->mm->context.vdso)
134#define VDSO_SYM(x)		(VDSO_BASE + (unsigned long)(x))
135
136#define ARCH_DLINFO						\
137do {								\
138	if (vdso_enabled)					\
139		NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);	\
140} while (0)
141#endif /* CONFIG_VSYSCALL */
142
143#endif /* __ASM_SH_ELF_H */
144