C++-ify prologue-value's pv_area
[external/binutils.git] / gdb / s390-linux-tdep.c
1 /* Target-dependent code for GDB, the GNU debugger.
2
3    Copyright (C) 2001-2017 Free Software Foundation, Inc.
4
5    Contributed by D.J. Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6    for IBM Deutschland Entwicklung GmbH, IBM Corporation.
7
8    This file is part of GDB.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23 #include "defs.h"
24 #include "arch-utils.h"
25 #include "frame.h"
26 #include "inferior.h"
27 #include "infrun.h"
28 #include "symtab.h"
29 #include "target.h"
30 #include "gdbcore.h"
31 #include "gdbcmd.h"
32 #include "objfiles.h"
33 #include "regcache.h"
34 #include "trad-frame.h"
35 #include "frame-base.h"
36 #include "frame-unwind.h"
37 #include "dwarf2-frame.h"
38 #include "reggroups.h"
39 #include "regset.h"
40 #include "value.h"
41 #include "dis-asm.h"
42 #include "solib-svr4.h"
43 #include "prologue-value.h"
44 #include "linux-tdep.h"
45 #include "s390-linux-tdep.h"
46 #include "linux-record.h"
47 #include "record-full.h"
48 #include "auxv.h"
49 #include "xml-syscall.h"
50
51 #include "stap-probe.h"
52 #include "ax.h"
53 #include "ax-gdb.h"
54 #include "user-regs.h"
55 #include "cli/cli-utils.h"
56 #include <ctype.h>
57 #include "elf/common.h"
58 #include "elf/s390.h"
59 #include "elf-bfd.h"
60 #include <algorithm>
61
62 #include "features/s390-linux32.c"
63 #include "features/s390-linux32v1.c"
64 #include "features/s390-linux32v2.c"
65 #include "features/s390-linux64.c"
66 #include "features/s390-linux64v1.c"
67 #include "features/s390-linux64v2.c"
68 #include "features/s390-te-linux64.c"
69 #include "features/s390-vx-linux64.c"
70 #include "features/s390-tevx-linux64.c"
71 #include "features/s390-gs-linux64.c"
72 #include "features/s390x-linux64.c"
73 #include "features/s390x-linux64v1.c"
74 #include "features/s390x-linux64v2.c"
75 #include "features/s390x-te-linux64.c"
76 #include "features/s390x-vx-linux64.c"
77 #include "features/s390x-tevx-linux64.c"
78 #include "features/s390x-gs-linux64.c"
79
80 #define XML_SYSCALL_FILENAME_S390 "syscalls/s390-linux.xml"
81 #define XML_SYSCALL_FILENAME_S390X "syscalls/s390x-linux.xml"
82
83 /* Holds the current set of options to be passed to the disassembler.  */
84 static char *s390_disassembler_options;
85
86 enum s390_abi_kind
87 {
88   ABI_LINUX_S390,
89   ABI_LINUX_ZSERIES
90 };
91
92 enum s390_vector_abi_kind
93 {
94   S390_VECTOR_ABI_NONE,
95   S390_VECTOR_ABI_128
96 };
97
98 /* The tdep structure.  */
99
100 struct gdbarch_tdep
101 {
102   /* ABI version.  */
103   enum s390_abi_kind abi;
104
105   /* Vector ABI.  */
106   enum s390_vector_abi_kind vector_abi;
107
108   /* Pseudo register numbers.  */
109   int gpr_full_regnum;
110   int pc_regnum;
111   int cc_regnum;
112   int v0_full_regnum;
113
114   int have_linux_v1;
115   int have_linux_v2;
116   int have_tdb;
117   bool have_gs;
118 };
119
120
121 /* ABI call-saved register information.  */
122
123 static int
124 s390_register_call_saved (struct gdbarch *gdbarch, int regnum)
125 {
126   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
127
128   switch (tdep->abi)
129     {
130     case ABI_LINUX_S390:
131       if ((regnum >= S390_R6_REGNUM && regnum <= S390_R15_REGNUM)
132           || regnum == S390_F4_REGNUM || regnum == S390_F6_REGNUM
133           || regnum == S390_A0_REGNUM)
134         return 1;
135
136       break;
137
138     case ABI_LINUX_ZSERIES:
139       if ((regnum >= S390_R6_REGNUM && regnum <= S390_R15_REGNUM)
140           || (regnum >= S390_F8_REGNUM && regnum <= S390_F15_REGNUM)
141           || (regnum >= S390_A0_REGNUM && regnum <= S390_A1_REGNUM))
142         return 1;
143
144       break;
145     }
146
147   return 0;
148 }
149
150 static int
151 s390_cannot_store_register (struct gdbarch *gdbarch, int regnum)
152 {
153   /* The last-break address is read-only.  */
154   return regnum == S390_LAST_BREAK_REGNUM;
155 }
156
157 static void
158 s390_write_pc (struct regcache *regcache, CORE_ADDR pc)
159 {
160   struct gdbarch *gdbarch = get_regcache_arch (regcache);
161   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
162
163   regcache_cooked_write_unsigned (regcache, tdep->pc_regnum, pc);
164
165   /* Set special SYSTEM_CALL register to 0 to prevent the kernel from
166      messing with the PC we just installed, if we happen to be within
167      an interrupted system call that the kernel wants to restart.
168
169      Note that after we return from the dummy call, the SYSTEM_CALL and
170      ORIG_R2 registers will be automatically restored, and the kernel
171      continues to restart the system call at this point.  */
172   if (register_size (gdbarch, S390_SYSTEM_CALL_REGNUM) > 0)
173     regcache_cooked_write_unsigned (regcache, S390_SYSTEM_CALL_REGNUM, 0);
174 }
175
176 /* The "guess_tracepoint_registers" gdbarch method.  */
177
178 static void
179 s390_guess_tracepoint_registers (struct gdbarch *gdbarch,
180                                  struct regcache *regcache,
181                                  CORE_ADDR addr)
182 {
183   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
184   int sz = register_size (gdbarch, S390_PSWA_REGNUM);
185   gdb_byte *reg = (gdb_byte *) alloca (sz);
186   ULONGEST pswm, pswa;
187
188   /* Set PSWA from the location and a default PSWM (the only part we're
189      unlikely to get right is the CC).  */
190   if (tdep->abi == ABI_LINUX_S390)
191     {
192       /* 31-bit PSWA needs high bit set (it's very unlikely the target
193          was in 24-bit mode).  */
194       pswa = addr | 0x80000000UL;
195       pswm = 0x070d0000UL;
196     }
197   else
198     {
199       pswa = addr;
200       pswm = 0x0705000180000000ULL;
201     }
202
203   store_unsigned_integer (reg, sz, gdbarch_byte_order (gdbarch), pswa);
204   regcache_raw_supply (regcache, S390_PSWA_REGNUM, reg);
205
206   store_unsigned_integer (reg, sz, gdbarch_byte_order (gdbarch), pswm);
207   regcache_raw_supply (regcache, S390_PSWM_REGNUM, reg);
208 }
209
210
211 /* DWARF Register Mapping.  */
212
213 static const short s390_dwarf_regmap[] =
214 {
215   /* 0-15: General Purpose Registers.  */
216   S390_R0_REGNUM, S390_R1_REGNUM, S390_R2_REGNUM, S390_R3_REGNUM,
217   S390_R4_REGNUM, S390_R5_REGNUM, S390_R6_REGNUM, S390_R7_REGNUM,
218   S390_R8_REGNUM, S390_R9_REGNUM, S390_R10_REGNUM, S390_R11_REGNUM,
219   S390_R12_REGNUM, S390_R13_REGNUM, S390_R14_REGNUM, S390_R15_REGNUM,
220
221   /* 16-31: Floating Point Registers / Vector Registers 0-15. */
222   S390_F0_REGNUM, S390_F2_REGNUM, S390_F4_REGNUM, S390_F6_REGNUM,
223   S390_F1_REGNUM, S390_F3_REGNUM, S390_F5_REGNUM, S390_F7_REGNUM,
224   S390_F8_REGNUM, S390_F10_REGNUM, S390_F12_REGNUM, S390_F14_REGNUM,
225   S390_F9_REGNUM, S390_F11_REGNUM, S390_F13_REGNUM, S390_F15_REGNUM,
226
227   /* 32-47: Control Registers (not mapped).  */
228   -1, -1, -1, -1, -1, -1, -1, -1,
229   -1, -1, -1, -1, -1, -1, -1, -1,
230
231   /* 48-63: Access Registers.  */
232   S390_A0_REGNUM, S390_A1_REGNUM, S390_A2_REGNUM, S390_A3_REGNUM,
233   S390_A4_REGNUM, S390_A5_REGNUM, S390_A6_REGNUM, S390_A7_REGNUM,
234   S390_A8_REGNUM, S390_A9_REGNUM, S390_A10_REGNUM, S390_A11_REGNUM,
235   S390_A12_REGNUM, S390_A13_REGNUM, S390_A14_REGNUM, S390_A15_REGNUM,
236
237   /* 64-65: Program Status Word.  */
238   S390_PSWM_REGNUM,
239   S390_PSWA_REGNUM,
240
241   /* 66-67: Reserved.  */
242   -1, -1,
243
244   /* 68-83: Vector Registers 16-31.  */
245   S390_V16_REGNUM, S390_V18_REGNUM, S390_V20_REGNUM, S390_V22_REGNUM,
246   S390_V17_REGNUM, S390_V19_REGNUM, S390_V21_REGNUM, S390_V23_REGNUM,
247   S390_V24_REGNUM, S390_V26_REGNUM, S390_V28_REGNUM, S390_V30_REGNUM,
248   S390_V25_REGNUM, S390_V27_REGNUM, S390_V29_REGNUM, S390_V31_REGNUM,
249
250   /* End of "official" DWARF registers.  The remainder of the map is
251      for GDB internal use only.  */
252
253   /* GPR Lower Half Access.  */
254   S390_R0_REGNUM, S390_R1_REGNUM, S390_R2_REGNUM, S390_R3_REGNUM,
255   S390_R4_REGNUM, S390_R5_REGNUM, S390_R6_REGNUM, S390_R7_REGNUM,
256   S390_R8_REGNUM, S390_R9_REGNUM, S390_R10_REGNUM, S390_R11_REGNUM,
257   S390_R12_REGNUM, S390_R13_REGNUM, S390_R14_REGNUM, S390_R15_REGNUM,
258 };
259
260 enum { s390_dwarf_reg_r0l = ARRAY_SIZE (s390_dwarf_regmap) - 16 };
261
262 /* Convert DWARF register number REG to the appropriate register
263    number used by GDB.  */
264 static int
265 s390_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
266 {
267   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
268   int gdb_reg = -1;
269
270   /* In a 32-on-64 debug scenario, debug info refers to the full
271      64-bit GPRs.  Note that call frame information still refers to
272      the 32-bit lower halves, because s390_adjust_frame_regnum uses
273      special register numbers to access GPRs.  */
274   if (tdep->gpr_full_regnum != -1 && reg >= 0 && reg < 16)
275     return tdep->gpr_full_regnum + reg;
276
277   if (reg >= 0 && reg < ARRAY_SIZE (s390_dwarf_regmap))
278     gdb_reg = s390_dwarf_regmap[reg];
279
280   if (tdep->v0_full_regnum == -1)
281     {
282       if (gdb_reg >= S390_V16_REGNUM && gdb_reg <= S390_V31_REGNUM)
283         gdb_reg = -1;
284     }
285   else
286     {
287       if (gdb_reg >= S390_F0_REGNUM && gdb_reg <= S390_F15_REGNUM)
288         gdb_reg = gdb_reg - S390_F0_REGNUM + tdep->v0_full_regnum;
289     }
290
291   return gdb_reg;
292 }
293
294 /* Translate a .eh_frame register to DWARF register, or adjust a
295    .debug_frame register.  */
296 static int
297 s390_adjust_frame_regnum (struct gdbarch *gdbarch, int num, int eh_frame_p)
298 {
299   /* See s390_dwarf_reg_to_regnum for comments.  */
300   return (num >= 0 && num < 16) ? num + s390_dwarf_reg_r0l : num;
301 }
302
303
304 /* Pseudo registers.  */
305
306 static int
307 regnum_is_gpr_full (struct gdbarch_tdep *tdep, int regnum)
308 {
309   return (tdep->gpr_full_regnum != -1
310           && regnum >= tdep->gpr_full_regnum
311           && regnum <= tdep->gpr_full_regnum + 15);
312 }
313
314 /* Check whether REGNUM indicates a full vector register (v0-v15).
315    These pseudo-registers are composed of f0-f15 and v0l-v15l.  */
316
317 static int
318 regnum_is_vxr_full (struct gdbarch_tdep *tdep, int regnum)
319 {
320   return (tdep->v0_full_regnum != -1
321           && regnum >= tdep->v0_full_regnum
322           && regnum <= tdep->v0_full_regnum + 15);
323 }
324
325 /* Return the name of register REGNO.  Return the empty string for
326    registers that shouldn't be visible.  */
327
328 static const char *
329 s390_register_name (struct gdbarch *gdbarch, int regnum)
330 {
331   if (regnum >= S390_V0_LOWER_REGNUM
332       && regnum <= S390_V15_LOWER_REGNUM)
333     return "";
334   return tdesc_register_name (gdbarch, regnum);
335 }
336
337 static const char *
338 s390_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
339 {
340   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
341
342   if (regnum == tdep->pc_regnum)
343     return "pc";
344
345   if (regnum == tdep->cc_regnum)
346     return "cc";
347
348   if (regnum_is_gpr_full (tdep, regnum))
349     {
350       static const char *full_name[] = {
351         "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
352         "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
353       };
354       return full_name[regnum - tdep->gpr_full_regnum];
355     }
356
357   if (regnum_is_vxr_full (tdep, regnum))
358     {
359       static const char *full_name[] = {
360         "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
361         "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15"
362       };
363       return full_name[regnum - tdep->v0_full_regnum];
364     }
365
366   internal_error (__FILE__, __LINE__, _("invalid regnum"));
367 }
368
369 static struct type *
370 s390_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
371 {
372   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
373
374   if (regnum == tdep->pc_regnum)
375     return builtin_type (gdbarch)->builtin_func_ptr;
376
377   if (regnum == tdep->cc_regnum)
378     return builtin_type (gdbarch)->builtin_int;
379
380   if (regnum_is_gpr_full (tdep, regnum))
381     return builtin_type (gdbarch)->builtin_uint64;
382
383   if (regnum_is_vxr_full (tdep, regnum))
384     return tdesc_find_type (gdbarch, "vec128");
385
386   internal_error (__FILE__, __LINE__, _("invalid regnum"));
387 }
388
389 static enum register_status
390 s390_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
391                            int regnum, gdb_byte *buf)
392 {
393   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
394   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
395   int regsize = register_size (gdbarch, regnum);
396   ULONGEST val;
397
398   if (regnum == tdep->pc_regnum)
399     {
400       enum register_status status;
401
402       status = regcache_raw_read_unsigned (regcache, S390_PSWA_REGNUM, &val);
403       if (status == REG_VALID)
404         {
405           if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
406             val &= 0x7fffffff;
407           store_unsigned_integer (buf, regsize, byte_order, val);
408         }
409       return status;
410     }
411
412   if (regnum == tdep->cc_regnum)
413     {
414       enum register_status status;
415
416       status = regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &val);
417       if (status == REG_VALID)
418         {
419           if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
420             val = (val >> 12) & 3;
421           else
422             val = (val >> 44) & 3;
423           store_unsigned_integer (buf, regsize, byte_order, val);
424         }
425       return status;
426     }
427
428   if (regnum_is_gpr_full (tdep, regnum))
429     {
430       enum register_status status;
431       ULONGEST val_upper;
432
433       regnum -= tdep->gpr_full_regnum;
434
435       status = regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + regnum, &val);
436       if (status == REG_VALID)
437         status = regcache_raw_read_unsigned (regcache, S390_R0_UPPER_REGNUM + regnum,
438                                              &val_upper);
439       if (status == REG_VALID)
440         {
441           val |= val_upper << 32;
442           store_unsigned_integer (buf, regsize, byte_order, val);
443         }
444       return status;
445     }
446
447   if (regnum_is_vxr_full (tdep, regnum))
448     {
449       enum register_status status;
450
451       regnum -= tdep->v0_full_regnum;
452
453       status = regcache_raw_read (regcache, S390_F0_REGNUM + regnum, buf);
454       if (status == REG_VALID)
455         status = regcache_raw_read (regcache,
456                                     S390_V0_LOWER_REGNUM + regnum, buf + 8);
457       return status;
458     }
459
460   internal_error (__FILE__, __LINE__, _("invalid regnum"));
461 }
462
463 static void
464 s390_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
465                             int regnum, const gdb_byte *buf)
466 {
467   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
468   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
469   int regsize = register_size (gdbarch, regnum);
470   ULONGEST val, psw;
471
472   if (regnum == tdep->pc_regnum)
473     {
474       val = extract_unsigned_integer (buf, regsize, byte_order);
475       if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
476         {
477           regcache_raw_read_unsigned (regcache, S390_PSWA_REGNUM, &psw);
478           val = (psw & 0x80000000) | (val & 0x7fffffff);
479         }
480       regcache_raw_write_unsigned (regcache, S390_PSWA_REGNUM, val);
481       return;
482     }
483
484   if (regnum == tdep->cc_regnum)
485     {
486       val = extract_unsigned_integer (buf, regsize, byte_order);
487       regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &psw);
488       if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
489         val = (psw & ~((ULONGEST)3 << 12)) | ((val & 3) << 12);
490       else
491         val = (psw & ~((ULONGEST)3 << 44)) | ((val & 3) << 44);
492       regcache_raw_write_unsigned (regcache, S390_PSWM_REGNUM, val);
493       return;
494     }
495
496   if (regnum_is_gpr_full (tdep, regnum))
497     {
498       regnum -= tdep->gpr_full_regnum;
499       val = extract_unsigned_integer (buf, regsize, byte_order);
500       regcache_raw_write_unsigned (regcache, S390_R0_REGNUM + regnum,
501                                    val & 0xffffffff);
502       regcache_raw_write_unsigned (regcache, S390_R0_UPPER_REGNUM + regnum,
503                                    val >> 32);
504       return;
505     }
506
507   if (regnum_is_vxr_full (tdep, regnum))
508     {
509       regnum -= tdep->v0_full_regnum;
510       regcache_raw_write (regcache, S390_F0_REGNUM + regnum, buf);
511       regcache_raw_write (regcache, S390_V0_LOWER_REGNUM + regnum, buf + 8);
512       return;
513     }
514
515   internal_error (__FILE__, __LINE__, _("invalid regnum"));
516 }
517
518 /* 'float' values are stored in the upper half of floating-point
519    registers, even though we are otherwise a big-endian platform.  The
520    same applies to a 'float' value within a vector.  */
521
522 static struct value *
523 s390_value_from_register (struct gdbarch *gdbarch, struct type *type,
524                           int regnum, struct frame_id frame_id)
525 {
526   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
527   struct value *value = default_value_from_register (gdbarch, type,
528                                                      regnum, frame_id);
529   check_typedef (type);
530
531   if ((regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM
532        && TYPE_LENGTH (type) < 8)
533       || regnum_is_vxr_full (tdep, regnum)
534       || (regnum >= S390_V16_REGNUM && regnum <= S390_V31_REGNUM))
535     set_value_offset (value, 0);
536
537   return value;
538 }
539
540 /* Register groups.  */
541
542 static int
543 s390_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
544                                  struct reggroup *group)
545 {
546   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
547
548   /* We usually save/restore the whole PSW, which includes PC and CC.
549      However, some older gdbservers may not support saving/restoring
550      the whole PSW yet, and will return an XML register description
551      excluding those from the save/restore register groups.  In those
552      cases, we still need to explicitly save/restore PC and CC in order
553      to push or pop frames.  Since this doesn't hurt anything if we
554      already save/restore the whole PSW (it's just redundant), we add
555      PC and CC at this point unconditionally.  */
556   if (group == save_reggroup || group == restore_reggroup)
557     return regnum == tdep->pc_regnum || regnum == tdep->cc_regnum;
558
559   if (group == vector_reggroup)
560     return regnum_is_vxr_full (tdep, regnum);
561
562   if (group == general_reggroup && regnum_is_vxr_full (tdep, regnum))
563     return 0;
564
565   return default_register_reggroup_p (gdbarch, regnum, group);
566 }
567
568 /* The "ax_pseudo_register_collect" gdbarch method.  */
569
570 static int
571 s390_ax_pseudo_register_collect (struct gdbarch *gdbarch,
572                                  struct agent_expr *ax, int regnum)
573 {
574   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
575   if (regnum == tdep->pc_regnum)
576     {
577       ax_reg_mask (ax, S390_PSWA_REGNUM);
578     }
579   else if (regnum == tdep->cc_regnum)
580     {
581       ax_reg_mask (ax, S390_PSWM_REGNUM);
582     }
583   else if (regnum_is_gpr_full (tdep, regnum))
584     {
585       regnum -= tdep->gpr_full_regnum;
586       ax_reg_mask (ax, S390_R0_REGNUM + regnum);
587       ax_reg_mask (ax, S390_R0_UPPER_REGNUM + regnum);
588     }
589   else if (regnum_is_vxr_full (tdep, regnum))
590     {
591       regnum -= tdep->v0_full_regnum;
592       ax_reg_mask (ax, S390_F0_REGNUM + regnum);
593       ax_reg_mask (ax, S390_V0_LOWER_REGNUM + regnum);
594     }
595   else
596     {
597       internal_error (__FILE__, __LINE__, _("invalid regnum"));
598     }
599   return 0;
600 }
601
602 /* The "ax_pseudo_register_push_stack" gdbarch method.  */
603
604 static int
605 s390_ax_pseudo_register_push_stack (struct gdbarch *gdbarch,
606                                     struct agent_expr *ax, int regnum)
607 {
608   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
609   if (regnum == tdep->pc_regnum)
610     {
611       ax_reg (ax, S390_PSWA_REGNUM);
612       if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
613         {
614           ax_zero_ext (ax, 31);
615         }
616     }
617   else if (regnum == tdep->cc_regnum)
618     {
619       ax_reg (ax, S390_PSWM_REGNUM);
620       if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
621         ax_const_l (ax, 12);
622       else
623         ax_const_l (ax, 44);
624       ax_simple (ax, aop_rsh_unsigned);
625       ax_zero_ext (ax, 2);
626     }
627   else if (regnum_is_gpr_full (tdep, regnum))
628     {
629       regnum -= tdep->gpr_full_regnum;
630       ax_reg (ax, S390_R0_REGNUM + regnum);
631       ax_reg (ax, S390_R0_UPPER_REGNUM + regnum);
632       ax_const_l (ax, 32);
633       ax_simple (ax, aop_lsh);
634       ax_simple (ax, aop_bit_or);
635     }
636   else if (regnum_is_vxr_full (tdep, regnum))
637     {
638       /* Too large to stuff on the stack.  */
639       return 1;
640     }
641   else
642     {
643       internal_error (__FILE__, __LINE__, _("invalid regnum"));
644     }
645   return 0;
646 }
647
648 /* The "gen_return_address" gdbarch method.  Since this is supposed to be
649    just a best-effort method, and we don't really have the means to run
650    the full unwinder here, just collect the link register.  */
651
652 static void
653 s390_gen_return_address (struct gdbarch *gdbarch,
654                          struct agent_expr *ax, struct axs_value *value,
655                          CORE_ADDR scope)
656 {
657   value->type = register_type (gdbarch, S390_R14_REGNUM);
658   value->kind = axs_lvalue_register;
659   value->u.reg = S390_R14_REGNUM;
660 }
661
662
663 /* A helper for s390_software_single_step, decides if an instruction
664    is a partial-execution instruction that needs to be executed until
665    completion when in record mode.  If it is, returns 1 and writes
666    instruction length to a pointer.  */
667
668 static int
669 s390_is_partial_instruction (struct gdbarch *gdbarch, CORE_ADDR loc, int *len)
670 {
671   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
672   uint16_t insn;
673
674   insn = read_memory_integer (loc, 2, byte_order);
675
676   switch (insn >> 8)
677     {
678     case 0xa8: /* MVCLE */
679       *len = 4;
680       return 1;
681
682     case 0xeb:
683       {
684         insn = read_memory_integer (loc + 4, 2, byte_order);
685         if ((insn & 0xff) == 0x8e)
686           {
687             /* MVCLU */
688             *len = 6;
689             return 1;
690           }
691       }
692       break;
693     }
694
695   switch (insn)
696     {
697     case 0xb255: /* MVST */
698     case 0xb263: /* CMPSC */
699     case 0xb2a5: /* TRE */
700     case 0xb2a6: /* CU21 */
701     case 0xb2a7: /* CU12 */
702     case 0xb9b0: /* CU14 */
703     case 0xb9b1: /* CU24 */
704     case 0xb9b2: /* CU41 */
705     case 0xb9b3: /* CU42 */
706     case 0xb92a: /* KMF */
707     case 0xb92b: /* KMO */
708     case 0xb92f: /* KMC */
709     case 0xb92d: /* KMCTR */
710     case 0xb92e: /* KM */
711     case 0xb93c: /* PPNO */
712     case 0xb990: /* TRTT */
713     case 0xb991: /* TRTO */
714     case 0xb992: /* TROT */
715     case 0xb993: /* TROO */
716       *len = 4;
717       return 1;
718     }
719
720   return 0;
721 }
722
723 /* Implement the "software_single_step" gdbarch method, needed to single step
724    through instructions like MVCLE in record mode, to make sure they are
725    executed to completion.  Without that, record will save the full length
726    of destination buffer on every iteration, even though the CPU will only
727    process about 4kiB of it each time, leading to O(n**2) memory and time
728    complexity.  */
729
730 static std::vector<CORE_ADDR>
731 s390_software_single_step (struct regcache *regcache)
732 {
733   struct gdbarch *gdbarch = get_regcache_arch (regcache);
734   CORE_ADDR loc = regcache_read_pc (regcache);
735   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
736   int len;
737   uint16_t insn;
738
739   /* Special handling only if recording.  */
740   if (!record_full_is_used ())
741     return {};
742
743   /* First, match a partial instruction.  */
744   if (!s390_is_partial_instruction (gdbarch, loc, &len))
745     return {};
746
747   loc += len;
748
749   /* Second, look for a branch back to it.  */
750   insn = read_memory_integer (loc, 2, byte_order);
751   if (insn != 0xa714) /* BRC with mask 1 */
752     return {};
753
754   insn = read_memory_integer (loc + 2, 2, byte_order);
755   if (insn != (uint16_t) -(len / 2))
756     return {};
757
758   loc += 4;
759
760   /* Found it, step past the whole thing.  */
761   return {loc};
762 }
763
764 static int
765 s390_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
766                                    struct displaced_step_closure *closure)
767 {
768   return 1;
769 }
770
771
772 /* Maps for register sets.  */
773
774 static const struct regcache_map_entry s390_gregmap[] =
775   {
776     { 1, S390_PSWM_REGNUM },
777     { 1, S390_PSWA_REGNUM },
778     { 16, S390_R0_REGNUM },
779     { 16, S390_A0_REGNUM },
780     { 1, S390_ORIG_R2_REGNUM },
781     { 0 }
782   };
783
784 static const struct regcache_map_entry s390_fpregmap[] =
785   {
786     { 1, S390_FPC_REGNUM, 8 },
787     { 16, S390_F0_REGNUM, 8 },
788     { 0 }
789   };
790
791 static const struct regcache_map_entry s390_regmap_upper[] =
792   {
793     { 16, S390_R0_UPPER_REGNUM, 4 },
794     { 0 }
795   };
796
797 static const struct regcache_map_entry s390_regmap_last_break[] =
798   {
799     { 1, REGCACHE_MAP_SKIP, 4 },
800     { 1, S390_LAST_BREAK_REGNUM, 4 },
801     { 0 }
802   };
803
804 static const struct regcache_map_entry s390x_regmap_last_break[] =
805   {
806     { 1, S390_LAST_BREAK_REGNUM, 8 },
807     { 0 }
808   };
809
810 static const struct regcache_map_entry s390_regmap_system_call[] =
811   {
812     { 1, S390_SYSTEM_CALL_REGNUM, 4 },
813     { 0 }
814   };
815
816 static const struct regcache_map_entry s390_regmap_tdb[] =
817   {
818     { 1, S390_TDB_DWORD0_REGNUM, 8 },
819     { 1, S390_TDB_ABORT_CODE_REGNUM, 8 },
820     { 1, S390_TDB_CONFLICT_TOKEN_REGNUM, 8 },
821     { 1, S390_TDB_ATIA_REGNUM, 8 },
822     { 12, REGCACHE_MAP_SKIP, 8 },
823     { 16, S390_TDB_R0_REGNUM, 8 },
824     { 0 }
825   };
826
827 static const struct regcache_map_entry s390_regmap_vxrs_low[] =
828   {
829     { 16, S390_V0_LOWER_REGNUM, 8 },
830     { 0 }
831   };
832
833 static const struct regcache_map_entry s390_regmap_vxrs_high[] =
834   {
835     { 16, S390_V16_REGNUM, 16 },
836     { 0 }
837   };
838
839 static const struct regcache_map_entry s390_regmap_gs[] =
840   {
841     { 1, REGCACHE_MAP_SKIP, 8 },
842     { 1, S390_GSD_REGNUM, 8 },
843     { 1, S390_GSSM_REGNUM, 8 },
844     { 1, S390_GSEPLA_REGNUM, 8 },
845     { 0 }
846   };
847
848 static const struct regcache_map_entry s390_regmap_gsbc[] =
849   {
850     { 1, REGCACHE_MAP_SKIP, 8 },
851     { 1, S390_BC_GSD_REGNUM, 8 },
852     { 1, S390_BC_GSSM_REGNUM, 8 },
853     { 1, S390_BC_GSEPLA_REGNUM, 8 },
854     { 0 }
855   };
856
857
858 /* Supply the TDB regset.  Like regcache_supply_regset, but invalidate
859    the TDB registers unless the TDB format field is valid.  */
860
861 static void
862 s390_supply_tdb_regset (const struct regset *regset, struct regcache *regcache,
863                     int regnum, const void *regs, size_t len)
864 {
865   ULONGEST tdw;
866   enum register_status ret;
867
868   regcache_supply_regset (regset, regcache, regnum, regs, len);
869   ret = regcache_cooked_read_unsigned (regcache, S390_TDB_DWORD0_REGNUM, &tdw);
870   if (ret != REG_VALID || (tdw >> 56) != 1)
871     regcache_supply_regset (regset, regcache, regnum, NULL, len);
872 }
873
874 const struct regset s390_gregset = {
875   s390_gregmap,
876   regcache_supply_regset,
877   regcache_collect_regset
878 };
879
880 const struct regset s390_fpregset = {
881   s390_fpregmap,
882   regcache_supply_regset,
883   regcache_collect_regset
884 };
885
886 static const struct regset s390_upper_regset = {
887   s390_regmap_upper,
888   regcache_supply_regset,
889   regcache_collect_regset
890 };
891
892 const struct regset s390_last_break_regset = {
893   s390_regmap_last_break,
894   regcache_supply_regset,
895   regcache_collect_regset
896 };
897
898 const struct regset s390x_last_break_regset = {
899   s390x_regmap_last_break,
900   regcache_supply_regset,
901   regcache_collect_regset
902 };
903
904 const struct regset s390_system_call_regset = {
905   s390_regmap_system_call,
906   regcache_supply_regset,
907   regcache_collect_regset
908 };
909
910 const struct regset s390_tdb_regset = {
911   s390_regmap_tdb,
912   s390_supply_tdb_regset,
913   regcache_collect_regset
914 };
915
916 const struct regset s390_vxrs_low_regset = {
917   s390_regmap_vxrs_low,
918   regcache_supply_regset,
919   regcache_collect_regset
920 };
921
922 const struct regset s390_vxrs_high_regset = {
923   s390_regmap_vxrs_high,
924   regcache_supply_regset,
925   regcache_collect_regset
926 };
927
928 const struct regset s390_gs_regset = {
929   s390_regmap_gs,
930   regcache_supply_regset,
931   regcache_collect_regset
932 };
933
934 const struct regset s390_gsbc_regset = {
935   s390_regmap_gsbc,
936   regcache_supply_regset,
937   regcache_collect_regset
938 };
939
940 /* Iterate over supported core file register note sections. */
941
942 static void
943 s390_iterate_over_regset_sections (struct gdbarch *gdbarch,
944                                    iterate_over_regset_sections_cb *cb,
945                                    void *cb_data,
946                                    const struct regcache *regcache)
947 {
948   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
949   const int gregset_size = (tdep->abi == ABI_LINUX_S390 ?
950                             s390_sizeof_gregset : s390x_sizeof_gregset);
951
952   cb (".reg", gregset_size, &s390_gregset, NULL, cb_data);
953   cb (".reg2", s390_sizeof_fpregset, &s390_fpregset, NULL, cb_data);
954
955   if (tdep->abi == ABI_LINUX_S390 && tdep->gpr_full_regnum != -1)
956     cb (".reg-s390-high-gprs", 16 * 4, &s390_upper_regset,
957         "s390 GPR upper halves", cb_data);
958
959   if (tdep->have_linux_v1)
960     cb (".reg-s390-last-break", 8,
961         (gdbarch_ptr_bit (gdbarch) == 32
962          ? &s390_last_break_regset : &s390x_last_break_regset),
963         "s390 last-break address", cb_data);
964
965   if (tdep->have_linux_v2)
966     cb (".reg-s390-system-call", 4, &s390_system_call_regset,
967         "s390 system-call", cb_data);
968
969   /* If regcache is set, we are in "write" (gcore) mode.  In this
970      case, don't iterate over the TDB unless its registers are
971      available.  */
972   if (tdep->have_tdb
973       && (regcache == NULL
974           || REG_VALID == regcache_register_status (regcache,
975                                                     S390_TDB_DWORD0_REGNUM)))
976     cb (".reg-s390-tdb", s390_sizeof_tdbregset, &s390_tdb_regset,
977         "s390 TDB", cb_data);
978
979   if (tdep->v0_full_regnum != -1)
980     {
981       cb (".reg-s390-vxrs-low", 16 * 8, &s390_vxrs_low_regset,
982           "s390 vector registers 0-15 lower half", cb_data);
983       cb (".reg-s390-vxrs-high", 16 * 16, &s390_vxrs_high_regset,
984           "s390 vector registers 16-31", cb_data);
985     }
986
987   /* Iterate over the guarded-storage regsets if in "read" mode, or if
988      their registers are available.  */
989   if (tdep->have_gs)
990     {
991       if (regcache == NULL
992           || REG_VALID == regcache_register_status (regcache,
993                                                     S390_GSD_REGNUM))
994         cb (".reg-s390-gs-cb", 4 * 8, &s390_gs_regset,
995             "s390 guarded-storage registers", cb_data);
996
997       if (regcache == NULL
998           || REG_VALID == regcache_register_status (regcache,
999                                                     S390_BC_GSD_REGNUM))
1000         cb (".reg-s390-gs-bc", 4 * 8, &s390_gsbc_regset,
1001             "s390 guarded-storage broadcast control", cb_data);
1002     }
1003 }
1004
1005 static const struct target_desc *
1006 s390_core_read_description (struct gdbarch *gdbarch,
1007                             struct target_ops *target, bfd *abfd)
1008 {
1009   asection *section = bfd_get_section_by_name (abfd, ".reg");
1010   CORE_ADDR hwcap = 0;
1011   bool high_gprs, v1, v2, te, vx, gs;
1012
1013   target_auxv_search (target, AT_HWCAP, &hwcap);
1014   if (!section)
1015     return NULL;
1016
1017   high_gprs = (bfd_get_section_by_name (abfd, ".reg-s390-high-gprs")
1018                != NULL);
1019   v1 = (bfd_get_section_by_name (abfd, ".reg-s390-last-break") != NULL);
1020   v2 = (bfd_get_section_by_name (abfd, ".reg-s390-system-call") != NULL);
1021   vx = (hwcap & HWCAP_S390_VX);
1022   te = (hwcap & HWCAP_S390_TE);
1023   gs = (hwcap & HWCAP_S390_GS);
1024
1025   switch (bfd_section_size (abfd, section))
1026     {
1027     case s390_sizeof_gregset:
1028       if (high_gprs)
1029         return (gs ? tdesc_s390_gs_linux64 :
1030                 te && vx ? tdesc_s390_tevx_linux64 :
1031                 vx ? tdesc_s390_vx_linux64 :
1032                 te ? tdesc_s390_te_linux64 :
1033                 v2 ? tdesc_s390_linux64v2 :
1034                 v1 ? tdesc_s390_linux64v1 : tdesc_s390_linux64);
1035       else
1036         return (v2 ? tdesc_s390_linux32v2 :
1037                 v1 ? tdesc_s390_linux32v1 : tdesc_s390_linux32);
1038
1039     case s390x_sizeof_gregset:
1040       return (gs ? tdesc_s390x_gs_linux64 :
1041               te && vx ? tdesc_s390x_tevx_linux64 :
1042               vx ? tdesc_s390x_vx_linux64 :
1043               te ? tdesc_s390x_te_linux64 :
1044               v2 ? tdesc_s390x_linux64v2 :
1045               v1 ? tdesc_s390x_linux64v1 : tdesc_s390x_linux64);
1046
1047     default:
1048       return NULL;
1049     }
1050 }
1051
1052
1053 /* Decoding S/390 instructions.  */
1054
1055 /* Named opcode values for the S/390 instructions we recognize.  Some
1056    instructions have their opcode split across two fields; those are the
1057    op1_* and op2_* enums.  */
1058 enum
1059   {
1060     op1_lhi  = 0xa7,   op2_lhi  = 0x08,
1061     op1_lghi = 0xa7,   op2_lghi = 0x09,
1062     op1_lgfi = 0xc0,   op2_lgfi = 0x01,
1063     op_lr    = 0x18,
1064     op_lgr   = 0xb904,
1065     op_l     = 0x58,
1066     op1_ly   = 0xe3,   op2_ly   = 0x58,
1067     op1_lg   = 0xe3,   op2_lg   = 0x04,
1068     op_lm    = 0x98,
1069     op1_lmy  = 0xeb,   op2_lmy  = 0x98,
1070     op1_lmg  = 0xeb,   op2_lmg  = 0x04,
1071     op_st    = 0x50,
1072     op1_sty  = 0xe3,   op2_sty  = 0x50,
1073     op1_stg  = 0xe3,   op2_stg  = 0x24,
1074     op_std   = 0x60,
1075     op_stm   = 0x90,
1076     op1_stmy = 0xeb,   op2_stmy = 0x90,
1077     op1_stmg = 0xeb,   op2_stmg = 0x24,
1078     op1_aghi = 0xa7,   op2_aghi = 0x0b,
1079     op1_ahi  = 0xa7,   op2_ahi  = 0x0a,
1080     op1_agfi = 0xc2,   op2_agfi = 0x08,
1081     op1_afi  = 0xc2,   op2_afi  = 0x09,
1082     op1_algfi= 0xc2,   op2_algfi= 0x0a,
1083     op1_alfi = 0xc2,   op2_alfi = 0x0b,
1084     op_ar    = 0x1a,
1085     op_agr   = 0xb908,
1086     op_a     = 0x5a,
1087     op1_ay   = 0xe3,   op2_ay   = 0x5a,
1088     op1_ag   = 0xe3,   op2_ag   = 0x08,
1089     op1_slgfi= 0xc2,   op2_slgfi= 0x04,
1090     op1_slfi = 0xc2,   op2_slfi = 0x05,
1091     op_sr    = 0x1b,
1092     op_sgr   = 0xb909,
1093     op_s     = 0x5b,
1094     op1_sy   = 0xe3,   op2_sy   = 0x5b,
1095     op1_sg   = 0xe3,   op2_sg   = 0x09,
1096     op_nr    = 0x14,
1097     op_ngr   = 0xb980,
1098     op_la    = 0x41,
1099     op1_lay  = 0xe3,   op2_lay  = 0x71,
1100     op1_larl = 0xc0,   op2_larl = 0x00,
1101     op_basr  = 0x0d,
1102     op_bas   = 0x4d,
1103     op_bcr   = 0x07,
1104     op_bc    = 0x0d,
1105     op_bctr  = 0x06,
1106     op_bctgr = 0xb946,
1107     op_bct   = 0x46,
1108     op1_bctg = 0xe3,   op2_bctg = 0x46,
1109     op_bxh   = 0x86,
1110     op1_bxhg = 0xeb,   op2_bxhg = 0x44,
1111     op_bxle  = 0x87,
1112     op1_bxleg= 0xeb,   op2_bxleg= 0x45,
1113     op1_bras = 0xa7,   op2_bras = 0x05,
1114     op1_brasl= 0xc0,   op2_brasl= 0x05,
1115     op1_brc  = 0xa7,   op2_brc  = 0x04,
1116     op1_brcl = 0xc0,   op2_brcl = 0x04,
1117     op1_brct = 0xa7,   op2_brct = 0x06,
1118     op1_brctg= 0xa7,   op2_brctg= 0x07,
1119     op_brxh  = 0x84,
1120     op1_brxhg= 0xec,   op2_brxhg= 0x44,
1121     op_brxle = 0x85,
1122     op1_brxlg= 0xec,   op2_brxlg= 0x45,
1123     op_svc   = 0x0a,
1124   };
1125
1126
1127 /* Read a single instruction from address AT.  */
1128
1129 #define S390_MAX_INSTR_SIZE 6
1130 static int
1131 s390_readinstruction (bfd_byte instr[], CORE_ADDR at)
1132 {
1133   static int s390_instrlen[] = { 2, 4, 4, 6 };
1134   int instrlen;
1135
1136   if (target_read_memory (at, &instr[0], 2))
1137     return -1;
1138   instrlen = s390_instrlen[instr[0] >> 6];
1139   if (instrlen > 2)
1140     {
1141       if (target_read_memory (at + 2, &instr[2], instrlen - 2))
1142         return -1;
1143     }
1144   return instrlen;
1145 }
1146
1147
1148 /* The functions below are for recognizing and decoding S/390
1149    instructions of various formats.  Each of them checks whether INSN
1150    is an instruction of the given format, with the specified opcodes.
1151    If it is, it sets the remaining arguments to the values of the
1152    instruction's fields, and returns a non-zero value; otherwise, it
1153    returns zero.
1154
1155    These functions' arguments appear in the order they appear in the
1156    instruction, not in the machine-language form.  So, opcodes always
1157    come first, even though they're sometimes scattered around the
1158    instructions.  And displacements appear before base and extension
1159    registers, as they do in the assembly syntax, not at the end, as
1160    they do in the machine language.  */
1161 static int
1162 is_ri (bfd_byte *insn, int op1, int op2, unsigned int *r1, int *i2)
1163 {
1164   if (insn[0] == op1 && (insn[1] & 0xf) == op2)
1165     {
1166       *r1 = (insn[1] >> 4) & 0xf;
1167       /* i2 is a 16-bit signed quantity.  */
1168       *i2 = (((insn[2] << 8) | insn[3]) ^ 0x8000) - 0x8000;
1169       return 1;
1170     }
1171   else
1172     return 0;
1173 }
1174
1175
1176 static int
1177 is_ril (bfd_byte *insn, int op1, int op2,
1178         unsigned int *r1, int *i2)
1179 {
1180   if (insn[0] == op1 && (insn[1] & 0xf) == op2)
1181     {
1182       *r1 = (insn[1] >> 4) & 0xf;
1183       /* i2 is a signed quantity.  If the host 'int' is 32 bits long,
1184          no sign extension is necessary, but we don't want to assume
1185          that.  */
1186       *i2 = (((insn[2] << 24)
1187               | (insn[3] << 16)
1188               | (insn[4] << 8)
1189               | (insn[5])) ^ 0x80000000) - 0x80000000;
1190       return 1;
1191     }
1192   else
1193     return 0;
1194 }
1195
1196
1197 static int
1198 is_rr (bfd_byte *insn, int op, unsigned int *r1, unsigned int *r2)
1199 {
1200   if (insn[0] == op)
1201     {
1202       *r1 = (insn[1] >> 4) & 0xf;
1203       *r2 = insn[1] & 0xf;
1204       return 1;
1205     }
1206   else
1207     return 0;
1208 }
1209
1210
1211 static int
1212 is_rre (bfd_byte *insn, int op, unsigned int *r1, unsigned int *r2)
1213 {
1214   if (((insn[0] << 8) | insn[1]) == op)
1215     {
1216       /* Yes, insn[3].  insn[2] is unused in RRE format.  */
1217       *r1 = (insn[3] >> 4) & 0xf;
1218       *r2 = insn[3] & 0xf;
1219       return 1;
1220     }
1221   else
1222     return 0;
1223 }
1224
1225
1226 static int
1227 is_rs (bfd_byte *insn, int op,
1228        unsigned int *r1, unsigned int *r3, int *d2, unsigned int *b2)
1229 {
1230   if (insn[0] == op)
1231     {
1232       *r1 = (insn[1] >> 4) & 0xf;
1233       *r3 = insn[1] & 0xf;
1234       *b2 = (insn[2] >> 4) & 0xf;
1235       *d2 = ((insn[2] & 0xf) << 8) | insn[3];
1236       return 1;
1237     }
1238   else
1239     return 0;
1240 }
1241
1242
1243 static int
1244 is_rsy (bfd_byte *insn, int op1, int op2,
1245         unsigned int *r1, unsigned int *r3, int *d2, unsigned int *b2)
1246 {
1247   if (insn[0] == op1
1248       && insn[5] == op2)
1249     {
1250       *r1 = (insn[1] >> 4) & 0xf;
1251       *r3 = insn[1] & 0xf;
1252       *b2 = (insn[2] >> 4) & 0xf;
1253       /* The 'long displacement' is a 20-bit signed integer.  */
1254       *d2 = ((((insn[2] & 0xf) << 8) | insn[3] | (insn[4] << 12))
1255                 ^ 0x80000) - 0x80000;
1256       return 1;
1257     }
1258   else
1259     return 0;
1260 }
1261
1262
1263 static int
1264 is_rx (bfd_byte *insn, int op,
1265        unsigned int *r1, int *d2, unsigned int *x2, unsigned int *b2)
1266 {
1267   if (insn[0] == op)
1268     {
1269       *r1 = (insn[1] >> 4) & 0xf;
1270       *x2 = insn[1] & 0xf;
1271       *b2 = (insn[2] >> 4) & 0xf;
1272       *d2 = ((insn[2] & 0xf) << 8) | insn[3];
1273       return 1;
1274     }
1275   else
1276     return 0;
1277 }
1278
1279
1280 static int
1281 is_rxy (bfd_byte *insn, int op1, int op2,
1282         unsigned int *r1, int *d2, unsigned int *x2, unsigned int *b2)
1283 {
1284   if (insn[0] == op1
1285       && insn[5] == op2)
1286     {
1287       *r1 = (insn[1] >> 4) & 0xf;
1288       *x2 = insn[1] & 0xf;
1289       *b2 = (insn[2] >> 4) & 0xf;
1290       /* The 'long displacement' is a 20-bit signed integer.  */
1291       *d2 = ((((insn[2] & 0xf) << 8) | insn[3] | (insn[4] << 12))
1292                 ^ 0x80000) - 0x80000;
1293       return 1;
1294     }
1295   else
1296     return 0;
1297 }
1298
1299
1300 /* Prologue analysis.  */
1301
1302 #define S390_NUM_GPRS 16
1303 #define S390_NUM_FPRS 16
1304
1305 struct s390_prologue_data {
1306
1307   /* The stack.  */
1308   struct pv_area *stack;
1309
1310   /* The size and byte-order of a GPR or FPR.  */
1311   int gpr_size;
1312   int fpr_size;
1313   enum bfd_endian byte_order;
1314
1315   /* The general-purpose registers.  */
1316   pv_t gpr[S390_NUM_GPRS];
1317
1318   /* The floating-point registers.  */
1319   pv_t fpr[S390_NUM_FPRS];
1320
1321   /* The offset relative to the CFA where the incoming GPR N was saved
1322      by the function prologue.  0 if not saved or unknown.  */
1323   int gpr_slot[S390_NUM_GPRS];
1324
1325   /* Likewise for FPRs.  */
1326   int fpr_slot[S390_NUM_FPRS];
1327
1328   /* Nonzero if the backchain was saved.  This is assumed to be the
1329      case when the incoming SP is saved at the current SP location.  */
1330   int back_chain_saved_p;
1331 };
1332
1333 /* Return the effective address for an X-style instruction, like:
1334
1335         L R1, D2(X2, B2)
1336
1337    Here, X2 and B2 are registers, and D2 is a signed 20-bit
1338    constant; the effective address is the sum of all three.  If either
1339    X2 or B2 are zero, then it doesn't contribute to the sum --- this
1340    means that r0 can't be used as either X2 or B2.  */
1341 static pv_t
1342 s390_addr (struct s390_prologue_data *data,
1343            int d2, unsigned int x2, unsigned int b2)
1344 {
1345   pv_t result;
1346
1347   result = pv_constant (d2);
1348   if (x2)
1349     result = pv_add (result, data->gpr[x2]);
1350   if (b2)
1351     result = pv_add (result, data->gpr[b2]);
1352
1353   return result;
1354 }
1355
1356 /* Do a SIZE-byte store of VALUE to D2(X2,B2).  */
1357 static void
1358 s390_store (struct s390_prologue_data *data,
1359             int d2, unsigned int x2, unsigned int b2, CORE_ADDR size,
1360             pv_t value)
1361 {
1362   pv_t addr = s390_addr (data, d2, x2, b2);
1363   pv_t offset;
1364
1365   /* Check whether we are storing the backchain.  */
1366   offset = pv_subtract (data->gpr[S390_SP_REGNUM - S390_R0_REGNUM], addr);
1367
1368   if (pv_is_constant (offset) && offset.k == 0)
1369     if (size == data->gpr_size
1370         && pv_is_register_k (value, S390_SP_REGNUM, 0))
1371       {
1372         data->back_chain_saved_p = 1;
1373         return;
1374       }
1375
1376
1377   /* Check whether we are storing a register into the stack.  */
1378   if (!data->stack->store_would_trash (addr))
1379     data->stack->store (addr, size, value);
1380
1381
1382   /* Note: If this is some store we cannot identify, you might think we
1383      should forget our cached values, as any of those might have been hit.
1384
1385      However, we make the assumption that the register save areas are only
1386      ever stored to once in any given function, and we do recognize these
1387      stores.  Thus every store we cannot recognize does not hit our data.  */
1388 }
1389
1390 /* Do a SIZE-byte load from D2(X2,B2).  */
1391 static pv_t
1392 s390_load (struct s390_prologue_data *data,
1393            int d2, unsigned int x2, unsigned int b2, CORE_ADDR size)
1394
1395 {
1396   pv_t addr = s390_addr (data, d2, x2, b2);
1397
1398   /* If it's a load from an in-line constant pool, then we can
1399      simulate that, under the assumption that the code isn't
1400      going to change between the time the processor actually
1401      executed it creating the current frame, and the time when
1402      we're analyzing the code to unwind past that frame.  */
1403   if (pv_is_constant (addr))
1404     {
1405       struct target_section *secp;
1406       secp = target_section_by_addr (&current_target, addr.k);
1407       if (secp != NULL
1408           && (bfd_get_section_flags (secp->the_bfd_section->owner,
1409                                      secp->the_bfd_section)
1410               & SEC_READONLY))
1411         return pv_constant (read_memory_integer (addr.k, size,
1412                                                  data->byte_order));
1413     }
1414
1415   /* Check whether we are accessing one of our save slots.  */
1416   return data->stack->fetch (addr, size);
1417 }
1418
1419 /* Function for finding saved registers in a 'struct pv_area'; we pass
1420    this to pv_area::scan.
1421
1422    If VALUE is a saved register, ADDR says it was saved at a constant
1423    offset from the frame base, and SIZE indicates that the whole
1424    register was saved, record its offset in the reg_offset table in
1425    PROLOGUE_UNTYPED.  */
1426 static void
1427 s390_check_for_saved (void *data_untyped, pv_t addr,
1428                       CORE_ADDR size, pv_t value)
1429 {
1430   struct s390_prologue_data *data = (struct s390_prologue_data *) data_untyped;
1431   int i, offset;
1432
1433   if (!pv_is_register (addr, S390_SP_REGNUM))
1434     return;
1435
1436   offset = 16 * data->gpr_size + 32 - addr.k;
1437
1438   /* If we are storing the original value of a register, we want to
1439      record the CFA offset.  If the same register is stored multiple
1440      times, the stack slot with the highest address counts.  */
1441
1442   for (i = 0; i < S390_NUM_GPRS; i++)
1443     if (size == data->gpr_size
1444         && pv_is_register_k (value, S390_R0_REGNUM + i, 0))
1445       if (data->gpr_slot[i] == 0
1446           || data->gpr_slot[i] > offset)
1447         {
1448           data->gpr_slot[i] = offset;
1449           return;
1450         }
1451
1452   for (i = 0; i < S390_NUM_FPRS; i++)
1453     if (size == data->fpr_size
1454         && pv_is_register_k (value, S390_F0_REGNUM + i, 0))
1455       if (data->fpr_slot[i] == 0
1456           || data->fpr_slot[i] > offset)
1457         {
1458           data->fpr_slot[i] = offset;
1459           return;
1460         }
1461 }
1462
1463 /* Analyze the prologue of the function starting at START_PC,
1464    continuing at most until CURRENT_PC.  Initialize DATA to
1465    hold all information we find out about the state of the registers
1466    and stack slots.  Return the address of the instruction after
1467    the last one that changed the SP, FP, or back chain; or zero
1468    on error.  */
1469 static CORE_ADDR
1470 s390_analyze_prologue (struct gdbarch *gdbarch,
1471                        CORE_ADDR start_pc,
1472                        CORE_ADDR current_pc,
1473                        struct s390_prologue_data *data)
1474 {
1475   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1476
1477   /* Our return value:
1478      The address of the instruction after the last one that changed
1479      the SP, FP, or back chain;  zero if we got an error trying to
1480      read memory.  */
1481   CORE_ADDR result = start_pc;
1482
1483   /* The current PC for our abstract interpretation.  */
1484   CORE_ADDR pc;
1485
1486   /* The address of the next instruction after that.  */
1487   CORE_ADDR next_pc;
1488
1489   pv_area stack (S390_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1490   scoped_restore restore_stack = make_scoped_restore (&data->stack, &stack);
1491
1492   /* Set up everything's initial value.  */
1493   {
1494     int i;
1495
1496     /* For the purpose of prologue tracking, we consider the GPR size to
1497        be equal to the ABI word size, even if it is actually larger
1498        (i.e. when running a 32-bit binary under a 64-bit kernel).  */
1499     data->gpr_size = word_size;
1500     data->fpr_size = 8;
1501     data->byte_order = gdbarch_byte_order (gdbarch);
1502
1503     for (i = 0; i < S390_NUM_GPRS; i++)
1504       data->gpr[i] = pv_register (S390_R0_REGNUM + i, 0);
1505
1506     for (i = 0; i < S390_NUM_FPRS; i++)
1507       data->fpr[i] = pv_register (S390_F0_REGNUM + i, 0);
1508
1509     for (i = 0; i < S390_NUM_GPRS; i++)
1510       data->gpr_slot[i]  = 0;
1511
1512     for (i = 0; i < S390_NUM_FPRS; i++)
1513       data->fpr_slot[i]  = 0;
1514
1515     data->back_chain_saved_p = 0;
1516   }
1517
1518   /* Start interpreting instructions, until we hit the frame's
1519      current PC or the first branch instruction.  */
1520   for (pc = start_pc; pc > 0 && pc < current_pc; pc = next_pc)
1521     {
1522       bfd_byte insn[S390_MAX_INSTR_SIZE];
1523       int insn_len = s390_readinstruction (insn, pc);
1524
1525       bfd_byte dummy[S390_MAX_INSTR_SIZE] = { 0 };
1526       bfd_byte *insn32 = word_size == 4 ? insn : dummy;
1527       bfd_byte *insn64 = word_size == 8 ? insn : dummy;
1528
1529       /* Fields for various kinds of instructions.  */
1530       unsigned int b2, r1, r2, x2, r3;
1531       int i2, d2;
1532
1533       /* The values of SP and FP before this instruction,
1534          for detecting instructions that change them.  */
1535       pv_t pre_insn_sp, pre_insn_fp;
1536       /* Likewise for the flag whether the back chain was saved.  */
1537       int pre_insn_back_chain_saved_p;
1538
1539       /* If we got an error trying to read the instruction, report it.  */
1540       if (insn_len < 0)
1541         {
1542           result = 0;
1543           break;
1544         }
1545
1546       next_pc = pc + insn_len;
1547
1548       pre_insn_sp = data->gpr[S390_SP_REGNUM - S390_R0_REGNUM];
1549       pre_insn_fp = data->gpr[S390_FRAME_REGNUM - S390_R0_REGNUM];
1550       pre_insn_back_chain_saved_p = data->back_chain_saved_p;
1551
1552
1553       /* LHI r1, i2 --- load halfword immediate.  */
1554       /* LGHI r1, i2 --- load halfword immediate (64-bit version).  */
1555       /* LGFI r1, i2 --- load fullword immediate.  */
1556       if (is_ri (insn32, op1_lhi, op2_lhi, &r1, &i2)
1557           || is_ri (insn64, op1_lghi, op2_lghi, &r1, &i2)
1558           || is_ril (insn, op1_lgfi, op2_lgfi, &r1, &i2))
1559         data->gpr[r1] = pv_constant (i2);
1560
1561       /* LR r1, r2 --- load from register.  */
1562       /* LGR r1, r2 --- load from register (64-bit version).  */
1563       else if (is_rr (insn32, op_lr, &r1, &r2)
1564                || is_rre (insn64, op_lgr, &r1, &r2))
1565         data->gpr[r1] = data->gpr[r2];
1566
1567       /* L r1, d2(x2, b2) --- load.  */
1568       /* LY r1, d2(x2, b2) --- load (long-displacement version).  */
1569       /* LG r1, d2(x2, b2) --- load (64-bit version).  */
1570       else if (is_rx (insn32, op_l, &r1, &d2, &x2, &b2)
1571                || is_rxy (insn32, op1_ly, op2_ly, &r1, &d2, &x2, &b2)
1572                || is_rxy (insn64, op1_lg, op2_lg, &r1, &d2, &x2, &b2))
1573         data->gpr[r1] = s390_load (data, d2, x2, b2, data->gpr_size);
1574
1575       /* ST r1, d2(x2, b2) --- store.  */
1576       /* STY r1, d2(x2, b2) --- store (long-displacement version).  */
1577       /* STG r1, d2(x2, b2) --- store (64-bit version).  */
1578       else if (is_rx (insn32, op_st, &r1, &d2, &x2, &b2)
1579                || is_rxy (insn32, op1_sty, op2_sty, &r1, &d2, &x2, &b2)
1580                || is_rxy (insn64, op1_stg, op2_stg, &r1, &d2, &x2, &b2))
1581         s390_store (data, d2, x2, b2, data->gpr_size, data->gpr[r1]);
1582
1583       /* STD r1, d2(x2,b2) --- store floating-point register.  */
1584       else if (is_rx (insn, op_std, &r1, &d2, &x2, &b2))
1585         s390_store (data, d2, x2, b2, data->fpr_size, data->fpr[r1]);
1586
1587       /* STM r1, r3, d2(b2) --- store multiple.  */
1588       /* STMY r1, r3, d2(b2) --- store multiple (long-displacement
1589          version).  */
1590       /* STMG r1, r3, d2(b2) --- store multiple (64-bit version).  */
1591       else if (is_rs (insn32, op_stm, &r1, &r3, &d2, &b2)
1592                || is_rsy (insn32, op1_stmy, op2_stmy, &r1, &r3, &d2, &b2)
1593                || is_rsy (insn64, op1_stmg, op2_stmg, &r1, &r3, &d2, &b2))
1594         {
1595           for (; r1 <= r3; r1++, d2 += data->gpr_size)
1596             s390_store (data, d2, 0, b2, data->gpr_size, data->gpr[r1]);
1597         }
1598
1599       /* AHI r1, i2 --- add halfword immediate.  */
1600       /* AGHI r1, i2 --- add halfword immediate (64-bit version).  */
1601       /* AFI r1, i2 --- add fullword immediate.  */
1602       /* AGFI r1, i2 --- add fullword immediate (64-bit version).  */
1603       else if (is_ri (insn32, op1_ahi, op2_ahi, &r1, &i2)
1604                || is_ri (insn64, op1_aghi, op2_aghi, &r1, &i2)
1605                || is_ril (insn32, op1_afi, op2_afi, &r1, &i2)
1606                || is_ril (insn64, op1_agfi, op2_agfi, &r1, &i2))
1607         data->gpr[r1] = pv_add_constant (data->gpr[r1], i2);
1608
1609       /* ALFI r1, i2 --- add logical immediate.  */
1610       /* ALGFI r1, i2 --- add logical immediate (64-bit version).  */
1611       else if (is_ril (insn32, op1_alfi, op2_alfi, &r1, &i2)
1612                || is_ril (insn64, op1_algfi, op2_algfi, &r1, &i2))
1613         data->gpr[r1] = pv_add_constant (data->gpr[r1],
1614                                          (CORE_ADDR)i2 & 0xffffffff);
1615
1616       /* AR r1, r2 -- add register.  */
1617       /* AGR r1, r2 -- add register (64-bit version).  */
1618       else if (is_rr (insn32, op_ar, &r1, &r2)
1619                || is_rre (insn64, op_agr, &r1, &r2))
1620         data->gpr[r1] = pv_add (data->gpr[r1], data->gpr[r2]);
1621
1622       /* A r1, d2(x2, b2) -- add.  */
1623       /* AY r1, d2(x2, b2) -- add (long-displacement version).  */
1624       /* AG r1, d2(x2, b2) -- add (64-bit version).  */
1625       else if (is_rx (insn32, op_a, &r1, &d2, &x2, &b2)
1626                || is_rxy (insn32, op1_ay, op2_ay, &r1, &d2, &x2, &b2)
1627                || is_rxy (insn64, op1_ag, op2_ag, &r1, &d2, &x2, &b2))
1628         data->gpr[r1] = pv_add (data->gpr[r1],
1629                                 s390_load (data, d2, x2, b2, data->gpr_size));
1630
1631       /* SLFI r1, i2 --- subtract logical immediate.  */
1632       /* SLGFI r1, i2 --- subtract logical immediate (64-bit version).  */
1633       else if (is_ril (insn32, op1_slfi, op2_slfi, &r1, &i2)
1634                || is_ril (insn64, op1_slgfi, op2_slgfi, &r1, &i2))
1635         data->gpr[r1] = pv_add_constant (data->gpr[r1],
1636                                          -((CORE_ADDR)i2 & 0xffffffff));
1637
1638       /* SR r1, r2 -- subtract register.  */
1639       /* SGR r1, r2 -- subtract register (64-bit version).  */
1640       else if (is_rr (insn32, op_sr, &r1, &r2)
1641                || is_rre (insn64, op_sgr, &r1, &r2))
1642         data->gpr[r1] = pv_subtract (data->gpr[r1], data->gpr[r2]);
1643
1644       /* S r1, d2(x2, b2) -- subtract.  */
1645       /* SY r1, d2(x2, b2) -- subtract (long-displacement version).  */
1646       /* SG r1, d2(x2, b2) -- subtract (64-bit version).  */
1647       else if (is_rx (insn32, op_s, &r1, &d2, &x2, &b2)
1648                || is_rxy (insn32, op1_sy, op2_sy, &r1, &d2, &x2, &b2)
1649                || is_rxy (insn64, op1_sg, op2_sg, &r1, &d2, &x2, &b2))
1650         data->gpr[r1] = pv_subtract (data->gpr[r1],
1651                                 s390_load (data, d2, x2, b2, data->gpr_size));
1652
1653       /* LA r1, d2(x2, b2) --- load address.  */
1654       /* LAY r1, d2(x2, b2) --- load address (long-displacement version).  */
1655       else if (is_rx (insn, op_la, &r1, &d2, &x2, &b2)
1656                || is_rxy (insn, op1_lay, op2_lay, &r1, &d2, &x2, &b2))
1657         data->gpr[r1] = s390_addr (data, d2, x2, b2);
1658
1659       /* LARL r1, i2 --- load address relative long.  */
1660       else if (is_ril (insn, op1_larl, op2_larl, &r1, &i2))
1661         data->gpr[r1] = pv_constant (pc + i2 * 2);
1662
1663       /* BASR r1, 0 --- branch and save.
1664          Since r2 is zero, this saves the PC in r1, but doesn't branch.  */
1665       else if (is_rr (insn, op_basr, &r1, &r2)
1666                && r2 == 0)
1667         data->gpr[r1] = pv_constant (next_pc);
1668
1669       /* BRAS r1, i2 --- branch relative and save.  */
1670       else if (is_ri (insn, op1_bras, op2_bras, &r1, &i2))
1671         {
1672           data->gpr[r1] = pv_constant (next_pc);
1673           next_pc = pc + i2 * 2;
1674
1675           /* We'd better not interpret any backward branches.  We'll
1676              never terminate.  */
1677           if (next_pc <= pc)
1678             break;
1679         }
1680
1681       /* BRC/BRCL -- branch relative on condition.  Ignore "branch
1682          never", branch to following instruction, and "conditional
1683          trap" (BRC +2).  Otherwise terminate search.  */
1684       else if (is_ri (insn, op1_brc, op2_brc, &r1, &i2))
1685         {
1686           if (r1 != 0 && i2 != 1 && i2 != 2)
1687             break;
1688         }
1689       else if (is_ril (insn, op1_brcl, op2_brcl, &r1, &i2))
1690         {
1691           if (r1 != 0 && i2 != 3)
1692             break;
1693         }
1694
1695       /* Terminate search when hitting any other branch instruction.  */
1696       else if (is_rr (insn, op_basr, &r1, &r2)
1697                || is_rx (insn, op_bas, &r1, &d2, &x2, &b2)
1698                || is_rr (insn, op_bcr, &r1, &r2)
1699                || is_rx (insn, op_bc, &r1, &d2, &x2, &b2)
1700                || is_ril (insn, op1_brasl, op2_brasl, &r2, &i2))
1701         break;
1702
1703       else
1704         {
1705           /* An instruction we don't know how to simulate.  The only
1706              safe thing to do would be to set every value we're tracking
1707              to 'unknown'.  Instead, we'll be optimistic: we assume that
1708              we *can* interpret every instruction that the compiler uses
1709              to manipulate any of the data we're interested in here --
1710              then we can just ignore anything else.  */
1711         }
1712
1713       /* Record the address after the last instruction that changed
1714          the FP, SP, or backlink.  Ignore instructions that changed
1715          them back to their original values --- those are probably
1716          restore instructions.  (The back chain is never restored,
1717          just popped.)  */
1718       {
1719         pv_t sp = data->gpr[S390_SP_REGNUM - S390_R0_REGNUM];
1720         pv_t fp = data->gpr[S390_FRAME_REGNUM - S390_R0_REGNUM];
1721
1722         if ((! pv_is_identical (pre_insn_sp, sp)
1723              && ! pv_is_register_k (sp, S390_SP_REGNUM, 0)
1724              && sp.kind != pvk_unknown)
1725             || (! pv_is_identical (pre_insn_fp, fp)
1726                 && ! pv_is_register_k (fp, S390_FRAME_REGNUM, 0)
1727                 && fp.kind != pvk_unknown)
1728             || pre_insn_back_chain_saved_p != data->back_chain_saved_p)
1729           result = next_pc;
1730       }
1731     }
1732
1733   /* Record where all the registers were saved.  */
1734   data->stack->scan (s390_check_for_saved, data);
1735
1736   return result;
1737 }
1738
1739 /* Advance PC across any function entry prologue instructions to reach
1740    some "real" code.  */
1741 static CORE_ADDR
1742 s390_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1743 {
1744   struct s390_prologue_data data;
1745   CORE_ADDR skip_pc, func_addr;
1746
1747   if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
1748     {
1749       CORE_ADDR post_prologue_pc
1750         = skip_prologue_using_sal (gdbarch, func_addr);
1751       if (post_prologue_pc != 0)
1752         return std::max (pc, post_prologue_pc);
1753     }
1754
1755   skip_pc = s390_analyze_prologue (gdbarch, pc, (CORE_ADDR)-1, &data);
1756   return skip_pc ? skip_pc : pc;
1757 }
1758
1759 /* Implmement the stack_frame_destroyed_p gdbarch method.  */
1760 static int
1761 s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
1762 {
1763   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1764
1765   /* In frameless functions, there's not frame to destroy and thus
1766      we don't care about the epilogue.
1767
1768      In functions with frame, the epilogue sequence is a pair of
1769      a LM-type instruction that restores (amongst others) the
1770      return register %r14 and the stack pointer %r15, followed
1771      by a branch 'br %r14' --or equivalent-- that effects the
1772      actual return.
1773
1774      In that situation, this function needs to return 'true' in
1775      exactly one case: when pc points to that branch instruction.
1776
1777      Thus we try to disassemble the one instructions immediately
1778      preceding pc and check whether it is an LM-type instruction
1779      modifying the stack pointer.
1780
1781      Note that disassembling backwards is not reliable, so there
1782      is a slight chance of false positives here ...  */
1783
1784   bfd_byte insn[6];
1785   unsigned int r1, r3, b2;
1786   int d2;
1787
1788   if (word_size == 4
1789       && !target_read_memory (pc - 4, insn, 4)
1790       && is_rs (insn, op_lm, &r1, &r3, &d2, &b2)
1791       && r3 == S390_SP_REGNUM - S390_R0_REGNUM)
1792     return 1;
1793
1794   if (word_size == 4
1795       && !target_read_memory (pc - 6, insn, 6)
1796       && is_rsy (insn, op1_lmy, op2_lmy, &r1, &r3, &d2, &b2)
1797       && r3 == S390_SP_REGNUM - S390_R0_REGNUM)
1798     return 1;
1799
1800   if (word_size == 8
1801       && !target_read_memory (pc - 6, insn, 6)
1802       && is_rsy (insn, op1_lmg, op2_lmg, &r1, &r3, &d2, &b2)
1803       && r3 == S390_SP_REGNUM - S390_R0_REGNUM)
1804     return 1;
1805
1806   return 0;
1807 }
1808
1809 /* Displaced stepping.  */
1810
1811 /* Return true if INSN is a non-branch RIL-b or RIL-c format
1812    instruction.  */
1813
1814 static int
1815 is_non_branch_ril (gdb_byte *insn)
1816 {
1817   gdb_byte op1 = insn[0];
1818
1819   if (op1 == 0xc4)
1820     {
1821       gdb_byte op2 = insn[1] & 0x0f;
1822
1823       switch (op2)
1824         {
1825         case 0x02: /* llhrl */
1826         case 0x04: /* lghrl */
1827         case 0x05: /* lhrl */
1828         case 0x06: /* llghrl */
1829         case 0x07: /* sthrl */
1830         case 0x08: /* lgrl */
1831         case 0x0b: /* stgrl */
1832         case 0x0c: /* lgfrl */
1833         case 0x0d: /* lrl */
1834         case 0x0e: /* llgfrl */
1835         case 0x0f: /* strl */
1836           return 1;
1837         }
1838     }
1839   else if (op1 == 0xc6)
1840     {
1841       gdb_byte op2 = insn[1] & 0x0f;
1842
1843       switch (op2)
1844         {
1845         case 0x00: /* exrl */
1846         case 0x02: /* pfdrl */
1847         case 0x04: /* cghrl */
1848         case 0x05: /* chrl */
1849         case 0x06: /* clghrl */
1850         case 0x07: /* clhrl */
1851         case 0x08: /* cgrl */
1852         case 0x0a: /* clgrl */
1853         case 0x0c: /* cgfrl */
1854         case 0x0d: /* crl */
1855         case 0x0e: /* clgfrl */
1856         case 0x0f: /* clrl */
1857           return 1;
1858         }
1859     }
1860
1861   return 0;
1862 }
1863
1864 /* Implementation of gdbarch_displaced_step_copy_insn.  */
1865
1866 static struct displaced_step_closure *
1867 s390_displaced_step_copy_insn (struct gdbarch *gdbarch,
1868                                CORE_ADDR from, CORE_ADDR to,
1869                                struct regcache *regs)
1870 {
1871   size_t len = gdbarch_max_insn_length (gdbarch);
1872   gdb_byte *buf = (gdb_byte *) xmalloc (len);
1873   struct cleanup *old_chain = make_cleanup (xfree, buf);
1874
1875   read_memory (from, buf, len);
1876
1877   /* Adjust the displacement field of PC-relative RIL instructions,
1878      except branches.  The latter are handled in the fixup hook.  */
1879   if (is_non_branch_ril (buf))
1880     {
1881       LONGEST offset;
1882
1883       offset = extract_signed_integer (buf + 2, 4, BFD_ENDIAN_BIG);
1884       offset = (from - to + offset * 2) / 2;
1885
1886       /* If the instruction is too far from the jump pad, punt.  This
1887          will usually happen with instructions in shared libraries.
1888          We could probably support these by rewriting them to be
1889          absolute or fully emulating them.  */
1890       if (offset < INT32_MIN || offset > INT32_MAX)
1891         {
1892           /* Let the core fall back to stepping over the breakpoint
1893              in-line.  */
1894           if (debug_displaced)
1895             {
1896               fprintf_unfiltered (gdb_stdlog,
1897                                   "displaced: can't displaced step "
1898                                   "RIL instruction: offset %s out of range\n",
1899                                   plongest (offset));
1900             }
1901           do_cleanups (old_chain);
1902           return NULL;
1903         }
1904
1905       store_signed_integer (buf + 2, 4, BFD_ENDIAN_BIG, offset);
1906     }
1907
1908   write_memory (to, buf, len);
1909
1910   if (debug_displaced)
1911     {
1912       fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
1913                           paddress (gdbarch, from), paddress (gdbarch, to));
1914       displaced_step_dump_bytes (gdb_stdlog, buf, len);
1915     }
1916
1917   discard_cleanups (old_chain);
1918   return (struct displaced_step_closure *) buf;
1919 }
1920
1921 /* Fix up the state of registers and memory after having single-stepped
1922    a displaced instruction.  */
1923 static void
1924 s390_displaced_step_fixup (struct gdbarch *gdbarch,
1925                            struct displaced_step_closure *closure,
1926                            CORE_ADDR from, CORE_ADDR to,
1927                            struct regcache *regs)
1928 {
1929   /* Our closure is a copy of the instruction.  */
1930   gdb_byte *insn = (gdb_byte *) closure;
1931   static int s390_instrlen[] = { 2, 4, 4, 6 };
1932   int insnlen = s390_instrlen[insn[0] >> 6];
1933
1934   /* Fields for various kinds of instructions.  */
1935   unsigned int b2, r1, r2, x2, r3;
1936   int i2, d2;
1937
1938   /* Get current PC and addressing mode bit.  */
1939   CORE_ADDR pc = regcache_read_pc (regs);
1940   ULONGEST amode = 0;
1941
1942   if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
1943     {
1944       regcache_cooked_read_unsigned (regs, S390_PSWA_REGNUM, &amode);
1945       amode &= 0x80000000;
1946     }
1947
1948   if (debug_displaced)
1949     fprintf_unfiltered (gdb_stdlog,
1950                         "displaced: (s390) fixup (%s, %s) pc %s len %d amode 0x%x\n",
1951                         paddress (gdbarch, from), paddress (gdbarch, to),
1952                         paddress (gdbarch, pc), insnlen, (int) amode);
1953
1954   /* Handle absolute branch and save instructions.  */
1955   if (is_rr (insn, op_basr, &r1, &r2)
1956       || is_rx (insn, op_bas, &r1, &d2, &x2, &b2))
1957     {
1958       /* Recompute saved return address in R1.  */
1959       regcache_cooked_write_unsigned (regs, S390_R0_REGNUM + r1,
1960                                       amode | (from + insnlen));
1961     }
1962
1963   /* Handle absolute branch instructions.  */
1964   else if (is_rr (insn, op_bcr, &r1, &r2)
1965            || is_rx (insn, op_bc, &r1, &d2, &x2, &b2)
1966            || is_rr (insn, op_bctr, &r1, &r2)
1967            || is_rre (insn, op_bctgr, &r1, &r2)
1968            || is_rx (insn, op_bct, &r1, &d2, &x2, &b2)
1969            || is_rxy (insn, op1_bctg, op2_brctg, &r1, &d2, &x2, &b2)
1970            || is_rs (insn, op_bxh, &r1, &r3, &d2, &b2)
1971            || is_rsy (insn, op1_bxhg, op2_bxhg, &r1, &r3, &d2, &b2)
1972            || is_rs (insn, op_bxle, &r1, &r3, &d2, &b2)
1973            || is_rsy (insn, op1_bxleg, op2_bxleg, &r1, &r3, &d2, &b2))
1974     {
1975       /* Update PC iff branch was *not* taken.  */
1976       if (pc == to + insnlen)
1977         regcache_write_pc (regs, from + insnlen);
1978     }
1979
1980   /* Handle PC-relative branch and save instructions.  */
1981   else if (is_ri (insn, op1_bras, op2_bras, &r1, &i2)
1982            || is_ril (insn, op1_brasl, op2_brasl, &r1, &i2))
1983     {
1984       /* Update PC.  */
1985       regcache_write_pc (regs, pc - to + from);
1986       /* Recompute saved return address in R1.  */
1987       regcache_cooked_write_unsigned (regs, S390_R0_REGNUM + r1,
1988                                       amode | (from + insnlen));
1989     }
1990
1991   /* Handle LOAD ADDRESS RELATIVE LONG.  */
1992   else if (is_ril (insn, op1_larl, op2_larl, &r1, &i2))
1993     {
1994       /* Update PC.  */
1995       regcache_write_pc (regs, from + insnlen);
1996       /* Recompute output address in R1.  */
1997       regcache_cooked_write_unsigned (regs, S390_R0_REGNUM + r1,
1998                                       amode | (from + i2 * 2));
1999     }
2000
2001   /* If we executed a breakpoint instruction, point PC right back at it.  */
2002   else if (insn[0] == 0x0 && insn[1] == 0x1)
2003     regcache_write_pc (regs, from);
2004
2005   /* For any other insn, adjust PC by negated displacement.  PC then
2006      points right after the original instruction, except for PC-relative
2007      branches, where it points to the adjusted branch target.  */
2008   else
2009     regcache_write_pc (regs, pc - to + from);
2010
2011   if (debug_displaced)
2012     fprintf_unfiltered (gdb_stdlog,
2013                         "displaced: (s390) pc is now %s\n",
2014                         paddress (gdbarch, regcache_read_pc (regs)));
2015 }
2016
2017
2018 /* Helper routine to unwind pseudo registers.  */
2019
2020 static struct value *
2021 s390_unwind_pseudo_register (struct frame_info *this_frame, int regnum)
2022 {
2023   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2024   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2025   struct type *type = register_type (gdbarch, regnum);
2026
2027   /* Unwind PC via PSW address.  */
2028   if (regnum == tdep->pc_regnum)
2029     {
2030       struct value *val;
2031
2032       val = frame_unwind_register_value (this_frame, S390_PSWA_REGNUM);
2033       if (!value_optimized_out (val))
2034         {
2035           LONGEST pswa = value_as_long (val);
2036
2037           if (TYPE_LENGTH (type) == 4)
2038             return value_from_pointer (type, pswa & 0x7fffffff);
2039           else
2040             return value_from_pointer (type, pswa);
2041         }
2042     }
2043
2044   /* Unwind CC via PSW mask.  */
2045   if (regnum == tdep->cc_regnum)
2046     {
2047       struct value *val;
2048
2049       val = frame_unwind_register_value (this_frame, S390_PSWM_REGNUM);
2050       if (!value_optimized_out (val))
2051         {
2052           LONGEST pswm = value_as_long (val);
2053
2054           if (TYPE_LENGTH (type) == 4)
2055             return value_from_longest (type, (pswm >> 12) & 3);
2056           else
2057             return value_from_longest (type, (pswm >> 44) & 3);
2058         }
2059     }
2060
2061   /* Unwind full GPRs to show at least the lower halves (as the
2062      upper halves are undefined).  */
2063   if (regnum_is_gpr_full (tdep, regnum))
2064     {
2065       int reg = regnum - tdep->gpr_full_regnum;
2066       struct value *val;
2067
2068       val = frame_unwind_register_value (this_frame, S390_R0_REGNUM + reg);
2069       if (!value_optimized_out (val))
2070         return value_cast (type, val);
2071     }
2072
2073   return allocate_optimized_out_value (type);
2074 }
2075
2076 static struct value *
2077 s390_trad_frame_prev_register (struct frame_info *this_frame,
2078                                struct trad_frame_saved_reg saved_regs[],
2079                                int regnum)
2080 {
2081   if (regnum < S390_NUM_REGS)
2082     return trad_frame_get_prev_register (this_frame, saved_regs, regnum);
2083   else
2084     return s390_unwind_pseudo_register (this_frame, regnum);
2085 }
2086
2087
2088 /* Normal stack frames.  */
2089
2090 struct s390_unwind_cache {
2091
2092   CORE_ADDR func;
2093   CORE_ADDR frame_base;
2094   CORE_ADDR local_base;
2095
2096   struct trad_frame_saved_reg *saved_regs;
2097 };
2098
2099 static int
2100 s390_prologue_frame_unwind_cache (struct frame_info *this_frame,
2101                                   struct s390_unwind_cache *info)
2102 {
2103   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2104   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2105   struct s390_prologue_data data;
2106   pv_t *fp = &data.gpr[S390_FRAME_REGNUM - S390_R0_REGNUM];
2107   pv_t *sp = &data.gpr[S390_SP_REGNUM - S390_R0_REGNUM];
2108   int i;
2109   CORE_ADDR cfa;
2110   CORE_ADDR func;
2111   CORE_ADDR result;
2112   ULONGEST reg;
2113   CORE_ADDR prev_sp;
2114   int frame_pointer;
2115   int size;
2116   struct frame_info *next_frame;
2117
2118   /* Try to find the function start address.  If we can't find it, we don't
2119      bother searching for it -- with modern compilers this would be mostly
2120      pointless anyway.  Trust that we'll either have valid DWARF-2 CFI data
2121      or else a valid backchain ...  */
2122   if (!get_frame_func_if_available (this_frame, &info->func))
2123     {
2124       info->func = -1;
2125       return 0;
2126     }
2127   func = info->func;
2128
2129   /* Try to analyze the prologue.  */
2130   result = s390_analyze_prologue (gdbarch, func,
2131                                   get_frame_pc (this_frame), &data);
2132   if (!result)
2133     return 0;
2134
2135   /* If this was successful, we should have found the instruction that
2136      sets the stack pointer register to the previous value of the stack
2137      pointer minus the frame size.  */
2138   if (!pv_is_register (*sp, S390_SP_REGNUM))
2139     return 0;
2140
2141   /* A frame size of zero at this point can mean either a real
2142      frameless function, or else a failure to find the prologue.
2143      Perform some sanity checks to verify we really have a
2144      frameless function.  */
2145   if (sp->k == 0)
2146     {
2147       /* If the next frame is a NORMAL_FRAME, this frame *cannot* have frame
2148          size zero.  This is only possible if the next frame is a sentinel
2149          frame, a dummy frame, or a signal trampoline frame.  */
2150       /* FIXME: cagney/2004-05-01: This sanity check shouldn't be
2151          needed, instead the code should simpliy rely on its
2152          analysis.  */
2153       next_frame = get_next_frame (this_frame);
2154       while (next_frame && get_frame_type (next_frame) == INLINE_FRAME)
2155         next_frame = get_next_frame (next_frame);
2156       if (next_frame
2157           && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2158         return 0;
2159
2160       /* If we really have a frameless function, %r14 must be valid
2161          -- in particular, it must point to a different function.  */
2162       reg = get_frame_register_unsigned (this_frame, S390_RETADDR_REGNUM);
2163       reg = gdbarch_addr_bits_remove (gdbarch, reg) - 1;
2164       if (get_pc_function_start (reg) == func)
2165         {
2166           /* However, there is one case where it *is* valid for %r14
2167              to point to the same function -- if this is a recursive
2168              call, and we have stopped in the prologue *before* the
2169              stack frame was allocated.
2170
2171              Recognize this case by looking ahead a bit ...  */
2172
2173           struct s390_prologue_data data2;
2174           pv_t *sp = &data2.gpr[S390_SP_REGNUM - S390_R0_REGNUM];
2175
2176           if (!(s390_analyze_prologue (gdbarch, func, (CORE_ADDR)-1, &data2)
2177                 && pv_is_register (*sp, S390_SP_REGNUM)
2178                 && sp->k != 0))
2179             return 0;
2180         }
2181     }
2182
2183
2184   /* OK, we've found valid prologue data.  */
2185   size = -sp->k;
2186
2187   /* If the frame pointer originally also holds the same value
2188      as the stack pointer, we're probably using it.  If it holds
2189      some other value -- even a constant offset -- it is most
2190      likely used as temp register.  */
2191   if (pv_is_identical (*sp, *fp))
2192     frame_pointer = S390_FRAME_REGNUM;
2193   else
2194     frame_pointer = S390_SP_REGNUM;
2195
2196   /* If we've detected a function with stack frame, we'll still have to
2197      treat it as frameless if we're currently within the function epilog
2198      code at a point where the frame pointer has already been restored.
2199      This can only happen in an innermost frame.  */
2200   /* FIXME: cagney/2004-05-01: This sanity check shouldn't be needed,
2201      instead the code should simpliy rely on its analysis.  */
2202   next_frame = get_next_frame (this_frame);
2203   while (next_frame && get_frame_type (next_frame) == INLINE_FRAME)
2204     next_frame = get_next_frame (next_frame);
2205   if (size > 0
2206       && (next_frame == NULL
2207           || get_frame_type (get_next_frame (this_frame)) != NORMAL_FRAME))
2208     {
2209       /* See the comment in s390_stack_frame_destroyed_p on why this is
2210          not completely reliable ...  */
2211       if (s390_stack_frame_destroyed_p (gdbarch, get_frame_pc (this_frame)))
2212         {
2213           memset (&data, 0, sizeof (data));
2214           size = 0;
2215           frame_pointer = S390_SP_REGNUM;
2216         }
2217     }
2218
2219   /* Once we know the frame register and the frame size, we can unwind
2220      the current value of the frame register from the next frame, and
2221      add back the frame size to arrive that the previous frame's
2222      stack pointer value.  */
2223   prev_sp = get_frame_register_unsigned (this_frame, frame_pointer) + size;
2224   cfa = prev_sp + 16*word_size + 32;
2225
2226   /* Set up ABI call-saved/call-clobbered registers.  */
2227   for (i = 0; i < S390_NUM_REGS; i++)
2228     if (!s390_register_call_saved (gdbarch, i))
2229       trad_frame_set_unknown (info->saved_regs, i);
2230
2231   /* CC is always call-clobbered.  */
2232   trad_frame_set_unknown (info->saved_regs, S390_PSWM_REGNUM);
2233
2234   /* Record the addresses of all register spill slots the prologue parser
2235      has recognized.  Consider only registers defined as call-saved by the
2236      ABI; for call-clobbered registers the parser may have recognized
2237      spurious stores.  */
2238
2239   for (i = 0; i < 16; i++)
2240     if (s390_register_call_saved (gdbarch, S390_R0_REGNUM + i)
2241         && data.gpr_slot[i] != 0)
2242       info->saved_regs[S390_R0_REGNUM + i].addr = cfa - data.gpr_slot[i];
2243
2244   for (i = 0; i < 16; i++)
2245     if (s390_register_call_saved (gdbarch, S390_F0_REGNUM + i)
2246         && data.fpr_slot[i] != 0)
2247       info->saved_regs[S390_F0_REGNUM + i].addr = cfa - data.fpr_slot[i];
2248
2249   /* Function return will set PC to %r14.  */
2250   info->saved_regs[S390_PSWA_REGNUM] = info->saved_regs[S390_RETADDR_REGNUM];
2251
2252   /* In frameless functions, we unwind simply by moving the return
2253      address to the PC.  However, if we actually stored to the
2254      save area, use that -- we might only think the function frameless
2255      because we're in the middle of the prologue ...  */
2256   if (size == 0
2257       && !trad_frame_addr_p (info->saved_regs, S390_PSWA_REGNUM))
2258     {
2259       info->saved_regs[S390_PSWA_REGNUM].realreg = S390_RETADDR_REGNUM;
2260     }
2261
2262   /* Another sanity check: unless this is a frameless function,
2263      we should have found spill slots for SP and PC.
2264      If not, we cannot unwind further -- this happens e.g. in
2265      libc's thread_start routine.  */
2266   if (size > 0)
2267     {
2268       if (!trad_frame_addr_p (info->saved_regs, S390_SP_REGNUM)
2269           || !trad_frame_addr_p (info->saved_regs, S390_PSWA_REGNUM))
2270         prev_sp = -1;
2271     }
2272
2273   /* We use the current value of the frame register as local_base,
2274      and the top of the register save area as frame_base.  */
2275   if (prev_sp != -1)
2276     {
2277       info->frame_base = prev_sp + 16*word_size + 32;
2278       info->local_base = prev_sp - size;
2279     }
2280
2281   return 1;
2282 }
2283
2284 static void
2285 s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
2286                                    struct s390_unwind_cache *info)
2287 {
2288   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2289   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2290   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2291   CORE_ADDR backchain;
2292   ULONGEST reg;
2293   LONGEST sp, tmp;
2294   int i;
2295
2296   /* Set up ABI call-saved/call-clobbered registers.  */
2297   for (i = 0; i < S390_NUM_REGS; i++)
2298     if (!s390_register_call_saved (gdbarch, i))
2299       trad_frame_set_unknown (info->saved_regs, i);
2300
2301   /* CC is always call-clobbered.  */
2302   trad_frame_set_unknown (info->saved_regs, S390_PSWM_REGNUM);
2303
2304   /* Get the backchain.  */
2305   reg = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
2306   if (!safe_read_memory_integer (reg, word_size, byte_order, &tmp))
2307     tmp = 0;
2308   backchain = (CORE_ADDR) tmp;
2309
2310   /* A zero backchain terminates the frame chain.  As additional
2311      sanity check, let's verify that the spill slot for SP in the
2312      save area pointed to by the backchain in fact links back to
2313      the save area.  */
2314   if (backchain != 0
2315       && safe_read_memory_integer (backchain + 15*word_size,
2316                                    word_size, byte_order, &sp)
2317       && (CORE_ADDR)sp == backchain)
2318     {
2319       /* We don't know which registers were saved, but it will have
2320          to be at least %r14 and %r15.  This will allow us to continue
2321          unwinding, but other prev-frame registers may be incorrect ...  */
2322       info->saved_regs[S390_SP_REGNUM].addr = backchain + 15*word_size;
2323       info->saved_regs[S390_RETADDR_REGNUM].addr = backchain + 14*word_size;
2324
2325       /* Function return will set PC to %r14.  */
2326       info->saved_regs[S390_PSWA_REGNUM]
2327         = info->saved_regs[S390_RETADDR_REGNUM];
2328
2329       /* We use the current value of the frame register as local_base,
2330          and the top of the register save area as frame_base.  */
2331       info->frame_base = backchain + 16*word_size + 32;
2332       info->local_base = reg;
2333     }
2334
2335   info->func = get_frame_pc (this_frame);
2336 }
2337
2338 static struct s390_unwind_cache *
2339 s390_frame_unwind_cache (struct frame_info *this_frame,
2340                          void **this_prologue_cache)
2341 {
2342   struct s390_unwind_cache *info;
2343
2344   if (*this_prologue_cache)
2345     return (struct s390_unwind_cache *) *this_prologue_cache;
2346
2347   info = FRAME_OBSTACK_ZALLOC (struct s390_unwind_cache);
2348   *this_prologue_cache = info;
2349   info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2350   info->func = -1;
2351   info->frame_base = -1;
2352   info->local_base = -1;
2353
2354   TRY
2355     {
2356       /* Try to use prologue analysis to fill the unwind cache.
2357          If this fails, fall back to reading the stack backchain.  */
2358       if (!s390_prologue_frame_unwind_cache (this_frame, info))
2359         s390_backchain_frame_unwind_cache (this_frame, info);
2360     }
2361   CATCH (ex, RETURN_MASK_ERROR)
2362     {
2363       if (ex.error != NOT_AVAILABLE_ERROR)
2364         throw_exception (ex);
2365     }
2366   END_CATCH
2367
2368   return info;
2369 }
2370
2371 static void
2372 s390_frame_this_id (struct frame_info *this_frame,
2373                     void **this_prologue_cache,
2374                     struct frame_id *this_id)
2375 {
2376   struct s390_unwind_cache *info
2377     = s390_frame_unwind_cache (this_frame, this_prologue_cache);
2378
2379   if (info->frame_base == -1)
2380     {
2381       if (info->func != -1)
2382         *this_id = frame_id_build_unavailable_stack (info->func);
2383       return;
2384     }
2385
2386   *this_id = frame_id_build (info->frame_base, info->func);
2387 }
2388
2389 static struct value *
2390 s390_frame_prev_register (struct frame_info *this_frame,
2391                           void **this_prologue_cache, int regnum)
2392 {
2393   struct s390_unwind_cache *info
2394     = s390_frame_unwind_cache (this_frame, this_prologue_cache);
2395
2396   return s390_trad_frame_prev_register (this_frame, info->saved_regs, regnum);
2397 }
2398
2399 static const struct frame_unwind s390_frame_unwind = {
2400   NORMAL_FRAME,
2401   default_frame_unwind_stop_reason,
2402   s390_frame_this_id,
2403   s390_frame_prev_register,
2404   NULL,
2405   default_frame_sniffer
2406 };
2407
2408
2409 /* Code stubs and their stack frames.  For things like PLTs and NULL
2410    function calls (where there is no true frame and the return address
2411    is in the RETADDR register).  */
2412
2413 struct s390_stub_unwind_cache
2414 {
2415   CORE_ADDR frame_base;
2416   struct trad_frame_saved_reg *saved_regs;
2417 };
2418
2419 static struct s390_stub_unwind_cache *
2420 s390_stub_frame_unwind_cache (struct frame_info *this_frame,
2421                               void **this_prologue_cache)
2422 {
2423   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2424   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2425   struct s390_stub_unwind_cache *info;
2426   ULONGEST reg;
2427
2428   if (*this_prologue_cache)
2429     return (struct s390_stub_unwind_cache *) *this_prologue_cache;
2430
2431   info = FRAME_OBSTACK_ZALLOC (struct s390_stub_unwind_cache);
2432   *this_prologue_cache = info;
2433   info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2434
2435   /* The return address is in register %r14.  */
2436   info->saved_regs[S390_PSWA_REGNUM].realreg = S390_RETADDR_REGNUM;
2437
2438   /* Retrieve stack pointer and determine our frame base.  */
2439   reg = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
2440   info->frame_base = reg + 16*word_size + 32;
2441
2442   return info;
2443 }
2444
2445 static void
2446 s390_stub_frame_this_id (struct frame_info *this_frame,
2447                          void **this_prologue_cache,
2448                          struct frame_id *this_id)
2449 {
2450   struct s390_stub_unwind_cache *info
2451     = s390_stub_frame_unwind_cache (this_frame, this_prologue_cache);
2452   *this_id = frame_id_build (info->frame_base, get_frame_pc (this_frame));
2453 }
2454
2455 static struct value *
2456 s390_stub_frame_prev_register (struct frame_info *this_frame,
2457                                void **this_prologue_cache, int regnum)
2458 {
2459   struct s390_stub_unwind_cache *info
2460     = s390_stub_frame_unwind_cache (this_frame, this_prologue_cache);
2461   return s390_trad_frame_prev_register (this_frame, info->saved_regs, regnum);
2462 }
2463
2464 static int
2465 s390_stub_frame_sniffer (const struct frame_unwind *self,
2466                          struct frame_info *this_frame,
2467                          void **this_prologue_cache)
2468 {
2469   CORE_ADDR addr_in_block;
2470   bfd_byte insn[S390_MAX_INSTR_SIZE];
2471
2472   /* If the current PC points to non-readable memory, we assume we
2473      have trapped due to an invalid function pointer call.  We handle
2474      the non-existing current function like a PLT stub.  */
2475   addr_in_block = get_frame_address_in_block (this_frame);
2476   if (in_plt_section (addr_in_block)
2477       || s390_readinstruction (insn, get_frame_pc (this_frame)) < 0)
2478     return 1;
2479   return 0;
2480 }
2481
2482 static const struct frame_unwind s390_stub_frame_unwind = {
2483   NORMAL_FRAME,
2484   default_frame_unwind_stop_reason,
2485   s390_stub_frame_this_id,
2486   s390_stub_frame_prev_register,
2487   NULL,
2488   s390_stub_frame_sniffer
2489 };
2490
2491
2492 /* Signal trampoline stack frames.  */
2493
2494 struct s390_sigtramp_unwind_cache {
2495   CORE_ADDR frame_base;
2496   struct trad_frame_saved_reg *saved_regs;
2497 };
2498
2499 static struct s390_sigtramp_unwind_cache *
2500 s390_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
2501                                   void **this_prologue_cache)
2502 {
2503   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2504   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2505   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2506   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2507   struct s390_sigtramp_unwind_cache *info;
2508   ULONGEST this_sp, prev_sp;
2509   CORE_ADDR next_ra, next_cfa, sigreg_ptr, sigreg_high_off;
2510   int i;
2511
2512   if (*this_prologue_cache)
2513     return (struct s390_sigtramp_unwind_cache *) *this_prologue_cache;
2514
2515   info = FRAME_OBSTACK_ZALLOC (struct s390_sigtramp_unwind_cache);
2516   *this_prologue_cache = info;
2517   info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2518
2519   this_sp = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
2520   next_ra = get_frame_pc (this_frame);
2521   next_cfa = this_sp + 16*word_size + 32;
2522
2523   /* New-style RT frame:
2524         retcode + alignment (8 bytes)
2525         siginfo (128 bytes)
2526         ucontext (contains sigregs at offset 5 words).  */
2527   if (next_ra == next_cfa)
2528     {
2529       sigreg_ptr = next_cfa + 8 + 128 + align_up (5*word_size, 8);
2530       /* sigregs are followed by uc_sigmask (8 bytes), then by the
2531          upper GPR halves if present.  */
2532       sigreg_high_off = 8;
2533     }
2534
2535   /* Old-style RT frame and all non-RT frames:
2536         old signal mask (8 bytes)
2537         pointer to sigregs.  */
2538   else
2539     {
2540       sigreg_ptr = read_memory_unsigned_integer (next_cfa + 8,
2541                                                  word_size, byte_order);
2542       /* sigregs are followed by signo (4 bytes), then by the
2543          upper GPR halves if present.  */
2544       sigreg_high_off = 4;
2545     }
2546
2547   /* The sigregs structure looks like this:
2548             long   psw_mask;
2549             long   psw_addr;
2550             long   gprs[16];
2551             int    acrs[16];
2552             int    fpc;
2553             int    __pad;
2554             double fprs[16];  */
2555
2556   /* PSW mask and address.  */
2557   info->saved_regs[S390_PSWM_REGNUM].addr = sigreg_ptr;
2558   sigreg_ptr += word_size;
2559   info->saved_regs[S390_PSWA_REGNUM].addr = sigreg_ptr;
2560   sigreg_ptr += word_size;
2561
2562   /* Then the GPRs.  */
2563   for (i = 0; i < 16; i++)
2564     {
2565       info->saved_regs[S390_R0_REGNUM + i].addr = sigreg_ptr;
2566       sigreg_ptr += word_size;
2567     }
2568
2569   /* Then the ACRs.  */
2570   for (i = 0; i < 16; i++)
2571     {
2572       info->saved_regs[S390_A0_REGNUM + i].addr = sigreg_ptr;
2573       sigreg_ptr += 4;
2574     }
2575
2576   /* The floating-point control word.  */
2577   info->saved_regs[S390_FPC_REGNUM].addr = sigreg_ptr;
2578   sigreg_ptr += 8;
2579
2580   /* And finally the FPRs.  */
2581   for (i = 0; i < 16; i++)
2582     {
2583       info->saved_regs[S390_F0_REGNUM + i].addr = sigreg_ptr;
2584       sigreg_ptr += 8;
2585     }
2586
2587   /* If we have them, the GPR upper halves are appended at the end.  */
2588   sigreg_ptr += sigreg_high_off;
2589   if (tdep->gpr_full_regnum != -1)
2590     for (i = 0; i < 16; i++)
2591       {
2592         info->saved_regs[S390_R0_UPPER_REGNUM + i].addr = sigreg_ptr;
2593         sigreg_ptr += 4;
2594       }
2595
2596   /* Restore the previous frame's SP.  */
2597   prev_sp = read_memory_unsigned_integer (
2598                         info->saved_regs[S390_SP_REGNUM].addr,
2599                         word_size, byte_order);
2600
2601   /* Determine our frame base.  */
2602   info->frame_base = prev_sp + 16*word_size + 32;
2603
2604   return info;
2605 }
2606
2607 static void
2608 s390_sigtramp_frame_this_id (struct frame_info *this_frame,
2609                              void **this_prologue_cache,
2610                              struct frame_id *this_id)
2611 {
2612   struct s390_sigtramp_unwind_cache *info
2613     = s390_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache);
2614   *this_id = frame_id_build (info->frame_base, get_frame_pc (this_frame));
2615 }
2616
2617 static struct value *
2618 s390_sigtramp_frame_prev_register (struct frame_info *this_frame,
2619                                    void **this_prologue_cache, int regnum)
2620 {
2621   struct s390_sigtramp_unwind_cache *info
2622     = s390_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache);
2623   return s390_trad_frame_prev_register (this_frame, info->saved_regs, regnum);
2624 }
2625
2626 static int
2627 s390_sigtramp_frame_sniffer (const struct frame_unwind *self,
2628                              struct frame_info *this_frame,
2629                              void **this_prologue_cache)
2630 {
2631   CORE_ADDR pc = get_frame_pc (this_frame);
2632   bfd_byte sigreturn[2];
2633
2634   if (target_read_memory (pc, sigreturn, 2))
2635     return 0;
2636
2637   if (sigreturn[0] != op_svc)
2638     return 0;
2639
2640   if (sigreturn[1] != 119 /* sigreturn */
2641       && sigreturn[1] != 173 /* rt_sigreturn */)
2642     return 0;
2643
2644   return 1;
2645 }
2646
2647 static const struct frame_unwind s390_sigtramp_frame_unwind = {
2648   SIGTRAMP_FRAME,
2649   default_frame_unwind_stop_reason,
2650   s390_sigtramp_frame_this_id,
2651   s390_sigtramp_frame_prev_register,
2652   NULL,
2653   s390_sigtramp_frame_sniffer
2654 };
2655
2656 /* Retrieve the syscall number at a ptrace syscall-stop.  Return -1
2657    upon error. */
2658
2659 static LONGEST
2660 s390_linux_get_syscall_number (struct gdbarch *gdbarch,
2661                                ptid_t ptid)
2662 {
2663   struct regcache *regs = get_thread_regcache (ptid);
2664   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2665   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2666   ULONGEST pc;
2667   ULONGEST svc_number = -1;
2668   unsigned opcode;
2669
2670   /* Assume that the PC points after the 2-byte SVC instruction.  We
2671      don't currently support SVC via EXECUTE. */
2672   regcache_cooked_read_unsigned (regs, tdep->pc_regnum, &pc);
2673   pc -= 2;
2674   opcode = read_memory_unsigned_integer ((CORE_ADDR) pc, 1, byte_order);
2675   if (opcode != op_svc)
2676     return -1;
2677
2678   svc_number = read_memory_unsigned_integer ((CORE_ADDR) pc + 1, 1,
2679                                              byte_order);
2680   if (svc_number == 0)
2681     regcache_cooked_read_unsigned (regs, S390_R1_REGNUM, &svc_number);
2682
2683   return svc_number;
2684 }
2685
2686 /* Process record-replay */
2687
2688 static struct linux_record_tdep s390_linux_record_tdep;
2689 static struct linux_record_tdep s390x_linux_record_tdep;
2690
2691 /* Record all registers but PC register for process-record.  */
2692
2693 static int
2694 s390_all_but_pc_registers_record (struct regcache *regcache)
2695 {
2696   struct gdbarch *gdbarch = get_regcache_arch (regcache);
2697   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2698   int i;
2699
2700   for (i = 0; i < 16; i++)
2701     {
2702       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
2703         return -1;
2704       if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + i))
2705         return -1;
2706       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + i))
2707         return -1;
2708       if (tdep->gpr_full_regnum != -1)
2709         if (record_full_arch_list_add_reg (regcache, S390_R0_UPPER_REGNUM + i))
2710           return -1;
2711       if (tdep->v0_full_regnum != -1)
2712         {
2713           if (record_full_arch_list_add_reg (regcache, S390_V0_LOWER_REGNUM + i))
2714             return -1;
2715           if (record_full_arch_list_add_reg (regcache, S390_V16_REGNUM + i))
2716             return -1;
2717         }
2718     }
2719   if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
2720     return -1;
2721   if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
2722     return -1;
2723
2724   return 0;
2725 }
2726
2727 static enum gdb_syscall
2728 s390_canonicalize_syscall (int syscall, enum s390_abi_kind abi)
2729 {
2730   switch (syscall)
2731     {
2732     /* s390 syscall numbers < 222 are mostly the same as x86, so just list
2733        the exceptions.  */
2734     case 0:
2735       return gdb_sys_no_syscall;
2736     case 7:
2737       return gdb_sys_restart_syscall;
2738     /* These syscalls work only on 31-bit.  */
2739     case 13: /* time */
2740     case 16: /* lchown[16] */
2741     case 23: /* setuid[16] */
2742     case 24: /* getuid[16] */
2743     case 25: /* stime */
2744     case 46: /* setgid[16] */
2745     case 47: /* getgid[16] */
2746     case 49: /* seteuid[16] */
2747     case 50: /* getegid[16] */
2748     case 70: /* setreuid[16] */
2749     case 71: /* setregid[16] */
2750     case 76: /* [old_]getrlimit */
2751     case 80: /* getgroups[16] */
2752     case 81: /* setgroups[16] */
2753     case 95: /* fchown[16] */
2754     case 101: /* ioperm */
2755     case 138: /* setfsuid[16] */
2756     case 139: /* setfsgid[16] */
2757     case 140: /* _llseek */
2758     case 164: /* setresuid[16] */
2759     case 165: /* getresuid[16] */
2760     case 170: /* setresgid[16] */
2761     case 171: /* getresgid[16] */
2762     case 182: /* chown[16] */
2763     case 192: /* mmap2 */
2764     case 193: /* truncate64 */
2765     case 194: /* ftruncate64 */
2766     case 195: /* stat64 */
2767     case 196: /* lstat64 */
2768     case 197: /* fstat64 */
2769     case 221: /* fcntl64 */
2770       if (abi == ABI_LINUX_S390)
2771         return (enum gdb_syscall) syscall;
2772       return gdb_sys_no_syscall;
2773     /* These syscalls don't exist on s390.  */
2774     case 17: /* break */
2775     case 18: /* oldstat */
2776     case 28: /* oldfstat */
2777     case 31: /* stty */
2778     case 32: /* gtty */
2779     case 35: /* ftime */
2780     case 44: /* prof */
2781     case 53: /* lock */
2782     case 56: /* mpx */
2783     case 58: /* ulimit */
2784     case 59: /* oldolduname */
2785     case 68: /* sgetmask */
2786     case 69: /* ssetmask */
2787     case 82: /* [old_]select */
2788     case 84: /* oldlstat */
2789     case 98: /* profil */
2790     case 109: /* olduname */
2791     case 113: /* vm86old */
2792     case 123: /* modify_ldt */
2793     case 166: /* vm86 */
2794       return gdb_sys_no_syscall;
2795     case 110:
2796       return gdb_sys_lookup_dcookie;
2797     /* Here come the differences.  */
2798     case 222:
2799       return gdb_sys_readahead;
2800     case 223:
2801       if (abi == ABI_LINUX_S390)
2802         return gdb_sys_sendfile64;
2803       return gdb_sys_no_syscall;
2804     /* 224-235 handled below */
2805     case 236:
2806       return gdb_sys_gettid;
2807     case 237:
2808       return gdb_sys_tkill;
2809     case 238:
2810       return gdb_sys_futex;
2811     case 239:
2812       return gdb_sys_sched_setaffinity;
2813     case 240:
2814       return gdb_sys_sched_getaffinity;
2815     case 241:
2816       return gdb_sys_tgkill;
2817     /* 242 reserved */
2818     case 243:
2819       return gdb_sys_io_setup;
2820     case 244:
2821       return gdb_sys_io_destroy;
2822     case 245:
2823       return gdb_sys_io_getevents;
2824     case 246:
2825       return gdb_sys_io_submit;
2826     case 247:
2827       return gdb_sys_io_cancel;
2828     case 248:
2829       return gdb_sys_exit_group;
2830     case 249:
2831       return gdb_sys_epoll_create;
2832     case 250:
2833       return gdb_sys_epoll_ctl;
2834     case 251:
2835       return gdb_sys_epoll_wait;
2836     case 252:
2837       return gdb_sys_set_tid_address;
2838     case 253:
2839       return gdb_sys_fadvise64;
2840     /* 254-262 handled below */
2841     /* 263 reserved */
2842     case 264:
2843       if (abi == ABI_LINUX_S390)
2844         return gdb_sys_fadvise64_64;
2845       return gdb_sys_no_syscall;
2846     case 265:
2847       return gdb_sys_statfs64;
2848     case 266:
2849       return gdb_sys_fstatfs64;
2850     case 267:
2851       return gdb_sys_remap_file_pages;
2852     /* 268-270 reserved */
2853     /* 271-277 handled below */
2854     case 278:
2855       return gdb_sys_add_key;
2856     case 279:
2857       return gdb_sys_request_key;
2858     case 280:
2859       return gdb_sys_keyctl;
2860     case 281:
2861       return gdb_sys_waitid;
2862     /* 282-312 handled below */
2863     case 293:
2864       if (abi == ABI_LINUX_S390)
2865         return gdb_sys_fstatat64;
2866       return gdb_sys_newfstatat;
2867     /* 313+ not yet supported */
2868     default:
2869       {
2870         int ret;
2871
2872         /* Most "old" syscalls copied from i386.  */
2873         if (syscall <= 221)
2874           ret = syscall;
2875         /* xattr syscalls.  */
2876         else if (syscall >= 224 && syscall <= 235)
2877           ret = syscall + 2;
2878         /* timer syscalls.  */
2879         else if (syscall >= 254 && syscall <= 262)
2880           ret = syscall + 5;
2881         /* mq_* and kexec_load */
2882         else if (syscall >= 271 && syscall <= 277)
2883           ret = syscall + 6;
2884         /* ioprio_set .. epoll_pwait */
2885         else if (syscall >= 282 && syscall <= 312)
2886           ret = syscall + 7;
2887         else
2888           ret = gdb_sys_no_syscall;
2889
2890         return (enum gdb_syscall) ret;
2891       }
2892     }
2893 }
2894
2895 static int
2896 s390_linux_syscall_record (struct regcache *regcache, LONGEST syscall_native)
2897 {
2898   struct gdbarch *gdbarch = get_regcache_arch (regcache);
2899   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2900   int ret;
2901   enum gdb_syscall syscall_gdb;
2902
2903   /* On s390, syscall number can be passed either as immediate field of svc
2904      instruction, or in %r1 (with svc 0).  */
2905   if (syscall_native == 0)
2906     regcache_raw_read_signed (regcache, S390_R1_REGNUM, &syscall_native);
2907
2908   syscall_gdb = s390_canonicalize_syscall (syscall_native, tdep->abi);
2909
2910   if (syscall_gdb < 0)
2911     {
2912       printf_unfiltered (_("Process record and replay target doesn't "
2913                            "support syscall number %s\n"),
2914                          plongest (syscall_native));
2915       return -1;
2916     }
2917
2918   if (syscall_gdb == gdb_sys_sigreturn
2919       || syscall_gdb == gdb_sys_rt_sigreturn)
2920     {
2921       if (s390_all_but_pc_registers_record (regcache))
2922         return -1;
2923       return 0;
2924     }
2925
2926   if (tdep->abi == ABI_LINUX_ZSERIES)
2927     ret = record_linux_system_call (syscall_gdb, regcache,
2928                                     &s390x_linux_record_tdep);
2929   else
2930     ret = record_linux_system_call (syscall_gdb, regcache,
2931                                     &s390_linux_record_tdep);
2932
2933   if (ret)
2934     return ret;
2935
2936   /* Record the return value of the system call.  */
2937   if (record_full_arch_list_add_reg (regcache, S390_R2_REGNUM))
2938     return -1;
2939
2940   return 0;
2941 }
2942
2943 static int
2944 s390_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache,
2945                           enum gdb_signal signal)
2946 {
2947   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2948   /* There are two kinds of signal frames on s390. rt_sigframe is always
2949      the larger one, so don't even bother with sigframe.  */
2950   const int sizeof_rt_sigframe = (tdep->abi == ABI_LINUX_ZSERIES ?
2951                                   160 + 8 + 128 + 1024 : 96 + 8 + 128 + 1000);
2952   ULONGEST sp;
2953   int i;
2954
2955   for (i = 0; i < 16; i++)
2956     {
2957       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
2958         return -1;
2959       if (tdep->gpr_full_regnum != -1)
2960         if (record_full_arch_list_add_reg (regcache, S390_R0_UPPER_REGNUM + i))
2961           return -1;
2962     }
2963   if (record_full_arch_list_add_reg (regcache, S390_PSWA_REGNUM))
2964     return -1;
2965   if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
2966     return -1;
2967
2968   /* Record the change in the stack.
2969      frame-size = sizeof (struct rt_sigframe) + SIGNAL_FRAMESIZE  */
2970   regcache_raw_read_unsigned (regcache, S390_SP_REGNUM, &sp);
2971   sp -= sizeof_rt_sigframe;
2972
2973   if (record_full_arch_list_add_mem (sp, sizeof_rt_sigframe))
2974     return -1;
2975
2976   if (record_full_arch_list_add_end ())
2977     return -1;
2978
2979   return 0;
2980 }
2981
2982 /* Frame base handling.  */
2983
2984 static CORE_ADDR
2985 s390_frame_base_address (struct frame_info *this_frame, void **this_cache)
2986 {
2987   struct s390_unwind_cache *info
2988     = s390_frame_unwind_cache (this_frame, this_cache);
2989   return info->frame_base;
2990 }
2991
2992 static CORE_ADDR
2993 s390_local_base_address (struct frame_info *this_frame, void **this_cache)
2994 {
2995   struct s390_unwind_cache *info
2996     = s390_frame_unwind_cache (this_frame, this_cache);
2997   return info->local_base;
2998 }
2999
3000 static const struct frame_base s390_frame_base = {
3001   &s390_frame_unwind,
3002   s390_frame_base_address,
3003   s390_local_base_address,
3004   s390_local_base_address
3005 };
3006
3007 static CORE_ADDR
3008 s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
3009 {
3010   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3011   ULONGEST pc;
3012   pc = frame_unwind_register_unsigned (next_frame, tdep->pc_regnum);
3013   return gdbarch_addr_bits_remove (gdbarch, pc);
3014 }
3015
3016 static CORE_ADDR
3017 s390_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
3018 {
3019   ULONGEST sp;
3020   sp = frame_unwind_register_unsigned (next_frame, S390_SP_REGNUM);
3021   return gdbarch_addr_bits_remove (gdbarch, sp);
3022 }
3023
3024
3025 /* DWARF-2 frame support.  */
3026
3027 static struct value *
3028 s390_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
3029                            int regnum)
3030 {
3031   return s390_unwind_pseudo_register (this_frame, regnum);
3032 }
3033
3034 static void
3035 s390_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3036                             struct dwarf2_frame_state_reg *reg,
3037                             struct frame_info *this_frame)
3038 {
3039   /* The condition code (and thus PSW mask) is call-clobbered.  */
3040   if (regnum == S390_PSWM_REGNUM)
3041     reg->how = DWARF2_FRAME_REG_UNDEFINED;
3042
3043   /* The PSW address unwinds to the return address.  */
3044   else if (regnum == S390_PSWA_REGNUM)
3045     reg->how = DWARF2_FRAME_REG_RA;
3046
3047   /* Fixed registers are call-saved or call-clobbered
3048      depending on the ABI in use.  */
3049   else if (regnum < S390_NUM_REGS)
3050     {
3051       if (s390_register_call_saved (gdbarch, regnum))
3052         reg->how = DWARF2_FRAME_REG_SAME_VALUE;
3053       else
3054         reg->how = DWARF2_FRAME_REG_UNDEFINED;
3055     }
3056
3057   /* We install a special function to unwind pseudos.  */
3058   else
3059     {
3060       reg->how = DWARF2_FRAME_REG_FN;
3061       reg->loc.fn = s390_dwarf2_prev_register;
3062     }
3063 }
3064
3065
3066 /* Dummy function calls.  */
3067
3068 /* Unwrap any single-field structs in TYPE and return the effective
3069    "inner" type.  E.g., yield "float" for all these cases:
3070
3071      float x;
3072      struct { float x };
3073      struct { struct { float x; } x; };
3074      struct { struct { struct { float x; } x; } x; };
3075
3076    However, if an inner type is smaller than MIN_SIZE, abort the
3077    unwrapping.  */
3078
3079 static struct type *
3080 s390_effective_inner_type (struct type *type, unsigned int min_size)
3081 {
3082   while (TYPE_CODE (type) == TYPE_CODE_STRUCT
3083          && TYPE_NFIELDS (type) == 1)
3084     {
3085       struct type *inner = check_typedef (TYPE_FIELD_TYPE (type, 0));
3086
3087       if (TYPE_LENGTH (inner) < min_size)
3088         break;
3089       type = inner;
3090     }
3091
3092   return type;
3093 }
3094
3095 /* Return non-zero if TYPE should be passed like "float" or
3096    "double".  */
3097
3098 static int
3099 s390_function_arg_float (struct type *type)
3100 {
3101   /* Note that long double as well as complex types are intentionally
3102      excluded. */
3103   if (TYPE_LENGTH (type) > 8)
3104     return 0;
3105
3106   /* A struct containing just a float or double is passed like a float
3107      or double.  */
3108   type = s390_effective_inner_type (type, 0);
3109
3110   return (TYPE_CODE (type) == TYPE_CODE_FLT
3111           || TYPE_CODE (type) == TYPE_CODE_DECFLOAT);
3112 }
3113
3114 /* Return non-zero if TYPE should be passed like a vector.  */
3115
3116 static int
3117 s390_function_arg_vector (struct type *type)
3118 {
3119   if (TYPE_LENGTH (type) > 16)
3120     return 0;
3121
3122   /* Structs containing just a vector are passed like a vector.  */
3123   type = s390_effective_inner_type (type, TYPE_LENGTH (type));
3124
3125   return TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type);
3126 }
3127
3128 /* Determine whether N is a power of two.  */
3129
3130 static int
3131 is_power_of_two (unsigned int n)
3132 {
3133   return n && ((n & (n - 1)) == 0);
3134 }
3135
3136 /* For an argument whose type is TYPE and which is not passed like a
3137    float or vector, return non-zero if it should be passed like "int"
3138    or "long long".  */
3139
3140 static int
3141 s390_function_arg_integer (struct type *type)
3142 {
3143   enum type_code code = TYPE_CODE (type);
3144
3145   if (TYPE_LENGTH (type) > 8)
3146     return 0;
3147
3148   if (code == TYPE_CODE_INT
3149       || code == TYPE_CODE_ENUM
3150       || code == TYPE_CODE_RANGE
3151       || code == TYPE_CODE_CHAR
3152       || code == TYPE_CODE_BOOL
3153       || code == TYPE_CODE_PTR
3154       || TYPE_IS_REFERENCE (type))
3155     return 1;
3156
3157   return ((code == TYPE_CODE_UNION || code == TYPE_CODE_STRUCT)
3158           && is_power_of_two (TYPE_LENGTH (type)));
3159 }
3160
3161 /* Argument passing state: Internal data structure passed to helper
3162    routines of s390_push_dummy_call.  */
3163
3164 struct s390_arg_state
3165   {
3166     /* Register cache, or NULL, if we are in "preparation mode".  */
3167     struct regcache *regcache;
3168     /* Next available general/floating-point/vector register for
3169        argument passing.  */
3170     int gr, fr, vr;
3171     /* Current pointer to copy area (grows downwards).  */
3172     CORE_ADDR copy;
3173     /* Current pointer to parameter area (grows upwards).  */
3174     CORE_ADDR argp;
3175   };
3176
3177 /* Prepare one argument ARG for a dummy call and update the argument
3178    passing state AS accordingly.  If the regcache field in AS is set,
3179    operate in "write mode" and write ARG into the inferior.  Otherwise
3180    run "preparation mode" and skip all updates to the inferior.  */
3181
3182 static void
3183 s390_handle_arg (struct s390_arg_state *as, struct value *arg,
3184                  struct gdbarch_tdep *tdep, int word_size,
3185                  enum bfd_endian byte_order, int is_unnamed)
3186 {
3187   struct type *type = check_typedef (value_type (arg));
3188   unsigned int length = TYPE_LENGTH (type);
3189   int write_mode = as->regcache != NULL;
3190
3191   if (s390_function_arg_float (type))
3192     {
3193       /* The GNU/Linux for S/390 ABI uses FPRs 0 and 2 to pass
3194          arguments.  The GNU/Linux for zSeries ABI uses 0, 2, 4, and
3195          6.  */
3196       if (as->fr <= (tdep->abi == ABI_LINUX_S390 ? 2 : 6))
3197         {
3198           /* When we store a single-precision value in an FP register,
3199              it occupies the leftmost bits.  */
3200           if (write_mode)
3201             regcache_cooked_write_part (as->regcache,
3202                                         S390_F0_REGNUM + as->fr,
3203                                         0, length,
3204                                         value_contents (arg));
3205           as->fr += 2;
3206         }
3207       else
3208         {
3209           /* When we store a single-precision value in a stack slot,
3210              it occupies the rightmost bits.  */
3211           as->argp = align_up (as->argp + length, word_size);
3212           if (write_mode)
3213             write_memory (as->argp - length, value_contents (arg),
3214                           length);
3215         }
3216     }
3217   else if (tdep->vector_abi == S390_VECTOR_ABI_128
3218            && s390_function_arg_vector (type))
3219     {
3220       static const char use_vr[] = {24, 26, 28, 30, 25, 27, 29, 31};
3221
3222       if (!is_unnamed && as->vr < ARRAY_SIZE (use_vr))
3223         {
3224           int regnum = S390_V24_REGNUM + use_vr[as->vr] - 24;
3225
3226           if (write_mode)
3227             regcache_cooked_write_part (as->regcache, regnum,
3228                                         0, length,
3229                                         value_contents (arg));
3230           as->vr++;
3231         }
3232       else
3233         {
3234           if (write_mode)
3235             write_memory (as->argp, value_contents (arg), length);
3236           as->argp = align_up (as->argp + length, word_size);
3237         }
3238     }
3239   else if (s390_function_arg_integer (type) && length <= word_size)
3240     {
3241       /* Initialize it just to avoid a GCC false warning.  */
3242       ULONGEST val = 0;
3243
3244       if (write_mode)
3245         {
3246           /* Place value in least significant bits of the register or
3247              memory word and sign- or zero-extend to full word size.
3248              This also applies to a struct or union.  */
3249           val = TYPE_UNSIGNED (type)
3250             ? extract_unsigned_integer (value_contents (arg),
3251                                         length, byte_order)
3252             : extract_signed_integer (value_contents (arg),
3253                                       length, byte_order);
3254         }
3255
3256       if (as->gr <= 6)
3257         {
3258           if (write_mode)
3259             regcache_cooked_write_unsigned (as->regcache,
3260                                             S390_R0_REGNUM + as->gr,
3261                                             val);
3262           as->gr++;
3263         }
3264       else
3265         {
3266           if (write_mode)
3267             write_memory_unsigned_integer (as->argp, word_size,
3268                                            byte_order, val);
3269           as->argp += word_size;
3270         }
3271     }
3272   else if (s390_function_arg_integer (type) && length == 8)
3273     {
3274       if (as->gr <= 5)
3275         {
3276           if (write_mode)
3277             {
3278               regcache_cooked_write (as->regcache,
3279                                      S390_R0_REGNUM + as->gr,
3280                                      value_contents (arg));
3281               regcache_cooked_write (as->regcache,
3282                                      S390_R0_REGNUM + as->gr + 1,
3283                                      value_contents (arg) + word_size);
3284             }
3285           as->gr += 2;
3286         }
3287       else
3288         {
3289           /* If we skipped r6 because we couldn't fit a DOUBLE_ARG
3290              in it, then don't go back and use it again later.  */
3291           as->gr = 7;
3292
3293           if (write_mode)
3294             write_memory (as->argp, value_contents (arg), length);
3295           as->argp += length;
3296         }
3297     }
3298   else
3299     {
3300       /* This argument type is never passed in registers.  Place the
3301          value in the copy area and pass a pointer to it.  Use 8-byte
3302          alignment as a conservative assumption.  */
3303       as->copy = align_down (as->copy - length, 8);
3304       if (write_mode)
3305         write_memory (as->copy, value_contents (arg), length);
3306
3307       if (as->gr <= 6)
3308         {
3309           if (write_mode)
3310             regcache_cooked_write_unsigned (as->regcache,
3311                                             S390_R0_REGNUM + as->gr,
3312                                             as->copy);
3313           as->gr++;
3314         }
3315       else
3316         {
3317           if (write_mode)
3318             write_memory_unsigned_integer (as->argp, word_size,
3319                                            byte_order, as->copy);
3320           as->argp += word_size;
3321         }
3322     }
3323 }
3324
3325 /* Put the actual parameter values pointed to by ARGS[0..NARGS-1] in
3326    place to be passed to a function, as specified by the "GNU/Linux
3327    for S/390 ELF Application Binary Interface Supplement".
3328
3329    SP is the current stack pointer.  We must put arguments, links,
3330    padding, etc. whereever they belong, and return the new stack
3331    pointer value.
3332
3333    If STRUCT_RETURN is non-zero, then the function we're calling is
3334    going to return a structure by value; STRUCT_ADDR is the address of
3335    a block we've allocated for it on the stack.
3336
3337    Our caller has taken care of any type promotions needed to satisfy
3338    prototypes or the old K&R argument-passing rules.  */
3339
3340 static CORE_ADDR
3341 s390_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
3342                       struct regcache *regcache, CORE_ADDR bp_addr,
3343                       int nargs, struct value **args, CORE_ADDR sp,
3344                       int struct_return, CORE_ADDR struct_addr)
3345 {
3346   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3347   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
3348   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3349   int i;
3350   struct s390_arg_state arg_state, arg_prep;
3351   CORE_ADDR param_area_start, new_sp;
3352   struct type *ftype = check_typedef (value_type (function));
3353
3354   if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3355     ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3356
3357   arg_prep.copy = sp;
3358   arg_prep.gr = struct_return ? 3 : 2;
3359   arg_prep.fr = 0;
3360   arg_prep.vr = 0;
3361   arg_prep.argp = 0;
3362   arg_prep.regcache = NULL;
3363
3364   /* Initialize arg_state for "preparation mode".  */
3365   arg_state = arg_prep;
3366
3367   /* Update arg_state.copy with the start of the reference-to-copy area
3368      and arg_state.argp with the size of the parameter area.  */
3369   for (i = 0; i < nargs; i++)
3370     s390_handle_arg (&arg_state, args[i], tdep, word_size, byte_order,
3371                      TYPE_VARARGS (ftype) && i >= TYPE_NFIELDS (ftype));
3372
3373   param_area_start = align_down (arg_state.copy - arg_state.argp, 8);
3374
3375   /* Allocate the standard frame areas: the register save area, the
3376      word reserved for the compiler, and the back chain pointer.  */
3377   new_sp = param_area_start - (16 * word_size + 32);
3378
3379   /* Now we have the final stack pointer.  Make sure we didn't
3380      underflow; on 31-bit, this would result in addresses with the
3381      high bit set, which causes confusion elsewhere.  Note that if we
3382      error out here, stack and registers remain untouched.  */
3383   if (gdbarch_addr_bits_remove (gdbarch, new_sp) != new_sp)
3384     error (_("Stack overflow"));
3385
3386   /* Pass the structure return address in general register 2.  */
3387   if (struct_return)
3388     regcache_cooked_write_unsigned (regcache, S390_R2_REGNUM, struct_addr);
3389
3390   /* Initialize arg_state for "write mode".  */
3391   arg_state = arg_prep;
3392   arg_state.argp = param_area_start;
3393   arg_state.regcache = regcache;
3394
3395   /* Write all parameters.  */
3396   for (i = 0; i < nargs; i++)
3397     s390_handle_arg (&arg_state, args[i], tdep, word_size, byte_order,
3398                      TYPE_VARARGS (ftype) && i >= TYPE_NFIELDS (ftype));
3399
3400   /* Store return PSWA.  In 31-bit mode, keep addressing mode bit.  */
3401   if (word_size == 4)
3402     {
3403       ULONGEST pswa;
3404       regcache_cooked_read_unsigned (regcache, S390_PSWA_REGNUM, &pswa);
3405       bp_addr = (bp_addr & 0x7fffffff) | (pswa & 0x80000000);
3406     }
3407   regcache_cooked_write_unsigned (regcache, S390_RETADDR_REGNUM, bp_addr);
3408
3409   /* Store updated stack pointer.  */
3410   regcache_cooked_write_unsigned (regcache, S390_SP_REGNUM, new_sp);
3411
3412   /* We need to return the 'stack part' of the frame ID,
3413      which is actually the top of the register save area.  */
3414   return param_area_start;
3415 }
3416
3417 /* Assuming THIS_FRAME is a dummy, return the frame ID of that
3418    dummy frame.  The frame ID's base needs to match the TOS value
3419    returned by push_dummy_call, and the PC match the dummy frame's
3420    breakpoint.  */
3421 static struct frame_id
3422 s390_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
3423 {
3424   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
3425   CORE_ADDR sp = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
3426   sp = gdbarch_addr_bits_remove (gdbarch, sp);
3427
3428   return frame_id_build (sp + 16*word_size + 32,
3429                          get_frame_pc (this_frame));
3430 }
3431
3432 static CORE_ADDR
3433 s390_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
3434 {
3435   /* Both the 32- and 64-bit ABI's say that the stack pointer should
3436      always be aligned on an eight-byte boundary.  */
3437   return (addr & -8);
3438 }
3439
3440
3441 /* Helper for s390_return_value: Set or retrieve a function return
3442    value if it resides in a register.  */
3443
3444 static void
3445 s390_register_return_value (struct gdbarch *gdbarch, struct type *type,
3446                             struct regcache *regcache,
3447                             gdb_byte *out, const gdb_byte *in)
3448 {
3449   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3450   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
3451   int length = TYPE_LENGTH (type);
3452   int code = TYPE_CODE (type);
3453
3454   if (code == TYPE_CODE_FLT || code == TYPE_CODE_DECFLOAT)
3455     {
3456       /* Float-like value: left-aligned in f0.  */
3457       if (in != NULL)
3458         regcache_cooked_write_part (regcache, S390_F0_REGNUM,
3459                                     0, length, in);
3460       else
3461         regcache_cooked_read_part (regcache, S390_F0_REGNUM,
3462                                    0, length, out);
3463     }
3464   else if (code == TYPE_CODE_ARRAY)
3465     {
3466       /* Vector: left-aligned in v24.  */
3467       if (in != NULL)
3468         regcache_cooked_write_part (regcache, S390_V24_REGNUM,
3469                                     0, length, in);
3470       else
3471         regcache_cooked_read_part (regcache, S390_V24_REGNUM,
3472                                    0, length, out);
3473     }
3474   else if (length <= word_size)
3475     {
3476       /* Integer: zero- or sign-extended in r2.  */
3477       if (out != NULL)
3478         regcache_cooked_read_part (regcache, S390_R2_REGNUM,
3479                                    word_size - length, length, out);
3480       else if (TYPE_UNSIGNED (type))
3481         regcache_cooked_write_unsigned
3482           (regcache, S390_R2_REGNUM,
3483            extract_unsigned_integer (in, length, byte_order));
3484       else
3485         regcache_cooked_write_signed
3486           (regcache, S390_R2_REGNUM,
3487            extract_signed_integer (in, length, byte_order));
3488     }
3489   else if (length == 2 * word_size)
3490     {
3491       /* Double word: in r2 and r3.  */
3492       if (in != NULL)
3493         {
3494           regcache_cooked_write (regcache, S390_R2_REGNUM, in);
3495           regcache_cooked_write (regcache, S390_R3_REGNUM,
3496                                  in + word_size);
3497         }
3498       else
3499         {
3500           regcache_cooked_read (regcache, S390_R2_REGNUM, out);
3501           regcache_cooked_read (regcache, S390_R3_REGNUM,
3502                                 out + word_size);
3503         }
3504     }
3505   else
3506     internal_error (__FILE__, __LINE__, _("invalid return type"));
3507 }
3508
3509
3510 /* Implement the 'return_value' gdbarch method.  */
3511
3512 static enum return_value_convention
3513 s390_return_value (struct gdbarch *gdbarch, struct value *function,
3514                    struct type *type, struct regcache *regcache,
3515                    gdb_byte *out, const gdb_byte *in)
3516 {
3517   enum return_value_convention rvc;
3518
3519   type = check_typedef (type);
3520
3521   switch (TYPE_CODE (type))
3522     {
3523     case TYPE_CODE_STRUCT:
3524     case TYPE_CODE_UNION:
3525     case TYPE_CODE_COMPLEX:
3526       rvc = RETURN_VALUE_STRUCT_CONVENTION;
3527       break;
3528     case TYPE_CODE_ARRAY:
3529       rvc = (gdbarch_tdep (gdbarch)->vector_abi == S390_VECTOR_ABI_128
3530              && TYPE_LENGTH (type) <= 16 && TYPE_VECTOR (type))
3531         ? RETURN_VALUE_REGISTER_CONVENTION
3532         : RETURN_VALUE_STRUCT_CONVENTION;
3533       break;
3534     default:
3535       rvc = TYPE_LENGTH (type) <= 8
3536         ? RETURN_VALUE_REGISTER_CONVENTION
3537         : RETURN_VALUE_STRUCT_CONVENTION;
3538     }
3539
3540   if (in != NULL || out != NULL)
3541     {
3542       if (rvc == RETURN_VALUE_REGISTER_CONVENTION)
3543         s390_register_return_value (gdbarch, type, regcache, out, in);
3544       else if (in != NULL)
3545         error (_("Cannot set function return value."));
3546       else
3547         error (_("Function return value unknown."));
3548     }
3549
3550   return rvc;
3551 }
3552
3553
3554 /* Breakpoints.  */
3555 constexpr gdb_byte s390_break_insn[] = { 0x0, 0x1 };
3556
3557 typedef BP_MANIPULATION (s390_break_insn) s390_breakpoint;
3558
3559 /* Address handling.  */
3560
3561 static CORE_ADDR
3562 s390_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
3563 {
3564   return addr & 0x7fffffff;
3565 }
3566
3567 static int
3568 s390_address_class_type_flags (int byte_size, int dwarf2_addr_class)
3569 {
3570   if (byte_size == 4)
3571     return TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
3572   else
3573     return 0;
3574 }
3575
3576 static const char *
3577 s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
3578 {
3579   if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1)
3580     return "mode32";
3581   else
3582     return NULL;
3583 }
3584
3585 static int
3586 s390_address_class_name_to_type_flags (struct gdbarch *gdbarch,
3587                                        const char *name,
3588                                        int *type_flags_ptr)
3589 {
3590   if (strcmp (name, "mode32") == 0)
3591     {
3592       *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
3593       return 1;
3594     }
3595   else
3596     return 0;
3597 }
3598
3599 /* Implement gdbarch_gcc_target_options.  GCC does not know "-m32" or
3600    "-mcmodel=large".  */
3601
3602 static char *
3603 s390_gcc_target_options (struct gdbarch *gdbarch)
3604 {
3605   return xstrdup (gdbarch_ptr_bit (gdbarch) == 64 ? "-m64" : "-m31");
3606 }
3607
3608 /* Implement gdbarch_gnu_triplet_regexp.  Target triplets are "s390-*"
3609    for 31-bit and "s390x-*" for 64-bit, while the BFD arch name is
3610    always "s390".  Note that an s390x compiler supports "-m31" as
3611    well.  */
3612
3613 static const char *
3614 s390_gnu_triplet_regexp (struct gdbarch *gdbarch)
3615 {
3616   return "s390x?";
3617 }
3618
3619 /* Implementation of `gdbarch_stap_is_single_operand', as defined in
3620    gdbarch.h.  */
3621
3622 static int
3623 s390_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
3624 {
3625   return ((isdigit (*s) && s[1] == '(' && s[2] == '%') /* Displacement
3626                                                           or indirection.  */
3627           || *s == '%' /* Register access.  */
3628           || isdigit (*s)); /* Literal number.  */
3629 }
3630
3631 /* Process record and replay helpers.  */
3632
3633 /* Takes the intermediate sum of address calculations and masks off upper
3634    bits according to current addressing mode.  */
3635
3636 static CORE_ADDR
3637 s390_record_address_mask (struct gdbarch *gdbarch, struct regcache *regcache,
3638                          CORE_ADDR val) {
3639   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3640   ULONGEST pswm, pswa;
3641   int am;
3642   if (tdep->abi == ABI_LINUX_S390)
3643     {
3644       regcache_raw_read_unsigned (regcache, S390_PSWA_REGNUM, &pswa);
3645       am = pswa >> 31 & 1;
3646     }
3647   else
3648     {
3649       regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &pswm);
3650       am = pswm >> 31 & 3;
3651     }
3652   switch (am)
3653     {
3654     case 0:
3655       return val & 0xffffff;
3656     case 1:
3657       return val & 0x7fffffff;
3658     case 3:
3659       return val;
3660     default:
3661       fprintf_unfiltered (gdb_stdlog, "Warning: Addressing mode %d used.", am);
3662       return 0;
3663     }
3664 }
3665
3666 /* Calculates memory address using pre-calculated index, raw instruction word
3667    with b and d/dl fields, and raw instruction byte with dh field.  Index and
3668    dh should be set to 0 if unused.  */
3669
3670 static CORE_ADDR
3671 s390_record_calc_disp_common (struct gdbarch *gdbarch, struct regcache *regcache,
3672                              ULONGEST x, uint16_t bd, int8_t dh)
3673 {
3674   uint8_t rb = bd >> 12 & 0xf;
3675   int32_t d = (bd & 0xfff) | ((int32_t)dh << 12);
3676   ULONGEST b;
3677   CORE_ADDR res = d + x;
3678   if (rb)
3679     {
3680       regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + rb, &b);
3681       res += b;
3682     }
3683   return s390_record_address_mask (gdbarch, regcache, res);
3684 }
3685
3686 /* Calculates memory address using raw x, b + d/dl, dh fields from
3687    instruction.  rx and dh should be set to 0 if unused.  */
3688
3689 static CORE_ADDR
3690 s390_record_calc_disp (struct gdbarch *gdbarch, struct regcache *regcache,
3691                       uint8_t rx, uint16_t bd, int8_t dh)
3692 {
3693   ULONGEST x = 0;
3694   if (rx)
3695     regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + rx, &x);
3696   return s390_record_calc_disp_common (gdbarch, regcache, x, bd, dh);
3697 }
3698
3699 /* Calculates memory address for VSCE[GF] instructions.  */
3700
3701 static int
3702 s390_record_calc_disp_vsce (struct gdbarch *gdbarch, struct regcache *regcache,
3703                             uint8_t vx, uint8_t el, uint8_t es, uint16_t bd,
3704                             int8_t dh, CORE_ADDR *res)
3705 {
3706   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3707   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3708   ULONGEST x;
3709   gdb_byte buf[16];
3710   if (tdep->v0_full_regnum == -1 || el * es >= 16)
3711     return -1;
3712   if (vx < 16)
3713     regcache_cooked_read (regcache, tdep->v0_full_regnum + vx, buf);
3714   else
3715     regcache_raw_read (regcache, S390_V16_REGNUM + vx - 16, buf);
3716   x = extract_unsigned_integer (buf + el * es, es, byte_order);
3717   *res = s390_record_calc_disp_common (gdbarch, regcache, x, bd, dh);
3718   return 0;
3719 }
3720
3721 /* Calculates memory address for instructions with relative long addressing.  */
3722
3723 static CORE_ADDR
3724 s390_record_calc_rl (struct gdbarch *gdbarch, struct regcache *regcache,
3725                     CORE_ADDR addr, uint16_t i1, uint16_t i2)
3726 {
3727   int32_t ri = i1 << 16 | i2;
3728   return s390_record_address_mask (gdbarch, regcache, addr + (LONGEST)ri * 2);
3729 }
3730
3731 /* Population count helper.  */
3732
3733 static int s390_popcnt (unsigned int x) {
3734   int res = 0;
3735   while (x)
3736     {
3737       if (x & 1)
3738         res++;
3739       x >>= 1;
3740     }
3741   return res;
3742 }
3743
3744 /* Record 64-bit register.  */
3745
3746 static int
3747 s390_record_gpr_g (struct gdbarch *gdbarch, struct regcache *regcache, int i)
3748 {
3749   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3750   if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
3751     return -1;
3752   if (tdep->abi == ABI_LINUX_S390)
3753     if (record_full_arch_list_add_reg (regcache, S390_R0_UPPER_REGNUM + i))
3754       return -1;
3755   return 0;
3756 }
3757
3758 /* Record high 32 bits of a register.  */
3759
3760 static int
3761 s390_record_gpr_h (struct gdbarch *gdbarch, struct regcache *regcache, int i)
3762 {
3763   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3764   if (tdep->abi == ABI_LINUX_S390)
3765     {
3766       if (record_full_arch_list_add_reg (regcache, S390_R0_UPPER_REGNUM + i))
3767         return -1;
3768     }
3769   else
3770     {
3771       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
3772         return -1;
3773     }
3774   return 0;
3775 }
3776
3777 /* Record vector register.  */
3778
3779 static int
3780 s390_record_vr (struct gdbarch *gdbarch, struct regcache *regcache, int i)
3781 {
3782   if (i < 16)
3783     {
3784       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + i))
3785         return -1;
3786       if (record_full_arch_list_add_reg (regcache, S390_V0_LOWER_REGNUM + i))
3787         return -1;
3788     }
3789   else
3790     {
3791       if (record_full_arch_list_add_reg (regcache, S390_V16_REGNUM + i - 16))
3792         return -1;
3793     }
3794   return 0;
3795 }
3796
3797 static int
3798 s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
3799                     CORE_ADDR addr)
3800 {
3801   uint16_t insn[3] = {0};
3802   /* Instruction as bytes.  */
3803   uint8_t ibyte[6];
3804   /* Instruction as nibbles.  */
3805   uint8_t inib[12];
3806   /* Instruction vector registers.  */
3807   uint8_t ivec[4];
3808   CORE_ADDR oaddr, oaddr2, oaddr3;
3809   ULONGEST tmp;
3810   int i, n;
3811   /* if EX/EXRL instruction used, here's the reg parameter */
3812   int ex = -1;
3813   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3814
3815   /* Attempting to use EX or EXRL jumps back here */
3816 ex:
3817
3818   /* Read instruction.  */
3819   insn[0] = read_memory_unsigned_integer (addr, 2, byte_order);
3820   /* If execute was involved, do the adjustment.  */
3821   if (ex != -1)
3822     insn[0] |= ex & 0xff;
3823   /* Two highest bits determine instruction size.  */
3824   if (insn[0] >= 0x4000)
3825     insn[1] = read_memory_unsigned_integer (addr+2, 2, byte_order);
3826   else
3827     /* Not necessary, but avoids uninitialized variable warnings.  */
3828     insn[1] = 0;
3829   if (insn[0] >= 0xc000)
3830     insn[2] = read_memory_unsigned_integer (addr+4, 2, byte_order);
3831   else
3832     insn[2] = 0;
3833   /* Split instruction into bytes and nibbles.  */
3834   for (i = 0; i < 3; i++)
3835     {
3836       ibyte[i*2] = insn[i] >> 8 & 0xff;
3837       ibyte[i*2+1] = insn[i] & 0xff;
3838     }
3839   for (i = 0; i < 6; i++)
3840     {
3841       inib[i*2] = ibyte[i] >> 4 & 0xf;
3842       inib[i*2+1] = ibyte[i] & 0xf;
3843     }
3844   /* Compute vector registers, if applicable.  */
3845   ivec[0] = (inib[9] >> 3 & 1) << 4 | inib[2];
3846   ivec[1] = (inib[9] >> 2 & 1) << 4 | inib[3];
3847   ivec[2] = (inib[9] >> 1 & 1) << 4 | inib[4];
3848   ivec[3] = (inib[9] >> 0 & 1) << 4 | inib[8];
3849
3850   switch (ibyte[0])
3851     {
3852     /* 0x00 undefined */
3853
3854     case 0x01:
3855       /* E-format instruction */
3856       switch (ibyte[1])
3857         {
3858         /* 0x00 undefined */
3859         /* 0x01 unsupported: PR - program return */
3860         /* 0x02 unsupported: UPT */
3861         /* 0x03 undefined */
3862         /* 0x04 privileged: PTFF - perform timing facility function */
3863         /* 0x05-0x06 undefined */
3864         /* 0x07 privileged: SCKPF - set clock programmable field */
3865         /* 0x08-0x09 undefined */
3866
3867         case 0x0a: /* PFPO - perform floating point operation */
3868           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
3869           if (!(tmp & 0x80000000u))
3870             {
3871               uint8_t ofc = tmp >> 16 & 0xff;
3872               switch (ofc)
3873                 {
3874                 case 0x00: /* HFP32 */
3875                 case 0x01: /* HFP64 */
3876                 case 0x05: /* BFP32 */
3877                 case 0x06: /* BFP64 */
3878                 case 0x08: /* DFP32 */
3879                 case 0x09: /* DFP64 */
3880                   if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM))
3881                     return -1;
3882                   break;
3883                 case 0x02: /* HFP128 */
3884                 case 0x07: /* BFP128 */
3885                 case 0x0a: /* DFP128 */
3886                   if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM))
3887                     return -1;
3888                   if (record_full_arch_list_add_reg (regcache, S390_F2_REGNUM))
3889                     return -1;
3890                   break;
3891                 default:
3892                   fprintf_unfiltered (gdb_stdlog, "Warning: Unknown PFPO OFC %02x at %s.\n",
3893                                       ofc, paddress (gdbarch, addr));
3894                   return -1;
3895                 }
3896
3897               if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
3898                 return -1;
3899             }
3900           if (record_full_arch_list_add_reg (regcache, S390_R1_REGNUM))
3901             return -1;
3902           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
3903             return -1;
3904           break;
3905
3906         case 0x0b: /* TAM - test address mode */
3907         case 0x0c: /* SAM24 - set address mode 24 */
3908         case 0x0d: /* SAM31 - set address mode 31 */
3909         case 0x0e: /* SAM64 - set address mode 64 */
3910           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
3911             return -1;
3912           break;
3913
3914         /* 0x0f-0xfe undefined */
3915
3916         /* 0xff unsupported: TRAP */
3917
3918         default:
3919           goto UNKNOWN_OP;
3920         }
3921       break;
3922
3923     /* 0x02 undefined */
3924     /* 0x03 undefined */
3925
3926     case 0x04: /* SPM - set program mask */
3927       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
3928         return -1;
3929       break;
3930
3931     case 0x05: /* BALR - branch and link */
3932     case 0x45: /* BAL - branch and link */
3933     case 0x06: /* BCTR - branch on count */
3934     case 0x46: /* BCT - branch on count */
3935     case 0x0d: /* BASR - branch and save */
3936     case 0x4d: /* BAS - branch and save */
3937     case 0x84: /* BRXH - branch relative on index high */
3938     case 0x85: /* BRXLE - branch relative on index low or equal */
3939     case 0x86: /* BXH - branch on index high */
3940     case 0x87: /* BXLE - branch on index low or equal */
3941       /* BA[SL]* use native-size destination for linkage info, BCT*, BRX*, BX*
3942          use 32-bit destination as counter.  */
3943       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
3944         return -1;
3945       break;
3946
3947     case 0x07: /* BCR - branch on condition */
3948     case 0x47: /* BC - branch on condition */
3949       /* No effect other than PC transfer.  */
3950       break;
3951
3952     /* 0x08 undefined */
3953     /* 0x09 undefined */
3954
3955     case 0x0a:
3956       /* SVC - supervisor call */
3957       if (s390_linux_syscall_record (regcache, ibyte[1]))
3958         return -1;
3959       break;
3960
3961     case 0x0b: /* BSM - branch and set mode */
3962       if (inib[2])
3963         if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
3964           return -1;
3965       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
3966         return -1;
3967       break;
3968
3969     case 0x0c: /* BASSM - branch and save and set mode */
3970       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
3971         return -1;
3972       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
3973         return -1;
3974       break;
3975
3976     case 0x0e: /* MVCL - move long [interruptible] */
3977       regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[2], &tmp);
3978       oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
3979       regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[2] | 1), &tmp);
3980       tmp &= 0xffffff;
3981       if (record_full_arch_list_add_mem (oaddr, tmp))
3982         return -1;
3983       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
3984         return -1;
3985       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
3986         return -1;
3987       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
3988         return -1;
3989       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[3] | 1)))
3990         return -1;
3991       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
3992         return -1;
3993       break;
3994
3995     case 0x0f: /* CLCL - compare logical long [interruptible] */
3996     case 0xa9: /* CLCLE - compare logical long extended [partial] */
3997       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
3998         return -1;
3999       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
4000         return -1;
4001       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
4002         return -1;
4003       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[3] | 1)))
4004         return -1;
4005       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4006         return -1;
4007       break;
4008
4009     case 0x10: /* LPR - load positive */
4010     case 0x11: /* LNR - load negative */
4011     case 0x12: /* LTR - load and test */
4012     case 0x13: /* LCR - load complement */
4013     case 0x14: /* NR - and */
4014     case 0x16: /* OR - or */
4015     case 0x17: /* XR - xor */
4016     case 0x1a: /* AR - add */
4017     case 0x1b: /* SR - subtract */
4018     case 0x1e: /* ALR - add logical */
4019     case 0x1f: /* SLR - subtract logical */
4020     case 0x54: /* N - and */
4021     case 0x56: /* O - or */
4022     case 0x57: /* X - xor */
4023     case 0x5a: /* A - add */
4024     case 0x5b: /* S - subtract */
4025     case 0x5e: /* AL - add logical */
4026     case 0x5f: /* SL - subtract logical */
4027     case 0x4a: /* AH - add halfword */
4028     case 0x4b: /* SH - subtract halfword */
4029     case 0x8a: /* SRA - shift right single */
4030     case 0x8b: /* SLA - shift left single */
4031     case 0xbf: /* ICM - insert characters under mask */
4032       /* 32-bit destination + flags */
4033       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4034         return -1;
4035       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4036         return -1;
4037       break;
4038
4039     case 0x15: /* CLR - compare logical */
4040     case 0x55: /* CL - compare logical */
4041     case 0x19: /* CR - compare */
4042     case 0x29: /* CDR - compare */
4043     case 0x39: /* CER - compare */
4044     case 0x49: /* CH - compare halfword */
4045     case 0x59: /* C - compare */
4046     case 0x69: /* CD - compare */
4047     case 0x79: /* CE - compare */
4048     case 0x91: /* TM - test under mask */
4049     case 0x95: /* CLI - compare logical */
4050     case 0xbd: /* CLM - compare logical under mask */
4051     case 0xd5: /* CLC - compare logical */
4052       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4053         return -1;
4054       break;
4055
4056     case 0x18: /* LR - load */
4057     case 0x48: /* LH - load halfword */
4058     case 0x58: /* L - load */
4059     case 0x41: /* LA - load address */
4060     case 0x43: /* IC - insert character */
4061     case 0x4c: /* MH - multiply halfword */
4062     case 0x71: /* MS - multiply single */
4063     case 0x88: /* SRL - shift right single logical */
4064     case 0x89: /* SLL - shift left single logical */
4065       /* 32-bit, 8-bit (IC), or native width (LA) destination, no flags */
4066       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4067         return -1;
4068       break;
4069
4070     case 0x1c: /* MR - multiply */
4071     case 0x5c: /* M - multiply */
4072     case 0x1d: /* DR - divide */
4073     case 0x5d: /* D - divide */
4074     case 0x8c: /* SRDL - shift right double logical */
4075     case 0x8d: /* SLDL - shift left double logical */
4076       /* 32-bit pair destination, no flags */
4077       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4078         return -1;
4079       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
4080         return -1;
4081       break;
4082
4083     case 0x20: /* LPDR - load positive */
4084     case 0x30: /* LPER - load positive */
4085     case 0x21: /* LNDR - load negative */
4086     case 0x31: /* LNER - load negative */
4087     case 0x22: /* LTDR - load and test */
4088     case 0x32: /* LTER - load and test */
4089     case 0x23: /* LCDR - load complement */
4090     case 0x33: /* LCER - load complement */
4091     case 0x2a: /* ADR - add */
4092     case 0x3a: /* AER - add */
4093     case 0x6a: /* AD - add */
4094     case 0x7a: /* AE - add */
4095     case 0x2b: /* SDR - subtract */
4096     case 0x3b: /* SER - subtract */
4097     case 0x6b: /* SD - subtract */
4098     case 0x7b: /* SE - subtract */
4099     case 0x2e: /* AWR - add unnormalized */
4100     case 0x3e: /* AUR - add unnormalized */
4101     case 0x6e: /* AW - add unnormalized */
4102     case 0x7e: /* AU - add unnormalized */
4103     case 0x2f: /* SWR - subtract unnormalized */
4104     case 0x3f: /* SUR - subtract unnormalized */
4105     case 0x6f: /* SW - subtract unnormalized */
4106     case 0x7f: /* SU - subtract unnormalized */
4107       /* float destination + flags */
4108       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
4109         return -1;
4110       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4111         return -1;
4112       break;
4113
4114     case 0x24: /* HDR - halve */
4115     case 0x34: /* HER - halve */
4116     case 0x25: /* LDXR - load rounded */
4117     case 0x35: /* LEDR - load rounded */
4118     case 0x28: /* LDR - load */
4119     case 0x38: /* LER - load */
4120     case 0x68: /* LD - load */
4121     case 0x78: /* LE - load */
4122     case 0x2c: /* MDR - multiply */
4123     case 0x3c: /* MDER - multiply */
4124     case 0x6c: /* MD - multiply */
4125     case 0x7c: /* MDE - multiply */
4126     case 0x2d: /* DDR - divide */
4127     case 0x3d: /* DER - divide */
4128     case 0x6d: /* DD - divide */
4129     case 0x7d: /* DE - divide */
4130       /* float destination, no flags */
4131       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
4132         return -1;
4133       break;
4134
4135     case 0x26: /* MXR - multiply */
4136     case 0x27: /* MXDR - multiply */
4137     case 0x67: /* MXD - multiply */
4138       /* float pair destination, no flags */
4139       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
4140         return -1;
4141       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[2] | 2)))
4142         return -1;
4143       break;
4144
4145     case 0x36: /* AXR - add */
4146     case 0x37: /* SXR - subtract */
4147       /* float pair destination + flags */
4148       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
4149         return -1;
4150       if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[2] | 2)))
4151         return -1;
4152       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4153         return -1;
4154       break;
4155
4156     case 0x40: /* STH - store halfword */
4157       oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
4158       if (record_full_arch_list_add_mem (oaddr, 2))
4159         return -1;
4160       break;
4161
4162     case 0x42: /* STC - store character */
4163       oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
4164       if (record_full_arch_list_add_mem (oaddr, 1))
4165         return -1;
4166       break;
4167
4168     case 0x44: /* EX - execute */
4169       if (ex != -1)
4170         {
4171           fprintf_unfiltered (gdb_stdlog, "Warning: Double execute at %s.\n",
4172                               paddress (gdbarch, addr));
4173           return -1;
4174         }
4175       addr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
4176       if (inib[2])
4177         {
4178           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[2], &tmp);
4179           ex = tmp & 0xff;
4180         }
4181       else
4182         {
4183           ex = 0;
4184         }
4185       goto ex;
4186
4187     case 0x4e: /* CVD - convert to decimal */
4188     case 0x60: /* STD - store */
4189       oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
4190       if (record_full_arch_list_add_mem (oaddr, 8))
4191         return -1;
4192       break;
4193
4194     case 0x4f: /* CVB - convert to binary */
4195       /* 32-bit gpr destination + FPC (DXC write) */
4196       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4197         return -1;
4198       if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4199         return -1;
4200       break;
4201
4202     case 0x50: /* ST - store */
4203     case 0x70: /* STE - store */
4204       oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
4205       if (record_full_arch_list_add_mem (oaddr, 4))
4206         return -1;
4207       break;
4208
4209     case 0x51: /* LAE - load address extended */
4210       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4211         return -1;
4212       if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + inib[2]))
4213         return -1;
4214       break;
4215
4216     /* 0x52 undefined */
4217     /* 0x53 undefined */
4218
4219     /* 0x61-0x66 undefined */
4220
4221     /* 0x72-0x77 undefined */
4222
4223     /* 0x80 privileged: SSM - set system mask */
4224     /* 0x81 undefined */
4225     /* 0x82 privileged: LPSW - load PSW */
4226     /* 0x83 privileged: diagnose */
4227
4228     case 0x8e: /* SRDA - shift right double */
4229     case 0x8f: /* SLDA - shift left double */
4230       /* 32-bit pair destination + flags */
4231       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4232         return -1;
4233       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
4234         return -1;
4235       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4236         return -1;
4237       break;
4238
4239     case 0x90: /* STM - store multiple */
4240     case 0x9b: /* STAM - store access multiple */
4241       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4242       if (inib[2] <= inib[3])
4243         n = inib[3] - inib[2] + 1;
4244       else
4245         n = inib[3] + 0x10 - inib[2] + 1;
4246       if (record_full_arch_list_add_mem (oaddr, n * 4))
4247         return -1;
4248       break;
4249
4250     case 0x92: /* MVI - move */
4251       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4252       if (record_full_arch_list_add_mem (oaddr, 1))
4253         return -1;
4254       break;
4255
4256     case 0x93: /* TS - test and set */
4257     case 0x94: /* NI - and */
4258     case 0x96: /* OI - or */
4259     case 0x97: /* XI - xor */
4260       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4261       if (record_full_arch_list_add_mem (oaddr, 1))
4262         return -1;
4263       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4264         return -1;
4265       break;
4266
4267     case 0x98: /* LM - load multiple */
4268       for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
4269         if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
4270           return -1;
4271       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
4272         return -1;
4273       break;
4274
4275     /* 0x99 privileged: TRACE */
4276
4277     case 0x9a: /* LAM - load access multiple */
4278       for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
4279         if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + i))
4280           return -1;
4281       if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + inib[3]))
4282         return -1;
4283       break;
4284
4285     /* 0x9c-0x9f privileged and obsolete (old I/O) */
4286     /* 0xa0-0xa4 undefined */
4287
4288     case 0xa5:
4289     case 0xa7:
4290       /* RI-format instruction */
4291       switch (ibyte[0] << 4 | inib[3])
4292         {
4293         case 0xa50: /* IIHH - insert immediate */
4294         case 0xa51: /* IIHL - insert immediate */
4295           /* high 32-bit destination */
4296           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
4297             return -1;
4298           break;
4299
4300         case 0xa52: /* IILH - insert immediate */
4301         case 0xa53: /* IILL - insert immediate */
4302         case 0xa75: /* BRAS - branch relative and save */
4303         case 0xa76: /* BRCT - branch relative on count */
4304         case 0xa78: /* LHI - load halfword immediate */
4305         case 0xa7c: /* MHI - multiply halfword immediate */
4306           /* 32-bit or native destination */
4307           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4308             return -1;
4309           break;
4310
4311         case 0xa54: /* NIHH - and immediate */
4312         case 0xa55: /* NIHL - and immediate */
4313         case 0xa58: /* OIHH - or immediate */
4314         case 0xa59: /* OIHL - or immediate */
4315           /* high 32-bit destination + flags */
4316           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
4317             return -1;
4318           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4319             return -1;
4320           break;
4321
4322         case 0xa56: /* NILH - and immediate */
4323         case 0xa57: /* NILL - and immediate */
4324         case 0xa5a: /* OILH - or immediate */
4325         case 0xa5b: /* OILL - or immediate */
4326         case 0xa7a: /* AHI - add halfword immediate */
4327           /* 32-bit destination + flags */
4328           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4329             return -1;
4330           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4331             return -1;
4332           break;
4333
4334         case 0xa5c: /* LLIHH - load logical immediate */
4335         case 0xa5d: /* LLIHL - load logical immediate */
4336         case 0xa5e: /* LLILH - load logical immediate */
4337         case 0xa5f: /* LLILL - load logical immediate */
4338         case 0xa77: /* BRCTG - branch relative on count */
4339         case 0xa79: /* LGHI - load halfword immediate */
4340         case 0xa7d: /* MGHI - multiply halfword immediate */
4341           /* 64-bit destination */
4342           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
4343             return -1;
4344           break;
4345
4346         case 0xa70: /* TMLH - test under mask */
4347         case 0xa71: /* TMLL - test under mask */
4348         case 0xa72: /* TMHH - test under mask */
4349         case 0xa73: /* TMHL - test under mask */
4350         case 0xa7e: /* CHI - compare halfword immediate */
4351         case 0xa7f: /* CGHI - compare halfword immediate */
4352           /* flags only */
4353           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4354             return -1;
4355           break;
4356
4357         case 0xa74: /* BRC - branch relative on condition */
4358           /* no register change */
4359           break;
4360
4361         case 0xa7b: /* AGHI - add halfword immediate */
4362           /* 64-bit destination + flags */
4363           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
4364             return -1;
4365           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4366             return -1;
4367           break;
4368
4369         default:
4370           goto UNKNOWN_OP;
4371         }
4372       break;
4373
4374     /* 0xa6 undefined */
4375
4376     case 0xa8: /* MVCLE - move long extended [partial] */
4377       regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[2], &tmp);
4378       oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
4379       regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[2] | 1), &tmp);
4380       if (record_full_arch_list_add_mem (oaddr, tmp))
4381         return -1;
4382       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
4383         return -1;
4384       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
4385         return -1;
4386       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
4387         return -1;
4388       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[3] | 1)))
4389         return -1;
4390       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4391         return -1;
4392       break;
4393
4394     /* 0xaa-0xab undefined */
4395     /* 0xac privileged: STNSM - store then and system mask */
4396     /* 0xad privileged: STOSM - store then or system mask */
4397     /* 0xae privileged: SIGP - signal processor */
4398     /* 0xaf unsupported: MC - monitor call */
4399     /* 0xb0 undefined */
4400     /* 0xb1 privileged: LRA - load real address */
4401
4402     case 0xb2:
4403     case 0xb3:
4404     case 0xb9:
4405       /* S/RRD/RRE/RRF/IE-format instruction */
4406       switch (insn[0])
4407         {
4408         /* 0xb200-0xb204 undefined or privileged */
4409
4410         case 0xb205: /* STCK - store clock */
4411         case 0xb27c: /* STCKF - store clock fast */
4412           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4413           if (record_full_arch_list_add_mem (oaddr, 8))
4414             return -1;
4415           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4416             return -1;
4417           break;
4418
4419         /* 0xb206-0xb219 undefined, privileged, or unsupported */
4420         /* 0xb21a unsupported: CFC */
4421         /* 0xb21b-0xb221 undefined or privileged */
4422
4423         case 0xb222: /* IPM - insert program mask */
4424         case 0xb24f: /* EAR - extract access */
4425         case 0xb252: /* MSR - multiply single */
4426         case 0xb2ec: /* ETND - extract transaction nesting depth */
4427         case 0xb38c: /* EFPC - extract fpc */
4428         case 0xb91f: /* LRVR - load reversed */
4429         case 0xb926: /* LBR - load byte */
4430         case 0xb927: /* LHR - load halfword */
4431         case 0xb994: /* LLCR - load logical character */
4432         case 0xb995: /* LLHR - load logical halfword */
4433         case 0xb9f2: /* LOCR - load on condition */
4434           /* 32-bit gpr destination */
4435           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4436             return -1;
4437           break;
4438
4439         /* 0xb223-0xb22c privileged or unsupported */
4440
4441         case 0xb22d: /* DXR - divide */
4442         case 0xb325: /* LXDR - load lengthened */
4443         case 0xb326: /* LXER - load lengthened */
4444         case 0xb336: /* SQXR - square root */
4445         case 0xb365: /* LXR - load */
4446         case 0xb367: /* FIXR - load fp integer */
4447         case 0xb376: /* LZXR - load zero */
4448         case 0xb3b6: /* CXFR - convert from fixed */
4449         case 0xb3c6: /* CXGR - convert from fixed */
4450         case 0xb3fe: /* IEXTR - insert biased exponent */
4451           /* float pair destination */
4452           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4453             return -1;
4454           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[6] | 2)))
4455             return -1;
4456           break;
4457
4458         /* 0xb22e-0xb240 undefined, privileged, or unsupported */
4459
4460         case 0xb241: /* CKSM - checksum [partial] */
4461           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4462             return -1;
4463           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
4464             return -1;
4465           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
4466             return -1;
4467           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4468             return -1;
4469           break;
4470
4471         /* 0xb242-0xb243 undefined */
4472
4473         case 0xb244: /* SQDR - square root */
4474         case 0xb245: /* SQER - square root */
4475         case 0xb324: /* LDER - load lengthened */
4476         case 0xb337: /* MEER - multiply */
4477         case 0xb366: /* LEXR - load rounded */
4478         case 0xb370: /* LPDFR - load positive */
4479         case 0xb371: /* LNDFR - load negative */
4480         case 0xb372: /* CSDFR - copy sign */
4481         case 0xb373: /* LCDFR - load complement */
4482         case 0xb374: /* LZER - load zero */
4483         case 0xb375: /* LZDR - load zero */
4484         case 0xb377: /* FIER - load fp integer */
4485         case 0xb37f: /* FIDR - load fp integer */
4486         case 0xb3b4: /* CEFR - convert from fixed */
4487         case 0xb3b5: /* CDFR - convert from fixed */
4488         case 0xb3c1: /* LDGR - load fpr from gr */
4489         case 0xb3c4: /* CEGR - convert from fixed */
4490         case 0xb3c5: /* CDGR - convert from fixed */
4491         case 0xb3f6: /* IEDTR - insert biased exponent */
4492           /* float destination */
4493           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4494             return -1;
4495           break;
4496
4497         /* 0xb246-0xb24c: privileged or unsupported */
4498
4499         case 0xb24d: /* CPYA - copy access */
4500         case 0xb24e: /* SAR - set access */
4501           if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + inib[6]))
4502             return -1;
4503           break;
4504
4505         /* 0xb250-0xb251 undefined or privileged */
4506         /* 0xb253-0xb254 undefined or privileged */
4507
4508         case 0xb255: /* MVST - move string [partial] */
4509           {
4510             uint8_t end;
4511             gdb_byte cur;
4512             ULONGEST num = 0;
4513             /* Read ending byte.  */
4514             regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
4515             end = tmp & 0xff;
4516             /* Get address of second operand.  */
4517             regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[7], &tmp);
4518             oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
4519             /* Search for ending byte and compute length.  */
4520             do {
4521               num++;
4522               if (target_read_memory (oaddr, &cur, 1))
4523                 return -1;
4524               oaddr++;
4525             } while (cur != end);
4526             /* Get address of first operand and record it.  */
4527             regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
4528             oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
4529             if (record_full_arch_list_add_mem (oaddr, num))
4530               return -1;
4531             /* Record the registers.  */
4532             if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4533               return -1;
4534             if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
4535               return -1;
4536             if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4537               return -1;
4538           }
4539           break;
4540
4541         /* 0xb256 undefined */
4542
4543         case 0xb257: /* CUSE - compare until substring equal [interruptible] */
4544           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4545             return -1;
4546           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
4547             return -1;
4548           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
4549             return -1;
4550           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
4551             return -1;
4552           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4553             return -1;
4554           break;
4555
4556         /* 0xb258-0xb25c undefined, privileged, or unsupported */
4557
4558         case 0xb25d: /* CLST - compare logical string [partial] */
4559         case 0xb25e: /* SRST - search string [partial] */
4560         case 0xb9be: /* SRSTU - search string unicode [partial] */
4561           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4562             return -1;
4563           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
4564             return -1;
4565           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4566             return -1;
4567           break;
4568
4569         /* 0xb25f-0xb262 undefined */
4570
4571         case 0xb263: /* CMPSC - compression call [interruptible] */
4572           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
4573           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
4574           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[6] | 1), &tmp);
4575           if (record_full_arch_list_add_mem (oaddr, tmp))
4576             return -1;
4577           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4578             return -1;
4579           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
4580             return -1;
4581           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
4582             return -1;
4583           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
4584             return -1;
4585           if (record_full_arch_list_add_reg (regcache, S390_R1_REGNUM))
4586             return -1;
4587           /* DXC may be written */
4588           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4589             return -1;
4590           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4591             return -1;
4592           break;
4593
4594         /* 0xb264-0xb277 undefined, privileged, or unsupported */
4595
4596         case 0xb278: /* STCKE - store clock extended */
4597           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4598           if (record_full_arch_list_add_mem (oaddr, 16))
4599             return -1;
4600           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4601             return -1;
4602           break;
4603
4604         /* 0xb279-0xb27b undefined or unsupported */
4605         /* 0xb27d-0xb298 undefined or privileged */
4606
4607         case 0xb299: /* SRNM - set rounding mode */
4608         case 0xb2b8: /* SRNMB - set bfp rounding mode */
4609         case 0xb2b9: /* SRNMT - set dfp rounding mode */
4610         case 0xb29d: /* LFPC - load fpc */
4611         case 0xb2bd: /* LFAS - load fpc and signal */
4612         case 0xb384: /* SFPC - set fpc */
4613         case 0xb385: /* SFASR - set fpc and signal */
4614         case 0xb960: /* CGRT - compare and trap */
4615         case 0xb961: /* CLGRT - compare logical and trap */
4616         case 0xb972: /* CRT - compare and trap */
4617         case 0xb973: /* CLRT - compare logical and trap */
4618           /* fpc only - including possible DXC write for trapping insns */
4619           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4620             return -1;
4621           break;
4622
4623         /* 0xb29a-0xb29b undefined */
4624
4625         case 0xb29c: /* STFPC - store fpc */
4626           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4627           if (record_full_arch_list_add_mem (oaddr, 4))
4628             return -1;
4629           break;
4630
4631         /* 0xb29e-0xb2a4 undefined */
4632
4633         case 0xb2a5: /* TRE - translate extended [partial] */
4634           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
4635           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
4636           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[6] | 1), &tmp);
4637           if (record_full_arch_list_add_mem (oaddr, tmp))
4638             return -1;
4639           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4640             return -1;
4641           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
4642             return -1;
4643           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4644             return -1;
4645           break;
4646
4647         case 0xb2a6: /* CU21 - convert UTF-16 to UTF-8 [partial] */
4648         case 0xb2a7: /* CU12 - convert UTF-8 to UTF-16 [partial] */
4649         case 0xb9b0: /* CU14 - convert UTF-8 to UTF-32 [partial] */
4650         case 0xb9b1: /* CU24 - convert UTF-16 to UTF-32 [partial] */
4651         case 0xb9b2: /* CU41 - convert UTF-32 to UTF-8 [partial] */
4652         case 0xb9b3: /* CU42 - convert UTF-32 to UTF-16 [partial] */
4653           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
4654           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
4655           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[6] | 1), &tmp);
4656           if (record_full_arch_list_add_mem (oaddr, tmp))
4657             return -1;
4658           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4659             return -1;
4660           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
4661             return -1;
4662           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
4663             return -1;
4664           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
4665             return -1;
4666           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4667             return -1;
4668           break;
4669
4670         /* 0xb2a8-0xb2af undefined */
4671
4672         case 0xb2b0: /* STFLE - store facility list extended */
4673           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
4674           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
4675           tmp &= 0xff;
4676           if (record_full_arch_list_add_mem (oaddr, 8 * (tmp + 1)))
4677             return -1;
4678           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM))
4679             return -1;
4680           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4681             return -1;
4682           break;
4683
4684         /* 0xb2b1-0xb2b7 undefined or privileged */
4685         /* 0xb2ba-0xb2bc undefined */
4686         /* 0xb2be-0xb2e7 undefined */
4687         /* 0xb2e9-0xb2eb undefined */
4688         /* 0xb2ed-0xb2f7 undefined */
4689         /* 0xb2f8 unsupported: TEND */
4690         /* 0xb2f9 undefined */
4691
4692         case 0xb2e8: /* PPA - perform processor assist */
4693         case 0xb2fa: /* NIAI - next instruction access intent */
4694           /* no visible effects */
4695           break;
4696
4697         /* 0xb2fb undefined */
4698         /* 0xb2fc unsupported: TABORT */
4699         /* 0xb2fd-0xb2fe undefined */
4700         /* 0xb2ff unsupported: TRAP */
4701
4702         case 0xb300: /* LPEBR - load positive */
4703         case 0xb301: /* LNEBR - load negative */
4704         case 0xb303: /* LCEBR - load complement */
4705         case 0xb310: /* LPDBR - load positive */
4706         case 0xb311: /* LNDBR - load negative */
4707         case 0xb313: /* LCDBR - load complement */
4708         case 0xb350: /* TBEDR - convert hfp to bfp */
4709         case 0xb351: /* TBDR - convert hfp to bfp */
4710         case 0xb358: /* THDER - convert bfp to hfp */
4711         case 0xb359: /* THDR - convert bfp to hfp */
4712           /* float destination + flags */
4713           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4714             return -1;
4715           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4716             return -1;
4717           break;
4718
4719         case 0xb304: /* LDEBR - load lengthened */
4720         case 0xb30c: /* MDEBR - multiply */
4721         case 0xb30d: /* DEBR - divide */
4722         case 0xb314: /* SQEBR - square root */
4723         case 0xb315: /* SQDBR - square root */
4724         case 0xb317: /* MEEBR - multiply */
4725         case 0xb31c: /* MDBR - multiply */
4726         case 0xb31d: /* DDBR - divide */
4727         case 0xb344: /* LEDBRA - load rounded */
4728         case 0xb345: /* LDXBRA - load rounded */
4729         case 0xb346: /* LEXBRA - load rounded */
4730         case 0xb357: /* FIEBRA - load fp integer */
4731         case 0xb35f: /* FIDBRA - load fp integer */
4732         case 0xb390: /* CELFBR - convert from logical */
4733         case 0xb391: /* CDLFBR - convert from logical */
4734         case 0xb394: /* CEFBR - convert from fixed */
4735         case 0xb395: /* CDFBR - convert from fixed */
4736         case 0xb3a0: /* CELGBR - convert from logical */
4737         case 0xb3a1: /* CDLGBR - convert from logical */
4738         case 0xb3a4: /* CEGBR - convert from fixed */
4739         case 0xb3a5: /* CDGBR - convert from fixed */
4740         case 0xb3d0: /* MDTR - multiply */
4741         case 0xb3d1: /* DDTR - divide */
4742         case 0xb3d4: /* LDETR - load lengthened */
4743         case 0xb3d5: /* LEDTR - load lengthened */
4744         case 0xb3d7: /* FIDTR - load fp integer */
4745         case 0xb3dd: /* LDXTR - load lengthened */
4746         case 0xb3f1: /* CDGTR - convert from fixed */
4747         case 0xb3f2: /* CDUTR - convert from unsigned packed */
4748         case 0xb3f3: /* CDSTR - convert from signed packed */
4749         case 0xb3f5: /* QADTR - quantize */
4750         case 0xb3f7: /* RRDTR - reround */
4751         case 0xb951: /* CDFTR - convert from fixed */
4752         case 0xb952: /* CDLGTR - convert from logical */
4753         case 0xb953: /* CDLFTR - convert from logical */
4754           /* float destination + fpc */
4755           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4756             return -1;
4757           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4758             return -1;
4759           break;
4760
4761         case 0xb305: /* LXDBR - load lengthened */
4762         case 0xb306: /* LXEBR - load lengthened */
4763         case 0xb307: /* MXDBR - multiply */
4764         case 0xb316: /* SQXBR - square root */
4765         case 0xb34c: /* MXBR - multiply */
4766         case 0xb34d: /* DXBR - divide */
4767         case 0xb347: /* FIXBRA - load fp integer */
4768         case 0xb392: /* CXLFBR - convert from logical */
4769         case 0xb396: /* CXFBR - convert from fixed */
4770         case 0xb3a2: /* CXLGBR - convert from logical */
4771         case 0xb3a6: /* CXGBR - convert from fixed */
4772         case 0xb3d8: /* MXTR - multiply */
4773         case 0xb3d9: /* DXTR - divide */
4774         case 0xb3dc: /* LXDTR - load lengthened */
4775         case 0xb3df: /* FIXTR - load fp integer */
4776         case 0xb3f9: /* CXGTR - convert from fixed */
4777         case 0xb3fa: /* CXUTR - convert from unsigned packed */
4778         case 0xb3fb: /* CXSTR - convert from signed packed */
4779         case 0xb3fd: /* QAXTR - quantize */
4780         case 0xb3ff: /* RRXTR - reround */
4781         case 0xb959: /* CXFTR - convert from fixed */
4782         case 0xb95a: /* CXLGTR - convert from logical */
4783         case 0xb95b: /* CXLFTR - convert from logical */
4784           /* float pair destination + fpc */
4785           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4786             return -1;
4787           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[6] | 2)))
4788             return -1;
4789           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4790             return -1;
4791           break;
4792
4793         case 0xb308: /* KEBR - compare and signal */
4794         case 0xb309: /* CEBR - compare */
4795         case 0xb318: /* KDBR - compare and signal */
4796         case 0xb319: /* CDBR - compare */
4797         case 0xb348: /* KXBR - compare and signal */
4798         case 0xb349: /* CXBR - compare */
4799         case 0xb3e0: /* KDTR - compare and signal */
4800         case 0xb3e4: /* CDTR - compare */
4801         case 0xb3e8: /* KXTR - compare and signal */
4802         case 0xb3ec: /* CXTR - compare */
4803           /* flags + fpc only */
4804           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4805             return -1;
4806           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4807             return -1;
4808           break;
4809
4810         case 0xb302: /* LTEBR - load and test */
4811         case 0xb312: /* LTDBR - load and test */
4812         case 0xb30a: /* AEBR - add */
4813         case 0xb30b: /* SEBR - subtract */
4814         case 0xb31a: /* ADBR - add */
4815         case 0xb31b: /* SDBR - subtract */
4816         case 0xb3d2: /* ADTR - add */
4817         case 0xb3d3: /* SDTR - subtract */
4818         case 0xb3d6: /* LTDTR - load and test */
4819           /* float destination + flags + fpc */
4820           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4821             return -1;
4822           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4823             return -1;
4824           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4825             return -1;
4826           break;
4827
4828         case 0xb30e: /* MAEBR - multiply and add */
4829         case 0xb30f: /* MSEBR - multiply and subtract */
4830         case 0xb31e: /* MADBR - multiply and add */
4831         case 0xb31f: /* MSDBR - multiply and subtract */
4832           /* float destination [RRD] + fpc */
4833           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[4]))
4834             return -1;
4835           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4836             return -1;
4837           break;
4838
4839         /* 0xb320-0xb323 undefined */
4840         /* 0xb327-0xb32d undefined */
4841
4842         case 0xb32e: /* MAER - multiply and add */
4843         case 0xb32f: /* MSER - multiply and subtract */
4844         case 0xb338: /* MAYLR - multiply and add unnormalized */
4845         case 0xb339: /* MYLR - multiply unnormalized */
4846         case 0xb33c: /* MAYHR - multiply and add unnormalized */
4847         case 0xb33d: /* MYHR - multiply unnormalized */
4848         case 0xb33e: /* MADR - multiply and add */
4849         case 0xb33f: /* MSDR - multiply and subtract */
4850           /* float destination [RRD] */
4851           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[4]))
4852             return -1;
4853           break;
4854
4855         /* 0xb330-0xb335 undefined */
4856
4857         case 0xb33a: /* MAYR - multiply and add unnormalized */
4858         case 0xb33b: /* MYR - multiply unnormalized */
4859           /* float pair destination [RRD] */
4860           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[4]))
4861             return -1;
4862           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[4] | 2)))
4863             return -1;
4864           break;
4865
4866         case 0xb340: /* LPXBR - load positive */
4867         case 0xb341: /* LNXBR - load negative */
4868         case 0xb343: /* LCXBR - load complement */
4869         case 0xb360: /* LPXR - load positive */
4870         case 0xb361: /* LNXR - load negative */
4871         case 0xb362: /* LTXR - load and test */
4872         case 0xb363: /* LCXR - load complement */
4873           /* float pair destination + flags */
4874           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4875             return -1;
4876           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[6] | 2)))
4877             return -1;
4878           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4879             return -1;
4880           break;
4881
4882         case 0xb342: /* LTXBR - load and test */
4883         case 0xb34a: /* AXBR - add */
4884         case 0xb34b: /* SXBR - subtract */
4885         case 0xb3da: /* AXTR - add */
4886         case 0xb3db: /* SXTR - subtract */
4887         case 0xb3de: /* LTXTR - load and test */
4888           /* float pair destination + flags + fpc */
4889           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4890             return -1;
4891           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[6] | 2)))
4892             return -1;
4893           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4894             return -1;
4895           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4896             return -1;
4897           break;
4898
4899         /* 0xb34e-0xb34f undefined */
4900         /* 0xb352 undefined */
4901
4902         case 0xb353: /* DIEBR - divide to integer */
4903         case 0xb35b: /* DIDBR - divide to integer */
4904           /* two float destinations + flags + fpc */
4905           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[4]))
4906             return -1;
4907           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[6]))
4908             return -1;
4909           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4910             return -1;
4911           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4912             return -1;
4913           break;
4914
4915         /* 0xb354-0xb356 undefined */
4916         /* 0xb35a undefined */
4917
4918         /* 0xb35c-0xb35e undefined */
4919         /* 0xb364 undefined */
4920         /* 0xb368 undefined */
4921
4922         case 0xb369: /* CXR - compare */
4923         case 0xb3f4: /* CEDTR - compare biased exponent */
4924         case 0xb3fc: /* CEXTR - compare biased exponent */
4925         case 0xb920: /* CGR - compare */
4926         case 0xb921: /* CLGR - compare logical */
4927         case 0xb930: /* CGFR - compare */
4928         case 0xb931: /* CLGFR - compare logical */
4929         case 0xb9cd: /* CHHR - compare high */
4930         case 0xb9cf: /* CLHHR - compare logical high */
4931         case 0xb9dd: /* CHLR - compare high */
4932         case 0xb9df: /* CLHLR - compare logical high */
4933           /* flags only */
4934           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4935             return -1;
4936           break;
4937
4938         /* 0xb36a-0xb36f undefined */
4939         /* 0xb377-0xb37e undefined */
4940         /* 0xb380-0xb383 undefined */
4941         /* 0xb386-0xb38b undefined */
4942         /* 0xb38d-0xb38f undefined */
4943         /* 0xb393 undefined */
4944         /* 0xb397 undefined */
4945
4946         case 0xb398: /* CFEBR - convert to fixed */
4947         case 0xb399: /* CFDBR - convert to fixed */
4948         case 0xb39a: /* CFXBR - convert to fixed */
4949         case 0xb39c: /* CLFEBR - convert to logical */
4950         case 0xb39d: /* CLFDBR - convert to logical */
4951         case 0xb39e: /* CLFXBR - convert to logical */
4952         case 0xb941: /* CFDTR - convert to fixed */
4953         case 0xb949: /* CFXTR - convert to fixed */
4954         case 0xb943: /* CLFDTR - convert to logical */
4955         case 0xb94b: /* CLFXTR - convert to logical */
4956           /* 32-bit gpr destination + flags + fpc */
4957           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
4958             return -1;
4959           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4960             return -1;
4961           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4962             return -1;
4963           break;
4964
4965         /* 0xb39b undefined */
4966         /* 0xb39f undefined */
4967
4968         /* 0xb3a3 undefined */
4969         /* 0xb3a7 undefined */
4970
4971         case 0xb3a8: /* CGEBR - convert to fixed */
4972         case 0xb3a9: /* CGDBR - convert to fixed */
4973         case 0xb3aa: /* CGXBR - convert to fixed */
4974         case 0xb3ac: /* CLGEBR - convert to logical */
4975         case 0xb3ad: /* CLGDBR - convert to logical */
4976         case 0xb3ae: /* CLGXBR - convert to logical */
4977         case 0xb3e1: /* CGDTR - convert to fixed */
4978         case 0xb3e9: /* CGXTR - convert to fixed */
4979         case 0xb942: /* CLGDTR - convert to logical */
4980         case 0xb94a: /* CLGXTR - convert to logical */
4981           /* 64-bit gpr destination + flags + fpc */
4982           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
4983             return -1;
4984           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
4985             return -1;
4986           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
4987             return -1;
4988           break;
4989
4990         /* 0xb3ab undefined */
4991         /* 0xb3af-0xb3b3 undefined */
4992         /* 0xb3b7 undefined */
4993
4994         case 0xb3b8: /* CFER - convert to fixed */
4995         case 0xb3b9: /* CFDR - convert to fixed */
4996         case 0xb3ba: /* CFXR - convert to fixed */
4997         case 0xb998: /* ALCR - add logical with carry */
4998         case 0xb999: /* SLBR - subtract logical with borrow */
4999         case 0xb9f4: /* NRK - and */
5000         case 0xb9f6: /* ORK - or */
5001         case 0xb9f7: /* XRK - xor */
5002         case 0xb9f8: /* ARK - add */
5003         case 0xb9f9: /* SRK - subtract */
5004         case 0xb9fa: /* ALRK - add logical */
5005         case 0xb9fb: /* SLRK - subtract logical */
5006           /* 32-bit gpr destination + flags */
5007           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5008             return -1;
5009           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5010             return -1;
5011           break;
5012
5013         case 0xb3c8: /* CGER - convert to fixed */
5014         case 0xb3c9: /* CGDR - convert to fixed */
5015         case 0xb3ca: /* CGXR - convert to fixed */
5016         case 0xb900: /* LPGR - load positive */
5017         case 0xb901: /* LNGR - load negative */
5018         case 0xb902: /* LTGR - load and test */
5019         case 0xb903: /* LCGR - load complement */
5020         case 0xb908: /* AGR - add */
5021         case 0xb909: /* SGR - subtract */
5022         case 0xb90a: /* ALGR - add logical */
5023         case 0xb90b: /* SLGR - subtract logical */
5024         case 0xb910: /* LPGFR - load positive */
5025         case 0xb911: /* LNGFR - load negative */
5026         case 0xb912: /* LTGFR - load and test */
5027         case 0xb913: /* LCGFR - load complement */
5028         case 0xb918: /* AGFR - add */
5029         case 0xb919: /* SGFR - subtract */
5030         case 0xb91a: /* ALGFR - add logical */
5031         case 0xb91b: /* SLGFR - subtract logical */
5032         case 0xb980: /* NGR - and */
5033         case 0xb981: /* OGR - or */
5034         case 0xb982: /* XGR - xor */
5035         case 0xb988: /* ALCGR - add logical with carry */
5036         case 0xb989: /* SLBGR - subtract logical with borrow */
5037         case 0xb9e1: /* POPCNT - population count */
5038         case 0xb9e4: /* NGRK - and */
5039         case 0xb9e6: /* OGRK - or */
5040         case 0xb9e7: /* XGRK - xor */
5041         case 0xb9e8: /* AGRK - add */
5042         case 0xb9e9: /* SGRK - subtract */
5043         case 0xb9ea: /* ALGRK - add logical */
5044         case 0xb9eb: /* SLGRK - subtract logical */
5045         case 0xb9ed: /* MSGRKC - multiply single 64x64 -> 64 */
5046         case 0xb9fd: /* MSRKC - multiply single 32x32 -> 32 */
5047           /* 64-bit gpr destination + flags */
5048           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
5049             return -1;
5050           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5051             return -1;
5052           break;
5053
5054         /* 0xb3bb-0xb3c0 undefined */
5055         /* 0xb3c2-0xb3c3 undefined */
5056         /* 0xb3c7 undefined */
5057         /* 0xb3cb-0xb3cc undefined */
5058
5059         case 0xb3cd: /* LGDR - load gr from fpr */
5060         case 0xb3e2: /* CUDTR - convert to unsigned packed */
5061         case 0xb3e3: /* CSDTR - convert to signed packed */
5062         case 0xb3e5: /* EEDTR - extract biased exponent */
5063         case 0xb3e7: /* ESDTR - extract significance */
5064         case 0xb3ed: /* EEXTR - extract biased exponent */
5065         case 0xb3ef: /* ESXTR - extract significance */
5066         case 0xb904: /* LGR - load */
5067         case 0xb906: /* LGBR - load byte */
5068         case 0xb907: /* LGHR - load halfword */
5069         case 0xb90c: /* MSGR - multiply single */
5070         case 0xb90f: /* LRVGR - load reversed */
5071         case 0xb914: /* LGFR - load */
5072         case 0xb916: /* LLGFR - load logical */
5073         case 0xb917: /* LLGTR - load logical thirty one bits */
5074         case 0xb91c: /* MSGFR - multiply single 64<32 */
5075         case 0xb946: /* BCTGR - branch on count */
5076         case 0xb984: /* LLGCR - load logical character */
5077         case 0xb985: /* LLGHR - load logical halfword */
5078         case 0xb9e2: /* LOCGR - load on condition */
5079           /* 64-bit gpr destination  */
5080           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
5081             return -1;
5082           break;
5083
5084         /* 0xb3ce-0xb3cf undefined */
5085         /* 0xb3e6 undefined */
5086
5087         case 0xb3ea: /* CUXTR - convert to unsigned packed */
5088         case 0xb3eb: /* CSXTR - convert to signed packed */
5089         case 0xb90d: /* DSGR - divide single */
5090         case 0xb91d: /* DSGFR - divide single */
5091         case 0xb986: /* MLGR - multiply logical */
5092         case 0xb987: /* DLGR - divide logical */
5093         case 0xb9ec: /* MGRK - multiply 64x64 -> 128 */
5094           /* 64-bit gpr pair destination  */
5095           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
5096             return -1;
5097           if (s390_record_gpr_g (gdbarch, regcache, inib[6] | 1))
5098             return -1;
5099           break;
5100
5101         /* 0xb3ee undefined */
5102         /* 0xb3f0 undefined */
5103         /* 0xb3f8 undefined */
5104
5105         /* 0xb905 privileged */
5106
5107         /* 0xb90e unsupported: EREGG */
5108
5109         /* 0xb915 undefined */
5110
5111         case 0xb91e: /* KMAC - compute message authentication code [partial] */
5112           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5113           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5114           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5115           tmp &= 0xff;
5116           switch (tmp)
5117             {
5118               case 0x00: /* KMAC-Query */
5119                 if (record_full_arch_list_add_mem (oaddr, 16))
5120                   return -1;
5121                 break;
5122
5123               case 0x01: /* KMAC-DEA */
5124               case 0x02: /* KMAC-TDEA-128 */
5125               case 0x03: /* KMAC-TDEA-192 */
5126               case 0x09: /* KMAC-Encrypted-DEA */
5127               case 0x0a: /* KMAC-Encrypted-TDEA-128 */
5128               case 0x0b: /* KMAC-Encrypted-TDEA-192 */
5129                 if (record_full_arch_list_add_mem (oaddr, 8))
5130                   return -1;
5131                 break;
5132
5133               case 0x12: /* KMAC-AES-128 */
5134               case 0x13: /* KMAC-AES-192 */
5135               case 0x14: /* KMAC-AES-256 */
5136               case 0x1a: /* KMAC-Encrypted-AES-128 */
5137               case 0x1b: /* KMAC-Encrypted-AES-192 */
5138               case 0x1c: /* KMAC-Encrypted-AES-256 */
5139                 if (record_full_arch_list_add_mem (oaddr, 16))
5140                   return -1;
5141                 break;
5142
5143               default:
5144                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown KMAC function %02x at %s.\n",
5145                                     (int)tmp, paddress (gdbarch, addr));
5146                 return -1;
5147             }
5148           if (tmp != 0)
5149             {
5150               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5151                 return -1;
5152               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
5153                 return -1;
5154             }
5155           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5156             return -1;
5157           break;
5158
5159         /* 0xb922-0xb924 undefined */
5160         /* 0xb925 privileged */
5161         /* 0xb928 privileged */
5162
5163         case 0xb929: /* KMA - cipher message with authentication */
5164         case 0xb92a: /* KMF - cipher message with cipher feedback [partial] */
5165         case 0xb92b: /* KMO - cipher message with output feedback [partial] */
5166         case 0xb92f: /* KMC - cipher message with chaining [partial] */
5167           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5168           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5169           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5170           tmp &= 0x7f;
5171           switch (tmp)
5172             {
5173               case 0x00: /* KM*-Query */
5174                 if (record_full_arch_list_add_mem (oaddr, 16))
5175                   return -1;
5176                 break;
5177
5178               case 0x01: /* KM*-DEA */
5179               case 0x02: /* KM*-TDEA-128 */
5180               case 0x03: /* KM*-TDEA-192 */
5181               case 0x09: /* KM*-Encrypted-DEA */
5182               case 0x0a: /* KM*-Encrypted-TDEA-128 */
5183               case 0x0b: /* KM*-Encrypted-TDEA-192 */
5184                 if (record_full_arch_list_add_mem (oaddr, 8))
5185                   return -1;
5186                 break;
5187
5188               case 0x12: /* KM*-AES-128 */
5189               case 0x13: /* KM*-AES-192 */
5190               case 0x14: /* KM*-AES-256 */
5191               case 0x1a: /* KM*-Encrypted-AES-128 */
5192               case 0x1b: /* KM*-Encrypted-AES-192 */
5193               case 0x1c: /* KM*-Encrypted-AES-256 */
5194                 if (record_full_arch_list_add_mem (oaddr, 16))
5195                   return -1;
5196                 break;
5197
5198               case 0x43: /* KMC-PRNG */
5199                 /* Only valid for KMC.  */
5200                 if (insn[0] == 0xb92f)
5201                   {
5202                     if (record_full_arch_list_add_mem (oaddr, 8))
5203                       return -1;
5204                     break;
5205                   }
5206                 /* For other instructions, fallthru.  */
5207               default:
5208                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown KM* function %02x at %s.\n",
5209                                     (int)tmp, paddress (gdbarch, addr));
5210                 return -1;
5211             }
5212           if (tmp != 0)
5213             {
5214               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
5215               oaddr2 = s390_record_address_mask (gdbarch, regcache, tmp);
5216               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[7] | 1), &tmp);
5217               if (record_full_arch_list_add_mem (oaddr2, tmp))
5218                 return -1;
5219               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5220                 return -1;
5221               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5222                 return -1;
5223               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
5224                 return -1;
5225             }
5226           if (tmp != 0 && insn[0] == 0xb929)
5227             {
5228               if (record_full_arch_list_add_reg (regcache,
5229                                                  S390_R0_REGNUM + inib[4]))
5230                 return -1;
5231               if (record_full_arch_list_add_reg (regcache,
5232                                                  S390_R0_REGNUM + (inib[4] | 1)))
5233                 return -1;
5234             }
5235           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5236             return -1;
5237           break;
5238
5239         case 0xb92c: /* PCC - perform cryptographic computation [partial] */
5240           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5241           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5242           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5243           tmp &= 0x7f;
5244           switch (tmp)
5245             {
5246               case 0x00: /* PCC-Query */
5247                 if (record_full_arch_list_add_mem (oaddr, 16))
5248                   return -1;
5249                 break;
5250
5251               case 0x01: /* PCC-Compute-Last-Block-CMAC-Using-DEA */
5252               case 0x02: /* PCC-Compute-Last-Block-CMAC-Using-TDEA-128 */
5253               case 0x03: /* PCC-Compute-Last-Block-CMAC-Using-TDEA-192 */
5254               case 0x09: /* PCC-Compute-Last-Block-CMAC-Using-Encrypted-DEA */
5255               case 0x0a: /* PCC-Compute-Last-Block-CMAC-Using-Encrypted-TDEA-128 */
5256               case 0x0b: /* PCC-Compute-Last-Block-CMAC-Using-Encrypted-TDEA-192 */
5257                 if (record_full_arch_list_add_mem (oaddr + 0x10, 8))
5258                   return -1;
5259                 break;
5260
5261               case 0x12: /* PCC-Compute-Last-Block-CMAC-Using-AES-128 */
5262               case 0x13: /* PCC-Compute-Last-Block-CMAC-Using-AES-192 */
5263               case 0x14: /* PCC-Compute-Last-Block-CMAC-Using-AES-256 */
5264               case 0x1a: /* PCC-Compute-Last-Block-CMAC-Using-Encrypted-AES-128 */
5265               case 0x1b: /* PCC-Compute-Last-Block-CMAC-Using-Encrypted-AES-192 */
5266               case 0x1c: /* PCC-Compute-Last-Block-CMAC-Using-Encrypted-AES-256 */
5267                 if (record_full_arch_list_add_mem (oaddr + 0x18, 16))
5268                   return -1;
5269                 break;
5270
5271               case 0x32: /* PCC-Compute-XTS-Parameter-Using-AES-128 */
5272                 if (record_full_arch_list_add_mem (oaddr + 0x30, 32))
5273                   return -1;
5274                 break;
5275
5276               case 0x34: /* PCC-Compute-XTS-Parameter-Using-AES-256 */
5277                 if (record_full_arch_list_add_mem (oaddr + 0x40, 32))
5278                   return -1;
5279                 break;
5280
5281               case 0x3a: /* PCC-Compute-XTS-Parameter-Using-Encrypted-AES-128 */
5282                 if (record_full_arch_list_add_mem (oaddr + 0x50, 32))
5283                   return -1;
5284                 break;
5285
5286               case 0x3c: /* PCC-Compute-XTS-Parameter-Using-Encrypted-AES-256 */
5287                 if (record_full_arch_list_add_mem (oaddr + 0x60, 32))
5288                   return -1;
5289                 break;
5290
5291               default:
5292                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown PCC function %02x at %s.\n",
5293                                     (int)tmp, paddress (gdbarch, addr));
5294                 return -1;
5295             }
5296           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5297             return -1;
5298           break;
5299
5300         case 0xb92d: /* KMCTR - cipher message with counter [partial] */
5301           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5302           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5303           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5304           tmp &= 0x7f;
5305           switch (tmp)
5306             {
5307               case 0x00: /* KMCTR-Query */
5308                 if (record_full_arch_list_add_mem (oaddr, 16))
5309                   return -1;
5310                 break;
5311
5312               case 0x01: /* KMCTR-DEA */
5313               case 0x02: /* KMCTR-TDEA-128 */
5314               case 0x03: /* KMCTR-TDEA-192 */
5315               case 0x09: /* KMCTR-Encrypted-DEA */
5316               case 0x0a: /* KMCTR-Encrypted-TDEA-128 */
5317               case 0x0b: /* KMCTR-Encrypted-TDEA-192 */
5318               case 0x12: /* KMCTR-AES-128 */
5319               case 0x13: /* KMCTR-AES-192 */
5320               case 0x14: /* KMCTR-AES-256 */
5321               case 0x1a: /* KMCTR-Encrypted-AES-128 */
5322               case 0x1b: /* KMCTR-Encrypted-AES-192 */
5323               case 0x1c: /* KMCTR-Encrypted-AES-256 */
5324                 break;
5325
5326               default:
5327                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown KMCTR function %02x at %s.\n",
5328                                     (int)tmp, paddress (gdbarch, addr));
5329                 return -1;
5330             }
5331           if (tmp != 0)
5332             {
5333               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
5334               oaddr2 = s390_record_address_mask (gdbarch, regcache, tmp);
5335               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[7] | 1), &tmp);
5336               if (record_full_arch_list_add_mem (oaddr2, tmp))
5337                 return -1;
5338               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5339                 return -1;
5340               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5341                 return -1;
5342               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
5343                 return -1;
5344               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[4]))
5345                 return -1;
5346             }
5347           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5348             return -1;
5349           break;
5350
5351         case 0xb92e: /* KM - cipher message [partial] */
5352           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5353           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5354           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5355           tmp &= 0x7f;
5356           switch (tmp)
5357             {
5358               case 0x00: /* KM-Query */
5359                 if (record_full_arch_list_add_mem (oaddr, 16))
5360                   return -1;
5361                 break;
5362
5363               case 0x01: /* KM-DEA */
5364               case 0x02: /* KM-TDEA-128 */
5365               case 0x03: /* KM-TDEA-192 */
5366               case 0x09: /* KM-Encrypted-DEA */
5367               case 0x0a: /* KM-Encrypted-TDEA-128 */
5368               case 0x0b: /* KM-Encrypted-TDEA-192 */
5369               case 0x12: /* KM-AES-128 */
5370               case 0x13: /* KM-AES-192 */
5371               case 0x14: /* KM-AES-256 */
5372               case 0x1a: /* KM-Encrypted-AES-128 */
5373               case 0x1b: /* KM-Encrypted-AES-192 */
5374               case 0x1c: /* KM-Encrypted-AES-256 */
5375                 break;
5376
5377               case 0x32: /* KM-XTS-AES-128 */
5378                 if (record_full_arch_list_add_mem (oaddr + 0x10, 16))
5379                   return -1;
5380                 break;
5381
5382               case 0x34: /* KM-XTS-AES-256 */
5383                 if (record_full_arch_list_add_mem (oaddr + 0x20, 16))
5384                   return -1;
5385                 break;
5386
5387               case 0x3a: /* KM-XTS-Encrypted-AES-128 */
5388                 if (record_full_arch_list_add_mem (oaddr + 0x30, 16))
5389                   return -1;
5390                 break;
5391
5392               case 0x3c: /* KM-XTS-Encrypted-AES-256 */
5393                 if (record_full_arch_list_add_mem (oaddr + 0x40, 16))
5394                   return -1;
5395                 break;
5396
5397               default:
5398                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown KM function %02x at %s.\n",
5399                                     (int)tmp, paddress (gdbarch, addr));
5400                 return -1;
5401             }
5402           if (tmp != 0)
5403             {
5404               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
5405               oaddr2 = s390_record_address_mask (gdbarch, regcache, tmp);
5406               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[7] | 1), &tmp);
5407               if (record_full_arch_list_add_mem (oaddr2, tmp))
5408                 return -1;
5409               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5410                 return -1;
5411               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5412                 return -1;
5413               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
5414                 return -1;
5415             }
5416           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5417             return -1;
5418           break;
5419
5420         /* 0xb932-0xb93b undefined */
5421
5422         case 0xb93c: /* PPNO - perform pseudorandom number operation [partial] */
5423           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5424           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5425           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5426           tmp &= 0xff;
5427           switch (tmp)
5428             {
5429               case 0x00: /* PPNO-Query */
5430               case 0x80: /* PPNO-Query */
5431                 if (record_full_arch_list_add_mem (oaddr, 16))
5432                   return -1;
5433                 break;
5434
5435               case 0x03: /* PPNO-SHA-512-DRNG - generate */
5436                 if (record_full_arch_list_add_mem (oaddr, 240))
5437                   return -1;
5438                 regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
5439                 oaddr2 = s390_record_address_mask (gdbarch, regcache, tmp);
5440                 regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[6] | 1), &tmp);
5441                 if (record_full_arch_list_add_mem (oaddr2, tmp))
5442                   return -1;
5443                 if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5444                   return -1;
5445                 if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
5446                   return -1;
5447                 break;
5448
5449               case 0x83: /* PPNO-SHA-512-DRNG - seed */
5450                 if (record_full_arch_list_add_mem (oaddr, 240))
5451                   return -1;
5452                 if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5453                   return -1;
5454                 if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
5455                   return -1;
5456                 break;
5457
5458               default:
5459                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown PPNO function %02x at %s.\n",
5460                                     (int)tmp, paddress (gdbarch, addr));
5461                 return -1;
5462             }
5463           /* DXC may be written */
5464           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
5465             return -1;
5466           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5467             return -1;
5468           break;
5469
5470         /* 0xb93d undefined */
5471
5472         case 0xb93e: /* KIMD - compute intermediate message digest [partial] */
5473         case 0xb93f: /* KLMD - compute last message digest [partial] */
5474           regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
5475           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5476           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5477           tmp &= 0xff;
5478           switch (tmp)
5479             {
5480               case 0x00: /* K*MD-Query */
5481                 if (record_full_arch_list_add_mem (oaddr, 16))
5482                   return -1;
5483                 break;
5484
5485               case 0x01: /* K*MD-SHA-1 */
5486                 if (record_full_arch_list_add_mem (oaddr, 20))
5487                   return -1;
5488                 break;
5489
5490               case 0x02: /* K*MD-SHA-256 */
5491                 if (record_full_arch_list_add_mem (oaddr, 32))
5492                   return -1;
5493                 break;
5494
5495               case 0x03: /* K*MD-SHA-512 */
5496                 if (record_full_arch_list_add_mem (oaddr, 64))
5497                   return -1;
5498                 break;
5499
5500               case 0x41: /* KIMD-GHASH */
5501                 /* Only valid for KIMD.  */
5502                 if (insn[0] == 0xb93e)
5503                   {
5504                     if (record_full_arch_list_add_mem (oaddr, 16))
5505                       return -1;
5506                     break;
5507                   }
5508                 /* For KLMD, fallthru.  */
5509               default:
5510                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown KMAC function %02x at %s.\n",
5511                                     (int)tmp, paddress (gdbarch, addr));
5512                 return -1;
5513             }
5514           if (tmp != 0)
5515             {
5516               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5517                 return -1;
5518               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
5519                 return -1;
5520             }
5521           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5522             return -1;
5523           break;
5524
5525         /* 0xb940 undefined */
5526         /* 0xb944-0xb945 undefined */
5527         /* 0xb947-0xb948 undefined */
5528         /* 0xb94c-0xb950 undefined */
5529         /* 0xb954-0xb958 undefined */
5530         /* 0xb95c-0xb95f undefined */
5531         /* 0xb962-0xb971 undefined */
5532         /* 0xb974-0xb97f undefined */
5533
5534         case 0xb983: /* FLOGR - find leftmost one */
5535           /* 64-bit gpr pair destination + flags */
5536           if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
5537             return -1;
5538           if (s390_record_gpr_g (gdbarch, regcache, inib[6] | 1))
5539             return -1;
5540           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5541             return -1;
5542           break;
5543
5544         /* 0xb98a privileged */
5545         /* 0xb98b-0xb98c undefined */
5546
5547         case 0xb98d: /* EPSW - extract psw */
5548           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5549             return -1;
5550           if (inib[7])
5551             if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5552               return -1;
5553           break;
5554
5555         /* 0xb98e-0xb98f privileged */
5556
5557         case 0xb990: /* TRTT - translate two to two [partial] */
5558         case 0xb991: /* TRTO - translate two to one [partial] */
5559         case 0xb992: /* TROT - translate one to two [partial] */
5560         case 0xb993: /* TROO - translate one to one [partial] */
5561           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[6], &tmp);
5562           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
5563           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[6] | 1), &tmp);
5564           /* tmp is source length, we want destination length.  Adjust.  */
5565           if (insn[0] == 0xb991)
5566             tmp >>= 1;
5567           if (insn[0] == 0xb992)
5568             tmp <<= 1;
5569           if (record_full_arch_list_add_mem (oaddr, tmp))
5570             return -1;
5571           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5572             return -1;
5573           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
5574             return -1;
5575           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5576             return -1;
5577           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5578             return -1;
5579           break;
5580
5581         case 0xb996: /* MLR - multiply logical */
5582         case 0xb997: /* DLR - divide logical */
5583           /* 32-bit gpr pair destination  */
5584           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5585             return -1;
5586           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
5587             return -1;
5588           break;
5589
5590         /* 0xb99a-0xb9af unsupported, privileged, or undefined */
5591         /* 0xb9b4-0xb9bc undefined */
5592
5593         case 0xb9bd: /* TRTRE - translate and test reverse extended [partial] */
5594         case 0xb9bf: /* TRTE - translate and test extended [partial] */
5595           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[6]))
5596             return -1;
5597           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[6] | 1)))
5598             return -1;
5599           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[7]))
5600             return -1;
5601           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5602             return -1;
5603           break;
5604
5605         /* 0xb9c0-0xb9c7 undefined */
5606
5607         case 0xb9c8: /* AHHHR - add high */
5608         case 0xb9c9: /* SHHHR - subtract high */
5609         case 0xb9ca: /* ALHHHR - add logical high */
5610         case 0xb9cb: /* SLHHHR - subtract logical high */
5611         case 0xb9d8: /* AHHLR - add high */
5612         case 0xb9d9: /* SHHLR - subtract high */
5613         case 0xb9da: /* ALHHLR - add logical high */
5614         case 0xb9db: /* SLHHLR - subtract logical high */
5615           /* 32-bit high gpr destination + flags */
5616           if (s390_record_gpr_h (gdbarch, regcache, inib[6]))
5617             return -1;
5618           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5619             return -1;
5620           break;
5621
5622         /* 0xb9cc undefined */
5623         /* 0xb9ce undefined */
5624         /* 0xb9d0-0xb9d7 undefined */
5625         /* 0xb9dc undefined */
5626         /* 0xb9de undefined */
5627
5628         case 0xb9e0: /* LOCFHR - load high on condition */
5629           /* 32-bit high gpr destination */
5630           if (s390_record_gpr_h (gdbarch, regcache, inib[6]))
5631             return -1;
5632           break;
5633
5634         /* 0xb9e3 undefined */
5635         /* 0xb9e5 undefined */
5636         /* 0xb9ee-0xb9f1 undefined */
5637         /* 0xb9f3 undefined */
5638         /* 0xb9f5 undefined */
5639         /* 0xb9fc undefined */
5640         /* 0xb9fe -0xb9ff undefined */
5641
5642         default:
5643           goto UNKNOWN_OP;
5644         }
5645       break;
5646
5647     /* 0xb4-0xb5 undefined */
5648     /* 0xb6 privileged: STCTL - store control */
5649     /* 0xb7 privileged: LCTL - load control */
5650     /* 0xb8 undefined */
5651
5652     case 0xba: /* CS - compare and swap */
5653       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5654       if (record_full_arch_list_add_mem (oaddr, 4))
5655         return -1;
5656       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
5657         return -1;
5658       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5659         return -1;
5660       break;
5661
5662     case 0xbb: /* CDS - compare double and swap */
5663       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5664       if (record_full_arch_list_add_mem (oaddr, 8))
5665         return -1;
5666       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
5667         return -1;
5668       if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
5669         return -1;
5670       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5671         return -1;
5672       break;
5673
5674     /* 0xbc undefined */
5675
5676     case 0xbe: /* STCM - store characters under mask */
5677       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5678       if (record_full_arch_list_add_mem (oaddr, s390_popcnt (inib[3])))
5679         return -1;
5680       break;
5681
5682     case 0xc0:
5683     case 0xc2:
5684     case 0xc4:
5685     case 0xc6:
5686     case 0xcc:
5687       /* RIL-format instruction */
5688       switch (ibyte[0] << 4 | inib[3])
5689         {
5690         case 0xc00: /* LARL - load address relative long */
5691         case 0xc05: /* BRASL - branch relative and save long */
5692         case 0xc09: /* IILF - insert immediate */
5693         case 0xc21: /* MSFI - multiply single immediate */
5694         case 0xc42: /* LLHRL - load logical halfword relative long */
5695         case 0xc45: /* LHRL - load halfword relative long */
5696         case 0xc4d: /* LRL - load relative long */
5697           /* 32-bit or native gpr destination */
5698           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
5699             return -1;
5700           break;
5701
5702         case 0xc01: /* LGFI - load immediate */
5703         case 0xc0e: /* LLIHF - load logical immediate */
5704         case 0xc0f: /* LLILF - load logical immediate */
5705         case 0xc20: /* MSGFI - multiply single immediate */
5706         case 0xc44: /* LGHRL - load halfword relative long */
5707         case 0xc46: /* LLGHRL - load logical halfword relative long */
5708         case 0xc48: /* LGRL - load relative long */
5709         case 0xc4c: /* LGFRL - load relative long */
5710         case 0xc4e: /* LLGFRL - load logical relative long */
5711           /* 64-bit gpr destination */
5712           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
5713             return -1;
5714           break;
5715
5716         /* 0xc02-0xc03 undefined */
5717
5718         case 0xc04: /* BRCL - branch relative on condition long */
5719         case 0xc62: /* PFDRL - prefetch data relative long */
5720           break;
5721
5722         case 0xc06: /* XIHF - xor immediate */
5723         case 0xc0a: /* NIHF - and immediate */
5724         case 0xc0c: /* OIHF - or immediate */
5725         case 0xcc8: /* AIH - add immediate high */
5726         case 0xcca: /* ALSIH - add logical with signed immediate high */
5727           /* 32-bit high gpr destination + flags */
5728           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
5729             return -1;
5730           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5731             return -1;
5732           break;
5733
5734         case 0xc07: /* XILF - xor immediate */
5735         case 0xc0b: /* NILF - and immediate */
5736         case 0xc0d: /* OILF - or immediate */
5737         case 0xc25: /* SLFI - subtract logical immediate */
5738         case 0xc29: /* AFI - add immediate */
5739         case 0xc2b: /* ALFI - add logical immediate */
5740           /* 32-bit gpr destination + flags */
5741           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
5742             return -1;
5743           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5744             return -1;
5745           break;
5746
5747         case 0xc08: /* IIHF - insert immediate */
5748         case 0xcc6: /* BRCTH - branch relative on count high */
5749         case 0xccb: /* ALSIHN - add logical with signed immediate high */
5750           /* 32-bit high gpr destination */
5751           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
5752             return -1;
5753           break;
5754
5755         /* 0xc22-0xc23 undefined */
5756
5757         case 0xc24: /* SLGFI - subtract logical immediate */
5758         case 0xc28: /* AGFI - add immediate */
5759         case 0xc2a: /* ALGFI - add logical immediate */
5760           /* 64-bit gpr destination + flags */
5761           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
5762             return -1;
5763           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5764             return -1;
5765           break;
5766
5767         /* 0xc26-0xc27 undefined */
5768
5769         case 0xc2c: /* CGFI - compare immediate */
5770         case 0xc2d: /* CFI - compare immediate */
5771         case 0xc2e: /* CLGFI - compare logical immediate */
5772         case 0xc2f: /* CLFI - compare logical immediate */
5773         case 0xc64: /* CGHRL - compare halfword relative long */
5774         case 0xc65: /* CHRL - compare halfword relative long */
5775         case 0xc66: /* CLGHRL - compare logical halfword relative long */
5776         case 0xc67: /* CLHRL - compare logical halfword relative long */
5777         case 0xc68: /* CGRL - compare relative long */
5778         case 0xc6a: /* CLGRL - compare logical relative long */
5779         case 0xc6c: /* CGFRL - compare relative long */
5780         case 0xc6d: /* CRL - compare relative long */
5781         case 0xc6e: /* CLGFRL - compare logical relative long */
5782         case 0xc6f: /* CLRL - compare logical relative long */
5783         case 0xccd: /* CIH - compare immediate high */
5784         case 0xccf: /* CLIH - compare logical immediate high */
5785           /* flags only */
5786           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5787             return -1;
5788           break;
5789
5790         /* 0xc40-0xc41 undefined */
5791         /* 0xc43 undefined */
5792
5793         case 0xc47: /* STHRL - store halfword relative long */
5794           oaddr = s390_record_calc_rl (gdbarch, regcache, addr, insn[1], insn[2]);
5795           if (record_full_arch_list_add_mem (oaddr, 2))
5796             return -1;
5797           break;
5798
5799         /* 0xc49-0xc4a undefined */
5800
5801         case 0xc4b: /* STGRL - store relative long */
5802           oaddr = s390_record_calc_rl (gdbarch, regcache, addr, insn[1], insn[2]);
5803           if (record_full_arch_list_add_mem (oaddr, 8))
5804             return -1;
5805           break;
5806
5807         case 0xc4f: /* STRL - store relative long */
5808           oaddr = s390_record_calc_rl (gdbarch, regcache, addr, insn[1], insn[2]);
5809           if (record_full_arch_list_add_mem (oaddr, 4))
5810             return -1;
5811           break;
5812
5813         case 0xc60: /* EXRL - execute relative long */
5814           if (ex != -1)
5815             {
5816               fprintf_unfiltered (gdb_stdlog, "Warning: Double execute at %s.\n",
5817                                   paddress (gdbarch, addr));
5818               return -1;
5819             }
5820           addr = s390_record_calc_rl (gdbarch, regcache, addr, insn[1], insn[2]);
5821           if (inib[2])
5822             {
5823               regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[2], &tmp);
5824               ex = tmp & 0xff;
5825             }
5826           else
5827             {
5828               ex = 0;
5829             }
5830           goto ex;
5831
5832         /* 0xc61 undefined */
5833         /* 0xc63 undefined */
5834         /* 0xc69 undefined */
5835         /* 0xc6b undefined */
5836         /* 0xcc0-0xcc5 undefined */
5837         /* 0xcc7 undefined */
5838         /* 0xcc9 undefined */
5839         /* 0xccc undefined */
5840         /* 0xcce undefined */
5841
5842         default:
5843           goto UNKNOWN_OP;
5844         }
5845       break;
5846
5847     /* 0xc1 undefined */
5848     /* 0xc3 undefined */
5849
5850     case 0xc5: /* BPRP - branch prediction relative preload */
5851     case 0xc7: /* BPP - branch prediction preload */
5852       /* no visible effect */
5853       break;
5854
5855     case 0xc8:
5856       /* SSF-format instruction */
5857       switch (ibyte[0] << 4 | inib[3])
5858         {
5859         /* 0xc80 unsupported */
5860
5861         case 0xc81: /* ECTG - extract cpu time */
5862           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
5863             return -1;
5864           if (s390_record_gpr_g (gdbarch, regcache, 0))
5865             return -1;
5866           if (s390_record_gpr_g (gdbarch, regcache, 1))
5867             return -1;
5868           break;
5869
5870         case 0xc82: /* CSST - compare and swap and store */
5871           {
5872             uint8_t fc, sc;
5873             regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
5874             fc = tmp & 0xff;
5875             sc = tmp >> 8 & 0xff;
5876
5877             /* First and third operands.  */
5878             oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5879             switch (fc)
5880               {
5881                 case 0x00: /* 32-bit */
5882                   if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
5883                     return -1;
5884                   if (record_full_arch_list_add_mem (oaddr, 4))
5885                     return -1;
5886                   break;
5887
5888                 case 0x01: /* 64-bit */
5889                   if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
5890                     return -1;
5891                   if (record_full_arch_list_add_mem (oaddr, 8))
5892                     return -1;
5893                   break;
5894
5895                 case 0x02: /* 128-bit */
5896                   if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
5897                     return -1;
5898                   if (s390_record_gpr_g (gdbarch, regcache, inib[2] | 1))
5899                     return -1;
5900                   if (record_full_arch_list_add_mem (oaddr, 16))
5901                     return -1;
5902                   break;
5903
5904                 default:
5905                   fprintf_unfiltered (gdb_stdlog, "Warning: Unknown CSST FC %02x at %s.\n",
5906                                       fc, paddress (gdbarch, addr));
5907                   return -1;
5908               }
5909
5910             /* Second operand.  */
5911             oaddr2 = s390_record_calc_disp (gdbarch, regcache, 0, insn[2], 0);
5912             if (sc > 4)
5913               {
5914                 fprintf_unfiltered (gdb_stdlog, "Warning: Unknown CSST FC %02x at %s.\n",
5915                                     sc, paddress (gdbarch, addr));
5916                 return -1;
5917               }
5918
5919             if (record_full_arch_list_add_mem (oaddr2, 1 << sc))
5920               return -1;
5921
5922             /* Flags.  */
5923             if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5924               return -1;
5925           }
5926           break;
5927
5928         /* 0xc83 undefined */
5929
5930         case 0xc84: /* LPD - load pair disjoint */
5931           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
5932             return -1;
5933           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
5934             return -1;
5935           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5936             return -1;
5937           break;
5938
5939         case 0xc85: /* LPDG - load pair disjoint */
5940           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
5941             return -1;
5942           if (s390_record_gpr_g (gdbarch, regcache, inib[2] | 1))
5943             return -1;
5944           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5945             return -1;
5946           break;
5947
5948         /* 0xc86-0xc8f undefined */
5949
5950         default:
5951           goto UNKNOWN_OP;
5952         }
5953       break;
5954
5955     /* 0xc9-0xcb undefined */
5956     /* 0xcd-0xcf undefined */
5957
5958     case 0xd0: /* TRTR - translate and test reversed */
5959     case 0xdd: /* TRT - translate and test */
5960       if (record_full_arch_list_add_reg (regcache, S390_R1_REGNUM))
5961         return -1;
5962       if (record_full_arch_list_add_reg (regcache, S390_R2_REGNUM))
5963         return -1;
5964       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5965         return -1;
5966       break;
5967
5968     case 0xd1: /* MVN - move numbers */
5969     case 0xd2: /* MVC - move */
5970     case 0xd3: /* MVZ - move zones */
5971     case 0xdc: /* TR - translate */
5972     case 0xe8: /* MVCIN - move inverse */
5973       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5974       if (record_full_arch_list_add_mem (oaddr, ibyte[1] + 1))
5975         return -1;
5976       break;
5977
5978     case 0xd4: /* NC - and */
5979     case 0xd6: /* OC - or*/
5980     case 0xd7: /* XC - xor */
5981     case 0xe2: /* UNPKU - unpack unicode */
5982     case 0xea: /* UNPKA - unpack ASCII */
5983       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5984       if (record_full_arch_list_add_mem (oaddr, ibyte[1] + 1))
5985         return -1;
5986       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5987         return -1;
5988       break;
5989
5990     case 0xde: /* ED - edit */
5991       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
5992       if (record_full_arch_list_add_mem (oaddr, ibyte[1] + 1))
5993         return -1;
5994       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
5995         return -1;
5996       /* DXC may be written */
5997       if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
5998         return -1;
5999       break;
6000
6001     case 0xdf: /* EDMK - edit and mark */
6002       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
6003       if (record_full_arch_list_add_mem (oaddr, ibyte[1] + 1))
6004         return -1;
6005       if (record_full_arch_list_add_reg (regcache, S390_R1_REGNUM))
6006         return -1;
6007       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6008         return -1;
6009       /* DXC may be written */
6010       if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6011         return -1;
6012       break;
6013
6014     /* 0xd8 undefined */
6015     /* 0xd9 unsupported: MVCK - move with key */
6016     /* 0xda unsupported: MVCP - move to primary */
6017     /* 0xdb unsupported: MVCS - move to secondary */
6018     /* 0xe0 undefined */
6019
6020     case 0xe1: /* PKU - pack unicode */
6021     case 0xe9: /* PKA - pack ASCII */
6022       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
6023       if (record_full_arch_list_add_mem (oaddr, 16))
6024         return -1;
6025       break;
6026
6027     case 0xe3:
6028     case 0xe6:
6029     case 0xe7:
6030     case 0xeb:
6031     case 0xed:
6032       /* RXY/RXE/RXF/RSL/RSY/SIY/V*-format instruction */
6033       switch (ibyte[0] << 8 | ibyte[5])
6034         {
6035         /* 0xe300-0xe301 undefined */
6036
6037         case 0xe302: /* LTG - load and test */
6038         case 0xe308: /* AG - add */
6039         case 0xe309: /* SG - subtract */
6040         case 0xe30a: /* ALG - add logical */
6041         case 0xe30b: /* SLG - subtract logical */
6042         case 0xe318: /* AGF - add */
6043         case 0xe319: /* SGF - subtract */
6044         case 0xe31a: /* ALGF - add logical */
6045         case 0xe31b: /* SLGF - subtract logical */
6046         case 0xe332: /* LTGF - load and test */
6047         case 0xe380: /* NG - and */
6048         case 0xe381: /* OG - or */
6049         case 0xe382: /* XG - xor */
6050         case 0xe388: /* ALCG - add logical with carry */
6051         case 0xe389: /* SLBG - subtract logical with borrow */
6052         case 0xeb0a: /* SRAG - shift right single */
6053         case 0xeb0b: /* SLAG - shift left single */
6054           /* 64-bit gpr destination + flags */
6055           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6056             return -1;
6057           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6058             return -1;
6059           break;
6060
6061         /* 0xe303 privileged */
6062
6063         case 0xe304: /* LG - load */
6064         case 0xe30c: /* MSG - multiply single */
6065         case 0xe30f: /* LRVG - load reversed */
6066         case 0xe314: /* LGF - load */
6067         case 0xe315: /* LGH - load halfword */
6068         case 0xe316: /* LLGF - load logical */
6069         case 0xe317: /* LLGT - load logical thirty one bits */
6070         case 0xe31c: /* MSGF - multiply single */
6071         case 0xe32a: /* LZRG - load and zero rightmost byte */
6072         case 0xe33a: /* LLZRGF - load logical and zero rightmost byte */
6073         case 0xe33c: /* MGH - multiply halfword 64x16mem -> 64 */
6074         case 0xe346: /* BCTG - branch on count */
6075         case 0xe377: /* LGB - load byte */
6076         case 0xe390: /* LLGC - load logical character */
6077         case 0xe391: /* LLGH - load logical halfword */
6078         case 0xeb0c: /* SRLG - shift right single logical */
6079         case 0xeb0d: /* SLLG - shift left single logical */
6080         case 0xeb1c: /* RLLG - rotate left single logical */
6081         case 0xeb44: /* BXHG - branch on index high */
6082         case 0xeb45: /* BXLEG - branch on index low or equal */
6083         case 0xeb4c: /* ECAG - extract cpu attribute */
6084         case 0xebe2: /* LOCG - load on condition */
6085           /* 64-bit gpr destination */
6086           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6087             return -1;
6088           break;
6089
6090         /* 0xe305 undefined */
6091
6092         case 0xe306: /* CVBY - convert to binary */
6093           /* 32-bit or native gpr destination + FPC (DXC write) */
6094           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6095             return -1;
6096           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6097             return -1;
6098           break;
6099
6100         /* 0xe307 undefined */
6101
6102         case 0xe30d: /* DSG - divide single */
6103         case 0xe31d: /* DSGF - divide single */
6104         case 0xe384: /* MG - multiply 64x64mem -> 128 */
6105         case 0xe386: /* MLG - multiply logical */
6106         case 0xe387: /* DLG - divide logical */
6107         case 0xe38f: /* LPQ - load pair from quadword */
6108           /* 64-bit gpr pair destination  */
6109           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6110             return -1;
6111           if (s390_record_gpr_g (gdbarch, regcache, inib[2] | 1))
6112             return -1;
6113           break;
6114
6115         case 0xe30e: /* CVBG - convert to binary */
6116           /* 64-bit gpr destination + FPC (DXC write) */
6117           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6118             return -1;
6119           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6120             return -1;
6121           break;
6122
6123         /* 0xe310-0xe311 undefined */
6124
6125         case 0xe312: /* LT - load and test */
6126         case 0xe338: /* AGH - add halfword to 64 bit value */
6127         case 0xe339: /* SGH - subtract halfword from 64 bit value */
6128         case 0xe353: /* MSC - multiply single 32x32mem -> 32 */
6129         case 0xe354: /* NY - and */
6130         case 0xe356: /* OY - or */
6131         case 0xe357: /* XY - xor */
6132         case 0xe35a: /* AY - add */
6133         case 0xe35b: /* SY - subtract */
6134         case 0xe35e: /* ALY - add logical */
6135         case 0xe35f: /* SLY - subtract logical */
6136         case 0xe37a: /* AHY - add halfword */
6137         case 0xe37b: /* SHY - subtract halfword */
6138         case 0xe383: /* MSGC - multiply single 64x64mem -> 64 */
6139         case 0xe398: /* ALC - add logical with carry */
6140         case 0xe399: /* SLB - subtract logical with borrow */
6141         case 0xe727: /* LCBB - load count to block bounduary */
6142         case 0xeb81: /* ICMY - insert characters under mask */
6143         case 0xebdc: /* SRAK - shift left single */
6144         case 0xebdd: /* SLAK - shift left single */
6145           /* 32/64-bit gpr destination + flags */
6146           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6147             return -1;
6148           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6149             return -1;
6150           break;
6151
6152         /* 0xe313 privileged */
6153
6154         case 0xe31e: /* LRV - load reversed */
6155         case 0xe31f: /* LRVH - load reversed */
6156         case 0xe33b: /* LZRF - load and zero rightmost byte */
6157         case 0xe351: /* MSY - multiply single */
6158         case 0xe358: /* LY - load */
6159         case 0xe371: /* LAY - load address */
6160         case 0xe373: /* ICY - insert character */
6161         case 0xe376: /* LB - load byte */
6162         case 0xe378: /* LHY - load */
6163         case 0xe37c: /* MHY - multiply halfword */
6164         case 0xe394: /* LLC - load logical character */
6165         case 0xe395: /* LLH - load logical halfword */
6166         case 0xeb1d: /* RLL - rotate left single logical */
6167         case 0xebde: /* SRLK - shift left single logical */
6168         case 0xebdf: /* SLLK - shift left single logical */
6169         case 0xebf2: /* LOC - load on condition */
6170           /* 32-bit or native gpr destination */
6171           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6172             return -1;
6173           break;
6174
6175         case 0xe320: /* CG - compare */
6176         case 0xe321: /* CLG - compare logical */
6177         case 0xe330: /* CGF - compare */
6178         case 0xe331: /* CLGF - compare logical */
6179         case 0xe334: /* CGH - compare halfword */
6180         case 0xe355: /* CLY - compare logical */
6181         case 0xe359: /* CY - compare */
6182         case 0xe379: /* CHY - compare halfword */
6183         case 0xe3cd: /* CHF - compare high */
6184         case 0xe3cf: /* CLHF - compare logical high */
6185         case 0xeb20: /* CLMH - compare logical under mask high */
6186         case 0xeb21: /* CLMY - compare logical under mask */
6187         case 0xeb51: /* TMY - test under mask */
6188         case 0xeb55: /* CLIY - compare logical */
6189         case 0xebc0: /* TP - test decimal */
6190         case 0xed10: /* TCEB - test data class */
6191         case 0xed11: /* TCDB - test data class */
6192         case 0xed12: /* TCXB - test data class */
6193         case 0xed50: /* TDCET - test data class */
6194         case 0xed51: /* TDGET - test data group */
6195         case 0xed54: /* TDCDT - test data class */
6196         case 0xed55: /* TDGDT - test data group */
6197         case 0xed58: /* TDCXT - test data class */
6198         case 0xed59: /* TDGXT - test data group */
6199           /* flags only */
6200           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6201             return -1;
6202           break;
6203
6204         /* 0xe322-0xe323 undefined */
6205
6206         case 0xe324: /* STG - store */
6207         case 0xe325: /* NTSTG - nontransactional store */
6208         case 0xe326: /* CVDY - convert to decimal */
6209         case 0xe32f: /* STRVG - store reversed */
6210         case 0xebe3: /* STOCG - store on condition */
6211         case 0xed67: /* STDY - store */
6212           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
6213           if (record_full_arch_list_add_mem (oaddr, 8))
6214             return -1;
6215           break;
6216
6217         /* 0xe327-0xe329 undefined */
6218         /* 0xe32b-0xe32d undefined */
6219
6220         case 0xe32e: /* CVDG - convert to decimal */
6221         case 0xe38e: /* STPQ - store pair to quadword */
6222           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
6223           if (record_full_arch_list_add_mem (oaddr, 16))
6224             return -1;
6225           break;
6226
6227         /* 0xe333 undefined */
6228         /* 0xe335 undefined */
6229
6230         case 0xe336: /* PFD - prefetch data */
6231           break;
6232
6233         /* 0xe337 undefined */
6234         /* 0xe33c-0xe33d undefined */
6235
6236         case 0xe33e: /* STRV - store reversed */
6237         case 0xe350: /* STY - store */
6238         case 0xe3cb: /* STFH - store high */
6239         case 0xebe1: /* STOCFH - store high on condition */
6240         case 0xebf3: /* STOC - store on condition */
6241         case 0xed66: /* STEY - store */
6242           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
6243           if (record_full_arch_list_add_mem (oaddr, 4))
6244             return -1;
6245           break;
6246
6247         case 0xe33f: /* STRVH - store reversed */
6248         case 0xe370: /* STHY - store halfword */
6249         case 0xe3c7: /* STHH - store halfword high */
6250           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
6251           if (record_full_arch_list_add_mem (oaddr, 2))
6252             return -1;
6253           break;
6254
6255         /* 0xe340-0xe345 undefined */
6256
6257         case 0xe347: /* BIC - branch indirect on condition */
6258           break;
6259
6260         /* 0xe348-0xe34f undefined */
6261         /* 0xe352 undefined */
6262
6263         case 0xe35c: /* MFY - multiply */
6264         case 0xe396: /* ML - multiply logical */
6265         case 0xe397: /* DL - divide logical */
6266           /* 32-bit gpr pair destination */
6267           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6268             return -1;
6269           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
6270             return -1;
6271           break;
6272
6273         /* 0xe35d undefined */
6274         /* 0xe360-0xe36f undefined */
6275
6276         case 0xe372: /* STCY - store character */
6277         case 0xe3c3: /* STCH - store character high */
6278           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
6279           if (record_full_arch_list_add_mem (oaddr, 1))
6280             return -1;
6281           break;
6282
6283         /* 0xe374 undefined */
6284
6285         case 0xe375: /* LAEY - load address extended */
6286           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6287             return -1;
6288           if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + inib[2]))
6289             return -1;
6290           break;
6291
6292         /* 0xe37d-0xe37f undefined */
6293
6294         case 0xe385: /* LGAT - load and trap */
6295         case 0xe39c: /* LLGTAT - load logical thirty one bits and trap */
6296         case 0xe39d: /* LLGFAT - load logical and trap */
6297         case 0xe650: /* VCVB - vector convert to binary 32 bit*/
6298         case 0xe652: /* VCVBG - vector convert to binary 64 bit*/
6299         case 0xe721: /* VLGV - vector load gr from vr element */
6300           /* 64-bit gpr destination + fpc for possible DXC write */
6301           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6302             return -1;
6303           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6304             return -1;
6305           break;
6306
6307         /* 0xe38a-0xe38d undefined */
6308         /* 0xe392-0xe393 undefined */
6309         /* 0xe39a-0xe39b undefined */
6310         /* 0xe39e undefined */
6311
6312         case 0xe39f: /* LAT - load and trap */
6313           /* 32-bit gpr destination + fpc for possible DXC write */
6314           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6315             return -1;
6316           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6317             return -1;
6318           break;
6319
6320         /* 0xe3a0-0xe3bf undefined */
6321
6322         case 0xe3c0: /* LBH - load byte high */
6323         case 0xe3c2: /* LLCH - load logical character high */
6324         case 0xe3c4: /* LHH - load halfword high */
6325         case 0xe3c6: /* LLHH - load logical halfword high */
6326         case 0xe3ca: /* LFH - load high */
6327         case 0xebe0: /* LOCFH - load high on condition */
6328           /* 32-bit high gpr destination */
6329           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
6330             return -1;
6331           break;
6332
6333         /* 0xe3c1 undefined */
6334         /* 0xe3c5 undefined */
6335
6336         case 0xe3c8: /* LFHAT - load high and trap */
6337           /* 32-bit high gpr destination + fpc for possible DXC write */
6338           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
6339             return -1;
6340           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6341             return -1;
6342           break;
6343
6344         /* 0xe3c9 undefined */
6345         /* 0xe3cc undefined */
6346         /* 0xe3ce undefined */
6347         /* 0xe3d0-0xe3ff undefined */
6348
6349         case 0xe634: /* VPKZ - vector pack zoned */
6350         case 0xe635: /* VLRL - vector load rightmost with immed. length */
6351         case 0xe637: /* VLRLR - vector load rightmost with length */
6352         case 0xe649: /* VLIP - vector load immediate decimal */
6353         case 0xe700: /* VLEB - vector load element */
6354         case 0xe701: /* VLEH - vector load element */
6355         case 0xe702: /* VLEG - vector load element */
6356         case 0xe703: /* VLEF - vector load element */
6357         case 0xe704: /* VLLEZ - vector load logical element and zero */
6358         case 0xe705: /* VLREP - vector load and replicate */
6359         case 0xe706: /* VL - vector load */
6360         case 0xe707: /* VLBB - vector load to block bounduary */
6361         case 0xe712: /* VGEG - vector gather element */
6362         case 0xe713: /* VGEF - vector gather element */
6363         case 0xe722: /* VLVG - vector load vr element from gr */
6364         case 0xe730: /* VESL - vector element shift left */
6365         case 0xe733: /* VERLL - vector element rotate left logical */
6366         case 0xe737: /* VLL - vector load with length */
6367         case 0xe738: /* VESRL - vector element shift right logical */
6368         case 0xe73a: /* VESRA - vector element shift right arithmetic */
6369         case 0xe740: /* VLEIB - vector load element immediate */
6370         case 0xe741: /* VLEIH - vector load element immediate */
6371         case 0xe742: /* VLEIG - vector load element immediate */
6372         case 0xe743: /* VLEIF - vector load element immediate */
6373         case 0xe744: /* VGBM - vector generate byte mask */
6374         case 0xe745: /* VREPI - vector replicate immediate */
6375         case 0xe746: /* VGM - vector generate mask */
6376         case 0xe74d: /* VREP - vector replicate */
6377         case 0xe750: /* VPOPCT - vector population count */
6378         case 0xe752: /* VCTZ - vector count trailing zeros */
6379         case 0xe753: /* VCLZ - vector count leading zeros */
6380         case 0xe756: /* VLR - vector load */
6381         case 0xe75f: /* VSEG -vector sign extend to doubleword */
6382         case 0xe760: /* VMRL - vector merge low */
6383         case 0xe761: /* VMRH - vector merge high */
6384         case 0xe762: /* VLVGP - vector load vr from grs disjoint */
6385         case 0xe764: /* VSUM - vector sum across word */
6386         case 0xe765: /* VSUMG - vector sum across doubleword */
6387         case 0xe766: /* VCKSM - vector checksum */
6388         case 0xe767: /* VSUMQ - vector sum across quadword */
6389         case 0xe768: /* VN - vector and */
6390         case 0xe769: /* VNC - vector and with complement */
6391         case 0xe76a: /* VO - vector or */
6392         case 0xe76b: /* VNO - vector nor */
6393         case 0xe76c: /* VNX - vector not exclusive or */
6394         case 0xe76d: /* VX - vector xor */
6395         case 0xe76e: /* VNN - vector nand */
6396         case 0xe76f: /* VOC - vector or with complement */
6397         case 0xe770: /* VESLV - vector element shift left */
6398         case 0xe772: /* VERIM - vector element rotate and insert under mask */
6399         case 0xe773: /* VERLLV - vector element rotate left logical */
6400         case 0xe774: /* VSL - vector shift left */
6401         case 0xe775: /* VSLB - vector shift left by byte */
6402         case 0xe777: /* VSLDB - vector shift left double by byte */
6403         case 0xe778: /* VESRLV - vector element shift right logical */
6404         case 0xe77a: /* VESRAV - vector element shift right arithmetic */
6405         case 0xe77c: /* VSRL - vector shift right logical */
6406         case 0xe77d: /* VSRLB - vector shift right logical by byte */
6407         case 0xe77e: /* VSRA - vector shift right arithmetic */
6408         case 0xe77f: /* VSRAB - vector shift right arithmetic by byte */
6409         case 0xe784: /* VPDI - vector permute doubleword immediate */
6410         case 0xe785: /* VBPERM - vector bit permute */
6411         case 0xe78c: /* VPERM - vector permute */
6412         case 0xe78d: /* VSEL - vector select */
6413         case 0xe78e: /* VFMS - vector fp multiply and subtract */
6414         case 0xe78f: /* VFMA - vector fp multiply and add */
6415         case 0xe794: /* VPK - vector pack */
6416         case 0xe79e: /* VFNMS - vector fp negative multiply and subtract */
6417         case 0xe79f: /* VFNMA - vector fp negative multiply and add */
6418         case 0xe7a1: /* VMLH - vector multiply logical high */
6419         case 0xe7a2: /* VML - vector multiply low */
6420         case 0xe7a3: /* VMH - vector multiply high */
6421         case 0xe7a4: /* VMLE - vector multiply logical even */
6422         case 0xe7a5: /* VMLO - vector multiply logical odd */
6423         case 0xe7a6: /* VME - vector multiply even */
6424         case 0xe7a7: /* VMO - vector multiply odd */
6425         case 0xe7a9: /* VMALH - vector multiply and add logical high */
6426         case 0xe7aa: /* VMAL - vector multiply and add low */
6427         case 0xe7ab: /* VMAH - vector multiply and add high */
6428         case 0xe7ac: /* VMALE - vector multiply and add logical even */
6429         case 0xe7ad: /* VMALO - vector multiply and add logical odd */
6430         case 0xe7ae: /* VMAE - vector multiply and add even */
6431         case 0xe7af: /* VMAO - vector multiply and add odd */
6432         case 0xe7b4: /* VGFM - vector Galois field multiply sum */
6433         case 0xe7b8: /* VMSL - vector multiply sum logical */
6434         case 0xe7b9: /* VACCC - vector add with carry compute carry */
6435         case 0xe7bb: /* VAC - vector add with carry */
6436         case 0xe7bc: /* VGFMA - vector Galois field multiply sum and accumulate */
6437         case 0xe7bd: /* VSBCBI - vector subtract with borrow compute borrow indication */
6438         case 0xe7bf: /* VSBI - vector subtract with borrow indication */
6439         case 0xe7c0: /* VCLGD - vector convert to logical 64-bit */
6440         case 0xe7c1: /* VCDLG - vector convert from logical 64-bit */
6441         case 0xe7c2: /* VCGD - vector convert to fixed 64-bit */
6442         case 0xe7c3: /* VCDG - vector convert from fixed 64-bit */
6443         case 0xe7c4: /* VLDE/VFLL - vector fp load lengthened */
6444         case 0xe7c5: /* VLED/VFLR - vector fp load rounded */
6445         case 0xe7c7: /* VFI - vector load fp integer */
6446         case 0xe7cc: /* VFPSO - vector fp perform sign operation */
6447         case 0xe7ce: /* VFSQ - vector fp square root */
6448         case 0xe7d4: /* VUPLL - vector unpack logical low */
6449         case 0xe7d6: /* VUPL - vector unpack low */
6450         case 0xe7d5: /* VUPLH - vector unpack logical high */
6451         case 0xe7d7: /* VUPH - vector unpack high */
6452         case 0xe7de: /* VLC - vector load complement */
6453         case 0xe7df: /* VLP - vector load positive */
6454         case 0xe7e2: /* VFA - vector fp subtract */
6455         case 0xe7e3: /* VFA - vector fp add */
6456         case 0xe7e5: /* VFD - vector fp divide */
6457         case 0xe7e7: /* VFM - vector fp multiply */
6458         case 0xe7ee: /* VFMIN - vector fp minimum */
6459         case 0xe7ef: /* VFMAX - vector fp maximum */
6460         case 0xe7f0: /* VAVGL - vector average logical */
6461         case 0xe7f1: /* VACC - vector add and compute carry */
6462         case 0xe7f2: /* VAVG - vector average */
6463         case 0xe7f3: /* VA - vector add */
6464         case 0xe7f5: /* VSCBI - vector subtract compute borrow indication */
6465         case 0xe7f7: /* VS - vector subtract */
6466         case 0xe7fc: /* VMNL - vector minimum logical */
6467         case 0xe7fd: /* VMXL - vector maximum logical */
6468         case 0xe7fe: /* VMN - vector minimum */
6469         case 0xe7ff: /* VMX - vector maximum */
6470           /* vector destination + FPC */
6471           if (s390_record_vr (gdbarch, regcache, ivec[0]))
6472             return -1;
6473           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6474             return -1;
6475           break;
6476
6477         case 0xe63d: /* VSTRL - vector store rightmost with immed. length */
6478           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
6479           if (record_full_arch_list_add_mem (oaddr, inib[3] + 1))
6480             return -1;
6481           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6482             return -1;
6483           break;
6484
6485         case 0xe708: /* VSTEB - vector store element */
6486           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
6487           if (record_full_arch_list_add_mem (oaddr, 1))
6488             return -1;
6489           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6490             return -1;
6491           break;
6492
6493         case 0xe709: /* VSTEH - vector store element */
6494           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
6495           if (record_full_arch_list_add_mem (oaddr, 2))
6496             return -1;
6497           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6498             return -1;
6499           break;
6500
6501         case 0xe70a: /* VSTEG - vector store element */
6502           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
6503           if (record_full_arch_list_add_mem (oaddr, 8))
6504             return -1;
6505           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6506             return -1;
6507           break;
6508
6509         case 0xe70b: /* VSTEF - vector store element */
6510           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
6511           if (record_full_arch_list_add_mem (oaddr, 4))
6512             return -1;
6513           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6514             return -1;
6515           break;
6516
6517         /* 0xe70c-0xe70d undefined */
6518
6519         case 0xe70e: /* VST - vector store */
6520           oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
6521           if (record_full_arch_list_add_mem (oaddr, 16))
6522             return -1;
6523           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6524             return -1;
6525           break;
6526
6527         /* 0xe70f-0xe711 undefined */
6528         /* 0xe714-0xe719 undefined */
6529
6530         case 0xe71a: /* VSCEG - vector scatter element */
6531           if (s390_record_calc_disp_vsce (gdbarch, regcache, ivec[1], inib[8], 8, insn[1], 0, &oaddr))
6532             return -1;
6533           if (record_full_arch_list_add_mem (oaddr, 8))
6534             return -1;
6535           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6536             return -1;
6537           break;
6538
6539         case 0xe71b: /* VSCEF - vector scatter element */
6540           if (s390_record_calc_disp_vsce (gdbarch, regcache, ivec[1], inib[8], 4, insn[1], 0, &oaddr))
6541             return -1;
6542           if (record_full_arch_list_add_mem (oaddr, 4))
6543             return -1;
6544           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6545             return -1;
6546           break;
6547
6548         /* 0xe71c-0xe720 undefined */
6549         /* 0xe723-0xe726 undefined */
6550         /* 0xe728-0xe72f undefined */
6551         /* 0xe731-0xe732 undefined */
6552         /* 0xe734-0xe735 undefined */
6553
6554         case 0xe736: /* VLM - vector load multiple */
6555           for (i = ivec[0]; i != ivec[1]; i++, i &= 0x1f)
6556             if (s390_record_vr (gdbarch, regcache, i))
6557               return -1;
6558           if (s390_record_vr (gdbarch, regcache, ivec[1]))
6559             return -1;
6560           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6561             return -1;
6562           break;
6563
6564         /* 0xe739 undefined */
6565         /* 0xe73b-0xe73d undefined */
6566
6567         case 0xe73e: /* VSTM - vector store multiple */
6568           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
6569           if (ivec[0] <= ivec[1])
6570             n = ivec[1] - ivec[0] + 1;
6571           else
6572             n = ivec[1] + 0x20 - ivec[0] + 1;
6573           if (record_full_arch_list_add_mem (oaddr, n * 16))
6574             return -1;
6575           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6576             return -1;
6577           break;
6578
6579         case 0xe63c: /* VUPKZ - vector unpack zoned */
6580           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
6581           if (record_full_arch_list_add_mem (oaddr, (ibyte[1] + 1) & 31))
6582             return -1;
6583           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6584             return -1;
6585           break;
6586
6587         case 0xe63f: /* VSTRLR - vector store rightmost with length */
6588         case 0xe73f: /* VSTL - vector store with length */
6589           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
6590           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[3], &tmp);
6591           tmp &= 0xffffffffu;
6592           if (tmp > 15)
6593             tmp = 15;
6594           if (record_full_arch_list_add_mem (oaddr, tmp + 1))
6595             return -1;
6596           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6597             return -1;
6598           break;
6599
6600         /* 0xe747-0xe749 undefined */
6601
6602         case 0xe658: /* VCVD - vector convert to decimal 32 bit */
6603         case 0xe659: /* VSRP - vector shift and round decimal */
6604         case 0xe65a: /* VCVDG - vector convert to decimal 64 bit*/
6605         case 0xe65b: /* VPSOP - vector perform sign operation decimal */
6606         case 0xe671: /* VAP - vector add decimal */
6607         case 0xe673: /* VSP - vector subtract decimal */
6608         case 0xe678: /* VMP - vector multiply decimal */
6609         case 0xe679: /* VMSP - vector multiply decimal */
6610         case 0xe67a: /* VDP - vector divide decimal */
6611         case 0xe67b: /* VRP - vector remainder decimal */
6612         case 0xe67e: /* VSDP - vector shift and divide decimal */
6613         case 0xe74a: /* VFTCI - vector fp test data class immediate */
6614         case 0xe75c: /* VISTR - vector isolate string */
6615         case 0xe780: /* VFEE - vector find element equal */
6616         case 0xe781: /* VFENE - vector find element not equal */
6617         case 0xe782: /* VFA - vector find any element equal */
6618         case 0xe78a: /* VSTRC - vector string range compare */
6619         case 0xe795: /* VPKLS - vector pack logical saturate */
6620         case 0xe797: /* VPKS - vector pack saturate */
6621         case 0xe7e8: /* VFCE - vector fp compare equal */
6622         case 0xe7ea: /* VFCHE - vector fp compare high or equal */
6623         case 0xe7eb: /* VFCH - vector fp compare high */
6624         case 0xe7f8: /* VCEQ - vector compare equal */
6625         case 0xe7f9: /* VCHL - vector compare high logical */
6626         case 0xe7fb: /* VCH - vector compare high */
6627           /* vector destination + flags + FPC */
6628           if (s390_record_vr (gdbarch, regcache, ivec[0]))
6629             return -1;
6630           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6631             return -1;
6632           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6633             return -1;
6634           break;
6635
6636         case 0xe65f: /* VTP - vector test decimal */
6637           /* flags + FPC */
6638           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6639             return -1;
6640           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6641             return -1;
6642           break;
6643
6644         /* 0xe74b-0xe74c undefined */
6645         /* 0xe74e-0xe74f undefined */
6646         /* 0xe751 undefined */
6647         /* 0xe754-0xe755 undefined */
6648         /* 0xe757-0xe75b undefined */
6649         /* 0xe75d-0xe75e undefined */
6650         /* 0xe763 undefined */
6651         /* 0xe771 undefined */
6652         /* 0xe776 undefined */
6653         /* 0xe779 undefined */
6654         /* 0xe77b undefined */
6655         /* 0xe783 undefined */
6656         /* 0xe786-0xe789 undefined */
6657         /* 0xe78b undefined */
6658         /* 0xe790-0xe793 undefined */
6659         /* 0xe796 undefined */
6660         /* 0xe798-0xe79d undefined */
6661         /* 0xe7a0 undefined */
6662         /* 0xe7a8 undefined */
6663         /* 0xe7b0-0xe7b3 undefined */
6664         /* 0xe7b5-0xe7b7 undefined */
6665         /* 0xe7ba undefined */
6666         /* 0xe7be undefined */
6667         /* 0xe7c6 undefined */
6668         /* 0xe7c8-0xe7c9 undefined */
6669
6670         case 0xe677: /* VCP - vector compare decimal */
6671         case 0xe7ca: /* WFK - vector fp compare and signal scalar */
6672         case 0xe7cb: /* WFC - vector fp compare scalar */
6673         case 0xe7d8: /* VTM - vector test under mask */
6674         case 0xe7d9: /* VECL - vector element compare logical */
6675         case 0xe7db: /* VEC - vector element compare */
6676         case 0xed08: /* KEB - compare and signal */
6677         case 0xed09: /* CEB - compare */
6678         case 0xed18: /* KDB - compare and signal */
6679         case 0xed19: /* CDB - compare */
6680           /* flags + fpc only */
6681           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6682             return -1;
6683           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6684             return -1;
6685           break;
6686
6687         /* 0xe7cd undefined */
6688         /* 0xe7cf-0xe7d3 undefined */
6689         /* 0xe7da undefined */
6690         /* 0xe7dc-0xe7dd undefined */
6691         /* 0xe7e0-0xe7e1 undefined */
6692         /* 0xe7e4 undefined */
6693         /* 0xe7e6 undefined */
6694         /* 0xe7e9 undefined */
6695         /* 0xe7ec-0xe7ed undefined */
6696         /* 0xe7f4 undefined */
6697         /* 0xe7f6 undefined */
6698         /* 0xe7fa undefined */
6699
6700         /* 0xeb00-0xeb03 undefined */
6701
6702         case 0xeb04: /* LMG - load multiple */
6703           for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
6704             if (s390_record_gpr_g (gdbarch, regcache, i))
6705               return -1;
6706           if (s390_record_gpr_g (gdbarch, regcache, inib[3]))
6707             return -1;
6708           break;
6709
6710         /* 0xeb05-0xeb09 undefined */
6711         /* 0xeb0e undefined */
6712         /* 0xeb0f privileged: TRACG */
6713         /* 0xeb10-0xeb13 undefined */
6714
6715         case 0xeb14: /* CSY - compare and swap */
6716         case 0xebf4: /* LAN - load and and */
6717         case 0xebf6: /* LAO - load and or */
6718         case 0xebf7: /* LAX - load and xor */
6719         case 0xebf8: /* LAA - load and add */
6720         case 0xebfa: /* LAAL - load and add logical */
6721           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6722           if (record_full_arch_list_add_mem (oaddr, 4))
6723             return -1;
6724           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6725             return -1;
6726           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6727             return -1;
6728           break;
6729
6730         /* 0xeb15-0xeb1b undefined */
6731         /* 0xeb1e-0xeb1f undefined */
6732         /* 0xeb22 undefined */
6733
6734         case 0xeb23: /* CLT - compare logical and trap */
6735         case 0xeb2b: /* CLGT - compare logical and trap */
6736           /* fpc only - including possible DXC write for trapping insns */
6737           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6738             return -1;
6739           break;
6740
6741         case 0xeb24: /* STMG - store multiple */
6742           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6743           if (inib[2] <= inib[3])
6744             n = inib[3] - inib[2] + 1;
6745           else
6746             n = inib[3] + 0x10 - inib[2] + 1;
6747           if (record_full_arch_list_add_mem (oaddr, n * 8))
6748             return -1;
6749           break;
6750
6751         /* 0xeb25 privileged */
6752
6753         case 0xeb26: /* STMH - store multiple high */
6754         case 0xeb90: /* STMY - store multiple */
6755         case 0xeb9b: /* STAMY - store access multiple */
6756           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6757           if (inib[2] <= inib[3])
6758             n = inib[3] - inib[2] + 1;
6759           else
6760             n = inib[3] + 0x10 - inib[2] + 1;
6761           if (record_full_arch_list_add_mem (oaddr, n * 4))
6762             return -1;
6763           break;
6764
6765         /* 0xeb27-0xeb2a undefined */
6766
6767         case 0xeb2c: /* STCMH - store characters under mask */
6768         case 0xeb2d: /* STCMY - store characters under mask */
6769           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6770           if (record_full_arch_list_add_mem (oaddr, s390_popcnt (inib[3])))
6771             return -1;
6772           break;
6773
6774         /* 0xeb2e undefined */
6775         /* 0xeb2f privileged */
6776
6777         case 0xeb30: /* CSG - compare and swap */
6778         case 0xebe4: /* LANG - load and and */
6779         case 0xebe6: /* LAOG - load and or */
6780         case 0xebe7: /* LAXG - load and xor */
6781         case 0xebe8: /* LAAG - load and add */
6782         case 0xebea: /* LAALG - load and add logical */
6783           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6784           if (record_full_arch_list_add_mem (oaddr, 8))
6785             return -1;
6786           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6787             return -1;
6788           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6789             return -1;
6790           break;
6791
6792         case 0xeb31: /* CDSY - compare double and swap */
6793           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6794           if (record_full_arch_list_add_mem (oaddr, 8))
6795             return -1;
6796           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6797             return -1;
6798           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
6799             return -1;
6800           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6801             return -1;
6802           break;
6803
6804         /* 0xeb32-0xeb3d undefined */
6805
6806         case 0xeb3e: /* CDSG - compare double and swap */
6807           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6808           if (record_full_arch_list_add_mem (oaddr, 16))
6809             return -1;
6810           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
6811             return -1;
6812           if (s390_record_gpr_g (gdbarch, regcache, inib[2] | 1))
6813             return -1;
6814           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6815             return -1;
6816           break;
6817
6818         /* 0xeb3f-0xeb43 undefined */
6819         /* 0xeb46-0xeb4b undefined */
6820         /* 0xeb4d-0xeb50 undefined */
6821
6822         case 0xeb52: /* MVIY - move */
6823           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6824           if (record_full_arch_list_add_mem (oaddr, 1))
6825             return -1;
6826           break;
6827
6828         case 0xeb54: /* NIY - and */
6829         case 0xeb56: /* OIY - or */
6830         case 0xeb57: /* XIY - xor */
6831           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6832           if (record_full_arch_list_add_mem (oaddr, 1))
6833             return -1;
6834           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6835             return -1;
6836           break;
6837
6838         /* 0xeb53 undefined */
6839         /* 0xeb58-0xeb69 undefined */
6840
6841         case 0xeb6a: /* ASI - add immediate */
6842         case 0xeb6e: /* ALSI - add immediate */
6843           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6844           if (record_full_arch_list_add_mem (oaddr, 4))
6845             return -1;
6846           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6847             return -1;
6848           break;
6849
6850         /* 0xeb6b-0xeb6d undefined */
6851         /* 0xeb6f-0xeb79 undefined */
6852
6853         case 0xeb7a: /* AGSI - add immediate */
6854         case 0xeb7e: /* ALGSI - add immediate */
6855           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
6856           if (record_full_arch_list_add_mem (oaddr, 8))
6857             return -1;
6858           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6859             return -1;
6860           break;
6861
6862         /* 0xeb7b-0xeb7d undefined */
6863         /* 0xeb7f undefined */
6864
6865         case 0xeb80: /* ICMH - insert characters under mask */
6866           /* 32-bit high gpr destination + flags */
6867           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
6868             return -1;
6869           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6870             return -1;
6871           break;
6872
6873         /* 0xeb82-0xeb8d undefined */
6874
6875         case 0xeb8e: /* MVCLU - move long unicode [partial] */
6876           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[2], &tmp);
6877           oaddr = s390_record_address_mask (gdbarch, regcache, tmp);
6878           regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + (inib[2] | 1), &tmp);
6879           if (record_full_arch_list_add_mem (oaddr, tmp))
6880             return -1;
6881           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6882             return -1;
6883           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
6884             return -1;
6885           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
6886             return -1;
6887           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[3] | 1)))
6888             return -1;
6889           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6890             return -1;
6891           break;
6892
6893         case 0xeb8f: /* CLCLU - compare logical long unicode [partial] */
6894           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
6895             return -1;
6896           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[2] | 1)))
6897             return -1;
6898           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
6899             return -1;
6900           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[3] | 1)))
6901             return -1;
6902           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6903             return -1;
6904           break;
6905
6906         /* 0xeb91-0xeb95 undefined */
6907
6908         case 0xeb96: /* LMH - load multiple high */
6909           for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
6910             if (s390_record_gpr_h (gdbarch, regcache, i))
6911               return -1;
6912           if (s390_record_gpr_h (gdbarch, regcache, inib[3]))
6913             return -1;
6914           break;
6915
6916         /* 0xeb97 undefined */
6917
6918         case 0xeb98: /* LMY - load multiple */
6919           for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
6920             if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + i))
6921               return -1;
6922           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
6923             return -1;
6924           break;
6925
6926         /* 0xeb99 undefined */
6927
6928         case 0xeb9a: /* LAMY - load access multiple */
6929           for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
6930             if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + i))
6931               return -1;
6932           if (record_full_arch_list_add_reg (regcache, S390_A0_REGNUM + inib[3]))
6933             return -1;
6934           break;
6935
6936         /* 0xeb9c-0xebbf undefined */
6937         /* 0xebc1-0xebdb undefined */
6938         /* 0xebe5 undefined */
6939         /* 0xebe9 undefined */
6940         /* 0xebeb-0xebf1 undefined */
6941         /* 0xebf5 undefined */
6942         /* 0xebf9 undefined */
6943         /* 0xebfb-0xebff undefined */
6944
6945         /* 0xed00-0xed03 undefined */
6946
6947         case 0xed04: /* LDEB - load lengthened */
6948         case 0xed0c: /* MDEB - multiply */
6949         case 0xed0d: /* DEB - divide */
6950         case 0xed14: /* SQEB - square root */
6951         case 0xed15: /* SQDB - square root */
6952         case 0xed17: /* MEEB - multiply */
6953         case 0xed1c: /* MDB - multiply */
6954         case 0xed1d: /* DDB - divide */
6955           /* float destination + fpc */
6956           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
6957             return -1;
6958           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6959             return -1;
6960           break;
6961
6962         case 0xed05: /* LXDB - load lengthened */
6963         case 0xed06: /* LXEB - load lengthened */
6964         case 0xed07: /* MXDB - multiply */
6965           /* float pair destination + fpc */
6966           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
6967             return -1;
6968           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[2] | 2)))
6969             return -1;
6970           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6971             return -1;
6972           break;
6973
6974         case 0xed0a: /* AEB - add */
6975         case 0xed0b: /* SEB - subtract */
6976         case 0xed1a: /* ADB - add */
6977         case 0xed1b: /* SDB - subtract */
6978           /* float destination + flags + fpc */
6979           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
6980             return -1;
6981           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
6982             return -1;
6983           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6984             return -1;
6985           break;
6986
6987         case 0xed0e: /* MAEB - multiply and add */
6988         case 0xed0f: /* MSEB - multiply and subtract */
6989         case 0xed1e: /* MADB - multiply and add */
6990         case 0xed1f: /* MSDB - multiply and subtract */
6991         case 0xed40: /* SLDT - shift significand left */
6992         case 0xed41: /* SRDT - shift significand right */
6993         case 0xedaa: /* CDZT - convert from zoned */
6994         case 0xedae: /* CDPT - convert from packed */
6995           /* float destination [RXF] + fpc */
6996           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[8]))
6997             return -1;
6998           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
6999             return -1;
7000           break;
7001
7002         /* 0xed13 undefined */
7003         /* 0xed16 undefined */
7004         /* 0xed20-0xed23 undefined */
7005
7006         case 0xed24: /* LDE - load lengthened */
7007         case 0xed34: /* SQE - square root */
7008         case 0xed35: /* SQD - square root */
7009         case 0xed37: /* MEE - multiply */
7010         case 0xed64: /* LEY - load */
7011         case 0xed65: /* LDY - load */
7012           /* float destination */
7013           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
7014             return -1;
7015           break;
7016
7017         case 0xed25: /* LXD - load lengthened */
7018         case 0xed26: /* LXE - load lengthened */
7019           /* float pair destination */
7020           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[2]))
7021             return -1;
7022           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[2] | 2)))
7023             return -1;
7024           break;
7025
7026         /* 0xed27-0xed2d undefined */
7027
7028         case 0xed2e: /* MAE - multiply and add */
7029         case 0xed2f: /* MSE - multiply and subtract */
7030         case 0xed38: /* MAYL - multiply and add unnormalized */
7031         case 0xed39: /* MYL - multiply unnormalized */
7032         case 0xed3c: /* MAYH - multiply and add unnormalized */
7033         case 0xed3d: /* MYH - multiply unnormalized */
7034         case 0xed3e: /* MAD - multiply and add */
7035         case 0xed3f: /* MSD - multiply and subtract */
7036           /* float destination [RXF] */
7037           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[8]))
7038             return -1;
7039           break;
7040
7041         /* 0xed30-0xed33 undefined */
7042         /* 0xed36 undefined */
7043
7044         case 0xed3a: /* MAY - multiply and add unnormalized */
7045         case 0xed3b: /* MY - multiply unnormalized */
7046           /* float pair destination [RXF] */
7047           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[8]))
7048             return -1;
7049           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[8] | 2)))
7050             return -1;
7051           break;
7052
7053         /* 0xed42-0xed47 undefind */
7054
7055         case 0xed48: /* SLXT - shift significand left */
7056         case 0xed49: /* SRXT - shift significand right */
7057         case 0xedab: /* CXZT - convert from zoned */
7058         case 0xedaf: /* CXPT - convert from packed */
7059           /* float pair destination [RXF] + fpc */
7060           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + inib[8]))
7061             return -1;
7062           if (record_full_arch_list_add_reg (regcache, S390_F0_REGNUM + (inib[8] | 2)))
7063             return -1;
7064           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
7065             return -1;
7066           break;
7067
7068         /* 0xed4a-0xed4f undefind */
7069         /* 0xed52-0xed53 undefind */
7070         /* 0xed56-0xed57 undefind */
7071         /* 0xed5a-0xed63 undefind */
7072         /* 0xed68-0xeda7 undefined */
7073
7074         case 0xeda8: /* CZDT - convert to zoned */
7075         case 0xeda9: /* CZXT - convert to zoned */
7076         case 0xedac: /* CPDT - convert to packed */
7077         case 0xedad: /* CPXT - convert to packed */
7078           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7079           if (record_full_arch_list_add_mem (oaddr, ibyte[1] + 1))
7080             return -1;
7081           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7082             return -1;
7083           break;
7084
7085         /* 0xedb0-0xedff undefined */
7086
7087         default:
7088           goto UNKNOWN_OP;
7089         }
7090       break;
7091
7092     /* 0xe4 undefined */
7093
7094     case 0xe5:
7095       /* SSE/SIL-format instruction */
7096       switch (insn[0])
7097         {
7098         /* 0xe500-0xe543 undefined, privileged, or unsupported */
7099
7100         case 0xe544: /* MVHHI - move */
7101           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7102           if (record_full_arch_list_add_mem (oaddr, 2))
7103             return -1;
7104           break;
7105
7106         /* 0xe545-0xe547 undefined */
7107
7108         case 0xe548: /* MVGHI - move */
7109           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7110           if (record_full_arch_list_add_mem (oaddr, 8))
7111             return -1;
7112           break;
7113
7114         /* 0xe549-0xe54b undefined */
7115
7116         case 0xe54c: /* MVHI - move */
7117           oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7118           if (record_full_arch_list_add_mem (oaddr, 4))
7119             return -1;
7120           break;
7121
7122         /* 0xe54d-0xe553 undefined */
7123
7124         case 0xe554: /* CHHSI - compare halfword immediate */
7125         case 0xe555: /* CLHHSI - compare logical immediate */
7126         case 0xe558: /* CGHSI - compare halfword immediate */
7127         case 0xe559: /* CLGHSI - compare logical immediate */
7128         case 0xe55c: /* CHSI - compare halfword immediate */
7129         case 0xe55d: /* CLFHSI - compare logical immediate */
7130           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7131             return -1;
7132           break;
7133
7134         /* 0xe556-0xe557 undefined */
7135         /* 0xe55a-0xe55b undefined */
7136         /* 0xe55e-0xe55f undefined */
7137
7138         case 0xe560: /* TBEGIN - transaction begin */
7139           /* The transaction will be immediately aborted after this
7140              instruction, due to single-stepping.  This instruction is
7141              only supported so that the program can fail a few times
7142              and go to the non-transactional fallback.  */
7143           if (inib[4])
7144             {
7145               /* Transaction diagnostic block - user.  */
7146               oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7147               if (record_full_arch_list_add_mem (oaddr, 256))
7148                 return -1;
7149             }
7150           /* Transaction diagnostic block - supervisor.  */
7151           if (record_full_arch_list_add_reg (regcache, S390_TDB_DWORD0_REGNUM))
7152             return -1;
7153           if (record_full_arch_list_add_reg (regcache, S390_TDB_ABORT_CODE_REGNUM))
7154             return -1;
7155           if (record_full_arch_list_add_reg (regcache, S390_TDB_CONFLICT_TOKEN_REGNUM))
7156             return -1;
7157           if (record_full_arch_list_add_reg (regcache, S390_TDB_ATIA_REGNUM))
7158             return -1;
7159           for (i = 0; i < 16; i++)
7160             if (record_full_arch_list_add_reg (regcache, S390_TDB_R0_REGNUM + i))
7161               return -1;
7162           /* And flags.  */
7163           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7164             return -1;
7165           break;
7166
7167         /* 0xe561 unsupported: TBEGINC */
7168         /* 0xe562-0xe5ff undefined */
7169
7170         default:
7171           goto UNKNOWN_OP;
7172         }
7173       break;
7174
7175     case 0xec:
7176       /* RIE/RIS/RRS-format instruction */
7177       switch (ibyte[0] << 8 | ibyte[5])
7178         {
7179         /* 0xec00-0xec41 undefined */
7180
7181         case 0xec42: /* LOCHI - load halfword immediate on condition */
7182         case 0xec51: /* RISBLG - rotate then insert selected bits low */
7183           /* 32-bit or native gpr destination */
7184           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
7185             return -1;
7186           break;
7187
7188         /* 0xec43 undefined */
7189
7190         case 0xec44: /* BRXHG - branch relative on index high */
7191         case 0xec45: /* BRXLG - branch relative on index low or equal */
7192         case 0xec46: /* LOCGHI - load halfword immediate on condition */
7193         case 0xec59: /* RISBGN - rotate then insert selected bits */
7194           /* 64-bit gpr destination */
7195           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
7196             return -1;
7197           break;
7198
7199         /* 0xec47-0xec4d undefined */
7200
7201         case 0xec4e: /* LOCHHI - load halfword immediate on condition */
7202         case 0xec5d: /* RISBHG - rotate then insert selected bits high */
7203           /* 32-bit high gpr destination */
7204           if (s390_record_gpr_h (gdbarch, regcache, inib[2]))
7205             return -1;
7206           break;
7207
7208         /* 0xec4f-0xec50 undefined */
7209         /* 0xec52-0xec53 undefined */
7210
7211         case 0xec54: /* RNSBG - rotate then and selected bits */
7212         case 0xec55: /* RISBG - rotate then insert selected bits */
7213         case 0xec56: /* ROSBG - rotate then or selected bits */
7214         case 0xec57: /* RXSBG - rotate then xor selected bits */
7215         case 0xecd9: /* AGHIK - add immediate */
7216         case 0xecdb: /* ALGHSIK - add logical immediate */
7217           /* 64-bit gpr destination + flags */
7218           if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
7219             return -1;
7220           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7221             return -1;
7222           break;
7223
7224         /* 0xec58 undefined */
7225         /* 0xec5a-0xec5c undefined */
7226         /* 0xec5e-0xec63 undefined */
7227
7228         case 0xec64: /* CGRJ - compare and branch relative */
7229         case 0xec65: /* CLGRJ - compare logical and branch relative */
7230         case 0xec76: /* CRJ - compare and branch relative */
7231         case 0xec77: /* CLRJ - compare logical and branch relative */
7232         case 0xec7c: /* CGIJ - compare immediate and branch relative */
7233         case 0xec7d: /* CLGIJ - compare logical immediate and branch relative */
7234         case 0xec7e: /* CIJ - compare immediate and branch relative */
7235         case 0xec7f: /* CLIJ - compare logical immediate and branch relative */
7236         case 0xece4: /* CGRB - compare and branch */
7237         case 0xece5: /* CLGRB - compare logical and branch */
7238         case 0xecf6: /* CRB - compare and branch */
7239         case 0xecf7: /* CLRB - compare logical and branch */
7240         case 0xecfc: /* CGIB - compare immediate and branch */
7241         case 0xecfd: /* CLGIB - compare logical immediate and branch */
7242         case 0xecfe: /* CIB - compare immediate and branch */
7243         case 0xecff: /* CLIB - compare logical immediate and branch */
7244           break;
7245
7246         /* 0xec66-0xec6f undefined */
7247
7248         case 0xec70: /* CGIT - compare immediate and trap */
7249         case 0xec71: /* CLGIT - compare logical immediate and trap */
7250         case 0xec72: /* CIT - compare immediate and trap */
7251         case 0xec73: /* CLFIT - compare logical immediate and trap */
7252           /* fpc only - including possible DXC write for trapping insns */
7253           if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
7254             return -1;
7255           break;
7256
7257         /* 0xec74-0xec75 undefined */
7258         /* 0xec78-0xec7b undefined */
7259
7260         /* 0xec80-0xecd7 undefined */
7261
7262         case 0xecd8: /* AHIK - add immediate */
7263         case 0xecda: /* ALHSIK - add logical immediate */
7264           /* 32-bit gpr destination + flags */
7265           if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
7266             return -1;
7267           if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7268             return -1;
7269           break;
7270
7271         /* 0xecdc-0xece3 undefined */
7272         /* 0xece6-0xecf5 undefined */
7273         /* 0xecf8-0xecfb undefined */
7274
7275         default:
7276           goto UNKNOWN_OP;
7277         }
7278       break;
7279
7280     case 0xee: /* PLO - perform locked operation */
7281       regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
7282       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7283       oaddr2 = s390_record_calc_disp (gdbarch, regcache, 0, insn[2], 0);
7284       if (!(tmp & 0x100))
7285         {
7286           uint8_t fc = tmp & 0xff;
7287           gdb_byte buf[8];
7288           switch (fc)
7289             {
7290             case 0x00: /* CL */
7291               /* op1c */
7292               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
7293                 return -1;
7294               /* op3 */
7295               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
7296                 return -1;
7297               break;
7298
7299             case 0x01: /* CLG */
7300               /* op1c */
7301               if (record_full_arch_list_add_mem (oaddr2 + 0x08, 8))
7302                 return -1;
7303               /* op3 */
7304               if (record_full_arch_list_add_mem (oaddr2 + 0x28, 8))
7305                 return -1;
7306               break;
7307
7308             case 0x02: /* CLGR */
7309               /* op1c */
7310               if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
7311                 return -1;
7312               /* op3 */
7313               if (s390_record_gpr_g (gdbarch, regcache, inib[3]))
7314                 return -1;
7315               break;
7316
7317             case 0x03: /* CLX */
7318               /* op1c */
7319               if (record_full_arch_list_add_mem (oaddr2 + 0x00, 16))
7320                 return -1;
7321               /* op3 */
7322               if (record_full_arch_list_add_mem (oaddr2 + 0x20, 16))
7323                 return -1;
7324               break;
7325
7326             case 0x08: /* DCS */
7327               /* op3c */
7328               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[3]))
7329                 return -1;
7330               /* fallthru */
7331             case 0x0c: /* CSST */
7332               /* op4 */
7333               if (record_full_arch_list_add_mem (oaddr2, 4))
7334                 return -1;
7335               goto CS;
7336
7337             case 0x14: /* CSTST */
7338               /* op8 */
7339               if (target_read_memory (oaddr2 + 0x88, buf, 8))
7340                 return -1;
7341               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7342               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7343               if (record_full_arch_list_add_mem (oaddr3, 4))
7344                 return -1;
7345               /* fallthru */
7346             case 0x10: /* CSDST */
7347               /* op6 */
7348               if (target_read_memory (oaddr2 + 0x68, buf, 8))
7349                 return -1;
7350               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7351               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7352               if (record_full_arch_list_add_mem (oaddr3, 4))
7353                 return -1;
7354               /* op4 */
7355               if (target_read_memory (oaddr2 + 0x48, buf, 8))
7356                 return -1;
7357               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7358               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7359               if (record_full_arch_list_add_mem (oaddr3, 4))
7360                 return -1;
7361               /* fallthru */
7362             case 0x04: /* CS */
7363 CS:
7364               /* op1c */
7365               if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
7366                 return -1;
7367               /* op2 */
7368               if (record_full_arch_list_add_mem (oaddr, 4))
7369                 return -1;
7370               break;
7371
7372             case 0x09: /* DCSG */
7373               /* op3c */
7374               if (record_full_arch_list_add_mem (oaddr2 + 0x28, 8))
7375                 return -1;
7376               goto CSSTG;
7377
7378             case 0x15: /* CSTSTG */
7379               /* op8 */
7380               if (target_read_memory (oaddr2 + 0x88, buf, 8))
7381                 return -1;
7382               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7383               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7384               if (record_full_arch_list_add_mem (oaddr3, 8))
7385                 return -1;
7386               /* fallthru */
7387             case 0x11: /* CSDSTG */
7388               /* op6 */
7389               if (target_read_memory (oaddr2 + 0x68, buf, 8))
7390                 return -1;
7391               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7392               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7393               if (record_full_arch_list_add_mem (oaddr3, 8))
7394                 return -1;
7395               /* fallthru */
7396             case 0x0d: /* CSSTG */
7397 CSSTG:
7398               /* op4 */
7399               if (target_read_memory (oaddr2 + 0x48, buf, 8))
7400                 return -1;
7401               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7402               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7403               if (record_full_arch_list_add_mem (oaddr3, 8))
7404                 return -1;
7405               /* fallthru */
7406             case 0x05: /* CSG */
7407               /* op1c */
7408               if (record_full_arch_list_add_mem (oaddr2 + 0x08, 8))
7409                 return -1;
7410               /* op2 */
7411               if (record_full_arch_list_add_mem (oaddr, 8))
7412                 return -1;
7413               break;
7414
7415             case 0x0a: /* DCSGR */
7416               /* op3c */
7417               if (s390_record_gpr_g (gdbarch, regcache, inib[3]))
7418                 return -1;
7419               /* fallthru */
7420             case 0x0e: /* CSSTGR */
7421               /* op4 */
7422               if (record_full_arch_list_add_mem (oaddr2, 8))
7423                 return -1;
7424               goto CSGR;
7425
7426             case 0x16: /* CSTSTGR */
7427               /* op8 */
7428               if (target_read_memory (oaddr2 + 0x88, buf, 8))
7429                 return -1;
7430               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7431               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7432               if (record_full_arch_list_add_mem (oaddr3, 8))
7433                 return -1;
7434               /* fallthru */
7435             case 0x12: /* CSDSTGR */
7436               /* op6 */
7437               if (target_read_memory (oaddr2 + 0x68, buf, 8))
7438                 return -1;
7439               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7440               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7441               if (record_full_arch_list_add_mem (oaddr3, 8))
7442                 return -1;
7443               /* op4 */
7444               if (target_read_memory (oaddr2 + 0x48, buf, 8))
7445                 return -1;
7446               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7447               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7448               if (record_full_arch_list_add_mem (oaddr3, 8))
7449                 return -1;
7450               /* fallthru */
7451             case 0x06: /* CSGR */
7452 CSGR:
7453               /* op1c */
7454               if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
7455                 return -1;
7456               /* op2 */
7457               if (record_full_arch_list_add_mem (oaddr, 8))
7458                 return -1;
7459               break;
7460
7461             case 0x0b: /* DCSX */
7462               /* op3c */
7463               if (record_full_arch_list_add_mem (oaddr2 + 0x20, 16))
7464                 return -1;
7465               goto CSSTX;
7466
7467             case 0x17: /* CSTSTX */
7468               /* op8 */
7469               if (target_read_memory (oaddr2 + 0x88, buf, 8))
7470                 return -1;
7471               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7472               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7473               if (record_full_arch_list_add_mem (oaddr3, 16))
7474                 return -1;
7475               /* fallthru */
7476             case 0x13: /* CSDSTX */
7477               /* op6 */
7478               if (target_read_memory (oaddr2 + 0x68, buf, 8))
7479                 return -1;
7480               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7481               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7482               if (record_full_arch_list_add_mem (oaddr3, 16))
7483                 return -1;
7484               /* fallthru */
7485             case 0x0f: /* CSSTX */
7486 CSSTX:
7487               /* op4 */
7488               if (target_read_memory (oaddr2 + 0x48, buf, 8))
7489                 return -1;
7490               oaddr3 = extract_unsigned_integer (buf, 8, byte_order);
7491               oaddr3 = s390_record_address_mask (gdbarch, regcache, oaddr3);
7492               if (record_full_arch_list_add_mem (oaddr3, 16))
7493                 return -1;
7494               /* fallthru */
7495             case 0x07: /* CSX */
7496               /* op1c */
7497               if (record_full_arch_list_add_mem (oaddr2 + 0x00, 16))
7498                 return -1;
7499               /* op2 */
7500               if (record_full_arch_list_add_mem (oaddr, 16))
7501                 return -1;
7502               break;
7503
7504             default:
7505               fprintf_unfiltered (gdb_stdlog, "Warning: Unknown PLO FC %02x at %s.\n",
7506                                   fc, paddress (gdbarch, addr));
7507               return -1;
7508             }
7509         }
7510       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7511         return -1;
7512       break;
7513
7514     case 0xef: /* LMD - load multiple disjoint */
7515       for (i = inib[2]; i != inib[3]; i++, i &= 0xf)
7516         if (s390_record_gpr_g (gdbarch, regcache, i))
7517           return -1;
7518       if (s390_record_gpr_g (gdbarch, regcache, inib[3]))
7519         return -1;
7520       break;
7521
7522     case 0xf0: /* SRP - shift and round decimal */
7523     case 0xf8: /* ZAP - zero and add */
7524     case 0xfa: /* AP - add decimal */
7525     case 0xfb: /* SP - subtract decimal */
7526       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7527       if (record_full_arch_list_add_mem (oaddr, inib[2] + 1))
7528         return -1;
7529       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7530         return -1;
7531       /* DXC may be written */
7532       if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
7533         return -1;
7534       break;
7535
7536     case 0xf1: /* MVO - move with offset */
7537     case 0xf2: /* PACK - pack */
7538     case 0xf3: /* UNPK - unpack */
7539       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7540       if (record_full_arch_list_add_mem (oaddr, inib[2] + 1))
7541         return -1;
7542       break;
7543
7544     /* 0xf4-0xf7 undefined */
7545
7546     case 0xf9: /* CP - compare decimal */
7547       if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
7548         return -1;
7549       /* DXC may be written */
7550       if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
7551         return -1;
7552       break;
7553
7554     case 0xfc: /* MP - multiply decimal */
7555     case 0xfd: /* DP - divide decimal */
7556       oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
7557       if (record_full_arch_list_add_mem (oaddr, inib[2] + 1))
7558         return -1;
7559       /* DXC may be written */
7560       if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
7561         return -1;
7562       break;
7563
7564     /* 0xfe-0xff undefined */
7565
7566     default:
7567 UNKNOWN_OP:
7568       fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %04x "
7569                           "at %s.\n", insn[0], paddress (gdbarch, addr));
7570       return -1;
7571   }
7572
7573   if (record_full_arch_list_add_reg (regcache, S390_PSWA_REGNUM))
7574     return -1;
7575   if (record_full_arch_list_add_end ())
7576     return -1;
7577   return 0;
7578 }
7579
7580 /* Initialize linux_record_tdep if not initialized yet.  */
7581
7582 static void
7583 s390_init_linux_record_tdep (struct linux_record_tdep *record_tdep,
7584                              enum s390_abi_kind abi)
7585 {
7586   /* These values are the size of the type that will be used in a system
7587      call.  They are obtained from Linux Kernel source.  */
7588
7589   if (abi == ABI_LINUX_ZSERIES)
7590     {
7591       record_tdep->size_pointer = 8;
7592       /* no _old_kernel_stat */
7593       record_tdep->size_tms = 32;
7594       record_tdep->size_loff_t = 8;
7595       record_tdep->size_flock = 32;
7596       record_tdep->size_ustat = 32;
7597       record_tdep->size_old_sigaction = 32;
7598       record_tdep->size_old_sigset_t = 8;
7599       record_tdep->size_rlimit = 16;
7600       record_tdep->size_rusage = 144;
7601       record_tdep->size_timeval = 16;
7602       record_tdep->size_timezone = 8;
7603       /* old_[ug]id_t never used */
7604       record_tdep->size_fd_set = 128;
7605       record_tdep->size_old_dirent = 280;
7606       record_tdep->size_statfs = 88;
7607       record_tdep->size_statfs64 = 88;
7608       record_tdep->size_sockaddr = 16;
7609       record_tdep->size_int = 4;
7610       record_tdep->size_long = 8;
7611       record_tdep->size_ulong = 8;
7612       record_tdep->size_msghdr = 56;
7613       record_tdep->size_itimerval = 32;
7614       record_tdep->size_stat = 144;
7615       /* old_utsname unused */
7616       record_tdep->size_sysinfo = 112;
7617       record_tdep->size_msqid_ds = 120;
7618       record_tdep->size_shmid_ds = 112;
7619       record_tdep->size_new_utsname = 390;
7620       record_tdep->size_timex = 208;
7621       record_tdep->size_mem_dqinfo = 24;
7622       record_tdep->size_if_dqblk = 72;
7623       record_tdep->size_fs_quota_stat = 80;
7624       record_tdep->size_timespec = 16;
7625       record_tdep->size_pollfd = 8;
7626       record_tdep->size_NFS_FHSIZE = 32;
7627       record_tdep->size_knfsd_fh = 132;
7628       record_tdep->size_TASK_COMM_LEN = 16;
7629       record_tdep->size_sigaction = 32;
7630       record_tdep->size_sigset_t = 8;
7631       record_tdep->size_siginfo_t = 128;
7632       record_tdep->size_cap_user_data_t = 12;
7633       record_tdep->size_stack_t = 24;
7634       record_tdep->size_off_t = 8;
7635       /* stat64 unused */
7636       record_tdep->size_gid_t = 4;
7637       record_tdep->size_uid_t = 4;
7638       record_tdep->size_PAGE_SIZE = 0x1000;        /* 4KB */
7639       record_tdep->size_flock64 = 32;
7640       record_tdep->size_io_event = 32;
7641       record_tdep->size_iocb = 64;
7642       record_tdep->size_epoll_event = 16;
7643       record_tdep->size_itimerspec = 32;
7644       record_tdep->size_mq_attr = 64;
7645       record_tdep->size_termios = 36;
7646       record_tdep->size_termios2 = 44;
7647       record_tdep->size_pid_t = 4;
7648       record_tdep->size_winsize = 8;
7649       record_tdep->size_serial_struct = 72;
7650       record_tdep->size_serial_icounter_struct = 80;
7651       record_tdep->size_size_t = 8;
7652       record_tdep->size_iovec = 16;
7653       record_tdep->size_time_t = 8;
7654     }
7655   else if (abi == ABI_LINUX_S390)
7656     {
7657       record_tdep->size_pointer = 4;
7658       record_tdep->size__old_kernel_stat = 32;
7659       record_tdep->size_tms = 16;
7660       record_tdep->size_loff_t = 8;
7661       record_tdep->size_flock = 16;
7662       record_tdep->size_ustat = 20;
7663       record_tdep->size_old_sigaction = 16;
7664       record_tdep->size_old_sigset_t = 4;
7665       record_tdep->size_rlimit = 8;
7666       record_tdep->size_rusage = 72;
7667       record_tdep->size_timeval = 8;
7668       record_tdep->size_timezone = 8;
7669       record_tdep->size_old_gid_t = 2;
7670       record_tdep->size_old_uid_t = 2;
7671       record_tdep->size_fd_set = 128;
7672       record_tdep->size_old_dirent = 268;
7673       record_tdep->size_statfs = 64;
7674       record_tdep->size_statfs64 = 88;
7675       record_tdep->size_sockaddr = 16;
7676       record_tdep->size_int = 4;
7677       record_tdep->size_long = 4;
7678       record_tdep->size_ulong = 4;
7679       record_tdep->size_msghdr = 28;
7680       record_tdep->size_itimerval = 16;
7681       record_tdep->size_stat = 64;
7682       /* old_utsname unused */
7683       record_tdep->size_sysinfo = 64;
7684       record_tdep->size_msqid_ds = 88;
7685       record_tdep->size_shmid_ds = 84;
7686       record_tdep->size_new_utsname = 390;
7687       record_tdep->size_timex = 128;
7688       record_tdep->size_mem_dqinfo = 24;
7689       record_tdep->size_if_dqblk = 72;
7690       record_tdep->size_fs_quota_stat = 80;
7691       record_tdep->size_timespec = 8;
7692       record_tdep->size_pollfd = 8;
7693       record_tdep->size_NFS_FHSIZE = 32;
7694       record_tdep->size_knfsd_fh = 132;
7695       record_tdep->size_TASK_COMM_LEN = 16;
7696       record_tdep->size_sigaction = 20;
7697       record_tdep->size_sigset_t = 8;
7698       record_tdep->size_siginfo_t = 128;
7699       record_tdep->size_cap_user_data_t = 12;
7700       record_tdep->size_stack_t = 12;
7701       record_tdep->size_off_t = 4;
7702       record_tdep->size_stat64 = 104;
7703       record_tdep->size_gid_t = 4;
7704       record_tdep->size_uid_t = 4;
7705       record_tdep->size_PAGE_SIZE = 0x1000;        /* 4KB */
7706       record_tdep->size_flock64 = 32;
7707       record_tdep->size_io_event = 32;
7708       record_tdep->size_iocb = 64;
7709       record_tdep->size_epoll_event = 16;
7710       record_tdep->size_itimerspec = 16;
7711       record_tdep->size_mq_attr = 32;
7712       record_tdep->size_termios = 36;
7713       record_tdep->size_termios2 = 44;
7714       record_tdep->size_pid_t = 4;
7715       record_tdep->size_winsize = 8;
7716       record_tdep->size_serial_struct = 60;
7717       record_tdep->size_serial_icounter_struct = 80;
7718       record_tdep->size_size_t = 4;
7719       record_tdep->size_iovec = 8;
7720       record_tdep->size_time_t = 4;
7721     }
7722
7723   /* These values are the second argument of system call "sys_fcntl"
7724      and "sys_fcntl64".  They are obtained from Linux Kernel source.  */
7725   record_tdep->fcntl_F_GETLK = 5;
7726   record_tdep->fcntl_F_GETLK64 = 12;
7727   record_tdep->fcntl_F_SETLK64 = 13;
7728   record_tdep->fcntl_F_SETLKW64 = 14;
7729
7730   record_tdep->arg1 = S390_R2_REGNUM;
7731   record_tdep->arg2 = S390_R3_REGNUM;
7732   record_tdep->arg3 = S390_R4_REGNUM;
7733   record_tdep->arg4 = S390_R5_REGNUM;
7734   record_tdep->arg5 = S390_R6_REGNUM;
7735
7736   /* These values are the second argument of system call "sys_ioctl".
7737      They are obtained from Linux Kernel source.
7738      See arch/s390/include/uapi/asm/ioctls.h.  */
7739
7740   record_tdep->ioctl_TCGETS = 0x5401;
7741   record_tdep->ioctl_TCSETS = 0x5402;
7742   record_tdep->ioctl_TCSETSW = 0x5403;
7743   record_tdep->ioctl_TCSETSF = 0x5404;
7744   record_tdep->ioctl_TCGETA = 0x5405;
7745   record_tdep->ioctl_TCSETA = 0x5406;
7746   record_tdep->ioctl_TCSETAW = 0x5407;
7747   record_tdep->ioctl_TCSETAF = 0x5408;
7748   record_tdep->ioctl_TCSBRK = 0x5409;
7749   record_tdep->ioctl_TCXONC = 0x540a;
7750   record_tdep->ioctl_TCFLSH = 0x540b;
7751   record_tdep->ioctl_TIOCEXCL = 0x540c;
7752   record_tdep->ioctl_TIOCNXCL = 0x540d;
7753   record_tdep->ioctl_TIOCSCTTY = 0x540e;
7754   record_tdep->ioctl_TIOCGPGRP = 0x540f;
7755   record_tdep->ioctl_TIOCSPGRP = 0x5410;
7756   record_tdep->ioctl_TIOCOUTQ = 0x5411;
7757   record_tdep->ioctl_TIOCSTI = 0x5412;
7758   record_tdep->ioctl_TIOCGWINSZ = 0x5413;
7759   record_tdep->ioctl_TIOCSWINSZ = 0x5414;
7760   record_tdep->ioctl_TIOCMGET = 0x5415;
7761   record_tdep->ioctl_TIOCMBIS = 0x5416;
7762   record_tdep->ioctl_TIOCMBIC = 0x5417;
7763   record_tdep->ioctl_TIOCMSET = 0x5418;
7764   record_tdep->ioctl_TIOCGSOFTCAR = 0x5419;
7765   record_tdep->ioctl_TIOCSSOFTCAR = 0x541a;
7766   record_tdep->ioctl_FIONREAD = 0x541b;
7767   record_tdep->ioctl_TIOCINQ = 0x541b; /* alias */
7768   record_tdep->ioctl_TIOCLINUX = 0x541c;
7769   record_tdep->ioctl_TIOCCONS = 0x541d;
7770   record_tdep->ioctl_TIOCGSERIAL = 0x541e;
7771   record_tdep->ioctl_TIOCSSERIAL = 0x541f;
7772   record_tdep->ioctl_TIOCPKT = 0x5420;
7773   record_tdep->ioctl_FIONBIO = 0x5421;
7774   record_tdep->ioctl_TIOCNOTTY = 0x5422;
7775   record_tdep->ioctl_TIOCSETD = 0x5423;
7776   record_tdep->ioctl_TIOCGETD = 0x5424;
7777   record_tdep->ioctl_TCSBRKP = 0x5425;
7778   record_tdep->ioctl_TIOCSBRK = 0x5427;
7779   record_tdep->ioctl_TIOCCBRK = 0x5428;
7780   record_tdep->ioctl_TIOCGSID = 0x5429;
7781   record_tdep->ioctl_TCGETS2 = 0x802c542a;
7782   record_tdep->ioctl_TCSETS2 = 0x402c542b;
7783   record_tdep->ioctl_TCSETSW2 = 0x402c542c;
7784   record_tdep->ioctl_TCSETSF2 = 0x402c542d;
7785   record_tdep->ioctl_TIOCGPTN = 0x80045430;
7786   record_tdep->ioctl_TIOCSPTLCK = 0x40045431;
7787   record_tdep->ioctl_FIONCLEX = 0x5450;
7788   record_tdep->ioctl_FIOCLEX = 0x5451;
7789   record_tdep->ioctl_FIOASYNC = 0x5452;
7790   record_tdep->ioctl_TIOCSERCONFIG = 0x5453;
7791   record_tdep->ioctl_TIOCSERGWILD = 0x5454;
7792   record_tdep->ioctl_TIOCSERSWILD = 0x5455;
7793   record_tdep->ioctl_TIOCGLCKTRMIOS = 0x5456;
7794   record_tdep->ioctl_TIOCSLCKTRMIOS = 0x5457;
7795   record_tdep->ioctl_TIOCSERGSTRUCT = 0x5458;
7796   record_tdep->ioctl_TIOCSERGETLSR = 0x5459;
7797   record_tdep->ioctl_TIOCSERGETMULTI = 0x545a;
7798   record_tdep->ioctl_TIOCSERSETMULTI = 0x545b;
7799   record_tdep->ioctl_TIOCMIWAIT = 0x545c;
7800   record_tdep->ioctl_TIOCGICOUNT = 0x545d;
7801   record_tdep->ioctl_FIOQSIZE = 0x545e;
7802 }
7803
7804 /* Set up gdbarch struct.  */
7805
7806 static struct gdbarch *
7807 s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
7808 {
7809   const struct target_desc *tdesc = info.target_desc;
7810   struct tdesc_arch_data *tdesc_data = NULL;
7811   struct gdbarch *gdbarch;
7812   struct gdbarch_tdep *tdep;
7813   enum s390_abi_kind tdep_abi;
7814   enum s390_vector_abi_kind vector_abi;
7815   int have_upper = 0;
7816   int have_linux_v1 = 0;
7817   int have_linux_v2 = 0;
7818   int have_tdb = 0;
7819   int have_vx = 0;
7820   int have_gs = 0;
7821   int first_pseudo_reg, last_pseudo_reg;
7822   static const char *const stap_register_prefixes[] = { "%", NULL };
7823   static const char *const stap_register_indirection_prefixes[] = { "(",
7824                                                                     NULL };
7825   static const char *const stap_register_indirection_suffixes[] = { ")",
7826                                                                     NULL };
7827
7828   /* Default ABI and register size.  */
7829   switch (info.bfd_arch_info->mach)
7830     {
7831     case bfd_mach_s390_31:
7832       tdep_abi = ABI_LINUX_S390;
7833       break;
7834
7835     case bfd_mach_s390_64:
7836       tdep_abi = ABI_LINUX_ZSERIES;
7837       break;
7838
7839     default:
7840       return NULL;
7841     }
7842
7843   /* Use default target description if none provided by the target.  */
7844   if (!tdesc_has_registers (tdesc))
7845     {
7846       if (tdep_abi == ABI_LINUX_S390)
7847         tdesc = tdesc_s390_linux32;
7848       else
7849         tdesc = tdesc_s390x_linux64;
7850     }
7851
7852   /* Check any target description for validity.  */
7853   if (tdesc_has_registers (tdesc))
7854     {
7855       static const char *const gprs[] = {
7856         "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7857         "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
7858       };
7859       static const char *const fprs[] = {
7860         "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
7861         "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15"
7862       };
7863       static const char *const acrs[] = {
7864         "acr0", "acr1", "acr2", "acr3", "acr4", "acr5", "acr6", "acr7",
7865         "acr8", "acr9", "acr10", "acr11", "acr12", "acr13", "acr14", "acr15"
7866       };
7867       static const char *const gprs_lower[] = {
7868         "r0l", "r1l", "r2l", "r3l", "r4l", "r5l", "r6l", "r7l",
7869         "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l"
7870       };
7871       static const char *const gprs_upper[] = {
7872         "r0h", "r1h", "r2h", "r3h", "r4h", "r5h", "r6h", "r7h",
7873         "r8h", "r9h", "r10h", "r11h", "r12h", "r13h", "r14h", "r15h"
7874       };
7875       static const char *const tdb_regs[] = {
7876         "tdb0", "tac", "tct", "atia",
7877         "tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7",
7878         "tr8", "tr9", "tr10", "tr11", "tr12", "tr13", "tr14", "tr15"
7879       };
7880       static const char *const vxrs_low[] = {
7881         "v0l", "v1l", "v2l", "v3l", "v4l", "v5l", "v6l", "v7l", "v8l",
7882         "v9l", "v10l", "v11l", "v12l", "v13l", "v14l", "v15l",
7883       };
7884       static const char *const vxrs_high[] = {
7885         "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24",
7886         "v25", "v26", "v27", "v28", "v29", "v30", "v31",
7887       };
7888       static const char *const gs_cb[] = {
7889         "gsd", "gssm", "gsepla",
7890       };
7891       static const char *const gs_bc[] = {
7892         "bc_gsd", "bc_gssm", "bc_gsepla",
7893       };
7894       const struct tdesc_feature *feature;
7895       int i, valid_p = 1;
7896
7897       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.core");
7898       if (feature == NULL)
7899         return NULL;
7900
7901       tdesc_data = tdesc_data_alloc ();
7902
7903       valid_p &= tdesc_numbered_register (feature, tdesc_data,
7904                                           S390_PSWM_REGNUM, "pswm");
7905       valid_p &= tdesc_numbered_register (feature, tdesc_data,
7906                                           S390_PSWA_REGNUM, "pswa");
7907
7908       if (tdesc_unnumbered_register (feature, "r0"))
7909         {
7910           for (i = 0; i < 16; i++)
7911             valid_p &= tdesc_numbered_register (feature, tdesc_data,
7912                                                 S390_R0_REGNUM + i, gprs[i]);
7913         }
7914       else
7915         {
7916           have_upper = 1;
7917
7918           for (i = 0; i < 16; i++)
7919             valid_p &= tdesc_numbered_register (feature, tdesc_data,
7920                                                 S390_R0_REGNUM + i,
7921                                                 gprs_lower[i]);
7922           for (i = 0; i < 16; i++)
7923             valid_p &= tdesc_numbered_register (feature, tdesc_data,
7924                                                 S390_R0_UPPER_REGNUM + i,
7925                                                 gprs_upper[i]);
7926         }
7927
7928       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.fpr");
7929       if (feature == NULL)
7930         {
7931           tdesc_data_cleanup (tdesc_data);
7932           return NULL;
7933         }
7934
7935       valid_p &= tdesc_numbered_register (feature, tdesc_data,
7936                                           S390_FPC_REGNUM, "fpc");
7937       for (i = 0; i < 16; i++)
7938         valid_p &= tdesc_numbered_register (feature, tdesc_data,
7939                                             S390_F0_REGNUM + i, fprs[i]);
7940
7941       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.acr");
7942       if (feature == NULL)
7943         {
7944           tdesc_data_cleanup (tdesc_data);
7945           return NULL;
7946         }
7947
7948       for (i = 0; i < 16; i++)
7949         valid_p &= tdesc_numbered_register (feature, tdesc_data,
7950                                             S390_A0_REGNUM + i, acrs[i]);
7951
7952       /* Optional GNU/Linux-specific "registers".  */
7953       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.linux");
7954       if (feature)
7955         {
7956           tdesc_numbered_register (feature, tdesc_data,
7957                                    S390_ORIG_R2_REGNUM, "orig_r2");
7958
7959           if (tdesc_numbered_register (feature, tdesc_data,
7960                                        S390_LAST_BREAK_REGNUM, "last_break"))
7961             have_linux_v1 = 1;
7962
7963           if (tdesc_numbered_register (feature, tdesc_data,
7964                                        S390_SYSTEM_CALL_REGNUM, "system_call"))
7965             have_linux_v2 = 1;
7966
7967           if (have_linux_v2 > have_linux_v1)
7968             valid_p = 0;
7969         }
7970
7971       /* Transaction diagnostic block.  */
7972       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.tdb");
7973       if (feature)
7974         {
7975           for (i = 0; i < ARRAY_SIZE (tdb_regs); i++)
7976             valid_p &= tdesc_numbered_register (feature, tdesc_data,
7977                                                 S390_TDB_DWORD0_REGNUM + i,
7978                                                 tdb_regs[i]);
7979           have_tdb = 1;
7980         }
7981
7982       /* Vector registers.  */
7983       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.vx");
7984       if (feature)
7985         {
7986           for (i = 0; i < 16; i++)
7987             valid_p &= tdesc_numbered_register (feature, tdesc_data,
7988                                                 S390_V0_LOWER_REGNUM + i,
7989                                                 vxrs_low[i]);
7990           for (i = 0; i < 16; i++)
7991             valid_p &= tdesc_numbered_register (feature, tdesc_data,
7992                                                 S390_V16_REGNUM + i,
7993                                                 vxrs_high[i]);
7994           have_vx = 1;
7995         }
7996
7997       /* Guarded-storage registers.  */
7998       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.gs");
7999       if (feature)
8000         {
8001           for (i = 0; i < 3; i++)
8002             valid_p &= tdesc_numbered_register (feature, tdesc_data,
8003                                                 S390_GSD_REGNUM + i,
8004                                                 gs_cb[i]);
8005           have_gs = 1;
8006         }
8007
8008       /* Guarded-storage broadcast control.  */
8009       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.gsbc");
8010       if (feature)
8011         {
8012           valid_p &= have_gs;
8013
8014           for (i = 0; i < 3; i++)
8015             valid_p &= tdesc_numbered_register (feature, tdesc_data,
8016                                                 S390_BC_GSD_REGNUM + i,
8017                                                 gs_bc[i]);
8018         }
8019
8020       if (!valid_p)
8021         {
8022           tdesc_data_cleanup (tdesc_data);
8023           return NULL;
8024         }
8025     }
8026
8027   /* Determine vector ABI.  */
8028   vector_abi = S390_VECTOR_ABI_NONE;
8029 #ifdef HAVE_ELF
8030   if (have_vx
8031       && info.abfd != NULL
8032       && info.abfd->format == bfd_object
8033       && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour
8034       && bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_GNU,
8035                                    Tag_GNU_S390_ABI_Vector) == 2)
8036     vector_abi = S390_VECTOR_ABI_128;
8037 #endif
8038
8039   /* Find a candidate among extant architectures.  */
8040   for (arches = gdbarch_list_lookup_by_info (arches, &info);
8041        arches != NULL;
8042        arches = gdbarch_list_lookup_by_info (arches->next, &info))
8043     {
8044       tdep = gdbarch_tdep (arches->gdbarch);
8045       if (!tdep)
8046         continue;
8047       if (tdep->abi != tdep_abi)
8048         continue;
8049       if (tdep->vector_abi != vector_abi)
8050         continue;
8051       if ((tdep->gpr_full_regnum != -1) != have_upper)
8052         continue;
8053       if (tdep->have_gs != have_gs)
8054         continue;
8055       if (tdesc_data != NULL)
8056         tdesc_data_cleanup (tdesc_data);
8057       return arches->gdbarch;
8058     }
8059
8060   /* Otherwise create a new gdbarch for the specified machine type.  */
8061   tdep = XCNEW (struct gdbarch_tdep);
8062   tdep->abi = tdep_abi;
8063   tdep->vector_abi = vector_abi;
8064   tdep->have_linux_v1 = have_linux_v1;
8065   tdep->have_linux_v2 = have_linux_v2;
8066   tdep->have_tdb = have_tdb;
8067   tdep->have_gs = have_gs;
8068   gdbarch = gdbarch_alloc (&info, tdep);
8069
8070   set_gdbarch_believe_pcc_promotion (gdbarch, 0);
8071   set_gdbarch_char_signed (gdbarch, 0);
8072
8073   /* S/390 GNU/Linux uses either 64-bit or 128-bit long doubles.
8074      We can safely let them default to 128-bit, since the debug info
8075      will give the size of type actually used in each case.  */
8076   set_gdbarch_long_double_bit (gdbarch, 128);
8077   set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
8078
8079   /* Amount PC must be decremented by after a breakpoint.  This is
8080      often the number of bytes returned by gdbarch_breakpoint_from_pc but not
8081      always.  */
8082   set_gdbarch_decr_pc_after_break (gdbarch, 2);
8083   /* Stack grows downward.  */
8084   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
8085   set_gdbarch_breakpoint_kind_from_pc (gdbarch, s390_breakpoint::kind_from_pc);
8086   set_gdbarch_sw_breakpoint_from_kind (gdbarch, s390_breakpoint::bp_from_kind);
8087   set_gdbarch_software_single_step (gdbarch, s390_software_single_step);
8088   set_gdbarch_displaced_step_hw_singlestep (gdbarch, s390_displaced_step_hw_singlestep);
8089   set_gdbarch_skip_prologue (gdbarch, s390_skip_prologue);
8090   set_gdbarch_stack_frame_destroyed_p (gdbarch, s390_stack_frame_destroyed_p);
8091
8092   set_gdbarch_num_regs (gdbarch, S390_NUM_REGS);
8093   set_gdbarch_sp_regnum (gdbarch, S390_SP_REGNUM);
8094   set_gdbarch_fp0_regnum (gdbarch, S390_F0_REGNUM);
8095   set_gdbarch_stab_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum);
8096   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum);
8097   set_gdbarch_value_from_register (gdbarch, s390_value_from_register);
8098   set_gdbarch_core_read_description (gdbarch, s390_core_read_description);
8099   set_gdbarch_iterate_over_regset_sections (gdbarch,
8100                                             s390_iterate_over_regset_sections);
8101   set_gdbarch_cannot_store_register (gdbarch, s390_cannot_store_register);
8102   set_gdbarch_write_pc (gdbarch, s390_write_pc);
8103   set_gdbarch_guess_tracepoint_registers (gdbarch, s390_guess_tracepoint_registers);
8104   set_gdbarch_pseudo_register_read (gdbarch, s390_pseudo_register_read);
8105   set_gdbarch_pseudo_register_write (gdbarch, s390_pseudo_register_write);
8106   set_tdesc_pseudo_register_name (gdbarch, s390_pseudo_register_name);
8107   set_tdesc_pseudo_register_type (gdbarch, s390_pseudo_register_type);
8108   set_tdesc_pseudo_register_reggroup_p (gdbarch,
8109                                         s390_pseudo_register_reggroup_p);
8110   set_gdbarch_ax_pseudo_register_collect (gdbarch,
8111                                           s390_ax_pseudo_register_collect);
8112   set_gdbarch_ax_pseudo_register_push_stack
8113       (gdbarch, s390_ax_pseudo_register_push_stack);
8114   set_gdbarch_gen_return_address (gdbarch, s390_gen_return_address);
8115   tdesc_use_registers (gdbarch, tdesc, tdesc_data);
8116   set_gdbarch_register_name (gdbarch, s390_register_name);
8117
8118   /* Assign pseudo register numbers.  */
8119   first_pseudo_reg = gdbarch_num_regs (gdbarch);
8120   last_pseudo_reg = first_pseudo_reg;
8121   tdep->gpr_full_regnum = -1;
8122   if (have_upper)
8123     {
8124       tdep->gpr_full_regnum = last_pseudo_reg;
8125       last_pseudo_reg += 16;
8126     }
8127   tdep->v0_full_regnum = -1;
8128   if (have_vx)
8129     {
8130       tdep->v0_full_regnum = last_pseudo_reg;
8131       last_pseudo_reg += 16;
8132     }
8133   tdep->pc_regnum = last_pseudo_reg++;
8134   tdep->cc_regnum = last_pseudo_reg++;
8135   set_gdbarch_pc_regnum (gdbarch, tdep->pc_regnum);
8136   set_gdbarch_num_pseudo_regs (gdbarch, last_pseudo_reg - first_pseudo_reg);
8137
8138   /* Inferior function calls.  */
8139   set_gdbarch_push_dummy_call (gdbarch, s390_push_dummy_call);
8140   set_gdbarch_dummy_id (gdbarch, s390_dummy_id);
8141   set_gdbarch_frame_align (gdbarch, s390_frame_align);
8142   set_gdbarch_return_value (gdbarch, s390_return_value);
8143
8144   /* Syscall handling.  */
8145   set_gdbarch_get_syscall_number (gdbarch, s390_linux_get_syscall_number);
8146
8147   /* Frame handling.  */
8148   dwarf2_frame_set_init_reg (gdbarch, s390_dwarf2_frame_init_reg);
8149   dwarf2_frame_set_adjust_regnum (gdbarch, s390_adjust_frame_regnum);
8150   dwarf2_append_unwinders (gdbarch);
8151   frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
8152   frame_unwind_append_unwinder (gdbarch, &s390_stub_frame_unwind);
8153   frame_unwind_append_unwinder (gdbarch, &s390_sigtramp_frame_unwind);
8154   frame_unwind_append_unwinder (gdbarch, &s390_frame_unwind);
8155   frame_base_set_default (gdbarch, &s390_frame_base);
8156   set_gdbarch_unwind_pc (gdbarch, s390_unwind_pc);
8157   set_gdbarch_unwind_sp (gdbarch, s390_unwind_sp);
8158
8159   /* Displaced stepping.  */
8160   set_gdbarch_displaced_step_copy_insn (gdbarch,
8161                                         s390_displaced_step_copy_insn);
8162   set_gdbarch_displaced_step_fixup (gdbarch, s390_displaced_step_fixup);
8163   set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location);
8164   set_gdbarch_max_insn_length (gdbarch, S390_MAX_INSTR_SIZE);
8165
8166   /* Note that GNU/Linux is the only OS supported on this
8167      platform.  */
8168   linux_init_abi (info, gdbarch);
8169
8170   switch (tdep->abi)
8171     {
8172     case ABI_LINUX_S390:
8173       set_gdbarch_addr_bits_remove (gdbarch, s390_addr_bits_remove);
8174       set_solib_svr4_fetch_link_map_offsets
8175         (gdbarch, svr4_ilp32_fetch_link_map_offsets);
8176
8177       set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390);
8178       break;
8179
8180     case ABI_LINUX_ZSERIES:
8181       set_gdbarch_long_bit (gdbarch, 64);
8182       set_gdbarch_long_long_bit (gdbarch, 64);
8183       set_gdbarch_ptr_bit (gdbarch, 64);
8184       set_solib_svr4_fetch_link_map_offsets
8185         (gdbarch, svr4_lp64_fetch_link_map_offsets);
8186       set_gdbarch_address_class_type_flags (gdbarch,
8187                                             s390_address_class_type_flags);
8188       set_gdbarch_address_class_type_flags_to_name (gdbarch,
8189                                                     s390_address_class_type_flags_to_name);
8190       set_gdbarch_address_class_name_to_type_flags (gdbarch,
8191                                                     s390_address_class_name_to_type_flags);
8192       set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390X);
8193       break;
8194     }
8195
8196   set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
8197
8198   /* Enable TLS support.  */
8199   set_gdbarch_fetch_tls_load_module_address (gdbarch,
8200                                              svr4_fetch_objfile_link_map);
8201
8202   /* SystemTap functions.  */
8203   set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
8204   set_gdbarch_stap_register_indirection_prefixes (gdbarch,
8205                                           stap_register_indirection_prefixes);
8206   set_gdbarch_stap_register_indirection_suffixes (gdbarch,
8207                                           stap_register_indirection_suffixes);
8208   set_gdbarch_stap_is_single_operand (gdbarch, s390_stap_is_single_operand);
8209   set_gdbarch_gcc_target_options (gdbarch, s390_gcc_target_options);
8210   set_gdbarch_gnu_triplet_regexp (gdbarch, s390_gnu_triplet_regexp);
8211
8212   /* Support reverse debugging.  */
8213
8214   set_gdbarch_process_record (gdbarch, s390_process_record);
8215   set_gdbarch_process_record_signal (gdbarch, s390_linux_record_signal);
8216
8217   s390_init_linux_record_tdep (&s390_linux_record_tdep, ABI_LINUX_S390);
8218   s390_init_linux_record_tdep (&s390x_linux_record_tdep, ABI_LINUX_ZSERIES);
8219
8220   set_gdbarch_disassembler_options (gdbarch, &s390_disassembler_options);
8221   set_gdbarch_valid_disassembler_options (gdbarch,
8222                                           disassembler_options_s390 ());
8223
8224   return gdbarch;
8225 }
8226
8227 void
8228 _initialize_s390_tdep (void)
8229 {
8230   /* Hook us into the gdbarch mechanism.  */
8231   register_gdbarch_init (bfd_arch_s390, s390_gdbarch_init);
8232
8233   /* Initialize the GNU/Linux target descriptions.  */
8234   initialize_tdesc_s390_linux32 ();
8235   initialize_tdesc_s390_linux32v1 ();
8236   initialize_tdesc_s390_linux32v2 ();
8237   initialize_tdesc_s390_linux64 ();
8238   initialize_tdesc_s390_linux64v1 ();
8239   initialize_tdesc_s390_linux64v2 ();
8240   initialize_tdesc_s390_te_linux64 ();
8241   initialize_tdesc_s390_vx_linux64 ();
8242   initialize_tdesc_s390_tevx_linux64 ();
8243   initialize_tdesc_s390_gs_linux64 ();
8244   initialize_tdesc_s390x_linux64 ();
8245   initialize_tdesc_s390x_linux64v1 ();
8246   initialize_tdesc_s390x_linux64v2 ();
8247   initialize_tdesc_s390x_te_linux64 ();
8248   initialize_tdesc_s390x_vx_linux64 ();
8249   initialize_tdesc_s390x_tevx_linux64 ();
8250   initialize_tdesc_s390x_gs_linux64 ();
8251 }