xref: /openbsd-src/gnu/usr.bin/binutils/gdb/rs6000-tdep.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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 (&regbuf[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