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 <uapi/asm/ptrace.h>
12
13#define PIF_SYSCALL		0	/* inside a system call */
14#define PIF_PER_TRAP		1	/* deliver sigtrap on return to user */
15#define PIF_SYSCALL_RESTART	2	/* restart the current system call */
16#define PIF_GUEST_FAULT		3	/* indicates program check in sie64a */
17
18#define _PIF_SYSCALL		BIT(PIF_SYSCALL)
19#define _PIF_PER_TRAP		BIT(PIF_PER_TRAP)
20#define _PIF_SYSCALL_RESTART	BIT(PIF_SYSCALL_RESTART)
21#define _PIF_GUEST_FAULT	BIT(PIF_GUEST_FAULT)
22
23#ifndef __ASSEMBLY__
24
25#define PSW_KERNEL_BITS	(PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_ASC_HOME | \
26			 PSW_MASK_EA | PSW_MASK_BA)
27#define PSW_USER_BITS	(PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | \
28			 PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_MASK_MCHECK | \
29			 PSW_MASK_PSTATE | PSW_ASC_PRIMARY)
30
31struct psw_bits {
32	unsigned long	     :	1;
33	unsigned long per    :	1; /* PER-Mask */
34	unsigned long	     :	3;
35	unsigned long dat    :	1; /* DAT Mode */
36	unsigned long io     :	1; /* Input/Output Mask */
37	unsigned long ext    :	1; /* External Mask */
38	unsigned long key    :	4; /* PSW Key */
39	unsigned long	     :	1;
40	unsigned long mcheck :	1; /* Machine-Check Mask */
41	unsigned long wait   :	1; /* Wait State */
42	unsigned long pstate :	1; /* Problem State */
43	unsigned long as     :	2; /* Address Space Control */
44	unsigned long cc     :	2; /* Condition Code */
45	unsigned long pm     :	4; /* Program Mask */
46	unsigned long ri     :	1; /* Runtime Instrumentation */
47	unsigned long	     :	6;
48	unsigned long eaba   :	2; /* Addressing Mode */
49	unsigned long	     : 31;
50	unsigned long ia     : 64; /* Instruction Address */
51};
52
53enum {
54	PSW_BITS_AMODE_24BIT = 0,
55	PSW_BITS_AMODE_31BIT = 1,
56	PSW_BITS_AMODE_64BIT = 3
57};
58
59enum {
60	PSW_BITS_AS_PRIMARY	= 0,
61	PSW_BITS_AS_ACCREG	= 1,
62	PSW_BITS_AS_SECONDARY	= 2,
63	PSW_BITS_AS_HOME	= 3
64};
65
66#define psw_bits(__psw) (*({			\
67	typecheck(psw_t, __psw);		\
68	&(*(struct psw_bits *)(&(__psw)));	\
69}))
70
71/*
72 * The pt_regs struct defines the way the registers are stored on
73 * the stack during a system call.
74 */
75struct pt_regs
76{
77	union {
78		user_pt_regs user_regs;
79		struct {
80			unsigned long args[1];
81			psw_t psw;
82			unsigned long gprs[NUM_GPRS];
83		};
84	};
85	unsigned long orig_gpr2;
86	unsigned int int_code;
87	unsigned int int_parm;
88	unsigned long int_parm_long;
89	unsigned long flags;
90};
91
92/*
93 * Program event recording (PER) register set.
94 */
95struct per_regs {
96	unsigned long control;		/* PER control bits */
97	unsigned long start;		/* PER starting address */
98	unsigned long end;		/* PER ending address */
99};
100
101/*
102 * PER event contains information about the cause of the last PER exception.
103 */
104struct per_event {
105	unsigned short cause;		/* PER code, ATMID and AI */
106	unsigned long address;		/* PER address */
107	unsigned char paid;		/* PER access identification */
108};
109
110/*
111 * Simplified per_info structure used to decode the ptrace user space ABI.
112 */
113struct per_struct_kernel {
114	unsigned long cr9;		/* PER control bits */
115	unsigned long cr10;		/* PER starting address */
116	unsigned long cr11;		/* PER ending address */
117	unsigned long bits;		/* Obsolete software bits */
118	unsigned long starting_addr;	/* User specified start address */
119	unsigned long ending_addr;	/* User specified end address */
120	unsigned short perc_atmid;	/* PER trap ATMID */
121	unsigned long address;		/* PER trap instruction address */
122	unsigned char access_id;	/* PER trap access identification */
123};
124
125#define PER_EVENT_MASK			0xEB000000UL
126
127#define PER_EVENT_BRANCH		0x80000000UL
128#define PER_EVENT_IFETCH		0x40000000UL
129#define PER_EVENT_STORE			0x20000000UL
130#define PER_EVENT_STORE_REAL		0x08000000UL
131#define PER_EVENT_TRANSACTION_END	0x02000000UL
132#define PER_EVENT_NULLIFICATION		0x01000000UL
133
134#define PER_CONTROL_MASK		0x00e00000UL
135
136#define PER_CONTROL_BRANCH_ADDRESS	0x00800000UL
137#define PER_CONTROL_SUSPENSION		0x00400000UL
138#define PER_CONTROL_ALTERATION		0x00200000UL
139
140static inline void set_pt_regs_flag(struct pt_regs *regs, int flag)
141{
142	regs->flags |= (1UL << flag);
143}
144
145static inline void clear_pt_regs_flag(struct pt_regs *regs, int flag)
146{
147	regs->flags &= ~(1UL << flag);
148}
149
150static inline int test_pt_regs_flag(struct pt_regs *regs, int flag)
151{
152	return !!(regs->flags & (1UL << flag));
153}
154
155/*
156 * These are defined as per linux/ptrace.h, which see.
157 */
158#define arch_has_single_step()	(1)
159#define arch_has_block_step()	(1)
160
161#define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
162#define instruction_pointer(regs) ((regs)->psw.addr)
163#define user_stack_pointer(regs)((regs)->gprs[15])
164#define profile_pc(regs) instruction_pointer(regs)
165
166static inline long regs_return_value(struct pt_regs *regs)
167{
168	return regs->gprs[2];
169}
170
171static inline void instruction_pointer_set(struct pt_regs *regs,
172					   unsigned long val)
173{
174	regs->psw.addr = val;
175}
176
177int regs_query_register_offset(const char *name);
178const char *regs_query_register_name(unsigned int offset);
179unsigned long regs_get_register(struct pt_regs *regs, unsigned int offset);
180unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
181
182static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
183{
184	return regs->gprs[15];
185}
186
187static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
188{
189	regs->gprs[2] = rc;
190}
191
192#endif /* __ASSEMBLY__ */
193#endif /* _S390_PTRACE_H */
194