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 (¤t_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