xref: /OK3568_Linux_fs/kernel/arch/csky/include/asm/elf.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef __ASM_CSKY_ELF_H
5*4882a593Smuzhiyun #define __ASM_CSKY_ELF_H
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <asm/ptrace.h>
8*4882a593Smuzhiyun #include <abi/regdef.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #define ELF_ARCH EM_CSKY
11*4882a593Smuzhiyun #define EM_CSKY_OLD 39
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* CSKY Relocations */
14*4882a593Smuzhiyun #define R_CSKY_NONE               0
15*4882a593Smuzhiyun #define R_CSKY_32                 1
16*4882a593Smuzhiyun #define R_CSKY_PCIMM8BY4          2
17*4882a593Smuzhiyun #define R_CSKY_PCIMM11BY2         3
18*4882a593Smuzhiyun #define R_CSKY_PCIMM4BY2          4
19*4882a593Smuzhiyun #define R_CSKY_PC32               5
20*4882a593Smuzhiyun #define R_CSKY_PCRELJSR_IMM11BY2  6
21*4882a593Smuzhiyun #define R_CSKY_GNU_VTINHERIT      7
22*4882a593Smuzhiyun #define R_CSKY_GNU_VTENTRY        8
23*4882a593Smuzhiyun #define R_CSKY_RELATIVE           9
24*4882a593Smuzhiyun #define R_CSKY_COPY               10
25*4882a593Smuzhiyun #define R_CSKY_GLOB_DAT           11
26*4882a593Smuzhiyun #define R_CSKY_JUMP_SLOT          12
27*4882a593Smuzhiyun #define R_CSKY_ADDR_HI16          24
28*4882a593Smuzhiyun #define R_CSKY_ADDR_LO16          25
29*4882a593Smuzhiyun #define R_CSKY_PCRELJSR_IMM26BY2  40
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun typedef unsigned long elf_greg_t;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun typedef struct user_fp elf_fpregset_t;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /*
36*4882a593Smuzhiyun  * In gdb/bfd elf32-csky.c, csky_elf_grok_prstatus() use fixed size of
37*4882a593Smuzhiyun  * elf_prstatus. It's 148 for abiv1 and 220 for abiv2, the size is enough
38*4882a593Smuzhiyun  * for coredump and no need full sizeof(struct pt_regs).
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #define ELF_NGREG ((sizeof(struct pt_regs) / sizeof(elf_greg_t)) - 2)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun typedef elf_greg_t elf_gregset_t[ELF_NGREG];
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun  * This is used to ensure we don't load something for the wrong architecture.
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun #define elf_check_arch(x) (((x)->e_machine == ELF_ARCH) || \
48*4882a593Smuzhiyun 			   ((x)->e_machine == EM_CSKY_OLD))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /*
51*4882a593Smuzhiyun  * These are used to set parameters in the core dumps.
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun #define USE_ELF_CORE_DUMP
54*4882a593Smuzhiyun #define ELF_EXEC_PAGESIZE		4096
55*4882a593Smuzhiyun #define ELF_CLASS			ELFCLASS32
56*4882a593Smuzhiyun #define ELF_PLAT_INIT(_r, load_addr)	{ _r->a0 = 0; }
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #ifdef __cskyBE__
59*4882a593Smuzhiyun #define ELF_DATA	ELFDATA2MSB
60*4882a593Smuzhiyun #else
61*4882a593Smuzhiyun #define ELF_DATA	ELFDATA2LSB
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /*
65*4882a593Smuzhiyun  * This is the location that an ET_DYN program is loaded if exec'ed. Typical
66*4882a593Smuzhiyun  * use of this is to invoke "./ld.so someprog" to test out a new version of
67*4882a593Smuzhiyun  * the loader.  We need to make sure that it is out of the way of the program
68*4882a593Smuzhiyun  * that it will "exec", and that there is sufficient room for the brk.
69*4882a593Smuzhiyun  */
70*4882a593Smuzhiyun #define ELF_ET_DYN_BASE	0x0UL
71*4882a593Smuzhiyun #include <abi/elf.h>
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* Similar, but for a thread other than current. */
74*4882a593Smuzhiyun struct task_struct;
75*4882a593Smuzhiyun extern int dump_task_regs(struct task_struct *tsk, elf_gregset_t *elf_regs);
76*4882a593Smuzhiyun #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define ELF_HWCAP	(0)
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun  * This yields a string that ld.so will use to load implementation specific
82*4882a593Smuzhiyun  * libraries for optimization. This is more specific in intent than poking
83*4882a593Smuzhiyun  * at uname or /proc/cpuinfo.
84*4882a593Smuzhiyun  */
85*4882a593Smuzhiyun #define ELF_PLATFORM		(NULL)
86*4882a593Smuzhiyun #define SET_PERSONALITY(ex)	set_personality(PER_LINUX)
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
89*4882a593Smuzhiyun struct linux_binprm;
90*4882a593Smuzhiyun extern int arch_setup_additional_pages(struct linux_binprm *bprm,
91*4882a593Smuzhiyun 				       int uses_interp);
92*4882a593Smuzhiyun #endif /* __ASM_CSKY_ELF_H */
93