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