1/* $Id: elf.h,v 1.1.1.1 2007/08/03 18:53:36 Exp $ */
2#ifndef __ASMSPARC_ELF_H
3#define __ASMSPARC_ELF_H
4
5/*
6 * ELF register definitions..
7 */
8
9#include <asm/ptrace.h>
10
11/*
12 * Sparc section types
13 */
14#define STT_REGISTER		13
15
16/*
17 * Sparc ELF relocation types
18 */
19#define	R_SPARC_NONE		0
20#define	R_SPARC_8		1
21#define	R_SPARC_16		2
22#define	R_SPARC_32		3
23#define	R_SPARC_DISP8		4
24#define	R_SPARC_DISP16		5
25#define	R_SPARC_DISP32		6
26#define	R_SPARC_WDISP30		7
27#define	R_SPARC_WDISP22		8
28#define	R_SPARC_HI22		9
29#define	R_SPARC_22		10
30#define	R_SPARC_13		11
31#define	R_SPARC_LO10		12
32#define	R_SPARC_GOT10		13
33#define	R_SPARC_GOT13		14
34#define	R_SPARC_GOT22		15
35#define	R_SPARC_PC10		16
36#define	R_SPARC_PC22		17
37#define	R_SPARC_WPLT30		18
38#define	R_SPARC_COPY		19
39#define	R_SPARC_GLOB_DAT	20
40#define	R_SPARC_JMP_SLOT	21
41#define	R_SPARC_RELATIVE	22
42#define	R_SPARC_UA32		23
43#define R_SPARC_PLT32		24
44#define R_SPARC_HIPLT22		25
45#define R_SPARC_LOPLT10		26
46#define R_SPARC_PCPLT32		27
47#define R_SPARC_PCPLT22		28
48#define R_SPARC_PCPLT10		29
49#define R_SPARC_10		30
50#define R_SPARC_11		31
51#define R_SPARC_64		32
52#define R_SPARC_OLO10		33
53#define R_SPARC_WDISP16		40
54#define R_SPARC_WDISP19		41
55#define R_SPARC_7		43
56#define R_SPARC_5		44
57#define R_SPARC_6		45
58
59/* Bits present in AT_HWCAP, primarily for Sparc32.  */
60
61#define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
62#define HWCAP_SPARC_STBAR       2
63#define HWCAP_SPARC_SWAP        4
64#define HWCAP_SPARC_MULDIV      8
65#define HWCAP_SPARC_V9		16
66#define HWCAP_SPARC_ULTRA3	32
67
68/* For the most part we present code dumps in the format
69 * Solaris does.
70 */
71typedef unsigned long elf_greg_t;
72#define ELF_NGREG 38
73typedef elf_greg_t elf_gregset_t[ELF_NGREG];
74
75typedef struct {
76	union {
77		unsigned long	pr_regs[32];
78		double		pr_dregs[16];
79	} pr_fr;
80	unsigned long __unused;
81	unsigned long	pr_fsr;
82	unsigned char	pr_qcnt;
83	unsigned char	pr_q_entrysize;
84	unsigned char	pr_en;
85	unsigned int	pr_q[64];
86} elf_fpregset_t;
87
88#ifdef __KERNEL__
89#include <asm/mbus.h>
90#include <asm/uaccess.h>
91
92/* Format is:
93 * 	G0 --> G7
94 *	O0 --> O7
95 *	L0 --> L7
96 *	I0 --> I7
97 *	PSR, PC, nPC, Y, WIM, TBR
98 */
99#define ELF_CORE_COPY_REGS(__elf_regs, __pt_regs)	\
100do {	unsigned long *dest = &(__elf_regs[0]);		\
101	struct pt_regs *src = (__pt_regs);		\
102	unsigned long __user *sp;			\
103	memcpy(&dest[0], &src->u_regs[0],		\
104	       sizeof(unsigned long) * 16);		\
105	/* Don't try this at home kids... */		\
106	sp = (unsigned long __user *) src->u_regs[14];	\
107	copy_from_user(&dest[16], sp,			\
108		       sizeof(unsigned long) * 16);	\
109	dest[32] = src->psr;				\
110	dest[33] = src->pc;				\
111	dest[34] = src->npc;				\
112	dest[35] = src->y;				\
113	dest[36] = dest[37] = 0;		\
114} while(0); /* Janitors: Don't touch this semicolon. */
115
116#define ELF_CORE_COPY_TASK_REGS(__tsk, __elf_regs)	\
117	({ ELF_CORE_COPY_REGS((*(__elf_regs)), (__tsk)->thread.kregs); 1; })
118
119/*
120 * This is used to ensure we don't load something for the wrong architecture.
121 */
122#define elf_check_arch(x) ((x)->e_machine == EM_SPARC)
123
124/*
125 * These are used to set parameters in the core dumps.
126 */
127#define ELF_ARCH	EM_SPARC
128#define ELF_CLASS	ELFCLASS32
129#define ELF_DATA	ELFDATA2MSB
130
131#define USE_ELF_CORE_DUMP
132#ifndef CONFIG_SUN4
133#define ELF_EXEC_PAGESIZE	4096
134#else
135#define ELF_EXEC_PAGESIZE	8192
136#endif
137
138
139/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
140   use of this is to invoke "./ld.so someprog" to test out a new version of
141   the loader.  We need to make sure that it is out of the way of the program
142   that it will "exec", and that there is sufficient room for the brk.  */
143
144#define ELF_ET_DYN_BASE         (TASK_UNMAPPED_BASE)
145
146/* This yields a mask that user programs can use to figure out what
147   instruction set this cpu supports.  This can NOT be done in userspace
148   on Sparc.  */
149
150#define ELF_HWCAP	((ARCH_SUN4C_SUN4) ? 0 : \
151			 (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | \
152			  HWCAP_SPARC_SWAP | \
153			  ((srmmu_modtype != Cypress && \
154			    srmmu_modtype != Cypress_vE && \
155			    srmmu_modtype != Cypress_vD) ? \
156			   HWCAP_SPARC_MULDIV : 0)))
157
158/* This yields a string that ld.so will use to load implementation
159   specific libraries for optimization.  This is more specific in
160   intent than poking at uname or /proc/cpuinfo. */
161
162#define ELF_PLATFORM	(NULL)
163
164#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
165
166#endif /* __KERNEL__ */
167
168#endif /* !(__ASMSPARC_ELF_H) */
169