xref: /openbmc/linux/arch/loongarch/include/asm/elf.h (revision d15de929)
1fcdfe9d2SHuacai Chen /* SPDX-License-Identifier: GPL-2.0 */
2fcdfe9d2SHuacai Chen /*
3fcdfe9d2SHuacai Chen  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4fcdfe9d2SHuacai Chen  */
5fcdfe9d2SHuacai Chen #ifndef _ASM_ELF_H
6fcdfe9d2SHuacai Chen #define _ASM_ELF_H
7fcdfe9d2SHuacai Chen 
8fcdfe9d2SHuacai Chen #include <linux/auxvec.h>
9fcdfe9d2SHuacai Chen #include <linux/fs.h>
10fcdfe9d2SHuacai Chen #include <uapi/linux/elf.h>
11fcdfe9d2SHuacai Chen 
12fcdfe9d2SHuacai Chen #include <asm/current.h>
13fcdfe9d2SHuacai Chen #include <asm/vdso.h>
14fcdfe9d2SHuacai Chen 
15fcdfe9d2SHuacai Chen /* The ABI of a file. */
16fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_LP64_SOFT_FLOAT	0x1
17fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT	0x2
18fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT	0x3
19fcdfe9d2SHuacai Chen 
20fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT	0x5
21fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT	0x6
22fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT	0x7
23fcdfe9d2SHuacai Chen 
24fcdfe9d2SHuacai Chen /* LoongArch relocation types used by the dynamic linker */
25fcdfe9d2SHuacai Chen #define R_LARCH_NONE				0
26fcdfe9d2SHuacai Chen #define R_LARCH_32				1
27fcdfe9d2SHuacai Chen #define R_LARCH_64				2
28fcdfe9d2SHuacai Chen #define R_LARCH_RELATIVE			3
29fcdfe9d2SHuacai Chen #define R_LARCH_COPY				4
30fcdfe9d2SHuacai Chen #define R_LARCH_JUMP_SLOT			5
31fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPMOD32			6
32fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPMOD64			7
33fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPREL32			8
34fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPREL64			9
35fcdfe9d2SHuacai Chen #define R_LARCH_TLS_TPREL32			10
36fcdfe9d2SHuacai Chen #define R_LARCH_TLS_TPREL64			11
37fcdfe9d2SHuacai Chen #define R_LARCH_IRELATIVE			12
38fcdfe9d2SHuacai Chen #define R_LARCH_MARK_LA				20
39fcdfe9d2SHuacai Chen #define R_LARCH_MARK_PCREL			21
40fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_PCREL			22
41fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_ABSOLUTE		23
42fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_DUP			24
43fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_GPREL			25
44fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_TLS_TPREL		26
45fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_TLS_GOT		27
46fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_TLS_GD			28
47fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_PLT_PCREL		29
48fcdfe9d2SHuacai Chen #define R_LARCH_SOP_ASSERT			30
49fcdfe9d2SHuacai Chen #define R_LARCH_SOP_NOT				31
50fcdfe9d2SHuacai Chen #define R_LARCH_SOP_SUB				32
51fcdfe9d2SHuacai Chen #define R_LARCH_SOP_SL				33
52fcdfe9d2SHuacai Chen #define R_LARCH_SOP_SR				34
53fcdfe9d2SHuacai Chen #define R_LARCH_SOP_ADD				35
54fcdfe9d2SHuacai Chen #define R_LARCH_SOP_AND				36
55fcdfe9d2SHuacai Chen #define R_LARCH_SOP_IF_ELSE			37
56fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_5		38
57fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_U_10_12		39
58fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_12		40
59fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_16		41
60fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_16_S2		42
61fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_5_20		43
62fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_0_5_10_16_S2	44
63fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_0_10_10_16_S2	45
64fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_U			46
65fcdfe9d2SHuacai Chen #define R_LARCH_ADD8				47
66fcdfe9d2SHuacai Chen #define R_LARCH_ADD16				48
67fcdfe9d2SHuacai Chen #define R_LARCH_ADD24				49
68fcdfe9d2SHuacai Chen #define R_LARCH_ADD32				50
69fcdfe9d2SHuacai Chen #define R_LARCH_ADD64				51
70fcdfe9d2SHuacai Chen #define R_LARCH_SUB8				52
71fcdfe9d2SHuacai Chen #define R_LARCH_SUB16				53
72fcdfe9d2SHuacai Chen #define R_LARCH_SUB24				54
73fcdfe9d2SHuacai Chen #define R_LARCH_SUB32				55
74fcdfe9d2SHuacai Chen #define R_LARCH_SUB64				56
75fcdfe9d2SHuacai Chen #define R_LARCH_GNU_VTINHERIT			57
76fcdfe9d2SHuacai Chen #define R_LARCH_GNU_VTENTRY			58
770a75e5d1SXi Ruoyao #define R_LARCH_B16				64
780a75e5d1SXi Ruoyao #define R_LARCH_B21				65
790a75e5d1SXi Ruoyao #define R_LARCH_B26				66
800a75e5d1SXi Ruoyao #define R_LARCH_ABS_HI20			67
810a75e5d1SXi Ruoyao #define R_LARCH_ABS_LO12			68
820a75e5d1SXi Ruoyao #define R_LARCH_ABS64_LO20			69
830a75e5d1SXi Ruoyao #define R_LARCH_ABS64_HI12			70
840a75e5d1SXi Ruoyao #define R_LARCH_PCALA_HI20			71
850a75e5d1SXi Ruoyao #define R_LARCH_PCALA_LO12			72
860a75e5d1SXi Ruoyao #define R_LARCH_PCALA64_LO20			73
870a75e5d1SXi Ruoyao #define R_LARCH_PCALA64_HI12			74
880a75e5d1SXi Ruoyao #define R_LARCH_GOT_PC_HI20			75
890a75e5d1SXi Ruoyao #define R_LARCH_GOT_PC_LO12			76
900a75e5d1SXi Ruoyao #define R_LARCH_GOT64_PC_LO20			77
910a75e5d1SXi Ruoyao #define R_LARCH_GOT64_PC_HI12			78
920a75e5d1SXi Ruoyao #define R_LARCH_GOT_HI20			79
930a75e5d1SXi Ruoyao #define R_LARCH_GOT_LO12			80
940a75e5d1SXi Ruoyao #define R_LARCH_GOT64_LO20			81
950a75e5d1SXi Ruoyao #define R_LARCH_GOT64_HI12			82
960a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE_HI20			83
970a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE_LO12			84
980a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE64_LO20			85
990a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE64_HI12			86
1000a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_PC_HI20			87
1010a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_PC_LO12			88
1020a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_PC_LO20		89
1030a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_PC_HI12		90
1040a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_HI20			91
1050a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_LO12			92
1060a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_LO20			93
1070a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_HI12			94
1080a75e5d1SXi Ruoyao #define R_LARCH_TLS_LD_PC_HI20			95
1090a75e5d1SXi Ruoyao #define R_LARCH_TLS_LD_HI20			96
1100a75e5d1SXi Ruoyao #define R_LARCH_TLS_GD_PC_HI20			97
1110a75e5d1SXi Ruoyao #define R_LARCH_TLS_GD_HI20			98
1120a75e5d1SXi Ruoyao #define R_LARCH_32_PCREL			99
1130a75e5d1SXi Ruoyao #define R_LARCH_RELAX				100
11427614988STiezhu Yang #define R_LARCH_DELETE				101
11527614988STiezhu Yang #define R_LARCH_ALIGN				102
11627614988STiezhu Yang #define R_LARCH_PCREL20_S2			103
11727614988STiezhu Yang #define R_LARCH_CFA				104
11827614988STiezhu Yang #define R_LARCH_ADD6				105
11927614988STiezhu Yang #define R_LARCH_SUB6				106
12027614988STiezhu Yang #define R_LARCH_ADD_ULEB128			107
12127614988STiezhu Yang #define R_LARCH_SUB_ULEB128			108
12227614988STiezhu Yang #define R_LARCH_64_PCREL			109
123fcdfe9d2SHuacai Chen 
124fcdfe9d2SHuacai Chen #ifndef ELF_ARCH
125fcdfe9d2SHuacai Chen 
126fcdfe9d2SHuacai Chen /* ELF register definitions */
127fcdfe9d2SHuacai Chen 
128fcdfe9d2SHuacai Chen /*
129fcdfe9d2SHuacai Chen  * General purpose have the following registers:
130fcdfe9d2SHuacai Chen  *	Register	Number
131fcdfe9d2SHuacai Chen  *	GPRs		32
132fcdfe9d2SHuacai Chen  *	ORIG_A0		1
133fcdfe9d2SHuacai Chen  *	ERA		1
134fcdfe9d2SHuacai Chen  *	BADVADDR	1
135fcdfe9d2SHuacai Chen  *	CRMD		1
136fcdfe9d2SHuacai Chen  *	PRMD		1
137fcdfe9d2SHuacai Chen  *	EUEN		1
138fcdfe9d2SHuacai Chen  *	ECFG		1
139fcdfe9d2SHuacai Chen  *	ESTAT		1
140fcdfe9d2SHuacai Chen  *	Reserved	5
141fcdfe9d2SHuacai Chen  */
142fcdfe9d2SHuacai Chen #define ELF_NGREG	45
143fcdfe9d2SHuacai Chen 
144fcdfe9d2SHuacai Chen /*
145fcdfe9d2SHuacai Chen  * Floating point have the following registers:
146fcdfe9d2SHuacai Chen  *	Register	Number
147fcdfe9d2SHuacai Chen  *	FPR		32
148fcdfe9d2SHuacai Chen  *	FCC		1
149fcdfe9d2SHuacai Chen  *	FCSR		1
150fcdfe9d2SHuacai Chen  */
151fcdfe9d2SHuacai Chen #define ELF_NFPREG	34
152fcdfe9d2SHuacai Chen 
153fcdfe9d2SHuacai Chen typedef unsigned long elf_greg_t;
154fcdfe9d2SHuacai Chen typedef elf_greg_t elf_gregset_t[ELF_NGREG];
155fcdfe9d2SHuacai Chen 
156fcdfe9d2SHuacai Chen typedef double elf_fpreg_t;
157fcdfe9d2SHuacai Chen typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
158fcdfe9d2SHuacai Chen 
159fcdfe9d2SHuacai Chen void loongarch_dump_regs64(u64 *uregs, const struct pt_regs *regs);
160fcdfe9d2SHuacai Chen 
161fcdfe9d2SHuacai Chen #ifdef CONFIG_32BIT
162fcdfe9d2SHuacai Chen /*
163fcdfe9d2SHuacai Chen  * This is used to ensure we don't load something for the wrong architecture.
164fcdfe9d2SHuacai Chen  */
165fcdfe9d2SHuacai Chen #define elf_check_arch elf32_check_arch
166fcdfe9d2SHuacai Chen 
167fcdfe9d2SHuacai Chen /*
168fcdfe9d2SHuacai Chen  * These are used to set parameters in the core dumps.
169fcdfe9d2SHuacai Chen  */
170fcdfe9d2SHuacai Chen #define ELF_CLASS	ELFCLASS32
171fcdfe9d2SHuacai Chen 
172fcdfe9d2SHuacai Chen #define ELF_CORE_COPY_REGS(dest, regs) \
173fcdfe9d2SHuacai Chen 	loongarch_dump_regs32((u32 *)&(dest), (regs));
174fcdfe9d2SHuacai Chen 
175fcdfe9d2SHuacai Chen #endif /* CONFIG_32BIT */
176fcdfe9d2SHuacai Chen 
177fcdfe9d2SHuacai Chen #ifdef CONFIG_64BIT
178fcdfe9d2SHuacai Chen /*
179fcdfe9d2SHuacai Chen  * This is used to ensure we don't load something for the wrong architecture.
180fcdfe9d2SHuacai Chen  */
181fcdfe9d2SHuacai Chen #define elf_check_arch elf64_check_arch
182fcdfe9d2SHuacai Chen 
183fcdfe9d2SHuacai Chen /*
184fcdfe9d2SHuacai Chen  * These are used to set parameters in the core dumps.
185fcdfe9d2SHuacai Chen  */
186fcdfe9d2SHuacai Chen #define ELF_CLASS	ELFCLASS64
187fcdfe9d2SHuacai Chen 
188fcdfe9d2SHuacai Chen #define ELF_CORE_COPY_REGS(dest, regs) \
189fcdfe9d2SHuacai Chen 	loongarch_dump_regs64((u64 *)&(dest), (regs));
190fcdfe9d2SHuacai Chen 
191fcdfe9d2SHuacai Chen #endif /* CONFIG_64BIT */
192fcdfe9d2SHuacai Chen 
193fcdfe9d2SHuacai Chen /*
194fcdfe9d2SHuacai Chen  * These are used to set parameters in the core dumps.
195fcdfe9d2SHuacai Chen  */
196fcdfe9d2SHuacai Chen #define ELF_DATA	ELFDATA2LSB
197fcdfe9d2SHuacai Chen #define ELF_ARCH	EM_LOONGARCH
198fcdfe9d2SHuacai Chen 
199fcdfe9d2SHuacai Chen #endif /* !defined(ELF_ARCH) */
200fcdfe9d2SHuacai Chen 
201fcdfe9d2SHuacai Chen #define loongarch_elf_check_machine(x) ((x)->e_machine == EM_LOONGARCH)
202fcdfe9d2SHuacai Chen 
203fcdfe9d2SHuacai Chen #define vmcore_elf32_check_arch loongarch_elf_check_machine
204fcdfe9d2SHuacai Chen #define vmcore_elf64_check_arch loongarch_elf_check_machine
205fcdfe9d2SHuacai Chen 
206fcdfe9d2SHuacai Chen /*
207fcdfe9d2SHuacai Chen  * Return non-zero if HDR identifies an 32bit ELF binary.
208fcdfe9d2SHuacai Chen  */
209fcdfe9d2SHuacai Chen #define elf32_check_arch(hdr)						\
210fcdfe9d2SHuacai Chen ({									\
211fcdfe9d2SHuacai Chen 	int __res = 1;							\
212fcdfe9d2SHuacai Chen 	struct elfhdr *__h = (hdr);					\
213fcdfe9d2SHuacai Chen 									\
214fcdfe9d2SHuacai Chen 	if (!loongarch_elf_check_machine(__h))				\
215fcdfe9d2SHuacai Chen 		__res = 0;						\
216fcdfe9d2SHuacai Chen 	if (__h->e_ident[EI_CLASS] != ELFCLASS32)			\
217fcdfe9d2SHuacai Chen 		__res = 0;						\
218fcdfe9d2SHuacai Chen 									\
219fcdfe9d2SHuacai Chen 	__res;								\
220fcdfe9d2SHuacai Chen })
221fcdfe9d2SHuacai Chen 
222fcdfe9d2SHuacai Chen /*
223fcdfe9d2SHuacai Chen  * Return non-zero if HDR identifies an 64bit ELF binary.
224fcdfe9d2SHuacai Chen  */
225fcdfe9d2SHuacai Chen #define elf64_check_arch(hdr)						\
226fcdfe9d2SHuacai Chen ({									\
227fcdfe9d2SHuacai Chen 	int __res = 1;							\
228fcdfe9d2SHuacai Chen 	struct elfhdr *__h = (hdr);					\
229fcdfe9d2SHuacai Chen 									\
230fcdfe9d2SHuacai Chen 	if (!loongarch_elf_check_machine(__h))				\
231fcdfe9d2SHuacai Chen 		__res = 0;						\
232fcdfe9d2SHuacai Chen 	if (__h->e_ident[EI_CLASS] != ELFCLASS64)			\
233fcdfe9d2SHuacai Chen 		__res = 0;						\
234fcdfe9d2SHuacai Chen 									\
235fcdfe9d2SHuacai Chen 	__res;								\
236fcdfe9d2SHuacai Chen })
237fcdfe9d2SHuacai Chen 
238fcdfe9d2SHuacai Chen #ifdef CONFIG_32BIT
239fcdfe9d2SHuacai Chen 
240fcdfe9d2SHuacai Chen #define SET_PERSONALITY2(ex, state)					\
241fcdfe9d2SHuacai Chen do {									\
242fcdfe9d2SHuacai Chen 	current->thread.vdso = &vdso_info;				\
243fcdfe9d2SHuacai Chen 									\
244fcdfe9d2SHuacai Chen 	if (personality(current->personality) != PER_LINUX)		\
245fcdfe9d2SHuacai Chen 		set_personality(PER_LINUX);				\
246fcdfe9d2SHuacai Chen } while (0)
247fcdfe9d2SHuacai Chen 
248fcdfe9d2SHuacai Chen #endif /* CONFIG_32BIT */
249fcdfe9d2SHuacai Chen 
250fcdfe9d2SHuacai Chen #ifdef CONFIG_64BIT
251fcdfe9d2SHuacai Chen 
252fcdfe9d2SHuacai Chen #define SET_PERSONALITY2(ex, state)					\
253fcdfe9d2SHuacai Chen do {									\
254fcdfe9d2SHuacai Chen 	unsigned int p;							\
255fcdfe9d2SHuacai Chen 									\
256fcdfe9d2SHuacai Chen 	clear_thread_flag(TIF_32BIT_REGS);				\
257fcdfe9d2SHuacai Chen 	clear_thread_flag(TIF_32BIT_ADDR);				\
258fcdfe9d2SHuacai Chen 									\
259fcdfe9d2SHuacai Chen 	current->thread.vdso = &vdso_info;				\
260fcdfe9d2SHuacai Chen 									\
261fcdfe9d2SHuacai Chen 	p = personality(current->personality);				\
262fcdfe9d2SHuacai Chen 	if (p != PER_LINUX32 && p != PER_LINUX)				\
263fcdfe9d2SHuacai Chen 		set_personality(PER_LINUX);				\
264fcdfe9d2SHuacai Chen } while (0)
265fcdfe9d2SHuacai Chen 
266fcdfe9d2SHuacai Chen #endif /* CONFIG_64BIT */
267fcdfe9d2SHuacai Chen 
268fcdfe9d2SHuacai Chen #define CORE_DUMP_USE_REGSET
269fcdfe9d2SHuacai Chen #define ELF_EXEC_PAGESIZE	PAGE_SIZE
270fcdfe9d2SHuacai Chen 
271fcdfe9d2SHuacai Chen /*
272fcdfe9d2SHuacai Chen  * This yields a mask that user programs can use to figure out what
273fcdfe9d2SHuacai Chen  * instruction set this cpu supports. This could be done in userspace,
274fcdfe9d2SHuacai Chen  * but it's not easy, and we've already done it here.
275fcdfe9d2SHuacai Chen  */
276fcdfe9d2SHuacai Chen 
277fcdfe9d2SHuacai Chen #define ELF_HWCAP	(elf_hwcap)
278fcdfe9d2SHuacai Chen extern unsigned int elf_hwcap;
279fcdfe9d2SHuacai Chen #include <asm/hwcap.h>
280fcdfe9d2SHuacai Chen 
281fcdfe9d2SHuacai Chen /*
282fcdfe9d2SHuacai Chen  * This yields a string that ld.so will use to load implementation
283fcdfe9d2SHuacai Chen  * specific libraries for optimization.	 This is more specific in
284fcdfe9d2SHuacai Chen  * intent than poking at uname or /proc/cpuinfo.
285fcdfe9d2SHuacai Chen  */
286fcdfe9d2SHuacai Chen 
287fcdfe9d2SHuacai Chen #define ELF_PLATFORM  __elf_platform
288fcdfe9d2SHuacai Chen extern const char *__elf_platform;
289fcdfe9d2SHuacai Chen 
290fcdfe9d2SHuacai Chen #define ELF_PLAT_INIT(_r, load_addr)	do { \
291fcdfe9d2SHuacai Chen 	_r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0;	\
292fcdfe9d2SHuacai Chen 	_r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0;	\
293*4dd2d87cSHengqi Chen 	_r->regs[9] = _r->regs[10] /* syscall n */ = _r->regs[12] = 0;	\
294fcdfe9d2SHuacai Chen 	_r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0;	\
295fcdfe9d2SHuacai Chen 	_r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0;	\
296fcdfe9d2SHuacai Chen 	_r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0;	\
297fcdfe9d2SHuacai Chen 	_r->regs[25] = _r->regs[26] = _r->regs[27] = _r->regs[28] = 0;	\
298fcdfe9d2SHuacai Chen 	_r->regs[29] = _r->regs[30] = _r->regs[31] = 0;			\
299fcdfe9d2SHuacai Chen } while (0)
300fcdfe9d2SHuacai Chen 
301fcdfe9d2SHuacai Chen /*
302fcdfe9d2SHuacai Chen  * This is the location that an ET_DYN program is loaded if exec'ed. Typical
303fcdfe9d2SHuacai Chen  * use of this is to invoke "./ld.so someprog" to test out a new version of
304fcdfe9d2SHuacai Chen  * the loader. We need to make sure that it is out of the way of the program
305fcdfe9d2SHuacai Chen  * that it will "exec", and that there is sufficient room for the brk.
306fcdfe9d2SHuacai Chen  */
307fcdfe9d2SHuacai Chen 
308fcdfe9d2SHuacai Chen #define ELF_ET_DYN_BASE		(TASK_SIZE / 3 * 2)
309fcdfe9d2SHuacai Chen 
310fcdfe9d2SHuacai Chen /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
311fcdfe9d2SHuacai Chen #define ARCH_DLINFO							\
312fcdfe9d2SHuacai Chen do {									\
313fcdfe9d2SHuacai Chen 	NEW_AUX_ENT(AT_SYSINFO_EHDR,					\
314fcdfe9d2SHuacai Chen 		    (unsigned long)current->mm->context.vdso);		\
315fcdfe9d2SHuacai Chen } while (0)
316fcdfe9d2SHuacai Chen 
317fcdfe9d2SHuacai Chen #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
318fcdfe9d2SHuacai Chen struct linux_binprm;
319fcdfe9d2SHuacai Chen extern int arch_setup_additional_pages(struct linux_binprm *bprm,
320fcdfe9d2SHuacai Chen 				       int uses_interp);
321fcdfe9d2SHuacai Chen 
322fcdfe9d2SHuacai Chen struct arch_elf_state {
323fcdfe9d2SHuacai Chen 	int fp_abi;
324fcdfe9d2SHuacai Chen 	int interp_fp_abi;
325fcdfe9d2SHuacai Chen };
326fcdfe9d2SHuacai Chen 
327fcdfe9d2SHuacai Chen #define LOONGARCH_ABI_FP_ANY	(0)
328fcdfe9d2SHuacai Chen 
329fcdfe9d2SHuacai Chen #define INIT_ARCH_ELF_STATE {			\
330fcdfe9d2SHuacai Chen 	.fp_abi = LOONGARCH_ABI_FP_ANY,		\
331fcdfe9d2SHuacai Chen 	.interp_fp_abi = LOONGARCH_ABI_FP_ANY,	\
332fcdfe9d2SHuacai Chen }
333fcdfe9d2SHuacai Chen 
334fcdfe9d2SHuacai Chen extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf,
335fcdfe9d2SHuacai Chen 			    bool is_interp, struct arch_elf_state *state);
336fcdfe9d2SHuacai Chen 
337fcdfe9d2SHuacai Chen extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr,
338fcdfe9d2SHuacai Chen 			  struct arch_elf_state *state);
339fcdfe9d2SHuacai Chen 
340fcdfe9d2SHuacai Chen #endif /* _ASM_ELF_H */
341