xref: /OK3568_Linux_fs/kernel/arch/sh/include/asm/elf.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __ASM_SH_ELF_H
3*4882a593Smuzhiyun #define __ASM_SH_ELF_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/utsname.h>
6*4882a593Smuzhiyun #include <asm/auxvec.h>
7*4882a593Smuzhiyun #include <asm/ptrace.h>
8*4882a593Smuzhiyun #include <asm/user.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /* ELF header e_flags defines */
11*4882a593Smuzhiyun #define EF_SH_PIC		0x100	/* -fpic */
12*4882a593Smuzhiyun #define EF_SH_FDPIC		0x8000	/* -mfdpic */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /* SH (particularly SHcompact) relocation types  */
15*4882a593Smuzhiyun #define	R_SH_NONE		0
16*4882a593Smuzhiyun #define	R_SH_DIR32		1
17*4882a593Smuzhiyun #define	R_SH_REL32		2
18*4882a593Smuzhiyun #define	R_SH_DIR8WPN		3
19*4882a593Smuzhiyun #define	R_SH_IND12W		4
20*4882a593Smuzhiyun #define	R_SH_DIR8WPL		5
21*4882a593Smuzhiyun #define	R_SH_DIR8WPZ		6
22*4882a593Smuzhiyun #define	R_SH_DIR8BP		7
23*4882a593Smuzhiyun #define	R_SH_DIR8W		8
24*4882a593Smuzhiyun #define	R_SH_DIR8L		9
25*4882a593Smuzhiyun #define	R_SH_SWITCH16		25
26*4882a593Smuzhiyun #define	R_SH_SWITCH32		26
27*4882a593Smuzhiyun #define	R_SH_USES		27
28*4882a593Smuzhiyun #define	R_SH_COUNT		28
29*4882a593Smuzhiyun #define	R_SH_ALIGN		29
30*4882a593Smuzhiyun #define	R_SH_CODE		30
31*4882a593Smuzhiyun #define	R_SH_DATA		31
32*4882a593Smuzhiyun #define	R_SH_LABEL		32
33*4882a593Smuzhiyun #define	R_SH_SWITCH8		33
34*4882a593Smuzhiyun #define	R_SH_GNU_VTINHERIT	34
35*4882a593Smuzhiyun #define	R_SH_GNU_VTENTRY	35
36*4882a593Smuzhiyun #define	R_SH_TLS_GD_32		144
37*4882a593Smuzhiyun #define	R_SH_TLS_LD_32		145
38*4882a593Smuzhiyun #define	R_SH_TLS_LDO_32		146
39*4882a593Smuzhiyun #define	R_SH_TLS_IE_32		147
40*4882a593Smuzhiyun #define	R_SH_TLS_LE_32		148
41*4882a593Smuzhiyun #define	R_SH_TLS_DTPMOD32	149
42*4882a593Smuzhiyun #define	R_SH_TLS_DTPOFF32	150
43*4882a593Smuzhiyun #define	R_SH_TLS_TPOFF32	151
44*4882a593Smuzhiyun #define	R_SH_GOT32		160
45*4882a593Smuzhiyun #define	R_SH_PLT32		161
46*4882a593Smuzhiyun #define	R_SH_COPY		162
47*4882a593Smuzhiyun #define	R_SH_GLOB_DAT		163
48*4882a593Smuzhiyun #define	R_SH_JMP_SLOT		164
49*4882a593Smuzhiyun #define	R_SH_RELATIVE		165
50*4882a593Smuzhiyun #define	R_SH_GOTOFF		166
51*4882a593Smuzhiyun #define	R_SH_GOTPC		167
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /* FDPIC relocs */
54*4882a593Smuzhiyun #define R_SH_GOT20		201
55*4882a593Smuzhiyun #define R_SH_GOTOFF20		202
56*4882a593Smuzhiyun #define R_SH_GOTFUNCDESC	203
57*4882a593Smuzhiyun #define R_SH_GOTFUNCDESC20	204
58*4882a593Smuzhiyun #define R_SH_GOTOFFFUNCDESC	205
59*4882a593Smuzhiyun #define R_SH_GOTOFFFUNCDESC20	206
60*4882a593Smuzhiyun #define R_SH_FUNCDESC		207
61*4882a593Smuzhiyun #define R_SH_FUNCDESC_VALUE	208
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* SHmedia relocs */
64*4882a593Smuzhiyun #define R_SH_IMM_LOW16		246
65*4882a593Smuzhiyun #define R_SH_IMM_LOW16_PCREL	247
66*4882a593Smuzhiyun #define R_SH_IMM_MEDLOW16	248
67*4882a593Smuzhiyun #define R_SH_IMM_MEDLOW16_PCREL	249
68*4882a593Smuzhiyun /* Keep this the last entry.  */
69*4882a593Smuzhiyun #define	R_SH_NUM		256
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /*
72*4882a593Smuzhiyun  * ELF register definitions..
73*4882a593Smuzhiyun  */
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun typedef unsigned long elf_greg_t;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
78*4882a593Smuzhiyun typedef elf_greg_t elf_gregset_t[ELF_NGREG];
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun typedef struct user_fpu_struct elf_fpregset_t;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun /*
83*4882a593Smuzhiyun  * These are used to set parameters in the core dumps.
84*4882a593Smuzhiyun  */
85*4882a593Smuzhiyun #define ELF_CLASS	ELFCLASS32
86*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN__
87*4882a593Smuzhiyun #define ELF_DATA	ELFDATA2LSB
88*4882a593Smuzhiyun #else
89*4882a593Smuzhiyun #define ELF_DATA	ELFDATA2MSB
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun #define ELF_ARCH	EM_SH
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /*
94*4882a593Smuzhiyun  * This is used to ensure we don't load something for the wrong architecture.
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun #define elf_check_arch(x)		((x)->e_machine == EM_SH)
97*4882a593Smuzhiyun #define elf_check_fdpic(x)		((x)->e_flags & EF_SH_FDPIC)
98*4882a593Smuzhiyun #define elf_check_const_displacement(x)	((x)->e_flags & EF_SH_PIC)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /*
101*4882a593Smuzhiyun  * Enable dump using regset.
102*4882a593Smuzhiyun  * This covers all of general/DSP/FPU regs.
103*4882a593Smuzhiyun  */
104*4882a593Smuzhiyun #define CORE_DUMP_USE_REGSET
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #define ELF_FDPIC_CORE_EFLAGS	EF_SH_FDPIC
107*4882a593Smuzhiyun #define ELF_EXEC_PAGESIZE	PAGE_SIZE
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
110*4882a593Smuzhiyun    use of this is to invoke "./ld.so someprog" to test out a new version of
111*4882a593Smuzhiyun    the loader.  We need to make sure that it is out of the way of the program
112*4882a593Smuzhiyun    that it will "exec", and that there is sufficient room for the brk.  */
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define ELF_ET_DYN_BASE         (2 * TASK_SIZE / 3)
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define ELF_CORE_COPY_REGS(_dest,_regs)				\
117*4882a593Smuzhiyun 	memcpy((char *) &_dest, (char *) _regs,			\
118*4882a593Smuzhiyun 	       sizeof(struct pt_regs));
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* This yields a mask that user programs can use to figure out what
121*4882a593Smuzhiyun    instruction set this CPU supports.  This could be done in user space,
122*4882a593Smuzhiyun    but it's not easy, and we've already done it here.  */
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define ELF_HWCAP	(boot_cpu_data.flags)
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /* This yields a string that ld.so will use to load implementation
127*4882a593Smuzhiyun    specific libraries for optimization.  This is more specific in
128*4882a593Smuzhiyun    intent than poking at uname or /proc/cpuinfo.
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun    For the moment, we have only optimizations for the Intel generations,
131*4882a593Smuzhiyun    but that could change... */
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define ELF_PLATFORM	(utsname()->machine)
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define ELF_PLAT_INIT(_r, load_addr) \
136*4882a593Smuzhiyun   do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
137*4882a593Smuzhiyun        _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
138*4882a593Smuzhiyun        _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
139*4882a593Smuzhiyun        _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \
140*4882a593Smuzhiyun        _r->sr = SR_FD; } while (0)
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define ELF_FDPIC_PLAT_INIT(_r, _exec_map_addr, _interp_map_addr,	\
143*4882a593Smuzhiyun 			    _dynamic_addr)				\
144*4882a593Smuzhiyun do {									\
145*4882a593Smuzhiyun 	_r->regs[0]	= 0;						\
146*4882a593Smuzhiyun 	_r->regs[1]	= 0;						\
147*4882a593Smuzhiyun 	_r->regs[2]	= 0;						\
148*4882a593Smuzhiyun 	_r->regs[3]	= 0;						\
149*4882a593Smuzhiyun 	_r->regs[4]	= 0;						\
150*4882a593Smuzhiyun 	_r->regs[5]	= 0;						\
151*4882a593Smuzhiyun 	_r->regs[6]	= 0;						\
152*4882a593Smuzhiyun 	_r->regs[7]	= 0;						\
153*4882a593Smuzhiyun 	_r->regs[8]	= _exec_map_addr;				\
154*4882a593Smuzhiyun 	_r->regs[9]	= _interp_map_addr;				\
155*4882a593Smuzhiyun 	_r->regs[10]	= _dynamic_addr;				\
156*4882a593Smuzhiyun 	_r->regs[11]	= 0;						\
157*4882a593Smuzhiyun 	_r->regs[12]	= 0;						\
158*4882a593Smuzhiyun 	_r->regs[13]	= 0;						\
159*4882a593Smuzhiyun 	_r->regs[14]	= 0;						\
160*4882a593Smuzhiyun 	_r->sr		= SR_FD;					\
161*4882a593Smuzhiyun } while (0)
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun #define SET_PERSONALITY(ex) \
164*4882a593Smuzhiyun 	set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #ifdef CONFIG_VSYSCALL
167*4882a593Smuzhiyun /* vDSO has arch_setup_additional_pages */
168*4882a593Smuzhiyun #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
169*4882a593Smuzhiyun struct linux_binprm;
170*4882a593Smuzhiyun extern int arch_setup_additional_pages(struct linux_binprm *bprm,
171*4882a593Smuzhiyun 				       int uses_interp);
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun extern unsigned int vdso_enabled;
174*4882a593Smuzhiyun extern void __kernel_vsyscall;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #define VDSO_BASE		((unsigned long)current->mm->context.vdso)
177*4882a593Smuzhiyun #define VDSO_SYM(x)		(VDSO_BASE + (unsigned long)(x))
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun #define VSYSCALL_AUX_ENT					\
180*4882a593Smuzhiyun 	if (vdso_enabled)					\
181*4882a593Smuzhiyun 		NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);	\
182*4882a593Smuzhiyun 	else							\
183*4882a593Smuzhiyun 		NEW_AUX_ENT(AT_IGNORE, 0)
184*4882a593Smuzhiyun #else
185*4882a593Smuzhiyun #define VSYSCALL_AUX_ENT	NEW_AUX_ENT(AT_IGNORE, 0)
186*4882a593Smuzhiyun #endif /* CONFIG_VSYSCALL */
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun #ifdef CONFIG_SH_FPU
189*4882a593Smuzhiyun #define FPU_AUX_ENT	NEW_AUX_ENT(AT_FPUCW, FPSCR_INIT)
190*4882a593Smuzhiyun #else
191*4882a593Smuzhiyun #define FPU_AUX_ENT	NEW_AUX_ENT(AT_IGNORE, 0)
192*4882a593Smuzhiyun #endif
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun extern int l1i_cache_shape, l1d_cache_shape, l2_cache_shape;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
197*4882a593Smuzhiyun #define ARCH_DLINFO						\
198*4882a593Smuzhiyun do {								\
199*4882a593Smuzhiyun 	/* Optional FPU initialization */			\
200*4882a593Smuzhiyun 	FPU_AUX_ENT;						\
201*4882a593Smuzhiyun 								\
202*4882a593Smuzhiyun 	/* Optional vsyscall entry */				\
203*4882a593Smuzhiyun 	VSYSCALL_AUX_ENT;					\
204*4882a593Smuzhiyun 								\
205*4882a593Smuzhiyun 	/* Cache desc */					\
206*4882a593Smuzhiyun 	NEW_AUX_ENT(AT_L1I_CACHESHAPE, l1i_cache_shape);	\
207*4882a593Smuzhiyun 	NEW_AUX_ENT(AT_L1D_CACHESHAPE, l1d_cache_shape);	\
208*4882a593Smuzhiyun 	NEW_AUX_ENT(AT_L2_CACHESHAPE, l2_cache_shape);		\
209*4882a593Smuzhiyun } while (0)
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #endif /* __ASM_SH_ELF_H */
212