1e93f7393Sniklas /* Target-dependent code for GDB, the GNU debugger.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
4b725ae77Skettenis 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
5b725ae77Skettenis Foundation, Inc.
6e93f7393Sniklas
7e93f7393Sniklas This file is part of GDB.
8e93f7393Sniklas
9e93f7393Sniklas This program is free software; you can redistribute it and/or modify
10e93f7393Sniklas it under the terms of the GNU General Public License as published by
11e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
12e93f7393Sniklas (at your option) any later version.
13e93f7393Sniklas
14e93f7393Sniklas This program is distributed in the hope that it will be useful,
15e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
16e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17e93f7393Sniklas GNU General Public License for more details.
18e93f7393Sniklas
19e93f7393Sniklas You should have received a copy of the GNU General Public License
20e93f7393Sniklas along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis Boston, MA 02111-1307, USA. */
23e93f7393Sniklas
24e93f7393Sniklas #include "defs.h"
25e93f7393Sniklas #include "frame.h"
26e93f7393Sniklas #include "inferior.h"
27e93f7393Sniklas #include "symtab.h"
28e93f7393Sniklas #include "target.h"
29e93f7393Sniklas #include "gdbcore.h"
30b725ae77Skettenis #include "gdbcmd.h"
31e93f7393Sniklas #include "objfiles.h"
32b725ae77Skettenis #include "arch-utils.h"
33b725ae77Skettenis #include "regcache.h"
34*63addd46Skettenis #include "regset.h"
35b725ae77Skettenis #include "doublest.h"
36b725ae77Skettenis #include "value.h"
37b725ae77Skettenis #include "parser-defs.h"
38b725ae77Skettenis #include "osabi.h"
39*63addd46Skettenis #include "infcall.h"
40*63addd46Skettenis #include "sim-regno.h"
41*63addd46Skettenis #include "gdb/sim-ppc.h"
42*63addd46Skettenis #include "reggroups.h"
43e93f7393Sniklas
44b725ae77Skettenis #include "libbfd.h" /* for bfd_default_set_arch_mach */
45b725ae77Skettenis #include "coff/internal.h" /* for libcoff.h */
46b725ae77Skettenis #include "libcoff.h" /* for xcoff_data */
47b725ae77Skettenis #include "coff/xcoff.h"
48b725ae77Skettenis #include "libxcoff.h"
49e93f7393Sniklas
50b725ae77Skettenis #include "elf-bfd.h"
51e93f7393Sniklas
52b725ae77Skettenis #include "solib-svr4.h"
53b725ae77Skettenis #include "ppc-tdep.h"
54b725ae77Skettenis
55b725ae77Skettenis #include "gdb_assert.h"
56b725ae77Skettenis #include "dis-asm.h"
57b725ae77Skettenis
58*63addd46Skettenis #include "trad-frame.h"
59*63addd46Skettenis #include "frame-unwind.h"
60*63addd46Skettenis #include "frame-base.h"
61*63addd46Skettenis
62b725ae77Skettenis /* If the kernel has to deliver a signal, it pushes a sigcontext
63b725ae77Skettenis structure on the stack and then calls the signal handler, passing
64b725ae77Skettenis the address of the sigcontext in an argument register. Usually
65b725ae77Skettenis the signal handler doesn't save this register, so we have to
66b725ae77Skettenis access the sigcontext structure via an offset from the signal handler
67b725ae77Skettenis frame.
68b725ae77Skettenis The following constants were determined by experimentation on AIX 3.2. */
69b725ae77Skettenis #define SIG_FRAME_PC_OFFSET 96
70b725ae77Skettenis #define SIG_FRAME_LR_OFFSET 108
71b725ae77Skettenis #define SIG_FRAME_FP_OFFSET 284
72b725ae77Skettenis
73b725ae77Skettenis /* To be used by skip_prologue. */
74b725ae77Skettenis
75b725ae77Skettenis struct rs6000_framedata
76b725ae77Skettenis {
77b725ae77Skettenis int offset; /* total size of frame --- the distance
78b725ae77Skettenis by which we decrement sp to allocate
79b725ae77Skettenis the frame */
80b725ae77Skettenis int saved_gpr; /* smallest # of saved gpr */
81b725ae77Skettenis int saved_fpr; /* smallest # of saved fpr */
82b725ae77Skettenis int saved_vr; /* smallest # of saved vr */
83b725ae77Skettenis int saved_ev; /* smallest # of saved ev */
84b725ae77Skettenis int alloca_reg; /* alloca register number (frame ptr) */
85b725ae77Skettenis char frameless; /* true if frameless functions. */
86b725ae77Skettenis char nosavedpc; /* true if pc not saved. */
87b725ae77Skettenis int gpr_offset; /* offset of saved gprs from prev sp */
88b725ae77Skettenis int fpr_offset; /* offset of saved fprs from prev sp */
89b725ae77Skettenis int vr_offset; /* offset of saved vrs from prev sp */
90b725ae77Skettenis int ev_offset; /* offset of saved evs from prev sp */
91b725ae77Skettenis int lr_offset; /* offset of saved lr */
92b725ae77Skettenis int cr_offset; /* offset of saved cr */
93b725ae77Skettenis int vrsave_offset; /* offset of saved vrsave register */
94b725ae77Skettenis };
95b725ae77Skettenis
96b725ae77Skettenis /* Description of a single register. */
97b725ae77Skettenis
98b725ae77Skettenis struct reg
99b725ae77Skettenis {
100b725ae77Skettenis char *name; /* name of register */
101b725ae77Skettenis unsigned char sz32; /* size on 32-bit arch, 0 if nonextant */
102b725ae77Skettenis unsigned char sz64; /* size on 64-bit arch, 0 if nonextant */
103b725ae77Skettenis unsigned char fpr; /* whether register is floating-point */
104b725ae77Skettenis unsigned char pseudo; /* whether register is pseudo */
105*63addd46Skettenis int spr_num; /* PowerPC SPR number, or -1 if not an SPR.
106*63addd46Skettenis This is an ISA SPR number, not a GDB
107*63addd46Skettenis register number. */
108b725ae77Skettenis };
109e93f7393Sniklas
110e93f7393Sniklas /* Breakpoint shadows for the single step instructions will be kept here. */
111e93f7393Sniklas
112b725ae77Skettenis static struct sstep_breaks
113b725ae77Skettenis {
114e93f7393Sniklas /* Address, or 0 if this is not in use. */
115e93f7393Sniklas CORE_ADDR address;
116e93f7393Sniklas /* Shadow contents. */
117e93f7393Sniklas char data[4];
118b725ae77Skettenis }
119b725ae77Skettenis stepBreaks[2];
120b725ae77Skettenis
121b725ae77Skettenis /* Hook for determining the TOC address when calling functions in the
122b725ae77Skettenis inferior under AIX. The initialization code in rs6000-nat.c sets
123b725ae77Skettenis this hook to point to find_toc_address. */
124b725ae77Skettenis
125b725ae77Skettenis CORE_ADDR (*rs6000_find_toc_address_hook) (CORE_ADDR) = NULL;
126b725ae77Skettenis
127b725ae77Skettenis /* Hook to set the current architecture when starting a child process.
128b725ae77Skettenis rs6000-nat.c sets this. */
129b725ae77Skettenis
130b725ae77Skettenis void (*rs6000_set_host_arch_hook) (int) = NULL;
131e93f7393Sniklas
132e93f7393Sniklas /* Static function prototypes */
133e93f7393Sniklas
134b725ae77Skettenis static CORE_ADDR branch_dest (int opcode, int instr, CORE_ADDR pc,
135b725ae77Skettenis CORE_ADDR safety);
136b725ae77Skettenis static CORE_ADDR skip_prologue (CORE_ADDR, CORE_ADDR,
137b725ae77Skettenis struct rs6000_framedata *);
138e93f7393Sniklas
139b725ae77Skettenis /* Is REGNO an AltiVec register? Return 1 if so, 0 otherwise. */
140b725ae77Skettenis int
altivec_register_p(int regno)141b725ae77Skettenis altivec_register_p (int regno)
142b725ae77Skettenis {
143b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
144b725ae77Skettenis if (tdep->ppc_vr0_regnum < 0 || tdep->ppc_vrsave_regnum < 0)
145b725ae77Skettenis return 0;
146b725ae77Skettenis else
147b725ae77Skettenis return (regno >= tdep->ppc_vr0_regnum && regno <= tdep->ppc_vrsave_regnum);
148b725ae77Skettenis }
149e93f7393Sniklas
150*63addd46Skettenis
151*63addd46Skettenis /* Return true if REGNO is an SPE register, false otherwise. */
152*63addd46Skettenis int
spe_register_p(int regno)153*63addd46Skettenis spe_register_p (int regno)
154*63addd46Skettenis {
155*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
156*63addd46Skettenis
157*63addd46Skettenis /* Is it a reference to EV0 -- EV31, and do we have those? */
158*63addd46Skettenis if (tdep->ppc_ev0_regnum >= 0
159*63addd46Skettenis && tdep->ppc_ev31_regnum >= 0
160*63addd46Skettenis && tdep->ppc_ev0_regnum <= regno && regno <= tdep->ppc_ev31_regnum)
161*63addd46Skettenis return 1;
162*63addd46Skettenis
163*63addd46Skettenis /* Is it a reference to one of the raw upper GPR halves? */
164*63addd46Skettenis if (tdep->ppc_ev0_upper_regnum >= 0
165*63addd46Skettenis && tdep->ppc_ev0_upper_regnum <= regno
166*63addd46Skettenis && regno < tdep->ppc_ev0_upper_regnum + ppc_num_gprs)
167*63addd46Skettenis return 1;
168*63addd46Skettenis
169*63addd46Skettenis /* Is it a reference to the 64-bit accumulator, and do we have that? */
170*63addd46Skettenis if (tdep->ppc_acc_regnum >= 0
171*63addd46Skettenis && tdep->ppc_acc_regnum == regno)
172*63addd46Skettenis return 1;
173*63addd46Skettenis
174*63addd46Skettenis /* Is it a reference to the SPE floating-point status and control register,
175*63addd46Skettenis and do we have that? */
176*63addd46Skettenis if (tdep->ppc_spefscr_regnum >= 0
177*63addd46Skettenis && tdep->ppc_spefscr_regnum == regno)
178*63addd46Skettenis return 1;
179*63addd46Skettenis
180*63addd46Skettenis return 0;
181*63addd46Skettenis }
182*63addd46Skettenis
183*63addd46Skettenis
184*63addd46Skettenis /* Return non-zero if the architecture described by GDBARCH has
185*63addd46Skettenis floating-point registers (f0 --- f31 and fpscr). */
186b725ae77Skettenis int
ppc_floating_point_unit_p(struct gdbarch * gdbarch)187b725ae77Skettenis ppc_floating_point_unit_p (struct gdbarch *gdbarch)
188b725ae77Skettenis {
189*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
190*63addd46Skettenis
191*63addd46Skettenis return (tdep->ppc_fp0_regnum >= 0
192*63addd46Skettenis && tdep->ppc_fpscr_regnum >= 0);
193b725ae77Skettenis }
194e93f7393Sniklas
195*63addd46Skettenis
196*63addd46Skettenis /* Check that TABLE[GDB_REGNO] is not already initialized, and then
197*63addd46Skettenis set it to SIM_REGNO.
198*63addd46Skettenis
199*63addd46Skettenis This is a helper function for init_sim_regno_table, constructing
200*63addd46Skettenis the table mapping GDB register numbers to sim register numbers; we
201*63addd46Skettenis initialize every element in that table to -1 before we start
202*63addd46Skettenis filling it in. */
203*63addd46Skettenis static void
set_sim_regno(int * table,int gdb_regno,int sim_regno)204*63addd46Skettenis set_sim_regno (int *table, int gdb_regno, int sim_regno)
205*63addd46Skettenis {
206*63addd46Skettenis /* Make sure we don't try to assign any given GDB register a sim
207*63addd46Skettenis register number more than once. */
208*63addd46Skettenis gdb_assert (table[gdb_regno] == -1);
209*63addd46Skettenis table[gdb_regno] = sim_regno;
210*63addd46Skettenis }
211*63addd46Skettenis
212*63addd46Skettenis
213*63addd46Skettenis /* Initialize ARCH->tdep->sim_regno, the table mapping GDB register
214*63addd46Skettenis numbers to simulator register numbers, based on the values placed
215*63addd46Skettenis in the ARCH->tdep->ppc_foo_regnum members. */
216*63addd46Skettenis static void
init_sim_regno_table(struct gdbarch * arch)217*63addd46Skettenis init_sim_regno_table (struct gdbarch *arch)
218*63addd46Skettenis {
219*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
220*63addd46Skettenis int total_regs = gdbarch_num_regs (arch) + gdbarch_num_pseudo_regs (arch);
221*63addd46Skettenis const struct reg *regs = tdep->regs;
222*63addd46Skettenis int *sim_regno = GDBARCH_OBSTACK_CALLOC (arch, total_regs, int);
223*63addd46Skettenis int i;
224*63addd46Skettenis
225*63addd46Skettenis /* Presume that all registers not explicitly mentioned below are
226*63addd46Skettenis unavailable from the sim. */
227*63addd46Skettenis for (i = 0; i < total_regs; i++)
228*63addd46Skettenis sim_regno[i] = -1;
229*63addd46Skettenis
230*63addd46Skettenis /* General-purpose registers. */
231*63addd46Skettenis for (i = 0; i < ppc_num_gprs; i++)
232*63addd46Skettenis set_sim_regno (sim_regno, tdep->ppc_gp0_regnum + i, sim_ppc_r0_regnum + i);
233*63addd46Skettenis
234*63addd46Skettenis /* Floating-point registers. */
235*63addd46Skettenis if (tdep->ppc_fp0_regnum >= 0)
236*63addd46Skettenis for (i = 0; i < ppc_num_fprs; i++)
237*63addd46Skettenis set_sim_regno (sim_regno,
238*63addd46Skettenis tdep->ppc_fp0_regnum + i,
239*63addd46Skettenis sim_ppc_f0_regnum + i);
240*63addd46Skettenis if (tdep->ppc_fpscr_regnum >= 0)
241*63addd46Skettenis set_sim_regno (sim_regno, tdep->ppc_fpscr_regnum, sim_ppc_fpscr_regnum);
242*63addd46Skettenis
243*63addd46Skettenis set_sim_regno (sim_regno, gdbarch_pc_regnum (arch), sim_ppc_pc_regnum);
244*63addd46Skettenis set_sim_regno (sim_regno, tdep->ppc_ps_regnum, sim_ppc_ps_regnum);
245*63addd46Skettenis set_sim_regno (sim_regno, tdep->ppc_cr_regnum, sim_ppc_cr_regnum);
246*63addd46Skettenis
247*63addd46Skettenis /* Segment registers. */
248*63addd46Skettenis if (tdep->ppc_sr0_regnum >= 0)
249*63addd46Skettenis for (i = 0; i < ppc_num_srs; i++)
250*63addd46Skettenis set_sim_regno (sim_regno,
251*63addd46Skettenis tdep->ppc_sr0_regnum + i,
252*63addd46Skettenis sim_ppc_sr0_regnum + i);
253*63addd46Skettenis
254*63addd46Skettenis /* Altivec registers. */
255*63addd46Skettenis if (tdep->ppc_vr0_regnum >= 0)
256*63addd46Skettenis {
257*63addd46Skettenis for (i = 0; i < ppc_num_vrs; i++)
258*63addd46Skettenis set_sim_regno (sim_regno,
259*63addd46Skettenis tdep->ppc_vr0_regnum + i,
260*63addd46Skettenis sim_ppc_vr0_regnum + i);
261*63addd46Skettenis
262*63addd46Skettenis /* FIXME: jimb/2004-07-15: when we have tdep->ppc_vscr_regnum,
263*63addd46Skettenis we can treat this more like the other cases. */
264*63addd46Skettenis set_sim_regno (sim_regno,
265*63addd46Skettenis tdep->ppc_vr0_regnum + ppc_num_vrs,
266*63addd46Skettenis sim_ppc_vscr_regnum);
267*63addd46Skettenis }
268*63addd46Skettenis /* vsave is a special-purpose register, so the code below handles it. */
269*63addd46Skettenis
270*63addd46Skettenis /* SPE APU (E500) registers. */
271*63addd46Skettenis if (tdep->ppc_ev0_regnum >= 0)
272*63addd46Skettenis for (i = 0; i < ppc_num_gprs; i++)
273*63addd46Skettenis set_sim_regno (sim_regno,
274*63addd46Skettenis tdep->ppc_ev0_regnum + i,
275*63addd46Skettenis sim_ppc_ev0_regnum + i);
276*63addd46Skettenis if (tdep->ppc_ev0_upper_regnum >= 0)
277*63addd46Skettenis for (i = 0; i < ppc_num_gprs; i++)
278*63addd46Skettenis set_sim_regno (sim_regno,
279*63addd46Skettenis tdep->ppc_ev0_upper_regnum + i,
280*63addd46Skettenis sim_ppc_rh0_regnum + i);
281*63addd46Skettenis if (tdep->ppc_acc_regnum >= 0)
282*63addd46Skettenis set_sim_regno (sim_regno, tdep->ppc_acc_regnum, sim_ppc_acc_regnum);
283*63addd46Skettenis /* spefscr is a special-purpose register, so the code below handles it. */
284*63addd46Skettenis
285*63addd46Skettenis /* Now handle all special-purpose registers. Verify that they
286*63addd46Skettenis haven't mistakenly been assigned numbers by any of the above
287*63addd46Skettenis code). */
288*63addd46Skettenis for (i = 0; i < total_regs; i++)
289*63addd46Skettenis if (regs[i].spr_num >= 0)
290*63addd46Skettenis set_sim_regno (sim_regno, i, regs[i].spr_num + sim_ppc_spr0_regnum);
291*63addd46Skettenis
292*63addd46Skettenis /* Drop the initialized array into place. */
293*63addd46Skettenis tdep->sim_regno = sim_regno;
294*63addd46Skettenis }
295*63addd46Skettenis
296*63addd46Skettenis
297*63addd46Skettenis /* Given a GDB register number REG, return the corresponding SIM
298*63addd46Skettenis register number. */
299*63addd46Skettenis static int
rs6000_register_sim_regno(int reg)300*63addd46Skettenis rs6000_register_sim_regno (int reg)
301*63addd46Skettenis {
302*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
303*63addd46Skettenis int sim_regno;
304*63addd46Skettenis
305*63addd46Skettenis gdb_assert (0 <= reg && reg <= NUM_REGS + NUM_PSEUDO_REGS);
306*63addd46Skettenis sim_regno = tdep->sim_regno[reg];
307*63addd46Skettenis
308*63addd46Skettenis if (sim_regno >= 0)
309*63addd46Skettenis return sim_regno;
310*63addd46Skettenis else
311*63addd46Skettenis return LEGACY_SIM_REGNO_IGNORE;
312*63addd46Skettenis }
313*63addd46Skettenis
314*63addd46Skettenis
315*63addd46Skettenis
316*63addd46Skettenis /* Register set support functions. */
317*63addd46Skettenis
318*63addd46Skettenis static void
ppc_supply_reg(struct regcache * regcache,int regnum,const char * regs,size_t offset)319*63addd46Skettenis ppc_supply_reg (struct regcache *regcache, int regnum,
320*63addd46Skettenis const char *regs, size_t offset)
321*63addd46Skettenis {
322*63addd46Skettenis if (regnum != -1 && offset != -1)
323*63addd46Skettenis regcache_raw_supply (regcache, regnum, regs + offset);
324*63addd46Skettenis }
325*63addd46Skettenis
326*63addd46Skettenis static void
ppc_collect_reg(const struct regcache * regcache,int regnum,char * regs,size_t offset)327*63addd46Skettenis ppc_collect_reg (const struct regcache *regcache, int regnum,
328*63addd46Skettenis char *regs, size_t offset)
329*63addd46Skettenis {
330*63addd46Skettenis if (regnum != -1 && offset != -1)
331*63addd46Skettenis regcache_raw_collect (regcache, regnum, regs + offset);
332*63addd46Skettenis }
333*63addd46Skettenis
334*63addd46Skettenis /* Supply register REGNUM in the general-purpose register set REGSET
335*63addd46Skettenis from the buffer specified by GREGS and LEN to register cache
336*63addd46Skettenis REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
337*63addd46Skettenis
338*63addd46Skettenis void
ppc_supply_gregset(const struct regset * regset,struct regcache * regcache,int regnum,const void * gregs,size_t len)339*63addd46Skettenis ppc_supply_gregset (const struct regset *regset, struct regcache *regcache,
340*63addd46Skettenis int regnum, const void *gregs, size_t len)
341*63addd46Skettenis {
342*63addd46Skettenis struct gdbarch *gdbarch = get_regcache_arch (regcache);
343*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
344*63addd46Skettenis const struct ppc_reg_offsets *offsets = regset->descr;
345*63addd46Skettenis size_t offset;
346*63addd46Skettenis int i;
347*63addd46Skettenis
348*63addd46Skettenis for (i = tdep->ppc_gp0_regnum, offset = offsets->r0_offset;
349*63addd46Skettenis i < tdep->ppc_gp0_regnum + ppc_num_gprs;
350*63addd46Skettenis i++, offset += 4)
351*63addd46Skettenis {
352*63addd46Skettenis if (regnum == -1 || regnum == i)
353*63addd46Skettenis ppc_supply_reg (regcache, i, gregs, offset);
354*63addd46Skettenis }
355*63addd46Skettenis
356*63addd46Skettenis if (regnum == -1 || regnum == PC_REGNUM)
357*63addd46Skettenis ppc_supply_reg (regcache, PC_REGNUM, gregs, offsets->pc_offset);
358*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_ps_regnum)
359*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_ps_regnum,
360*63addd46Skettenis gregs, offsets->ps_offset);
361*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_cr_regnum)
362*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_cr_regnum,
363*63addd46Skettenis gregs, offsets->cr_offset);
364*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_lr_regnum)
365*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_lr_regnum,
366*63addd46Skettenis gregs, offsets->lr_offset);
367*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_ctr_regnum)
368*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_ctr_regnum,
369*63addd46Skettenis gregs, offsets->ctr_offset);
370*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_xer_regnum)
371*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_xer_regnum,
372*63addd46Skettenis gregs, offsets->cr_offset);
373*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_mq_regnum)
374*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_mq_regnum, gregs, offsets->mq_offset);
375*63addd46Skettenis }
376*63addd46Skettenis
377*63addd46Skettenis /* Supply register REGNUM in the floating-point register set REGSET
378*63addd46Skettenis from the buffer specified by FPREGS and LEN to register cache
379*63addd46Skettenis REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
380*63addd46Skettenis
381*63addd46Skettenis void
ppc_supply_fpregset(const struct regset * regset,struct regcache * regcache,int regnum,const void * fpregs,size_t len)382*63addd46Skettenis ppc_supply_fpregset (const struct regset *regset, struct regcache *regcache,
383*63addd46Skettenis int regnum, const void *fpregs, size_t len)
384*63addd46Skettenis {
385*63addd46Skettenis struct gdbarch *gdbarch = get_regcache_arch (regcache);
386*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
387*63addd46Skettenis const struct ppc_reg_offsets *offsets = regset->descr;
388*63addd46Skettenis size_t offset;
389*63addd46Skettenis int i;
390*63addd46Skettenis
391*63addd46Skettenis gdb_assert (ppc_floating_point_unit_p (gdbarch));
392*63addd46Skettenis
393*63addd46Skettenis offset = offsets->f0_offset;
394*63addd46Skettenis for (i = tdep->ppc_fp0_regnum;
395*63addd46Skettenis i < tdep->ppc_fp0_regnum + ppc_num_fprs;
396*63addd46Skettenis i++, offset += 4)
397*63addd46Skettenis {
398*63addd46Skettenis if (regnum == -1 || regnum == i)
399*63addd46Skettenis ppc_supply_reg (regcache, i, fpregs, offset);
400*63addd46Skettenis }
401*63addd46Skettenis
402*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_fpscr_regnum)
403*63addd46Skettenis ppc_supply_reg (regcache, tdep->ppc_fpscr_regnum,
404*63addd46Skettenis fpregs, offsets->fpscr_offset);
405*63addd46Skettenis }
406*63addd46Skettenis
407*63addd46Skettenis /* Collect register REGNUM in the general-purpose register set
408*63addd46Skettenis REGSET. from register cache REGCACHE into the buffer specified by
409*63addd46Skettenis GREGS and LEN. If REGNUM is -1, do this for all registers in
410*63addd46Skettenis REGSET. */
411*63addd46Skettenis
412*63addd46Skettenis void
ppc_collect_gregset(const struct regset * regset,const struct regcache * regcache,int regnum,void * gregs,size_t len)413*63addd46Skettenis ppc_collect_gregset (const struct regset *regset,
414*63addd46Skettenis const struct regcache *regcache,
415*63addd46Skettenis int regnum, void *gregs, size_t len)
416*63addd46Skettenis {
417*63addd46Skettenis struct gdbarch *gdbarch = get_regcache_arch (regcache);
418*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
419*63addd46Skettenis const struct ppc_reg_offsets *offsets = regset->descr;
420*63addd46Skettenis size_t offset;
421*63addd46Skettenis int i;
422*63addd46Skettenis
423*63addd46Skettenis offset = offsets->r0_offset;
424*63addd46Skettenis for (i = tdep->ppc_gp0_regnum;
425*63addd46Skettenis i < tdep->ppc_gp0_regnum + ppc_num_gprs;
426*63addd46Skettenis i++, offset += 4)
427*63addd46Skettenis {
428*63addd46Skettenis if (regnum == -1 || regnum == i)
429*63addd46Skettenis ppc_collect_reg (regcache, i, gregs, offset);
430*63addd46Skettenis }
431*63addd46Skettenis
432*63addd46Skettenis if (regnum == -1 || regnum == PC_REGNUM)
433*63addd46Skettenis ppc_collect_reg (regcache, PC_REGNUM, gregs, offsets->pc_offset);
434*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_ps_regnum)
435*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_ps_regnum,
436*63addd46Skettenis gregs, offsets->ps_offset);
437*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_cr_regnum)
438*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_cr_regnum,
439*63addd46Skettenis gregs, offsets->cr_offset);
440*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_lr_regnum)
441*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_lr_regnum,
442*63addd46Skettenis gregs, offsets->lr_offset);
443*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_ctr_regnum)
444*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_ctr_regnum,
445*63addd46Skettenis gregs, offsets->ctr_offset);
446*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_xer_regnum)
447*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_xer_regnum,
448*63addd46Skettenis gregs, offsets->xer_offset);
449*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_mq_regnum)
450*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_mq_regnum,
451*63addd46Skettenis gregs, offsets->mq_offset);
452*63addd46Skettenis }
453*63addd46Skettenis
454*63addd46Skettenis /* Collect register REGNUM in the floating-point register set
455*63addd46Skettenis REGSET. from register cache REGCACHE into the buffer specified by
456*63addd46Skettenis FPREGS and LEN. If REGNUM is -1, do this for all registers in
457*63addd46Skettenis REGSET. */
458*63addd46Skettenis
459*63addd46Skettenis void
ppc_collect_fpregset(const struct regset * regset,const struct regcache * regcache,int regnum,void * fpregs,size_t len)460*63addd46Skettenis ppc_collect_fpregset (const struct regset *regset,
461*63addd46Skettenis const struct regcache *regcache,
462*63addd46Skettenis int regnum, void *fpregs, size_t len)
463*63addd46Skettenis {
464*63addd46Skettenis struct gdbarch *gdbarch = get_regcache_arch (regcache);
465*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
466*63addd46Skettenis const struct ppc_reg_offsets *offsets = regset->descr;
467*63addd46Skettenis size_t offset;
468*63addd46Skettenis int i;
469*63addd46Skettenis
470*63addd46Skettenis gdb_assert (ppc_floating_point_unit_p (gdbarch));
471*63addd46Skettenis
472*63addd46Skettenis offset = offsets->f0_offset;
473*63addd46Skettenis for (i = tdep->ppc_fp0_regnum;
474*63addd46Skettenis i <= tdep->ppc_fp0_regnum + ppc_num_fprs;
475*63addd46Skettenis i++, offset += 4)
476*63addd46Skettenis {
477*63addd46Skettenis if (regnum == -1 || regnum == i)
478*63addd46Skettenis ppc_collect_reg (regcache, regnum, fpregs, offset);
479*63addd46Skettenis }
480*63addd46Skettenis
481*63addd46Skettenis if (regnum == -1 || regnum == tdep->ppc_fpscr_regnum)
482*63addd46Skettenis ppc_collect_reg (regcache, tdep->ppc_fpscr_regnum,
483*63addd46Skettenis fpregs, offsets->fpscr_offset);
484*63addd46Skettenis }
485*63addd46Skettenis
486*63addd46Skettenis
487b725ae77Skettenis /* Read a LEN-byte address from debugged memory address MEMADDR. */
488b725ae77Skettenis
489b725ae77Skettenis static CORE_ADDR
read_memory_addr(CORE_ADDR memaddr,int len)490b725ae77Skettenis read_memory_addr (CORE_ADDR memaddr, int len)
491b725ae77Skettenis {
492b725ae77Skettenis return read_memory_unsigned_integer (memaddr, len);
493b725ae77Skettenis }
494b725ae77Skettenis
495b725ae77Skettenis static CORE_ADDR
rs6000_skip_prologue(CORE_ADDR pc)496b725ae77Skettenis rs6000_skip_prologue (CORE_ADDR pc)
497b725ae77Skettenis {
498b725ae77Skettenis struct rs6000_framedata frame;
499b725ae77Skettenis pc = skip_prologue (pc, 0, &frame);
500b725ae77Skettenis return pc;
501b725ae77Skettenis }
502b725ae77Skettenis
503b725ae77Skettenis
504b725ae77Skettenis /* Fill in fi->saved_regs */
505b725ae77Skettenis
506b725ae77Skettenis struct frame_extra_info
507b725ae77Skettenis {
508b725ae77Skettenis /* Functions calling alloca() change the value of the stack
509b725ae77Skettenis pointer. We need to use initial stack pointer (which is saved in
510b725ae77Skettenis r31 by gcc) in such cases. If a compiler emits traceback table,
511b725ae77Skettenis then we should use the alloca register specified in traceback
512b725ae77Skettenis table. FIXME. */
513b725ae77Skettenis CORE_ADDR initial_sp; /* initial stack pointer. */
514b725ae77Skettenis };
515b725ae77Skettenis
516b725ae77Skettenis /* Get the ith function argument for the current function. */
517b725ae77Skettenis static CORE_ADDR
rs6000_fetch_pointer_argument(struct frame_info * frame,int argi,struct type * type)518b725ae77Skettenis rs6000_fetch_pointer_argument (struct frame_info *frame, int argi,
519b725ae77Skettenis struct type *type)
520b725ae77Skettenis {
521b725ae77Skettenis CORE_ADDR addr;
522b725ae77Skettenis get_frame_register (frame, 3 + argi, &addr);
523b725ae77Skettenis return addr;
524b725ae77Skettenis }
525e93f7393Sniklas
526e93f7393Sniklas /* Calculate the destination of a branch/jump. Return -1 if not a branch. */
527e93f7393Sniklas
528e93f7393Sniklas static CORE_ADDR
branch_dest(int opcode,int instr,CORE_ADDR pc,CORE_ADDR safety)529b725ae77Skettenis branch_dest (int opcode, int instr, CORE_ADDR pc, CORE_ADDR safety)
530e93f7393Sniklas {
531e93f7393Sniklas CORE_ADDR dest;
532e93f7393Sniklas int immediate;
533e93f7393Sniklas int absolute;
534e93f7393Sniklas int ext_op;
535e93f7393Sniklas
536e93f7393Sniklas absolute = (int) ((instr >> 1) & 1);
537e93f7393Sniklas
538b725ae77Skettenis switch (opcode)
539b725ae77Skettenis {
540e93f7393Sniklas case 18:
541e93f7393Sniklas immediate = ((instr & ~3) << 6) >> 6; /* br unconditional */
542e93f7393Sniklas if (absolute)
543e93f7393Sniklas dest = immediate;
544e93f7393Sniklas else
545e93f7393Sniklas dest = pc + immediate;
546e93f7393Sniklas break;
547e93f7393Sniklas
548e93f7393Sniklas case 16:
549e93f7393Sniklas immediate = ((instr & ~3) << 16) >> 16; /* br conditional */
550e93f7393Sniklas if (absolute)
551e93f7393Sniklas dest = immediate;
552e93f7393Sniklas else
553e93f7393Sniklas dest = pc + immediate;
554e93f7393Sniklas break;
555e93f7393Sniklas
556e93f7393Sniklas case 19:
557e93f7393Sniklas ext_op = (instr >> 1) & 0x3ff;
558e93f7393Sniklas
559e93f7393Sniklas if (ext_op == 16) /* br conditional register */
560b725ae77Skettenis {
561b725ae77Skettenis dest = read_register (gdbarch_tdep (current_gdbarch)->ppc_lr_regnum) & ~3;
562b725ae77Skettenis
563b725ae77Skettenis /* If we are about to return from a signal handler, dest is
564b725ae77Skettenis something like 0x3c90. The current frame is a signal handler
565b725ae77Skettenis caller frame, upon completion of the sigreturn system call
566b725ae77Skettenis execution will return to the saved PC in the frame. */
567b725ae77Skettenis if (dest < TEXT_SEGMENT_BASE)
568b725ae77Skettenis {
569b725ae77Skettenis struct frame_info *fi;
570b725ae77Skettenis
571b725ae77Skettenis fi = get_current_frame ();
572b725ae77Skettenis if (fi != NULL)
573b725ae77Skettenis dest = read_memory_addr (get_frame_base (fi) + SIG_FRAME_PC_OFFSET,
574b725ae77Skettenis gdbarch_tdep (current_gdbarch)->wordsize);
575b725ae77Skettenis }
576b725ae77Skettenis }
577e93f7393Sniklas
578e93f7393Sniklas else if (ext_op == 528) /* br cond to count reg */
579e93f7393Sniklas {
580b725ae77Skettenis dest = read_register (gdbarch_tdep (current_gdbarch)->ppc_ctr_regnum) & ~3;
581e93f7393Sniklas
582e93f7393Sniklas /* If we are about to execute a system call, dest is something
583e93f7393Sniklas like 0x22fc or 0x3b00. Upon completion the system call
584e93f7393Sniklas will return to the address in the link register. */
585e93f7393Sniklas if (dest < TEXT_SEGMENT_BASE)
586b725ae77Skettenis dest = read_register (gdbarch_tdep (current_gdbarch)->ppc_lr_regnum) & ~3;
587e93f7393Sniklas }
588b725ae77Skettenis else
589b725ae77Skettenis return -1;
590e93f7393Sniklas break;
591e93f7393Sniklas
592b725ae77Skettenis default:
593b725ae77Skettenis return -1;
594e93f7393Sniklas }
595e93f7393Sniklas return (dest < TEXT_SEGMENT_BASE) ? safety : dest;
596e93f7393Sniklas }
597e93f7393Sniklas
598e93f7393Sniklas
599b725ae77Skettenis /* Sequence of bytes for breakpoint instruction. */
600b725ae77Skettenis
601b725ae77Skettenis const static unsigned char *
rs6000_breakpoint_from_pc(CORE_ADDR * bp_addr,int * bp_size)602b725ae77Skettenis rs6000_breakpoint_from_pc (CORE_ADDR *bp_addr, int *bp_size)
603b725ae77Skettenis {
604b725ae77Skettenis static unsigned char big_breakpoint[] = { 0x7d, 0x82, 0x10, 0x08 };
605b725ae77Skettenis static unsigned char little_breakpoint[] = { 0x08, 0x10, 0x82, 0x7d };
606b725ae77Skettenis *bp_size = 4;
607b725ae77Skettenis if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
608b725ae77Skettenis return big_breakpoint;
609b725ae77Skettenis else
610b725ae77Skettenis return little_breakpoint;
611b725ae77Skettenis }
612b725ae77Skettenis
613e93f7393Sniklas
614e93f7393Sniklas /* AIX does not support PT_STEP. Simulate it. */
615e93f7393Sniklas
616e93f7393Sniklas void
rs6000_software_single_step(enum target_signal signal,int insert_breakpoints_p)617b725ae77Skettenis rs6000_software_single_step (enum target_signal signal,
618b725ae77Skettenis int insert_breakpoints_p)
619e93f7393Sniklas {
620b725ae77Skettenis CORE_ADDR dummy;
621b725ae77Skettenis int breakp_sz;
622b725ae77Skettenis const char *breakp = rs6000_breakpoint_from_pc (&dummy, &breakp_sz);
623e93f7393Sniklas int ii, insn;
624e93f7393Sniklas CORE_ADDR loc;
625e93f7393Sniklas CORE_ADDR breaks[2];
626e93f7393Sniklas int opcode;
627e93f7393Sniklas
628b725ae77Skettenis if (insert_breakpoints_p)
629b725ae77Skettenis {
630b725ae77Skettenis
631e93f7393Sniklas loc = read_pc ();
632e93f7393Sniklas
633e93f7393Sniklas insn = read_memory_integer (loc, 4);
634e93f7393Sniklas
635b725ae77Skettenis breaks[0] = loc + breakp_sz;
636e93f7393Sniklas opcode = insn >> 26;
637e93f7393Sniklas breaks[1] = branch_dest (opcode, insn, loc, breaks[0]);
638e93f7393Sniklas
639e93f7393Sniklas /* Don't put two breakpoints on the same address. */
640e93f7393Sniklas if (breaks[1] == breaks[0])
641e93f7393Sniklas breaks[1] = -1;
642e93f7393Sniklas
643e93f7393Sniklas stepBreaks[1].address = 0;
644e93f7393Sniklas
645b725ae77Skettenis for (ii = 0; ii < 2; ++ii)
646b725ae77Skettenis {
647e93f7393Sniklas
648e93f7393Sniklas /* ignore invalid breakpoint. */
649e93f7393Sniklas if (breaks[ii] == -1)
650e93f7393Sniklas continue;
651b725ae77Skettenis target_insert_breakpoint (breaks[ii], stepBreaks[ii].data);
652e93f7393Sniklas stepBreaks[ii].address = breaks[ii];
653e93f7393Sniklas }
654e93f7393Sniklas
655b725ae77Skettenis }
656b725ae77Skettenis else
657b725ae77Skettenis {
658e93f7393Sniklas
659e93f7393Sniklas /* remove step breakpoints. */
660e93f7393Sniklas for (ii = 0; ii < 2; ++ii)
661e93f7393Sniklas if (stepBreaks[ii].address != 0)
662b725ae77Skettenis target_remove_breakpoint (stepBreaks[ii].address,
663b725ae77Skettenis stepBreaks[ii].data);
664e93f7393Sniklas }
665e93f7393Sniklas errno = 0; /* FIXME, don't ignore errors! */
666e93f7393Sniklas /* What errors? {read,write}_memory call error(). */
667e93f7393Sniklas }
668e93f7393Sniklas
669e93f7393Sniklas
670e93f7393Sniklas /* return pc value after skipping a function prologue and also return
671e93f7393Sniklas information about a function frame.
672e93f7393Sniklas
673b725ae77Skettenis in struct rs6000_framedata fdata:
674e93f7393Sniklas - frameless is TRUE, if function does not have a frame.
675e93f7393Sniklas - nosavedpc is TRUE, if function does not save %pc value in its frame.
676b725ae77Skettenis - offset is the initial size of this stack frame --- the amount by
677b725ae77Skettenis which we decrement the sp to allocate the frame.
678e93f7393Sniklas - saved_gpr is the number of the first saved gpr.
679e93f7393Sniklas - saved_fpr is the number of the first saved fpr.
680b725ae77Skettenis - saved_vr is the number of the first saved vr.
681b725ae77Skettenis - saved_ev is the number of the first saved ev.
682e93f7393Sniklas - alloca_reg is the number of the register used for alloca() handling.
683e93f7393Sniklas Otherwise -1.
684b725ae77Skettenis - gpr_offset is the offset of the first saved gpr from the previous frame.
685b725ae77Skettenis - fpr_offset is the offset of the first saved fpr from the previous frame.
686b725ae77Skettenis - vr_offset is the offset of the first saved vr from the previous frame.
687b725ae77Skettenis - ev_offset is the offset of the first saved ev from the previous frame.
688e93f7393Sniklas - lr_offset is the offset of the saved lr
689e93f7393Sniklas - cr_offset is the offset of the saved cr
690b725ae77Skettenis - vrsave_offset is the offset of the saved vrsave register
691e93f7393Sniklas */
692e93f7393Sniklas
693e93f7393Sniklas #define SIGNED_SHORT(x) \
694e93f7393Sniklas ((sizeof (short) == 2) \
695e93f7393Sniklas ? ((int)(short)(x)) \
696e93f7393Sniklas : ((int)((((x) & 0xffff) ^ 0x8000) - 0x8000)))
697e93f7393Sniklas
698e93f7393Sniklas #define GET_SRC_REG(x) (((x) >> 21) & 0x1f)
699e93f7393Sniklas
700b725ae77Skettenis /* Limit the number of skipped non-prologue instructions, as the examining
701b725ae77Skettenis of the prologue is expensive. */
702b725ae77Skettenis static int max_skip_non_prologue_insns = 10;
703b725ae77Skettenis
704b725ae77Skettenis /* Given PC representing the starting address of a function, and
705b725ae77Skettenis LIM_PC which is the (sloppy) limit to which to scan when looking
706b725ae77Skettenis for a prologue, attempt to further refine this limit by using
707b725ae77Skettenis the line data in the symbol table. If successful, a better guess
708b725ae77Skettenis on where the prologue ends is returned, otherwise the previous
709b725ae77Skettenis value of lim_pc is returned. */
710b725ae77Skettenis
711b725ae77Skettenis /* FIXME: cagney/2004-02-14: This function and logic have largely been
712b725ae77Skettenis superseded by skip_prologue_using_sal. */
713b725ae77Skettenis
714b725ae77Skettenis static CORE_ADDR
refine_prologue_limit(CORE_ADDR pc,CORE_ADDR lim_pc)715b725ae77Skettenis refine_prologue_limit (CORE_ADDR pc, CORE_ADDR lim_pc)
716b725ae77Skettenis {
717b725ae77Skettenis struct symtab_and_line prologue_sal;
718b725ae77Skettenis
719b725ae77Skettenis prologue_sal = find_pc_line (pc, 0);
720b725ae77Skettenis if (prologue_sal.line != 0)
721b725ae77Skettenis {
722b725ae77Skettenis int i;
723b725ae77Skettenis CORE_ADDR addr = prologue_sal.end;
724b725ae77Skettenis
725b725ae77Skettenis /* Handle the case in which compiler's optimizer/scheduler
726b725ae77Skettenis has moved instructions into the prologue. We scan ahead
727b725ae77Skettenis in the function looking for address ranges whose corresponding
728b725ae77Skettenis line number is less than or equal to the first one that we
729b725ae77Skettenis found for the function. (It can be less than when the
730b725ae77Skettenis scheduler puts a body instruction before the first prologue
731b725ae77Skettenis instruction.) */
732b725ae77Skettenis for (i = 2 * max_skip_non_prologue_insns;
733b725ae77Skettenis i > 0 && (lim_pc == 0 || addr < lim_pc);
734b725ae77Skettenis i--)
735b725ae77Skettenis {
736b725ae77Skettenis struct symtab_and_line sal;
737b725ae77Skettenis
738b725ae77Skettenis sal = find_pc_line (addr, 0);
739b725ae77Skettenis if (sal.line == 0)
740b725ae77Skettenis break;
741b725ae77Skettenis if (sal.line <= prologue_sal.line
742b725ae77Skettenis && sal.symtab == prologue_sal.symtab)
743b725ae77Skettenis {
744b725ae77Skettenis prologue_sal = sal;
745b725ae77Skettenis }
746b725ae77Skettenis addr = sal.end;
747b725ae77Skettenis }
748b725ae77Skettenis
749b725ae77Skettenis if (lim_pc == 0 || prologue_sal.end < lim_pc)
750b725ae77Skettenis lim_pc = prologue_sal.end;
751b725ae77Skettenis }
752b725ae77Skettenis return lim_pc;
753b725ae77Skettenis }
754b725ae77Skettenis
755*63addd46Skettenis /* Return nonzero if the given instruction OP can be part of the prologue
756*63addd46Skettenis of a function and saves a parameter on the stack. FRAMEP should be
757*63addd46Skettenis set if one of the previous instructions in the function has set the
758*63addd46Skettenis Frame Pointer. */
759*63addd46Skettenis
760*63addd46Skettenis static int
store_param_on_stack_p(unsigned long op,int framep,int * r0_contains_arg)761*63addd46Skettenis store_param_on_stack_p (unsigned long op, int framep, int *r0_contains_arg)
762*63addd46Skettenis {
763*63addd46Skettenis /* Move parameters from argument registers to temporary register. */
764*63addd46Skettenis if ((op & 0xfc0007fe) == 0x7c000378) /* mr(.) Rx,Ry */
765*63addd46Skettenis {
766*63addd46Skettenis /* Rx must be scratch register r0. */
767*63addd46Skettenis const int rx_regno = (op >> 16) & 31;
768*63addd46Skettenis /* Ry: Only r3 - r10 are used for parameter passing. */
769*63addd46Skettenis const int ry_regno = GET_SRC_REG (op);
770*63addd46Skettenis
771*63addd46Skettenis if (rx_regno == 0 && ry_regno >= 3 && ry_regno <= 10)
772*63addd46Skettenis {
773*63addd46Skettenis *r0_contains_arg = 1;
774*63addd46Skettenis return 1;
775*63addd46Skettenis }
776*63addd46Skettenis else
777*63addd46Skettenis return 0;
778*63addd46Skettenis }
779*63addd46Skettenis
780*63addd46Skettenis /* Save a General Purpose Register on stack. */
781*63addd46Skettenis
782*63addd46Skettenis if ((op & 0xfc1f0003) == 0xf8010000 || /* std Rx,NUM(r1) */
783*63addd46Skettenis (op & 0xfc1f0000) == 0xd8010000) /* stfd Rx,NUM(r1) */
784*63addd46Skettenis {
785*63addd46Skettenis /* Rx: Only r3 - r10 are used for parameter passing. */
786*63addd46Skettenis const int rx_regno = GET_SRC_REG (op);
787*63addd46Skettenis
788*63addd46Skettenis return (rx_regno >= 3 && rx_regno <= 10);
789*63addd46Skettenis }
790*63addd46Skettenis
791*63addd46Skettenis /* Save a General Purpose Register on stack via the Frame Pointer. */
792*63addd46Skettenis
793*63addd46Skettenis if (framep &&
794*63addd46Skettenis ((op & 0xfc1f0000) == 0x901f0000 || /* st rx,NUM(r31) */
795*63addd46Skettenis (op & 0xfc1f0000) == 0x981f0000 || /* stb Rx,NUM(r31) */
796*63addd46Skettenis (op & 0xfc1f0000) == 0xd81f0000)) /* stfd Rx,NUM(r31) */
797*63addd46Skettenis {
798*63addd46Skettenis /* Rx: Usually, only r3 - r10 are used for parameter passing.
799*63addd46Skettenis However, the compiler sometimes uses r0 to hold an argument. */
800*63addd46Skettenis const int rx_regno = GET_SRC_REG (op);
801*63addd46Skettenis
802*63addd46Skettenis return ((rx_regno >= 3 && rx_regno <= 10)
803*63addd46Skettenis || (rx_regno == 0 && *r0_contains_arg));
804*63addd46Skettenis }
805*63addd46Skettenis
806*63addd46Skettenis if ((op & 0xfc1f0000) == 0xfc010000) /* frsp, fp?,NUM(r1) */
807*63addd46Skettenis {
808*63addd46Skettenis /* Only f2 - f8 are used for parameter passing. */
809*63addd46Skettenis const int src_regno = GET_SRC_REG (op);
810*63addd46Skettenis
811*63addd46Skettenis return (src_regno >= 2 && src_regno <= 8);
812*63addd46Skettenis }
813*63addd46Skettenis
814*63addd46Skettenis if (framep && ((op & 0xfc1f0000) == 0xfc1f0000)) /* frsp, fp?,NUM(r31) */
815*63addd46Skettenis {
816*63addd46Skettenis /* Only f2 - f8 are used for parameter passing. */
817*63addd46Skettenis const int src_regno = GET_SRC_REG (op);
818*63addd46Skettenis
819*63addd46Skettenis return (src_regno >= 2 && src_regno <= 8);
820*63addd46Skettenis }
821*63addd46Skettenis
822*63addd46Skettenis /* Not an insn that saves a parameter on stack. */
823*63addd46Skettenis return 0;
824*63addd46Skettenis }
825b725ae77Skettenis
826b725ae77Skettenis static CORE_ADDR
skip_prologue(CORE_ADDR pc,CORE_ADDR lim_pc,struct rs6000_framedata * fdata)827b725ae77Skettenis skip_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct rs6000_framedata *fdata)
828e93f7393Sniklas {
829e93f7393Sniklas CORE_ADDR orig_pc = pc;
830b725ae77Skettenis CORE_ADDR last_prologue_pc = pc;
831b725ae77Skettenis CORE_ADDR li_found_pc = 0;
832e93f7393Sniklas char buf[4];
833e93f7393Sniklas unsigned long op;
834e93f7393Sniklas long offset = 0;
835b725ae77Skettenis long vr_saved_offset = 0;
836b725ae77Skettenis int lr_reg = -1;
837b725ae77Skettenis int cr_reg = -1;
838b725ae77Skettenis int vr_reg = -1;
839b725ae77Skettenis int ev_reg = -1;
840b725ae77Skettenis long ev_offset = 0;
841b725ae77Skettenis int vrsave_reg = -1;
842e93f7393Sniklas int reg;
843e93f7393Sniklas int framep = 0;
844e93f7393Sniklas int minimal_toc_loaded = 0;
845b725ae77Skettenis int prev_insn_was_prologue_insn = 1;
846b725ae77Skettenis int num_skip_non_prologue_insns = 0;
847*63addd46Skettenis int r0_contains_arg = 0;
848b725ae77Skettenis const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (current_gdbarch);
849b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
850e93f7393Sniklas
851b725ae77Skettenis /* Attempt to find the end of the prologue when no limit is specified.
852b725ae77Skettenis Note that refine_prologue_limit() has been written so that it may
853b725ae77Skettenis be used to "refine" the limits of non-zero PC values too, but this
854b725ae77Skettenis is only safe if we 1) trust the line information provided by the
855b725ae77Skettenis compiler and 2) iterate enough to actually find the end of the
856b725ae77Skettenis prologue.
857b725ae77Skettenis
858b725ae77Skettenis It may become a good idea at some point (for both performance and
859b725ae77Skettenis accuracy) to unconditionally call refine_prologue_limit(). But,
860b725ae77Skettenis until we can make a clear determination that this is beneficial,
861b725ae77Skettenis we'll play it safe and only use it to obtain a limit when none
862b725ae77Skettenis has been specified. */
863b725ae77Skettenis if (lim_pc == 0)
864b725ae77Skettenis lim_pc = refine_prologue_limit (pc, lim_pc);
865b725ae77Skettenis
866b725ae77Skettenis memset (fdata, 0, sizeof (struct rs6000_framedata));
867e93f7393Sniklas fdata->saved_gpr = -1;
868e93f7393Sniklas fdata->saved_fpr = -1;
869b725ae77Skettenis fdata->saved_vr = -1;
870b725ae77Skettenis fdata->saved_ev = -1;
871e93f7393Sniklas fdata->alloca_reg = -1;
872e93f7393Sniklas fdata->frameless = 1;
873e93f7393Sniklas fdata->nosavedpc = 1;
874e93f7393Sniklas
875b725ae77Skettenis for (;; pc += 4)
876e93f7393Sniklas {
877b725ae77Skettenis /* Sometimes it isn't clear if an instruction is a prologue
878b725ae77Skettenis instruction or not. When we encounter one of these ambiguous
879b725ae77Skettenis cases, we'll set prev_insn_was_prologue_insn to 0 (false).
880b725ae77Skettenis Otherwise, we'll assume that it really is a prologue instruction. */
881b725ae77Skettenis if (prev_insn_was_prologue_insn)
882b725ae77Skettenis last_prologue_pc = pc;
883e93f7393Sniklas
884b725ae77Skettenis /* Stop scanning if we've hit the limit. */
885b725ae77Skettenis if (lim_pc != 0 && pc >= lim_pc)
886b725ae77Skettenis break;
887b725ae77Skettenis
888b725ae77Skettenis prev_insn_was_prologue_insn = 1;
889b725ae77Skettenis
890b725ae77Skettenis /* Fetch the instruction and convert it to an integer. */
891b725ae77Skettenis if (target_read_memory (pc, buf, 4))
892b725ae77Skettenis break;
893b725ae77Skettenis op = extract_signed_integer (buf, 4);
894b725ae77Skettenis
895b725ae77Skettenis if ((op & 0xfc1fffff) == 0x7c0802a6)
896b725ae77Skettenis { /* mflr Rx */
897*63addd46Skettenis /* Since shared library / PIC code, which needs to get its
898*63addd46Skettenis address at runtime, can appear to save more than one link
899*63addd46Skettenis register vis:
900e93f7393Sniklas
901*63addd46Skettenis *INDENT-OFF*
902*63addd46Skettenis stwu r1,-304(r1)
903*63addd46Skettenis mflr r3
904*63addd46Skettenis bl 0xff570d0 (blrl)
905*63addd46Skettenis stw r30,296(r1)
906*63addd46Skettenis mflr r30
907*63addd46Skettenis stw r31,300(r1)
908*63addd46Skettenis stw r3,308(r1);
909*63addd46Skettenis ...
910*63addd46Skettenis *INDENT-ON*
911*63addd46Skettenis
912*63addd46Skettenis remember just the first one, but skip over additional
913*63addd46Skettenis ones. */
914*63addd46Skettenis if (lr_reg < 0)
915*63addd46Skettenis lr_reg = (op & 0x03e00000);
916*63addd46Skettenis if (lr_reg == 0)
917*63addd46Skettenis r0_contains_arg = 0;
918*63addd46Skettenis continue;
919b725ae77Skettenis }
920b725ae77Skettenis else if ((op & 0xfc1fffff) == 0x7c000026)
921b725ae77Skettenis { /* mfcr Rx */
922b725ae77Skettenis cr_reg = (op & 0x03e00000);
923*63addd46Skettenis if (cr_reg == 0)
924*63addd46Skettenis r0_contains_arg = 0;
925e93f7393Sniklas continue;
926e93f7393Sniklas
927b725ae77Skettenis }
928b725ae77Skettenis else if ((op & 0xfc1f0000) == 0xd8010000)
929b725ae77Skettenis { /* stfd Rx,NUM(r1) */
930e93f7393Sniklas reg = GET_SRC_REG (op);
931b725ae77Skettenis if (fdata->saved_fpr == -1 || fdata->saved_fpr > reg)
932b725ae77Skettenis {
933e93f7393Sniklas fdata->saved_fpr = reg;
934e93f7393Sniklas fdata->fpr_offset = SIGNED_SHORT (op) + offset;
935e93f7393Sniklas }
936e93f7393Sniklas continue;
937e93f7393Sniklas
938b725ae77Skettenis }
939b725ae77Skettenis else if (((op & 0xfc1f0000) == 0xbc010000) || /* stm Rx, NUM(r1) */
940b725ae77Skettenis (((op & 0xfc1f0000) == 0x90010000 || /* st rx,NUM(r1) */
941b725ae77Skettenis (op & 0xfc1f0003) == 0xf8010000) && /* std rx,NUM(r1) */
942b725ae77Skettenis (op & 0x03e00000) >= 0x01a00000)) /* rx >= r13 */
943b725ae77Skettenis {
944e93f7393Sniklas
945e93f7393Sniklas reg = GET_SRC_REG (op);
946b725ae77Skettenis if (fdata->saved_gpr == -1 || fdata->saved_gpr > reg)
947b725ae77Skettenis {
948e93f7393Sniklas fdata->saved_gpr = reg;
949b725ae77Skettenis if ((op & 0xfc1f0003) == 0xf8010000)
950b725ae77Skettenis op &= ~3UL;
951e93f7393Sniklas fdata->gpr_offset = SIGNED_SHORT (op) + offset;
952e93f7393Sniklas }
953e93f7393Sniklas continue;
954e93f7393Sniklas
955b725ae77Skettenis }
956b725ae77Skettenis else if ((op & 0xffff0000) == 0x60000000)
957b725ae77Skettenis {
958b725ae77Skettenis /* nop */
959b725ae77Skettenis /* Allow nops in the prologue, but do not consider them to
960b725ae77Skettenis be part of the prologue unless followed by other prologue
961b725ae77Skettenis instructions. */
962b725ae77Skettenis prev_insn_was_prologue_insn = 0;
963b725ae77Skettenis continue;
964b725ae77Skettenis
965b725ae77Skettenis }
966b725ae77Skettenis else if ((op & 0xffff0000) == 0x3c000000)
967b725ae77Skettenis { /* addis 0,0,NUM, used
968b725ae77Skettenis for >= 32k frames */
969e93f7393Sniklas fdata->offset = (op & 0x0000ffff) << 16;
970e93f7393Sniklas fdata->frameless = 0;
971*63addd46Skettenis r0_contains_arg = 0;
972e93f7393Sniklas continue;
973e93f7393Sniklas
974b725ae77Skettenis }
975b725ae77Skettenis else if ((op & 0xffff0000) == 0x60000000)
976b725ae77Skettenis { /* ori 0,0,NUM, 2nd ha
977b725ae77Skettenis lf of >= 32k frames */
978e93f7393Sniklas fdata->offset |= (op & 0x0000ffff);
979e93f7393Sniklas fdata->frameless = 0;
980*63addd46Skettenis r0_contains_arg = 0;
981e93f7393Sniklas continue;
982e93f7393Sniklas
983b725ae77Skettenis }
984b725ae77Skettenis else if (lr_reg != -1 &&
985b725ae77Skettenis /* std Rx, NUM(r1) || stdu Rx, NUM(r1) */
986b725ae77Skettenis (((op & 0xffff0000) == (lr_reg | 0xf8010000)) ||
987b725ae77Skettenis /* stw Rx, NUM(r1) */
988b725ae77Skettenis ((op & 0xffff0000) == (lr_reg | 0x90010000)) ||
989b725ae77Skettenis /* stwu Rx, NUM(r1) */
990b725ae77Skettenis ((op & 0xffff0000) == (lr_reg | 0x94010000))))
991b725ae77Skettenis { /* where Rx == lr */
992b725ae77Skettenis fdata->lr_offset = offset;
993e93f7393Sniklas fdata->nosavedpc = 0;
994e93f7393Sniklas lr_reg = 0;
995b725ae77Skettenis if ((op & 0xfc000003) == 0xf8000000 || /* std */
996b725ae77Skettenis (op & 0xfc000000) == 0x90000000) /* stw */
997b725ae77Skettenis {
998b725ae77Skettenis /* Does not update r1, so add displacement to lr_offset. */
999b725ae77Skettenis fdata->lr_offset += SIGNED_SHORT (op);
1000b725ae77Skettenis }
1001e93f7393Sniklas continue;
1002e93f7393Sniklas
1003b725ae77Skettenis }
1004b725ae77Skettenis else if (cr_reg != -1 &&
1005b725ae77Skettenis /* std Rx, NUM(r1) || stdu Rx, NUM(r1) */
1006b725ae77Skettenis (((op & 0xffff0000) == (cr_reg | 0xf8010000)) ||
1007b725ae77Skettenis /* stw Rx, NUM(r1) */
1008b725ae77Skettenis ((op & 0xffff0000) == (cr_reg | 0x90010000)) ||
1009b725ae77Skettenis /* stwu Rx, NUM(r1) */
1010b725ae77Skettenis ((op & 0xffff0000) == (cr_reg | 0x94010000))))
1011b725ae77Skettenis { /* where Rx == cr */
1012b725ae77Skettenis fdata->cr_offset = offset;
1013e93f7393Sniklas cr_reg = 0;
1014b725ae77Skettenis if ((op & 0xfc000003) == 0xf8000000 ||
1015b725ae77Skettenis (op & 0xfc000000) == 0x90000000)
1016b725ae77Skettenis {
1017b725ae77Skettenis /* Does not update r1, so add displacement to cr_offset. */
1018b725ae77Skettenis fdata->cr_offset += SIGNED_SHORT (op);
1019b725ae77Skettenis }
1020e93f7393Sniklas continue;
1021e93f7393Sniklas
1022b725ae77Skettenis }
1023b725ae77Skettenis else if (op == 0x48000005)
1024b725ae77Skettenis { /* bl .+4 used in
1025b725ae77Skettenis -mrelocatable */
1026e93f7393Sniklas continue;
1027e93f7393Sniklas
1028b725ae77Skettenis }
1029b725ae77Skettenis else if (op == 0x48000004)
1030b725ae77Skettenis { /* b .+4 (xlc) */
1031e93f7393Sniklas break;
1032e93f7393Sniklas
1033b725ae77Skettenis }
1034b725ae77Skettenis else if ((op & 0xffff0000) == 0x3fc00000 || /* addis 30,0,foo@ha, used
1035b725ae77Skettenis in V.4 -mminimal-toc */
1036b725ae77Skettenis (op & 0xffff0000) == 0x3bde0000)
1037b725ae77Skettenis { /* addi 30,30,foo@l */
1038e93f7393Sniklas continue;
1039e93f7393Sniklas
1040b725ae77Skettenis }
1041b725ae77Skettenis else if ((op & 0xfc000001) == 0x48000001)
1042b725ae77Skettenis { /* bl foo,
1043b725ae77Skettenis to save fprs??? */
1044e93f7393Sniklas
1045e93f7393Sniklas fdata->frameless = 0;
1046b725ae77Skettenis /* Don't skip over the subroutine call if it is not within
1047b725ae77Skettenis the first three instructions of the prologue. */
1048e93f7393Sniklas if ((pc - orig_pc) > 8)
1049e93f7393Sniklas break;
1050e93f7393Sniklas
1051e93f7393Sniklas op = read_memory_integer (pc + 4, 4);
1052e93f7393Sniklas
1053b725ae77Skettenis /* At this point, make sure this is not a trampoline
1054b725ae77Skettenis function (a function that simply calls another functions,
1055b725ae77Skettenis and nothing else). If the next is not a nop, this branch
1056b725ae77Skettenis was part of the function prologue. */
1057e93f7393Sniklas
1058e93f7393Sniklas if (op == 0x4def7b82 || op == 0) /* crorc 15, 15, 15 */
1059b725ae77Skettenis break; /* don't skip over
1060b725ae77Skettenis this branch */
1061e93f7393Sniklas continue;
1062e93f7393Sniklas
1063b725ae77Skettenis }
1064e93f7393Sniklas /* update stack pointer */
1065b725ae77Skettenis else if ((op & 0xfc1f0000) == 0x94010000)
1066b725ae77Skettenis { /* stu rX,NUM(r1) || stwu rX,NUM(r1) */
1067e93f7393Sniklas fdata->frameless = 0;
1068e93f7393Sniklas fdata->offset = SIGNED_SHORT (op);
1069e93f7393Sniklas offset = fdata->offset;
1070e93f7393Sniklas continue;
1071b725ae77Skettenis }
1072b725ae77Skettenis else if ((op & 0xfc1f016a) == 0x7c01016e)
1073b725ae77Skettenis { /* stwux rX,r1,rY */
1074b725ae77Skettenis /* no way to figure out what r1 is going to be */
1075e93f7393Sniklas fdata->frameless = 0;
1076e93f7393Sniklas offset = fdata->offset;
1077e93f7393Sniklas continue;
1078b725ae77Skettenis }
1079b725ae77Skettenis else if ((op & 0xfc1f0003) == 0xf8010001)
1080b725ae77Skettenis { /* stdu rX,NUM(r1) */
1081b725ae77Skettenis fdata->frameless = 0;
1082b725ae77Skettenis fdata->offset = SIGNED_SHORT (op & ~3UL);
1083b725ae77Skettenis offset = fdata->offset;
1084b725ae77Skettenis continue;
1085b725ae77Skettenis }
1086b725ae77Skettenis else if ((op & 0xfc1f016a) == 0x7c01016a)
1087b725ae77Skettenis { /* stdux rX,r1,rY */
1088b725ae77Skettenis /* no way to figure out what r1 is going to be */
1089b725ae77Skettenis fdata->frameless = 0;
1090b725ae77Skettenis offset = fdata->offset;
1091b725ae77Skettenis continue;
1092b725ae77Skettenis }
1093e93f7393Sniklas /* Load up minimal toc pointer */
1094b725ae77Skettenis else if (((op >> 22) == 0x20f || /* l r31,... or l r30,... */
1095b725ae77Skettenis (op >> 22) == 0x3af) /* ld r31,... or ld r30,... */
1096b725ae77Skettenis && !minimal_toc_loaded)
1097b725ae77Skettenis {
1098e93f7393Sniklas minimal_toc_loaded = 1;
1099e93f7393Sniklas continue;
1100e93f7393Sniklas
1101b725ae77Skettenis /* move parameters from argument registers to local variable
1102b725ae77Skettenis registers */
1103b725ae77Skettenis }
1104b725ae77Skettenis else if ((op & 0xfc0007fe) == 0x7c000378 && /* mr(.) Rx,Ry */
1105b725ae77Skettenis (((op >> 21) & 31) >= 3) && /* R3 >= Ry >= R10 */
1106b725ae77Skettenis (((op >> 21) & 31) <= 10) &&
1107b725ae77Skettenis ((long) ((op >> 16) & 31) >= fdata->saved_gpr)) /* Rx: local var reg */
1108b725ae77Skettenis {
1109b725ae77Skettenis continue;
1110b725ae77Skettenis
1111e93f7393Sniklas /* store parameters in stack */
1112b725ae77Skettenis }
1113*63addd46Skettenis /* Move parameters from argument registers to temporary register. */
1114*63addd46Skettenis else if (store_param_on_stack_p (op, framep, &r0_contains_arg))
1115b725ae77Skettenis {
1116e93f7393Sniklas continue;
1117e93f7393Sniklas
1118e93f7393Sniklas /* Set up frame pointer */
1119b725ae77Skettenis }
1120b725ae77Skettenis else if (op == 0x603f0000 /* oril r31, r1, 0x0 */
1121b725ae77Skettenis || op == 0x7c3f0b78)
1122b725ae77Skettenis { /* mr r31, r1 */
1123e93f7393Sniklas fdata->frameless = 0;
1124e93f7393Sniklas framep = 1;
1125b725ae77Skettenis fdata->alloca_reg = (tdep->ppc_gp0_regnum + 31);
1126e93f7393Sniklas continue;
1127e93f7393Sniklas
1128e93f7393Sniklas /* Another way to set up the frame pointer. */
1129b725ae77Skettenis }
1130b725ae77Skettenis else if ((op & 0xfc1fffff) == 0x38010000)
1131b725ae77Skettenis { /* addi rX, r1, 0x0 */
1132e93f7393Sniklas fdata->frameless = 0;
1133e93f7393Sniklas framep = 1;
1134b725ae77Skettenis fdata->alloca_reg = (tdep->ppc_gp0_regnum
1135b725ae77Skettenis + ((op & ~0x38010000) >> 21));
1136e93f7393Sniklas continue;
1137b725ae77Skettenis }
1138b725ae77Skettenis /* AltiVec related instructions. */
1139b725ae77Skettenis /* Store the vrsave register (spr 256) in another register for
1140b725ae77Skettenis later manipulation, or load a register into the vrsave
1141b725ae77Skettenis register. 2 instructions are used: mfvrsave and
1142b725ae77Skettenis mtvrsave. They are shorthand notation for mfspr Rn, SPR256
1143b725ae77Skettenis and mtspr SPR256, Rn. */
1144b725ae77Skettenis /* mfspr Rn SPR256 == 011111 nnnnn 0000001000 01010100110
1145b725ae77Skettenis mtspr SPR256 Rn == 011111 nnnnn 0000001000 01110100110 */
1146b725ae77Skettenis else if ((op & 0xfc1fffff) == 0x7c0042a6) /* mfvrsave Rn */
1147b725ae77Skettenis {
1148b725ae77Skettenis vrsave_reg = GET_SRC_REG (op);
1149b725ae77Skettenis continue;
1150b725ae77Skettenis }
1151b725ae77Skettenis else if ((op & 0xfc1fffff) == 0x7c0043a6) /* mtvrsave Rn */
1152b725ae77Skettenis {
1153b725ae77Skettenis continue;
1154b725ae77Skettenis }
1155b725ae77Skettenis /* Store the register where vrsave was saved to onto the stack:
1156b725ae77Skettenis rS is the register where vrsave was stored in a previous
1157b725ae77Skettenis instruction. */
1158b725ae77Skettenis /* 100100 sssss 00001 dddddddd dddddddd */
1159b725ae77Skettenis else if ((op & 0xfc1f0000) == 0x90010000) /* stw rS, d(r1) */
1160b725ae77Skettenis {
1161b725ae77Skettenis if (vrsave_reg == GET_SRC_REG (op))
1162b725ae77Skettenis {
1163b725ae77Skettenis fdata->vrsave_offset = SIGNED_SHORT (op) + offset;
1164b725ae77Skettenis vrsave_reg = -1;
1165b725ae77Skettenis }
1166b725ae77Skettenis continue;
1167b725ae77Skettenis }
1168b725ae77Skettenis /* Compute the new value of vrsave, by modifying the register
1169b725ae77Skettenis where vrsave was saved to. */
1170b725ae77Skettenis else if (((op & 0xfc000000) == 0x64000000) /* oris Ra, Rs, UIMM */
1171b725ae77Skettenis || ((op & 0xfc000000) == 0x60000000))/* ori Ra, Rs, UIMM */
1172b725ae77Skettenis {
1173b725ae77Skettenis continue;
1174b725ae77Skettenis }
1175b725ae77Skettenis /* li r0, SIMM (short for addi r0, 0, SIMM). This is the first
1176b725ae77Skettenis in a pair of insns to save the vector registers on the
1177b725ae77Skettenis stack. */
1178b725ae77Skettenis /* 001110 00000 00000 iiii iiii iiii iiii */
1179b725ae77Skettenis /* 001110 01110 00000 iiii iiii iiii iiii */
1180b725ae77Skettenis else if ((op & 0xffff0000) == 0x38000000 /* li r0, SIMM */
1181b725ae77Skettenis || (op & 0xffff0000) == 0x39c00000) /* li r14, SIMM */
1182b725ae77Skettenis {
1183*63addd46Skettenis if ((op & 0xffff0000) == 0x38000000)
1184*63addd46Skettenis r0_contains_arg = 0;
1185b725ae77Skettenis li_found_pc = pc;
1186b725ae77Skettenis vr_saved_offset = SIGNED_SHORT (op);
1187*63addd46Skettenis
1188*63addd46Skettenis /* This insn by itself is not part of the prologue, unless
1189*63addd46Skettenis if part of the pair of insns mentioned above. So do not
1190*63addd46Skettenis record this insn as part of the prologue yet. */
1191*63addd46Skettenis prev_insn_was_prologue_insn = 0;
1192b725ae77Skettenis }
1193b725ae77Skettenis /* Store vector register S at (r31+r0) aligned to 16 bytes. */
1194b725ae77Skettenis /* 011111 sssss 11111 00000 00111001110 */
1195b725ae77Skettenis else if ((op & 0xfc1fffff) == 0x7c1f01ce) /* stvx Vs, R31, R0 */
1196b725ae77Skettenis {
1197b725ae77Skettenis if (pc == (li_found_pc + 4))
1198b725ae77Skettenis {
1199b725ae77Skettenis vr_reg = GET_SRC_REG (op);
1200b725ae77Skettenis /* If this is the first vector reg to be saved, or if
1201b725ae77Skettenis it has a lower number than others previously seen,
1202b725ae77Skettenis reupdate the frame info. */
1203b725ae77Skettenis if (fdata->saved_vr == -1 || fdata->saved_vr > vr_reg)
1204b725ae77Skettenis {
1205b725ae77Skettenis fdata->saved_vr = vr_reg;
1206b725ae77Skettenis fdata->vr_offset = vr_saved_offset + offset;
1207b725ae77Skettenis }
1208b725ae77Skettenis vr_saved_offset = -1;
1209b725ae77Skettenis vr_reg = -1;
1210b725ae77Skettenis li_found_pc = 0;
1211b725ae77Skettenis }
1212b725ae77Skettenis }
1213b725ae77Skettenis /* End AltiVec related instructions. */
1214e93f7393Sniklas
1215b725ae77Skettenis /* Start BookE related instructions. */
1216b725ae77Skettenis /* Store gen register S at (r31+uimm).
1217b725ae77Skettenis Any register less than r13 is volatile, so we don't care. */
1218b725ae77Skettenis /* 000100 sssss 11111 iiiii 01100100001 */
1219b725ae77Skettenis else if (arch_info->mach == bfd_mach_ppc_e500
1220b725ae77Skettenis && (op & 0xfc1f07ff) == 0x101f0321) /* evstdd Rs,uimm(R31) */
1221b725ae77Skettenis {
1222b725ae77Skettenis if ((op & 0x03e00000) >= 0x01a00000) /* Rs >= r13 */
1223b725ae77Skettenis {
1224b725ae77Skettenis unsigned int imm;
1225b725ae77Skettenis ev_reg = GET_SRC_REG (op);
1226b725ae77Skettenis imm = (op >> 11) & 0x1f;
1227b725ae77Skettenis ev_offset = imm * 8;
1228b725ae77Skettenis /* If this is the first vector reg to be saved, or if
1229b725ae77Skettenis it has a lower number than others previously seen,
1230b725ae77Skettenis reupdate the frame info. */
1231b725ae77Skettenis if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
1232b725ae77Skettenis {
1233b725ae77Skettenis fdata->saved_ev = ev_reg;
1234b725ae77Skettenis fdata->ev_offset = ev_offset + offset;
1235b725ae77Skettenis }
1236b725ae77Skettenis }
1237b725ae77Skettenis continue;
1238b725ae77Skettenis }
1239b725ae77Skettenis /* Store gen register rS at (r1+rB). */
1240b725ae77Skettenis /* 000100 sssss 00001 bbbbb 01100100000 */
1241b725ae77Skettenis else if (arch_info->mach == bfd_mach_ppc_e500
1242b725ae77Skettenis && (op & 0xffe007ff) == 0x13e00320) /* evstddx RS,R1,Rb */
1243b725ae77Skettenis {
1244b725ae77Skettenis if (pc == (li_found_pc + 4))
1245b725ae77Skettenis {
1246b725ae77Skettenis ev_reg = GET_SRC_REG (op);
1247b725ae77Skettenis /* If this is the first vector reg to be saved, or if
1248b725ae77Skettenis it has a lower number than others previously seen,
1249b725ae77Skettenis reupdate the frame info. */
1250b725ae77Skettenis /* We know the contents of rB from the previous instruction. */
1251b725ae77Skettenis if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
1252b725ae77Skettenis {
1253b725ae77Skettenis fdata->saved_ev = ev_reg;
1254b725ae77Skettenis fdata->ev_offset = vr_saved_offset + offset;
1255b725ae77Skettenis }
1256b725ae77Skettenis vr_saved_offset = -1;
1257b725ae77Skettenis ev_reg = -1;
1258b725ae77Skettenis li_found_pc = 0;
1259b725ae77Skettenis }
1260b725ae77Skettenis continue;
1261b725ae77Skettenis }
1262b725ae77Skettenis /* Store gen register r31 at (rA+uimm). */
1263b725ae77Skettenis /* 000100 11111 aaaaa iiiii 01100100001 */
1264b725ae77Skettenis else if (arch_info->mach == bfd_mach_ppc_e500
1265b725ae77Skettenis && (op & 0xffe007ff) == 0x13e00321) /* evstdd R31,Ra,UIMM */
1266b725ae77Skettenis {
1267b725ae77Skettenis /* Wwe know that the source register is 31 already, but
1268b725ae77Skettenis it can't hurt to compute it. */
1269b725ae77Skettenis ev_reg = GET_SRC_REG (op);
1270b725ae77Skettenis ev_offset = ((op >> 11) & 0x1f) * 8;
1271b725ae77Skettenis /* If this is the first vector reg to be saved, or if
1272b725ae77Skettenis it has a lower number than others previously seen,
1273b725ae77Skettenis reupdate the frame info. */
1274b725ae77Skettenis if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
1275b725ae77Skettenis {
1276b725ae77Skettenis fdata->saved_ev = ev_reg;
1277b725ae77Skettenis fdata->ev_offset = ev_offset + offset;
1278b725ae77Skettenis }
1279b725ae77Skettenis
1280b725ae77Skettenis continue;
1281b725ae77Skettenis }
1282b725ae77Skettenis /* Store gen register S at (r31+r0).
1283b725ae77Skettenis Store param on stack when offset from SP bigger than 4 bytes. */
1284b725ae77Skettenis /* 000100 sssss 11111 00000 01100100000 */
1285b725ae77Skettenis else if (arch_info->mach == bfd_mach_ppc_e500
1286b725ae77Skettenis && (op & 0xfc1fffff) == 0x101f0320) /* evstddx Rs,R31,R0 */
1287b725ae77Skettenis {
1288b725ae77Skettenis if (pc == (li_found_pc + 4))
1289b725ae77Skettenis {
1290b725ae77Skettenis if ((op & 0x03e00000) >= 0x01a00000)
1291b725ae77Skettenis {
1292b725ae77Skettenis ev_reg = GET_SRC_REG (op);
1293b725ae77Skettenis /* If this is the first vector reg to be saved, or if
1294b725ae77Skettenis it has a lower number than others previously seen,
1295b725ae77Skettenis reupdate the frame info. */
1296b725ae77Skettenis /* We know the contents of r0 from the previous
1297b725ae77Skettenis instruction. */
1298b725ae77Skettenis if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
1299b725ae77Skettenis {
1300b725ae77Skettenis fdata->saved_ev = ev_reg;
1301b725ae77Skettenis fdata->ev_offset = vr_saved_offset + offset;
1302b725ae77Skettenis }
1303b725ae77Skettenis ev_reg = -1;
1304b725ae77Skettenis }
1305b725ae77Skettenis vr_saved_offset = -1;
1306b725ae77Skettenis li_found_pc = 0;
1307b725ae77Skettenis continue;
1308b725ae77Skettenis }
1309b725ae77Skettenis }
1310b725ae77Skettenis /* End BookE related instructions. */
1311b725ae77Skettenis
1312b725ae77Skettenis else
1313b725ae77Skettenis {
1314b725ae77Skettenis /* Not a recognized prologue instruction.
1315b725ae77Skettenis Handle optimizer code motions into the prologue by continuing
1316b725ae77Skettenis the search if we have no valid frame yet or if the return
1317b725ae77Skettenis address is not yet saved in the frame. */
1318b725ae77Skettenis if (fdata->frameless == 0
1319b725ae77Skettenis && (lr_reg == -1 || fdata->nosavedpc == 0))
1320e93f7393Sniklas break;
1321b725ae77Skettenis
1322b725ae77Skettenis if (op == 0x4e800020 /* blr */
1323b725ae77Skettenis || op == 0x4e800420) /* bctr */
1324b725ae77Skettenis /* Do not scan past epilogue in frameless functions or
1325b725ae77Skettenis trampolines. */
1326b725ae77Skettenis break;
1327b725ae77Skettenis if ((op & 0xf4000000) == 0x40000000) /* bxx */
1328b725ae77Skettenis /* Never skip branches. */
1329b725ae77Skettenis break;
1330b725ae77Skettenis
1331b725ae77Skettenis if (num_skip_non_prologue_insns++ > max_skip_non_prologue_insns)
1332b725ae77Skettenis /* Do not scan too many insns, scanning insns is expensive with
1333b725ae77Skettenis remote targets. */
1334b725ae77Skettenis break;
1335b725ae77Skettenis
1336b725ae77Skettenis /* Continue scanning. */
1337b725ae77Skettenis prev_insn_was_prologue_insn = 0;
1338b725ae77Skettenis continue;
1339e93f7393Sniklas }
1340e93f7393Sniklas }
1341e93f7393Sniklas
1342e93f7393Sniklas #if 0
1343e93f7393Sniklas /* I have problems with skipping over __main() that I need to address
1344e93f7393Sniklas * sometime. Previously, I used to use misc_function_vector which
1345e93f7393Sniklas * didn't work as well as I wanted to be. -MGO */
1346e93f7393Sniklas
1347e93f7393Sniklas /* If the first thing after skipping a prolog is a branch to a function,
1348e93f7393Sniklas this might be a call to an initializer in main(), introduced by gcc2.
1349e93f7393Sniklas We'd like to skip over it as well. Fortunately, xlc does some extra
1350e93f7393Sniklas work before calling a function right after a prologue, thus we can
1351e93f7393Sniklas single out such gcc2 behaviour. */
1352e93f7393Sniklas
1353e93f7393Sniklas
1354b725ae77Skettenis if ((op & 0xfc000001) == 0x48000001)
1355b725ae77Skettenis { /* bl foo, an initializer function? */
1356e93f7393Sniklas op = read_memory_integer (pc + 4, 4);
1357e93f7393Sniklas
1358b725ae77Skettenis if (op == 0x4def7b82)
1359b725ae77Skettenis { /* cror 0xf, 0xf, 0xf (nop) */
1360e93f7393Sniklas
1361b725ae77Skettenis /* Check and see if we are in main. If so, skip over this
1362b725ae77Skettenis initializer function as well. */
1363e93f7393Sniklas
1364e93f7393Sniklas tmp = find_pc_misc_function (pc);
1365b725ae77Skettenis if (tmp >= 0
1366b725ae77Skettenis && strcmp (misc_function_vector[tmp].name, main_name ()) == 0)
1367e93f7393Sniklas return pc + 8;
1368e93f7393Sniklas }
1369e93f7393Sniklas }
1370e93f7393Sniklas #endif /* 0 */
1371e93f7393Sniklas
1372e93f7393Sniklas fdata->offset = -fdata->offset;
1373b725ae77Skettenis return last_prologue_pc;
1374e93f7393Sniklas }
1375e93f7393Sniklas
1376e93f7393Sniklas
1377e93f7393Sniklas /*************************************************************************
1378b725ae77Skettenis Support for creating pushing a dummy frame into the stack, and popping
1379e93f7393Sniklas frames, etc.
1380e93f7393Sniklas *************************************************************************/
1381e93f7393Sniklas
1382e93f7393Sniklas
1383b725ae77Skettenis /* All the ABI's require 16 byte alignment. */
1384b725ae77Skettenis static CORE_ADDR
rs6000_frame_align(struct gdbarch * gdbarch,CORE_ADDR addr)1385b725ae77Skettenis rs6000_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
1386e93f7393Sniklas {
1387b725ae77Skettenis return (addr & -16);
1388e93f7393Sniklas }
1389e93f7393Sniklas
1390b725ae77Skettenis /* Pass the arguments in either registers, or in the stack. In RS/6000,
1391e93f7393Sniklas the first eight words of the argument list (that might be less than
1392e93f7393Sniklas eight parameters if some parameters occupy more than one word) are
1393b725ae77Skettenis passed in r3..r10 registers. float and double parameters are
1394e93f7393Sniklas passed in fpr's, in addition to that. Rest of the parameters if any
1395e93f7393Sniklas are passed in user stack. There might be cases in which half of the
1396e93f7393Sniklas parameter is copied into registers, the other half is pushed into
1397e93f7393Sniklas stack.
1398e93f7393Sniklas
1399b725ae77Skettenis Stack must be aligned on 64-bit boundaries when synthesizing
1400b725ae77Skettenis function calls.
1401b725ae77Skettenis
1402e93f7393Sniklas If the function is returning a structure, then the return address is passed
1403e93f7393Sniklas in r3, then the first 7 words of the parameters can be passed in registers,
1404e93f7393Sniklas starting from r4. */
1405e93f7393Sniklas
1406b725ae77Skettenis static CORE_ADDR
rs6000_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)1407*63addd46Skettenis rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
1408b725ae77Skettenis struct regcache *regcache, CORE_ADDR bp_addr,
1409b725ae77Skettenis int nargs, struct value **args, CORE_ADDR sp,
1410b725ae77Skettenis int struct_return, CORE_ADDR struct_addr)
1411e93f7393Sniklas {
1412b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1413e93f7393Sniklas int ii;
1414e93f7393Sniklas int len = 0;
1415e93f7393Sniklas int argno; /* current argument number */
1416e93f7393Sniklas int argbytes; /* current argument byte */
1417e93f7393Sniklas char tmp_buffer[50];
1418e93f7393Sniklas int f_argno = 0; /* current floating point argno */
1419b725ae77Skettenis int wordsize = gdbarch_tdep (current_gdbarch)->wordsize;
1420*63addd46Skettenis CORE_ADDR func_addr = find_function_addr (function, NULL);
1421b725ae77Skettenis
1422b725ae77Skettenis struct value *arg = 0;
1423e93f7393Sniklas struct type *type;
1424e93f7393Sniklas
1425e93f7393Sniklas CORE_ADDR saved_sp;
1426e93f7393Sniklas
1427*63addd46Skettenis /* The calling convention this function implements assumes the
1428*63addd46Skettenis processor has floating-point registers. We shouldn't be using it
1429*63addd46Skettenis on PPC variants that lack them. */
1430*63addd46Skettenis gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
1431*63addd46Skettenis
1432b725ae77Skettenis /* The first eight words of ther arguments are passed in registers.
1433b725ae77Skettenis Copy them appropriately. */
1434b725ae77Skettenis ii = 0;
1435e93f7393Sniklas
1436b725ae77Skettenis /* If the function is returning a `struct', then the first word
1437b725ae77Skettenis (which will be passed in r3) is used for struct return address.
1438b725ae77Skettenis In that case we should advance one word and start from r4
1439b725ae77Skettenis register to copy parameters. */
1440b725ae77Skettenis if (struct_return)
1441b725ae77Skettenis {
1442b725ae77Skettenis regcache_raw_write_unsigned (regcache, tdep->ppc_gp0_regnum + 3,
1443b725ae77Skettenis struct_addr);
1444b725ae77Skettenis ii++;
1445b725ae77Skettenis }
1446e93f7393Sniklas
1447b725ae77Skettenis /*
1448b725ae77Skettenis effectively indirect call... gcc does...
1449e93f7393Sniklas
1450b725ae77Skettenis return_val example( float, int);
1451e93f7393Sniklas
1452b725ae77Skettenis eabi:
1453b725ae77Skettenis float in fp0, int in r3
1454b725ae77Skettenis offset of stack on overflow 8/16
1455b725ae77Skettenis for varargs, must go by type.
1456b725ae77Skettenis power open:
1457b725ae77Skettenis float in r3&r4, int in r5
1458b725ae77Skettenis offset of stack on overflow different
1459b725ae77Skettenis both:
1460b725ae77Skettenis return in r3 or f0. If no float, must study how gcc emulates floats;
1461b725ae77Skettenis pay attention to arg promotion.
1462b725ae77Skettenis User may have to cast\args to handle promotion correctly
1463b725ae77Skettenis since gdb won't know if prototype supplied or not.
1464b725ae77Skettenis */
1465b725ae77Skettenis
1466b725ae77Skettenis for (argno = 0, argbytes = 0; argno < nargs && ii < 8; ++ii)
1467b725ae77Skettenis {
1468*63addd46Skettenis int reg_size = register_size (current_gdbarch, ii + 3);
1469e93f7393Sniklas
1470e93f7393Sniklas arg = args[argno];
1471e93f7393Sniklas type = check_typedef (VALUE_TYPE (arg));
1472e93f7393Sniklas len = TYPE_LENGTH (type);
1473e93f7393Sniklas
1474b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_FLT)
1475b725ae77Skettenis {
1476e93f7393Sniklas
1477b725ae77Skettenis /* Floating point arguments are passed in fpr's, as well as gpr's.
1478e93f7393Sniklas There are 13 fpr's reserved for passing parameters. At this point
1479e93f7393Sniklas there is no way we would run out of them. */
1480e93f7393Sniklas
1481*63addd46Skettenis gdb_assert (len <= 8);
1482e93f7393Sniklas
1483*63addd46Skettenis regcache_cooked_write (regcache,
1484*63addd46Skettenis tdep->ppc_fp0_regnum + 1 + f_argno,
1485*63addd46Skettenis VALUE_CONTENTS (arg));
1486e93f7393Sniklas ++f_argno;
1487e93f7393Sniklas }
1488e93f7393Sniklas
1489b725ae77Skettenis if (len > reg_size)
1490b725ae77Skettenis {
1491e93f7393Sniklas
1492e93f7393Sniklas /* Argument takes more than one register. */
1493b725ae77Skettenis while (argbytes < len)
1494b725ae77Skettenis {
1495*63addd46Skettenis char word[MAX_REGISTER_SIZE];
1496*63addd46Skettenis memset (word, 0, reg_size);
1497*63addd46Skettenis memcpy (word,
1498e93f7393Sniklas ((char *) VALUE_CONTENTS (arg)) + argbytes,
1499b725ae77Skettenis (len - argbytes) > reg_size
1500b725ae77Skettenis ? reg_size : len - argbytes);
1501*63addd46Skettenis regcache_cooked_write (regcache,
1502*63addd46Skettenis tdep->ppc_gp0_regnum + 3 + ii,
1503*63addd46Skettenis word);
1504b725ae77Skettenis ++ii, argbytes += reg_size;
1505e93f7393Sniklas
1506e93f7393Sniklas if (ii >= 8)
1507e93f7393Sniklas goto ran_out_of_registers_for_arguments;
1508e93f7393Sniklas }
1509e93f7393Sniklas argbytes = 0;
1510e93f7393Sniklas --ii;
1511e93f7393Sniklas }
1512b725ae77Skettenis else
1513b725ae77Skettenis {
1514b725ae77Skettenis /* Argument can fit in one register. No problem. */
1515b725ae77Skettenis int adj = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? reg_size - len : 0;
1516*63addd46Skettenis char word[MAX_REGISTER_SIZE];
1517*63addd46Skettenis
1518*63addd46Skettenis memset (word, 0, reg_size);
1519*63addd46Skettenis memcpy (word, VALUE_CONTENTS (arg), len);
1520*63addd46Skettenis regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3 +ii, word);
1521e93f7393Sniklas }
1522e93f7393Sniklas ++argno;
1523e93f7393Sniklas }
1524e93f7393Sniklas
1525e93f7393Sniklas ran_out_of_registers_for_arguments:
1526e93f7393Sniklas
1527b725ae77Skettenis saved_sp = read_sp ();
1528e93f7393Sniklas
1529b725ae77Skettenis /* Location for 8 parameters are always reserved. */
1530b725ae77Skettenis sp -= wordsize * 8;
1531e93f7393Sniklas
1532b725ae77Skettenis /* Another six words for back chain, TOC register, link register, etc. */
1533b725ae77Skettenis sp -= wordsize * 6;
1534b725ae77Skettenis
1535b725ae77Skettenis /* Stack pointer must be quadword aligned. */
1536b725ae77Skettenis sp &= -16;
1537b725ae77Skettenis
1538b725ae77Skettenis /* If there are more arguments, allocate space for them in
1539e93f7393Sniklas the stack, then push them starting from the ninth one. */
1540e93f7393Sniklas
1541b725ae77Skettenis if ((argno < nargs) || argbytes)
1542b725ae77Skettenis {
1543e93f7393Sniklas int space = 0, jj;
1544e93f7393Sniklas
1545b725ae77Skettenis if (argbytes)
1546b725ae77Skettenis {
1547e93f7393Sniklas space += ((len - argbytes + 3) & -4);
1548e93f7393Sniklas jj = argno + 1;
1549e93f7393Sniklas }
1550e93f7393Sniklas else
1551e93f7393Sniklas jj = argno;
1552e93f7393Sniklas
1553b725ae77Skettenis for (; jj < nargs; ++jj)
1554b725ae77Skettenis {
1555b725ae77Skettenis struct value *val = args[jj];
1556e93f7393Sniklas space += ((TYPE_LENGTH (VALUE_TYPE (val))) + 3) & -4;
1557e93f7393Sniklas }
1558e93f7393Sniklas
1559b725ae77Skettenis /* Add location required for the rest of the parameters. */
1560b725ae77Skettenis space = (space + 15) & -16;
1561e93f7393Sniklas sp -= space;
1562e93f7393Sniklas
1563b725ae77Skettenis /* This is another instance we need to be concerned about
1564b725ae77Skettenis securing our stack space. If we write anything underneath %sp
1565b725ae77Skettenis (r1), we might conflict with the kernel who thinks he is free
1566b725ae77Skettenis to use this area. So, update %sp first before doing anything
1567b725ae77Skettenis else. */
1568e93f7393Sniklas
1569b725ae77Skettenis regcache_raw_write_signed (regcache, SP_REGNUM, sp);
1570e93f7393Sniklas
1571b725ae77Skettenis /* If the last argument copied into the registers didn't fit there
1572e93f7393Sniklas completely, push the rest of it into stack. */
1573e93f7393Sniklas
1574b725ae77Skettenis if (argbytes)
1575b725ae77Skettenis {
1576b725ae77Skettenis write_memory (sp + 24 + (ii * 4),
1577b725ae77Skettenis ((char *) VALUE_CONTENTS (arg)) + argbytes,
1578b725ae77Skettenis len - argbytes);
1579e93f7393Sniklas ++argno;
1580e93f7393Sniklas ii += ((len - argbytes + 3) & -4) / 4;
1581e93f7393Sniklas }
1582e93f7393Sniklas
1583b725ae77Skettenis /* Push the rest of the arguments into stack. */
1584b725ae77Skettenis for (; argno < nargs; ++argno)
1585b725ae77Skettenis {
1586e93f7393Sniklas
1587e93f7393Sniklas arg = args[argno];
1588e93f7393Sniklas type = check_typedef (VALUE_TYPE (arg));
1589e93f7393Sniklas len = TYPE_LENGTH (type);
1590e93f7393Sniklas
1591e93f7393Sniklas
1592b725ae77Skettenis /* Float types should be passed in fpr's, as well as in the
1593b725ae77Skettenis stack. */
1594b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_FLT && f_argno < 13)
1595b725ae77Skettenis {
1596e93f7393Sniklas
1597*63addd46Skettenis gdb_assert (len <= 8);
1598e93f7393Sniklas
1599*63addd46Skettenis regcache_cooked_write (regcache,
1600*63addd46Skettenis tdep->ppc_fp0_regnum + 1 + f_argno,
1601*63addd46Skettenis VALUE_CONTENTS (arg));
1602e93f7393Sniklas ++f_argno;
1603e93f7393Sniklas }
1604e93f7393Sniklas
1605*63addd46Skettenis write_memory (sp + 24 + (ii * 4),
1606*63addd46Skettenis (char *) VALUE_CONTENTS (arg),
1607*63addd46Skettenis len);
1608e93f7393Sniklas ii += ((len + 3) & -4) / 4;
1609e93f7393Sniklas }
1610e93f7393Sniklas }
1611e93f7393Sniklas
1612b725ae77Skettenis /* Set the stack pointer. According to the ABI, the SP is meant to
1613b725ae77Skettenis be set _before_ the corresponding stack space is used. On AIX,
1614b725ae77Skettenis this even applies when the target has been completely stopped!
1615b725ae77Skettenis Not doing this can lead to conflicts with the kernel which thinks
1616b725ae77Skettenis that it still has control over this not-yet-allocated stack
1617b725ae77Skettenis region. */
1618b725ae77Skettenis regcache_raw_write_signed (regcache, SP_REGNUM, sp);
1619e93f7393Sniklas
1620b725ae77Skettenis /* Set back chain properly. */
1621b725ae77Skettenis store_unsigned_integer (tmp_buffer, 4, saved_sp);
1622e93f7393Sniklas write_memory (sp, tmp_buffer, 4);
1623e93f7393Sniklas
1624b725ae77Skettenis /* Point the inferior function call's return address at the dummy's
1625b725ae77Skettenis breakpoint. */
1626b725ae77Skettenis regcache_raw_write_signed (regcache, tdep->ppc_lr_regnum, bp_addr);
1627b725ae77Skettenis
1628b725ae77Skettenis /* Set the TOC register, get the value from the objfile reader
1629b725ae77Skettenis which, in turn, gets it from the VMAP table. */
1630b725ae77Skettenis if (rs6000_find_toc_address_hook != NULL)
1631b725ae77Skettenis {
1632b725ae77Skettenis CORE_ADDR tocvalue = (*rs6000_find_toc_address_hook) (func_addr);
1633b725ae77Skettenis regcache_raw_write_signed (regcache, tdep->ppc_toc_regnum, tocvalue);
1634b725ae77Skettenis }
1635b725ae77Skettenis
1636e93f7393Sniklas target_store_registers (-1);
1637e93f7393Sniklas return sp;
1638e93f7393Sniklas }
1639e93f7393Sniklas
1640b725ae77Skettenis /* PowerOpen always puts structures in memory. Vectors, which were
1641b725ae77Skettenis added later, do get returned in a register though. */
1642e93f7393Sniklas
1643b725ae77Skettenis static int
rs6000_use_struct_convention(int gcc_p,struct type * value_type)1644b725ae77Skettenis rs6000_use_struct_convention (int gcc_p, struct type *value_type)
1645b725ae77Skettenis {
1646b725ae77Skettenis if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8)
1647b725ae77Skettenis && TYPE_VECTOR (value_type))
1648b725ae77Skettenis return 0;
1649b725ae77Skettenis return 1;
1650b725ae77Skettenis }
1651b725ae77Skettenis
1652b725ae77Skettenis static void
rs6000_extract_return_value(struct type * valtype,char * regbuf,char * valbuf)1653b725ae77Skettenis rs6000_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
1654e93f7393Sniklas {
1655e93f7393Sniklas int offset = 0;
1656b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1657e93f7393Sniklas
1658*63addd46Skettenis /* The calling convention this function implements assumes the
1659*63addd46Skettenis processor has floating-point registers. We shouldn't be using it
1660*63addd46Skettenis on PPC variants that lack them. */
1661*63addd46Skettenis gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
1662*63addd46Skettenis
1663b725ae77Skettenis if (TYPE_CODE (valtype) == TYPE_CODE_FLT)
1664b725ae77Skettenis {
1665e93f7393Sniklas
1666e93f7393Sniklas /* floats and doubles are returned in fpr1. fpr's have a size of 8 bytes.
1667e93f7393Sniklas We need to truncate the return value into float size (4 byte) if
1668e93f7393Sniklas necessary. */
1669e93f7393Sniklas
1670*63addd46Skettenis convert_typed_floating (®buf[DEPRECATED_REGISTER_BYTE
1671*63addd46Skettenis (tdep->ppc_fp0_regnum + 1)],
1672*63addd46Skettenis builtin_type_double,
1673*63addd46Skettenis valbuf,
1674*63addd46Skettenis valtype);
1675e93f7393Sniklas }
1676b725ae77Skettenis else if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY
1677b725ae77Skettenis && TYPE_LENGTH (valtype) == 16
1678b725ae77Skettenis && TYPE_VECTOR (valtype))
1679b725ae77Skettenis {
1680b725ae77Skettenis memcpy (valbuf, regbuf + DEPRECATED_REGISTER_BYTE (tdep->ppc_vr0_regnum + 2),
1681b725ae77Skettenis TYPE_LENGTH (valtype));
1682b725ae77Skettenis }
1683b725ae77Skettenis else
1684b725ae77Skettenis {
1685e93f7393Sniklas /* return value is copied starting from r3. */
1686b725ae77Skettenis if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
1687*63addd46Skettenis && TYPE_LENGTH (valtype) < register_size (current_gdbarch, 3))
1688*63addd46Skettenis offset = register_size (current_gdbarch, 3) - TYPE_LENGTH (valtype);
1689e93f7393Sniklas
1690b725ae77Skettenis memcpy (valbuf,
1691b725ae77Skettenis regbuf + DEPRECATED_REGISTER_BYTE (3) + offset,
1692e93f7393Sniklas TYPE_LENGTH (valtype));
1693e93f7393Sniklas }
1694e93f7393Sniklas }
1695e93f7393Sniklas
1696b725ae77Skettenis /* Return whether handle_inferior_event() should proceed through code
1697b725ae77Skettenis starting at PC in function NAME when stepping.
1698e93f7393Sniklas
1699b725ae77Skettenis The AIX -bbigtoc linker option generates functions @FIX0, @FIX1, etc. to
1700b725ae77Skettenis handle memory references that are too distant to fit in instructions
1701b725ae77Skettenis generated by the compiler. For example, if 'foo' in the following
1702b725ae77Skettenis instruction:
1703e93f7393Sniklas
1704b725ae77Skettenis lwz r9,foo(r2)
1705e93f7393Sniklas
1706b725ae77Skettenis is greater than 32767, the linker might replace the lwz with a branch to
1707b725ae77Skettenis somewhere in @FIX1 that does the load in 2 instructions and then branches
1708b725ae77Skettenis back to where execution should continue.
1709e93f7393Sniklas
1710b725ae77Skettenis GDB should silently step over @FIX code, just like AIX dbx does.
1711b725ae77Skettenis Unfortunately, the linker uses the "b" instruction for the branches,
1712b725ae77Skettenis meaning that the link register doesn't get set. Therefore, GDB's usual
1713b725ae77Skettenis step_over_function() mechanism won't work.
1714b725ae77Skettenis
1715b725ae77Skettenis Instead, use the IN_SOLIB_RETURN_TRAMPOLINE and SKIP_TRAMPOLINE_CODE hooks
1716b725ae77Skettenis in handle_inferior_event() to skip past @FIX code. */
1717b725ae77Skettenis
1718b725ae77Skettenis int
rs6000_in_solib_return_trampoline(CORE_ADDR pc,char * name)1719b725ae77Skettenis rs6000_in_solib_return_trampoline (CORE_ADDR pc, char *name)
1720b725ae77Skettenis {
1721b725ae77Skettenis return name && !strncmp (name, "@FIX", 4);
1722b725ae77Skettenis }
1723b725ae77Skettenis
1724b725ae77Skettenis /* Skip code that the user doesn't want to see when stepping:
1725b725ae77Skettenis
1726b725ae77Skettenis 1. Indirect function calls use a piece of trampoline code to do context
1727e93f7393Sniklas switching, i.e. to set the new TOC table. Skip such code if we are on
1728e93f7393Sniklas its first instruction (as when we have single-stepped to here).
1729b725ae77Skettenis
1730b725ae77Skettenis 2. Skip shared library trampoline code (which is different from
1731e93f7393Sniklas indirect function call trampolines).
1732b725ae77Skettenis
1733b725ae77Skettenis 3. Skip bigtoc fixup code.
1734b725ae77Skettenis
1735e93f7393Sniklas Result is desired PC to step until, or NULL if we are not in
1736b725ae77Skettenis code that should be skipped. */
1737e93f7393Sniklas
1738e93f7393Sniklas CORE_ADDR
rs6000_skip_trampoline_code(CORE_ADDR pc)1739b725ae77Skettenis rs6000_skip_trampoline_code (CORE_ADDR pc)
1740e93f7393Sniklas {
1741b725ae77Skettenis unsigned int ii, op;
1742b725ae77Skettenis int rel;
1743e93f7393Sniklas CORE_ADDR solib_target_pc;
1744b725ae77Skettenis struct minimal_symbol *msymbol;
1745e93f7393Sniklas
1746b725ae77Skettenis static unsigned trampoline_code[] =
1747b725ae77Skettenis {
1748e93f7393Sniklas 0x800b0000, /* l r0,0x0(r11) */
1749e93f7393Sniklas 0x90410014, /* st r2,0x14(r1) */
1750e93f7393Sniklas 0x7c0903a6, /* mtctr r0 */
1751e93f7393Sniklas 0x804b0004, /* l r2,0x4(r11) */
1752e93f7393Sniklas 0x816b0008, /* l r11,0x8(r11) */
1753e93f7393Sniklas 0x4e800420, /* bctr */
1754e93f7393Sniklas 0x4e800020, /* br */
1755e93f7393Sniklas 0
1756e93f7393Sniklas };
1757e93f7393Sniklas
1758b725ae77Skettenis /* Check for bigtoc fixup code. */
1759b725ae77Skettenis msymbol = lookup_minimal_symbol_by_pc (pc);
1760b725ae77Skettenis if (msymbol && rs6000_in_solib_return_trampoline (pc, DEPRECATED_SYMBOL_NAME (msymbol)))
1761b725ae77Skettenis {
1762b725ae77Skettenis /* Double-check that the third instruction from PC is relative "b". */
1763b725ae77Skettenis op = read_memory_integer (pc + 8, 4);
1764b725ae77Skettenis if ((op & 0xfc000003) == 0x48000000)
1765b725ae77Skettenis {
1766b725ae77Skettenis /* Extract bits 6-29 as a signed 24-bit relative word address and
1767b725ae77Skettenis add it to the containing PC. */
1768b725ae77Skettenis rel = ((int)(op << 6) >> 6);
1769b725ae77Skettenis return pc + 8 + rel;
1770b725ae77Skettenis }
1771b725ae77Skettenis }
1772b725ae77Skettenis
1773e93f7393Sniklas /* If pc is in a shared library trampoline, return its target. */
1774e93f7393Sniklas solib_target_pc = find_solib_trampoline_target (pc);
1775e93f7393Sniklas if (solib_target_pc)
1776e93f7393Sniklas return solib_target_pc;
1777e93f7393Sniklas
1778b725ae77Skettenis for (ii = 0; trampoline_code[ii]; ++ii)
1779b725ae77Skettenis {
1780e93f7393Sniklas op = read_memory_integer (pc + (ii * 4), 4);
1781e93f7393Sniklas if (op != trampoline_code[ii])
1782e93f7393Sniklas return 0;
1783e93f7393Sniklas }
1784e93f7393Sniklas ii = read_register (11); /* r11 holds destination addr */
1785b725ae77Skettenis pc = read_memory_addr (ii, gdbarch_tdep (current_gdbarch)->wordsize); /* (r11) value */
1786e93f7393Sniklas return pc;
1787e93f7393Sniklas }
1788e93f7393Sniklas
1789b725ae77Skettenis /* Return the size of register REG when words are WORDSIZE bytes long. If REG
1790b725ae77Skettenis isn't available with that word size, return 0. */
1791e93f7393Sniklas
1792b725ae77Skettenis static int
regsize(const struct reg * reg,int wordsize)1793b725ae77Skettenis regsize (const struct reg *reg, int wordsize)
1794e93f7393Sniklas {
1795b725ae77Skettenis return wordsize == 8 ? reg->sz64 : reg->sz32;
1796e93f7393Sniklas }
1797e93f7393Sniklas
1798b725ae77Skettenis /* Return the name of register number N, or null if no such register exists
1799b725ae77Skettenis in the current architecture. */
1800e93f7393Sniklas
1801b725ae77Skettenis static const char *
rs6000_register_name(int n)1802b725ae77Skettenis rs6000_register_name (int n)
1803e93f7393Sniklas {
1804b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1805b725ae77Skettenis const struct reg *reg = tdep->regs + n;
1806b725ae77Skettenis
1807b725ae77Skettenis if (!regsize (reg, tdep->wordsize))
1808b725ae77Skettenis return NULL;
1809b725ae77Skettenis return reg->name;
1810e93f7393Sniklas }
1811e93f7393Sniklas
1812b725ae77Skettenis /* Return the GDB type object for the "standard" data type
1813b725ae77Skettenis of data in register N. */
1814e93f7393Sniklas
1815b725ae77Skettenis static struct type *
rs6000_register_type(struct gdbarch * gdbarch,int n)1816*63addd46Skettenis rs6000_register_type (struct gdbarch *gdbarch, int n)
1817b725ae77Skettenis {
1818*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1819b725ae77Skettenis const struct reg *reg = tdep->regs + n;
1820b725ae77Skettenis
1821b725ae77Skettenis if (reg->fpr)
1822b725ae77Skettenis return builtin_type_double;
1823b725ae77Skettenis else
1824b725ae77Skettenis {
1825b725ae77Skettenis int size = regsize (reg, tdep->wordsize);
1826b725ae77Skettenis switch (size)
1827b725ae77Skettenis {
1828b725ae77Skettenis case 0:
1829b725ae77Skettenis return builtin_type_int0;
1830b725ae77Skettenis case 4:
1831*63addd46Skettenis return builtin_type_uint32;
1832b725ae77Skettenis case 8:
1833b725ae77Skettenis if (tdep->ppc_ev0_regnum <= n && n <= tdep->ppc_ev31_regnum)
1834b725ae77Skettenis return builtin_type_vec64;
1835b725ae77Skettenis else
1836*63addd46Skettenis return builtin_type_uint64;
1837b725ae77Skettenis break;
1838b725ae77Skettenis case 16:
1839b725ae77Skettenis return builtin_type_vec128;
1840b725ae77Skettenis break;
1841b725ae77Skettenis default:
1842b725ae77Skettenis internal_error (__FILE__, __LINE__, "Register %d size %d unknown",
1843b725ae77Skettenis n, size);
1844b725ae77Skettenis }
1845b725ae77Skettenis }
1846b725ae77Skettenis }
1847b725ae77Skettenis
1848*63addd46Skettenis /* The register format for RS/6000 floating point registers is always
1849b725ae77Skettenis double, we need a conversion if the memory format is float. */
1850b725ae77Skettenis
1851b725ae77Skettenis static int
rs6000_convert_register_p(int regnum,struct type * type)1852*63addd46Skettenis rs6000_convert_register_p (int regnum, struct type *type)
1853b725ae77Skettenis {
1854*63addd46Skettenis const struct reg *reg = gdbarch_tdep (current_gdbarch)->regs + regnum;
1855b725ae77Skettenis
1856*63addd46Skettenis return (reg->fpr
1857*63addd46Skettenis && TYPE_CODE (type) == TYPE_CODE_FLT
1858*63addd46Skettenis && TYPE_LENGTH (type) != TYPE_LENGTH (builtin_type_double));
1859*63addd46Skettenis }
1860b725ae77Skettenis
1861b725ae77Skettenis static void
rs6000_register_to_value(struct frame_info * frame,int regnum,struct type * type,void * to)1862*63addd46Skettenis rs6000_register_to_value (struct frame_info *frame,
1863*63addd46Skettenis int regnum,
1864*63addd46Skettenis struct type *type,
1865*63addd46Skettenis void *to)
1866b725ae77Skettenis {
1867*63addd46Skettenis const struct reg *reg = gdbarch_tdep (current_gdbarch)->regs + regnum;
1868*63addd46Skettenis char from[MAX_REGISTER_SIZE];
1869b725ae77Skettenis
1870*63addd46Skettenis gdb_assert (reg->fpr);
1871*63addd46Skettenis gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
1872*63addd46Skettenis
1873*63addd46Skettenis get_frame_register (frame, regnum, from);
1874*63addd46Skettenis convert_typed_floating (from, builtin_type_double, to, type);
1875*63addd46Skettenis }
1876b725ae77Skettenis
1877b725ae77Skettenis static void
rs6000_value_to_register(struct frame_info * frame,int regnum,struct type * type,const void * from)1878*63addd46Skettenis rs6000_value_to_register (struct frame_info *frame,
1879*63addd46Skettenis int regnum,
1880*63addd46Skettenis struct type *type,
1881*63addd46Skettenis const void *from)
1882b725ae77Skettenis {
1883*63addd46Skettenis const struct reg *reg = gdbarch_tdep (current_gdbarch)->regs + regnum;
1884*63addd46Skettenis char to[MAX_REGISTER_SIZE];
1885*63addd46Skettenis
1886*63addd46Skettenis gdb_assert (reg->fpr);
1887*63addd46Skettenis gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
1888*63addd46Skettenis
1889*63addd46Skettenis convert_typed_floating (from, type, to, builtin_type_double);
1890*63addd46Skettenis put_frame_register (frame, regnum, to);
1891*63addd46Skettenis }
1892*63addd46Skettenis
1893*63addd46Skettenis /* Move SPE vector register values between a 64-bit buffer and the two
1894*63addd46Skettenis 32-bit raw register halves in a regcache. This function handles
1895*63addd46Skettenis both splitting a 64-bit value into two 32-bit halves, and joining
1896*63addd46Skettenis two halves into a whole 64-bit value, depending on the function
1897*63addd46Skettenis passed as the MOVE argument.
1898*63addd46Skettenis
1899*63addd46Skettenis EV_REG must be the number of an SPE evN vector register --- a
1900*63addd46Skettenis pseudoregister. REGCACHE must be a regcache, and BUFFER must be a
1901*63addd46Skettenis 64-bit buffer.
1902*63addd46Skettenis
1903*63addd46Skettenis Call MOVE once for each 32-bit half of that register, passing
1904*63addd46Skettenis REGCACHE, the number of the raw register corresponding to that
1905*63addd46Skettenis half, and the address of the appropriate half of BUFFER.
1906*63addd46Skettenis
1907*63addd46Skettenis For example, passing 'regcache_raw_read' as the MOVE function will
1908*63addd46Skettenis fill BUFFER with the full 64-bit contents of EV_REG. Or, passing
1909*63addd46Skettenis 'regcache_raw_supply' will supply the contents of BUFFER to the
1910*63addd46Skettenis appropriate pair of raw registers in REGCACHE.
1911*63addd46Skettenis
1912*63addd46Skettenis You may need to cast away some 'const' qualifiers when passing
1913*63addd46Skettenis MOVE, since this function can't tell at compile-time which of
1914*63addd46Skettenis REGCACHE or BUFFER is acting as the source of the data. If C had
1915*63addd46Skettenis co-variant type qualifiers, ... */
1916*63addd46Skettenis static void
e500_move_ev_register(void (* move)(struct regcache * regcache,int regnum,void * buf),struct regcache * regcache,int ev_reg,void * buffer)1917*63addd46Skettenis e500_move_ev_register (void (*move) (struct regcache *regcache,
1918*63addd46Skettenis int regnum, void *buf),
1919*63addd46Skettenis struct regcache *regcache, int ev_reg,
1920*63addd46Skettenis void *buffer)
1921b725ae77Skettenis {
1922*63addd46Skettenis struct gdbarch *arch = get_regcache_arch (regcache);
1923*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
1924*63addd46Skettenis int reg_index;
1925*63addd46Skettenis char *byte_buffer = buffer;
1926*63addd46Skettenis
1927*63addd46Skettenis gdb_assert (tdep->ppc_ev0_regnum <= ev_reg
1928*63addd46Skettenis && ev_reg < tdep->ppc_ev0_regnum + ppc_num_gprs);
1929*63addd46Skettenis
1930*63addd46Skettenis reg_index = ev_reg - tdep->ppc_ev0_regnum;
1931*63addd46Skettenis
1932*63addd46Skettenis if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1933*63addd46Skettenis {
1934*63addd46Skettenis move (regcache, tdep->ppc_ev0_upper_regnum + reg_index, byte_buffer);
1935*63addd46Skettenis move (regcache, tdep->ppc_gp0_regnum + reg_index, byte_buffer + 4);
1936b725ae77Skettenis }
1937b725ae77Skettenis else
1938*63addd46Skettenis {
1939*63addd46Skettenis move (regcache, tdep->ppc_gp0_regnum + reg_index, byte_buffer);
1940*63addd46Skettenis move (regcache, tdep->ppc_ev0_upper_regnum + reg_index, byte_buffer + 4);
1941*63addd46Skettenis }
1942b725ae77Skettenis }
1943b725ae77Skettenis
1944b725ae77Skettenis static void
e500_pseudo_register_read(struct gdbarch * gdbarch,struct regcache * regcache,int reg_nr,void * buffer)1945b725ae77Skettenis e500_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
1946b725ae77Skettenis int reg_nr, void *buffer)
1947b725ae77Skettenis {
1948*63addd46Skettenis struct gdbarch *regcache_arch = get_regcache_arch (regcache);
1949b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1950b725ae77Skettenis
1951*63addd46Skettenis gdb_assert (regcache_arch == gdbarch);
1952b725ae77Skettenis
1953*63addd46Skettenis if (tdep->ppc_ev0_regnum <= reg_nr
1954*63addd46Skettenis && reg_nr < tdep->ppc_ev0_regnum + ppc_num_gprs)
1955*63addd46Skettenis e500_move_ev_register (regcache_raw_read, regcache, reg_nr, buffer);
1956*63addd46Skettenis else
1957*63addd46Skettenis internal_error (__FILE__, __LINE__,
1958*63addd46Skettenis "e500_pseudo_register_read: "
1959*63addd46Skettenis "called on unexpected register '%s' (%d)",
1960*63addd46Skettenis gdbarch_register_name (gdbarch, reg_nr), reg_nr);
1961b725ae77Skettenis }
1962b725ae77Skettenis
1963b725ae77Skettenis static void
e500_pseudo_register_write(struct gdbarch * gdbarch,struct regcache * regcache,int reg_nr,const void * buffer)1964b725ae77Skettenis e500_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
1965b725ae77Skettenis int reg_nr, const void *buffer)
1966b725ae77Skettenis {
1967*63addd46Skettenis struct gdbarch *regcache_arch = get_regcache_arch (regcache);
1968b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1969b725ae77Skettenis
1970*63addd46Skettenis gdb_assert (regcache_arch == gdbarch);
1971b725ae77Skettenis
1972*63addd46Skettenis if (tdep->ppc_ev0_regnum <= reg_nr
1973*63addd46Skettenis && reg_nr < tdep->ppc_ev0_regnum + ppc_num_gprs)
1974*63addd46Skettenis e500_move_ev_register ((void (*) (struct regcache *, int, void *))
1975*63addd46Skettenis regcache_raw_write,
1976*63addd46Skettenis regcache, reg_nr, (void *) buffer);
1977b725ae77Skettenis else
1978*63addd46Skettenis internal_error (__FILE__, __LINE__,
1979*63addd46Skettenis "e500_pseudo_register_read: "
1980*63addd46Skettenis "called on unexpected register '%s' (%d)",
1981*63addd46Skettenis gdbarch_register_name (gdbarch, reg_nr), reg_nr);
1982b725ae77Skettenis }
1983b725ae77Skettenis
1984*63addd46Skettenis /* The E500 needs a custom reggroup function: it has anonymous raw
1985*63addd46Skettenis registers, and default_register_reggroup_p assumes that anonymous
1986*63addd46Skettenis registers are not members of any reggroup. */
1987*63addd46Skettenis static int
e500_register_reggroup_p(struct gdbarch * gdbarch,int regnum,struct reggroup * group)1988*63addd46Skettenis e500_register_reggroup_p (struct gdbarch *gdbarch,
1989*63addd46Skettenis int regnum,
1990*63addd46Skettenis struct reggroup *group)
1991*63addd46Skettenis {
1992*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1993*63addd46Skettenis
1994*63addd46Skettenis /* The save and restore register groups need to include the
1995*63addd46Skettenis upper-half registers, even though they're anonymous. */
1996*63addd46Skettenis if ((group == save_reggroup
1997*63addd46Skettenis || group == restore_reggroup)
1998*63addd46Skettenis && (tdep->ppc_ev0_upper_regnum <= regnum
1999*63addd46Skettenis && regnum < tdep->ppc_ev0_upper_regnum + ppc_num_gprs))
2000*63addd46Skettenis return 1;
2001*63addd46Skettenis
2002*63addd46Skettenis /* In all other regards, the default reggroup definition is fine. */
2003*63addd46Skettenis return default_register_reggroup_p (gdbarch, regnum, group);
2004*63addd46Skettenis }
2005*63addd46Skettenis
2006*63addd46Skettenis /* Convert a DBX STABS register number to a GDB register number. */
2007b725ae77Skettenis static int
rs6000_stab_reg_to_regnum(int num)2008b725ae77Skettenis rs6000_stab_reg_to_regnum (int num)
2009b725ae77Skettenis {
2010*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2011*63addd46Skettenis
2012*63addd46Skettenis if (0 <= num && num <= 31)
2013*63addd46Skettenis return tdep->ppc_gp0_regnum + num;
2014*63addd46Skettenis else if (32 <= num && num <= 63)
2015*63addd46Skettenis /* FIXME: jimb/2004-05-05: What should we do when the debug info
2016*63addd46Skettenis specifies registers the architecture doesn't have? Our
2017*63addd46Skettenis callers don't check the value we return. */
2018*63addd46Skettenis return tdep->ppc_fp0_regnum + (num - 32);
2019*63addd46Skettenis else if (77 <= num && num <= 108)
2020*63addd46Skettenis return tdep->ppc_vr0_regnum + (num - 77);
2021*63addd46Skettenis else if (1200 <= num && num < 1200 + 32)
2022*63addd46Skettenis return tdep->ppc_ev0_regnum + (num - 1200);
2023*63addd46Skettenis else
2024b725ae77Skettenis switch (num)
2025b725ae77Skettenis {
2026b725ae77Skettenis case 64:
2027*63addd46Skettenis return tdep->ppc_mq_regnum;
2028b725ae77Skettenis case 65:
2029*63addd46Skettenis return tdep->ppc_lr_regnum;
2030b725ae77Skettenis case 66:
2031*63addd46Skettenis return tdep->ppc_ctr_regnum;
2032b725ae77Skettenis case 76:
2033*63addd46Skettenis return tdep->ppc_xer_regnum;
2034*63addd46Skettenis case 109:
2035*63addd46Skettenis return tdep->ppc_vrsave_regnum;
2036*63addd46Skettenis case 110:
2037*63addd46Skettenis return tdep->ppc_vrsave_regnum - 1; /* vscr */
2038*63addd46Skettenis case 111:
2039*63addd46Skettenis return tdep->ppc_acc_regnum;
2040*63addd46Skettenis case 112:
2041*63addd46Skettenis return tdep->ppc_spefscr_regnum;
2042b725ae77Skettenis default:
2043*63addd46Skettenis return num;
2044b725ae77Skettenis }
2045b725ae77Skettenis }
2046b725ae77Skettenis
2047*63addd46Skettenis
2048*63addd46Skettenis /* Convert a Dwarf 2 register number to a GDB register number. */
2049*63addd46Skettenis static int
rs6000_dwarf2_reg_to_regnum(int num)2050*63addd46Skettenis rs6000_dwarf2_reg_to_regnum (int num)
2051b725ae77Skettenis {
2052b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2053b725ae77Skettenis
2054*63addd46Skettenis if (0 <= num && num <= 31)
2055*63addd46Skettenis return tdep->ppc_gp0_regnum + num;
2056*63addd46Skettenis else if (32 <= num && num <= 63)
2057*63addd46Skettenis /* FIXME: jimb/2004-05-05: What should we do when the debug info
2058*63addd46Skettenis specifies registers the architecture doesn't have? Our
2059*63addd46Skettenis callers don't check the value we return. */
2060*63addd46Skettenis return tdep->ppc_fp0_regnum + (num - 32);
2061*63addd46Skettenis else if (1124 <= num && num < 1124 + 32)
2062*63addd46Skettenis return tdep->ppc_vr0_regnum + (num - 1124);
2063*63addd46Skettenis else if (1200 <= num && num < 1200 + 32)
2064*63addd46Skettenis return tdep->ppc_ev0_regnum + (num - 1200);
2065*63addd46Skettenis else
2066*63addd46Skettenis switch (num)
2067*63addd46Skettenis {
2068*63addd46Skettenis case 67:
2069*63addd46Skettenis return tdep->ppc_vrsave_regnum - 1; /* vscr */
2070*63addd46Skettenis case 99:
2071*63addd46Skettenis return tdep->ppc_acc_regnum;
2072*63addd46Skettenis case 100:
2073*63addd46Skettenis return tdep->ppc_mq_regnum;
2074*63addd46Skettenis case 101:
2075*63addd46Skettenis return tdep->ppc_xer_regnum;
2076*63addd46Skettenis case 108:
2077*63addd46Skettenis return tdep->ppc_lr_regnum;
2078*63addd46Skettenis case 109:
2079*63addd46Skettenis return tdep->ppc_ctr_regnum;
2080*63addd46Skettenis case 356:
2081*63addd46Skettenis return tdep->ppc_vrsave_regnum;
2082*63addd46Skettenis case 612:
2083*63addd46Skettenis return tdep->ppc_spefscr_regnum;
2084*63addd46Skettenis default:
2085*63addd46Skettenis return num;
2086*63addd46Skettenis }
2087*63addd46Skettenis }
2088b725ae77Skettenis
2089*63addd46Skettenis
2090*63addd46Skettenis static void
rs6000_store_return_value(struct type * type,struct regcache * regcache,const void * valbuf)2091*63addd46Skettenis rs6000_store_return_value (struct type *type,
2092*63addd46Skettenis struct regcache *regcache,
2093*63addd46Skettenis const void *valbuf)
2094*63addd46Skettenis {
2095*63addd46Skettenis struct gdbarch *gdbarch = get_regcache_arch (regcache);
2096*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2097*63addd46Skettenis int regnum = -1;
2098*63addd46Skettenis
2099*63addd46Skettenis /* The calling convention this function implements assumes the
2100*63addd46Skettenis processor has floating-point registers. We shouldn't be using it
2101*63addd46Skettenis on PPC variants that lack them. */
2102*63addd46Skettenis gdb_assert (ppc_floating_point_unit_p (gdbarch));
2103*63addd46Skettenis
2104*63addd46Skettenis if (TYPE_CODE (type) == TYPE_CODE_FLT)
2105b725ae77Skettenis /* Floating point values are returned starting from FPR1 and up.
2106b725ae77Skettenis Say a double_double_double type could be returned in
2107b725ae77Skettenis FPR1/FPR2/FPR3 triple. */
2108*63addd46Skettenis regnum = tdep->ppc_fp0_regnum + 1;
2109b725ae77Skettenis else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
2110b725ae77Skettenis {
2111b725ae77Skettenis if (TYPE_LENGTH (type) == 16
2112b725ae77Skettenis && TYPE_VECTOR (type))
2113*63addd46Skettenis regnum = tdep->ppc_vr0_regnum + 2;
2114*63addd46Skettenis else
2115*63addd46Skettenis internal_error (__FILE__, __LINE__,
2116*63addd46Skettenis "rs6000_store_return_value: "
2117*63addd46Skettenis "unexpected array return type");
2118b725ae77Skettenis }
2119b725ae77Skettenis else
2120b725ae77Skettenis /* Everything else is returned in GPR3 and up. */
2121*63addd46Skettenis regnum = tdep->ppc_gp0_regnum + 3;
2122*63addd46Skettenis
2123*63addd46Skettenis {
2124*63addd46Skettenis size_t bytes_written = 0;
2125*63addd46Skettenis
2126*63addd46Skettenis while (bytes_written < TYPE_LENGTH (type))
2127*63addd46Skettenis {
2128*63addd46Skettenis /* How much of this value can we write to this register? */
2129*63addd46Skettenis size_t bytes_to_write = min (TYPE_LENGTH (type) - bytes_written,
2130*63addd46Skettenis register_size (gdbarch, regnum));
2131*63addd46Skettenis regcache_cooked_write_part (regcache, regnum,
2132*63addd46Skettenis 0, bytes_to_write,
2133*63addd46Skettenis (char *) valbuf + bytes_written);
2134*63addd46Skettenis regnum++;
2135*63addd46Skettenis bytes_written += bytes_to_write;
2136b725ae77Skettenis }
2137*63addd46Skettenis }
2138*63addd46Skettenis }
2139*63addd46Skettenis
2140b725ae77Skettenis
2141b725ae77Skettenis /* Extract from an array REGBUF containing the (raw) register state
2142b725ae77Skettenis the address in which a function should return its structure value,
2143b725ae77Skettenis as a CORE_ADDR (or an expression that can be used as one). */
2144e93f7393Sniklas
2145e93f7393Sniklas static CORE_ADDR
rs6000_extract_struct_value_address(struct regcache * regcache)2146b725ae77Skettenis rs6000_extract_struct_value_address (struct regcache *regcache)
2147e93f7393Sniklas {
2148b725ae77Skettenis /* FIXME: cagney/2002-09-26: PR gdb/724: When making an inferior
2149b725ae77Skettenis function call GDB knows the address of the struct return value
2150b725ae77Skettenis and hence, should not need to call this function. Unfortunately,
2151b725ae77Skettenis the current call_function_by_hand() code only saves the most
2152b725ae77Skettenis recent struct address leading to occasional calls. The code
2153b725ae77Skettenis should instead maintain a stack of such addresses (in the dummy
2154b725ae77Skettenis frame object). */
2155b725ae77Skettenis /* NOTE: cagney/2002-09-26: Return 0 which indicates that we've
2156b725ae77Skettenis really got no idea where the return value is being stored. While
2157b725ae77Skettenis r3, on function entry, contained the address it will have since
2158b725ae77Skettenis been reused (scratch) and hence wouldn't be valid */
2159b725ae77Skettenis return 0;
2160e93f7393Sniklas }
2161e93f7393Sniklas
2162b725ae77Skettenis /* Hook called when a new child process is started. */
2163b725ae77Skettenis
2164b725ae77Skettenis void
rs6000_create_inferior(int pid)2165b725ae77Skettenis rs6000_create_inferior (int pid)
2166b725ae77Skettenis {
2167b725ae77Skettenis if (rs6000_set_host_arch_hook)
2168b725ae77Skettenis rs6000_set_host_arch_hook (pid);
2169e93f7393Sniklas }
2170b725ae77Skettenis
2171b725ae77Skettenis /* Support for CONVERT_FROM_FUNC_PTR_ADDR (ARCH, ADDR, TARG).
2172e93f7393Sniklas
2173b725ae77Skettenis Usually a function pointer's representation is simply the address
2174b725ae77Skettenis of the function. On the RS/6000 however, a function pointer is
2175b725ae77Skettenis represented by a pointer to a TOC entry. This TOC entry contains
2176b725ae77Skettenis three words, the first word is the address of the function, the
2177b725ae77Skettenis second word is the TOC pointer (r2), and the third word is the
2178b725ae77Skettenis static chain value. Throughout GDB it is currently assumed that a
2179b725ae77Skettenis function pointer contains the address of the function, which is not
2180b725ae77Skettenis easy to fix. In addition, the conversion of a function address to
2181b725ae77Skettenis a function pointer would require allocation of a TOC entry in the
2182b725ae77Skettenis inferior's memory space, with all its drawbacks. To be able to
2183b725ae77Skettenis call C++ virtual methods in the inferior (which are called via
2184b725ae77Skettenis function pointers), find_function_addr uses this function to get the
2185b725ae77Skettenis function address from a function pointer. */
2186e93f7393Sniklas
2187b725ae77Skettenis /* Return real function address if ADDR (a function pointer) is in the data
2188b725ae77Skettenis space and is therefore a special function pointer. */
2189b725ae77Skettenis
2190b725ae77Skettenis static CORE_ADDR
rs6000_convert_from_func_ptr_addr(struct gdbarch * gdbarch,CORE_ADDR addr,struct target_ops * targ)2191b725ae77Skettenis rs6000_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
2192b725ae77Skettenis CORE_ADDR addr,
2193b725ae77Skettenis struct target_ops *targ)
2194e93f7393Sniklas {
2195e93f7393Sniklas struct obj_section *s;
2196e93f7393Sniklas
2197e93f7393Sniklas s = find_pc_section (addr);
2198e93f7393Sniklas if (s && s->the_bfd_section->flags & SEC_CODE)
2199b725ae77Skettenis return addr;
2200b725ae77Skettenis
2201b725ae77Skettenis /* ADDR is in the data space, so it's a special function pointer. */
2202b725ae77Skettenis return read_memory_addr (addr, gdbarch_tdep (current_gdbarch)->wordsize);
2203b725ae77Skettenis }
2204b725ae77Skettenis
2205b725ae77Skettenis
2206b725ae77Skettenis /* Handling the various POWER/PowerPC variants. */
2207b725ae77Skettenis
2208b725ae77Skettenis
2209b725ae77Skettenis /* The arrays here called registers_MUMBLE hold information about available
2210b725ae77Skettenis registers.
2211b725ae77Skettenis
2212b725ae77Skettenis For each family of PPC variants, I've tried to isolate out the
2213b725ae77Skettenis common registers and put them up front, so that as long as you get
2214b725ae77Skettenis the general family right, GDB will correctly identify the registers
2215b725ae77Skettenis common to that family. The common register sets are:
2216b725ae77Skettenis
2217b725ae77Skettenis For the 60x family: hid0 hid1 iabr dabr pir
2218b725ae77Skettenis
2219b725ae77Skettenis For the 505 and 860 family: eie eid nri
2220b725ae77Skettenis
2221b725ae77Skettenis For the 403 and 403GC: icdbdr esr dear evpr cdbcr tsr tcr pit tbhi
2222b725ae77Skettenis tblo srr2 srr3 dbsr dbcr iac1 iac2 dac1 dac2 dccr iccr pbl1
2223b725ae77Skettenis pbu1 pbl2 pbu2
2224b725ae77Skettenis
2225b725ae77Skettenis Most of these register groups aren't anything formal. I arrived at
2226b725ae77Skettenis them by looking at the registers that occurred in more than one
2227b725ae77Skettenis processor.
2228b725ae77Skettenis
2229b725ae77Skettenis Note: kevinb/2002-04-30: Support for the fpscr register was added
2230b725ae77Skettenis during April, 2002. Slot 70 is being used for PowerPC and slot 71
2231b725ae77Skettenis for Power. For PowerPC, slot 70 was unused and was already in the
2232b725ae77Skettenis PPC_UISA_SPRS which is ideally where fpscr should go. For Power,
2233b725ae77Skettenis slot 70 was being used for "mq", so the next available slot (71)
2234b725ae77Skettenis was chosen. It would have been nice to be able to make the
2235b725ae77Skettenis register numbers the same across processor cores, but this wasn't
2236b725ae77Skettenis possible without either 1) renumbering some registers for some
2237b725ae77Skettenis processors or 2) assigning fpscr to a really high slot that's
2238b725ae77Skettenis larger than any current register number. Doing (1) is bad because
2239b725ae77Skettenis existing stubs would break. Doing (2) is undesirable because it
2240b725ae77Skettenis would introduce a really large gap between fpscr and the rest of
2241b725ae77Skettenis the registers for most processors. */
2242b725ae77Skettenis
2243b725ae77Skettenis /* Convenience macros for populating register arrays. */
2244b725ae77Skettenis
2245b725ae77Skettenis /* Within another macro, convert S to a string. */
2246b725ae77Skettenis
2247b725ae77Skettenis #define STR(s) #s
2248b725ae77Skettenis
2249b725ae77Skettenis /* Return a struct reg defining register NAME that's 32 bits on 32-bit systems
2250b725ae77Skettenis and 64 bits on 64-bit systems. */
2251*63addd46Skettenis #define R(name) { STR(name), 4, 8, 0, 0, -1 }
2252b725ae77Skettenis
2253b725ae77Skettenis /* Return a struct reg defining register NAME that's 32 bits on all
2254b725ae77Skettenis systems. */
2255*63addd46Skettenis #define R4(name) { STR(name), 4, 4, 0, 0, -1 }
2256b725ae77Skettenis
2257b725ae77Skettenis /* Return a struct reg defining register NAME that's 64 bits on all
2258b725ae77Skettenis systems. */
2259*63addd46Skettenis #define R8(name) { STR(name), 8, 8, 0, 0, -1 }
2260b725ae77Skettenis
2261b725ae77Skettenis /* Return a struct reg defining register NAME that's 128 bits on all
2262b725ae77Skettenis systems. */
2263*63addd46Skettenis #define R16(name) { STR(name), 16, 16, 0, 0, -1 }
2264b725ae77Skettenis
2265b725ae77Skettenis /* Return a struct reg defining floating-point register NAME. */
2266*63addd46Skettenis #define F(name) { STR(name), 8, 8, 1, 0, -1 }
2267b725ae77Skettenis
2268*63addd46Skettenis /* Return a struct reg defining a pseudo register NAME that is 64 bits
2269*63addd46Skettenis long on all systems. */
2270*63addd46Skettenis #define P8(name) { STR(name), 8, 8, 0, 1, -1 }
2271b725ae77Skettenis
2272b725ae77Skettenis /* Return a struct reg defining register NAME that's 32 bits on 32-bit
2273b725ae77Skettenis systems and that doesn't exist on 64-bit systems. */
2274*63addd46Skettenis #define R32(name) { STR(name), 4, 0, 0, 0, -1 }
2275b725ae77Skettenis
2276b725ae77Skettenis /* Return a struct reg defining register NAME that's 64 bits on 64-bit
2277b725ae77Skettenis systems and that doesn't exist on 32-bit systems. */
2278*63addd46Skettenis #define R64(name) { STR(name), 0, 8, 0, 0, -1 }
2279b725ae77Skettenis
2280b725ae77Skettenis /* Return a struct reg placeholder for a register that doesn't exist. */
2281*63addd46Skettenis #define R0 { 0, 0, 0, 0, 0, -1 }
2282*63addd46Skettenis
2283*63addd46Skettenis /* Return a struct reg defining an anonymous raw register that's 32
2284*63addd46Skettenis bits on all systems. */
2285*63addd46Skettenis #define A4 { 0, 4, 4, 0, 0, -1 }
2286*63addd46Skettenis
2287*63addd46Skettenis /* Return a struct reg defining an SPR named NAME that is 32 bits on
2288*63addd46Skettenis 32-bit systems and 64 bits on 64-bit systems. */
2289*63addd46Skettenis #define S(name) { STR(name), 4, 8, 0, 0, ppc_spr_ ## name }
2290*63addd46Skettenis
2291*63addd46Skettenis /* Return a struct reg defining an SPR named NAME that is 32 bits on
2292*63addd46Skettenis all systems. */
2293*63addd46Skettenis #define S4(name) { STR(name), 4, 4, 0, 0, ppc_spr_ ## name }
2294*63addd46Skettenis
2295*63addd46Skettenis /* Return a struct reg defining an SPR named NAME that is 32 bits on
2296*63addd46Skettenis all systems, and whose SPR number is NUMBER. */
2297*63addd46Skettenis #define SN4(name, number) { STR(name), 4, 4, 0, 0, (number) }
2298*63addd46Skettenis
2299*63addd46Skettenis /* Return a struct reg defining an SPR named NAME that's 64 bits on
2300*63addd46Skettenis 64-bit systems and that doesn't exist on 32-bit systems. */
2301*63addd46Skettenis #define S64(name) { STR(name), 0, 8, 0, 0, ppc_spr_ ## name }
2302b725ae77Skettenis
2303b725ae77Skettenis /* UISA registers common across all architectures, including POWER. */
2304b725ae77Skettenis
2305b725ae77Skettenis #define COMMON_UISA_REGS \
2306b725ae77Skettenis /* 0 */ R(r0), R(r1), R(r2), R(r3), R(r4), R(r5), R(r6), R(r7), \
2307b725ae77Skettenis /* 8 */ R(r8), R(r9), R(r10),R(r11),R(r12),R(r13),R(r14),R(r15), \
2308b725ae77Skettenis /* 16 */ R(r16),R(r17),R(r18),R(r19),R(r20),R(r21),R(r22),R(r23), \
2309b725ae77Skettenis /* 24 */ R(r24),R(r25),R(r26),R(r27),R(r28),R(r29),R(r30),R(r31), \
2310b725ae77Skettenis /* 32 */ F(f0), F(f1), F(f2), F(f3), F(f4), F(f5), F(f6), F(f7), \
2311b725ae77Skettenis /* 40 */ F(f8), F(f9), F(f10),F(f11),F(f12),F(f13),F(f14),F(f15), \
2312b725ae77Skettenis /* 48 */ F(f16),F(f17),F(f18),F(f19),F(f20),F(f21),F(f22),F(f23), \
2313b725ae77Skettenis /* 56 */ F(f24),F(f25),F(f26),F(f27),F(f28),F(f29),F(f30),F(f31), \
2314b725ae77Skettenis /* 64 */ R(pc), R(ps)
2315b725ae77Skettenis
2316b725ae77Skettenis /* UISA-level SPRs for PowerPC. */
2317b725ae77Skettenis #define PPC_UISA_SPRS \
2318*63addd46Skettenis /* 66 */ R4(cr), S(lr), S(ctr), S4(xer), R4(fpscr)
2319b725ae77Skettenis
2320b725ae77Skettenis /* UISA-level SPRs for PowerPC without floating point support. */
2321b725ae77Skettenis #define PPC_UISA_NOFP_SPRS \
2322*63addd46Skettenis /* 66 */ R4(cr), S(lr), S(ctr), S4(xer), R0
2323b725ae77Skettenis
2324b725ae77Skettenis /* Segment registers, for PowerPC. */
2325b725ae77Skettenis #define PPC_SEGMENT_REGS \
2326b725ae77Skettenis /* 71 */ R32(sr0), R32(sr1), R32(sr2), R32(sr3), \
2327b725ae77Skettenis /* 75 */ R32(sr4), R32(sr5), R32(sr6), R32(sr7), \
2328b725ae77Skettenis /* 79 */ R32(sr8), R32(sr9), R32(sr10), R32(sr11), \
2329b725ae77Skettenis /* 83 */ R32(sr12), R32(sr13), R32(sr14), R32(sr15)
2330b725ae77Skettenis
2331b725ae77Skettenis /* OEA SPRs for PowerPC. */
2332b725ae77Skettenis #define PPC_OEA_SPRS \
2333*63addd46Skettenis /* 87 */ S4(pvr), \
2334*63addd46Skettenis /* 88 */ S(ibat0u), S(ibat0l), S(ibat1u), S(ibat1l), \
2335*63addd46Skettenis /* 92 */ S(ibat2u), S(ibat2l), S(ibat3u), S(ibat3l), \
2336*63addd46Skettenis /* 96 */ S(dbat0u), S(dbat0l), S(dbat1u), S(dbat1l), \
2337*63addd46Skettenis /* 100 */ S(dbat2u), S(dbat2l), S(dbat3u), S(dbat3l), \
2338*63addd46Skettenis /* 104 */ S(sdr1), S64(asr), S(dar), S4(dsisr), \
2339*63addd46Skettenis /* 108 */ S(sprg0), S(sprg1), S(sprg2), S(sprg3), \
2340*63addd46Skettenis /* 112 */ S(srr0), S(srr1), S(tbl), S(tbu), \
2341*63addd46Skettenis /* 116 */ S4(dec), S(dabr), S4(ear)
2342b725ae77Skettenis
2343b725ae77Skettenis /* AltiVec registers. */
2344b725ae77Skettenis #define PPC_ALTIVEC_REGS \
2345b725ae77Skettenis /*119*/R16(vr0), R16(vr1), R16(vr2), R16(vr3), R16(vr4), R16(vr5), R16(vr6), R16(vr7), \
2346b725ae77Skettenis /*127*/R16(vr8), R16(vr9), R16(vr10),R16(vr11),R16(vr12),R16(vr13),R16(vr14),R16(vr15), \
2347b725ae77Skettenis /*135*/R16(vr16),R16(vr17),R16(vr18),R16(vr19),R16(vr20),R16(vr21),R16(vr22),R16(vr23), \
2348b725ae77Skettenis /*143*/R16(vr24),R16(vr25),R16(vr26),R16(vr27),R16(vr28),R16(vr29),R16(vr30),R16(vr31), \
2349b725ae77Skettenis /*151*/R4(vscr), R4(vrsave)
2350b725ae77Skettenis
2351b725ae77Skettenis
2352*63addd46Skettenis /* On machines supporting the SPE APU, the general-purpose registers
2353*63addd46Skettenis are 64 bits long. There are SIMD vector instructions to treat them
2354*63addd46Skettenis as pairs of floats, but the rest of the instruction set treats them
2355*63addd46Skettenis as 32-bit registers, and only operates on their lower halves.
2356*63addd46Skettenis
2357*63addd46Skettenis In the GDB regcache, we treat their high and low halves as separate
2358*63addd46Skettenis registers. The low halves we present as the general-purpose
2359*63addd46Skettenis registers, and then we have pseudo-registers that stitch together
2360*63addd46Skettenis the upper and lower halves and present them as pseudo-registers. */
2361*63addd46Skettenis
2362*63addd46Skettenis /* SPE GPR lower halves --- raw registers. */
2363*63addd46Skettenis #define PPC_SPE_GP_REGS \
2364*63addd46Skettenis /* 0 */ R4(r0), R4(r1), R4(r2), R4(r3), R4(r4), R4(r5), R4(r6), R4(r7), \
2365*63addd46Skettenis /* 8 */ R4(r8), R4(r9), R4(r10),R4(r11),R4(r12),R4(r13),R4(r14),R4(r15), \
2366*63addd46Skettenis /* 16 */ R4(r16),R4(r17),R4(r18),R4(r19),R4(r20),R4(r21),R4(r22),R4(r23), \
2367*63addd46Skettenis /* 24 */ R4(r24),R4(r25),R4(r26),R4(r27),R4(r28),R4(r29),R4(r30),R4(r31)
2368*63addd46Skettenis
2369*63addd46Skettenis /* SPE GPR upper halves --- anonymous raw registers. */
2370*63addd46Skettenis #define PPC_SPE_UPPER_GP_REGS \
2371*63addd46Skettenis /* 0 */ A4, A4, A4, A4, A4, A4, A4, A4, \
2372*63addd46Skettenis /* 8 */ A4, A4, A4, A4, A4, A4, A4, A4, \
2373*63addd46Skettenis /* 16 */ A4, A4, A4, A4, A4, A4, A4, A4, \
2374*63addd46Skettenis /* 24 */ A4, A4, A4, A4, A4, A4, A4, A4
2375*63addd46Skettenis
2376*63addd46Skettenis /* SPE GPR vector registers --- pseudo registers based on underlying
2377*63addd46Skettenis gprs and the anonymous upper half raw registers. */
2378*63addd46Skettenis #define PPC_EV_PSEUDO_REGS \
2379*63addd46Skettenis /* 0*/P8(ev0), P8(ev1), P8(ev2), P8(ev3), P8(ev4), P8(ev5), P8(ev6), P8(ev7), \
2380*63addd46Skettenis /* 8*/P8(ev8), P8(ev9), P8(ev10),P8(ev11),P8(ev12),P8(ev13),P8(ev14),P8(ev15),\
2381*63addd46Skettenis /*16*/P8(ev16),P8(ev17),P8(ev18),P8(ev19),P8(ev20),P8(ev21),P8(ev22),P8(ev23),\
2382*63addd46Skettenis /*24*/P8(ev24),P8(ev25),P8(ev26),P8(ev27),P8(ev28),P8(ev29),P8(ev30),P8(ev31)
2383b725ae77Skettenis
2384b725ae77Skettenis /* IBM POWER (pre-PowerPC) architecture, user-level view. We only cover
2385b725ae77Skettenis user-level SPR's. */
2386b725ae77Skettenis static const struct reg registers_power[] =
2387b725ae77Skettenis {
2388b725ae77Skettenis COMMON_UISA_REGS,
2389*63addd46Skettenis /* 66 */ R4(cnd), S(lr), S(cnt), S4(xer), S4(mq),
2390b725ae77Skettenis /* 71 */ R4(fpscr)
2391b725ae77Skettenis };
2392b725ae77Skettenis
2393b725ae77Skettenis /* PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
2394b725ae77Skettenis view of the PowerPC. */
2395b725ae77Skettenis static const struct reg registers_powerpc[] =
2396b725ae77Skettenis {
2397b725ae77Skettenis COMMON_UISA_REGS,
2398b725ae77Skettenis PPC_UISA_SPRS,
2399b725ae77Skettenis PPC_ALTIVEC_REGS
2400b725ae77Skettenis };
2401b725ae77Skettenis
2402*63addd46Skettenis /* IBM PowerPC 403.
2403b725ae77Skettenis
2404*63addd46Skettenis Some notes about the "tcr" special-purpose register:
2405*63addd46Skettenis - On the 403 and 403GC, SPR 986 is named "tcr", and it controls the
2406*63addd46Skettenis 403's programmable interval timer, fixed interval timer, and
2407*63addd46Skettenis watchdog timer.
2408*63addd46Skettenis - On the 602, SPR 984 is named "tcr", and it controls the 602's
2409*63addd46Skettenis watchdog timer, and nothing else.
2410*63addd46Skettenis
2411*63addd46Skettenis Some of the fields are similar between the two, but they're not
2412*63addd46Skettenis compatible with each other. Since the two variants have different
2413*63addd46Skettenis registers, with different numbers, but the same name, we can't
2414*63addd46Skettenis splice the register name to get the SPR number. */
2415b725ae77Skettenis static const struct reg registers_403[] =
2416b725ae77Skettenis {
2417b725ae77Skettenis COMMON_UISA_REGS,
2418b725ae77Skettenis PPC_UISA_SPRS,
2419b725ae77Skettenis PPC_SEGMENT_REGS,
2420b725ae77Skettenis PPC_OEA_SPRS,
2421*63addd46Skettenis /* 119 */ S(icdbdr), S(esr), S(dear), S(evpr),
2422*63addd46Skettenis /* 123 */ S(cdbcr), S(tsr), SN4(tcr, ppc_spr_403_tcr), S(pit),
2423*63addd46Skettenis /* 127 */ S(tbhi), S(tblo), S(srr2), S(srr3),
2424*63addd46Skettenis /* 131 */ S(dbsr), S(dbcr), S(iac1), S(iac2),
2425*63addd46Skettenis /* 135 */ S(dac1), S(dac2), S(dccr), S(iccr),
2426*63addd46Skettenis /* 139 */ S(pbl1), S(pbu1), S(pbl2), S(pbu2)
2427b725ae77Skettenis };
2428b725ae77Skettenis
2429*63addd46Skettenis /* IBM PowerPC 403GC.
2430*63addd46Skettenis See the comments about 'tcr' for the 403, above. */
2431b725ae77Skettenis static const struct reg registers_403GC[] =
2432b725ae77Skettenis {
2433b725ae77Skettenis COMMON_UISA_REGS,
2434b725ae77Skettenis PPC_UISA_SPRS,
2435b725ae77Skettenis PPC_SEGMENT_REGS,
2436b725ae77Skettenis PPC_OEA_SPRS,
2437*63addd46Skettenis /* 119 */ S(icdbdr), S(esr), S(dear), S(evpr),
2438*63addd46Skettenis /* 123 */ S(cdbcr), S(tsr), SN4(tcr, ppc_spr_403_tcr), S(pit),
2439*63addd46Skettenis /* 127 */ S(tbhi), S(tblo), S(srr2), S(srr3),
2440*63addd46Skettenis /* 131 */ S(dbsr), S(dbcr), S(iac1), S(iac2),
2441*63addd46Skettenis /* 135 */ S(dac1), S(dac2), S(dccr), S(iccr),
2442*63addd46Skettenis /* 139 */ S(pbl1), S(pbu1), S(pbl2), S(pbu2),
2443*63addd46Skettenis /* 143 */ S(zpr), S(pid), S(sgr), S(dcwr),
2444*63addd46Skettenis /* 147 */ S(tbhu), S(tblu)
2445b725ae77Skettenis };
2446b725ae77Skettenis
2447b725ae77Skettenis /* Motorola PowerPC 505. */
2448b725ae77Skettenis static const struct reg registers_505[] =
2449b725ae77Skettenis {
2450b725ae77Skettenis COMMON_UISA_REGS,
2451b725ae77Skettenis PPC_UISA_SPRS,
2452b725ae77Skettenis PPC_SEGMENT_REGS,
2453b725ae77Skettenis PPC_OEA_SPRS,
2454*63addd46Skettenis /* 119 */ S(eie), S(eid), S(nri)
2455b725ae77Skettenis };
2456b725ae77Skettenis
2457b725ae77Skettenis /* Motorola PowerPC 860 or 850. */
2458b725ae77Skettenis static const struct reg registers_860[] =
2459b725ae77Skettenis {
2460b725ae77Skettenis COMMON_UISA_REGS,
2461b725ae77Skettenis PPC_UISA_SPRS,
2462b725ae77Skettenis PPC_SEGMENT_REGS,
2463b725ae77Skettenis PPC_OEA_SPRS,
2464*63addd46Skettenis /* 119 */ S(eie), S(eid), S(nri), S(cmpa),
2465*63addd46Skettenis /* 123 */ S(cmpb), S(cmpc), S(cmpd), S(icr),
2466*63addd46Skettenis /* 127 */ S(der), S(counta), S(countb), S(cmpe),
2467*63addd46Skettenis /* 131 */ S(cmpf), S(cmpg), S(cmph), S(lctrl1),
2468*63addd46Skettenis /* 135 */ S(lctrl2), S(ictrl), S(bar), S(ic_cst),
2469*63addd46Skettenis /* 139 */ S(ic_adr), S(ic_dat), S(dc_cst), S(dc_adr),
2470*63addd46Skettenis /* 143 */ S(dc_dat), S(dpdr), S(dpir), S(immr),
2471*63addd46Skettenis /* 147 */ S(mi_ctr), S(mi_ap), S(mi_epn), S(mi_twc),
2472*63addd46Skettenis /* 151 */ S(mi_rpn), S(md_ctr), S(m_casid), S(md_ap),
2473*63addd46Skettenis /* 155 */ S(md_epn), S(m_twb), S(md_twc), S(md_rpn),
2474*63addd46Skettenis /* 159 */ S(m_tw), S(mi_dbcam), S(mi_dbram0), S(mi_dbram1),
2475*63addd46Skettenis /* 163 */ S(md_dbcam), S(md_dbram0), S(md_dbram1)
2476b725ae77Skettenis };
2477b725ae77Skettenis
2478b725ae77Skettenis /* Motorola PowerPC 601. Note that the 601 has different register numbers
2479b725ae77Skettenis for reading and writing RTCU and RTCL. However, how one reads and writes a
2480b725ae77Skettenis register is the stub's problem. */
2481b725ae77Skettenis static const struct reg registers_601[] =
2482b725ae77Skettenis {
2483b725ae77Skettenis COMMON_UISA_REGS,
2484b725ae77Skettenis PPC_UISA_SPRS,
2485b725ae77Skettenis PPC_SEGMENT_REGS,
2486b725ae77Skettenis PPC_OEA_SPRS,
2487*63addd46Skettenis /* 119 */ S(hid0), S(hid1), S(iabr), S(dabr),
2488*63addd46Skettenis /* 123 */ S(pir), S(mq), S(rtcu), S(rtcl)
2489b725ae77Skettenis };
2490b725ae77Skettenis
2491*63addd46Skettenis /* Motorola PowerPC 602.
2492*63addd46Skettenis See the notes under the 403 about 'tcr'. */
2493b725ae77Skettenis static const struct reg registers_602[] =
2494b725ae77Skettenis {
2495b725ae77Skettenis COMMON_UISA_REGS,
2496b725ae77Skettenis PPC_UISA_SPRS,
2497b725ae77Skettenis PPC_SEGMENT_REGS,
2498b725ae77Skettenis PPC_OEA_SPRS,
2499*63addd46Skettenis /* 119 */ S(hid0), S(hid1), S(iabr), R0,
2500*63addd46Skettenis /* 123 */ R0, SN4(tcr, ppc_spr_602_tcr), S(ibr), S(esasrr),
2501*63addd46Skettenis /* 127 */ S(sebr), S(ser), S(sp), S(lt)
2502b725ae77Skettenis };
2503b725ae77Skettenis
2504b725ae77Skettenis /* Motorola/IBM PowerPC 603 or 603e. */
2505b725ae77Skettenis static const struct reg registers_603[] =
2506b725ae77Skettenis {
2507b725ae77Skettenis COMMON_UISA_REGS,
2508b725ae77Skettenis PPC_UISA_SPRS,
2509b725ae77Skettenis PPC_SEGMENT_REGS,
2510b725ae77Skettenis PPC_OEA_SPRS,
2511*63addd46Skettenis /* 119 */ S(hid0), S(hid1), S(iabr), R0,
2512*63addd46Skettenis /* 123 */ R0, S(dmiss), S(dcmp), S(hash1),
2513*63addd46Skettenis /* 127 */ S(hash2), S(imiss), S(icmp), S(rpa)
2514b725ae77Skettenis };
2515b725ae77Skettenis
2516b725ae77Skettenis /* Motorola PowerPC 604 or 604e. */
2517b725ae77Skettenis static const struct reg registers_604[] =
2518b725ae77Skettenis {
2519b725ae77Skettenis COMMON_UISA_REGS,
2520b725ae77Skettenis PPC_UISA_SPRS,
2521b725ae77Skettenis PPC_SEGMENT_REGS,
2522b725ae77Skettenis PPC_OEA_SPRS,
2523*63addd46Skettenis /* 119 */ S(hid0), S(hid1), S(iabr), S(dabr),
2524*63addd46Skettenis /* 123 */ S(pir), S(mmcr0), S(pmc1), S(pmc2),
2525*63addd46Skettenis /* 127 */ S(sia), S(sda)
2526b725ae77Skettenis };
2527b725ae77Skettenis
2528b725ae77Skettenis /* Motorola/IBM PowerPC 750 or 740. */
2529b725ae77Skettenis static const struct reg registers_750[] =
2530b725ae77Skettenis {
2531b725ae77Skettenis COMMON_UISA_REGS,
2532b725ae77Skettenis PPC_UISA_SPRS,
2533b725ae77Skettenis PPC_SEGMENT_REGS,
2534b725ae77Skettenis PPC_OEA_SPRS,
2535*63addd46Skettenis /* 119 */ S(hid0), S(hid1), S(iabr), S(dabr),
2536*63addd46Skettenis /* 123 */ R0, S(ummcr0), S(upmc1), S(upmc2),
2537*63addd46Skettenis /* 127 */ S(usia), S(ummcr1), S(upmc3), S(upmc4),
2538*63addd46Skettenis /* 131 */ S(mmcr0), S(pmc1), S(pmc2), S(sia),
2539*63addd46Skettenis /* 135 */ S(mmcr1), S(pmc3), S(pmc4), S(l2cr),
2540*63addd46Skettenis /* 139 */ S(ictc), S(thrm1), S(thrm2), S(thrm3)
2541b725ae77Skettenis };
2542b725ae77Skettenis
2543b725ae77Skettenis
2544b725ae77Skettenis /* Motorola PowerPC 7400. */
2545b725ae77Skettenis static const struct reg registers_7400[] =
2546b725ae77Skettenis {
2547b725ae77Skettenis /* gpr0-gpr31, fpr0-fpr31 */
2548b725ae77Skettenis COMMON_UISA_REGS,
2549*63addd46Skettenis /* cr, lr, ctr, xer, fpscr */
2550b725ae77Skettenis PPC_UISA_SPRS,
2551b725ae77Skettenis /* sr0-sr15 */
2552b725ae77Skettenis PPC_SEGMENT_REGS,
2553b725ae77Skettenis PPC_OEA_SPRS,
2554b725ae77Skettenis /* vr0-vr31, vrsave, vscr */
2555b725ae77Skettenis PPC_ALTIVEC_REGS
2556b725ae77Skettenis /* FIXME? Add more registers? */
2557b725ae77Skettenis };
2558b725ae77Skettenis
2559b725ae77Skettenis /* Motorola e500. */
2560b725ae77Skettenis static const struct reg registers_e500[] =
2561b725ae77Skettenis {
2562*63addd46Skettenis /* 0 .. 31 */ PPC_SPE_GP_REGS,
2563*63addd46Skettenis /* 32 .. 63 */ PPC_SPE_UPPER_GP_REGS,
2564*63addd46Skettenis /* 64 .. 65 */ R(pc), R(ps),
2565*63addd46Skettenis /* 66 .. 70 */ PPC_UISA_NOFP_SPRS,
2566*63addd46Skettenis /* 71 .. 72 */ R8(acc), S4(spefscr),
2567b725ae77Skettenis /* NOTE: Add new registers here the end of the raw register
2568b725ae77Skettenis list and just before the first pseudo register. */
2569*63addd46Skettenis /* 73 .. 104 */ PPC_EV_PSEUDO_REGS
2570b725ae77Skettenis };
2571b725ae77Skettenis
2572b725ae77Skettenis /* Information about a particular processor variant. */
2573b725ae77Skettenis
2574b725ae77Skettenis struct variant
2575b725ae77Skettenis {
2576b725ae77Skettenis /* Name of this variant. */
2577b725ae77Skettenis char *name;
2578b725ae77Skettenis
2579b725ae77Skettenis /* English description of the variant. */
2580b725ae77Skettenis char *description;
2581b725ae77Skettenis
2582b725ae77Skettenis /* bfd_arch_info.arch corresponding to variant. */
2583b725ae77Skettenis enum bfd_architecture arch;
2584b725ae77Skettenis
2585b725ae77Skettenis /* bfd_arch_info.mach corresponding to variant. */
2586b725ae77Skettenis unsigned long mach;
2587b725ae77Skettenis
2588b725ae77Skettenis /* Number of real registers. */
2589b725ae77Skettenis int nregs;
2590b725ae77Skettenis
2591b725ae77Skettenis /* Number of pseudo registers. */
2592b725ae77Skettenis int npregs;
2593b725ae77Skettenis
2594b725ae77Skettenis /* Number of total registers (the sum of nregs and npregs). */
2595b725ae77Skettenis int num_tot_regs;
2596b725ae77Skettenis
2597b725ae77Skettenis /* Table of register names; registers[R] is the name of the register
2598b725ae77Skettenis number R. */
2599b725ae77Skettenis const struct reg *regs;
2600b725ae77Skettenis };
2601b725ae77Skettenis
2602b725ae77Skettenis #define tot_num_registers(list) (sizeof (list) / sizeof((list)[0]))
2603b725ae77Skettenis
2604b725ae77Skettenis static int
num_registers(const struct reg * reg_list,int num_tot_regs)2605b725ae77Skettenis num_registers (const struct reg *reg_list, int num_tot_regs)
2606b725ae77Skettenis {
2607b725ae77Skettenis int i;
2608b725ae77Skettenis int nregs = 0;
2609b725ae77Skettenis
2610b725ae77Skettenis for (i = 0; i < num_tot_regs; i++)
2611b725ae77Skettenis if (!reg_list[i].pseudo)
2612b725ae77Skettenis nregs++;
2613b725ae77Skettenis
2614b725ae77Skettenis return nregs;
2615e93f7393Sniklas }
2616e93f7393Sniklas
2617b725ae77Skettenis static int
num_pseudo_registers(const struct reg * reg_list,int num_tot_regs)2618b725ae77Skettenis num_pseudo_registers (const struct reg *reg_list, int num_tot_regs)
2619e93f7393Sniklas {
2620b725ae77Skettenis int i;
2621b725ae77Skettenis int npregs = 0;
2622b725ae77Skettenis
2623b725ae77Skettenis for (i = 0; i < num_tot_regs; i++)
2624b725ae77Skettenis if (reg_list[i].pseudo)
2625b725ae77Skettenis npregs ++;
2626b725ae77Skettenis
2627b725ae77Skettenis return npregs;
2628b725ae77Skettenis }
2629b725ae77Skettenis
2630b725ae77Skettenis /* Information in this table comes from the following web sites:
2631b725ae77Skettenis IBM: http://www.chips.ibm.com:80/products/embedded/
2632b725ae77Skettenis Motorola: http://www.mot.com/SPS/PowerPC/
2633b725ae77Skettenis
2634b725ae77Skettenis I'm sure I've got some of the variant descriptions not quite right.
2635b725ae77Skettenis Please report any inaccuracies you find to GDB's maintainer.
2636b725ae77Skettenis
2637b725ae77Skettenis If you add entries to this table, please be sure to allow the new
2638b725ae77Skettenis value as an argument to the --with-cpu flag, in configure.in. */
2639b725ae77Skettenis
2640b725ae77Skettenis static struct variant variants[] =
2641b725ae77Skettenis {
2642b725ae77Skettenis
2643b725ae77Skettenis {"powerpc", "PowerPC user-level", bfd_arch_powerpc,
2644b725ae77Skettenis bfd_mach_ppc, -1, -1, tot_num_registers (registers_powerpc),
2645b725ae77Skettenis registers_powerpc},
2646b725ae77Skettenis {"power", "POWER user-level", bfd_arch_rs6000,
2647b725ae77Skettenis bfd_mach_rs6k, -1, -1, tot_num_registers (registers_power),
2648b725ae77Skettenis registers_power},
2649b725ae77Skettenis {"403", "IBM PowerPC 403", bfd_arch_powerpc,
2650b725ae77Skettenis bfd_mach_ppc_403, -1, -1, tot_num_registers (registers_403),
2651b725ae77Skettenis registers_403},
2652b725ae77Skettenis {"601", "Motorola PowerPC 601", bfd_arch_powerpc,
2653b725ae77Skettenis bfd_mach_ppc_601, -1, -1, tot_num_registers (registers_601),
2654b725ae77Skettenis registers_601},
2655b725ae77Skettenis {"602", "Motorola PowerPC 602", bfd_arch_powerpc,
2656b725ae77Skettenis bfd_mach_ppc_602, -1, -1, tot_num_registers (registers_602),
2657b725ae77Skettenis registers_602},
2658b725ae77Skettenis {"603", "Motorola/IBM PowerPC 603 or 603e", bfd_arch_powerpc,
2659b725ae77Skettenis bfd_mach_ppc_603, -1, -1, tot_num_registers (registers_603),
2660b725ae77Skettenis registers_603},
2661b725ae77Skettenis {"604", "Motorola PowerPC 604 or 604e", bfd_arch_powerpc,
2662b725ae77Skettenis 604, -1, -1, tot_num_registers (registers_604),
2663b725ae77Skettenis registers_604},
2664b725ae77Skettenis {"403GC", "IBM PowerPC 403GC", bfd_arch_powerpc,
2665b725ae77Skettenis bfd_mach_ppc_403gc, -1, -1, tot_num_registers (registers_403GC),
2666b725ae77Skettenis registers_403GC},
2667b725ae77Skettenis {"505", "Motorola PowerPC 505", bfd_arch_powerpc,
2668b725ae77Skettenis bfd_mach_ppc_505, -1, -1, tot_num_registers (registers_505),
2669b725ae77Skettenis registers_505},
2670b725ae77Skettenis {"860", "Motorola PowerPC 860 or 850", bfd_arch_powerpc,
2671b725ae77Skettenis bfd_mach_ppc_860, -1, -1, tot_num_registers (registers_860),
2672b725ae77Skettenis registers_860},
2673b725ae77Skettenis {"750", "Motorola/IBM PowerPC 750 or 740", bfd_arch_powerpc,
2674b725ae77Skettenis bfd_mach_ppc_750, -1, -1, tot_num_registers (registers_750),
2675b725ae77Skettenis registers_750},
2676b725ae77Skettenis {"7400", "Motorola/IBM PowerPC 7400 (G4)", bfd_arch_powerpc,
2677b725ae77Skettenis bfd_mach_ppc_7400, -1, -1, tot_num_registers (registers_7400),
2678b725ae77Skettenis registers_7400},
2679b725ae77Skettenis {"e500", "Motorola PowerPC e500", bfd_arch_powerpc,
2680b725ae77Skettenis bfd_mach_ppc_e500, -1, -1, tot_num_registers (registers_e500),
2681b725ae77Skettenis registers_e500},
2682b725ae77Skettenis
2683b725ae77Skettenis /* 64-bit */
2684b725ae77Skettenis {"powerpc64", "PowerPC 64-bit user-level", bfd_arch_powerpc,
2685b725ae77Skettenis bfd_mach_ppc64, -1, -1, tot_num_registers (registers_powerpc),
2686b725ae77Skettenis registers_powerpc},
2687b725ae77Skettenis {"620", "Motorola PowerPC 620", bfd_arch_powerpc,
2688b725ae77Skettenis bfd_mach_ppc_620, -1, -1, tot_num_registers (registers_powerpc),
2689b725ae77Skettenis registers_powerpc},
2690b725ae77Skettenis {"630", "Motorola PowerPC 630", bfd_arch_powerpc,
2691b725ae77Skettenis bfd_mach_ppc_630, -1, -1, tot_num_registers (registers_powerpc),
2692b725ae77Skettenis registers_powerpc},
2693b725ae77Skettenis {"a35", "PowerPC A35", bfd_arch_powerpc,
2694b725ae77Skettenis bfd_mach_ppc_a35, -1, -1, tot_num_registers (registers_powerpc),
2695b725ae77Skettenis registers_powerpc},
2696b725ae77Skettenis {"rs64ii", "PowerPC rs64ii", bfd_arch_powerpc,
2697b725ae77Skettenis bfd_mach_ppc_rs64ii, -1, -1, tot_num_registers (registers_powerpc),
2698b725ae77Skettenis registers_powerpc},
2699b725ae77Skettenis {"rs64iii", "PowerPC rs64iii", bfd_arch_powerpc,
2700b725ae77Skettenis bfd_mach_ppc_rs64iii, -1, -1, tot_num_registers (registers_powerpc),
2701b725ae77Skettenis registers_powerpc},
2702b725ae77Skettenis
2703b725ae77Skettenis /* FIXME: I haven't checked the register sets of the following. */
2704b725ae77Skettenis {"rs1", "IBM POWER RS1", bfd_arch_rs6000,
2705b725ae77Skettenis bfd_mach_rs6k_rs1, -1, -1, tot_num_registers (registers_power),
2706b725ae77Skettenis registers_power},
2707b725ae77Skettenis {"rsc", "IBM POWER RSC", bfd_arch_rs6000,
2708b725ae77Skettenis bfd_mach_rs6k_rsc, -1, -1, tot_num_registers (registers_power),
2709b725ae77Skettenis registers_power},
2710b725ae77Skettenis {"rs2", "IBM POWER RS2", bfd_arch_rs6000,
2711b725ae77Skettenis bfd_mach_rs6k_rs2, -1, -1, tot_num_registers (registers_power),
2712b725ae77Skettenis registers_power},
2713b725ae77Skettenis
2714b725ae77Skettenis {0, 0, 0, 0, 0, 0, 0, 0}
2715b725ae77Skettenis };
2716b725ae77Skettenis
2717b725ae77Skettenis /* Initialize the number of registers and pseudo registers in each variant. */
2718b725ae77Skettenis
2719b725ae77Skettenis static void
init_variants(void)2720b725ae77Skettenis init_variants (void)
2721b725ae77Skettenis {
2722b725ae77Skettenis struct variant *v;
2723b725ae77Skettenis
2724b725ae77Skettenis for (v = variants; v->name; v++)
2725b725ae77Skettenis {
2726b725ae77Skettenis if (v->nregs == -1)
2727b725ae77Skettenis v->nregs = num_registers (v->regs, v->num_tot_regs);
2728b725ae77Skettenis if (v->npregs == -1)
2729b725ae77Skettenis v->npregs = num_pseudo_registers (v->regs, v->num_tot_regs);
2730b725ae77Skettenis }
2731b725ae77Skettenis }
2732b725ae77Skettenis
2733b725ae77Skettenis /* Return the variant corresponding to architecture ARCH and machine number
2734b725ae77Skettenis MACH. If no such variant exists, return null. */
2735b725ae77Skettenis
2736b725ae77Skettenis static const struct variant *
find_variant_by_arch(enum bfd_architecture arch,unsigned long mach)2737b725ae77Skettenis find_variant_by_arch (enum bfd_architecture arch, unsigned long mach)
2738b725ae77Skettenis {
2739b725ae77Skettenis const struct variant *v;
2740b725ae77Skettenis
2741b725ae77Skettenis for (v = variants; v->name; v++)
2742b725ae77Skettenis if (arch == v->arch && mach == v->mach)
2743b725ae77Skettenis return v;
2744b725ae77Skettenis
2745b725ae77Skettenis return NULL;
2746b725ae77Skettenis }
2747b725ae77Skettenis
2748b725ae77Skettenis static int
gdb_print_insn_powerpc(bfd_vma memaddr,disassemble_info * info)2749b725ae77Skettenis gdb_print_insn_powerpc (bfd_vma memaddr, disassemble_info *info)
2750b725ae77Skettenis {
2751b725ae77Skettenis if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2752e93f7393Sniklas return print_insn_big_powerpc (memaddr, info);
2753e93f7393Sniklas else
2754e93f7393Sniklas return print_insn_little_powerpc (memaddr, info);
2755e93f7393Sniklas }
2756b725ae77Skettenis
2757*63addd46Skettenis static CORE_ADDR
rs6000_unwind_pc(struct gdbarch * gdbarch,struct frame_info * next_frame)2758*63addd46Skettenis rs6000_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
2759*63addd46Skettenis {
2760*63addd46Skettenis return frame_unwind_register_unsigned (next_frame, PC_REGNUM);
2761*63addd46Skettenis }
2762*63addd46Skettenis
2763*63addd46Skettenis static struct frame_id
rs6000_unwind_dummy_id(struct gdbarch * gdbarch,struct frame_info * next_frame)2764*63addd46Skettenis rs6000_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
2765*63addd46Skettenis {
2766*63addd46Skettenis return frame_id_build (frame_unwind_register_unsigned (next_frame,
2767*63addd46Skettenis SP_REGNUM),
2768*63addd46Skettenis frame_pc_unwind (next_frame));
2769*63addd46Skettenis }
2770*63addd46Skettenis
2771*63addd46Skettenis struct rs6000_frame_cache
2772*63addd46Skettenis {
2773*63addd46Skettenis CORE_ADDR base;
2774*63addd46Skettenis CORE_ADDR initial_sp;
2775*63addd46Skettenis struct trad_frame_saved_reg *saved_regs;
2776*63addd46Skettenis };
2777*63addd46Skettenis
2778*63addd46Skettenis static struct rs6000_frame_cache *
rs6000_frame_cache(struct frame_info * next_frame,void ** this_cache)2779*63addd46Skettenis rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
2780*63addd46Skettenis {
2781*63addd46Skettenis struct rs6000_frame_cache *cache;
2782*63addd46Skettenis struct gdbarch *gdbarch = get_frame_arch (next_frame);
2783*63addd46Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2784*63addd46Skettenis struct rs6000_framedata fdata;
2785*63addd46Skettenis int wordsize = tdep->wordsize;
2786*63addd46Skettenis
2787*63addd46Skettenis if ((*this_cache) != NULL)
2788*63addd46Skettenis return (*this_cache);
2789*63addd46Skettenis cache = FRAME_OBSTACK_ZALLOC (struct rs6000_frame_cache);
2790*63addd46Skettenis (*this_cache) = cache;
2791*63addd46Skettenis cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
2792*63addd46Skettenis
2793*63addd46Skettenis skip_prologue (frame_func_unwind (next_frame), frame_pc_unwind (next_frame),
2794*63addd46Skettenis &fdata);
2795*63addd46Skettenis
2796*63addd46Skettenis /* If there were any saved registers, figure out parent's stack
2797*63addd46Skettenis pointer. */
2798*63addd46Skettenis /* The following is true only if the frame doesn't have a call to
2799*63addd46Skettenis alloca(), FIXME. */
2800*63addd46Skettenis
2801*63addd46Skettenis if (fdata.saved_fpr == 0
2802*63addd46Skettenis && fdata.saved_gpr == 0
2803*63addd46Skettenis && fdata.saved_vr == 0
2804*63addd46Skettenis && fdata.saved_ev == 0
2805*63addd46Skettenis && fdata.lr_offset == 0
2806*63addd46Skettenis && fdata.cr_offset == 0
2807*63addd46Skettenis && fdata.vr_offset == 0
2808*63addd46Skettenis && fdata.ev_offset == 0)
2809*63addd46Skettenis cache->base = frame_unwind_register_unsigned (next_frame, SP_REGNUM);
2810*63addd46Skettenis else
2811*63addd46Skettenis {
2812*63addd46Skettenis /* NOTE: cagney/2002-04-14: The ->frame points to the inner-most
2813*63addd46Skettenis address of the current frame. Things might be easier if the
2814*63addd46Skettenis ->frame pointed to the outer-most address of the frame. In
2815*63addd46Skettenis the mean time, the address of the prev frame is used as the
2816*63addd46Skettenis base address of this frame. */
2817*63addd46Skettenis cache->base = frame_unwind_register_unsigned (next_frame, SP_REGNUM);
2818*63addd46Skettenis if (!fdata.frameless)
2819*63addd46Skettenis /* Frameless really means stackless. */
2820*63addd46Skettenis cache->base = read_memory_addr (cache->base, wordsize);
2821*63addd46Skettenis }
2822*63addd46Skettenis trad_frame_set_value (cache->saved_regs, SP_REGNUM, cache->base);
2823*63addd46Skettenis
2824*63addd46Skettenis /* if != -1, fdata.saved_fpr is the smallest number of saved_fpr.
2825*63addd46Skettenis All fpr's from saved_fpr to fp31 are saved. */
2826*63addd46Skettenis
2827*63addd46Skettenis if (fdata.saved_fpr >= 0)
2828*63addd46Skettenis {
2829*63addd46Skettenis int i;
2830*63addd46Skettenis CORE_ADDR fpr_addr = cache->base + fdata.fpr_offset;
2831*63addd46Skettenis
2832*63addd46Skettenis /* If skip_prologue says floating-point registers were saved,
2833*63addd46Skettenis but the current architecture has no floating-point registers,
2834*63addd46Skettenis then that's strange. But we have no indices to even record
2835*63addd46Skettenis the addresses under, so we just ignore it. */
2836*63addd46Skettenis if (ppc_floating_point_unit_p (gdbarch))
2837*63addd46Skettenis for (i = fdata.saved_fpr; i < ppc_num_fprs; i++)
2838*63addd46Skettenis {
2839*63addd46Skettenis cache->saved_regs[tdep->ppc_fp0_regnum + i].addr = fpr_addr;
2840*63addd46Skettenis fpr_addr += 8;
2841*63addd46Skettenis }
2842*63addd46Skettenis }
2843*63addd46Skettenis
2844*63addd46Skettenis /* if != -1, fdata.saved_gpr is the smallest number of saved_gpr.
2845*63addd46Skettenis All gpr's from saved_gpr to gpr31 are saved. */
2846*63addd46Skettenis
2847*63addd46Skettenis if (fdata.saved_gpr >= 0)
2848*63addd46Skettenis {
2849*63addd46Skettenis int i;
2850*63addd46Skettenis CORE_ADDR gpr_addr = cache->base + fdata.gpr_offset;
2851*63addd46Skettenis for (i = fdata.saved_gpr; i < ppc_num_gprs; i++)
2852*63addd46Skettenis {
2853*63addd46Skettenis cache->saved_regs[tdep->ppc_gp0_regnum + i].addr = gpr_addr;
2854*63addd46Skettenis gpr_addr += wordsize;
2855*63addd46Skettenis }
2856*63addd46Skettenis }
2857*63addd46Skettenis
2858*63addd46Skettenis /* if != -1, fdata.saved_vr is the smallest number of saved_vr.
2859*63addd46Skettenis All vr's from saved_vr to vr31 are saved. */
2860*63addd46Skettenis if (tdep->ppc_vr0_regnum != -1 && tdep->ppc_vrsave_regnum != -1)
2861*63addd46Skettenis {
2862*63addd46Skettenis if (fdata.saved_vr >= 0)
2863*63addd46Skettenis {
2864*63addd46Skettenis int i;
2865*63addd46Skettenis CORE_ADDR vr_addr = cache->base + fdata.vr_offset;
2866*63addd46Skettenis for (i = fdata.saved_vr; i < 32; i++)
2867*63addd46Skettenis {
2868*63addd46Skettenis cache->saved_regs[tdep->ppc_vr0_regnum + i].addr = vr_addr;
2869*63addd46Skettenis vr_addr += register_size (gdbarch, tdep->ppc_vr0_regnum);
2870*63addd46Skettenis }
2871*63addd46Skettenis }
2872*63addd46Skettenis }
2873*63addd46Skettenis
2874*63addd46Skettenis /* if != -1, fdata.saved_ev is the smallest number of saved_ev.
2875*63addd46Skettenis All vr's from saved_ev to ev31 are saved. ????? */
2876*63addd46Skettenis if (tdep->ppc_ev0_regnum != -1 && tdep->ppc_ev31_regnum != -1)
2877*63addd46Skettenis {
2878*63addd46Skettenis if (fdata.saved_ev >= 0)
2879*63addd46Skettenis {
2880*63addd46Skettenis int i;
2881*63addd46Skettenis CORE_ADDR ev_addr = cache->base + fdata.ev_offset;
2882*63addd46Skettenis for (i = fdata.saved_ev; i < ppc_num_gprs; i++)
2883*63addd46Skettenis {
2884*63addd46Skettenis cache->saved_regs[tdep->ppc_ev0_regnum + i].addr = ev_addr;
2885*63addd46Skettenis cache->saved_regs[tdep->ppc_gp0_regnum + i].addr = ev_addr + 4;
2886*63addd46Skettenis ev_addr += register_size (gdbarch, tdep->ppc_ev0_regnum);
2887*63addd46Skettenis }
2888*63addd46Skettenis }
2889*63addd46Skettenis }
2890*63addd46Skettenis
2891*63addd46Skettenis /* If != 0, fdata.cr_offset is the offset from the frame that
2892*63addd46Skettenis holds the CR. */
2893*63addd46Skettenis if (fdata.cr_offset != 0)
2894*63addd46Skettenis cache->saved_regs[tdep->ppc_cr_regnum].addr = cache->base + fdata.cr_offset;
2895*63addd46Skettenis
2896*63addd46Skettenis /* If != 0, fdata.lr_offset is the offset from the frame that
2897*63addd46Skettenis holds the LR. */
2898*63addd46Skettenis if (fdata.lr_offset != 0)
2899*63addd46Skettenis cache->saved_regs[tdep->ppc_lr_regnum].addr = cache->base + fdata.lr_offset;
2900*63addd46Skettenis /* The PC is found in the link register. */
2901*63addd46Skettenis cache->saved_regs[PC_REGNUM] = cache->saved_regs[tdep->ppc_lr_regnum];
2902*63addd46Skettenis
2903*63addd46Skettenis /* If != 0, fdata.vrsave_offset is the offset from the frame that
2904*63addd46Skettenis holds the VRSAVE. */
2905*63addd46Skettenis if (fdata.vrsave_offset != 0)
2906*63addd46Skettenis cache->saved_regs[tdep->ppc_vrsave_regnum].addr = cache->base + fdata.vrsave_offset;
2907*63addd46Skettenis
2908*63addd46Skettenis if (fdata.alloca_reg < 0)
2909*63addd46Skettenis /* If no alloca register used, then fi->frame is the value of the
2910*63addd46Skettenis %sp for this frame, and it is good enough. */
2911*63addd46Skettenis cache->initial_sp = frame_unwind_register_unsigned (next_frame, SP_REGNUM);
2912*63addd46Skettenis else
2913*63addd46Skettenis cache->initial_sp = frame_unwind_register_unsigned (next_frame,
2914*63addd46Skettenis fdata.alloca_reg);
2915*63addd46Skettenis
2916*63addd46Skettenis return cache;
2917*63addd46Skettenis }
2918*63addd46Skettenis
2919*63addd46Skettenis static void
rs6000_frame_this_id(struct frame_info * next_frame,void ** this_cache,struct frame_id * this_id)2920*63addd46Skettenis rs6000_frame_this_id (struct frame_info *next_frame, void **this_cache,
2921*63addd46Skettenis struct frame_id *this_id)
2922*63addd46Skettenis {
2923*63addd46Skettenis struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
2924*63addd46Skettenis this_cache);
2925*63addd46Skettenis (*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
2926*63addd46Skettenis }
2927*63addd46Skettenis
2928*63addd46Skettenis static void
rs6000_frame_prev_register(struct frame_info * next_frame,void ** this_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * valuep)2929*63addd46Skettenis rs6000_frame_prev_register (struct frame_info *next_frame,
2930*63addd46Skettenis void **this_cache,
2931*63addd46Skettenis int regnum, int *optimizedp,
2932*63addd46Skettenis enum lval_type *lvalp, CORE_ADDR *addrp,
2933*63addd46Skettenis int *realnump, void *valuep)
2934*63addd46Skettenis {
2935*63addd46Skettenis struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
2936*63addd46Skettenis this_cache);
2937*63addd46Skettenis trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
2938*63addd46Skettenis optimizedp, lvalp, addrp, realnump, valuep);
2939*63addd46Skettenis }
2940*63addd46Skettenis
2941*63addd46Skettenis static const struct frame_unwind rs6000_frame_unwind =
2942*63addd46Skettenis {
2943*63addd46Skettenis NORMAL_FRAME,
2944*63addd46Skettenis rs6000_frame_this_id,
2945*63addd46Skettenis rs6000_frame_prev_register
2946*63addd46Skettenis };
2947*63addd46Skettenis
2948*63addd46Skettenis static const struct frame_unwind *
rs6000_frame_sniffer(struct frame_info * next_frame)2949*63addd46Skettenis rs6000_frame_sniffer (struct frame_info *next_frame)
2950*63addd46Skettenis {
2951*63addd46Skettenis return &rs6000_frame_unwind;
2952*63addd46Skettenis }
2953*63addd46Skettenis
2954*63addd46Skettenis
2955*63addd46Skettenis
2956*63addd46Skettenis static CORE_ADDR
rs6000_frame_base_address(struct frame_info * next_frame,void ** this_cache)2957*63addd46Skettenis rs6000_frame_base_address (struct frame_info *next_frame,
2958*63addd46Skettenis void **this_cache)
2959*63addd46Skettenis {
2960*63addd46Skettenis struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
2961*63addd46Skettenis this_cache);
2962*63addd46Skettenis return info->initial_sp;
2963*63addd46Skettenis }
2964*63addd46Skettenis
2965*63addd46Skettenis static const struct frame_base rs6000_frame_base = {
2966*63addd46Skettenis &rs6000_frame_unwind,
2967*63addd46Skettenis rs6000_frame_base_address,
2968*63addd46Skettenis rs6000_frame_base_address,
2969*63addd46Skettenis rs6000_frame_base_address
2970*63addd46Skettenis };
2971*63addd46Skettenis
2972*63addd46Skettenis static const struct frame_base *
rs6000_frame_base_sniffer(struct frame_info * next_frame)2973*63addd46Skettenis rs6000_frame_base_sniffer (struct frame_info *next_frame)
2974*63addd46Skettenis {
2975*63addd46Skettenis return &rs6000_frame_base;
2976*63addd46Skettenis }
2977*63addd46Skettenis
2978b725ae77Skettenis /* Initialize the current architecture based on INFO. If possible, re-use an
2979b725ae77Skettenis architecture from ARCHES, which is a list of architectures already created
2980b725ae77Skettenis during this debugging session.
2981b725ae77Skettenis
2982b725ae77Skettenis Called e.g. at program startup, when reading a core file, and when reading
2983b725ae77Skettenis a binary file. */
2984b725ae77Skettenis
2985b725ae77Skettenis static struct gdbarch *
rs6000_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)2986b725ae77Skettenis rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2987b725ae77Skettenis {
2988b725ae77Skettenis struct gdbarch *gdbarch;
2989b725ae77Skettenis struct gdbarch_tdep *tdep;
2990*63addd46Skettenis int wordsize, from_xcoff_exec, from_elf_exec, i, off;
2991b725ae77Skettenis struct reg *regs;
2992b725ae77Skettenis const struct variant *v;
2993b725ae77Skettenis enum bfd_architecture arch;
2994b725ae77Skettenis unsigned long mach;
2995b725ae77Skettenis bfd abfd;
2996b725ae77Skettenis int sysv_abi;
2997b725ae77Skettenis asection *sect;
2998b725ae77Skettenis
2999b725ae77Skettenis from_xcoff_exec = info.abfd && info.abfd->format == bfd_object &&
3000b725ae77Skettenis bfd_get_flavour (info.abfd) == bfd_target_xcoff_flavour;
3001b725ae77Skettenis
3002b725ae77Skettenis from_elf_exec = info.abfd && info.abfd->format == bfd_object &&
3003b725ae77Skettenis bfd_get_flavour (info.abfd) == bfd_target_elf_flavour;
3004b725ae77Skettenis
3005b725ae77Skettenis sysv_abi = info.abfd && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour;
3006b725ae77Skettenis
3007b725ae77Skettenis /* Check word size. If INFO is from a binary file, infer it from
3008b725ae77Skettenis that, else choose a likely default. */
3009b725ae77Skettenis if (from_xcoff_exec)
3010b725ae77Skettenis {
3011b725ae77Skettenis if (bfd_xcoff_is_xcoff64 (info.abfd))
3012b725ae77Skettenis wordsize = 8;
3013b725ae77Skettenis else
3014b725ae77Skettenis wordsize = 4;
3015b725ae77Skettenis }
3016b725ae77Skettenis else if (from_elf_exec)
3017b725ae77Skettenis {
3018b725ae77Skettenis if (elf_elfheader (info.abfd)->e_ident[EI_CLASS] == ELFCLASS64)
3019b725ae77Skettenis wordsize = 8;
3020b725ae77Skettenis else
3021b725ae77Skettenis wordsize = 4;
3022b725ae77Skettenis }
3023b725ae77Skettenis else
3024b725ae77Skettenis {
3025b725ae77Skettenis if (info.bfd_arch_info != NULL && info.bfd_arch_info->bits_per_word != 0)
3026b725ae77Skettenis wordsize = info.bfd_arch_info->bits_per_word /
3027b725ae77Skettenis info.bfd_arch_info->bits_per_byte;
3028b725ae77Skettenis else
3029b725ae77Skettenis wordsize = 4;
3030b725ae77Skettenis }
3031b725ae77Skettenis
3032b725ae77Skettenis /* Find a candidate among extant architectures. */
3033b725ae77Skettenis for (arches = gdbarch_list_lookup_by_info (arches, &info);
3034b725ae77Skettenis arches != NULL;
3035b725ae77Skettenis arches = gdbarch_list_lookup_by_info (arches->next, &info))
3036b725ae77Skettenis {
3037b725ae77Skettenis /* Word size in the various PowerPC bfd_arch_info structs isn't
3038b725ae77Skettenis meaningful, because 64-bit CPUs can run in 32-bit mode. So, perform
3039b725ae77Skettenis separate word size check. */
3040b725ae77Skettenis tdep = gdbarch_tdep (arches->gdbarch);
3041b725ae77Skettenis if (tdep && tdep->wordsize == wordsize)
3042b725ae77Skettenis return arches->gdbarch;
3043b725ae77Skettenis }
3044b725ae77Skettenis
3045b725ae77Skettenis /* None found, create a new architecture from INFO, whose bfd_arch_info
3046b725ae77Skettenis validity depends on the source:
3047b725ae77Skettenis - executable useless
3048b725ae77Skettenis - rs6000_host_arch() good
3049b725ae77Skettenis - core file good
3050b725ae77Skettenis - "set arch" trust blindly
3051b725ae77Skettenis - GDB startup useless but harmless */
3052b725ae77Skettenis
3053b725ae77Skettenis if (!from_xcoff_exec)
3054b725ae77Skettenis {
3055b725ae77Skettenis arch = info.bfd_arch_info->arch;
3056b725ae77Skettenis mach = info.bfd_arch_info->mach;
3057b725ae77Skettenis }
3058b725ae77Skettenis else
3059b725ae77Skettenis {
3060b725ae77Skettenis arch = bfd_arch_powerpc;
3061b725ae77Skettenis bfd_default_set_arch_mach (&abfd, arch, 0);
3062b725ae77Skettenis info.bfd_arch_info = bfd_get_arch_info (&abfd);
3063b725ae77Skettenis mach = info.bfd_arch_info->mach;
3064b725ae77Skettenis }
3065b725ae77Skettenis tdep = xmalloc (sizeof (struct gdbarch_tdep));
3066b725ae77Skettenis tdep->wordsize = wordsize;
3067b725ae77Skettenis
3068b725ae77Skettenis /* For e500 executables, the apuinfo section is of help here. Such
3069b725ae77Skettenis section contains the identifier and revision number of each
3070b725ae77Skettenis Application-specific Processing Unit that is present on the
3071b725ae77Skettenis chip. The content of the section is determined by the assembler
3072b725ae77Skettenis which looks at each instruction and determines which unit (and
3073b725ae77Skettenis which version of it) can execute it. In our case we just look for
3074b725ae77Skettenis the existance of the section. */
3075b725ae77Skettenis
3076b725ae77Skettenis if (info.abfd)
3077b725ae77Skettenis {
3078b725ae77Skettenis sect = bfd_get_section_by_name (info.abfd, ".PPC.EMB.apuinfo");
3079b725ae77Skettenis if (sect)
3080b725ae77Skettenis {
3081b725ae77Skettenis arch = info.bfd_arch_info->arch;
3082b725ae77Skettenis mach = bfd_mach_ppc_e500;
3083b725ae77Skettenis bfd_default_set_arch_mach (&abfd, arch, mach);
3084b725ae77Skettenis info.bfd_arch_info = bfd_get_arch_info (&abfd);
3085b725ae77Skettenis }
3086b725ae77Skettenis }
3087b725ae77Skettenis
3088b725ae77Skettenis gdbarch = gdbarch_alloc (&info, tdep);
3089b725ae77Skettenis
3090b725ae77Skettenis /* Initialize the number of real and pseudo registers in each variant. */
3091b725ae77Skettenis init_variants ();
3092b725ae77Skettenis
3093b725ae77Skettenis /* Choose variant. */
3094b725ae77Skettenis v = find_variant_by_arch (arch, mach);
3095b725ae77Skettenis if (!v)
3096b725ae77Skettenis return NULL;
3097b725ae77Skettenis
3098b725ae77Skettenis tdep->regs = v->regs;
3099b725ae77Skettenis
3100b725ae77Skettenis tdep->ppc_gp0_regnum = 0;
3101b725ae77Skettenis tdep->ppc_toc_regnum = 2;
3102b725ae77Skettenis tdep->ppc_ps_regnum = 65;
3103b725ae77Skettenis tdep->ppc_cr_regnum = 66;
3104b725ae77Skettenis tdep->ppc_lr_regnum = 67;
3105b725ae77Skettenis tdep->ppc_ctr_regnum = 68;
3106b725ae77Skettenis tdep->ppc_xer_regnum = 69;
3107b725ae77Skettenis if (v->mach == bfd_mach_ppc_601)
3108b725ae77Skettenis tdep->ppc_mq_regnum = 124;
3109*63addd46Skettenis else if (arch == bfd_arch_rs6000)
3110b725ae77Skettenis tdep->ppc_mq_regnum = 70;
3111b725ae77Skettenis else
3112b725ae77Skettenis tdep->ppc_mq_regnum = -1;
3113*63addd46Skettenis tdep->ppc_fp0_regnum = 32;
3114*63addd46Skettenis tdep->ppc_fpscr_regnum = (arch == bfd_arch_rs6000) ? 71 : 70;
3115*63addd46Skettenis tdep->ppc_sr0_regnum = 71;
3116*63addd46Skettenis tdep->ppc_vr0_regnum = -1;
3117*63addd46Skettenis tdep->ppc_vrsave_regnum = -1;
3118*63addd46Skettenis tdep->ppc_ev0_upper_regnum = -1;
3119*63addd46Skettenis tdep->ppc_ev0_regnum = -1;
3120*63addd46Skettenis tdep->ppc_ev31_regnum = -1;
3121*63addd46Skettenis tdep->ppc_acc_regnum = -1;
3122*63addd46Skettenis tdep->ppc_spefscr_regnum = -1;
3123b725ae77Skettenis
3124b725ae77Skettenis set_gdbarch_pc_regnum (gdbarch, 64);
3125b725ae77Skettenis set_gdbarch_sp_regnum (gdbarch, 1);
3126b725ae77Skettenis set_gdbarch_deprecated_fp_regnum (gdbarch, 1);
3127*63addd46Skettenis set_gdbarch_register_sim_regno (gdbarch, rs6000_register_sim_regno);
3128b725ae77Skettenis if (sysv_abi && wordsize == 8)
3129b725ae77Skettenis set_gdbarch_return_value (gdbarch, ppc64_sysv_abi_return_value);
3130b725ae77Skettenis else if (sysv_abi && wordsize == 4)
3131b725ae77Skettenis set_gdbarch_return_value (gdbarch, ppc_sysv_abi_return_value);
3132b725ae77Skettenis else
3133b725ae77Skettenis {
3134b725ae77Skettenis set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value);
3135*63addd46Skettenis set_gdbarch_store_return_value (gdbarch, rs6000_store_return_value);
3136b725ae77Skettenis }
3137b725ae77Skettenis
3138b725ae77Skettenis /* Set lr_frame_offset. */
3139b725ae77Skettenis if (wordsize == 8)
3140b725ae77Skettenis tdep->lr_frame_offset = 16;
3141b725ae77Skettenis else if (sysv_abi)
3142b725ae77Skettenis tdep->lr_frame_offset = 4;
3143b725ae77Skettenis else
3144b725ae77Skettenis tdep->lr_frame_offset = 8;
3145b725ae77Skettenis
3146*63addd46Skettenis if (v->arch == bfd_arch_rs6000)
3147*63addd46Skettenis tdep->ppc_sr0_regnum = -1;
3148*63addd46Skettenis else if (v->arch == bfd_arch_powerpc)
3149*63addd46Skettenis switch (v->mach)
3150b725ae77Skettenis {
3151*63addd46Skettenis case bfd_mach_ppc:
3152*63addd46Skettenis tdep->ppc_sr0_regnum = -1;
3153*63addd46Skettenis tdep->ppc_vr0_regnum = 71;
3154*63addd46Skettenis tdep->ppc_vrsave_regnum = 104;
3155*63addd46Skettenis break;
3156*63addd46Skettenis case bfd_mach_ppc_7400:
3157*63addd46Skettenis tdep->ppc_vr0_regnum = 119;
3158*63addd46Skettenis tdep->ppc_vrsave_regnum = 152;
3159*63addd46Skettenis break;
3160*63addd46Skettenis case bfd_mach_ppc_e500:
3161*63addd46Skettenis tdep->ppc_toc_regnum = -1;
3162*63addd46Skettenis tdep->ppc_ev0_upper_regnum = 32;
3163*63addd46Skettenis tdep->ppc_ev0_regnum = 73;
3164*63addd46Skettenis tdep->ppc_ev31_regnum = 104;
3165*63addd46Skettenis tdep->ppc_acc_regnum = 71;
3166*63addd46Skettenis tdep->ppc_spefscr_regnum = 72;
3167*63addd46Skettenis tdep->ppc_fp0_regnum = -1;
3168*63addd46Skettenis tdep->ppc_fpscr_regnum = -1;
3169*63addd46Skettenis tdep->ppc_sr0_regnum = -1;
3170*63addd46Skettenis set_gdbarch_pseudo_register_read (gdbarch, e500_pseudo_register_read);
3171*63addd46Skettenis set_gdbarch_pseudo_register_write (gdbarch, e500_pseudo_register_write);
3172*63addd46Skettenis set_gdbarch_register_reggroup_p (gdbarch, e500_register_reggroup_p);
3173*63addd46Skettenis break;
3174*63addd46Skettenis
3175*63addd46Skettenis case bfd_mach_ppc64:
3176*63addd46Skettenis case bfd_mach_ppc_620:
3177*63addd46Skettenis case bfd_mach_ppc_630:
3178*63addd46Skettenis case bfd_mach_ppc_a35:
3179*63addd46Skettenis case bfd_mach_ppc_rs64ii:
3180*63addd46Skettenis case bfd_mach_ppc_rs64iii:
3181*63addd46Skettenis /* These processor's register sets don't have segment registers. */
3182*63addd46Skettenis tdep->ppc_sr0_regnum = -1;
3183*63addd46Skettenis break;
3184b725ae77Skettenis }
3185*63addd46Skettenis else
3186*63addd46Skettenis internal_error (__FILE__, __LINE__,
3187*63addd46Skettenis "rs6000_gdbarch_init: "
3188*63addd46Skettenis "received unexpected BFD 'arch' value");
3189*63addd46Skettenis
3190*63addd46Skettenis /* Sanity check on registers. */
3191*63addd46Skettenis gdb_assert (strcmp (tdep->regs[tdep->ppc_gp0_regnum].name, "r0") == 0);
3192b725ae77Skettenis
3193b725ae77Skettenis /* Select instruction printer. */
3194*63addd46Skettenis if (arch == bfd_arch_rs6000)
3195b725ae77Skettenis set_gdbarch_print_insn (gdbarch, print_insn_rs6000);
3196b725ae77Skettenis else
3197b725ae77Skettenis set_gdbarch_print_insn (gdbarch, gdb_print_insn_powerpc);
3198b725ae77Skettenis
3199b725ae77Skettenis set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
3200b725ae77Skettenis
3201b725ae77Skettenis set_gdbarch_num_regs (gdbarch, v->nregs);
3202b725ae77Skettenis set_gdbarch_num_pseudo_regs (gdbarch, v->npregs);
3203b725ae77Skettenis set_gdbarch_register_name (gdbarch, rs6000_register_name);
3204*63addd46Skettenis set_gdbarch_register_type (gdbarch, rs6000_register_type);
3205b725ae77Skettenis
3206b725ae77Skettenis set_gdbarch_ptr_bit (gdbarch, wordsize * TARGET_CHAR_BIT);
3207b725ae77Skettenis set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
3208b725ae77Skettenis set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3209b725ae77Skettenis set_gdbarch_long_bit (gdbarch, wordsize * TARGET_CHAR_BIT);
3210b725ae77Skettenis set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3211b725ae77Skettenis set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3212b725ae77Skettenis set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3213b725ae77Skettenis if (sysv_abi)
3214b725ae77Skettenis set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
3215b725ae77Skettenis else
3216b725ae77Skettenis set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3217b725ae77Skettenis set_gdbarch_char_signed (gdbarch, 0);
3218b725ae77Skettenis
3219b725ae77Skettenis set_gdbarch_frame_align (gdbarch, rs6000_frame_align);
3220b725ae77Skettenis if (sysv_abi && wordsize == 8)
3221b725ae77Skettenis /* PPC64 SYSV. */
3222b725ae77Skettenis set_gdbarch_frame_red_zone_size (gdbarch, 288);
3223b725ae77Skettenis else if (!sysv_abi && wordsize == 4)
3224b725ae77Skettenis /* PowerOpen / AIX 32 bit. The saved area or red zone consists of
3225b725ae77Skettenis 19 4 byte GPRS + 18 8 byte FPRs giving a total of 220 bytes.
3226b725ae77Skettenis Problem is, 220 isn't frame (16 byte) aligned. Round it up to
3227b725ae77Skettenis 224. */
3228b725ae77Skettenis set_gdbarch_frame_red_zone_size (gdbarch, 224);
3229b725ae77Skettenis
3230*63addd46Skettenis set_gdbarch_convert_register_p (gdbarch, rs6000_convert_register_p);
3231*63addd46Skettenis set_gdbarch_register_to_value (gdbarch, rs6000_register_to_value);
3232*63addd46Skettenis set_gdbarch_value_to_register (gdbarch, rs6000_value_to_register);
3233*63addd46Skettenis
3234b725ae77Skettenis set_gdbarch_stab_reg_to_regnum (gdbarch, rs6000_stab_reg_to_regnum);
3235*63addd46Skettenis set_gdbarch_dwarf2_reg_to_regnum (gdbarch, rs6000_dwarf2_reg_to_regnum);
3236b725ae77Skettenis /* Note: kevinb/2002-04-12: I'm not convinced that rs6000_push_arguments()
3237b725ae77Skettenis is correct for the SysV ABI when the wordsize is 8, but I'm also
3238b725ae77Skettenis fairly certain that ppc_sysv_abi_push_arguments() will give even
3239b725ae77Skettenis worse results since it only works for 32-bit code. So, for the moment,
3240b725ae77Skettenis we're better off calling rs6000_push_arguments() since it works for
3241b725ae77Skettenis 64-bit code. At some point in the future, this matter needs to be
3242b725ae77Skettenis revisited. */
3243b725ae77Skettenis if (sysv_abi && wordsize == 4)
3244b725ae77Skettenis set_gdbarch_push_dummy_call (gdbarch, ppc_sysv_abi_push_dummy_call);
3245b725ae77Skettenis else if (sysv_abi && wordsize == 8)
3246b725ae77Skettenis set_gdbarch_push_dummy_call (gdbarch, ppc64_sysv_abi_push_dummy_call);
3247b725ae77Skettenis else
3248b725ae77Skettenis set_gdbarch_push_dummy_call (gdbarch, rs6000_push_dummy_call);
3249b725ae77Skettenis
3250b725ae77Skettenis set_gdbarch_deprecated_extract_struct_value_address (gdbarch, rs6000_extract_struct_value_address);
3251b725ae77Skettenis
3252b725ae77Skettenis set_gdbarch_skip_prologue (gdbarch, rs6000_skip_prologue);
3253b725ae77Skettenis set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
3254b725ae77Skettenis set_gdbarch_breakpoint_from_pc (gdbarch, rs6000_breakpoint_from_pc);
3255b725ae77Skettenis
3256b725ae77Skettenis /* Handle the 64-bit SVR4 minimal-symbol convention of using "FN"
3257b725ae77Skettenis for the descriptor and ".FN" for the entry-point -- a user
3258b725ae77Skettenis specifying "break FN" will unexpectedly end up with a breakpoint
3259b725ae77Skettenis on the descriptor and not the function. This architecture method
3260b725ae77Skettenis transforms any breakpoints on descriptors into breakpoints on the
3261b725ae77Skettenis corresponding entry point. */
3262b725ae77Skettenis if (sysv_abi && wordsize == 8)
3263b725ae77Skettenis set_gdbarch_adjust_breakpoint_address (gdbarch, ppc64_sysv_abi_adjust_breakpoint_address);
3264b725ae77Skettenis
3265b725ae77Skettenis /* Not sure on this. FIXMEmgo */
3266b725ae77Skettenis set_gdbarch_frame_args_skip (gdbarch, 8);
3267b725ae77Skettenis
3268b725ae77Skettenis if (!sysv_abi)
3269*63addd46Skettenis set_gdbarch_deprecated_use_struct_convention (gdbarch, rs6000_use_struct_convention);
3270b725ae77Skettenis
3271b725ae77Skettenis if (!sysv_abi)
3272b725ae77Skettenis {
3273b725ae77Skettenis /* Handle RS/6000 function pointers (which are really function
3274b725ae77Skettenis descriptors). */
3275b725ae77Skettenis set_gdbarch_convert_from_func_ptr_addr (gdbarch,
3276b725ae77Skettenis rs6000_convert_from_func_ptr_addr);
3277b725ae77Skettenis }
3278b725ae77Skettenis
3279b725ae77Skettenis /* Helpers for function argument information. */
3280b725ae77Skettenis set_gdbarch_fetch_pointer_argument (gdbarch, rs6000_fetch_pointer_argument);
3281b725ae77Skettenis
3282b725ae77Skettenis /* Hook in ABI-specific overrides, if they have been registered. */
3283b725ae77Skettenis gdbarch_init_osabi (info, gdbarch);
3284b725ae77Skettenis
3285*63addd46Skettenis switch (info.osabi)
3286*63addd46Skettenis {
3287*63addd46Skettenis case GDB_OSABI_NETBSD_AOUT:
3288*63addd46Skettenis case GDB_OSABI_NETBSD_ELF:
3289*63addd46Skettenis case GDB_OSABI_UNKNOWN:
3290*63addd46Skettenis case GDB_OSABI_LINUX:
3291*63addd46Skettenis set_gdbarch_unwind_pc (gdbarch, rs6000_unwind_pc);
3292*63addd46Skettenis frame_unwind_append_sniffer (gdbarch, rs6000_frame_sniffer);
3293*63addd46Skettenis set_gdbarch_unwind_dummy_id (gdbarch, rs6000_unwind_dummy_id);
3294*63addd46Skettenis frame_base_append_sniffer (gdbarch, rs6000_frame_base_sniffer);
3295*63addd46Skettenis break;
3296*63addd46Skettenis default:
3297*63addd46Skettenis set_gdbarch_believe_pcc_promotion (gdbarch, 1);
3298*63addd46Skettenis
3299*63addd46Skettenis set_gdbarch_unwind_pc (gdbarch, rs6000_unwind_pc);
3300*63addd46Skettenis frame_unwind_append_sniffer (gdbarch, rs6000_frame_sniffer);
3301*63addd46Skettenis set_gdbarch_unwind_dummy_id (gdbarch, rs6000_unwind_dummy_id);
3302*63addd46Skettenis frame_base_append_sniffer (gdbarch, rs6000_frame_base_sniffer);
3303*63addd46Skettenis }
3304*63addd46Skettenis
3305b725ae77Skettenis if (from_xcoff_exec)
3306b725ae77Skettenis {
3307b725ae77Skettenis /* NOTE: jimix/2003-06-09: This test should really check for
3308b725ae77Skettenis GDB_OSABI_AIX when that is defined and becomes
3309b725ae77Skettenis available. (Actually, once things are properly split apart,
3310b725ae77Skettenis the test goes away.) */
3311b725ae77Skettenis /* RS6000/AIX does not support PT_STEP. Has to be simulated. */
3312b725ae77Skettenis set_gdbarch_software_single_step (gdbarch, rs6000_software_single_step);
3313b725ae77Skettenis }
3314b725ae77Skettenis
3315*63addd46Skettenis init_sim_regno_table (gdbarch);
3316*63addd46Skettenis
3317b725ae77Skettenis return gdbarch;
3318b725ae77Skettenis }
3319b725ae77Skettenis
3320b725ae77Skettenis static void
rs6000_dump_tdep(struct gdbarch * current_gdbarch,struct ui_file * file)3321b725ae77Skettenis rs6000_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
3322b725ae77Skettenis {
3323b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3324b725ae77Skettenis
3325b725ae77Skettenis if (tdep == NULL)
3326b725ae77Skettenis return;
3327b725ae77Skettenis
3328b725ae77Skettenis /* FIXME: Dump gdbarch_tdep. */
3329b725ae77Skettenis }
3330b725ae77Skettenis
3331b725ae77Skettenis static struct cmd_list_element *info_powerpc_cmdlist = NULL;
3332b725ae77Skettenis
3333b725ae77Skettenis static void
rs6000_info_powerpc_command(char * args,int from_tty)3334b725ae77Skettenis rs6000_info_powerpc_command (char *args, int from_tty)
3335b725ae77Skettenis {
3336b725ae77Skettenis help_list (info_powerpc_cmdlist, "info powerpc ", class_info, gdb_stdout);
3337b725ae77Skettenis }
3338b725ae77Skettenis
3339b725ae77Skettenis /* Initialization code. */
3340b725ae77Skettenis
3341b725ae77Skettenis extern initialize_file_ftype _initialize_rs6000_tdep; /* -Wmissing-prototypes */
3342e93f7393Sniklas
3343e93f7393Sniklas void
_initialize_rs6000_tdep(void)3344b725ae77Skettenis _initialize_rs6000_tdep (void)
3345e93f7393Sniklas {
3346b725ae77Skettenis gdbarch_register (bfd_arch_rs6000, rs6000_gdbarch_init, rs6000_dump_tdep);
3347b725ae77Skettenis gdbarch_register (bfd_arch_powerpc, rs6000_gdbarch_init, rs6000_dump_tdep);
3348e93f7393Sniklas
3349b725ae77Skettenis /* Add root prefix command for "info powerpc" commands */
3350b725ae77Skettenis add_prefix_cmd ("powerpc", class_info, rs6000_info_powerpc_command,
3351b725ae77Skettenis "Various POWERPC info specific commands.",
3352b725ae77Skettenis &info_powerpc_cmdlist, "info powerpc ", 0, &infolist);
3353e93f7393Sniklas }
3354