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#define HWCAP_S390_VXRS_EXT2 32768
111#define HWCAP_S390_VXRS_PDE 65536
112#define HWCAP_S390_SORT 131072
113#define HWCAP_S390_DFLT 262144
114
115
116#define HWCAP_INT_SIE 1UL
117
118
119
120
121#define ELF_CLASS ELFCLASS64
122#define ELF_DATA ELFDATA2MSB
123#define ELF_ARCH EM_S390
124
125
126#define PT_S390_PGSTE 0x70000000
127
128
129
130
131
132#include <linux/compat.h>
133
134#include <asm/ptrace.h>
135#include <asm/syscall.h>
136#include <asm/user.h>
137
138typedef s390_fp_regs elf_fpregset_t;
139typedef s390_regs elf_gregset_t;
140
141typedef s390_fp_regs compat_elf_fpregset_t;
142typedef s390_compat_regs compat_elf_gregset_t;
143
144#include <linux/sched/mm.h>
145#include <asm/mmu_context.h>
146
147#include <asm/vdso.h>
148
149extern unsigned int vdso_enabled;
150
151
152
153
154#define elf_check_arch(x) \
155 (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
156 && (x)->e_ident[EI_CLASS] == ELF_CLASS)
157#define compat_elf_check_arch(x) \
158 (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
159 && (x)->e_ident[EI_CLASS] == ELF_CLASS)
160#define compat_start_thread start_thread31
161
162struct arch_elf_state {
163 int rc;
164};
165
166#define INIT_ARCH_ELF_STATE { .rc = 0 }
167
168#define arch_check_elf(ehdr, interp, interp_ehdr, state) (0)
169#ifdef CONFIG_PGSTE
170#define arch_elf_pt_proc(ehdr, phdr, elf, interp, state) \
171({ \
172 struct arch_elf_state *_state = state; \
173 if ((phdr)->p_type == PT_S390_PGSTE && \
174 !page_table_allocate_pgste && \
175 !test_thread_flag(TIF_PGSTE) && \
176 !current->mm->context.alloc_pgste) { \
177 set_thread_flag(TIF_PGSTE); \
178 set_pt_regs_flag(task_pt_regs(current), \
179 PIF_SYSCALL_RESTART); \
180 _state->rc = -EAGAIN; \
181 } \
182 _state->rc; \
183})
184#else
185#define arch_elf_pt_proc(ehdr, phdr, elf, interp, state) \
186({ \
187 (state)->rc; \
188})
189#endif
190
191
192
193#define ELF_PLAT_INIT(_r, load_addr) \
194 do { \
195 _r->gprs[14] = 0; \
196 } while (0)
197
198#define CORE_DUMP_USE_REGSET
199#define ELF_EXEC_PAGESIZE PAGE_SIZE
200
201
202
203
204
205
206#define ELF_ET_DYN_BASE (is_compat_task() ? \
207 (STACK_TOP / 3 * 2) : \
208 (STACK_TOP / 3 * 2) & ~((1UL << 32) - 1))
209
210
211
212
213extern unsigned long elf_hwcap;
214#define ELF_HWCAP (elf_hwcap)
215
216
217
218extern unsigned long int_hwcap;
219
220
221
222
223
224
225
226
227#define ELF_PLATFORM_SIZE 8
228extern char elf_platform[];
229#define ELF_PLATFORM (elf_platform)
230
231#ifndef CONFIG_COMPAT
232#define SET_PERSONALITY(ex) \
233do { \
234 set_personality(PER_LINUX | \
235 (current->personality & (~PER_MASK))); \
236 current->thread.sys_call_table = \
237 (unsigned long) &sys_call_table; \
238} while (0)
239#else
240#define SET_PERSONALITY(ex) \
241do { \
242 if (personality(current->personality) != PER_LINUX32) \
243 set_personality(PER_LINUX | \
244 (current->personality & ~PER_MASK)); \
245 if ((ex).e_ident[EI_CLASS] == ELFCLASS32) { \
246 set_thread_flag(TIF_31BIT); \
247 current->thread.sys_call_table = \
248 (unsigned long) &sys_call_table_emu; \
249 } else { \
250 clear_thread_flag(TIF_31BIT); \
251 current->thread.sys_call_table = \
252 (unsigned long) &sys_call_table; \
253 } \
254} while (0)
255#endif
256
257
258
259
260
261
262
263
264
265
266#define BRK_RND_MASK (is_compat_task() ? 0x7ffUL : 0x1fffUL)
267#define MMAP_RND_MASK (is_compat_task() ? 0x7ffUL : 0x3ff80UL)
268#define MMAP_ALIGN_MASK (is_compat_task() ? 0 : 0x7fUL)
269#define STACK_RND_MASK MMAP_RND_MASK
270
271
272#define ARCH_DLINFO \
273do { \
274 if (vdso_enabled) \
275 NEW_AUX_ENT(AT_SYSINFO_EHDR, \
276 (unsigned long)current->mm->context.vdso_base); \
277} while (0)
278
279struct linux_binprm;
280
281#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
282int arch_setup_additional_pages(struct linux_binprm *, int);
283
284#endif
285