xref: /openbsd-src/gnu/usr.bin/binutils/gdb/s390-tdep.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* Target-dependent code for GDB, the GNU debugger.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis 
5b725ae77Skettenis    Contributed by D.J. Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6b725ae77Skettenis    for IBM Deutschland Entwicklung GmbH, IBM Corporation.
7b725ae77Skettenis 
8b725ae77Skettenis    This file is part of GDB.
9b725ae77Skettenis 
10b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
11b725ae77Skettenis    it under the terms of the GNU General Public License as published by
12b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
13b725ae77Skettenis    (at your option) any later version.
14b725ae77Skettenis 
15b725ae77Skettenis    This program is distributed in the hope that it will be useful,
16b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
17b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18b725ae77Skettenis    GNU General Public License for more details.
19b725ae77Skettenis 
20b725ae77Skettenis    You should have received a copy of the GNU General Public License
21b725ae77Skettenis    along with this program; if not, write to the Free Software
22b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23b725ae77Skettenis    02111-1307, USA.  */
24b725ae77Skettenis 
25b725ae77Skettenis #include "defs.h"
26b725ae77Skettenis #include "arch-utils.h"
27b725ae77Skettenis #include "frame.h"
28b725ae77Skettenis #include "inferior.h"
29b725ae77Skettenis #include "symtab.h"
30b725ae77Skettenis #include "target.h"
31b725ae77Skettenis #include "gdbcore.h"
32b725ae77Skettenis #include "gdbcmd.h"
33b725ae77Skettenis #include "objfiles.h"
34b725ae77Skettenis #include "tm.h"
35b725ae77Skettenis #include "../bfd/bfd.h"
36b725ae77Skettenis #include "floatformat.h"
37b725ae77Skettenis #include "regcache.h"
38b725ae77Skettenis #include "trad-frame.h"
39b725ae77Skettenis #include "frame-base.h"
40b725ae77Skettenis #include "frame-unwind.h"
41b725ae77Skettenis #include "dwarf2-frame.h"
42b725ae77Skettenis #include "reggroups.h"
43b725ae77Skettenis #include "regset.h"
44b725ae77Skettenis #include "value.h"
45b725ae77Skettenis #include "gdb_assert.h"
46b725ae77Skettenis #include "dis-asm.h"
47b725ae77Skettenis #include "solib-svr4.h"         /* For struct link_map_offsets.  */
48b725ae77Skettenis 
49b725ae77Skettenis #include "s390-tdep.h"
50b725ae77Skettenis 
51b725ae77Skettenis 
52b725ae77Skettenis /* The tdep structure.  */
53b725ae77Skettenis 
54b725ae77Skettenis struct gdbarch_tdep
55b725ae77Skettenis {
56b725ae77Skettenis   /* ABI version.  */
57b725ae77Skettenis   enum { ABI_LINUX_S390, ABI_LINUX_ZSERIES } abi;
58b725ae77Skettenis 
59b725ae77Skettenis   /* Core file register sets.  */
60b725ae77Skettenis   const struct regset *gregset;
61b725ae77Skettenis   int sizeof_gregset;
62b725ae77Skettenis 
63b725ae77Skettenis   const struct regset *fpregset;
64b725ae77Skettenis   int sizeof_fpregset;
65b725ae77Skettenis };
66b725ae77Skettenis 
67b725ae77Skettenis 
68b725ae77Skettenis /* Register information.  */
69b725ae77Skettenis 
70b725ae77Skettenis struct s390_register_info
71b725ae77Skettenis {
72b725ae77Skettenis   char *name;
73b725ae77Skettenis   struct type **type;
74b725ae77Skettenis };
75b725ae77Skettenis 
76b725ae77Skettenis static struct s390_register_info s390_register_info[S390_NUM_TOTAL_REGS] =
77b725ae77Skettenis {
78b725ae77Skettenis   /* Program Status Word.  */
79b725ae77Skettenis   { "pswm", &builtin_type_long },
80b725ae77Skettenis   { "pswa", &builtin_type_long },
81b725ae77Skettenis 
82b725ae77Skettenis   /* General Purpose Registers.  */
83b725ae77Skettenis   { "r0", &builtin_type_long },
84b725ae77Skettenis   { "r1", &builtin_type_long },
85b725ae77Skettenis   { "r2", &builtin_type_long },
86b725ae77Skettenis   { "r3", &builtin_type_long },
87b725ae77Skettenis   { "r4", &builtin_type_long },
88b725ae77Skettenis   { "r5", &builtin_type_long },
89b725ae77Skettenis   { "r6", &builtin_type_long },
90b725ae77Skettenis   { "r7", &builtin_type_long },
91b725ae77Skettenis   { "r8", &builtin_type_long },
92b725ae77Skettenis   { "r9", &builtin_type_long },
93b725ae77Skettenis   { "r10", &builtin_type_long },
94b725ae77Skettenis   { "r11", &builtin_type_long },
95b725ae77Skettenis   { "r12", &builtin_type_long },
96b725ae77Skettenis   { "r13", &builtin_type_long },
97b725ae77Skettenis   { "r14", &builtin_type_long },
98b725ae77Skettenis   { "r15", &builtin_type_long },
99b725ae77Skettenis 
100b725ae77Skettenis   /* Access Registers.  */
101b725ae77Skettenis   { "acr0", &builtin_type_int },
102b725ae77Skettenis   { "acr1", &builtin_type_int },
103b725ae77Skettenis   { "acr2", &builtin_type_int },
104b725ae77Skettenis   { "acr3", &builtin_type_int },
105b725ae77Skettenis   { "acr4", &builtin_type_int },
106b725ae77Skettenis   { "acr5", &builtin_type_int },
107b725ae77Skettenis   { "acr6", &builtin_type_int },
108b725ae77Skettenis   { "acr7", &builtin_type_int },
109b725ae77Skettenis   { "acr8", &builtin_type_int },
110b725ae77Skettenis   { "acr9", &builtin_type_int },
111b725ae77Skettenis   { "acr10", &builtin_type_int },
112b725ae77Skettenis   { "acr11", &builtin_type_int },
113b725ae77Skettenis   { "acr12", &builtin_type_int },
114b725ae77Skettenis   { "acr13", &builtin_type_int },
115b725ae77Skettenis   { "acr14", &builtin_type_int },
116b725ae77Skettenis   { "acr15", &builtin_type_int },
117b725ae77Skettenis 
118b725ae77Skettenis   /* Floating Point Control Word.  */
119b725ae77Skettenis   { "fpc", &builtin_type_int },
120b725ae77Skettenis 
121b725ae77Skettenis   /* Floating Point Registers.  */
122b725ae77Skettenis   { "f0", &builtin_type_double },
123b725ae77Skettenis   { "f1", &builtin_type_double },
124b725ae77Skettenis   { "f2", &builtin_type_double },
125b725ae77Skettenis   { "f3", &builtin_type_double },
126b725ae77Skettenis   { "f4", &builtin_type_double },
127b725ae77Skettenis   { "f5", &builtin_type_double },
128b725ae77Skettenis   { "f6", &builtin_type_double },
129b725ae77Skettenis   { "f7", &builtin_type_double },
130b725ae77Skettenis   { "f8", &builtin_type_double },
131b725ae77Skettenis   { "f9", &builtin_type_double },
132b725ae77Skettenis   { "f10", &builtin_type_double },
133b725ae77Skettenis   { "f11", &builtin_type_double },
134b725ae77Skettenis   { "f12", &builtin_type_double },
135b725ae77Skettenis   { "f13", &builtin_type_double },
136b725ae77Skettenis   { "f14", &builtin_type_double },
137b725ae77Skettenis   { "f15", &builtin_type_double },
138b725ae77Skettenis 
139b725ae77Skettenis   /* Pseudo registers.  */
140b725ae77Skettenis   { "pc", &builtin_type_void_func_ptr },
141b725ae77Skettenis   { "cc", &builtin_type_int },
142b725ae77Skettenis };
143b725ae77Skettenis 
144b725ae77Skettenis /* Return the name of register REGNUM.  */
145b725ae77Skettenis static const char *
s390_register_name(int regnum)146b725ae77Skettenis s390_register_name (int regnum)
147b725ae77Skettenis {
148b725ae77Skettenis   gdb_assert (regnum >= 0 && regnum < S390_NUM_TOTAL_REGS);
149b725ae77Skettenis   return s390_register_info[regnum].name;
150b725ae77Skettenis }
151b725ae77Skettenis 
152b725ae77Skettenis /* Return the GDB type object for the "standard" data type of data in
153b725ae77Skettenis    register REGNUM. */
154b725ae77Skettenis static struct type *
s390_register_type(struct gdbarch * gdbarch,int regnum)155b725ae77Skettenis s390_register_type (struct gdbarch *gdbarch, int regnum)
156b725ae77Skettenis {
157b725ae77Skettenis   gdb_assert (regnum >= 0 && regnum < S390_NUM_TOTAL_REGS);
158b725ae77Skettenis   return *s390_register_info[regnum].type;
159b725ae77Skettenis }
160b725ae77Skettenis 
161b725ae77Skettenis /* DWARF Register Mapping.  */
162b725ae77Skettenis 
163b725ae77Skettenis static int s390_dwarf_regmap[] =
164b725ae77Skettenis {
165b725ae77Skettenis   /* General Purpose Registers.  */
166b725ae77Skettenis   S390_R0_REGNUM, S390_R1_REGNUM, S390_R2_REGNUM, S390_R3_REGNUM,
167b725ae77Skettenis   S390_R4_REGNUM, S390_R5_REGNUM, S390_R6_REGNUM, S390_R7_REGNUM,
168b725ae77Skettenis   S390_R8_REGNUM, S390_R9_REGNUM, S390_R10_REGNUM, S390_R11_REGNUM,
169b725ae77Skettenis   S390_R12_REGNUM, S390_R13_REGNUM, S390_R14_REGNUM, S390_R15_REGNUM,
170b725ae77Skettenis 
171b725ae77Skettenis   /* Floating Point Registers.  */
172b725ae77Skettenis   S390_F0_REGNUM, S390_F2_REGNUM, S390_F4_REGNUM, S390_F6_REGNUM,
173b725ae77Skettenis   S390_F1_REGNUM, S390_F3_REGNUM, S390_F5_REGNUM, S390_F7_REGNUM,
174b725ae77Skettenis   S390_F8_REGNUM, S390_F10_REGNUM, S390_F12_REGNUM, S390_F14_REGNUM,
175b725ae77Skettenis   S390_F9_REGNUM, S390_F11_REGNUM, S390_F13_REGNUM, S390_F15_REGNUM,
176b725ae77Skettenis 
177b725ae77Skettenis   /* Control Registers (not mapped).  */
178b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
179b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
180b725ae77Skettenis 
181b725ae77Skettenis   /* Access Registers.  */
182b725ae77Skettenis   S390_A0_REGNUM, S390_A1_REGNUM, S390_A2_REGNUM, S390_A3_REGNUM,
183b725ae77Skettenis   S390_A4_REGNUM, S390_A5_REGNUM, S390_A6_REGNUM, S390_A7_REGNUM,
184b725ae77Skettenis   S390_A8_REGNUM, S390_A9_REGNUM, S390_A10_REGNUM, S390_A11_REGNUM,
185b725ae77Skettenis   S390_A12_REGNUM, S390_A13_REGNUM, S390_A14_REGNUM, S390_A15_REGNUM,
186b725ae77Skettenis 
187b725ae77Skettenis   /* Program Status Word.  */
188b725ae77Skettenis   S390_PSWM_REGNUM,
189b725ae77Skettenis   S390_PSWA_REGNUM
190b725ae77Skettenis };
191b725ae77Skettenis 
192b725ae77Skettenis /* Convert DWARF register number REG to the appropriate register
193b725ae77Skettenis    number used by GDB.  */
194b725ae77Skettenis static int
s390_dwarf_reg_to_regnum(int reg)195b725ae77Skettenis s390_dwarf_reg_to_regnum (int reg)
196b725ae77Skettenis {
197b725ae77Skettenis   int regnum = -1;
198b725ae77Skettenis 
199b725ae77Skettenis   if (reg >= 0 || reg < ARRAY_SIZE (s390_dwarf_regmap))
200b725ae77Skettenis     regnum = s390_dwarf_regmap[reg];
201b725ae77Skettenis 
202b725ae77Skettenis   if (regnum == -1)
203b725ae77Skettenis     warning ("Unmapped DWARF Register #%d encountered\n", reg);
204b725ae77Skettenis 
205b725ae77Skettenis   return regnum;
206b725ae77Skettenis }
207b725ae77Skettenis 
208b725ae77Skettenis /* Pseudo registers - PC and condition code.  */
209b725ae77Skettenis 
210b725ae77Skettenis static void
s390_pseudo_register_read(struct gdbarch * gdbarch,struct regcache * regcache,int regnum,void * buf)211b725ae77Skettenis s390_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
212b725ae77Skettenis 			   int regnum, void *buf)
213b725ae77Skettenis {
214b725ae77Skettenis   ULONGEST val;
215b725ae77Skettenis 
216b725ae77Skettenis   switch (regnum)
217b725ae77Skettenis     {
218b725ae77Skettenis     case S390_PC_REGNUM:
219b725ae77Skettenis       regcache_raw_read_unsigned (regcache, S390_PSWA_REGNUM, &val);
220b725ae77Skettenis       store_unsigned_integer (buf, 4, val & 0x7fffffff);
221b725ae77Skettenis       break;
222b725ae77Skettenis 
223b725ae77Skettenis     case S390_CC_REGNUM:
224b725ae77Skettenis       regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &val);
225b725ae77Skettenis       store_unsigned_integer (buf, 4, (val >> 12) & 3);
226b725ae77Skettenis       break;
227b725ae77Skettenis 
228b725ae77Skettenis     default:
229b725ae77Skettenis       internal_error (__FILE__, __LINE__, "invalid regnum");
230b725ae77Skettenis     }
231b725ae77Skettenis }
232b725ae77Skettenis 
233b725ae77Skettenis static void
s390_pseudo_register_write(struct gdbarch * gdbarch,struct regcache * regcache,int regnum,const void * buf)234b725ae77Skettenis s390_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
235b725ae77Skettenis 			    int regnum, const void *buf)
236b725ae77Skettenis {
237b725ae77Skettenis   ULONGEST val, psw;
238b725ae77Skettenis 
239b725ae77Skettenis   switch (regnum)
240b725ae77Skettenis     {
241b725ae77Skettenis     case S390_PC_REGNUM:
242b725ae77Skettenis       val = extract_unsigned_integer (buf, 4);
243b725ae77Skettenis       regcache_raw_read_unsigned (regcache, S390_PSWA_REGNUM, &psw);
244b725ae77Skettenis       psw = (psw & 0x80000000) | (val & 0x7fffffff);
245b725ae77Skettenis       regcache_raw_write_unsigned (regcache, S390_PSWA_REGNUM, psw);
246b725ae77Skettenis       break;
247b725ae77Skettenis 
248b725ae77Skettenis     case S390_CC_REGNUM:
249b725ae77Skettenis       val = extract_unsigned_integer (buf, 4);
250b725ae77Skettenis       regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &psw);
251b725ae77Skettenis       psw = (psw & ~((ULONGEST)3 << 12)) | ((val & 3) << 12);
252b725ae77Skettenis       regcache_raw_write_unsigned (regcache, S390_PSWM_REGNUM, psw);
253b725ae77Skettenis       break;
254b725ae77Skettenis 
255b725ae77Skettenis     default:
256b725ae77Skettenis       internal_error (__FILE__, __LINE__, "invalid regnum");
257b725ae77Skettenis     }
258b725ae77Skettenis }
259b725ae77Skettenis 
260b725ae77Skettenis static void
s390x_pseudo_register_read(struct gdbarch * gdbarch,struct regcache * regcache,int regnum,void * buf)261b725ae77Skettenis s390x_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
262b725ae77Skettenis 			    int regnum, void *buf)
263b725ae77Skettenis {
264b725ae77Skettenis   ULONGEST val;
265b725ae77Skettenis 
266b725ae77Skettenis   switch (regnum)
267b725ae77Skettenis     {
268b725ae77Skettenis     case S390_PC_REGNUM:
269b725ae77Skettenis       regcache_raw_read (regcache, S390_PSWA_REGNUM, buf);
270b725ae77Skettenis       break;
271b725ae77Skettenis 
272b725ae77Skettenis     case S390_CC_REGNUM:
273b725ae77Skettenis       regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &val);
274b725ae77Skettenis       store_unsigned_integer (buf, 4, (val >> 44) & 3);
275b725ae77Skettenis       break;
276b725ae77Skettenis 
277b725ae77Skettenis     default:
278b725ae77Skettenis       internal_error (__FILE__, __LINE__, "invalid regnum");
279b725ae77Skettenis     }
280b725ae77Skettenis }
281b725ae77Skettenis 
282b725ae77Skettenis static void
s390x_pseudo_register_write(struct gdbarch * gdbarch,struct regcache * regcache,int regnum,const void * buf)283b725ae77Skettenis s390x_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
284b725ae77Skettenis 			     int regnum, const void *buf)
285b725ae77Skettenis {
286b725ae77Skettenis   ULONGEST val, psw;
287b725ae77Skettenis 
288b725ae77Skettenis   switch (regnum)
289b725ae77Skettenis     {
290b725ae77Skettenis     case S390_PC_REGNUM:
291b725ae77Skettenis       regcache_raw_write (regcache, S390_PSWA_REGNUM, buf);
292b725ae77Skettenis       break;
293b725ae77Skettenis 
294b725ae77Skettenis     case S390_CC_REGNUM:
295b725ae77Skettenis       val = extract_unsigned_integer (buf, 4);
296b725ae77Skettenis       regcache_raw_read_unsigned (regcache, S390_PSWM_REGNUM, &psw);
297b725ae77Skettenis       psw = (psw & ~((ULONGEST)3 << 44)) | ((val & 3) << 44);
298b725ae77Skettenis       regcache_raw_write_unsigned (regcache, S390_PSWM_REGNUM, psw);
299b725ae77Skettenis       break;
300b725ae77Skettenis 
301b725ae77Skettenis     default:
302b725ae77Skettenis       internal_error (__FILE__, __LINE__, "invalid regnum");
303b725ae77Skettenis     }
304b725ae77Skettenis }
305b725ae77Skettenis 
306b725ae77Skettenis /* 'float' values are stored in the upper half of floating-point
307b725ae77Skettenis    registers, even though we are otherwise a big-endian platform.  */
308b725ae77Skettenis 
309b725ae77Skettenis static int
s390_convert_register_p(int regno,struct type * type)310b725ae77Skettenis s390_convert_register_p (int regno, struct type *type)
311b725ae77Skettenis {
312b725ae77Skettenis   return (regno >= S390_F0_REGNUM && regno <= S390_F15_REGNUM)
313b725ae77Skettenis 	 && TYPE_LENGTH (type) < 8;
314b725ae77Skettenis }
315b725ae77Skettenis 
316b725ae77Skettenis static void
s390_register_to_value(struct frame_info * frame,int regnum,struct type * valtype,void * out)317b725ae77Skettenis s390_register_to_value (struct frame_info *frame, int regnum,
318b725ae77Skettenis                         struct type *valtype, void *out)
319b725ae77Skettenis {
320b725ae77Skettenis   char in[8];
321b725ae77Skettenis   int len = TYPE_LENGTH (valtype);
322b725ae77Skettenis   gdb_assert (len < 8);
323b725ae77Skettenis 
324b725ae77Skettenis   get_frame_register (frame, regnum, in);
325b725ae77Skettenis   memcpy (out, in, len);
326b725ae77Skettenis }
327b725ae77Skettenis 
328b725ae77Skettenis static void
s390_value_to_register(struct frame_info * frame,int regnum,struct type * valtype,const void * in)329b725ae77Skettenis s390_value_to_register (struct frame_info *frame, int regnum,
330b725ae77Skettenis                         struct type *valtype, const void *in)
331b725ae77Skettenis {
332b725ae77Skettenis   char out[8];
333b725ae77Skettenis   int len = TYPE_LENGTH (valtype);
334b725ae77Skettenis   gdb_assert (len < 8);
335b725ae77Skettenis 
336b725ae77Skettenis   memset (out, 0, 8);
337b725ae77Skettenis   memcpy (out, in, len);
338b725ae77Skettenis   put_frame_register (frame, regnum, out);
339b725ae77Skettenis }
340b725ae77Skettenis 
341b725ae77Skettenis /* Register groups.  */
342b725ae77Skettenis 
343b725ae77Skettenis static int
s390_register_reggroup_p(struct gdbarch * gdbarch,int regnum,struct reggroup * group)344b725ae77Skettenis s390_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
345b725ae77Skettenis 			  struct reggroup *group)
346b725ae77Skettenis {
347b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
348b725ae77Skettenis 
349b725ae77Skettenis   /* Registers displayed via 'info regs'.  */
350b725ae77Skettenis   if (group == general_reggroup)
351b725ae77Skettenis     return (regnum >= S390_R0_REGNUM && regnum <= S390_R15_REGNUM)
352b725ae77Skettenis 	   || regnum == S390_PC_REGNUM
353b725ae77Skettenis 	   || regnum == S390_CC_REGNUM;
354b725ae77Skettenis 
355b725ae77Skettenis   /* Registers displayed via 'info float'.  */
356b725ae77Skettenis   if (group == float_reggroup)
357b725ae77Skettenis     return (regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM)
358b725ae77Skettenis 	   || regnum == S390_FPC_REGNUM;
359b725ae77Skettenis 
360b725ae77Skettenis   /* Registers that need to be saved/restored in order to
361b725ae77Skettenis      push or pop frames.  */
362b725ae77Skettenis   if (group == save_reggroup || group == restore_reggroup)
363b725ae77Skettenis     return regnum != S390_PSWM_REGNUM && regnum != S390_PSWA_REGNUM;
364b725ae77Skettenis 
365b725ae77Skettenis   return default_register_reggroup_p (gdbarch, regnum, group);
366b725ae77Skettenis }
367b725ae77Skettenis 
368b725ae77Skettenis 
369b725ae77Skettenis /* Core file register sets.  */
370b725ae77Skettenis 
371b725ae77Skettenis int s390_regmap_gregset[S390_NUM_REGS] =
372b725ae77Skettenis {
373b725ae77Skettenis   /* Program Status Word.  */
374b725ae77Skettenis   0x00, 0x04,
375b725ae77Skettenis   /* General Purpose Registers.  */
376b725ae77Skettenis   0x08, 0x0c, 0x10, 0x14,
377b725ae77Skettenis   0x18, 0x1c, 0x20, 0x24,
378b725ae77Skettenis   0x28, 0x2c, 0x30, 0x34,
379b725ae77Skettenis   0x38, 0x3c, 0x40, 0x44,
380b725ae77Skettenis   /* Access Registers.  */
381b725ae77Skettenis   0x48, 0x4c, 0x50, 0x54,
382b725ae77Skettenis   0x58, 0x5c, 0x60, 0x64,
383b725ae77Skettenis   0x68, 0x6c, 0x70, 0x74,
384b725ae77Skettenis   0x78, 0x7c, 0x80, 0x84,
385b725ae77Skettenis   /* Floating Point Control Word.  */
386b725ae77Skettenis   -1,
387b725ae77Skettenis   /* Floating Point Registers.  */
388b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
389b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
390b725ae77Skettenis };
391b725ae77Skettenis 
392b725ae77Skettenis int s390x_regmap_gregset[S390_NUM_REGS] =
393b725ae77Skettenis {
394b725ae77Skettenis   0x00, 0x08,
395b725ae77Skettenis   /* General Purpose Registers.  */
396b725ae77Skettenis   0x10, 0x18, 0x20, 0x28,
397b725ae77Skettenis   0x30, 0x38, 0x40, 0x48,
398b725ae77Skettenis   0x50, 0x58, 0x60, 0x68,
399b725ae77Skettenis   0x70, 0x78, 0x80, 0x88,
400b725ae77Skettenis   /* Access Registers.  */
401b725ae77Skettenis   0x90, 0x94, 0x98, 0x9c,
402b725ae77Skettenis   0xa0, 0xa4, 0xa8, 0xac,
403b725ae77Skettenis   0xb0, 0xb4, 0xb8, 0xbc,
404b725ae77Skettenis   0xc0, 0xc4, 0xc8, 0xcc,
405b725ae77Skettenis   /* Floating Point Control Word.  */
406b725ae77Skettenis   -1,
407b725ae77Skettenis   /* Floating Point Registers.  */
408b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
409b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
410b725ae77Skettenis };
411b725ae77Skettenis 
412b725ae77Skettenis int s390_regmap_fpregset[S390_NUM_REGS] =
413b725ae77Skettenis {
414b725ae77Skettenis   /* Program Status Word.  */
415b725ae77Skettenis   -1, -1,
416b725ae77Skettenis   /* General Purpose Registers.  */
417b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
418b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
419b725ae77Skettenis   /* Access Registers.  */
420b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
421b725ae77Skettenis   -1, -1, -1, -1, -1, -1, -1, -1,
422b725ae77Skettenis   /* Floating Point Control Word.  */
423b725ae77Skettenis   0x00,
424b725ae77Skettenis   /* Floating Point Registers.  */
425b725ae77Skettenis   0x08, 0x10, 0x18, 0x20,
426b725ae77Skettenis   0x28, 0x30, 0x38, 0x40,
427b725ae77Skettenis   0x48, 0x50, 0x58, 0x60,
428b725ae77Skettenis   0x68, 0x70, 0x78, 0x80,
429b725ae77Skettenis };
430b725ae77Skettenis 
431b725ae77Skettenis /* Supply register REGNUM from the register set REGSET to register cache
432b725ae77Skettenis    REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
433b725ae77Skettenis static void
s390_supply_regset(const struct regset * regset,struct regcache * regcache,int regnum,const void * regs,size_t len)434b725ae77Skettenis s390_supply_regset (const struct regset *regset, struct regcache *regcache,
435b725ae77Skettenis 		    int regnum, const void *regs, size_t len)
436b725ae77Skettenis {
437b725ae77Skettenis   const int *offset = regset->descr;
438b725ae77Skettenis   int i;
439b725ae77Skettenis 
440b725ae77Skettenis   for (i = 0; i < S390_NUM_REGS; i++)
441b725ae77Skettenis     {
442b725ae77Skettenis       if ((regnum == i || regnum == -1) && offset[i] != -1)
443b725ae77Skettenis 	regcache_raw_supply (regcache, i, (const char *)regs + offset[i]);
444b725ae77Skettenis     }
445b725ae77Skettenis }
446b725ae77Skettenis 
447b725ae77Skettenis static const struct regset s390_gregset = {
448b725ae77Skettenis   s390_regmap_gregset,
449b725ae77Skettenis   s390_supply_regset
450b725ae77Skettenis };
451b725ae77Skettenis 
452b725ae77Skettenis static const struct regset s390x_gregset = {
453b725ae77Skettenis   s390x_regmap_gregset,
454b725ae77Skettenis   s390_supply_regset
455b725ae77Skettenis };
456b725ae77Skettenis 
457b725ae77Skettenis static const struct regset s390_fpregset = {
458b725ae77Skettenis   s390_regmap_fpregset,
459b725ae77Skettenis   s390_supply_regset
460b725ae77Skettenis };
461b725ae77Skettenis 
462b725ae77Skettenis /* Return the appropriate register set for the core section identified
463b725ae77Skettenis    by SECT_NAME and SECT_SIZE.  */
464b725ae77Skettenis const struct regset *
s390_regset_from_core_section(struct gdbarch * gdbarch,const char * sect_name,size_t sect_size)465b725ae77Skettenis s390_regset_from_core_section (struct gdbarch *gdbarch,
466b725ae77Skettenis 			       const char *sect_name, size_t sect_size)
467b725ae77Skettenis {
468b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
469b725ae77Skettenis 
470b725ae77Skettenis   if (strcmp (sect_name, ".reg") == 0 && sect_size == tdep->sizeof_gregset)
471b725ae77Skettenis     return tdep->gregset;
472b725ae77Skettenis 
473b725ae77Skettenis   if (strcmp (sect_name, ".reg2") == 0 && sect_size == tdep->sizeof_fpregset)
474b725ae77Skettenis     return tdep->fpregset;
475b725ae77Skettenis 
476b725ae77Skettenis   return NULL;
477b725ae77Skettenis }
478b725ae77Skettenis 
479b725ae77Skettenis 
480b725ae77Skettenis /* Prologue analysis.  */
481b725ae77Skettenis 
482b725ae77Skettenis /* When we analyze a prologue, we're really doing 'abstract
483b725ae77Skettenis    interpretation' or 'pseudo-evaluation': running the function's code
484b725ae77Skettenis    in simulation, but using conservative approximations of the values
485b725ae77Skettenis    it would have when it actually runs.  For example, if our function
486b725ae77Skettenis    starts with the instruction:
487b725ae77Skettenis 
488b725ae77Skettenis       ahi r1, 42     # add halfword immediate 42 to r1
489b725ae77Skettenis 
490b725ae77Skettenis    we don't know exactly what value will be in r1 after executing this
491b725ae77Skettenis    instruction, but we do know it'll be 42 greater than its original
492b725ae77Skettenis    value.
493b725ae77Skettenis 
494b725ae77Skettenis    If we then see an instruction like:
495b725ae77Skettenis 
496b725ae77Skettenis       ahi r1, 22     # add halfword immediate 22 to r1
497b725ae77Skettenis 
498b725ae77Skettenis    we still don't know what r1's value is, but again, we can say it is
499b725ae77Skettenis    now 64 greater than its original value.
500b725ae77Skettenis 
501b725ae77Skettenis    If the next instruction were:
502b725ae77Skettenis 
503b725ae77Skettenis       lr r2, r1      # set r2 to r1's value
504b725ae77Skettenis 
505b725ae77Skettenis    then we can say that r2's value is now the original value of r1
506b725ae77Skettenis    plus 64.  And so on.
507b725ae77Skettenis 
508b725ae77Skettenis    Of course, this can only go so far before it gets unreasonable.  If
509b725ae77Skettenis    we wanted to be able to say anything about the value of r1 after
510b725ae77Skettenis    the instruction:
511b725ae77Skettenis 
512b725ae77Skettenis       xr r1, r3      # exclusive-or r1 and r3, place result in r1
513b725ae77Skettenis 
514b725ae77Skettenis    then things would get pretty complex.  But remember, we're just
515b725ae77Skettenis    doing a conservative approximation; if exclusive-or instructions
516b725ae77Skettenis    aren't relevant to prologues, we can just say r1's value is now
517b725ae77Skettenis    'unknown'.  We can ignore things that are too complex, if that loss
518b725ae77Skettenis    of information is acceptable for our application.
519b725ae77Skettenis 
520b725ae77Skettenis    Once you've reached an instruction that you don't know how to
521b725ae77Skettenis    simulate, you stop.  Now you examine the state of the registers and
522b725ae77Skettenis    stack slots you've kept track of.  For example:
523b725ae77Skettenis 
524b725ae77Skettenis    - To see how large your stack frame is, just check the value of sp;
525b725ae77Skettenis      if it's the original value of sp minus a constant, then that
526b725ae77Skettenis      constant is the stack frame's size.  If the sp's value has been
527b725ae77Skettenis      marked as 'unknown', then that means the prologue has done
528b725ae77Skettenis      something too complex for us to track, and we don't know the
529b725ae77Skettenis      frame size.
530b725ae77Skettenis 
531b725ae77Skettenis    - To see whether we've saved the SP in the current frame's back
532b725ae77Skettenis      chain slot, we just check whether the current value of the back
533b725ae77Skettenis      chain stack slot is the original value of the sp.
534b725ae77Skettenis 
535b725ae77Skettenis    Sure, this takes some work.  But prologue analyzers aren't
536b725ae77Skettenis    quick-and-simple pattern patching to recognize a few fixed prologue
537b725ae77Skettenis    forms any more; they're big, hairy functions.  Along with inferior
538b725ae77Skettenis    function calls, prologue analysis accounts for a substantial
539b725ae77Skettenis    portion of the time needed to stabilize a GDB port.  So I think
540b725ae77Skettenis    it's worthwhile to look for an approach that will be easier to
541b725ae77Skettenis    understand and maintain.  In the approach used here:
542b725ae77Skettenis 
543b725ae77Skettenis    - It's easier to see that the analyzer is correct: you just see
544b725ae77Skettenis      whether the analyzer properly (albiet conservatively) simulates
545b725ae77Skettenis      the effect of each instruction.
546b725ae77Skettenis 
547b725ae77Skettenis    - It's easier to extend the analyzer: you can add support for new
548b725ae77Skettenis      instructions, and know that you haven't broken anything that
549b725ae77Skettenis      wasn't already broken before.
550b725ae77Skettenis 
551b725ae77Skettenis    - It's orthogonal: to gather new information, you don't need to
552b725ae77Skettenis      complicate the code for each instruction.  As long as your domain
553b725ae77Skettenis      of conservative values is already detailed enough to tell you
554b725ae77Skettenis      what you need, then all the existing instruction simulations are
555b725ae77Skettenis      already gathering the right data for you.
556b725ae77Skettenis 
557b725ae77Skettenis    A 'struct prologue_value' is a conservative approximation of the
558b725ae77Skettenis    real value the register or stack slot will have.  */
559b725ae77Skettenis 
560b725ae77Skettenis struct prologue_value {
561b725ae77Skettenis 
562b725ae77Skettenis   /* What sort of value is this?  This determines the interpretation
563b725ae77Skettenis      of subsequent fields.  */
564b725ae77Skettenis   enum {
565b725ae77Skettenis 
566b725ae77Skettenis     /* We don't know anything about the value.  This is also used for
567b725ae77Skettenis        values we could have kept track of, when doing so would have
568b725ae77Skettenis        been too complex and we don't want to bother.  The bottom of
569b725ae77Skettenis        our lattice.  */
570b725ae77Skettenis     pv_unknown,
571b725ae77Skettenis 
572b725ae77Skettenis     /* A known constant.  K is its value.  */
573b725ae77Skettenis     pv_constant,
574b725ae77Skettenis 
575b725ae77Skettenis     /* The value that register REG originally had *UPON ENTRY TO THE
576b725ae77Skettenis        FUNCTION*, plus K.  If K is zero, this means, obviously, just
577b725ae77Skettenis        the value REG had upon entry to the function.  REG is a GDB
578b725ae77Skettenis        register number.  Before we start interpreting, we initialize
579b725ae77Skettenis        every register R to { pv_register, R, 0 }.  */
580b725ae77Skettenis     pv_register,
581b725ae77Skettenis 
582b725ae77Skettenis   } kind;
583b725ae77Skettenis 
584b725ae77Skettenis   /* The meanings of the following fields depend on 'kind'; see the
585b725ae77Skettenis      comments for the specific 'kind' values.  */
586b725ae77Skettenis   int reg;
587b725ae77Skettenis   CORE_ADDR k;
588b725ae77Skettenis };
589b725ae77Skettenis 
590b725ae77Skettenis 
591b725ae77Skettenis /* Set V to be unknown.  */
592b725ae77Skettenis static void
pv_set_to_unknown(struct prologue_value * v)593b725ae77Skettenis pv_set_to_unknown (struct prologue_value *v)
594b725ae77Skettenis {
595b725ae77Skettenis   v->kind = pv_unknown;
596b725ae77Skettenis }
597b725ae77Skettenis 
598b725ae77Skettenis 
599b725ae77Skettenis /* Set V to the constant K.  */
600b725ae77Skettenis static void
pv_set_to_constant(struct prologue_value * v,CORE_ADDR k)601b725ae77Skettenis pv_set_to_constant (struct prologue_value *v, CORE_ADDR k)
602b725ae77Skettenis {
603b725ae77Skettenis   v->kind = pv_constant;
604b725ae77Skettenis   v->k = k;
605b725ae77Skettenis }
606b725ae77Skettenis 
607b725ae77Skettenis 
608b725ae77Skettenis /* Set V to the original value of register REG, plus K.  */
609b725ae77Skettenis static void
pv_set_to_register(struct prologue_value * v,int reg,CORE_ADDR k)610b725ae77Skettenis pv_set_to_register (struct prologue_value *v, int reg, CORE_ADDR k)
611b725ae77Skettenis {
612b725ae77Skettenis   v->kind = pv_register;
613b725ae77Skettenis   v->reg = reg;
614b725ae77Skettenis   v->k = k;
615b725ae77Skettenis }
616b725ae77Skettenis 
617b725ae77Skettenis 
618b725ae77Skettenis /* If one of *A and *B is a constant, and the other isn't, swap the
619b725ae77Skettenis    pointers as necessary to ensure that *B points to the constant.
620b725ae77Skettenis    This can reduce the number of cases we need to analyze in the
621b725ae77Skettenis    functions below.  */
622b725ae77Skettenis static void
pv_constant_last(struct prologue_value ** a,struct prologue_value ** b)623b725ae77Skettenis pv_constant_last (struct prologue_value **a,
624b725ae77Skettenis                   struct prologue_value **b)
625b725ae77Skettenis {
626b725ae77Skettenis   if ((*a)->kind == pv_constant
627b725ae77Skettenis       && (*b)->kind != pv_constant)
628b725ae77Skettenis     {
629b725ae77Skettenis       struct prologue_value *temp = *a;
630b725ae77Skettenis       *a = *b;
631b725ae77Skettenis       *b = temp;
632b725ae77Skettenis     }
633b725ae77Skettenis }
634b725ae77Skettenis 
635b725ae77Skettenis 
636b725ae77Skettenis /* Set SUM to the sum of A and B.  SUM, A, and B may point to the same
637b725ae77Skettenis    'struct prologue_value' object.  */
638b725ae77Skettenis static void
pv_add(struct prologue_value * sum,struct prologue_value * a,struct prologue_value * b)639b725ae77Skettenis pv_add (struct prologue_value *sum,
640b725ae77Skettenis         struct prologue_value *a,
641b725ae77Skettenis         struct prologue_value *b)
642b725ae77Skettenis {
643b725ae77Skettenis   pv_constant_last (&a, &b);
644b725ae77Skettenis 
645b725ae77Skettenis   /* We can handle adding constants to registers, and other constants.  */
646b725ae77Skettenis   if (b->kind == pv_constant
647b725ae77Skettenis       && (a->kind == pv_register
648b725ae77Skettenis           || a->kind == pv_constant))
649b725ae77Skettenis     {
650b725ae77Skettenis       sum->kind = a->kind;
651b725ae77Skettenis       sum->reg = a->reg;    /* not meaningful if a is pv_constant, but
652b725ae77Skettenis                                harmless */
653b725ae77Skettenis       sum->k = a->k + b->k;
654b725ae77Skettenis     }
655b725ae77Skettenis 
656b725ae77Skettenis   /* Anything else we don't know how to add.  We don't have a
657b725ae77Skettenis      representation for, say, the sum of two registers, or a multiple
658b725ae77Skettenis      of a register's value (adding a register to itself).  */
659b725ae77Skettenis   else
660b725ae77Skettenis     sum->kind = pv_unknown;
661b725ae77Skettenis }
662b725ae77Skettenis 
663b725ae77Skettenis 
664b725ae77Skettenis /* Add the constant K to V.  */
665b725ae77Skettenis static void
pv_add_constant(struct prologue_value * v,CORE_ADDR k)666b725ae77Skettenis pv_add_constant (struct prologue_value *v, CORE_ADDR k)
667b725ae77Skettenis {
668b725ae77Skettenis   struct prologue_value pv_k;
669b725ae77Skettenis 
670b725ae77Skettenis   /* Rather than thinking of all the cases we can and can't handle,
671b725ae77Skettenis      we'll just let pv_add take care of that for us.  */
672b725ae77Skettenis   pv_set_to_constant (&pv_k, k);
673b725ae77Skettenis   pv_add (v, v, &pv_k);
674b725ae77Skettenis }
675b725ae77Skettenis 
676b725ae77Skettenis 
677b725ae77Skettenis /* Subtract B from A, and put the result in DIFF.
678b725ae77Skettenis 
679b725ae77Skettenis    This isn't quite the same as negating B and adding it to A, since
680b725ae77Skettenis    we don't have a representation for the negation of anything but a
681b725ae77Skettenis    constant.  For example, we can't negate { pv_register, R1, 10 },
682b725ae77Skettenis    but we do know that { pv_register, R1, 10 } minus { pv_register,
683b725ae77Skettenis    R1, 5 } is { pv_constant, <ignored>, 5 }.
684b725ae77Skettenis 
685b725ae77Skettenis    This means, for example, that we can subtract two stack addresses;
686b725ae77Skettenis    they're both relative to the original SP.  Since the frame pointer
687b725ae77Skettenis    is set based on the SP, its value will be the original SP plus some
688b725ae77Skettenis    constant (probably zero), so we can use its value just fine.  */
689b725ae77Skettenis static void
pv_subtract(struct prologue_value * diff,struct prologue_value * a,struct prologue_value * b)690b725ae77Skettenis pv_subtract (struct prologue_value *diff,
691b725ae77Skettenis              struct prologue_value *a,
692b725ae77Skettenis              struct prologue_value *b)
693b725ae77Skettenis {
694b725ae77Skettenis   pv_constant_last (&a, &b);
695b725ae77Skettenis 
696b725ae77Skettenis   /* We can subtract a constant from another constant, or from a
697b725ae77Skettenis      register.  */
698b725ae77Skettenis   if (b->kind == pv_constant
699b725ae77Skettenis       && (a->kind == pv_register
700b725ae77Skettenis           || a->kind == pv_constant))
701b725ae77Skettenis     {
702b725ae77Skettenis       diff->kind = a->kind;
703b725ae77Skettenis       diff->reg = a->reg;    /* not always meaningful, but harmless */
704b725ae77Skettenis       diff->k = a->k - b->k;
705b725ae77Skettenis     }
706b725ae77Skettenis 
707b725ae77Skettenis   /* We can subtract a register from itself, yielding a constant.  */
708b725ae77Skettenis   else if (a->kind == pv_register
709b725ae77Skettenis            && b->kind == pv_register
710b725ae77Skettenis            && a->reg == b->reg)
711b725ae77Skettenis     {
712b725ae77Skettenis       diff->kind = pv_constant;
713b725ae77Skettenis       diff->k = a->k - b->k;
714b725ae77Skettenis     }
715b725ae77Skettenis 
716b725ae77Skettenis   /* We don't know how to subtract anything else.  */
717b725ae77Skettenis   else
718b725ae77Skettenis     diff->kind = pv_unknown;
719b725ae77Skettenis }
720b725ae77Skettenis 
721b725ae77Skettenis 
722b725ae77Skettenis /* Set AND to the logical and of A and B.  */
723b725ae77Skettenis static void
pv_logical_and(struct prologue_value * and,struct prologue_value * a,struct prologue_value * b)724b725ae77Skettenis pv_logical_and (struct prologue_value *and,
725b725ae77Skettenis                 struct prologue_value *a,
726b725ae77Skettenis                 struct prologue_value *b)
727b725ae77Skettenis {
728b725ae77Skettenis   pv_constant_last (&a, &b);
729b725ae77Skettenis 
730b725ae77Skettenis   /* We can 'and' two constants.  */
731b725ae77Skettenis   if (a->kind == pv_constant
732b725ae77Skettenis       && b->kind == pv_constant)
733b725ae77Skettenis     {
734b725ae77Skettenis       and->kind = pv_constant;
735b725ae77Skettenis       and->k = a->k & b->k;
736b725ae77Skettenis     }
737b725ae77Skettenis 
738b725ae77Skettenis   /* We can 'and' anything with the constant zero.  */
739b725ae77Skettenis   else if (b->kind == pv_constant
740b725ae77Skettenis            && b->k == 0)
741b725ae77Skettenis     {
742b725ae77Skettenis       and->kind = pv_constant;
743b725ae77Skettenis       and->k = 0;
744b725ae77Skettenis     }
745b725ae77Skettenis 
746b725ae77Skettenis   /* We can 'and' anything with ~0.  */
747b725ae77Skettenis   else if (b->kind == pv_constant
748b725ae77Skettenis            && b->k == ~ (CORE_ADDR) 0)
749b725ae77Skettenis     *and = *a;
750b725ae77Skettenis 
751b725ae77Skettenis   /* We can 'and' a register with itself.  */
752b725ae77Skettenis   else if (a->kind == pv_register
753b725ae77Skettenis            && b->kind == pv_register
754b725ae77Skettenis            && a->reg == b->reg
755b725ae77Skettenis            && a->k == b->k)
756b725ae77Skettenis     *and = *a;
757b725ae77Skettenis 
758b725ae77Skettenis   /* Otherwise, we don't know.  */
759b725ae77Skettenis   else
760b725ae77Skettenis     pv_set_to_unknown (and);
761b725ae77Skettenis }
762b725ae77Skettenis 
763b725ae77Skettenis 
764b725ae77Skettenis /* Return non-zero iff A and B are identical expressions.
765b725ae77Skettenis 
766b725ae77Skettenis    This is not the same as asking if the two values are equal; the
767b725ae77Skettenis    result of such a comparison would have to be a pv_boolean, and
768b725ae77Skettenis    asking whether two 'unknown' values were equal would give you
769b725ae77Skettenis    pv_maybe.  Same for comparing, say, { pv_register, R1, 0 } and {
770b725ae77Skettenis    pv_register, R2, 0}.  Instead, this is asking whether the two
771b725ae77Skettenis    representations are the same.  */
772b725ae77Skettenis static int
pv_is_identical(struct prologue_value * a,struct prologue_value * b)773b725ae77Skettenis pv_is_identical (struct prologue_value *a,
774b725ae77Skettenis                  struct prologue_value *b)
775b725ae77Skettenis {
776b725ae77Skettenis   if (a->kind != b->kind)
777b725ae77Skettenis     return 0;
778b725ae77Skettenis 
779b725ae77Skettenis   switch (a->kind)
780b725ae77Skettenis     {
781b725ae77Skettenis     case pv_unknown:
782b725ae77Skettenis       return 1;
783b725ae77Skettenis     case pv_constant:
784b725ae77Skettenis       return (a->k == b->k);
785b725ae77Skettenis     case pv_register:
786b725ae77Skettenis       return (a->reg == b->reg && a->k == b->k);
787b725ae77Skettenis     default:
788b725ae77Skettenis       gdb_assert (0);
789b725ae77Skettenis     }
790b725ae77Skettenis }
791b725ae77Skettenis 
792b725ae77Skettenis 
793b725ae77Skettenis /* Return non-zero if A is the original value of register number R
794b725ae77Skettenis    plus K, zero otherwise.  */
795b725ae77Skettenis static int
pv_is_register(struct prologue_value * a,int r,CORE_ADDR k)796b725ae77Skettenis pv_is_register (struct prologue_value *a, int r, CORE_ADDR k)
797b725ae77Skettenis {
798b725ae77Skettenis   return (a->kind == pv_register
799b725ae77Skettenis           && a->reg == r
800b725ae77Skettenis           && a->k == k);
801b725ae77Skettenis }
802b725ae77Skettenis 
803b725ae77Skettenis 
804b725ae77Skettenis /* Decoding S/390 instructions.  */
805b725ae77Skettenis 
806b725ae77Skettenis /* Named opcode values for the S/390 instructions we recognize.  Some
807b725ae77Skettenis    instructions have their opcode split across two fields; those are the
808b725ae77Skettenis    op1_* and op2_* enums.  */
809b725ae77Skettenis enum
810b725ae77Skettenis   {
811b725ae77Skettenis     op1_lhi  = 0xa7,   op2_lhi  = 0x08,
812b725ae77Skettenis     op1_lghi = 0xa7,   op2_lghi = 0x09,
813b725ae77Skettenis     op_lr    = 0x18,
814b725ae77Skettenis     op_lgr   = 0xb904,
815b725ae77Skettenis     op_l     = 0x58,
816b725ae77Skettenis     op1_ly   = 0xe3,   op2_ly   = 0x58,
817b725ae77Skettenis     op1_lg   = 0xe3,   op2_lg   = 0x04,
818b725ae77Skettenis     op_lm    = 0x98,
819b725ae77Skettenis     op1_lmy  = 0xeb,   op2_lmy  = 0x98,
820b725ae77Skettenis     op1_lmg  = 0xeb,   op2_lmg  = 0x04,
821b725ae77Skettenis     op_st    = 0x50,
822b725ae77Skettenis     op1_sty  = 0xe3,   op2_sty  = 0x50,
823b725ae77Skettenis     op1_stg  = 0xe3,   op2_stg  = 0x24,
824b725ae77Skettenis     op_std   = 0x60,
825b725ae77Skettenis     op_stm   = 0x90,
826b725ae77Skettenis     op1_stmy = 0xeb,   op2_stmy = 0x90,
827b725ae77Skettenis     op1_stmg = 0xeb,   op2_stmg = 0x24,
828b725ae77Skettenis     op1_aghi = 0xa7,   op2_aghi = 0x0b,
829b725ae77Skettenis     op1_ahi  = 0xa7,   op2_ahi  = 0x0a,
830b725ae77Skettenis     op_ar    = 0x1a,
831b725ae77Skettenis     op_agr   = 0xb908,
832b725ae77Skettenis     op_a     = 0x5a,
833b725ae77Skettenis     op1_ay   = 0xe3,   op2_ay   = 0x5a,
834b725ae77Skettenis     op1_ag   = 0xe3,   op2_ag   = 0x08,
835b725ae77Skettenis     op_sr    = 0x1b,
836b725ae77Skettenis     op_sgr   = 0xb909,
837b725ae77Skettenis     op_s     = 0x5b,
838b725ae77Skettenis     op1_sy   = 0xe3,   op2_sy   = 0x5b,
839b725ae77Skettenis     op1_sg   = 0xe3,   op2_sg   = 0x09,
840b725ae77Skettenis     op_nr    = 0x14,
841b725ae77Skettenis     op_ngr   = 0xb980,
842b725ae77Skettenis     op_la    = 0x41,
843b725ae77Skettenis     op1_lay  = 0xe3,   op2_lay  = 0x71,
844b725ae77Skettenis     op1_larl = 0xc0,   op2_larl = 0x00,
845b725ae77Skettenis     op_basr  = 0x0d,
846b725ae77Skettenis     op_bas   = 0x4d,
847b725ae77Skettenis     op_bcr   = 0x07,
848b725ae77Skettenis     op_bc    = 0x0d,
849b725ae77Skettenis     op1_bras = 0xa7,   op2_bras = 0x05,
850b725ae77Skettenis     op1_brasl= 0xc0,   op2_brasl= 0x05,
851b725ae77Skettenis     op1_brc  = 0xa7,   op2_brc  = 0x04,
852b725ae77Skettenis     op1_brcl = 0xc0,   op2_brcl = 0x04,
853b725ae77Skettenis   };
854b725ae77Skettenis 
855b725ae77Skettenis 
856b725ae77Skettenis /* Read a single instruction from address AT.  */
857b725ae77Skettenis 
858b725ae77Skettenis #define S390_MAX_INSTR_SIZE 6
859b725ae77Skettenis static int
s390_readinstruction(bfd_byte instr[],CORE_ADDR at)860b725ae77Skettenis s390_readinstruction (bfd_byte instr[], CORE_ADDR at)
861b725ae77Skettenis {
862b725ae77Skettenis   static int s390_instrlen[] = { 2, 4, 4, 6 };
863b725ae77Skettenis   int instrlen;
864b725ae77Skettenis 
865*11efff7fSkettenis   if (deprecated_read_memory_nobpt (at, &instr[0], 2))
866b725ae77Skettenis     return -1;
867b725ae77Skettenis   instrlen = s390_instrlen[instr[0] >> 6];
868b725ae77Skettenis   if (instrlen > 2)
869b725ae77Skettenis     {
870*11efff7fSkettenis       if (deprecated_read_memory_nobpt (at + 2, &instr[2], instrlen - 2))
871b725ae77Skettenis         return -1;
872b725ae77Skettenis     }
873b725ae77Skettenis   return instrlen;
874b725ae77Skettenis }
875b725ae77Skettenis 
876b725ae77Skettenis 
877b725ae77Skettenis /* The functions below are for recognizing and decoding S/390
878b725ae77Skettenis    instructions of various formats.  Each of them checks whether INSN
879b725ae77Skettenis    is an instruction of the given format, with the specified opcodes.
880b725ae77Skettenis    If it is, it sets the remaining arguments to the values of the
881b725ae77Skettenis    instruction's fields, and returns a non-zero value; otherwise, it
882b725ae77Skettenis    returns zero.
883b725ae77Skettenis 
884b725ae77Skettenis    These functions' arguments appear in the order they appear in the
885b725ae77Skettenis    instruction, not in the machine-language form.  So, opcodes always
886b725ae77Skettenis    come first, even though they're sometimes scattered around the
887b725ae77Skettenis    instructions.  And displacements appear before base and extension
888b725ae77Skettenis    registers, as they do in the assembly syntax, not at the end, as
889b725ae77Skettenis    they do in the machine language.  */
890b725ae77Skettenis static int
is_ri(bfd_byte * insn,int op1,int op2,unsigned int * r1,int * i2)891b725ae77Skettenis is_ri (bfd_byte *insn, int op1, int op2, unsigned int *r1, int *i2)
892b725ae77Skettenis {
893b725ae77Skettenis   if (insn[0] == op1 && (insn[1] & 0xf) == op2)
894b725ae77Skettenis     {
895b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
896b725ae77Skettenis       /* i2 is a 16-bit signed quantity.  */
897b725ae77Skettenis       *i2 = (((insn[2] << 8) | insn[3]) ^ 0x8000) - 0x8000;
898b725ae77Skettenis       return 1;
899b725ae77Skettenis     }
900b725ae77Skettenis   else
901b725ae77Skettenis     return 0;
902b725ae77Skettenis }
903b725ae77Skettenis 
904b725ae77Skettenis 
905b725ae77Skettenis static int
is_ril(bfd_byte * insn,int op1,int op2,unsigned int * r1,int * i2)906b725ae77Skettenis is_ril (bfd_byte *insn, int op1, int op2,
907b725ae77Skettenis         unsigned int *r1, int *i2)
908b725ae77Skettenis {
909b725ae77Skettenis   if (insn[0] == op1 && (insn[1] & 0xf) == op2)
910b725ae77Skettenis     {
911b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
912b725ae77Skettenis       /* i2 is a signed quantity.  If the host 'int' is 32 bits long,
913b725ae77Skettenis          no sign extension is necessary, but we don't want to assume
914b725ae77Skettenis          that.  */
915b725ae77Skettenis       *i2 = (((insn[2] << 24)
916b725ae77Skettenis               | (insn[3] << 16)
917b725ae77Skettenis               | (insn[4] << 8)
918b725ae77Skettenis               | (insn[5])) ^ 0x80000000) - 0x80000000;
919b725ae77Skettenis       return 1;
920b725ae77Skettenis     }
921b725ae77Skettenis   else
922b725ae77Skettenis     return 0;
923b725ae77Skettenis }
924b725ae77Skettenis 
925b725ae77Skettenis 
926b725ae77Skettenis static int
is_rr(bfd_byte * insn,int op,unsigned int * r1,unsigned int * r2)927b725ae77Skettenis is_rr (bfd_byte *insn, int op, unsigned int *r1, unsigned int *r2)
928b725ae77Skettenis {
929b725ae77Skettenis   if (insn[0] == op)
930b725ae77Skettenis     {
931b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
932b725ae77Skettenis       *r2 = insn[1] & 0xf;
933b725ae77Skettenis       return 1;
934b725ae77Skettenis     }
935b725ae77Skettenis   else
936b725ae77Skettenis     return 0;
937b725ae77Skettenis }
938b725ae77Skettenis 
939b725ae77Skettenis 
940b725ae77Skettenis static int
is_rre(bfd_byte * insn,int op,unsigned int * r1,unsigned int * r2)941b725ae77Skettenis is_rre (bfd_byte *insn, int op, unsigned int *r1, unsigned int *r2)
942b725ae77Skettenis {
943b725ae77Skettenis   if (((insn[0] << 8) | insn[1]) == op)
944b725ae77Skettenis     {
945b725ae77Skettenis       /* Yes, insn[3].  insn[2] is unused in RRE format.  */
946b725ae77Skettenis       *r1 = (insn[3] >> 4) & 0xf;
947b725ae77Skettenis       *r2 = insn[3] & 0xf;
948b725ae77Skettenis       return 1;
949b725ae77Skettenis     }
950b725ae77Skettenis   else
951b725ae77Skettenis     return 0;
952b725ae77Skettenis }
953b725ae77Skettenis 
954b725ae77Skettenis 
955b725ae77Skettenis static int
is_rs(bfd_byte * insn,int op,unsigned int * r1,unsigned int * r3,unsigned int * d2,unsigned int * b2)956b725ae77Skettenis is_rs (bfd_byte *insn, int op,
957b725ae77Skettenis        unsigned int *r1, unsigned int *r3, unsigned int *d2, unsigned int *b2)
958b725ae77Skettenis {
959b725ae77Skettenis   if (insn[0] == op)
960b725ae77Skettenis     {
961b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
962b725ae77Skettenis       *r3 = insn[1] & 0xf;
963b725ae77Skettenis       *b2 = (insn[2] >> 4) & 0xf;
964b725ae77Skettenis       *d2 = ((insn[2] & 0xf) << 8) | insn[3];
965b725ae77Skettenis       return 1;
966b725ae77Skettenis     }
967b725ae77Skettenis   else
968b725ae77Skettenis     return 0;
969b725ae77Skettenis }
970b725ae77Skettenis 
971b725ae77Skettenis 
972b725ae77Skettenis static int
is_rsy(bfd_byte * insn,int op1,int op2,unsigned int * r1,unsigned int * r3,unsigned int * d2,unsigned int * b2)973b725ae77Skettenis is_rsy (bfd_byte *insn, int op1, int op2,
974b725ae77Skettenis         unsigned int *r1, unsigned int *r3, unsigned int *d2, unsigned int *b2)
975b725ae77Skettenis {
976b725ae77Skettenis   if (insn[0] == op1
977b725ae77Skettenis       && insn[5] == op2)
978b725ae77Skettenis     {
979b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
980b725ae77Skettenis       *r3 = insn[1] & 0xf;
981b725ae77Skettenis       *b2 = (insn[2] >> 4) & 0xf;
982b725ae77Skettenis       /* The 'long displacement' is a 20-bit signed integer.  */
983b725ae77Skettenis       *d2 = ((((insn[2] & 0xf) << 8) | insn[3] | (insn[4] << 12))
984b725ae77Skettenis 		^ 0x80000) - 0x80000;
985b725ae77Skettenis       return 1;
986b725ae77Skettenis     }
987b725ae77Skettenis   else
988b725ae77Skettenis     return 0;
989b725ae77Skettenis }
990b725ae77Skettenis 
991b725ae77Skettenis 
992b725ae77Skettenis static int
is_rx(bfd_byte * insn,int op,unsigned int * r1,unsigned int * d2,unsigned int * x2,unsigned int * b2)993b725ae77Skettenis is_rx (bfd_byte *insn, int op,
994b725ae77Skettenis        unsigned int *r1, unsigned int *d2, unsigned int *x2, unsigned int *b2)
995b725ae77Skettenis {
996b725ae77Skettenis   if (insn[0] == op)
997b725ae77Skettenis     {
998b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
999b725ae77Skettenis       *x2 = insn[1] & 0xf;
1000b725ae77Skettenis       *b2 = (insn[2] >> 4) & 0xf;
1001b725ae77Skettenis       *d2 = ((insn[2] & 0xf) << 8) | insn[3];
1002b725ae77Skettenis       return 1;
1003b725ae77Skettenis     }
1004b725ae77Skettenis   else
1005b725ae77Skettenis     return 0;
1006b725ae77Skettenis }
1007b725ae77Skettenis 
1008b725ae77Skettenis 
1009b725ae77Skettenis static int
is_rxy(bfd_byte * insn,int op1,int op2,unsigned int * r1,unsigned int * d2,unsigned int * x2,unsigned int * b2)1010b725ae77Skettenis is_rxy (bfd_byte *insn, int op1, int op2,
1011b725ae77Skettenis         unsigned int *r1, unsigned int *d2, unsigned int *x2, unsigned int *b2)
1012b725ae77Skettenis {
1013b725ae77Skettenis   if (insn[0] == op1
1014b725ae77Skettenis       && insn[5] == op2)
1015b725ae77Skettenis     {
1016b725ae77Skettenis       *r1 = (insn[1] >> 4) & 0xf;
1017b725ae77Skettenis       *x2 = insn[1] & 0xf;
1018b725ae77Skettenis       *b2 = (insn[2] >> 4) & 0xf;
1019b725ae77Skettenis       /* The 'long displacement' is a 20-bit signed integer.  */
1020b725ae77Skettenis       *d2 = ((((insn[2] & 0xf) << 8) | insn[3] | (insn[4] << 12))
1021b725ae77Skettenis 		^ 0x80000) - 0x80000;
1022b725ae77Skettenis       return 1;
1023b725ae77Skettenis     }
1024b725ae77Skettenis   else
1025b725ae77Skettenis     return 0;
1026b725ae77Skettenis }
1027b725ae77Skettenis 
1028b725ae77Skettenis 
1029b725ae77Skettenis /* Set ADDR to the effective address for an X-style instruction, like:
1030b725ae77Skettenis 
1031b725ae77Skettenis         L R1, D2(X2, B2)
1032b725ae77Skettenis 
1033b725ae77Skettenis    Here, X2 and B2 are registers, and D2 is a signed 20-bit
1034b725ae77Skettenis    constant; the effective address is the sum of all three.  If either
1035b725ae77Skettenis    X2 or B2 are zero, then it doesn't contribute to the sum --- this
1036b725ae77Skettenis    means that r0 can't be used as either X2 or B2.
1037b725ae77Skettenis 
1038b725ae77Skettenis    GPR is an array of general register values, indexed by GPR number,
1039b725ae77Skettenis    not GDB register number.  */
1040b725ae77Skettenis static void
compute_x_addr(struct prologue_value * addr,struct prologue_value * gpr,int d2,unsigned int x2,unsigned int b2)1041b725ae77Skettenis compute_x_addr (struct prologue_value *addr,
1042b725ae77Skettenis                 struct prologue_value *gpr,
1043b725ae77Skettenis                 int d2, unsigned int x2, unsigned int b2)
1044b725ae77Skettenis {
1045b725ae77Skettenis   /* We can't just add stuff directly in addr; it might alias some of
1046b725ae77Skettenis      the registers we need to read.  */
1047b725ae77Skettenis   struct prologue_value result;
1048b725ae77Skettenis 
1049b725ae77Skettenis   pv_set_to_constant (&result, d2);
1050b725ae77Skettenis   if (x2)
1051b725ae77Skettenis     pv_add (&result, &result, &gpr[x2]);
1052b725ae77Skettenis   if (b2)
1053b725ae77Skettenis     pv_add (&result, &result, &gpr[b2]);
1054b725ae77Skettenis 
1055b725ae77Skettenis   *addr = result;
1056b725ae77Skettenis }
1057b725ae77Skettenis 
1058b725ae77Skettenis 
1059b725ae77Skettenis #define S390_NUM_GPRS 16
1060b725ae77Skettenis #define S390_NUM_FPRS 16
1061b725ae77Skettenis 
1062b725ae77Skettenis struct s390_prologue_data {
1063b725ae77Skettenis 
1064b725ae77Skettenis   /* The size of a GPR or FPR.  */
1065b725ae77Skettenis   int gpr_size;
1066b725ae77Skettenis   int fpr_size;
1067b725ae77Skettenis 
1068b725ae77Skettenis   /* The general-purpose registers.  */
1069b725ae77Skettenis   struct prologue_value gpr[S390_NUM_GPRS];
1070b725ae77Skettenis 
1071b725ae77Skettenis   /* The floating-point registers.  */
1072b725ae77Skettenis   struct prologue_value fpr[S390_NUM_FPRS];
1073b725ae77Skettenis 
1074*11efff7fSkettenis   /* The offset relative to the CFA where the incoming GPR N was saved
1075*11efff7fSkettenis      by the function prologue.  0 if not saved or unknown.  */
1076*11efff7fSkettenis   int gpr_slot[S390_NUM_GPRS];
1077b725ae77Skettenis 
1078*11efff7fSkettenis   /* Likewise for FPRs.  */
1079*11efff7fSkettenis   int fpr_slot[S390_NUM_FPRS];
1080*11efff7fSkettenis 
1081*11efff7fSkettenis   /* Nonzero if the backchain was saved.  This is assumed to be the
1082*11efff7fSkettenis      case when the incoming SP is saved at the current SP location.  */
1083*11efff7fSkettenis   int back_chain_saved_p;
1084b725ae77Skettenis };
1085b725ae77Skettenis 
1086b725ae77Skettenis /* Do a SIZE-byte store of VALUE to ADDR.  */
1087b725ae77Skettenis static void
s390_store(struct prologue_value * addr,CORE_ADDR size,struct prologue_value * value,struct s390_prologue_data * data)1088b725ae77Skettenis s390_store (struct prologue_value *addr,
1089b725ae77Skettenis             CORE_ADDR size,
1090b725ae77Skettenis             struct prologue_value *value,
1091b725ae77Skettenis 	    struct s390_prologue_data *data)
1092b725ae77Skettenis {
1093*11efff7fSkettenis   struct prologue_value cfa, offset;
1094*11efff7fSkettenis   int i;
1095b725ae77Skettenis 
1096*11efff7fSkettenis   /* Check whether we are storing the backchain.  */
1097*11efff7fSkettenis   pv_subtract (&offset, &data->gpr[S390_SP_REGNUM - S390_R0_REGNUM], addr);
1098*11efff7fSkettenis 
1099*11efff7fSkettenis   if (offset.kind == pv_constant && offset.k == 0)
1100*11efff7fSkettenis     if (size == data->gpr_size
1101*11efff7fSkettenis 	&& pv_is_register (value, S390_SP_REGNUM, 0))
1102b725ae77Skettenis       {
1103*11efff7fSkettenis 	data->back_chain_saved_p = 1;
1104b725ae77Skettenis 	return;
1105b725ae77Skettenis       }
1106b725ae77Skettenis 
1107b725ae77Skettenis 
1108*11efff7fSkettenis   /* Check whether we are storing a register into the stack.  */
1109*11efff7fSkettenis   pv_set_to_register (&cfa, S390_SP_REGNUM, 16 * data->gpr_size + 32);
1110*11efff7fSkettenis   pv_subtract (&offset, &cfa, addr);
1111*11efff7fSkettenis 
1112*11efff7fSkettenis   if (offset.kind == pv_constant
1113*11efff7fSkettenis       && offset.k < INT_MAX && offset.k > 0
1114*11efff7fSkettenis       && offset.k % data->gpr_size == 0)
1115*11efff7fSkettenis     {
1116*11efff7fSkettenis       /* If we are storing the original value of a register, we want to
1117*11efff7fSkettenis 	 record the CFA offset.  If the same register is stored multiple
1118*11efff7fSkettenis 	 times, the stack slot with the highest address counts.  */
1119*11efff7fSkettenis 
1120*11efff7fSkettenis       for (i = 0; i < S390_NUM_GPRS; i++)
1121*11efff7fSkettenis 	if (size == data->gpr_size
1122*11efff7fSkettenis 	    && pv_is_register (value, S390_R0_REGNUM + i, 0))
1123*11efff7fSkettenis 	  if (data->gpr_slot[i] == 0
1124*11efff7fSkettenis 	      || data->gpr_slot[i] > offset.k)
1125*11efff7fSkettenis 	    {
1126*11efff7fSkettenis 	      data->gpr_slot[i] = offset.k;
1127*11efff7fSkettenis 	      return;
1128*11efff7fSkettenis 	    }
1129*11efff7fSkettenis 
1130*11efff7fSkettenis       for (i = 0; i < S390_NUM_FPRS; i++)
1131*11efff7fSkettenis 	if (size == data->fpr_size
1132*11efff7fSkettenis 	    && pv_is_register (value, S390_F0_REGNUM + i, 0))
1133*11efff7fSkettenis 	  if (data->fpr_slot[i] == 0
1134*11efff7fSkettenis 	      || data->fpr_slot[i] > offset.k)
1135*11efff7fSkettenis 	    {
1136*11efff7fSkettenis 	      data->fpr_slot[i] = offset.k;
1137*11efff7fSkettenis 	      return;
1138*11efff7fSkettenis 	    }
1139*11efff7fSkettenis     }
1140*11efff7fSkettenis 
1141*11efff7fSkettenis 
1142*11efff7fSkettenis   /* Note: If this is some store we cannot identify, you might think we
1143*11efff7fSkettenis      should forget our cached values, as any of those might have been hit.
1144*11efff7fSkettenis 
1145*11efff7fSkettenis      However, we make the assumption that the register save areas are only
1146*11efff7fSkettenis      ever stored to once in any given function, and we do recognize these
1147*11efff7fSkettenis      stores.  Thus every store we cannot recognize does not hit our data.  */
1148b725ae77Skettenis }
1149b725ae77Skettenis 
1150b725ae77Skettenis /* Do a SIZE-byte load from ADDR into VALUE.  */
1151b725ae77Skettenis static void
s390_load(struct prologue_value * addr,CORE_ADDR size,struct prologue_value * value,struct s390_prologue_data * data)1152b725ae77Skettenis s390_load (struct prologue_value *addr,
1153b725ae77Skettenis 	   CORE_ADDR size,
1154b725ae77Skettenis 	   struct prologue_value *value,
1155b725ae77Skettenis 	   struct s390_prologue_data *data)
1156b725ae77Skettenis {
1157*11efff7fSkettenis   struct prologue_value cfa, offset;
1158*11efff7fSkettenis   int i;
1159b725ae77Skettenis 
1160b725ae77Skettenis   /* If it's a load from an in-line constant pool, then we can
1161b725ae77Skettenis      simulate that, under the assumption that the code isn't
1162b725ae77Skettenis      going to change between the time the processor actually
1163b725ae77Skettenis      executed it creating the current frame, and the time when
1164b725ae77Skettenis      we're analyzing the code to unwind past that frame.  */
1165b725ae77Skettenis   if (addr->kind == pv_constant)
1166b725ae77Skettenis     {
1167b725ae77Skettenis       struct section_table *secp;
1168b725ae77Skettenis       secp = target_section_by_addr (&current_target, addr->k);
1169b725ae77Skettenis       if (secp != NULL
1170b725ae77Skettenis           && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
1171b725ae77Skettenis               & SEC_READONLY))
1172b725ae77Skettenis 	{
1173b725ae77Skettenis           pv_set_to_constant (value, read_memory_integer (addr->k, size));
1174b725ae77Skettenis 	  return;
1175b725ae77Skettenis 	}
1176b725ae77Skettenis     }
1177b725ae77Skettenis 
1178*11efff7fSkettenis   /* Check whether we are accessing one of our save slots.  */
1179*11efff7fSkettenis   pv_set_to_register (&cfa, S390_SP_REGNUM, 16 * data->gpr_size + 32);
1180*11efff7fSkettenis   pv_subtract (&offset, &cfa, addr);
1181*11efff7fSkettenis 
1182*11efff7fSkettenis   if (offset.kind == pv_constant
1183*11efff7fSkettenis       && offset.k < INT_MAX && offset.k > 0)
1184b725ae77Skettenis     {
1185*11efff7fSkettenis       for (i = 0; i < S390_NUM_GPRS; i++)
1186*11efff7fSkettenis 	if (offset.k == data->gpr_slot[i])
1187*11efff7fSkettenis 	  {
1188*11efff7fSkettenis 	    pv_set_to_register (value, S390_R0_REGNUM + i, 0);
1189b725ae77Skettenis 	    return;
1190b725ae77Skettenis 	  }
1191b725ae77Skettenis 
1192*11efff7fSkettenis       for (i = 0; i < S390_NUM_FPRS; i++)
1193*11efff7fSkettenis 	if (offset.k == data->fpr_slot[i])
1194*11efff7fSkettenis 	  {
1195*11efff7fSkettenis 	    pv_set_to_register (value, S390_F0_REGNUM + i, 0);
1196*11efff7fSkettenis 	    return;
1197*11efff7fSkettenis 	  }
1198*11efff7fSkettenis     }
1199*11efff7fSkettenis 
1200b725ae77Skettenis   /* Otherwise, we don't know the value.  */
1201b725ae77Skettenis   pv_set_to_unknown (value);
1202b725ae77Skettenis }
1203b725ae77Skettenis 
1204b725ae77Skettenis 
1205b725ae77Skettenis /* Analyze the prologue of the function starting at START_PC,
1206b725ae77Skettenis    continuing at most until CURRENT_PC.  Initialize DATA to
1207b725ae77Skettenis    hold all information we find out about the state of the registers
1208b725ae77Skettenis    and stack slots.  Return the address of the instruction after
1209b725ae77Skettenis    the last one that changed the SP, FP, or back chain; or zero
1210b725ae77Skettenis    on error.  */
1211b725ae77Skettenis static CORE_ADDR
s390_analyze_prologue(struct gdbarch * gdbarch,CORE_ADDR start_pc,CORE_ADDR current_pc,struct s390_prologue_data * data)1212b725ae77Skettenis s390_analyze_prologue (struct gdbarch *gdbarch,
1213b725ae77Skettenis 		       CORE_ADDR start_pc,
1214b725ae77Skettenis 		       CORE_ADDR current_pc,
1215b725ae77Skettenis 		       struct s390_prologue_data *data)
1216b725ae77Skettenis {
1217b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1218b725ae77Skettenis 
1219b725ae77Skettenis   /* Our return value:
1220b725ae77Skettenis      The address of the instruction after the last one that changed
1221b725ae77Skettenis      the SP, FP, or back chain;  zero if we got an error trying to
1222b725ae77Skettenis      read memory.  */
1223b725ae77Skettenis   CORE_ADDR result = start_pc;
1224b725ae77Skettenis 
1225b725ae77Skettenis   /* The current PC for our abstract interpretation.  */
1226b725ae77Skettenis   CORE_ADDR pc;
1227b725ae77Skettenis 
1228b725ae77Skettenis   /* The address of the next instruction after that.  */
1229b725ae77Skettenis   CORE_ADDR next_pc;
1230b725ae77Skettenis 
1231b725ae77Skettenis   /* Set up everything's initial value.  */
1232b725ae77Skettenis   {
1233b725ae77Skettenis     int i;
1234b725ae77Skettenis 
1235b725ae77Skettenis     /* For the purpose of prologue tracking, we consider the GPR size to
1236b725ae77Skettenis        be equal to the ABI word size, even if it is actually larger
1237b725ae77Skettenis        (i.e. when running a 32-bit binary under a 64-bit kernel).  */
1238b725ae77Skettenis     data->gpr_size = word_size;
1239b725ae77Skettenis     data->fpr_size = 8;
1240b725ae77Skettenis 
1241b725ae77Skettenis     for (i = 0; i < S390_NUM_GPRS; i++)
1242b725ae77Skettenis       pv_set_to_register (&data->gpr[i], S390_R0_REGNUM + i, 0);
1243b725ae77Skettenis 
1244b725ae77Skettenis     for (i = 0; i < S390_NUM_FPRS; i++)
1245b725ae77Skettenis       pv_set_to_register (&data->fpr[i], S390_F0_REGNUM + i, 0);
1246b725ae77Skettenis 
1247*11efff7fSkettenis     for (i = 0; i < S390_NUM_GPRS; i++)
1248*11efff7fSkettenis       data->gpr_slot[i]  = 0;
1249b725ae77Skettenis 
1250*11efff7fSkettenis     for (i = 0; i < S390_NUM_FPRS; i++)
1251*11efff7fSkettenis       data->fpr_slot[i]  = 0;
1252*11efff7fSkettenis 
1253*11efff7fSkettenis     data->back_chain_saved_p = 0;
1254b725ae77Skettenis   }
1255b725ae77Skettenis 
1256b725ae77Skettenis   /* Start interpreting instructions, until we hit the frame's
1257b725ae77Skettenis      current PC or the first branch instruction.  */
1258b725ae77Skettenis   for (pc = start_pc; pc > 0 && pc < current_pc; pc = next_pc)
1259b725ae77Skettenis     {
1260b725ae77Skettenis       bfd_byte insn[S390_MAX_INSTR_SIZE];
1261b725ae77Skettenis       int insn_len = s390_readinstruction (insn, pc);
1262b725ae77Skettenis 
1263b725ae77Skettenis       /* Fields for various kinds of instructions.  */
1264b725ae77Skettenis       unsigned int b2, r1, r2, x2, r3;
1265b725ae77Skettenis       int i2, d2;
1266b725ae77Skettenis 
1267*11efff7fSkettenis       /* The values of SP and FP before this instruction,
1268b725ae77Skettenis          for detecting instructions that change them.  */
1269*11efff7fSkettenis       struct prologue_value pre_insn_sp, pre_insn_fp;
1270*11efff7fSkettenis       /* Likewise for the flag whether the back chain was saved.  */
1271*11efff7fSkettenis       int pre_insn_back_chain_saved_p;
1272b725ae77Skettenis 
1273b725ae77Skettenis       /* If we got an error trying to read the instruction, report it.  */
1274b725ae77Skettenis       if (insn_len < 0)
1275b725ae77Skettenis         {
1276b725ae77Skettenis           result = 0;
1277b725ae77Skettenis           break;
1278b725ae77Skettenis         }
1279b725ae77Skettenis 
1280b725ae77Skettenis       next_pc = pc + insn_len;
1281b725ae77Skettenis 
1282b725ae77Skettenis       pre_insn_sp = data->gpr[S390_SP_REGNUM - S390_R0_REGNUM];
1283b725ae77Skettenis       pre_insn_fp = data->gpr[S390_FRAME_REGNUM - S390_R0_REGNUM];
1284*11efff7fSkettenis       pre_insn_back_chain_saved_p = data->back_chain_saved_p;
1285b725ae77Skettenis 
1286b725ae77Skettenis       /* LHI r1, i2 --- load halfword immediate */
1287b725ae77Skettenis       if (word_size == 4
1288b725ae77Skettenis 	  && is_ri (insn, op1_lhi, op2_lhi, &r1, &i2))
1289b725ae77Skettenis         pv_set_to_constant (&data->gpr[r1], i2);
1290b725ae77Skettenis 
1291b725ae77Skettenis       /* LGHI r1, i2 --- load halfword immediate (64-bit version) */
1292b725ae77Skettenis       else if (word_size == 8
1293b725ae77Skettenis 	       && is_ri (insn, op1_lghi, op2_lghi, &r1, &i2))
1294b725ae77Skettenis         pv_set_to_constant (&data->gpr[r1], i2);
1295b725ae77Skettenis 
1296b725ae77Skettenis       /* LR r1, r2 --- load from register */
1297b725ae77Skettenis       else if (word_size == 4
1298b725ae77Skettenis 	       && is_rr (insn, op_lr, &r1, &r2))
1299b725ae77Skettenis         data->gpr[r1] = data->gpr[r2];
1300b725ae77Skettenis 
1301b725ae77Skettenis       /* LGR r1, r2 --- load from register (64-bit version) */
1302b725ae77Skettenis       else if (word_size == 8
1303b725ae77Skettenis                && is_rre (insn, op_lgr, &r1, &r2))
1304b725ae77Skettenis         data->gpr[r1] = data->gpr[r2];
1305b725ae77Skettenis 
1306b725ae77Skettenis       /* L r1, d2(x2, b2) --- load */
1307b725ae77Skettenis       else if (word_size == 4
1308b725ae77Skettenis 	       && is_rx (insn, op_l, &r1, &d2, &x2, &b2))
1309b725ae77Skettenis         {
1310b725ae77Skettenis           struct prologue_value addr;
1311b725ae77Skettenis 
1312b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1313b725ae77Skettenis 	  s390_load (&addr, 4, &data->gpr[r1], data);
1314b725ae77Skettenis         }
1315b725ae77Skettenis 
1316b725ae77Skettenis       /* LY r1, d2(x2, b2) --- load (long-displacement version) */
1317b725ae77Skettenis       else if (word_size == 4
1318b725ae77Skettenis 	       && is_rxy (insn, op1_ly, op2_ly, &r1, &d2, &x2, &b2))
1319b725ae77Skettenis         {
1320b725ae77Skettenis           struct prologue_value addr;
1321b725ae77Skettenis 
1322b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1323b725ae77Skettenis 	  s390_load (&addr, 4, &data->gpr[r1], data);
1324b725ae77Skettenis         }
1325b725ae77Skettenis 
1326b725ae77Skettenis       /* LG r1, d2(x2, b2) --- load (64-bit version) */
1327b725ae77Skettenis       else if (word_size == 8
1328b725ae77Skettenis 	       && is_rxy (insn, op1_lg, op2_lg, &r1, &d2, &x2, &b2))
1329b725ae77Skettenis         {
1330b725ae77Skettenis           struct prologue_value addr;
1331b725ae77Skettenis 
1332b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1333b725ae77Skettenis 	  s390_load (&addr, 8, &data->gpr[r1], data);
1334b725ae77Skettenis         }
1335b725ae77Skettenis 
1336b725ae77Skettenis       /* ST r1, d2(x2, b2) --- store */
1337b725ae77Skettenis       else if (word_size == 4
1338b725ae77Skettenis 	       && is_rx (insn, op_st, &r1, &d2, &x2, &b2))
1339b725ae77Skettenis         {
1340b725ae77Skettenis           struct prologue_value addr;
1341b725ae77Skettenis 
1342b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1343b725ae77Skettenis 	  s390_store (&addr, 4, &data->gpr[r1], data);
1344b725ae77Skettenis         }
1345b725ae77Skettenis 
1346b725ae77Skettenis       /* STY r1, d2(x2, b2) --- store (long-displacement version) */
1347b725ae77Skettenis       else if (word_size == 4
1348b725ae77Skettenis 	       && is_rxy (insn, op1_sty, op2_sty, &r1, &d2, &x2, &b2))
1349b725ae77Skettenis         {
1350b725ae77Skettenis           struct prologue_value addr;
1351b725ae77Skettenis 
1352b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1353b725ae77Skettenis 	  s390_store (&addr, 4, &data->gpr[r1], data);
1354b725ae77Skettenis         }
1355b725ae77Skettenis 
1356b725ae77Skettenis       /* STG r1, d2(x2, b2) --- store (64-bit version) */
1357b725ae77Skettenis       else if (word_size == 8
1358b725ae77Skettenis 	       && is_rxy (insn, op1_stg, op2_stg, &r1, &d2, &x2, &b2))
1359b725ae77Skettenis         {
1360b725ae77Skettenis           struct prologue_value addr;
1361b725ae77Skettenis 
1362b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1363b725ae77Skettenis 	  s390_store (&addr, 8, &data->gpr[r1], data);
1364b725ae77Skettenis         }
1365b725ae77Skettenis 
1366b725ae77Skettenis       /* STD r1, d2(x2,b2) --- store floating-point register  */
1367b725ae77Skettenis       else if (is_rx (insn, op_std, &r1, &d2, &x2, &b2))
1368b725ae77Skettenis         {
1369b725ae77Skettenis           struct prologue_value addr;
1370b725ae77Skettenis 
1371b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1372b725ae77Skettenis           s390_store (&addr, 8, &data->fpr[r1], data);
1373b725ae77Skettenis         }
1374b725ae77Skettenis 
1375b725ae77Skettenis       /* STM r1, r3, d2(b2) --- store multiple */
1376b725ae77Skettenis       else if (word_size == 4
1377b725ae77Skettenis 	       && is_rs (insn, op_stm, &r1, &r3, &d2, &b2))
1378b725ae77Skettenis         {
1379b725ae77Skettenis           int regnum;
1380b725ae77Skettenis           int offset;
1381b725ae77Skettenis           struct prologue_value addr;
1382b725ae77Skettenis 
1383b725ae77Skettenis           for (regnum = r1, offset = 0;
1384b725ae77Skettenis                regnum <= r3;
1385b725ae77Skettenis                regnum++, offset += 4)
1386b725ae77Skettenis             {
1387b725ae77Skettenis               compute_x_addr (&addr, data->gpr, d2 + offset, 0, b2);
1388b725ae77Skettenis               s390_store (&addr, 4, &data->gpr[regnum], data);
1389b725ae77Skettenis             }
1390b725ae77Skettenis         }
1391b725ae77Skettenis 
1392b725ae77Skettenis       /* STMY r1, r3, d2(b2) --- store multiple (long-displacement version) */
1393b725ae77Skettenis       else if (word_size == 4
1394b725ae77Skettenis 	       && is_rsy (insn, op1_stmy, op2_stmy, &r1, &r3, &d2, &b2))
1395b725ae77Skettenis         {
1396b725ae77Skettenis           int regnum;
1397b725ae77Skettenis           int offset;
1398b725ae77Skettenis           struct prologue_value addr;
1399b725ae77Skettenis 
1400b725ae77Skettenis           for (regnum = r1, offset = 0;
1401b725ae77Skettenis                regnum <= r3;
1402b725ae77Skettenis                regnum++, offset += 4)
1403b725ae77Skettenis             {
1404b725ae77Skettenis               compute_x_addr (&addr, data->gpr, d2 + offset, 0, b2);
1405b725ae77Skettenis               s390_store (&addr, 4, &data->gpr[regnum], data);
1406b725ae77Skettenis             }
1407b725ae77Skettenis         }
1408b725ae77Skettenis 
1409b725ae77Skettenis       /* STMG r1, r3, d2(b2) --- store multiple (64-bit version) */
1410b725ae77Skettenis       else if (word_size == 8
1411b725ae77Skettenis 	       && is_rsy (insn, op1_stmg, op2_stmg, &r1, &r3, &d2, &b2))
1412b725ae77Skettenis         {
1413b725ae77Skettenis           int regnum;
1414b725ae77Skettenis           int offset;
1415b725ae77Skettenis           struct prologue_value addr;
1416b725ae77Skettenis 
1417b725ae77Skettenis           for (regnum = r1, offset = 0;
1418b725ae77Skettenis                regnum <= r3;
1419b725ae77Skettenis                regnum++, offset += 8)
1420b725ae77Skettenis             {
1421b725ae77Skettenis               compute_x_addr (&addr, data->gpr, d2 + offset, 0, b2);
1422b725ae77Skettenis               s390_store (&addr, 8, &data->gpr[regnum], data);
1423b725ae77Skettenis             }
1424b725ae77Skettenis         }
1425b725ae77Skettenis 
1426b725ae77Skettenis       /* AHI r1, i2 --- add halfword immediate */
1427b725ae77Skettenis       else if (word_size == 4
1428b725ae77Skettenis 	       && is_ri (insn, op1_ahi, op2_ahi, &r1, &i2))
1429b725ae77Skettenis         pv_add_constant (&data->gpr[r1], i2);
1430b725ae77Skettenis 
1431b725ae77Skettenis       /* AGHI r1, i2 --- add halfword immediate (64-bit version) */
1432b725ae77Skettenis       else if (word_size == 8
1433b725ae77Skettenis                && is_ri (insn, op1_aghi, op2_aghi, &r1, &i2))
1434b725ae77Skettenis         pv_add_constant (&data->gpr[r1], i2);
1435b725ae77Skettenis 
1436b725ae77Skettenis       /* AR r1, r2 -- add register */
1437b725ae77Skettenis       else if (word_size == 4
1438b725ae77Skettenis 	       && is_rr (insn, op_ar, &r1, &r2))
1439b725ae77Skettenis         pv_add (&data->gpr[r1], &data->gpr[r1], &data->gpr[r2]);
1440b725ae77Skettenis 
1441b725ae77Skettenis       /* AGR r1, r2 -- add register (64-bit version) */
1442b725ae77Skettenis       else if (word_size == 8
1443b725ae77Skettenis 	       && is_rre (insn, op_agr, &r1, &r2))
1444b725ae77Skettenis         pv_add (&data->gpr[r1], &data->gpr[r1], &data->gpr[r2]);
1445b725ae77Skettenis 
1446b725ae77Skettenis       /* A r1, d2(x2, b2) -- add */
1447b725ae77Skettenis       else if (word_size == 4
1448b725ae77Skettenis 	       && is_rx (insn, op_a, &r1, &d2, &x2, &b2))
1449b725ae77Skettenis 	{
1450b725ae77Skettenis           struct prologue_value addr;
1451b725ae77Skettenis           struct prologue_value value;
1452b725ae77Skettenis 
1453b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1454b725ae77Skettenis 	  s390_load (&addr, 4, &value, data);
1455b725ae77Skettenis 
1456b725ae77Skettenis 	  pv_add (&data->gpr[r1], &data->gpr[r1], &value);
1457b725ae77Skettenis 	}
1458b725ae77Skettenis 
1459b725ae77Skettenis       /* AY r1, d2(x2, b2) -- add (long-displacement version) */
1460b725ae77Skettenis       else if (word_size == 4
1461b725ae77Skettenis 	       && is_rxy (insn, op1_ay, op2_ay, &r1, &d2, &x2, &b2))
1462b725ae77Skettenis 	{
1463b725ae77Skettenis           struct prologue_value addr;
1464b725ae77Skettenis           struct prologue_value value;
1465b725ae77Skettenis 
1466b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1467b725ae77Skettenis 	  s390_load (&addr, 4, &value, data);
1468b725ae77Skettenis 
1469b725ae77Skettenis 	  pv_add (&data->gpr[r1], &data->gpr[r1], &value);
1470b725ae77Skettenis 	}
1471b725ae77Skettenis 
1472b725ae77Skettenis       /* AG r1, d2(x2, b2) -- add (64-bit version) */
1473b725ae77Skettenis       else if (word_size == 8
1474b725ae77Skettenis 	       && is_rxy (insn, op1_ag, op2_ag, &r1, &d2, &x2, &b2))
1475b725ae77Skettenis 	{
1476b725ae77Skettenis           struct prologue_value addr;
1477b725ae77Skettenis           struct prologue_value value;
1478b725ae77Skettenis 
1479b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1480b725ae77Skettenis 	  s390_load (&addr, 8, &value, data);
1481b725ae77Skettenis 
1482b725ae77Skettenis 	  pv_add (&data->gpr[r1], &data->gpr[r1], &value);
1483b725ae77Skettenis 	}
1484b725ae77Skettenis 
1485b725ae77Skettenis       /* SR r1, r2 -- subtract register */
1486b725ae77Skettenis       else if (word_size == 4
1487b725ae77Skettenis 	       && is_rr (insn, op_sr, &r1, &r2))
1488b725ae77Skettenis         pv_subtract (&data->gpr[r1], &data->gpr[r1], &data->gpr[r2]);
1489b725ae77Skettenis 
1490b725ae77Skettenis       /* SGR r1, r2 -- subtract register (64-bit version) */
1491b725ae77Skettenis       else if (word_size == 8
1492b725ae77Skettenis 	       && is_rre (insn, op_sgr, &r1, &r2))
1493b725ae77Skettenis         pv_subtract (&data->gpr[r1], &data->gpr[r1], &data->gpr[r2]);
1494b725ae77Skettenis 
1495b725ae77Skettenis       /* S r1, d2(x2, b2) -- subtract */
1496b725ae77Skettenis       else if (word_size == 4
1497b725ae77Skettenis 	       && is_rx (insn, op_s, &r1, &d2, &x2, &b2))
1498b725ae77Skettenis 	{
1499b725ae77Skettenis           struct prologue_value addr;
1500b725ae77Skettenis           struct prologue_value value;
1501b725ae77Skettenis 
1502b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1503b725ae77Skettenis 	  s390_load (&addr, 4, &value, data);
1504b725ae77Skettenis 
1505b725ae77Skettenis 	  pv_subtract (&data->gpr[r1], &data->gpr[r1], &value);
1506b725ae77Skettenis 	}
1507b725ae77Skettenis 
1508b725ae77Skettenis       /* SY r1, d2(x2, b2) -- subtract (long-displacement version) */
1509b725ae77Skettenis       else if (word_size == 4
1510b725ae77Skettenis 	       && is_rxy (insn, op1_sy, op2_sy, &r1, &d2, &x2, &b2))
1511b725ae77Skettenis 	{
1512b725ae77Skettenis           struct prologue_value addr;
1513b725ae77Skettenis           struct prologue_value value;
1514b725ae77Skettenis 
1515b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1516b725ae77Skettenis 	  s390_load (&addr, 4, &value, data);
1517b725ae77Skettenis 
1518b725ae77Skettenis 	  pv_subtract (&data->gpr[r1], &data->gpr[r1], &value);
1519b725ae77Skettenis 	}
1520b725ae77Skettenis 
1521b725ae77Skettenis       /* SG r1, d2(x2, b2) -- subtract (64-bit version) */
1522b725ae77Skettenis       else if (word_size == 8
1523b725ae77Skettenis 	       && is_rxy (insn, op1_sg, op2_sg, &r1, &d2, &x2, &b2))
1524b725ae77Skettenis 	{
1525b725ae77Skettenis           struct prologue_value addr;
1526b725ae77Skettenis           struct prologue_value value;
1527b725ae77Skettenis 
1528b725ae77Skettenis           compute_x_addr (&addr, data->gpr, d2, x2, b2);
1529b725ae77Skettenis 	  s390_load (&addr, 8, &value, data);
1530b725ae77Skettenis 
1531b725ae77Skettenis 	  pv_subtract (&data->gpr[r1], &data->gpr[r1], &value);
1532b725ae77Skettenis 	}
1533b725ae77Skettenis 
1534b725ae77Skettenis       /* NR r1, r2 --- logical and */
1535b725ae77Skettenis       else if (word_size == 4
1536b725ae77Skettenis 	       && is_rr (insn, op_nr, &r1, &r2))
1537b725ae77Skettenis         pv_logical_and (&data->gpr[r1], &data->gpr[r1], &data->gpr[r2]);
1538b725ae77Skettenis 
1539b725ae77Skettenis       /* NGR r1, r2 >--- logical and (64-bit version) */
1540b725ae77Skettenis       else if (word_size == 8
1541b725ae77Skettenis                && is_rre (insn, op_ngr, &r1, &r2))
1542b725ae77Skettenis         pv_logical_and (&data->gpr[r1], &data->gpr[r1], &data->gpr[r2]);
1543b725ae77Skettenis 
1544b725ae77Skettenis       /* LA r1, d2(x2, b2) --- load address */
1545b725ae77Skettenis       else if (is_rx (insn, op_la, &r1, &d2, &x2, &b2))
1546b725ae77Skettenis         compute_x_addr (&data->gpr[r1], data->gpr, d2, x2, b2);
1547b725ae77Skettenis 
1548b725ae77Skettenis       /* LAY r1, d2(x2, b2) --- load address (long-displacement version) */
1549b725ae77Skettenis       else if (is_rxy (insn, op1_lay, op2_lay, &r1, &d2, &x2, &b2))
1550b725ae77Skettenis         compute_x_addr (&data->gpr[r1], data->gpr, d2, x2, b2);
1551b725ae77Skettenis 
1552b725ae77Skettenis       /* LARL r1, i2 --- load address relative long */
1553b725ae77Skettenis       else if (is_ril (insn, op1_larl, op2_larl, &r1, &i2))
1554b725ae77Skettenis         pv_set_to_constant (&data->gpr[r1], pc + i2 * 2);
1555b725ae77Skettenis 
1556b725ae77Skettenis       /* BASR r1, 0 --- branch and save
1557b725ae77Skettenis          Since r2 is zero, this saves the PC in r1, but doesn't branch.  */
1558b725ae77Skettenis       else if (is_rr (insn, op_basr, &r1, &r2)
1559b725ae77Skettenis                && r2 == 0)
1560b725ae77Skettenis         pv_set_to_constant (&data->gpr[r1], next_pc);
1561b725ae77Skettenis 
1562b725ae77Skettenis       /* BRAS r1, i2 --- branch relative and save */
1563b725ae77Skettenis       else if (is_ri (insn, op1_bras, op2_bras, &r1, &i2))
1564b725ae77Skettenis         {
1565b725ae77Skettenis           pv_set_to_constant (&data->gpr[r1], next_pc);
1566b725ae77Skettenis           next_pc = pc + i2 * 2;
1567b725ae77Skettenis 
1568b725ae77Skettenis           /* We'd better not interpret any backward branches.  We'll
1569b725ae77Skettenis              never terminate.  */
1570b725ae77Skettenis           if (next_pc <= pc)
1571b725ae77Skettenis             break;
1572b725ae77Skettenis         }
1573b725ae77Skettenis 
1574b725ae77Skettenis       /* Terminate search when hitting any other branch instruction.  */
1575b725ae77Skettenis       else if (is_rr (insn, op_basr, &r1, &r2)
1576b725ae77Skettenis 	       || is_rx (insn, op_bas, &r1, &d2, &x2, &b2)
1577b725ae77Skettenis 	       || is_rr (insn, op_bcr, &r1, &r2)
1578b725ae77Skettenis 	       || is_rx (insn, op_bc, &r1, &d2, &x2, &b2)
1579b725ae77Skettenis 	       || is_ri (insn, op1_brc, op2_brc, &r1, &i2)
1580b725ae77Skettenis 	       || is_ril (insn, op1_brcl, op2_brcl, &r1, &i2)
1581b725ae77Skettenis 	       || is_ril (insn, op1_brasl, op2_brasl, &r2, &i2))
1582b725ae77Skettenis 	break;
1583b725ae77Skettenis 
1584b725ae77Skettenis       else
1585b725ae77Skettenis         /* An instruction we don't know how to simulate.  The only
1586b725ae77Skettenis            safe thing to do would be to set every value we're tracking
1587b725ae77Skettenis            to 'unknown'.  Instead, we'll be optimistic: we assume that
1588b725ae77Skettenis 	   we *can* interpret every instruction that the compiler uses
1589b725ae77Skettenis 	   to manipulate any of the data we're interested in here --
1590b725ae77Skettenis 	   then we can just ignore anything else.  */
1591b725ae77Skettenis         ;
1592b725ae77Skettenis 
1593b725ae77Skettenis       /* Record the address after the last instruction that changed
1594b725ae77Skettenis          the FP, SP, or backlink.  Ignore instructions that changed
1595b725ae77Skettenis          them back to their original values --- those are probably
1596b725ae77Skettenis          restore instructions.  (The back chain is never restored,
1597b725ae77Skettenis          just popped.)  */
1598b725ae77Skettenis       {
1599b725ae77Skettenis         struct prologue_value *sp = &data->gpr[S390_SP_REGNUM - S390_R0_REGNUM];
1600b725ae77Skettenis         struct prologue_value *fp = &data->gpr[S390_FRAME_REGNUM - S390_R0_REGNUM];
1601b725ae77Skettenis 
1602b725ae77Skettenis         if ((! pv_is_identical (&pre_insn_sp, sp)
1603b725ae77Skettenis              && ! pv_is_register (sp, S390_SP_REGNUM, 0))
1604b725ae77Skettenis             || (! pv_is_identical (&pre_insn_fp, fp)
1605b725ae77Skettenis                 && ! pv_is_register (fp, S390_FRAME_REGNUM, 0))
1606*11efff7fSkettenis             || pre_insn_back_chain_saved_p != data->back_chain_saved_p)
1607b725ae77Skettenis           result = next_pc;
1608b725ae77Skettenis       }
1609b725ae77Skettenis     }
1610b725ae77Skettenis 
1611b725ae77Skettenis   return result;
1612b725ae77Skettenis }
1613b725ae77Skettenis 
1614b725ae77Skettenis /* Advance PC across any function entry prologue instructions to reach
1615b725ae77Skettenis    some "real" code.  */
1616b725ae77Skettenis static CORE_ADDR
s390_skip_prologue(CORE_ADDR pc)1617b725ae77Skettenis s390_skip_prologue (CORE_ADDR pc)
1618b725ae77Skettenis {
1619b725ae77Skettenis   struct s390_prologue_data data;
1620b725ae77Skettenis   CORE_ADDR skip_pc;
1621b725ae77Skettenis   skip_pc = s390_analyze_prologue (current_gdbarch, pc, (CORE_ADDR)-1, &data);
1622b725ae77Skettenis   return skip_pc ? skip_pc : pc;
1623b725ae77Skettenis }
1624b725ae77Skettenis 
1625b725ae77Skettenis /* Return true if we are in the functin's epilogue, i.e. after the
1626b725ae77Skettenis    instruction that destroyed the function's stack frame.  */
1627b725ae77Skettenis static int
s390_in_function_epilogue_p(struct gdbarch * gdbarch,CORE_ADDR pc)1628b725ae77Skettenis s390_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
1629b725ae77Skettenis {
1630b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1631b725ae77Skettenis 
1632b725ae77Skettenis   /* In frameless functions, there's not frame to destroy and thus
1633b725ae77Skettenis      we don't care about the epilogue.
1634b725ae77Skettenis 
1635b725ae77Skettenis      In functions with frame, the epilogue sequence is a pair of
1636b725ae77Skettenis      a LM-type instruction that restores (amongst others) the
1637b725ae77Skettenis      return register %r14 and the stack pointer %r15, followed
1638b725ae77Skettenis      by a branch 'br %r14' --or equivalent-- that effects the
1639b725ae77Skettenis      actual return.
1640b725ae77Skettenis 
1641b725ae77Skettenis      In that situation, this function needs to return 'true' in
1642b725ae77Skettenis      exactly one case: when pc points to that branch instruction.
1643b725ae77Skettenis 
1644b725ae77Skettenis      Thus we try to disassemble the one instructions immediately
1645b725ae77Skettenis      preceeding pc and check whether it is an LM-type instruction
1646b725ae77Skettenis      modifying the stack pointer.
1647b725ae77Skettenis 
1648b725ae77Skettenis      Note that disassembling backwards is not reliable, so there
1649b725ae77Skettenis      is a slight chance of false positives here ...  */
1650b725ae77Skettenis 
1651b725ae77Skettenis   bfd_byte insn[6];
1652b725ae77Skettenis   unsigned int r1, r3, b2;
1653b725ae77Skettenis   int d2;
1654b725ae77Skettenis 
1655b725ae77Skettenis   if (word_size == 4
1656*11efff7fSkettenis       && !deprecated_read_memory_nobpt (pc - 4, insn, 4)
1657b725ae77Skettenis       && is_rs (insn, op_lm, &r1, &r3, &d2, &b2)
1658b725ae77Skettenis       && r3 == S390_SP_REGNUM - S390_R0_REGNUM)
1659b725ae77Skettenis     return 1;
1660b725ae77Skettenis 
1661b725ae77Skettenis   if (word_size == 4
1662*11efff7fSkettenis       && !deprecated_read_memory_nobpt (pc - 6, insn, 6)
1663b725ae77Skettenis       && is_rsy (insn, op1_lmy, op2_lmy, &r1, &r3, &d2, &b2)
1664b725ae77Skettenis       && r3 == S390_SP_REGNUM - S390_R0_REGNUM)
1665b725ae77Skettenis     return 1;
1666b725ae77Skettenis 
1667b725ae77Skettenis   if (word_size == 8
1668*11efff7fSkettenis       && !deprecated_read_memory_nobpt (pc - 6, insn, 6)
1669b725ae77Skettenis       && is_rsy (insn, op1_lmg, op2_lmg, &r1, &r3, &d2, &b2)
1670b725ae77Skettenis       && r3 == S390_SP_REGNUM - S390_R0_REGNUM)
1671b725ae77Skettenis     return 1;
1672b725ae77Skettenis 
1673b725ae77Skettenis   return 0;
1674b725ae77Skettenis }
1675b725ae77Skettenis 
1676b725ae77Skettenis 
1677b725ae77Skettenis /* Normal stack frames.  */
1678b725ae77Skettenis 
1679b725ae77Skettenis struct s390_unwind_cache {
1680b725ae77Skettenis 
1681b725ae77Skettenis   CORE_ADDR func;
1682b725ae77Skettenis   CORE_ADDR frame_base;
1683b725ae77Skettenis   CORE_ADDR local_base;
1684b725ae77Skettenis 
1685b725ae77Skettenis   struct trad_frame_saved_reg *saved_regs;
1686b725ae77Skettenis };
1687b725ae77Skettenis 
1688b725ae77Skettenis static int
s390_prologue_frame_unwind_cache(struct frame_info * next_frame,struct s390_unwind_cache * info)1689b725ae77Skettenis s390_prologue_frame_unwind_cache (struct frame_info *next_frame,
1690b725ae77Skettenis 				  struct s390_unwind_cache *info)
1691b725ae77Skettenis {
1692b725ae77Skettenis   struct gdbarch *gdbarch = get_frame_arch (next_frame);
1693*11efff7fSkettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1694b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1695b725ae77Skettenis   struct s390_prologue_data data;
1696b725ae77Skettenis   struct prologue_value *fp = &data.gpr[S390_FRAME_REGNUM - S390_R0_REGNUM];
1697b725ae77Skettenis   struct prologue_value *sp = &data.gpr[S390_SP_REGNUM - S390_R0_REGNUM];
1698*11efff7fSkettenis   int i;
1699*11efff7fSkettenis   CORE_ADDR cfa;
1700b725ae77Skettenis   CORE_ADDR func;
1701b725ae77Skettenis   CORE_ADDR result;
1702b725ae77Skettenis   ULONGEST reg;
1703b725ae77Skettenis   CORE_ADDR prev_sp;
1704b725ae77Skettenis   int frame_pointer;
1705b725ae77Skettenis   int size;
1706b725ae77Skettenis 
1707b725ae77Skettenis   /* Try to find the function start address.  If we can't find it, we don't
1708b725ae77Skettenis      bother searching for it -- with modern compilers this would be mostly
1709b725ae77Skettenis      pointless anyway.  Trust that we'll either have valid DWARF-2 CFI data
1710b725ae77Skettenis      or else a valid backchain ...  */
1711b725ae77Skettenis   func = frame_func_unwind (next_frame);
1712b725ae77Skettenis   if (!func)
1713b725ae77Skettenis     return 0;
1714b725ae77Skettenis 
1715b725ae77Skettenis   /* Try to analyze the prologue.  */
1716b725ae77Skettenis   result = s390_analyze_prologue (gdbarch, func,
1717b725ae77Skettenis 				  frame_pc_unwind (next_frame), &data);
1718b725ae77Skettenis   if (!result)
1719b725ae77Skettenis     return 0;
1720b725ae77Skettenis 
1721b725ae77Skettenis   /* If this was successful, we should have found the instruction that
1722b725ae77Skettenis      sets the stack pointer register to the previous value of the stack
1723b725ae77Skettenis      pointer minus the frame size.  */
1724b725ae77Skettenis   if (sp->kind != pv_register || sp->reg != S390_SP_REGNUM)
1725b725ae77Skettenis     return 0;
1726b725ae77Skettenis 
1727b725ae77Skettenis   /* A frame size of zero at this point can mean either a real
1728b725ae77Skettenis      frameless function, or else a failure to find the prologue.
1729b725ae77Skettenis      Perform some sanity checks to verify we really have a
1730b725ae77Skettenis      frameless function.  */
1731b725ae77Skettenis   if (sp->k == 0)
1732b725ae77Skettenis     {
1733b725ae77Skettenis       /* If the next frame is a NORMAL_FRAME, this frame *cannot* have frame
1734b725ae77Skettenis 	 size zero.  This is only possible if the next frame is a sentinel
1735b725ae77Skettenis 	 frame, a dummy frame, or a signal trampoline frame.  */
1736*11efff7fSkettenis       /* FIXME: cagney/2004-05-01: This sanity check shouldn't be
1737*11efff7fSkettenis 	 needed, instead the code should simpliy rely on its
1738*11efff7fSkettenis 	 analysis.  */
1739*11efff7fSkettenis       if (get_frame_type (next_frame) == NORMAL_FRAME)
1740b725ae77Skettenis 	return 0;
1741b725ae77Skettenis 
1742b725ae77Skettenis       /* If we really have a frameless function, %r14 must be valid
1743b725ae77Skettenis 	 -- in particular, it must point to a different function.  */
1744b725ae77Skettenis       reg = frame_unwind_register_unsigned (next_frame, S390_RETADDR_REGNUM);
1745b725ae77Skettenis       reg = gdbarch_addr_bits_remove (gdbarch, reg) - 1;
1746b725ae77Skettenis       if (get_pc_function_start (reg) == func)
1747b725ae77Skettenis 	{
1748b725ae77Skettenis 	  /* However, there is one case where it *is* valid for %r14
1749b725ae77Skettenis 	     to point to the same function -- if this is a recursive
1750b725ae77Skettenis 	     call, and we have stopped in the prologue *before* the
1751b725ae77Skettenis 	     stack frame was allocated.
1752b725ae77Skettenis 
1753b725ae77Skettenis 	     Recognize this case by looking ahead a bit ...  */
1754b725ae77Skettenis 
1755b725ae77Skettenis 	  struct s390_prologue_data data2;
1756b725ae77Skettenis 	  struct prologue_value *sp = &data2.gpr[S390_SP_REGNUM - S390_R0_REGNUM];
1757b725ae77Skettenis 
1758b725ae77Skettenis 	  if (!(s390_analyze_prologue (gdbarch, func, (CORE_ADDR)-1, &data2)
1759b725ae77Skettenis 	        && sp->kind == pv_register
1760b725ae77Skettenis 	        && sp->reg == S390_SP_REGNUM
1761b725ae77Skettenis 	        && sp->k != 0))
1762b725ae77Skettenis 	    return 0;
1763b725ae77Skettenis 	}
1764b725ae77Skettenis     }
1765b725ae77Skettenis 
1766b725ae77Skettenis 
1767b725ae77Skettenis   /* OK, we've found valid prologue data.  */
1768b725ae77Skettenis   size = -sp->k;
1769b725ae77Skettenis 
1770b725ae77Skettenis   /* If the frame pointer originally also holds the same value
1771b725ae77Skettenis      as the stack pointer, we're probably using it.  If it holds
1772b725ae77Skettenis      some other value -- even a constant offset -- it is most
1773b725ae77Skettenis      likely used as temp register.  */
1774b725ae77Skettenis   if (pv_is_identical (sp, fp))
1775b725ae77Skettenis     frame_pointer = S390_FRAME_REGNUM;
1776b725ae77Skettenis   else
1777b725ae77Skettenis     frame_pointer = S390_SP_REGNUM;
1778b725ae77Skettenis 
1779b725ae77Skettenis   /* If we've detected a function with stack frame, we'll still have to
1780b725ae77Skettenis      treat it as frameless if we're currently within the function epilog
1781b725ae77Skettenis      code at a point where the frame pointer has already been restored.
1782b725ae77Skettenis      This can only happen in an innermost frame.  */
1783*11efff7fSkettenis   /* FIXME: cagney/2004-05-01: This sanity check shouldn't be needed,
1784*11efff7fSkettenis      instead the code should simpliy rely on its analysis.  */
1785*11efff7fSkettenis   if (size > 0 && get_frame_type (next_frame) != NORMAL_FRAME)
1786b725ae77Skettenis     {
1787b725ae77Skettenis       /* See the comment in s390_in_function_epilogue_p on why this is
1788b725ae77Skettenis 	 not completely reliable ...  */
1789b725ae77Skettenis       if (s390_in_function_epilogue_p (gdbarch, frame_pc_unwind (next_frame)))
1790b725ae77Skettenis 	{
1791b725ae77Skettenis 	  memset (&data, 0, sizeof (data));
1792b725ae77Skettenis 	  size = 0;
1793b725ae77Skettenis 	  frame_pointer = S390_SP_REGNUM;
1794b725ae77Skettenis 	}
1795b725ae77Skettenis     }
1796b725ae77Skettenis 
1797b725ae77Skettenis   /* Once we know the frame register and the frame size, we can unwind
1798b725ae77Skettenis      the current value of the frame register from the next frame, and
1799b725ae77Skettenis      add back the frame size to arrive that the previous frame's
1800b725ae77Skettenis      stack pointer value.  */
1801b725ae77Skettenis   prev_sp = frame_unwind_register_unsigned (next_frame, frame_pointer) + size;
1802*11efff7fSkettenis   cfa = prev_sp + 16*word_size + 32;
1803b725ae77Skettenis 
1804*11efff7fSkettenis   /* Record the addresses of all register spill slots the prologue parser
1805*11efff7fSkettenis      has recognized.  Consider only registers defined as call-saved by the
1806*11efff7fSkettenis      ABI; for call-clobbered registers the parser may have recognized
1807*11efff7fSkettenis      spurious stores.  */
1808b725ae77Skettenis 
1809*11efff7fSkettenis   for (i = 6; i <= 15; i++)
1810*11efff7fSkettenis     if (data.gpr_slot[i] != 0)
1811*11efff7fSkettenis       info->saved_regs[S390_R0_REGNUM + i].addr = cfa - data.gpr_slot[i];
1812*11efff7fSkettenis 
1813*11efff7fSkettenis   switch (tdep->abi)
1814b725ae77Skettenis     {
1815*11efff7fSkettenis     case ABI_LINUX_S390:
1816*11efff7fSkettenis       if (data.fpr_slot[4] != 0)
1817*11efff7fSkettenis         info->saved_regs[S390_F4_REGNUM].addr = cfa - data.fpr_slot[4];
1818*11efff7fSkettenis       if (data.fpr_slot[6] != 0)
1819*11efff7fSkettenis         info->saved_regs[S390_F6_REGNUM].addr = cfa - data.fpr_slot[6];
1820*11efff7fSkettenis       break;
1821b725ae77Skettenis 
1822*11efff7fSkettenis     case ABI_LINUX_ZSERIES:
1823*11efff7fSkettenis       for (i = 8; i <= 15; i++)
1824*11efff7fSkettenis 	if (data.fpr_slot[i] != 0)
1825*11efff7fSkettenis 	  info->saved_regs[S390_F0_REGNUM + i].addr = cfa - data.fpr_slot[i];
1826*11efff7fSkettenis       break;
1827b725ae77Skettenis     }
1828b725ae77Skettenis 
1829b725ae77Skettenis   /* Function return will set PC to %r14.  */
1830b725ae77Skettenis   info->saved_regs[S390_PC_REGNUM] = info->saved_regs[S390_RETADDR_REGNUM];
1831b725ae77Skettenis 
1832b725ae77Skettenis   /* In frameless functions, we unwind simply by moving the return
1833b725ae77Skettenis      address to the PC.  However, if we actually stored to the
1834b725ae77Skettenis      save area, use that -- we might only think the function frameless
1835b725ae77Skettenis      because we're in the middle of the prologue ...  */
1836b725ae77Skettenis   if (size == 0
1837b725ae77Skettenis       && !trad_frame_addr_p (info->saved_regs, S390_PC_REGNUM))
1838b725ae77Skettenis     {
1839b725ae77Skettenis       info->saved_regs[S390_PC_REGNUM].realreg = S390_RETADDR_REGNUM;
1840b725ae77Skettenis     }
1841b725ae77Skettenis 
1842b725ae77Skettenis   /* Another sanity check: unless this is a frameless function,
1843b725ae77Skettenis      we should have found spill slots for SP and PC.
1844b725ae77Skettenis      If not, we cannot unwind further -- this happens e.g. in
1845b725ae77Skettenis      libc's thread_start routine.  */
1846b725ae77Skettenis   if (size > 0)
1847b725ae77Skettenis     {
1848b725ae77Skettenis       if (!trad_frame_addr_p (info->saved_regs, S390_SP_REGNUM)
1849b725ae77Skettenis 	  || !trad_frame_addr_p (info->saved_regs, S390_PC_REGNUM))
1850b725ae77Skettenis 	prev_sp = -1;
1851b725ae77Skettenis     }
1852b725ae77Skettenis 
1853b725ae77Skettenis   /* We use the current value of the frame register as local_base,
1854b725ae77Skettenis      and the top of the register save area as frame_base.  */
1855b725ae77Skettenis   if (prev_sp != -1)
1856b725ae77Skettenis     {
1857b725ae77Skettenis       info->frame_base = prev_sp + 16*word_size + 32;
1858b725ae77Skettenis       info->local_base = prev_sp - size;
1859b725ae77Skettenis     }
1860b725ae77Skettenis 
1861b725ae77Skettenis   info->func = func;
1862b725ae77Skettenis   return 1;
1863b725ae77Skettenis }
1864b725ae77Skettenis 
1865b725ae77Skettenis static void
s390_backchain_frame_unwind_cache(struct frame_info * next_frame,struct s390_unwind_cache * info)1866b725ae77Skettenis s390_backchain_frame_unwind_cache (struct frame_info *next_frame,
1867b725ae77Skettenis 				   struct s390_unwind_cache *info)
1868b725ae77Skettenis {
1869b725ae77Skettenis   struct gdbarch *gdbarch = get_frame_arch (next_frame);
1870b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1871b725ae77Skettenis   CORE_ADDR backchain;
1872b725ae77Skettenis   ULONGEST reg;
1873b725ae77Skettenis   LONGEST sp;
1874b725ae77Skettenis 
1875b725ae77Skettenis   /* Get the backchain.  */
1876b725ae77Skettenis   reg = frame_unwind_register_unsigned (next_frame, S390_SP_REGNUM);
1877b725ae77Skettenis   backchain = read_memory_unsigned_integer (reg, word_size);
1878b725ae77Skettenis 
1879b725ae77Skettenis   /* A zero backchain terminates the frame chain.  As additional
1880b725ae77Skettenis      sanity check, let's verify that the spill slot for SP in the
1881b725ae77Skettenis      save area pointed to by the backchain in fact links back to
1882b725ae77Skettenis      the save area.  */
1883b725ae77Skettenis   if (backchain != 0
1884b725ae77Skettenis       && safe_read_memory_integer (backchain + 15*word_size, word_size, &sp)
1885b725ae77Skettenis       && (CORE_ADDR)sp == backchain)
1886b725ae77Skettenis     {
1887b725ae77Skettenis       /* We don't know which registers were saved, but it will have
1888b725ae77Skettenis          to be at least %r14 and %r15.  This will allow us to continue
1889b725ae77Skettenis          unwinding, but other prev-frame registers may be incorrect ...  */
1890b725ae77Skettenis       info->saved_regs[S390_SP_REGNUM].addr = backchain + 15*word_size;
1891b725ae77Skettenis       info->saved_regs[S390_RETADDR_REGNUM].addr = backchain + 14*word_size;
1892b725ae77Skettenis 
1893b725ae77Skettenis       /* Function return will set PC to %r14.  */
1894b725ae77Skettenis       info->saved_regs[S390_PC_REGNUM] = info->saved_regs[S390_RETADDR_REGNUM];
1895b725ae77Skettenis 
1896b725ae77Skettenis       /* We use the current value of the frame register as local_base,
1897b725ae77Skettenis          and the top of the register save area as frame_base.  */
1898b725ae77Skettenis       info->frame_base = backchain + 16*word_size + 32;
1899b725ae77Skettenis       info->local_base = reg;
1900b725ae77Skettenis     }
1901b725ae77Skettenis 
1902b725ae77Skettenis   info->func = frame_pc_unwind (next_frame);
1903b725ae77Skettenis }
1904b725ae77Skettenis 
1905b725ae77Skettenis static struct s390_unwind_cache *
s390_frame_unwind_cache(struct frame_info * next_frame,void ** this_prologue_cache)1906b725ae77Skettenis s390_frame_unwind_cache (struct frame_info *next_frame,
1907b725ae77Skettenis 			 void **this_prologue_cache)
1908b725ae77Skettenis {
1909b725ae77Skettenis   struct s390_unwind_cache *info;
1910b725ae77Skettenis   if (*this_prologue_cache)
1911b725ae77Skettenis     return *this_prologue_cache;
1912b725ae77Skettenis 
1913b725ae77Skettenis   info = FRAME_OBSTACK_ZALLOC (struct s390_unwind_cache);
1914b725ae77Skettenis   *this_prologue_cache = info;
1915b725ae77Skettenis   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
1916b725ae77Skettenis   info->func = -1;
1917b725ae77Skettenis   info->frame_base = -1;
1918b725ae77Skettenis   info->local_base = -1;
1919b725ae77Skettenis 
1920b725ae77Skettenis   /* Try to use prologue analysis to fill the unwind cache.
1921b725ae77Skettenis      If this fails, fall back to reading the stack backchain.  */
1922b725ae77Skettenis   if (!s390_prologue_frame_unwind_cache (next_frame, info))
1923b725ae77Skettenis     s390_backchain_frame_unwind_cache (next_frame, info);
1924b725ae77Skettenis 
1925b725ae77Skettenis   return info;
1926b725ae77Skettenis }
1927b725ae77Skettenis 
1928b725ae77Skettenis static void
s390_frame_this_id(struct frame_info * next_frame,void ** this_prologue_cache,struct frame_id * this_id)1929b725ae77Skettenis s390_frame_this_id (struct frame_info *next_frame,
1930b725ae77Skettenis 		    void **this_prologue_cache,
1931b725ae77Skettenis 		    struct frame_id *this_id)
1932b725ae77Skettenis {
1933b725ae77Skettenis   struct s390_unwind_cache *info
1934b725ae77Skettenis     = s390_frame_unwind_cache (next_frame, this_prologue_cache);
1935b725ae77Skettenis 
1936b725ae77Skettenis   if (info->frame_base == -1)
1937b725ae77Skettenis     return;
1938b725ae77Skettenis 
1939b725ae77Skettenis   *this_id = frame_id_build (info->frame_base, info->func);
1940b725ae77Skettenis }
1941b725ae77Skettenis 
1942b725ae77Skettenis static void
s390_frame_prev_register(struct frame_info * next_frame,void ** this_prologue_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)1943b725ae77Skettenis s390_frame_prev_register (struct frame_info *next_frame,
1944b725ae77Skettenis 			  void **this_prologue_cache,
1945b725ae77Skettenis 			  int regnum, int *optimizedp,
1946b725ae77Skettenis 			  enum lval_type *lvalp, CORE_ADDR *addrp,
1947b725ae77Skettenis 			  int *realnump, void *bufferp)
1948b725ae77Skettenis {
1949b725ae77Skettenis   struct s390_unwind_cache *info
1950b725ae77Skettenis     = s390_frame_unwind_cache (next_frame, this_prologue_cache);
1951*11efff7fSkettenis   trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
1952b725ae77Skettenis 				optimizedp, lvalp, addrp, realnump, bufferp);
1953b725ae77Skettenis }
1954b725ae77Skettenis 
1955b725ae77Skettenis static const struct frame_unwind s390_frame_unwind = {
1956b725ae77Skettenis   NORMAL_FRAME,
1957b725ae77Skettenis   s390_frame_this_id,
1958b725ae77Skettenis   s390_frame_prev_register
1959b725ae77Skettenis };
1960b725ae77Skettenis 
1961b725ae77Skettenis static const struct frame_unwind *
s390_frame_sniffer(struct frame_info * next_frame)1962b725ae77Skettenis s390_frame_sniffer (struct frame_info *next_frame)
1963b725ae77Skettenis {
1964b725ae77Skettenis   return &s390_frame_unwind;
1965b725ae77Skettenis }
1966b725ae77Skettenis 
1967b725ae77Skettenis 
1968b725ae77Skettenis /* Code stubs and their stack frames.  For things like PLTs and NULL
1969b725ae77Skettenis    function calls (where there is no true frame and the return address
1970b725ae77Skettenis    is in the RETADDR register).  */
1971b725ae77Skettenis 
1972b725ae77Skettenis struct s390_stub_unwind_cache
1973b725ae77Skettenis {
1974b725ae77Skettenis   CORE_ADDR frame_base;
1975b725ae77Skettenis   struct trad_frame_saved_reg *saved_regs;
1976b725ae77Skettenis };
1977b725ae77Skettenis 
1978b725ae77Skettenis static struct s390_stub_unwind_cache *
s390_stub_frame_unwind_cache(struct frame_info * next_frame,void ** this_prologue_cache)1979b725ae77Skettenis s390_stub_frame_unwind_cache (struct frame_info *next_frame,
1980b725ae77Skettenis 			      void **this_prologue_cache)
1981b725ae77Skettenis {
1982b725ae77Skettenis   struct gdbarch *gdbarch = get_frame_arch (next_frame);
1983b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
1984b725ae77Skettenis   struct s390_stub_unwind_cache *info;
1985b725ae77Skettenis   ULONGEST reg;
1986b725ae77Skettenis 
1987b725ae77Skettenis   if (*this_prologue_cache)
1988b725ae77Skettenis     return *this_prologue_cache;
1989b725ae77Skettenis 
1990b725ae77Skettenis   info = FRAME_OBSTACK_ZALLOC (struct s390_stub_unwind_cache);
1991b725ae77Skettenis   *this_prologue_cache = info;
1992b725ae77Skettenis   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
1993b725ae77Skettenis 
1994b725ae77Skettenis   /* The return address is in register %r14.  */
1995b725ae77Skettenis   info->saved_regs[S390_PC_REGNUM].realreg = S390_RETADDR_REGNUM;
1996b725ae77Skettenis 
1997b725ae77Skettenis   /* Retrieve stack pointer and determine our frame base.  */
1998b725ae77Skettenis   reg = frame_unwind_register_unsigned (next_frame, S390_SP_REGNUM);
1999b725ae77Skettenis   info->frame_base = reg + 16*word_size + 32;
2000b725ae77Skettenis 
2001b725ae77Skettenis   return info;
2002b725ae77Skettenis }
2003b725ae77Skettenis 
2004b725ae77Skettenis static void
s390_stub_frame_this_id(struct frame_info * next_frame,void ** this_prologue_cache,struct frame_id * this_id)2005b725ae77Skettenis s390_stub_frame_this_id (struct frame_info *next_frame,
2006b725ae77Skettenis 			 void **this_prologue_cache,
2007b725ae77Skettenis 			 struct frame_id *this_id)
2008b725ae77Skettenis {
2009b725ae77Skettenis   struct s390_stub_unwind_cache *info
2010b725ae77Skettenis     = s390_stub_frame_unwind_cache (next_frame, this_prologue_cache);
2011b725ae77Skettenis   *this_id = frame_id_build (info->frame_base, frame_pc_unwind (next_frame));
2012b725ae77Skettenis }
2013b725ae77Skettenis 
2014b725ae77Skettenis static void
s390_stub_frame_prev_register(struct frame_info * next_frame,void ** this_prologue_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)2015b725ae77Skettenis s390_stub_frame_prev_register (struct frame_info *next_frame,
2016b725ae77Skettenis 			       void **this_prologue_cache,
2017b725ae77Skettenis 			       int regnum, int *optimizedp,
2018b725ae77Skettenis 			       enum lval_type *lvalp, CORE_ADDR *addrp,
2019b725ae77Skettenis 			       int *realnump, void *bufferp)
2020b725ae77Skettenis {
2021b725ae77Skettenis   struct s390_stub_unwind_cache *info
2022b725ae77Skettenis     = s390_stub_frame_unwind_cache (next_frame, this_prologue_cache);
2023*11efff7fSkettenis   trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
2024b725ae77Skettenis 				optimizedp, lvalp, addrp, realnump, bufferp);
2025b725ae77Skettenis }
2026b725ae77Skettenis 
2027b725ae77Skettenis static const struct frame_unwind s390_stub_frame_unwind = {
2028b725ae77Skettenis   NORMAL_FRAME,
2029b725ae77Skettenis   s390_stub_frame_this_id,
2030b725ae77Skettenis   s390_stub_frame_prev_register
2031b725ae77Skettenis };
2032b725ae77Skettenis 
2033b725ae77Skettenis static const struct frame_unwind *
s390_stub_frame_sniffer(struct frame_info * next_frame)2034b725ae77Skettenis s390_stub_frame_sniffer (struct frame_info *next_frame)
2035b725ae77Skettenis {
2036b725ae77Skettenis   CORE_ADDR pc = frame_pc_unwind (next_frame);
2037b725ae77Skettenis   bfd_byte insn[S390_MAX_INSTR_SIZE];
2038b725ae77Skettenis 
2039b725ae77Skettenis   /* If the current PC points to non-readable memory, we assume we
2040b725ae77Skettenis      have trapped due to an invalid function pointer call.  We handle
2041b725ae77Skettenis      the non-existing current function like a PLT stub.  */
2042b725ae77Skettenis   if (in_plt_section (pc, NULL)
2043b725ae77Skettenis       || s390_readinstruction (insn, pc) < 0)
2044b725ae77Skettenis     return &s390_stub_frame_unwind;
2045b725ae77Skettenis   return NULL;
2046b725ae77Skettenis }
2047b725ae77Skettenis 
2048b725ae77Skettenis 
2049b725ae77Skettenis /* Signal trampoline stack frames.  */
2050b725ae77Skettenis 
2051b725ae77Skettenis struct s390_sigtramp_unwind_cache {
2052b725ae77Skettenis   CORE_ADDR frame_base;
2053b725ae77Skettenis   struct trad_frame_saved_reg *saved_regs;
2054b725ae77Skettenis };
2055b725ae77Skettenis 
2056b725ae77Skettenis static struct s390_sigtramp_unwind_cache *
s390_sigtramp_frame_unwind_cache(struct frame_info * next_frame,void ** this_prologue_cache)2057b725ae77Skettenis s390_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
2058b725ae77Skettenis 				  void **this_prologue_cache)
2059b725ae77Skettenis {
2060b725ae77Skettenis   struct gdbarch *gdbarch = get_frame_arch (next_frame);
2061b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2062b725ae77Skettenis   struct s390_sigtramp_unwind_cache *info;
2063b725ae77Skettenis   ULONGEST this_sp, prev_sp;
2064b725ae77Skettenis   CORE_ADDR next_ra, next_cfa, sigreg_ptr;
2065b725ae77Skettenis   int i;
2066b725ae77Skettenis 
2067b725ae77Skettenis   if (*this_prologue_cache)
2068b725ae77Skettenis     return *this_prologue_cache;
2069b725ae77Skettenis 
2070b725ae77Skettenis   info = FRAME_OBSTACK_ZALLOC (struct s390_sigtramp_unwind_cache);
2071b725ae77Skettenis   *this_prologue_cache = info;
2072b725ae77Skettenis   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
2073b725ae77Skettenis 
2074b725ae77Skettenis   this_sp = frame_unwind_register_unsigned (next_frame, S390_SP_REGNUM);
2075b725ae77Skettenis   next_ra = frame_pc_unwind (next_frame);
2076b725ae77Skettenis   next_cfa = this_sp + 16*word_size + 32;
2077b725ae77Skettenis 
2078b725ae77Skettenis   /* New-style RT frame:
2079b725ae77Skettenis 	retcode + alignment (8 bytes)
2080b725ae77Skettenis 	siginfo (128 bytes)
2081b725ae77Skettenis 	ucontext (contains sigregs at offset 5 words)  */
2082b725ae77Skettenis   if (next_ra == next_cfa)
2083b725ae77Skettenis     {
2084*11efff7fSkettenis       sigreg_ptr = next_cfa + 8 + 128 + align_up (5*word_size, 8);
2085b725ae77Skettenis     }
2086b725ae77Skettenis 
2087b725ae77Skettenis   /* Old-style RT frame and all non-RT frames:
2088b725ae77Skettenis 	old signal mask (8 bytes)
2089b725ae77Skettenis 	pointer to sigregs  */
2090b725ae77Skettenis   else
2091b725ae77Skettenis     {
2092b725ae77Skettenis       sigreg_ptr = read_memory_unsigned_integer (next_cfa + 8, word_size);
2093b725ae77Skettenis     }
2094b725ae77Skettenis 
2095b725ae77Skettenis   /* The sigregs structure looks like this:
2096b725ae77Skettenis             long   psw_mask;
2097b725ae77Skettenis             long   psw_addr;
2098b725ae77Skettenis             long   gprs[16];
2099b725ae77Skettenis             int    acrs[16];
2100b725ae77Skettenis             int    fpc;
2101b725ae77Skettenis             int    __pad;
2102b725ae77Skettenis             double fprs[16];  */
2103b725ae77Skettenis 
2104b725ae77Skettenis   /* Let's ignore the PSW mask, it will not be restored anyway.  */
2105b725ae77Skettenis   sigreg_ptr += word_size;
2106b725ae77Skettenis 
2107b725ae77Skettenis   /* Next comes the PSW address.  */
2108b725ae77Skettenis   info->saved_regs[S390_PC_REGNUM].addr = sigreg_ptr;
2109b725ae77Skettenis   sigreg_ptr += word_size;
2110b725ae77Skettenis 
2111b725ae77Skettenis   /* Then the GPRs.  */
2112b725ae77Skettenis   for (i = 0; i < 16; i++)
2113b725ae77Skettenis     {
2114b725ae77Skettenis       info->saved_regs[S390_R0_REGNUM + i].addr = sigreg_ptr;
2115b725ae77Skettenis       sigreg_ptr += word_size;
2116b725ae77Skettenis     }
2117b725ae77Skettenis 
2118b725ae77Skettenis   /* Then the ACRs.  */
2119b725ae77Skettenis   for (i = 0; i < 16; i++)
2120b725ae77Skettenis     {
2121b725ae77Skettenis       info->saved_regs[S390_A0_REGNUM + i].addr = sigreg_ptr;
2122b725ae77Skettenis       sigreg_ptr += 4;
2123b725ae77Skettenis     }
2124b725ae77Skettenis 
2125b725ae77Skettenis   /* The floating-point control word.  */
2126b725ae77Skettenis   info->saved_regs[S390_FPC_REGNUM].addr = sigreg_ptr;
2127b725ae77Skettenis   sigreg_ptr += 8;
2128b725ae77Skettenis 
2129b725ae77Skettenis   /* And finally the FPRs.  */
2130b725ae77Skettenis   for (i = 0; i < 16; i++)
2131b725ae77Skettenis     {
2132b725ae77Skettenis       info->saved_regs[S390_F0_REGNUM + i].addr = sigreg_ptr;
2133b725ae77Skettenis       sigreg_ptr += 8;
2134b725ae77Skettenis     }
2135b725ae77Skettenis 
2136b725ae77Skettenis   /* Restore the previous frame's SP.  */
2137b725ae77Skettenis   prev_sp = read_memory_unsigned_integer (
2138b725ae77Skettenis 			info->saved_regs[S390_SP_REGNUM].addr,
2139b725ae77Skettenis 			word_size);
2140b725ae77Skettenis 
2141b725ae77Skettenis   /* Determine our frame base.  */
2142b725ae77Skettenis   info->frame_base = prev_sp + 16*word_size + 32;
2143b725ae77Skettenis 
2144b725ae77Skettenis   return info;
2145b725ae77Skettenis }
2146b725ae77Skettenis 
2147b725ae77Skettenis static void
s390_sigtramp_frame_this_id(struct frame_info * next_frame,void ** this_prologue_cache,struct frame_id * this_id)2148b725ae77Skettenis s390_sigtramp_frame_this_id (struct frame_info *next_frame,
2149b725ae77Skettenis 			     void **this_prologue_cache,
2150b725ae77Skettenis 			     struct frame_id *this_id)
2151b725ae77Skettenis {
2152b725ae77Skettenis   struct s390_sigtramp_unwind_cache *info
2153b725ae77Skettenis     = s390_sigtramp_frame_unwind_cache (next_frame, this_prologue_cache);
2154b725ae77Skettenis   *this_id = frame_id_build (info->frame_base, frame_pc_unwind (next_frame));
2155b725ae77Skettenis }
2156b725ae77Skettenis 
2157b725ae77Skettenis static void
s390_sigtramp_frame_prev_register(struct frame_info * next_frame,void ** this_prologue_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)2158b725ae77Skettenis s390_sigtramp_frame_prev_register (struct frame_info *next_frame,
2159b725ae77Skettenis 				   void **this_prologue_cache,
2160b725ae77Skettenis 				   int regnum, int *optimizedp,
2161b725ae77Skettenis 				   enum lval_type *lvalp, CORE_ADDR *addrp,
2162b725ae77Skettenis 				   int *realnump, void *bufferp)
2163b725ae77Skettenis {
2164b725ae77Skettenis   struct s390_sigtramp_unwind_cache *info
2165b725ae77Skettenis     = s390_sigtramp_frame_unwind_cache (next_frame, this_prologue_cache);
2166*11efff7fSkettenis   trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
2167b725ae77Skettenis 				optimizedp, lvalp, addrp, realnump, bufferp);
2168b725ae77Skettenis }
2169b725ae77Skettenis 
2170b725ae77Skettenis static const struct frame_unwind s390_sigtramp_frame_unwind = {
2171b725ae77Skettenis   SIGTRAMP_FRAME,
2172b725ae77Skettenis   s390_sigtramp_frame_this_id,
2173b725ae77Skettenis   s390_sigtramp_frame_prev_register
2174b725ae77Skettenis };
2175b725ae77Skettenis 
2176b725ae77Skettenis static const struct frame_unwind *
s390_sigtramp_frame_sniffer(struct frame_info * next_frame)2177b725ae77Skettenis s390_sigtramp_frame_sniffer (struct frame_info *next_frame)
2178b725ae77Skettenis {
2179b725ae77Skettenis   CORE_ADDR pc = frame_pc_unwind (next_frame);
2180b725ae77Skettenis   bfd_byte sigreturn[2];
2181b725ae77Skettenis 
2182*11efff7fSkettenis   if (deprecated_read_memory_nobpt (pc, sigreturn, 2))
2183b725ae77Skettenis     return NULL;
2184b725ae77Skettenis 
2185b725ae77Skettenis   if (sigreturn[0] != 0x0a /* svc */)
2186b725ae77Skettenis     return NULL;
2187b725ae77Skettenis 
2188b725ae77Skettenis   if (sigreturn[1] != 119 /* sigreturn */
2189b725ae77Skettenis       && sigreturn[1] != 173 /* rt_sigreturn */)
2190b725ae77Skettenis     return NULL;
2191b725ae77Skettenis 
2192b725ae77Skettenis   return &s390_sigtramp_frame_unwind;
2193b725ae77Skettenis }
2194b725ae77Skettenis 
2195b725ae77Skettenis 
2196b725ae77Skettenis /* Frame base handling.  */
2197b725ae77Skettenis 
2198b725ae77Skettenis static CORE_ADDR
s390_frame_base_address(struct frame_info * next_frame,void ** this_cache)2199b725ae77Skettenis s390_frame_base_address (struct frame_info *next_frame, void **this_cache)
2200b725ae77Skettenis {
2201b725ae77Skettenis   struct s390_unwind_cache *info
2202b725ae77Skettenis     = s390_frame_unwind_cache (next_frame, this_cache);
2203b725ae77Skettenis   return info->frame_base;
2204b725ae77Skettenis }
2205b725ae77Skettenis 
2206b725ae77Skettenis static CORE_ADDR
s390_local_base_address(struct frame_info * next_frame,void ** this_cache)2207b725ae77Skettenis s390_local_base_address (struct frame_info *next_frame, void **this_cache)
2208b725ae77Skettenis {
2209b725ae77Skettenis   struct s390_unwind_cache *info
2210b725ae77Skettenis     = s390_frame_unwind_cache (next_frame, this_cache);
2211b725ae77Skettenis   return info->local_base;
2212b725ae77Skettenis }
2213b725ae77Skettenis 
2214b725ae77Skettenis static const struct frame_base s390_frame_base = {
2215b725ae77Skettenis   &s390_frame_unwind,
2216b725ae77Skettenis   s390_frame_base_address,
2217b725ae77Skettenis   s390_local_base_address,
2218b725ae77Skettenis   s390_local_base_address
2219b725ae77Skettenis };
2220b725ae77Skettenis 
2221b725ae77Skettenis static CORE_ADDR
s390_unwind_pc(struct gdbarch * gdbarch,struct frame_info * next_frame)2222b725ae77Skettenis s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
2223b725ae77Skettenis {
2224b725ae77Skettenis   ULONGEST pc;
2225b725ae77Skettenis   pc = frame_unwind_register_unsigned (next_frame, S390_PC_REGNUM);
2226b725ae77Skettenis   return gdbarch_addr_bits_remove (gdbarch, pc);
2227b725ae77Skettenis }
2228b725ae77Skettenis 
2229b725ae77Skettenis static CORE_ADDR
s390_unwind_sp(struct gdbarch * gdbarch,struct frame_info * next_frame)2230b725ae77Skettenis s390_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
2231b725ae77Skettenis {
2232b725ae77Skettenis   ULONGEST sp;
2233b725ae77Skettenis   sp = frame_unwind_register_unsigned (next_frame, S390_SP_REGNUM);
2234b725ae77Skettenis   return gdbarch_addr_bits_remove (gdbarch, sp);
2235b725ae77Skettenis }
2236b725ae77Skettenis 
2237b725ae77Skettenis 
2238b725ae77Skettenis /* DWARF-2 frame support.  */
2239b725ae77Skettenis 
2240b725ae77Skettenis static void
s390_dwarf2_frame_init_reg(struct gdbarch * gdbarch,int regnum,struct dwarf2_frame_state_reg * reg)2241b725ae77Skettenis s390_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
2242b725ae77Skettenis                             struct dwarf2_frame_state_reg *reg)
2243b725ae77Skettenis {
2244b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2245b725ae77Skettenis 
2246b725ae77Skettenis   switch (tdep->abi)
2247b725ae77Skettenis     {
2248b725ae77Skettenis     case ABI_LINUX_S390:
2249b725ae77Skettenis       /* Call-saved registers.  */
2250b725ae77Skettenis       if ((regnum >= S390_R6_REGNUM && regnum <= S390_R15_REGNUM)
2251b725ae77Skettenis 	  || regnum == S390_F4_REGNUM
2252b725ae77Skettenis 	  || regnum == S390_F6_REGNUM)
2253b725ae77Skettenis 	reg->how = DWARF2_FRAME_REG_SAME_VALUE;
2254b725ae77Skettenis 
2255b725ae77Skettenis       /* Call-clobbered registers.  */
2256b725ae77Skettenis       else if ((regnum >= S390_R0_REGNUM && regnum <= S390_R5_REGNUM)
2257b725ae77Skettenis 	       || (regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM
2258b725ae77Skettenis 		   && regnum != S390_F4_REGNUM && regnum != S390_F6_REGNUM))
2259b725ae77Skettenis 	reg->how = DWARF2_FRAME_REG_UNDEFINED;
2260b725ae77Skettenis 
2261b725ae77Skettenis       /* The return address column.  */
2262b725ae77Skettenis       else if (regnum == S390_PC_REGNUM)
2263b725ae77Skettenis 	reg->how = DWARF2_FRAME_REG_RA;
2264b725ae77Skettenis       break;
2265b725ae77Skettenis 
2266b725ae77Skettenis     case ABI_LINUX_ZSERIES:
2267b725ae77Skettenis       /* Call-saved registers.  */
2268b725ae77Skettenis       if ((regnum >= S390_R6_REGNUM && regnum <= S390_R15_REGNUM)
2269b725ae77Skettenis 	  || (regnum >= S390_F8_REGNUM && regnum <= S390_F15_REGNUM))
2270b725ae77Skettenis 	reg->how = DWARF2_FRAME_REG_SAME_VALUE;
2271b725ae77Skettenis 
2272b725ae77Skettenis       /* Call-clobbered registers.  */
2273b725ae77Skettenis       else if ((regnum >= S390_R0_REGNUM && regnum <= S390_R5_REGNUM)
2274b725ae77Skettenis 	       || (regnum >= S390_F0_REGNUM && regnum <= S390_F7_REGNUM))
2275b725ae77Skettenis 	reg->how = DWARF2_FRAME_REG_UNDEFINED;
2276b725ae77Skettenis 
2277b725ae77Skettenis       /* The return address column.  */
2278b725ae77Skettenis       else if (regnum == S390_PC_REGNUM)
2279b725ae77Skettenis 	reg->how = DWARF2_FRAME_REG_RA;
2280b725ae77Skettenis       break;
2281b725ae77Skettenis     }
2282b725ae77Skettenis }
2283b725ae77Skettenis 
2284b725ae77Skettenis 
2285b725ae77Skettenis /* Dummy function calls.  */
2286b725ae77Skettenis 
2287b725ae77Skettenis /* Return non-zero if TYPE is an integer-like type, zero otherwise.
2288b725ae77Skettenis    "Integer-like" types are those that should be passed the way
2289b725ae77Skettenis    integers are: integers, enums, ranges, characters, and booleans.  */
2290b725ae77Skettenis static int
is_integer_like(struct type * type)2291b725ae77Skettenis is_integer_like (struct type *type)
2292b725ae77Skettenis {
2293b725ae77Skettenis   enum type_code code = TYPE_CODE (type);
2294b725ae77Skettenis 
2295b725ae77Skettenis   return (code == TYPE_CODE_INT
2296b725ae77Skettenis           || code == TYPE_CODE_ENUM
2297b725ae77Skettenis           || code == TYPE_CODE_RANGE
2298b725ae77Skettenis           || code == TYPE_CODE_CHAR
2299b725ae77Skettenis           || code == TYPE_CODE_BOOL);
2300b725ae77Skettenis }
2301b725ae77Skettenis 
2302b725ae77Skettenis /* Return non-zero if TYPE is a pointer-like type, zero otherwise.
2303b725ae77Skettenis    "Pointer-like" types are those that should be passed the way
2304b725ae77Skettenis    pointers are: pointers and references.  */
2305b725ae77Skettenis static int
is_pointer_like(struct type * type)2306b725ae77Skettenis is_pointer_like (struct type *type)
2307b725ae77Skettenis {
2308b725ae77Skettenis   enum type_code code = TYPE_CODE (type);
2309b725ae77Skettenis 
2310b725ae77Skettenis   return (code == TYPE_CODE_PTR
2311b725ae77Skettenis           || code == TYPE_CODE_REF);
2312b725ae77Skettenis }
2313b725ae77Skettenis 
2314b725ae77Skettenis 
2315b725ae77Skettenis /* Return non-zero if TYPE is a `float singleton' or `double
2316b725ae77Skettenis    singleton', zero otherwise.
2317b725ae77Skettenis 
2318b725ae77Skettenis    A `T singleton' is a struct type with one member, whose type is
2319b725ae77Skettenis    either T or a `T singleton'.  So, the following are all float
2320b725ae77Skettenis    singletons:
2321b725ae77Skettenis 
2322b725ae77Skettenis    struct { float x };
2323b725ae77Skettenis    struct { struct { float x; } x; };
2324b725ae77Skettenis    struct { struct { struct { float x; } x; } x; };
2325b725ae77Skettenis 
2326b725ae77Skettenis    ... and so on.
2327b725ae77Skettenis 
2328b725ae77Skettenis    All such structures are passed as if they were floats or doubles,
2329b725ae77Skettenis    as the (revised) ABI says.  */
2330b725ae77Skettenis static int
is_float_singleton(struct type * type)2331b725ae77Skettenis is_float_singleton (struct type *type)
2332b725ae77Skettenis {
2333b725ae77Skettenis   if (TYPE_CODE (type) == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
2334b725ae77Skettenis     {
2335b725ae77Skettenis       struct type *singleton_type = TYPE_FIELD_TYPE (type, 0);
2336b725ae77Skettenis       CHECK_TYPEDEF (singleton_type);
2337b725ae77Skettenis 
2338b725ae77Skettenis       return (TYPE_CODE (singleton_type) == TYPE_CODE_FLT
2339b725ae77Skettenis 	      || is_float_singleton (singleton_type));
2340b725ae77Skettenis     }
2341b725ae77Skettenis 
2342b725ae77Skettenis   return 0;
2343b725ae77Skettenis }
2344b725ae77Skettenis 
2345b725ae77Skettenis 
2346b725ae77Skettenis /* Return non-zero if TYPE is a struct-like type, zero otherwise.
2347b725ae77Skettenis    "Struct-like" types are those that should be passed as structs are:
2348b725ae77Skettenis    structs and unions.
2349b725ae77Skettenis 
2350b725ae77Skettenis    As an odd quirk, not mentioned in the ABI, GCC passes float and
2351b725ae77Skettenis    double singletons as if they were a plain float, double, etc.  (The
2352b725ae77Skettenis    corresponding union types are handled normally.)  So we exclude
2353b725ae77Skettenis    those types here.  *shrug* */
2354b725ae77Skettenis static int
is_struct_like(struct type * type)2355b725ae77Skettenis is_struct_like (struct type *type)
2356b725ae77Skettenis {
2357b725ae77Skettenis   enum type_code code = TYPE_CODE (type);
2358b725ae77Skettenis 
2359b725ae77Skettenis   return (code == TYPE_CODE_UNION
2360b725ae77Skettenis           || (code == TYPE_CODE_STRUCT && ! is_float_singleton (type)));
2361b725ae77Skettenis }
2362b725ae77Skettenis 
2363b725ae77Skettenis 
2364b725ae77Skettenis /* Return non-zero if TYPE is a float-like type, zero otherwise.
2365b725ae77Skettenis    "Float-like" types are those that should be passed as
2366b725ae77Skettenis    floating-point values are.
2367b725ae77Skettenis 
2368b725ae77Skettenis    You'd think this would just be floats, doubles, long doubles, etc.
2369b725ae77Skettenis    But as an odd quirk, not mentioned in the ABI, GCC passes float and
2370b725ae77Skettenis    double singletons as if they were a plain float, double, etc.  (The
2371b725ae77Skettenis    corresponding union types are handled normally.)  So we include
2372b725ae77Skettenis    those types here.  *shrug* */
2373b725ae77Skettenis static int
is_float_like(struct type * type)2374b725ae77Skettenis is_float_like (struct type *type)
2375b725ae77Skettenis {
2376b725ae77Skettenis   return (TYPE_CODE (type) == TYPE_CODE_FLT
2377b725ae77Skettenis           || is_float_singleton (type));
2378b725ae77Skettenis }
2379b725ae77Skettenis 
2380b725ae77Skettenis 
2381b725ae77Skettenis static int
is_power_of_two(unsigned int n)2382b725ae77Skettenis is_power_of_two (unsigned int n)
2383b725ae77Skettenis {
2384b725ae77Skettenis   return ((n & (n - 1)) == 0);
2385b725ae77Skettenis }
2386b725ae77Skettenis 
2387b725ae77Skettenis /* Return non-zero if TYPE should be passed as a pointer to a copy,
2388b725ae77Skettenis    zero otherwise.  */
2389b725ae77Skettenis static int
s390_function_arg_pass_by_reference(struct type * type)2390b725ae77Skettenis s390_function_arg_pass_by_reference (struct type *type)
2391b725ae77Skettenis {
2392b725ae77Skettenis   unsigned length = TYPE_LENGTH (type);
2393b725ae77Skettenis   if (length > 8)
2394b725ae77Skettenis     return 1;
2395b725ae77Skettenis 
2396b725ae77Skettenis   /* FIXME: All complex and vector types are also returned by reference.  */
2397b725ae77Skettenis   return is_struct_like (type) && !is_power_of_two (length);
2398b725ae77Skettenis }
2399b725ae77Skettenis 
2400b725ae77Skettenis /* Return non-zero if TYPE should be passed in a float register
2401b725ae77Skettenis    if possible.  */
2402b725ae77Skettenis static int
s390_function_arg_float(struct type * type)2403b725ae77Skettenis s390_function_arg_float (struct type *type)
2404b725ae77Skettenis {
2405b725ae77Skettenis   unsigned length = TYPE_LENGTH (type);
2406b725ae77Skettenis   if (length > 8)
2407b725ae77Skettenis     return 0;
2408b725ae77Skettenis 
2409b725ae77Skettenis   return is_float_like (type);
2410b725ae77Skettenis }
2411b725ae77Skettenis 
2412b725ae77Skettenis /* Return non-zero if TYPE should be passed in an integer register
2413b725ae77Skettenis    (or a pair of integer registers) if possible.  */
2414b725ae77Skettenis static int
s390_function_arg_integer(struct type * type)2415b725ae77Skettenis s390_function_arg_integer (struct type *type)
2416b725ae77Skettenis {
2417b725ae77Skettenis   unsigned length = TYPE_LENGTH (type);
2418b725ae77Skettenis   if (length > 8)
2419b725ae77Skettenis     return 0;
2420b725ae77Skettenis 
2421b725ae77Skettenis    return is_integer_like (type)
2422b725ae77Skettenis 	  || is_pointer_like (type)
2423b725ae77Skettenis 	  || (is_struct_like (type) && is_power_of_two (length));
2424b725ae77Skettenis }
2425b725ae77Skettenis 
2426b725ae77Skettenis /* Return ARG, a `SIMPLE_ARG', sign-extended or zero-extended to a full
2427b725ae77Skettenis    word as required for the ABI.  */
2428b725ae77Skettenis static LONGEST
extend_simple_arg(struct value * arg)2429b725ae77Skettenis extend_simple_arg (struct value *arg)
2430b725ae77Skettenis {
2431b725ae77Skettenis   struct type *type = VALUE_TYPE (arg);
2432b725ae77Skettenis 
2433b725ae77Skettenis   /* Even structs get passed in the least significant bits of the
2434b725ae77Skettenis      register / memory word.  It's not really right to extract them as
2435b725ae77Skettenis      an integer, but it does take care of the extension.  */
2436b725ae77Skettenis   if (TYPE_UNSIGNED (type))
2437b725ae77Skettenis     return extract_unsigned_integer (VALUE_CONTENTS (arg),
2438b725ae77Skettenis                                      TYPE_LENGTH (type));
2439b725ae77Skettenis   else
2440b725ae77Skettenis     return extract_signed_integer (VALUE_CONTENTS (arg),
2441b725ae77Skettenis                                    TYPE_LENGTH (type));
2442b725ae77Skettenis }
2443b725ae77Skettenis 
2444b725ae77Skettenis 
2445b725ae77Skettenis /* Return the alignment required by TYPE.  */
2446b725ae77Skettenis static int
alignment_of(struct type * type)2447b725ae77Skettenis alignment_of (struct type *type)
2448b725ae77Skettenis {
2449b725ae77Skettenis   int alignment;
2450b725ae77Skettenis 
2451b725ae77Skettenis   if (is_integer_like (type)
2452b725ae77Skettenis       || is_pointer_like (type)
2453b725ae77Skettenis       || TYPE_CODE (type) == TYPE_CODE_FLT)
2454b725ae77Skettenis     alignment = TYPE_LENGTH (type);
2455b725ae77Skettenis   else if (TYPE_CODE (type) == TYPE_CODE_STRUCT
2456b725ae77Skettenis            || TYPE_CODE (type) == TYPE_CODE_UNION)
2457b725ae77Skettenis     {
2458b725ae77Skettenis       int i;
2459b725ae77Skettenis 
2460b725ae77Skettenis       alignment = 1;
2461b725ae77Skettenis       for (i = 0; i < TYPE_NFIELDS (type); i++)
2462b725ae77Skettenis         {
2463b725ae77Skettenis           int field_alignment = alignment_of (TYPE_FIELD_TYPE (type, i));
2464b725ae77Skettenis 
2465b725ae77Skettenis           if (field_alignment > alignment)
2466b725ae77Skettenis             alignment = field_alignment;
2467b725ae77Skettenis         }
2468b725ae77Skettenis     }
2469b725ae77Skettenis   else
2470b725ae77Skettenis     alignment = 1;
2471b725ae77Skettenis 
2472b725ae77Skettenis   /* Check that everything we ever return is a power of two.  Lots of
2473b725ae77Skettenis      code doesn't want to deal with aligning things to arbitrary
2474b725ae77Skettenis      boundaries.  */
2475b725ae77Skettenis   gdb_assert ((alignment & (alignment - 1)) == 0);
2476b725ae77Skettenis 
2477b725ae77Skettenis   return alignment;
2478b725ae77Skettenis }
2479b725ae77Skettenis 
2480b725ae77Skettenis 
2481b725ae77Skettenis /* Put the actual parameter values pointed to by ARGS[0..NARGS-1] in
2482b725ae77Skettenis    place to be passed to a function, as specified by the "GNU/Linux
2483b725ae77Skettenis    for S/390 ELF Application Binary Interface Supplement".
2484b725ae77Skettenis 
2485b725ae77Skettenis    SP is the current stack pointer.  We must put arguments, links,
2486b725ae77Skettenis    padding, etc. whereever they belong, and return the new stack
2487b725ae77Skettenis    pointer value.
2488b725ae77Skettenis 
2489b725ae77Skettenis    If STRUCT_RETURN is non-zero, then the function we're calling is
2490b725ae77Skettenis    going to return a structure by value; STRUCT_ADDR is the address of
2491b725ae77Skettenis    a block we've allocated for it on the stack.
2492b725ae77Skettenis 
2493b725ae77Skettenis    Our caller has taken care of any type promotions needed to satisfy
2494b725ae77Skettenis    prototypes or the old K&R argument-passing rules.  */
2495b725ae77Skettenis static CORE_ADDR
s390_push_dummy_call(struct gdbarch * gdbarch,struct value * function,struct regcache * regcache,CORE_ADDR bp_addr,int nargs,struct value ** args,CORE_ADDR sp,int struct_return,CORE_ADDR struct_addr)2496*11efff7fSkettenis s390_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
2497b725ae77Skettenis 		      struct regcache *regcache, CORE_ADDR bp_addr,
2498b725ae77Skettenis 		      int nargs, struct value **args, CORE_ADDR sp,
2499b725ae77Skettenis 		      int struct_return, CORE_ADDR struct_addr)
2500b725ae77Skettenis {
2501b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2502b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2503b725ae77Skettenis   ULONGEST orig_sp;
2504b725ae77Skettenis   int i;
2505b725ae77Skettenis 
2506b725ae77Skettenis   /* If the i'th argument is passed as a reference to a copy, then
2507b725ae77Skettenis      copy_addr[i] is the address of the copy we made.  */
2508b725ae77Skettenis   CORE_ADDR *copy_addr = alloca (nargs * sizeof (CORE_ADDR));
2509b725ae77Skettenis 
2510b725ae77Skettenis   /* Build the reference-to-copy area.  */
2511b725ae77Skettenis   for (i = 0; i < nargs; i++)
2512b725ae77Skettenis     {
2513b725ae77Skettenis       struct value *arg = args[i];
2514b725ae77Skettenis       struct type *type = VALUE_TYPE (arg);
2515b725ae77Skettenis       unsigned length = TYPE_LENGTH (type);
2516b725ae77Skettenis 
2517b725ae77Skettenis       if (s390_function_arg_pass_by_reference (type))
2518b725ae77Skettenis         {
2519b725ae77Skettenis           sp -= length;
2520b725ae77Skettenis           sp = align_down (sp, alignment_of (type));
2521b725ae77Skettenis           write_memory (sp, VALUE_CONTENTS (arg), length);
2522b725ae77Skettenis           copy_addr[i] = sp;
2523b725ae77Skettenis         }
2524b725ae77Skettenis     }
2525b725ae77Skettenis 
2526b725ae77Skettenis   /* Reserve space for the parameter area.  As a conservative
2527b725ae77Skettenis      simplification, we assume that everything will be passed on the
2528b725ae77Skettenis      stack.  Since every argument larger than 8 bytes will be
2529b725ae77Skettenis      passed by reference, we use this simple upper bound.  */
2530b725ae77Skettenis   sp -= nargs * 8;
2531b725ae77Skettenis 
2532b725ae77Skettenis   /* After all that, make sure it's still aligned on an eight-byte
2533b725ae77Skettenis      boundary.  */
2534b725ae77Skettenis   sp = align_down (sp, 8);
2535b725ae77Skettenis 
2536b725ae77Skettenis   /* Finally, place the actual parameters, working from SP towards
2537b725ae77Skettenis      higher addresses.  The code above is supposed to reserve enough
2538b725ae77Skettenis      space for this.  */
2539b725ae77Skettenis   {
2540b725ae77Skettenis     int fr = 0;
2541b725ae77Skettenis     int gr = 2;
2542b725ae77Skettenis     CORE_ADDR starg = sp;
2543b725ae77Skettenis 
2544b725ae77Skettenis     /* A struct is returned using general register 2.  */
2545b725ae77Skettenis     if (struct_return)
2546b725ae77Skettenis       {
2547b725ae77Skettenis 	regcache_cooked_write_unsigned (regcache, S390_R0_REGNUM + gr,
2548b725ae77Skettenis 				        struct_addr);
2549b725ae77Skettenis 	gr++;
2550b725ae77Skettenis       }
2551b725ae77Skettenis 
2552b725ae77Skettenis     for (i = 0; i < nargs; i++)
2553b725ae77Skettenis       {
2554b725ae77Skettenis         struct value *arg = args[i];
2555b725ae77Skettenis         struct type *type = VALUE_TYPE (arg);
2556b725ae77Skettenis         unsigned length = TYPE_LENGTH (type);
2557b725ae77Skettenis 
2558b725ae77Skettenis 	if (s390_function_arg_pass_by_reference (type))
2559b725ae77Skettenis 	  {
2560b725ae77Skettenis 	    if (gr <= 6)
2561b725ae77Skettenis 	      {
2562b725ae77Skettenis 		regcache_cooked_write_unsigned (regcache, S390_R0_REGNUM + gr,
2563b725ae77Skettenis 					        copy_addr[i]);
2564b725ae77Skettenis 		gr++;
2565b725ae77Skettenis 	      }
2566b725ae77Skettenis 	    else
2567b725ae77Skettenis 	      {
2568b725ae77Skettenis 		write_memory_unsigned_integer (starg, word_size, copy_addr[i]);
2569b725ae77Skettenis 		starg += word_size;
2570b725ae77Skettenis 	      }
2571b725ae77Skettenis 	  }
2572b725ae77Skettenis 	else if (s390_function_arg_float (type))
2573b725ae77Skettenis 	  {
2574b725ae77Skettenis 	    /* The GNU/Linux for S/390 ABI uses FPRs 0 and 2 to pass arguments,
2575b725ae77Skettenis 	       the GNU/Linux for zSeries ABI uses 0, 2, 4, and 6.  */
2576b725ae77Skettenis 	    if (fr <= (tdep->abi == ABI_LINUX_S390 ? 2 : 6))
2577b725ae77Skettenis 	      {
2578b725ae77Skettenis 		/* When we store a single-precision value in an FP register,
2579b725ae77Skettenis 		   it occupies the leftmost bits.  */
2580b725ae77Skettenis 		regcache_cooked_write_part (regcache, S390_F0_REGNUM + fr,
2581b725ae77Skettenis 					    0, length, VALUE_CONTENTS (arg));
2582b725ae77Skettenis 		fr += 2;
2583b725ae77Skettenis 	      }
2584b725ae77Skettenis 	    else
2585b725ae77Skettenis 	      {
2586b725ae77Skettenis 		/* When we store a single-precision value in a stack slot,
2587b725ae77Skettenis 		   it occupies the rightmost bits.  */
2588b725ae77Skettenis 		starg = align_up (starg + length, word_size);
2589b725ae77Skettenis                 write_memory (starg - length, VALUE_CONTENTS (arg), length);
2590b725ae77Skettenis 	      }
2591b725ae77Skettenis 	  }
2592b725ae77Skettenis 	else if (s390_function_arg_integer (type) && length <= word_size)
2593b725ae77Skettenis 	  {
2594b725ae77Skettenis 	    if (gr <= 6)
2595b725ae77Skettenis 	      {
2596b725ae77Skettenis 		/* Integer arguments are always extended to word size.  */
2597b725ae77Skettenis 		regcache_cooked_write_signed (regcache, S390_R0_REGNUM + gr,
2598b725ae77Skettenis 					      extend_simple_arg (arg));
2599b725ae77Skettenis 		gr++;
2600b725ae77Skettenis 	      }
2601b725ae77Skettenis 	    else
2602b725ae77Skettenis 	      {
2603b725ae77Skettenis 		/* Integer arguments are always extended to word size.  */
2604b725ae77Skettenis 		write_memory_signed_integer (starg, word_size,
2605b725ae77Skettenis                                              extend_simple_arg (arg));
2606b725ae77Skettenis                 starg += word_size;
2607b725ae77Skettenis 	      }
2608b725ae77Skettenis 	  }
2609b725ae77Skettenis 	else if (s390_function_arg_integer (type) && length == 2*word_size)
2610b725ae77Skettenis 	  {
2611b725ae77Skettenis 	    if (gr <= 5)
2612b725ae77Skettenis 	      {
2613b725ae77Skettenis 		regcache_cooked_write (regcache, S390_R0_REGNUM + gr,
2614b725ae77Skettenis 				       VALUE_CONTENTS (arg));
2615b725ae77Skettenis 		regcache_cooked_write (regcache, S390_R0_REGNUM + gr + 1,
2616b725ae77Skettenis 				       VALUE_CONTENTS (arg) + word_size);
2617b725ae77Skettenis 		gr += 2;
2618b725ae77Skettenis 	      }
2619b725ae77Skettenis 	    else
2620b725ae77Skettenis 	      {
2621b725ae77Skettenis 		/* If we skipped r6 because we couldn't fit a DOUBLE_ARG
2622b725ae77Skettenis 		   in it, then don't go back and use it again later.  */
2623b725ae77Skettenis 		gr = 7;
2624b725ae77Skettenis 
2625b725ae77Skettenis 		write_memory (starg, VALUE_CONTENTS (arg), length);
2626b725ae77Skettenis 		starg += length;
2627b725ae77Skettenis 	      }
2628b725ae77Skettenis 	  }
2629b725ae77Skettenis 	else
2630b725ae77Skettenis 	  internal_error (__FILE__, __LINE__, "unknown argument type");
2631b725ae77Skettenis       }
2632b725ae77Skettenis   }
2633b725ae77Skettenis 
2634b725ae77Skettenis   /* Allocate the standard frame areas: the register save area, the
2635b725ae77Skettenis      word reserved for the compiler (which seems kind of meaningless),
2636b725ae77Skettenis      and the back chain pointer.  */
2637b725ae77Skettenis   sp -= 16*word_size + 32;
2638b725ae77Skettenis 
2639b725ae77Skettenis   /* Store return address.  */
2640b725ae77Skettenis   regcache_cooked_write_unsigned (regcache, S390_RETADDR_REGNUM, bp_addr);
2641b725ae77Skettenis 
2642b725ae77Skettenis   /* Store updated stack pointer.  */
2643b725ae77Skettenis   regcache_cooked_write_unsigned (regcache, S390_SP_REGNUM, sp);
2644b725ae77Skettenis 
2645b725ae77Skettenis   /* We need to return the 'stack part' of the frame ID,
2646*11efff7fSkettenis      which is actually the top of the register save area.  */
2647*11efff7fSkettenis   return sp + 16*word_size + 32;
2648b725ae77Skettenis }
2649b725ae77Skettenis 
2650b725ae77Skettenis /* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
2651b725ae77Skettenis    dummy frame.  The frame ID's base needs to match the TOS value
2652b725ae77Skettenis    returned by push_dummy_call, and the PC match the dummy frame's
2653b725ae77Skettenis    breakpoint.  */
2654b725ae77Skettenis static struct frame_id
s390_unwind_dummy_id(struct gdbarch * gdbarch,struct frame_info * next_frame)2655b725ae77Skettenis s390_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
2656b725ae77Skettenis {
2657b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2658*11efff7fSkettenis   CORE_ADDR sp = s390_unwind_sp (gdbarch, next_frame);
2659b725ae77Skettenis 
2660*11efff7fSkettenis   return frame_id_build (sp + 16*word_size + 32,
2661b725ae77Skettenis                          frame_pc_unwind (next_frame));
2662b725ae77Skettenis }
2663b725ae77Skettenis 
2664b725ae77Skettenis static CORE_ADDR
s390_frame_align(struct gdbarch * gdbarch,CORE_ADDR addr)2665b725ae77Skettenis s390_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
2666b725ae77Skettenis {
2667b725ae77Skettenis   /* Both the 32- and 64-bit ABI's say that the stack pointer should
2668b725ae77Skettenis      always be aligned on an eight-byte boundary.  */
2669b725ae77Skettenis   return (addr & -8);
2670b725ae77Skettenis }
2671b725ae77Skettenis 
2672b725ae77Skettenis 
2673b725ae77Skettenis /* Function return value access.  */
2674b725ae77Skettenis 
2675b725ae77Skettenis static enum return_value_convention
s390_return_value_convention(struct gdbarch * gdbarch,struct type * type)2676b725ae77Skettenis s390_return_value_convention (struct gdbarch *gdbarch, struct type *type)
2677b725ae77Skettenis {
2678b725ae77Skettenis   int length = TYPE_LENGTH (type);
2679b725ae77Skettenis   if (length > 8)
2680b725ae77Skettenis     return RETURN_VALUE_STRUCT_CONVENTION;
2681b725ae77Skettenis 
2682b725ae77Skettenis   switch (TYPE_CODE (type))
2683b725ae77Skettenis     {
2684b725ae77Skettenis     case TYPE_CODE_STRUCT:
2685b725ae77Skettenis     case TYPE_CODE_UNION:
2686b725ae77Skettenis     case TYPE_CODE_ARRAY:
2687b725ae77Skettenis       return RETURN_VALUE_STRUCT_CONVENTION;
2688b725ae77Skettenis 
2689b725ae77Skettenis     default:
2690b725ae77Skettenis       return RETURN_VALUE_REGISTER_CONVENTION;
2691b725ae77Skettenis     }
2692b725ae77Skettenis }
2693b725ae77Skettenis 
2694b725ae77Skettenis static enum return_value_convention
s390_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,void * out,const void * in)2695b725ae77Skettenis s390_return_value (struct gdbarch *gdbarch, struct type *type,
2696b725ae77Skettenis 		   struct regcache *regcache, void *out, const void *in)
2697b725ae77Skettenis {
2698b725ae77Skettenis   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
2699b725ae77Skettenis   int length = TYPE_LENGTH (type);
2700b725ae77Skettenis   enum return_value_convention rvc =
2701b725ae77Skettenis 			s390_return_value_convention (gdbarch, type);
2702b725ae77Skettenis   if (in)
2703b725ae77Skettenis     {
2704b725ae77Skettenis       switch (rvc)
2705b725ae77Skettenis 	{
2706b725ae77Skettenis 	case RETURN_VALUE_REGISTER_CONVENTION:
2707b725ae77Skettenis 	  if (TYPE_CODE (type) == TYPE_CODE_FLT)
2708b725ae77Skettenis 	    {
2709b725ae77Skettenis 	      /* When we store a single-precision value in an FP register,
2710b725ae77Skettenis 		 it occupies the leftmost bits.  */
2711b725ae77Skettenis 	      regcache_cooked_write_part (regcache, S390_F0_REGNUM,
2712b725ae77Skettenis 					  0, length, in);
2713b725ae77Skettenis 	    }
2714b725ae77Skettenis 	  else if (length <= word_size)
2715b725ae77Skettenis 	    {
2716b725ae77Skettenis 	      /* Integer arguments are always extended to word size.  */
2717b725ae77Skettenis 	      if (TYPE_UNSIGNED (type))
2718b725ae77Skettenis 		regcache_cooked_write_unsigned (regcache, S390_R2_REGNUM,
2719b725ae77Skettenis 			extract_unsigned_integer (in, length));
2720b725ae77Skettenis 	      else
2721b725ae77Skettenis 		regcache_cooked_write_signed (regcache, S390_R2_REGNUM,
2722b725ae77Skettenis 			extract_signed_integer (in, length));
2723b725ae77Skettenis 	    }
2724b725ae77Skettenis 	  else if (length == 2*word_size)
2725b725ae77Skettenis 	    {
2726b725ae77Skettenis 	      regcache_cooked_write (regcache, S390_R2_REGNUM, in);
2727b725ae77Skettenis 	      regcache_cooked_write (regcache, S390_R3_REGNUM,
2728b725ae77Skettenis 				     (const char *)in + word_size);
2729b725ae77Skettenis 	    }
2730b725ae77Skettenis 	  else
2731b725ae77Skettenis 	    internal_error (__FILE__, __LINE__, "invalid return type");
2732b725ae77Skettenis 	  break;
2733b725ae77Skettenis 
2734b725ae77Skettenis 	case RETURN_VALUE_STRUCT_CONVENTION:
2735b725ae77Skettenis 	  error ("Cannot set function return value.");
2736b725ae77Skettenis 	  break;
2737b725ae77Skettenis 	}
2738b725ae77Skettenis     }
2739b725ae77Skettenis   else if (out)
2740b725ae77Skettenis     {
2741b725ae77Skettenis       switch (rvc)
2742b725ae77Skettenis 	{
2743b725ae77Skettenis 	case RETURN_VALUE_REGISTER_CONVENTION:
2744b725ae77Skettenis 	  if (TYPE_CODE (type) == TYPE_CODE_FLT)
2745b725ae77Skettenis 	    {
2746b725ae77Skettenis 	      /* When we store a single-precision value in an FP register,
2747b725ae77Skettenis 		 it occupies the leftmost bits.  */
2748b725ae77Skettenis 	      regcache_cooked_read_part (regcache, S390_F0_REGNUM,
2749b725ae77Skettenis 					 0, length, out);
2750b725ae77Skettenis 	    }
2751b725ae77Skettenis 	  else if (length <= word_size)
2752b725ae77Skettenis 	    {
2753b725ae77Skettenis 	      /* Integer arguments occupy the rightmost bits.  */
2754b725ae77Skettenis 	      regcache_cooked_read_part (regcache, S390_R2_REGNUM,
2755b725ae77Skettenis 					 word_size - length, length, out);
2756b725ae77Skettenis 	    }
2757b725ae77Skettenis 	  else if (length == 2*word_size)
2758b725ae77Skettenis 	    {
2759b725ae77Skettenis 	      regcache_cooked_read (regcache, S390_R2_REGNUM, out);
2760b725ae77Skettenis 	      regcache_cooked_read (regcache, S390_R3_REGNUM,
2761b725ae77Skettenis 				    (char *)out + word_size);
2762b725ae77Skettenis 	    }
2763b725ae77Skettenis 	  else
2764b725ae77Skettenis 	    internal_error (__FILE__, __LINE__, "invalid return type");
2765b725ae77Skettenis 	  break;
2766b725ae77Skettenis 
2767b725ae77Skettenis 	case RETURN_VALUE_STRUCT_CONVENTION:
2768b725ae77Skettenis 	  error ("Function return value unknown.");
2769b725ae77Skettenis 	  break;
2770b725ae77Skettenis 	}
2771b725ae77Skettenis     }
2772b725ae77Skettenis 
2773b725ae77Skettenis   return rvc;
2774b725ae77Skettenis }
2775b725ae77Skettenis 
2776b725ae77Skettenis 
2777b725ae77Skettenis /* Breakpoints.  */
2778b725ae77Skettenis 
2779b725ae77Skettenis static const unsigned char *
s390_breakpoint_from_pc(CORE_ADDR * pcptr,int * lenptr)2780b725ae77Skettenis s390_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
2781b725ae77Skettenis {
2782b725ae77Skettenis   static unsigned char breakpoint[] = { 0x0, 0x1 };
2783b725ae77Skettenis 
2784b725ae77Skettenis   *lenptr = sizeof (breakpoint);
2785b725ae77Skettenis   return breakpoint;
2786b725ae77Skettenis }
2787b725ae77Skettenis 
2788b725ae77Skettenis 
2789b725ae77Skettenis /* Address handling.  */
2790b725ae77Skettenis 
2791b725ae77Skettenis static CORE_ADDR
s390_addr_bits_remove(CORE_ADDR addr)2792b725ae77Skettenis s390_addr_bits_remove (CORE_ADDR addr)
2793b725ae77Skettenis {
2794b725ae77Skettenis   return addr & 0x7fffffff;
2795b725ae77Skettenis }
2796b725ae77Skettenis 
2797b725ae77Skettenis static int
s390_address_class_type_flags(int byte_size,int dwarf2_addr_class)2798b725ae77Skettenis s390_address_class_type_flags (int byte_size, int dwarf2_addr_class)
2799b725ae77Skettenis {
2800b725ae77Skettenis   if (byte_size == 4)
2801b725ae77Skettenis     return TYPE_FLAG_ADDRESS_CLASS_1;
2802b725ae77Skettenis   else
2803b725ae77Skettenis     return 0;
2804b725ae77Skettenis }
2805b725ae77Skettenis 
2806b725ae77Skettenis static const char *
s390_address_class_type_flags_to_name(struct gdbarch * gdbarch,int type_flags)2807b725ae77Skettenis s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
2808b725ae77Skettenis {
2809b725ae77Skettenis   if (type_flags & TYPE_FLAG_ADDRESS_CLASS_1)
2810b725ae77Skettenis     return "mode32";
2811b725ae77Skettenis   else
2812b725ae77Skettenis     return NULL;
2813b725ae77Skettenis }
2814b725ae77Skettenis 
2815b725ae77Skettenis static int
s390_address_class_name_to_type_flags(struct gdbarch * gdbarch,const char * name,int * type_flags_ptr)2816b725ae77Skettenis s390_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name,
2817b725ae77Skettenis 				       int *type_flags_ptr)
2818b725ae77Skettenis {
2819b725ae77Skettenis   if (strcmp (name, "mode32") == 0)
2820b725ae77Skettenis     {
2821b725ae77Skettenis       *type_flags_ptr = TYPE_FLAG_ADDRESS_CLASS_1;
2822b725ae77Skettenis       return 1;
2823b725ae77Skettenis     }
2824b725ae77Skettenis   else
2825b725ae77Skettenis     return 0;
2826b725ae77Skettenis }
2827b725ae77Skettenis 
2828b725ae77Skettenis 
2829b725ae77Skettenis /* Link map offsets.  */
2830b725ae77Skettenis 
2831b725ae77Skettenis static struct link_map_offsets *
s390_svr4_fetch_link_map_offsets(void)2832b725ae77Skettenis s390_svr4_fetch_link_map_offsets (void)
2833b725ae77Skettenis {
2834b725ae77Skettenis   static struct link_map_offsets lmo;
2835b725ae77Skettenis   static struct link_map_offsets *lmp = NULL;
2836b725ae77Skettenis 
2837b725ae77Skettenis   if (lmp == NULL)
2838b725ae77Skettenis     {
2839b725ae77Skettenis       lmp = &lmo;
2840b725ae77Skettenis 
2841b725ae77Skettenis       lmo.r_debug_size = 8;
2842b725ae77Skettenis 
2843b725ae77Skettenis       lmo.r_map_offset = 4;
2844b725ae77Skettenis       lmo.r_map_size   = 4;
2845b725ae77Skettenis 
2846b725ae77Skettenis       lmo.link_map_size = 20;
2847b725ae77Skettenis 
2848b725ae77Skettenis       lmo.l_addr_offset = 0;
2849b725ae77Skettenis       lmo.l_addr_size   = 4;
2850b725ae77Skettenis 
2851b725ae77Skettenis       lmo.l_name_offset = 4;
2852b725ae77Skettenis       lmo.l_name_size   = 4;
2853b725ae77Skettenis 
2854b725ae77Skettenis       lmo.l_next_offset = 12;
2855b725ae77Skettenis       lmo.l_next_size   = 4;
2856b725ae77Skettenis 
2857b725ae77Skettenis       lmo.l_prev_offset = 16;
2858b725ae77Skettenis       lmo.l_prev_size   = 4;
2859b725ae77Skettenis     }
2860b725ae77Skettenis 
2861b725ae77Skettenis   return lmp;
2862b725ae77Skettenis }
2863b725ae77Skettenis 
2864b725ae77Skettenis static struct link_map_offsets *
s390x_svr4_fetch_link_map_offsets(void)2865b725ae77Skettenis s390x_svr4_fetch_link_map_offsets (void)
2866b725ae77Skettenis {
2867b725ae77Skettenis   static struct link_map_offsets lmo;
2868b725ae77Skettenis   static struct link_map_offsets *lmp = NULL;
2869b725ae77Skettenis 
2870b725ae77Skettenis   if (lmp == NULL)
2871b725ae77Skettenis     {
2872b725ae77Skettenis       lmp = &lmo;
2873b725ae77Skettenis 
2874b725ae77Skettenis       lmo.r_debug_size = 16;   /* All we need.  */
2875b725ae77Skettenis 
2876b725ae77Skettenis       lmo.r_map_offset = 8;
2877b725ae77Skettenis       lmo.r_map_size   = 8;
2878b725ae77Skettenis 
2879b725ae77Skettenis       lmo.link_map_size = 40;   /* All we need.  */
2880b725ae77Skettenis 
2881b725ae77Skettenis       lmo.l_addr_offset = 0;
2882b725ae77Skettenis       lmo.l_addr_size   = 8;
2883b725ae77Skettenis 
2884b725ae77Skettenis       lmo.l_name_offset = 8;
2885b725ae77Skettenis       lmo.l_name_size   = 8;
2886b725ae77Skettenis 
2887b725ae77Skettenis       lmo.l_next_offset = 24;
2888b725ae77Skettenis       lmo.l_next_size   = 8;
2889b725ae77Skettenis 
2890b725ae77Skettenis       lmo.l_prev_offset = 32;
2891b725ae77Skettenis       lmo.l_prev_size   = 8;
2892b725ae77Skettenis     }
2893b725ae77Skettenis 
2894b725ae77Skettenis   return lmp;
2895b725ae77Skettenis }
2896b725ae77Skettenis 
2897b725ae77Skettenis 
2898b725ae77Skettenis /* Set up gdbarch struct.  */
2899b725ae77Skettenis 
2900b725ae77Skettenis static struct gdbarch *
s390_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)2901b725ae77Skettenis s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2902b725ae77Skettenis {
2903b725ae77Skettenis   struct gdbarch *gdbarch;
2904b725ae77Skettenis   struct gdbarch_tdep *tdep;
2905b725ae77Skettenis 
2906b725ae77Skettenis   /* First see if there is already a gdbarch that can satisfy the request.  */
2907b725ae77Skettenis   arches = gdbarch_list_lookup_by_info (arches, &info);
2908b725ae77Skettenis   if (arches != NULL)
2909b725ae77Skettenis     return arches->gdbarch;
2910b725ae77Skettenis 
2911b725ae77Skettenis   /* None found: is the request for a s390 architecture? */
2912b725ae77Skettenis   if (info.bfd_arch_info->arch != bfd_arch_s390)
2913b725ae77Skettenis     return NULL;		/* No; then it's not for us.  */
2914b725ae77Skettenis 
2915b725ae77Skettenis   /* Yes: create a new gdbarch for the specified machine type.  */
2916b725ae77Skettenis   tdep = XCALLOC (1, struct gdbarch_tdep);
2917b725ae77Skettenis   gdbarch = gdbarch_alloc (&info, tdep);
2918b725ae77Skettenis 
2919b725ae77Skettenis   set_gdbarch_believe_pcc_promotion (gdbarch, 0);
2920b725ae77Skettenis   set_gdbarch_char_signed (gdbarch, 0);
2921b725ae77Skettenis 
2922b725ae77Skettenis   /* Amount PC must be decremented by after a breakpoint.  This is
2923b725ae77Skettenis      often the number of bytes returned by BREAKPOINT_FROM_PC but not
2924b725ae77Skettenis      always.  */
2925b725ae77Skettenis   set_gdbarch_decr_pc_after_break (gdbarch, 2);
2926b725ae77Skettenis   /* Stack grows downward.  */
2927b725ae77Skettenis   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2928b725ae77Skettenis   set_gdbarch_breakpoint_from_pc (gdbarch, s390_breakpoint_from_pc);
2929b725ae77Skettenis   set_gdbarch_skip_prologue (gdbarch, s390_skip_prologue);
2930b725ae77Skettenis   set_gdbarch_in_function_epilogue_p (gdbarch, s390_in_function_epilogue_p);
2931b725ae77Skettenis 
2932b725ae77Skettenis   set_gdbarch_pc_regnum (gdbarch, S390_PC_REGNUM);
2933b725ae77Skettenis   set_gdbarch_sp_regnum (gdbarch, S390_SP_REGNUM);
2934b725ae77Skettenis   set_gdbarch_fp0_regnum (gdbarch, S390_F0_REGNUM);
2935b725ae77Skettenis   set_gdbarch_num_regs (gdbarch, S390_NUM_REGS);
2936b725ae77Skettenis   set_gdbarch_num_pseudo_regs (gdbarch, S390_NUM_PSEUDO_REGS);
2937b725ae77Skettenis   set_gdbarch_register_name (gdbarch, s390_register_name);
2938b725ae77Skettenis   set_gdbarch_register_type (gdbarch, s390_register_type);
2939b725ae77Skettenis   set_gdbarch_stab_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum);
2940b725ae77Skettenis   set_gdbarch_dwarf_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum);
2941b725ae77Skettenis   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum);
2942b725ae77Skettenis   set_gdbarch_convert_register_p (gdbarch, s390_convert_register_p);
2943b725ae77Skettenis   set_gdbarch_register_to_value (gdbarch, s390_register_to_value);
2944b725ae77Skettenis   set_gdbarch_value_to_register (gdbarch, s390_value_to_register);
2945b725ae77Skettenis   set_gdbarch_register_reggroup_p (gdbarch, s390_register_reggroup_p);
2946b725ae77Skettenis   set_gdbarch_regset_from_core_section (gdbarch,
2947b725ae77Skettenis                                         s390_regset_from_core_section);
2948b725ae77Skettenis 
2949b725ae77Skettenis   /* Inferior function calls.  */
2950b725ae77Skettenis   set_gdbarch_push_dummy_call (gdbarch, s390_push_dummy_call);
2951b725ae77Skettenis   set_gdbarch_unwind_dummy_id (gdbarch, s390_unwind_dummy_id);
2952b725ae77Skettenis   set_gdbarch_frame_align (gdbarch, s390_frame_align);
2953b725ae77Skettenis   set_gdbarch_return_value (gdbarch, s390_return_value);
2954b725ae77Skettenis 
2955b725ae77Skettenis   /* Frame handling.  */
2956b725ae77Skettenis   set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
2957b725ae77Skettenis   dwarf2_frame_set_init_reg (gdbarch, s390_dwarf2_frame_init_reg);
2958b725ae77Skettenis   frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
2959b725ae77Skettenis   frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
2960b725ae77Skettenis   frame_unwind_append_sniffer (gdbarch, s390_stub_frame_sniffer);
2961b725ae77Skettenis   frame_unwind_append_sniffer (gdbarch, s390_sigtramp_frame_sniffer);
2962b725ae77Skettenis   frame_unwind_append_sniffer (gdbarch, s390_frame_sniffer);
2963b725ae77Skettenis   frame_base_set_default (gdbarch, &s390_frame_base);
2964b725ae77Skettenis   set_gdbarch_unwind_pc (gdbarch, s390_unwind_pc);
2965b725ae77Skettenis   set_gdbarch_unwind_sp (gdbarch, s390_unwind_sp);
2966b725ae77Skettenis 
2967b725ae77Skettenis   switch (info.bfd_arch_info->mach)
2968b725ae77Skettenis     {
2969b725ae77Skettenis     case bfd_mach_s390_31:
2970b725ae77Skettenis       tdep->abi = ABI_LINUX_S390;
2971b725ae77Skettenis 
2972b725ae77Skettenis       tdep->gregset = &s390_gregset;
2973b725ae77Skettenis       tdep->sizeof_gregset = s390_sizeof_gregset;
2974b725ae77Skettenis       tdep->fpregset = &s390_fpregset;
2975b725ae77Skettenis       tdep->sizeof_fpregset = s390_sizeof_fpregset;
2976b725ae77Skettenis 
2977b725ae77Skettenis       set_gdbarch_addr_bits_remove (gdbarch, s390_addr_bits_remove);
2978b725ae77Skettenis       set_gdbarch_pseudo_register_read (gdbarch, s390_pseudo_register_read);
2979b725ae77Skettenis       set_gdbarch_pseudo_register_write (gdbarch, s390_pseudo_register_write);
2980b725ae77Skettenis       set_solib_svr4_fetch_link_map_offsets (gdbarch,
2981b725ae77Skettenis 					     s390_svr4_fetch_link_map_offsets);
2982b725ae77Skettenis 
2983b725ae77Skettenis       break;
2984b725ae77Skettenis     case bfd_mach_s390_64:
2985b725ae77Skettenis       tdep->abi = ABI_LINUX_ZSERIES;
2986b725ae77Skettenis 
2987b725ae77Skettenis       tdep->gregset = &s390x_gregset;
2988b725ae77Skettenis       tdep->sizeof_gregset = s390x_sizeof_gregset;
2989b725ae77Skettenis       tdep->fpregset = &s390_fpregset;
2990b725ae77Skettenis       tdep->sizeof_fpregset = s390_sizeof_fpregset;
2991b725ae77Skettenis 
2992b725ae77Skettenis       set_gdbarch_long_bit (gdbarch, 64);
2993b725ae77Skettenis       set_gdbarch_long_long_bit (gdbarch, 64);
2994b725ae77Skettenis       set_gdbarch_ptr_bit (gdbarch, 64);
2995b725ae77Skettenis       set_gdbarch_pseudo_register_read (gdbarch, s390x_pseudo_register_read);
2996b725ae77Skettenis       set_gdbarch_pseudo_register_write (gdbarch, s390x_pseudo_register_write);
2997b725ae77Skettenis       set_solib_svr4_fetch_link_map_offsets (gdbarch,
2998b725ae77Skettenis 					     s390x_svr4_fetch_link_map_offsets);
2999b725ae77Skettenis       set_gdbarch_address_class_type_flags (gdbarch,
3000b725ae77Skettenis                                             s390_address_class_type_flags);
3001b725ae77Skettenis       set_gdbarch_address_class_type_flags_to_name (gdbarch,
3002b725ae77Skettenis                                                     s390_address_class_type_flags_to_name);
3003b725ae77Skettenis       set_gdbarch_address_class_name_to_type_flags (gdbarch,
3004b725ae77Skettenis                                                     s390_address_class_name_to_type_flags);
3005b725ae77Skettenis       break;
3006b725ae77Skettenis     }
3007b725ae77Skettenis 
3008b725ae77Skettenis   set_gdbarch_print_insn (gdbarch, print_insn_s390);
3009b725ae77Skettenis 
3010b725ae77Skettenis   return gdbarch;
3011b725ae77Skettenis }
3012b725ae77Skettenis 
3013b725ae77Skettenis 
3014b725ae77Skettenis 
3015b725ae77Skettenis extern initialize_file_ftype _initialize_s390_tdep; /* -Wmissing-prototypes */
3016b725ae77Skettenis 
3017b725ae77Skettenis void
_initialize_s390_tdep(void)3018b725ae77Skettenis _initialize_s390_tdep (void)
3019b725ae77Skettenis {
3020b725ae77Skettenis 
3021b725ae77Skettenis   /* Hook us into the gdbarch mechanism.  */
3022b725ae77Skettenis   register_gdbarch_init (bfd_arch_s390, s390_gdbarch_init);
3023b725ae77Skettenis }
3024