1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * S390 version
4 * Copyright IBM Corp. 1999, 2000
5 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6 */
7 #ifndef _S390_PTRACE_H
8 #define _S390_PTRACE_H
9
10 #include <linux/bits.h>
11 #include <linux/typecheck.h>
12 #include <uapi/asm/ptrace.h>
13 #include <asm/thread_info.h>
14 #include <asm/tpi.h>
15
16 #define PIF_SYSCALL 0 /* inside a system call */
17 #define PIF_PSW_ADDR_ADJUSTED 1 /* psw address has been adjusted */
18 #define PIF_SYSCALL_RET_SET 2 /* return value was set via ptrace */
19 #define PIF_FTRACE_FULL_REGS 3 /* all register contents valid (ftrace) */
20 #define PIF_WARN_TRAP_SKIPPED 4 /* __WARN_trap() was skipped */
21 #define PIF_PGM_CHECK 5 /* inside a program check */
22
23 #define _PIF_SYSCALL BIT(PIF_SYSCALL)
24 #define _PIF_ADDR_PSW_ADJUSTED BIT(PIF_PSW_ADDR_ADJUSTED)
25 #define _PIF_SYSCALL_RET_SET BIT(PIF_SYSCALL_RET_SET)
26 #define _PIF_FTRACE_FULL_REGS BIT(PIF_FTRACE_FULL_REGS)
27 #define _PIF_WARN_TRAP_SKIPPED BIT(PIF_WARN_TRAP_SKIPPED)
28 #define _PIF_PGM_CHECK BIT(PIF_PGM_CHECK)
29
30 #define PSW32_MASK_PER _AC(0x40000000, UL)
31 #define PSW32_MASK_DAT _AC(0x04000000, UL)
32 #define PSW32_MASK_IO _AC(0x02000000, UL)
33 #define PSW32_MASK_EXT _AC(0x01000000, UL)
34 #define PSW32_MASK_KEY _AC(0x00F00000, UL)
35 #define PSW32_MASK_BASE _AC(0x00080000, UL) /* Always one */
36 #define PSW32_MASK_MCHECK _AC(0x00040000, UL)
37 #define PSW32_MASK_WAIT _AC(0x00020000, UL)
38 #define PSW32_MASK_PSTATE _AC(0x00010000, UL)
39 #define PSW32_MASK_ASC _AC(0x0000C000, UL)
40 #define PSW32_MASK_CC _AC(0x00003000, UL)
41 #define PSW32_MASK_PM _AC(0x00000f00, UL)
42 #define PSW32_MASK_RI _AC(0x00000080, UL)
43
44 #define PSW32_ADDR_AMODE _AC(0x80000000, UL)
45 #define PSW32_ADDR_INSN _AC(0x7FFFFFFF, UL)
46
47 #define PSW32_DEFAULT_KEY ((PAGE_DEFAULT_ACC) << 20)
48
49 #define PSW32_ASC_PRIMARY _AC(0x00000000, UL)
50 #define PSW32_ASC_ACCREG _AC(0x00004000, UL)
51 #define PSW32_ASC_SECONDARY _AC(0x00008000, UL)
52 #define PSW32_ASC_HOME _AC(0x0000C000, UL)
53
54 #define PSW_DEFAULT_KEY ((PAGE_DEFAULT_ACC) << 52)
55
56 #define PSW_KERNEL_BITS (PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_ASC_HOME | \
57 PSW_MASK_EA | PSW_MASK_BA | PSW_MASK_DAT)
58 #define PSW_USER_BITS (PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | \
59 PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_MASK_MCHECK | \
60 PSW_MASK_PSTATE | PSW_ASC_PRIMARY)
61
62 #ifndef __ASSEMBLER__
63
64 struct psw_bits {
65 unsigned long : 1;
66 unsigned long per : 1; /* PER-Mask */
67 unsigned long : 3;
68 unsigned long dat : 1; /* DAT Mode */
69 unsigned long io : 1; /* Input/Output Mask */
70 unsigned long ext : 1; /* External Mask */
71 unsigned long key : 4; /* PSW Key */
72 unsigned long : 1;
73 unsigned long mcheck : 1; /* Machine-Check Mask */
74 unsigned long wait : 1; /* Wait State */
75 unsigned long pstate : 1; /* Problem State */
76 unsigned long as : 2; /* Address Space Control */
77 unsigned long cc : 2; /* Condition Code */
78 unsigned long pm : 4; /* Program Mask */
79 unsigned long ri : 1; /* Runtime Instrumentation */
80 unsigned long : 6;
81 unsigned long eaba : 2; /* Addressing Mode */
82 unsigned long : 31;
83 unsigned long ia : 64; /* Instruction Address */
84 };
85
86 enum {
87 PSW_BITS_AMODE_24BIT = 0,
88 PSW_BITS_AMODE_31BIT = 1,
89 PSW_BITS_AMODE_64BIT = 3
90 };
91
92 enum {
93 PSW_BITS_AS_PRIMARY = 0,
94 PSW_BITS_AS_ACCREG = 1,
95 PSW_BITS_AS_SECONDARY = 2,
96 PSW_BITS_AS_HOME = 3
97 };
98
99 #define psw_bits(__psw) (*({ \
100 typecheck(psw_t, __psw); \
101 &(*(struct psw_bits *)(&(__psw))); \
102 }))
103
104 typedef struct {
105 unsigned int mask;
106 unsigned int addr;
107 } psw32_t __aligned(8);
108
109 #define PGM_INT_CODE_MASK 0x7f
110 #define PGM_INT_CODE_PER 0x80
111
112 /*
113 * The pt_regs struct defines the way the registers are stored on
114 * the stack during a system call.
115 */
116 struct pt_regs {
117 union {
118 user_pt_regs user_regs;
119 struct {
120 unsigned long args[1];
121 psw_t psw;
122 unsigned long gprs[NUM_GPRS];
123 };
124 };
125 union {
126 unsigned long orig_gpr2;
127 unsigned long monitor_code;
128 };
129 union {
130 struct {
131 unsigned int int_code;
132 unsigned int int_parm;
133 unsigned long int_parm_long;
134 };
135 struct tpi_info tpi_info;
136 };
137 unsigned long flags;
138 unsigned long last_break;
139 unsigned int cpu;
140 unsigned char percpu_register;
141 };
142
143 /*
144 * Program event recording (PER) register set.
145 */
146 struct per_regs {
147 unsigned long control; /* PER control bits */
148 unsigned long start; /* PER starting address */
149 unsigned long end; /* PER ending address */
150 };
151
152 /*
153 * PER event contains information about the cause of the last PER exception.
154 */
155 struct per_event {
156 unsigned short cause; /* PER code, ATMID and AI */
157 unsigned long address; /* PER address */
158 unsigned char paid; /* PER access identification */
159 };
160
161 /*
162 * Simplified per_info structure used to decode the ptrace user space ABI.
163 */
164 struct per_struct_kernel {
165 unsigned long cr9; /* PER control bits */
166 unsigned long cr10; /* PER starting address */
167 unsigned long cr11; /* PER ending address */
168 unsigned long bits; /* Obsolete software bits */
169 unsigned long starting_addr; /* User specified start address */
170 unsigned long ending_addr; /* User specified end address */
171 unsigned short perc_atmid; /* PER trap ATMID */
172 unsigned long address; /* PER trap instruction address */
173 unsigned char access_id; /* PER trap access identification */
174 };
175
176 #define PER_EVENT_MASK 0xEB000000UL
177
178 #define PER_EVENT_BRANCH 0x80000000UL
179 #define PER_EVENT_IFETCH 0x40000000UL
180 #define PER_EVENT_STORE 0x20000000UL
181 #define PER_EVENT_STORE_REAL 0x08000000UL
182 #define PER_EVENT_TRANSACTION_END 0x02000000UL
183 #define PER_EVENT_NULLIFICATION 0x01000000UL
184
185 #define PER_CONTROL_MASK 0x00e00000UL
186
187 #define PER_CONTROL_BRANCH_ADDRESS 0x00800000UL
188 #define PER_CONTROL_SUSPENSION 0x00400000UL
189 #define PER_CONTROL_ALTERATION 0x00200000UL
190
set_pt_regs_flag(struct pt_regs * regs,int flag)191 static inline void set_pt_regs_flag(struct pt_regs *regs, int flag)
192 {
193 regs->flags |= (1UL << flag);
194 }
195
clear_pt_regs_flag(struct pt_regs * regs,int flag)196 static inline void clear_pt_regs_flag(struct pt_regs *regs, int flag)
197 {
198 regs->flags &= ~(1UL << flag);
199 }
200
test_pt_regs_flag(struct pt_regs * regs,int flag)201 static inline int test_pt_regs_flag(struct pt_regs *regs, int flag)
202 {
203 return !!(regs->flags & (1UL << flag));
204 }
205
test_and_clear_pt_regs_flag(struct pt_regs * regs,int flag)206 static inline int test_and_clear_pt_regs_flag(struct pt_regs *regs, int flag)
207 {
208 int ret = test_pt_regs_flag(regs, flag);
209
210 clear_pt_regs_flag(regs, flag);
211 return ret;
212 }
213
214 struct task_struct;
215
216 void update_cr_regs(struct task_struct *task);
217
218 /*
219 * These are defined as per linux/ptrace.h, which see.
220 */
221 #define arch_has_single_step() (1)
222 #define arch_has_block_step() (1)
223
224 #define profile_pc(regs) instruction_pointer(regs)
225
user_mode(const struct pt_regs * regs)226 static __always_inline bool user_mode(const struct pt_regs *regs)
227 {
228 return psw_bits(regs->psw).pstate;
229 }
230
regs_return_value(const struct pt_regs * regs)231 static inline long regs_return_value(const struct pt_regs *regs)
232 {
233 return regs->gprs[2];
234 }
235
instruction_pointer(const struct pt_regs * regs)236 static __always_inline unsigned long instruction_pointer(const struct pt_regs *regs)
237 {
238 return regs->psw.addr;
239 }
240
instruction_pointer_set(struct pt_regs * regs,unsigned long val)241 static inline void instruction_pointer_set(struct pt_regs *regs,
242 unsigned long val)
243 {
244 regs->psw.addr = val;
245 }
246
247 unsigned long get_trap_ip(struct pt_regs *regs);
248
249 int regs_query_register_offset(const char *name);
250 const char *regs_query_register_name(unsigned int offset);
251
kernel_stack_pointer(const struct pt_regs * regs)252 static __always_inline unsigned long kernel_stack_pointer(const struct pt_regs *regs)
253 {
254 return regs->gprs[15];
255 }
256
user_stack_pointer(const struct pt_regs * regs)257 static __always_inline unsigned long user_stack_pointer(const struct pt_regs *regs)
258 {
259 return regs->gprs[15];
260 }
261
regs_get_register(const struct pt_regs * regs,unsigned int offset)262 static __always_inline unsigned long regs_get_register(const struct pt_regs *regs,
263 unsigned int offset)
264 {
265 if (offset >= NUM_GPRS)
266 return 0;
267 return regs->gprs[offset];
268 }
269
regs_within_kernel_stack(const struct pt_regs * regs,unsigned long addr)270 static __always_inline int regs_within_kernel_stack(const struct pt_regs *regs,
271 unsigned long addr)
272 {
273 unsigned long ksp = kernel_stack_pointer(regs);
274
275 return (addr & ~(THREAD_SIZE - 1)) == (ksp & ~(THREAD_SIZE - 1));
276 }
277
278 /**
279 * regs_get_kernel_stack_nth() - get Nth entry of the stack
280 * @regs:pt_regs which contains kernel stack pointer.
281 * @n:stack entry number.
282 *
283 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
284 * is specifined by @regs. If the @n th entry is NOT in the kernel stack,
285 * this returns 0.
286 */
regs_get_kernel_stack_nth(const struct pt_regs * regs,unsigned int n)287 static __always_inline unsigned long regs_get_kernel_stack_nth(const struct pt_regs *regs,
288 unsigned int n)
289 {
290 unsigned long addr;
291
292 addr = kernel_stack_pointer(regs) + n * sizeof(long);
293 if (!regs_within_kernel_stack(regs, addr))
294 return 0;
295 return READ_ONCE_NOCHECK(*(unsigned long *)addr);
296 }
297
298 /**
299 * regs_get_kernel_argument() - get Nth function argument in kernel
300 * @regs: pt_regs of that context
301 * @n: function argument number (start from 0)
302 *
303 * regs_get_kernel_argument() returns @n th argument of the function call.
304 */
regs_get_kernel_argument(const struct pt_regs * regs,unsigned int n)305 static __always_inline unsigned long regs_get_kernel_argument(const struct pt_regs *regs,
306 unsigned int n)
307 {
308 unsigned int argoffset = STACK_FRAME_OVERHEAD / sizeof(long);
309
310 #define NR_REG_ARGUMENTS 5
311 if (n < NR_REG_ARGUMENTS)
312 return regs_get_register(regs, 2 + n);
313 n -= NR_REG_ARGUMENTS;
314 return regs_get_kernel_stack_nth(regs, argoffset + n);
315 }
316
regs_set_return_value(struct pt_regs * regs,unsigned long rc)317 static __always_inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
318 {
319 regs->gprs[2] = rc;
320 }
321
322 #endif /* __ASSEMBLER__ */
323 #endif /* _S390_PTRACE_H */
324