1
2
3
4
5
6
7#ifndef __ASMS390_ELF_H
8#define __ASMS390_ELF_H
9
10
11#define R_390_NONE 0
12#define R_390_8 1
13#define R_390_12 2
14#define R_390_16 3
15#define R_390_32 4
16#define R_390_PC32 5
17#define R_390_GOT12 6
18#define R_390_GOT32 7
19#define R_390_PLT32 8
20#define R_390_COPY 9
21#define R_390_GLOB_DAT 10
22#define R_390_JMP_SLOT 11
23#define R_390_RELATIVE 12
24#define R_390_GOTOFF32 13
25#define R_390_GOTPC 14
26#define R_390_GOT16 15
27#define R_390_PC16 16
28#define R_390_PC16DBL 17
29#define R_390_PLT16DBL 18
30#define R_390_PC32DBL 19
31#define R_390_PLT32DBL 20
32#define R_390_GOTPCDBL 21
33#define R_390_64 22
34#define R_390_PC64 23
35#define R_390_GOT64 24
36#define R_390_PLT64 25
37#define R_390_GOTENT 26
38#define R_390_GOTOFF16 27
39#define R_390_GOTOFF64 28
40#define R_390_GOTPLT12 29
41#define R_390_GOTPLT16 30
42#define R_390_GOTPLT32 31
43#define R_390_GOTPLT64 32
44#define R_390_GOTPLTENT 33
45#define R_390_PLTOFF16 34
46#define R_390_PLTOFF32 35
47#define R_390_PLTOFF64 36
48#define R_390_TLS_LOAD 37
49#define R_390_TLS_GDCALL 38
50
51#define R_390_TLS_LDCALL 39
52
53#define R_390_TLS_GD32 40
54
55#define R_390_TLS_GD64 41
56
57#define R_390_TLS_GOTIE12 42
58
59#define R_390_TLS_GOTIE32 43
60
61#define R_390_TLS_GOTIE64 44
62
63#define R_390_TLS_LDM32 45
64
65#define R_390_TLS_LDM64 46
66
67#define R_390_TLS_IE32 47
68
69#define R_390_TLS_IE64 48
70
71#define R_390_TLS_IEENT 49
72
73#define R_390_TLS_LE32 50
74
75#define R_390_TLS_LE64 51
76
77#define R_390_TLS_LDO32 52
78
79#define R_390_TLS_LDO64 53
80
81#define R_390_TLS_DTPMOD 54
82#define R_390_TLS_DTPOFF 55
83#define R_390_TLS_TPOFF 56
84
85#define R_390_20 57
86#define R_390_GOT20 58
87#define R_390_GOTPLT20 59
88#define R_390_TLS_GOTIE20 60
89
90
91#define R_390_NUM 61
92
93
94#define HWCAP_S390_ESAN3 1
95#define HWCAP_S390_ZARCH 2
96#define HWCAP_S390_STFLE 4
97#define HWCAP_S390_MSA 8
98#define HWCAP_S390_LDISP 16
99#define HWCAP_S390_EIMM 32
100#define HWCAP_S390_DFP 64
101#define HWCAP_S390_HPAGE 128
102#define HWCAP_S390_ETF3EH 256
103#define HWCAP_S390_HIGH_GPRS 512
104#define HWCAP_S390_TE 1024
105#define HWCAP_S390_VXRS 2048
106#define HWCAP_S390_VXRS_BCD 4096
107#define HWCAP_S390_VXRS_EXT 8192
108#define HWCAP_S390_GS 16384
109
110
111#define HWCAP_INT_SIE 1UL
112
113
114
115
116#define ELF_CLASS ELFCLASS64
117#define ELF_DATA ELFDATA2MSB
118#define ELF_ARCH EM_S390
119
120
121#define PT_S390_PGSTE 0x70000000
122
123
124
125
126
127#include <asm/ptrace.h>
128#include <asm/compat.h>
129#include <asm/syscall.h>
130#include <asm/user.h>
131
132typedef s390_fp_regs elf_fpregset_t;
133typedef s390_regs elf_gregset_t;
134
135typedef s390_fp_regs compat_elf_fpregset_t;
136typedef s390_compat_regs compat_elf_gregset_t;
137
138#include <linux/compat.h>
139#include <linux/sched/mm.h>
140#include <asm/mmu_context.h>
141
142#include <asm/vdso.h>
143
144extern unsigned int vdso_enabled;
145
146
147
148
149#define elf_check_arch(x) \
150 (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
151 && (x)->e_ident[EI_CLASS] == ELF_CLASS)
152#define compat_elf_check_arch(x) \
153 (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
154 && (x)->e_ident[EI_CLASS] == ELF_CLASS)
155#define compat_start_thread start_thread31
156
157struct arch_elf_state {
158 int rc;
159};
160
161#define INIT_ARCH_ELF_STATE { .rc = 0 }
162
163#define arch_check_elf(ehdr, interp, interp_ehdr, state) (0)
164#ifdef CONFIG_PGSTE
165#define arch_elf_pt_proc(ehdr, phdr, elf, interp, state) \
166({ \
167 struct arch_elf_state *_state = state; \
168 if ((phdr)->p_type == PT_S390_PGSTE && \
169 !page_table_allocate_pgste && \
170 !test_thread_flag(TIF_PGSTE) && \
171 !current->mm->context.alloc_pgste) { \
172 set_thread_flag(TIF_PGSTE); \
173 set_pt_regs_flag(task_pt_regs(current), \
174 PIF_SYSCALL_RESTART); \
175 _state->rc = -EAGAIN; \
176 } \
177 _state->rc; \
178})
179#else
180#define arch_elf_pt_proc(ehdr, phdr, elf, interp, state) \
181({ \
182 (state)->rc; \
183})
184#endif
185
186
187
188#define ELF_PLAT_INIT(_r, load_addr) \
189 do { \
190 _r->gprs[14] = 0; \
191 } while (0)
192
193#define CORE_DUMP_USE_REGSET
194#define ELF_EXEC_PAGESIZE 4096
195
196
197
198
199
200
201#define ELF_ET_DYN_BASE (is_compat_task() ? 0x000400000UL : \
202 0x100000000UL)
203
204
205
206
207extern unsigned long elf_hwcap;
208#define ELF_HWCAP (elf_hwcap)
209
210
211
212extern unsigned long int_hwcap;
213
214
215
216
217
218
219
220
221#define ELF_PLATFORM_SIZE 8
222extern char elf_platform[];
223#define ELF_PLATFORM (elf_platform)
224
225#ifndef CONFIG_COMPAT
226#define SET_PERSONALITY(ex) \
227do { \
228 set_personality(PER_LINUX | \
229 (current->personality & (~PER_MASK))); \
230 current->thread.sys_call_table = \
231 (unsigned long) &sys_call_table; \
232} while (0)
233#else
234#define SET_PERSONALITY(ex) \
235do { \
236 if (personality(current->personality) != PER_LINUX32) \
237 set_personality(PER_LINUX | \
238 (current->personality & ~PER_MASK)); \
239 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) { \
240 set_thread_flag(TIF_31BIT); \
241 current->thread.sys_call_table = \
242 (unsigned long) &sys_call_table_emu; \
243 } else { \
244 clear_thread_flag(TIF_31BIT); \
245 current->thread.sys_call_table = \
246 (unsigned long) &sys_call_table; \
247 } \
248} while (0)
249#endif
250
251
252
253
254
255
256
257#define BRK_RND_MASK (is_compat_task() ? 0x7ffUL : 0x3ffffUL)
258#define MMAP_RND_MASK (is_compat_task() ? 0x7ffUL : 0x3ff80UL)
259#define MMAP_ALIGN_MASK (is_compat_task() ? 0 : 0x7fUL)
260#define STACK_RND_MASK MMAP_RND_MASK
261
262
263#define ARCH_DLINFO \
264do { \
265 if (vdso_enabled) \
266 NEW_AUX_ENT(AT_SYSINFO_EHDR, \
267 (unsigned long)current->mm->context.vdso_base); \
268} while (0)
269
270struct linux_binprm;
271
272#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
273int arch_setup_additional_pages(struct linux_binprm *, int);
274
275#endif
276