summaryrefslogtreecommitdiff
path: root/gdb/s390-tdep.h
blob: 7a9a35307233ea78c3e0f2641b29be0bc85cb745 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/* Target-dependent code for s390.

   Copyright (C) 2003-2023 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef S390_TDEP_H
#define S390_TDEP_H

#include "prologue-value.h"
#include "gdbarch.h"

enum s390_abi_kind
{
  ABI_NONE,
  ABI_LINUX_S390,
  ABI_LINUX_ZSERIES
};

enum s390_vector_abi_kind
{
  S390_VECTOR_ABI_NONE,
  S390_VECTOR_ABI_128
};

/* The tdep structure.  */

struct s390_gdbarch_tdep : gdbarch_tdep_base
{
  /* Target description.  */
  const struct target_desc *tdesc = nullptr;

  /* ABI version.  */
  enum s390_abi_kind abi {};

  /* Vector ABI.  */
  enum s390_vector_abi_kind vector_abi {};

  /* Pseudo register numbers.  */
  int gpr_full_regnum = 0;
  int pc_regnum = 0;
  int cc_regnum = 0;
  int v0_full_regnum = 0;

  bool have_upper = 0;
  bool have_linux_v1 = 0;
  bool have_linux_v2 = 0;
  bool have_tdb = 0;
  bool have_vx = 0;
  bool have_gs = 0;

  /* Hook to record OS specific systemcall.  */
  int (*s390_syscall_record) (struct regcache *regcache, LONGEST svc_number)
    = nullptr;
};

using s390_gdbarch_tdep_up = std::unique_ptr<s390_gdbarch_tdep>;

/* Decoding S/390 instructions.  */

/* Named opcode values for the S/390 instructions we recognize.  Some
   instructions have their opcode split across two fields; those are the
   op1_* and op2_* enums.  */

enum
{
  op1_lhi  = 0xa7,   op2_lhi  = 0x08,
  op1_lghi = 0xa7,   op2_lghi = 0x09,
  op1_lgfi = 0xc0,   op2_lgfi = 0x01,
  op_lr    = 0x18,
  op_lgr   = 0xb904,
  op_l     = 0x58,
  op1_ly   = 0xe3,   op2_ly   = 0x58,
  op1_lg   = 0xe3,   op2_lg   = 0x04,
  op_lm    = 0x98,
  op1_lmy  = 0xeb,   op2_lmy  = 0x98,
  op1_lmg  = 0xeb,   op2_lmg  = 0x04,
  op_st    = 0x50,
  op1_sty  = 0xe3,   op2_sty  = 0x50,
  op1_stg  = 0xe3,   op2_stg  = 0x24,
  op_std   = 0x60,
  op_stm   = 0x90,
  op1_stmy = 0xeb,   op2_stmy = 0x90,
  op1_stmg = 0xeb,   op2_stmg = 0x24,
  op1_aghi = 0xa7,   op2_aghi = 0x0b,
  op1_ahi  = 0xa7,   op2_ahi  = 0x0a,
  op1_agfi = 0xc2,   op2_agfi = 0x08,
  op1_afi  = 0xc2,   op2_afi  = 0x09,
  op1_algfi= 0xc2,   op2_algfi= 0x0a,
  op1_alfi = 0xc2,   op2_alfi = 0x0b,
  op_ar    = 0x1a,
  op_agr   = 0xb908,
  op_a     = 0x5a,
  op1_ay   = 0xe3,   op2_ay   = 0x5a,
  op1_ag   = 0xe3,   op2_ag   = 0x08,
  op1_slgfi= 0xc2,   op2_slgfi= 0x04,
  op1_slfi = 0xc2,   op2_slfi = 0x05,
  op_sr    = 0x1b,
  op_sgr   = 0xb909,
  op_s     = 0x5b,
  op1_sy   = 0xe3,   op2_sy   = 0x5b,
  op1_sg   = 0xe3,   op2_sg   = 0x09,
  op_nr    = 0x14,
  op_ngr   = 0xb980,
  op_la    = 0x41,
  op1_lay  = 0xe3,   op2_lay  = 0x71,
  op1_larl = 0xc0,   op2_larl = 0x00,
  op_basr  = 0x0d,
  op_bas   = 0x4d,
  op_bcr   = 0x07,
  op_bc    = 0x47,
  op_bctr  = 0x06,
  op_bctgr = 0xb946,
  op_bct   = 0x46,
  op1_bctg = 0xe3,   op2_bctg = 0x46,
  op_bxh   = 0x86,
  op1_bxhg = 0xeb,   op2_bxhg = 0x44,
  op_bxle  = 0x87,
  op1_bxleg= 0xeb,   op2_bxleg= 0x45,
  op1_bras = 0xa7,   op2_bras = 0x05,
  op1_brasl= 0xc0,   op2_brasl= 0x05,
  op1_brc  = 0xa7,   op2_brc  = 0x04,
  op1_brcl = 0xc0,   op2_brcl = 0x04,
  op1_brct = 0xa7,   op2_brct = 0x06,
  op1_brctg= 0xa7,   op2_brctg= 0x07,
  op_brxh  = 0x84,
  op1_brxhg= 0xec,   op2_brxhg= 0x44,
  op_brxle = 0x85,
  op1_brxlg= 0xec,   op2_brxlg= 0x45,
  op_svc   = 0x0a,
};

/* Hardware capabilities. */

#ifndef HWCAP_S390_HIGH_GPRS
#define HWCAP_S390_HIGH_GPRS 512
#endif

#ifndef HWCAP_S390_TE
#define HWCAP_S390_TE 1024
#endif

#ifndef HWCAP_S390_VX
#define HWCAP_S390_VX 2048
#endif

#ifndef HWCAP_S390_GS
#define HWCAP_S390_GS 16384
#endif

/* Register information.  */

/* Program Status Word.  */
#define S390_PSWM_REGNUM 0
#define S390_PSWA_REGNUM 1
/* General Purpose Registers.  */
#define S390_R0_REGNUM 2
#define S390_R1_REGNUM 3
#define S390_R2_REGNUM 4
#define S390_R3_REGNUM 5
#define S390_R4_REGNUM 6
#define S390_R5_REGNUM 7
#define S390_R6_REGNUM 8
#define S390_R7_REGNUM 9
#define S390_R8_REGNUM 10
#define S390_R9_REGNUM 11
#define S390_R10_REGNUM 12
#define S390_R11_REGNUM 13
#define S390_R12_REGNUM 14
#define S390_R13_REGNUM 15
#define S390_R14_REGNUM 16
#define S390_R15_REGNUM 17
/* Access Registers.  */
#define S390_A0_REGNUM 18
#define S390_A1_REGNUM 19
#define S390_A2_REGNUM 20
#define S390_A3_REGNUM 21
#define S390_A4_REGNUM 22
#define S390_A5_REGNUM 23
#define S390_A6_REGNUM 24
#define S390_A7_REGNUM 25
#define S390_A8_REGNUM 26
#define S390_A9_REGNUM 27
#define S390_A10_REGNUM 28
#define S390_A11_REGNUM 29
#define S390_A12_REGNUM 30
#define S390_A13_REGNUM 31
#define S390_A14_REGNUM 32
#define S390_A15_REGNUM 33
/* Floating Point Control Word.  */
#define S390_FPC_REGNUM 34
/* Floating Point Registers.  */
#define S390_F0_REGNUM 35
#define S390_F1_REGNUM 36
#define S390_F2_REGNUM 37
#define S390_F3_REGNUM 38
#define S390_F4_REGNUM 39
#define S390_F5_REGNUM 40
#define S390_F6_REGNUM 41
#define S390_F7_REGNUM 42
#define S390_F8_REGNUM 43
#define S390_F9_REGNUM 44
#define S390_F10_REGNUM 45
#define S390_F11_REGNUM 46
#define S390_F12_REGNUM 47
#define S390_F13_REGNUM 48
#define S390_F14_REGNUM 49
#define S390_F15_REGNUM 50
/* General Purpose Register Upper Halves.  */
#define S390_R0_UPPER_REGNUM 51
#define S390_R1_UPPER_REGNUM 52
#define S390_R2_UPPER_REGNUM 53
#define S390_R3_UPPER_REGNUM 54
#define S390_R4_UPPER_REGNUM 55
#define S390_R5_UPPER_REGNUM 56
#define S390_R6_UPPER_REGNUM 57
#define S390_R7_UPPER_REGNUM 58
#define S390_R8_UPPER_REGNUM 59
#define S390_R9_UPPER_REGNUM 60
#define S390_R10_UPPER_REGNUM 61
#define S390_R11_UPPER_REGNUM 62
#define S390_R12_UPPER_REGNUM 63
#define S390_R13_UPPER_REGNUM 64
#define S390_R14_UPPER_REGNUM 65
#define S390_R15_UPPER_REGNUM 66
/* GNU/Linux-specific optional registers.  */
#define S390_ORIG_R2_REGNUM 67
#define S390_LAST_BREAK_REGNUM 68
#define S390_SYSTEM_CALL_REGNUM 69
/* Transaction diagnostic block.  */
#define S390_TDB_DWORD0_REGNUM 70
#define S390_TDB_ABORT_CODE_REGNUM 71
#define S390_TDB_CONFLICT_TOKEN_REGNUM 72
#define S390_TDB_ATIA_REGNUM 73
#define S390_TDB_R0_REGNUM 74
#define S390_TDB_R1_REGNUM 75
#define S390_TDB_R2_REGNUM 76
#define S390_TDB_R3_REGNUM 77
#define S390_TDB_R4_REGNUM 78
#define S390_TDB_R5_REGNUM 79
#define S390_TDB_R6_REGNUM 80
#define S390_TDB_R7_REGNUM 81
#define S390_TDB_R8_REGNUM 82
#define S390_TDB_R9_REGNUM 83
#define S390_TDB_R10_REGNUM 84
#define S390_TDB_R11_REGNUM 85
#define S390_TDB_R12_REGNUM 86
#define S390_TDB_R13_REGNUM 87
#define S390_TDB_R14_REGNUM 88
#define S390_TDB_R15_REGNUM 89
/* Vector registers.  */
#define S390_V0_LOWER_REGNUM 90
#define S390_V1_LOWER_REGNUM 91
#define S390_V2_LOWER_REGNUM 92
#define S390_V3_LOWER_REGNUM 93
#define S390_V4_LOWER_REGNUM 94
#define S390_V5_LOWER_REGNUM 95
#define S390_V6_LOWER_REGNUM 96
#define S390_V7_LOWER_REGNUM 97
#define S390_V8_LOWER_REGNUM 98
#define S390_V9_LOWER_REGNUM 99
#define S390_V10_LOWER_REGNUM 100
#define S390_V11_LOWER_REGNUM 101
#define S390_V12_LOWER_REGNUM 102
#define S390_V13_LOWER_REGNUM 103
#define S390_V14_LOWER_REGNUM 104
#define S390_V15_LOWER_REGNUM 105
#define S390_V16_REGNUM 106
#define S390_V17_REGNUM 107
#define S390_V18_REGNUM 108
#define S390_V19_REGNUM 109
#define S390_V20_REGNUM 110
#define S390_V21_REGNUM 111
#define S390_V22_REGNUM 112
#define S390_V23_REGNUM 113
#define S390_V24_REGNUM 114
#define S390_V25_REGNUM 115
#define S390_V26_REGNUM 116
#define S390_V27_REGNUM 117
#define S390_V28_REGNUM 118
#define S390_V29_REGNUM 119
#define S390_V30_REGNUM 120
#define S390_V31_REGNUM 121
#define S390_GSD_REGNUM 122
#define S390_GSSM_REGNUM 123
#define S390_GSEPLA_REGNUM 124
#define S390_BC_GSD_REGNUM 125
#define S390_BC_GSSM_REGNUM 126
#define S390_BC_GSEPLA_REGNUM 127
/* Total.  */
#define S390_NUM_REGS 128

#define S390_NUM_GPRS 16
#define S390_NUM_FPRS 16

#define S390_MAX_INSTR_SIZE 6

/* Special register usage.  */
#define S390_SP_REGNUM S390_R15_REGNUM
#define S390_RETADDR_REGNUM S390_R14_REGNUM
#define S390_FRAME_REGNUM S390_R11_REGNUM

/* Frame unwinding.  */

extern struct value *s390_trad_frame_prev_register
    (frame_info_ptr this_frame, struct trad_frame_saved_reg saved_regs[],
     int regnum);

extern const struct target_desc *tdesc_s390_linux32;
extern const struct target_desc *tdesc_s390x_linux64;

#endif /* S390_TDEP_H */