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