Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/s390/include/uapi/asm/ptrace.h
50902 views
1
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2
/*
3
* S390 version
4
* Copyright IBM Corp. 1999, 2000
5
* Author(s): Denis Joseph Barrow ([email protected],[email protected])
6
*/
7
8
#ifndef _UAPI_S390_PTRACE_H
9
#define _UAPI_S390_PTRACE_H
10
11
#include <linux/const.h>
12
13
/*
14
* Offsets in the user_regs_struct. They are used for the ptrace
15
* system call and in entry.S
16
*/
17
#define PT_PSWMASK 0x00
18
#define PT_PSWADDR 0x08
19
#define PT_GPR0 0x10
20
#define PT_GPR1 0x18
21
#define PT_GPR2 0x20
22
#define PT_GPR3 0x28
23
#define PT_GPR4 0x30
24
#define PT_GPR5 0x38
25
#define PT_GPR6 0x40
26
#define PT_GPR7 0x48
27
#define PT_GPR8 0x50
28
#define PT_GPR9 0x58
29
#define PT_GPR10 0x60
30
#define PT_GPR11 0x68
31
#define PT_GPR12 0x70
32
#define PT_GPR13 0x78
33
#define PT_GPR14 0x80
34
#define PT_GPR15 0x88
35
#define PT_ACR0 0x90
36
#define PT_ACR1 0x94
37
#define PT_ACR2 0x98
38
#define PT_ACR3 0x9C
39
#define PT_ACR4 0xA0
40
#define PT_ACR5 0xA4
41
#define PT_ACR6 0xA8
42
#define PT_ACR7 0xAC
43
#define PT_ACR8 0xB0
44
#define PT_ACR9 0xB4
45
#define PT_ACR10 0xB8
46
#define PT_ACR11 0xBC
47
#define PT_ACR12 0xC0
48
#define PT_ACR13 0xC4
49
#define PT_ACR14 0xC8
50
#define PT_ACR15 0xCC
51
#define PT_ORIGGPR2 0xD0
52
#define PT_FPC 0xD8
53
#define PT_FPR0 0xE0
54
#define PT_FPR1 0xE8
55
#define PT_FPR2 0xF0
56
#define PT_FPR3 0xF8
57
#define PT_FPR4 0x100
58
#define PT_FPR5 0x108
59
#define PT_FPR6 0x110
60
#define PT_FPR7 0x118
61
#define PT_FPR8 0x120
62
#define PT_FPR9 0x128
63
#define PT_FPR10 0x130
64
#define PT_FPR11 0x138
65
#define PT_FPR12 0x140
66
#define PT_FPR13 0x148
67
#define PT_FPR14 0x150
68
#define PT_FPR15 0x158
69
#define PT_CR_9 0x160
70
#define PT_CR_10 0x168
71
#define PT_CR_11 0x170
72
#define PT_IEEE_IP 0x1A8
73
#define PT_LASTOFF PT_IEEE_IP
74
#define PT_ENDREGS 0x1B0-1
75
76
#define GPR_SIZE 8
77
#define CR_SIZE 8
78
79
#define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */
80
81
#define PSW_MASK_PER _AC(0x4000000000000000, UL)
82
#define PSW_MASK_DAT _AC(0x0400000000000000, UL)
83
#define PSW_MASK_IO _AC(0x0200000000000000, UL)
84
#define PSW_MASK_EXT _AC(0x0100000000000000, UL)
85
#define PSW_MASK_BASE _AC(0x0000000000000000, UL)
86
#define PSW_MASK_KEY _AC(0x00F0000000000000, UL)
87
#define PSW_MASK_MCHECK _AC(0x0004000000000000, UL)
88
#define PSW_MASK_WAIT _AC(0x0002000000000000, UL)
89
#define PSW_MASK_PSTATE _AC(0x0001000000000000, UL)
90
#define PSW_MASK_ASC _AC(0x0000C00000000000, UL)
91
#define PSW_MASK_CC _AC(0x0000300000000000, UL)
92
#define PSW_MASK_PM _AC(0x00000F0000000000, UL)
93
#define PSW_MASK_RI _AC(0x0000008000000000, UL)
94
#define PSW_MASK_EA _AC(0x0000000100000000, UL)
95
#define PSW_MASK_BA _AC(0x0000000080000000, UL)
96
97
#define PSW_MASK_USER _AC(0x0000FF0180000000, UL)
98
99
#define PSW_ADDR_AMODE _AC(0x0000000000000000, UL)
100
#define PSW_ADDR_INSN _AC(0xFFFFFFFFFFFFFFFF, UL)
101
102
#define PSW_ASC_PRIMARY _AC(0x0000000000000000, UL)
103
#define PSW_ASC_ACCREG _AC(0x0000400000000000, UL)
104
#define PSW_ASC_SECONDARY _AC(0x0000800000000000, UL)
105
#define PSW_ASC_HOME _AC(0x0000C00000000000, UL)
106
107
#define NUM_GPRS 16
108
#define NUM_FPRS 16
109
#define NUM_CRS 16
110
#define NUM_ACRS 16
111
112
#define NUM_CR_WORDS 3
113
114
#define FPR_SIZE 8
115
#define FPC_SIZE 4
116
#define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */
117
#define ACR_SIZE 4
118
119
120
#define PTRACE_OLDSETOPTIONS 21
121
#define PTRACE_SYSEMU 31
122
#define PTRACE_SYSEMU_SINGLESTEP 32
123
124
#ifndef __ASSEMBLER__
125
#include <linux/stddef.h>
126
#include <linux/types.h>
127
128
typedef union {
129
float f;
130
double d;
131
__u64 ui;
132
struct
133
{
134
__u32 hi;
135
__u32 lo;
136
} fp;
137
} freg_t;
138
139
typedef struct {
140
__u32 fpc;
141
__u32 pad;
142
freg_t fprs[NUM_FPRS];
143
} s390_fp_regs;
144
145
#define FPC_EXCEPTION_MASK 0xF8000000
146
#define FPC_FLAGS_MASK 0x00F80000
147
#define FPC_DXC_MASK 0x0000FF00
148
#define FPC_RM_MASK 0x00000003
149
150
/* this typedef defines how a Program Status Word looks like */
151
typedef struct {
152
unsigned long mask;
153
unsigned long addr;
154
} __attribute__ ((aligned(8))) psw_t;
155
156
/*
157
* The s390_regs structure is used to define the elf_gregset_t.
158
*/
159
typedef struct {
160
psw_t psw;
161
unsigned long gprs[NUM_GPRS];
162
unsigned int acrs[NUM_ACRS];
163
unsigned long orig_gpr2;
164
} s390_regs;
165
166
/*
167
* The user_pt_regs structure exports the beginning of
168
* the in-kernel pt_regs structure to user space.
169
*/
170
typedef struct {
171
unsigned long args[1];
172
psw_t psw;
173
unsigned long gprs[NUM_GPRS];
174
} user_pt_regs;
175
176
/*
177
* Now for the user space program event recording (trace) definitions.
178
* The following structures are used only for the ptrace interface, don't
179
* touch or even look at it if you don't want to modify the user-space
180
* ptrace interface. In particular stay away from it for in-kernel PER.
181
*/
182
typedef struct {
183
unsigned long cr[NUM_CR_WORDS];
184
} per_cr_words;
185
186
#define PER_EM_MASK 0xE8000000UL
187
188
typedef struct {
189
unsigned : 32;
190
unsigned em_branching : 1;
191
unsigned em_instruction_fetch : 1;
192
/*
193
* Switching on storage alteration automatically fixes
194
* the storage alteration event bit in the users std.
195
*/
196
unsigned em_storage_alteration : 1;
197
unsigned em_gpr_alt_unused : 1;
198
unsigned em_store_real_address : 1;
199
unsigned : 3;
200
unsigned branch_addr_ctl : 1;
201
unsigned : 1;
202
unsigned storage_alt_space_ctl : 1;
203
unsigned : 21;
204
unsigned long starting_addr;
205
unsigned long ending_addr;
206
} per_cr_bits;
207
208
typedef struct {
209
unsigned short perc_atmid;
210
unsigned long address;
211
unsigned char access_id;
212
} per_lowcore_words;
213
214
typedef struct {
215
unsigned perc_branching : 1;
216
unsigned perc_instruction_fetch : 1;
217
unsigned perc_storage_alteration : 1;
218
unsigned perc_gpr_alt_unused : 1;
219
unsigned perc_store_real_address : 1;
220
unsigned : 3;
221
unsigned atmid_psw_bit_31 : 1;
222
unsigned atmid_validity_bit : 1;
223
unsigned atmid_psw_bit_32 : 1;
224
unsigned atmid_psw_bit_5 : 1;
225
unsigned atmid_psw_bit_16 : 1;
226
unsigned atmid_psw_bit_17 : 1;
227
unsigned si : 2;
228
unsigned long address;
229
unsigned : 4;
230
unsigned access_id : 4;
231
} per_lowcore_bits;
232
233
typedef struct {
234
union {
235
per_cr_words words;
236
per_cr_bits bits;
237
} control_regs;
238
/*
239
* The single_step and instruction_fetch bits are obsolete,
240
* the kernel always sets them to zero. To enable single
241
* stepping use ptrace(PTRACE_SINGLESTEP) instead.
242
*/
243
unsigned single_step : 1;
244
unsigned instruction_fetch : 1;
245
unsigned : 30;
246
/*
247
* These addresses are copied into cr10 & cr11 if single
248
* stepping is switched off
249
*/
250
unsigned long starting_addr;
251
unsigned long ending_addr;
252
union {
253
per_lowcore_words words;
254
per_lowcore_bits bits;
255
} lowcore;
256
} per_struct;
257
258
typedef struct {
259
unsigned int len;
260
unsigned long kernel_addr;
261
unsigned long process_addr;
262
} ptrace_area;
263
264
/*
265
* S/390 specific non posix ptrace requests. I chose unusual values so
266
* they are unlikely to clash with future ptrace definitions.
267
*/
268
#define PTRACE_PEEKUSR_AREA 0x5000
269
#define PTRACE_POKEUSR_AREA 0x5001
270
#define PTRACE_PEEKTEXT_AREA 0x5002
271
#define PTRACE_PEEKDATA_AREA 0x5003
272
#define PTRACE_POKETEXT_AREA 0x5004
273
#define PTRACE_POKEDATA_AREA 0x5005
274
#define PTRACE_GET_LAST_BREAK 0x5006
275
#define PTRACE_PEEK_SYSTEM_CALL 0x5007
276
#define PTRACE_POKE_SYSTEM_CALL 0x5008
277
#define PTRACE_ENABLE_TE 0x5009
278
#define PTRACE_DISABLE_TE 0x5010
279
#define PTRACE_TE_ABORT_RAND 0x5011
280
281
/*
282
* The numbers chosen here are somewhat arbitrary but absolutely MUST
283
* not overlap with any of the number assigned in <linux/ptrace.h>.
284
*/
285
#define PTRACE_SINGLEBLOCK 12 /* resume execution until next branch */
286
287
/*
288
* PT_PROT definition is loosely based on hppa bsd definition in
289
* gdb/hppab-nat.c
290
*/
291
#define PTRACE_PROT 21
292
293
typedef enum {
294
ptprot_set_access_watchpoint,
295
ptprot_set_write_watchpoint,
296
ptprot_disable_watchpoint
297
} ptprot_flags;
298
299
typedef struct {
300
unsigned long lowaddr;
301
unsigned long hiaddr;
302
ptprot_flags prot;
303
} ptprot_area;
304
305
/* Sequence of bytes for breakpoint illegal instruction. */
306
#define S390_BREAKPOINT {0x0,0x1}
307
#define S390_BREAKPOINT_U16 ((__u16)0x0001)
308
#define S390_SYSCALL_OPCODE ((__u16)0x0a00)
309
#define S390_SYSCALL_SIZE 2
310
311
/*
312
* The user_regs_struct defines the way the user registers are
313
* store on the stack for signal handling.
314
*/
315
struct user_regs_struct {
316
psw_t psw;
317
unsigned long gprs[NUM_GPRS];
318
unsigned int acrs[NUM_ACRS];
319
unsigned long orig_gpr2;
320
s390_fp_regs fp_regs;
321
/*
322
* These per registers are in here so that gdb can modify them
323
* itself as there is no "official" ptrace interface for hardware
324
* watchpoints. This is the way intel does it.
325
*/
326
per_struct per_info;
327
unsigned long ieee_instruction_pointer; /* obsolete, always 0 */
328
};
329
330
#endif /* __ASSEMBLER__ */
331
332
#endif /* _UAPI_S390_PTRACE_H */
333
334