1 /* SPDX-License-Identifier: GPL-2.0 */
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 #define CORE_DUMP_USE_REGSET
69 
70 /* Format is:
71  * 	G0 --> G7
72  *	O0 --> O7
73  *	L0 --> L7
74  *	I0 --> I7
75  *	PSR, PC, nPC, Y, WIM, TBR
76  */
77 typedef unsigned long elf_greg_t;
78 #define ELF_NGREG 38
79 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
80 
81 typedef struct {
82 	union {
83 		unsigned long	pr_regs[32];
84 		double		pr_dregs[16];
85 	} pr_fr;
86 	unsigned long __unused;
87 	unsigned long	pr_fsr;
88 	unsigned char	pr_qcnt;
89 	unsigned char	pr_q_entrysize;
90 	unsigned char	pr_en;
91 	unsigned int	pr_q[64];
92 } elf_fpregset_t;
93 
94 #include <asm/mbus.h>
95 
96 /*
97  * This is used to ensure we don't load something for the wrong architecture.
98  */
99 #define elf_check_arch(x) ((x)->e_machine == EM_SPARC)
100 
101 /*
102  * These are used to set parameters in the core dumps.
103  */
104 #define ELF_ARCH	EM_SPARC
105 #define ELF_CLASS	ELFCLASS32
106 #define ELF_DATA	ELFDATA2MSB
107 
108 #define ELF_EXEC_PAGESIZE	4096
109 
110 
111 /* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
112    use of this is to invoke "./ld.so someprog" to test out a new version of
113    the loader.  We need to make sure that it is out of the way of the program
114    that it will "exec", and that there is sufficient room for the brk.  */
115 
116 #define ELF_ET_DYN_BASE         (TASK_UNMAPPED_BASE)
117 
118 /* This yields a mask that user programs can use to figure out what
119    instruction set this cpu supports.  This can NOT be done in userspace
120    on Sparc.  */
121 
122 /* Most sun4m's have them all.  */
123 #define ELF_HWCAP	(HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | \
124 			 HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV)
125 
126 /* This yields a string that ld.so will use to load implementation
127    specific libraries for optimization.  This is more specific in
128    intent than poking at uname or /proc/cpuinfo. */
129 
130 #define ELF_PLATFORM	(NULL)
131 
132 #endif /* !(__ASMSPARC_ELF_H) */
133