gdbarch software_single_step frame_info to regcache: rs6000
[deliverable/binutils-gdb.git] / gdb / rs6000-tdep.c
CommitLineData
c906108c 1/* Target-dependent code for GDB, the GNU debugger.
7aea86e6 2
618f726f 3 Copyright (C) 1986-2016 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "frame.h"
22#include "inferior.h"
45741a9c 23#include "infrun.h"
c906108c
SS
24#include "symtab.h"
25#include "target.h"
26#include "gdbcore.h"
27#include "gdbcmd.h"
c906108c 28#include "objfiles.h"
7a78ae4e 29#include "arch-utils.h"
4e052eda 30#include "regcache.h"
d195bc9f 31#include "regset.h"
d16aafd8 32#include "doublest.h"
fd0407d6 33#include "value.h"
1fcc0bb8 34#include "parser-defs.h"
4be87837 35#include "osabi.h"
7d9b040b 36#include "infcall.h"
9f643768
JB
37#include "sim-regno.h"
38#include "gdb/sim-ppc.h"
6ced10dd 39#include "reggroups.h"
4fc771b8 40#include "dwarf2-frame.h"
7cc46491
DJ
41#include "target-descriptions.h"
42#include "user-regs.h"
b4cdae6f
WW
43#include "record-full.h"
44#include "auxv.h"
7a78ae4e 45
7a78ae4e 46#include "coff/internal.h" /* for libcoff.h */
2fccf04a 47#include "libcoff.h" /* for xcoff_data */
11ed25ac
KB
48#include "coff/xcoff.h"
49#include "libxcoff.h"
7a78ae4e 50
9aa1e687 51#include "elf-bfd.h"
55eddb0f 52#include "elf/ppc.h"
cd453cd0 53#include "elf/ppc64.h"
7a78ae4e 54
6ded7999 55#include "solib-svr4.h"
9aa1e687 56#include "ppc-tdep.h"
debb1f09 57#include "ppc-ravenscar-thread.h"
7a78ae4e 58
a89aa300 59#include "dis-asm.h"
338ef23d 60
61a65099
KB
61#include "trad-frame.h"
62#include "frame-unwind.h"
63#include "frame-base.h"
64
a67914de
MK
65#include "ax.h"
66#include "ax-gdb.h"
325fac50 67#include <algorithm>
a67914de 68
7cc46491 69#include "features/rs6000/powerpc-32.c"
7284e1be 70#include "features/rs6000/powerpc-altivec32.c"
604c2f83 71#include "features/rs6000/powerpc-vsx32.c"
7cc46491
DJ
72#include "features/rs6000/powerpc-403.c"
73#include "features/rs6000/powerpc-403gc.c"
4d09ffea 74#include "features/rs6000/powerpc-405.c"
7cc46491
DJ
75#include "features/rs6000/powerpc-505.c"
76#include "features/rs6000/powerpc-601.c"
77#include "features/rs6000/powerpc-602.c"
78#include "features/rs6000/powerpc-603.c"
79#include "features/rs6000/powerpc-604.c"
80#include "features/rs6000/powerpc-64.c"
7284e1be 81#include "features/rs6000/powerpc-altivec64.c"
604c2f83 82#include "features/rs6000/powerpc-vsx64.c"
7cc46491
DJ
83#include "features/rs6000/powerpc-7400.c"
84#include "features/rs6000/powerpc-750.c"
85#include "features/rs6000/powerpc-860.c"
86#include "features/rs6000/powerpc-e500.c"
87#include "features/rs6000/rs6000.c"
88
5a9e69ba
TJB
89/* Determine if regnum is an SPE pseudo-register. */
90#define IS_SPE_PSEUDOREG(tdep, regnum) ((tdep)->ppc_ev0_regnum >= 0 \
91 && (regnum) >= (tdep)->ppc_ev0_regnum \
92 && (regnum) < (tdep)->ppc_ev0_regnum + 32)
93
f949c649
TJB
94/* Determine if regnum is a decimal float pseudo-register. */
95#define IS_DFP_PSEUDOREG(tdep, regnum) ((tdep)->ppc_dl0_regnum >= 0 \
96 && (regnum) >= (tdep)->ppc_dl0_regnum \
97 && (regnum) < (tdep)->ppc_dl0_regnum + 16)
98
604c2f83
LM
99/* Determine if regnum is a POWER7 VSX register. */
100#define IS_VSX_PSEUDOREG(tdep, regnum) ((tdep)->ppc_vsr0_regnum >= 0 \
101 && (regnum) >= (tdep)->ppc_vsr0_regnum \
102 && (regnum) < (tdep)->ppc_vsr0_regnum + ppc_num_vsrs)
103
104/* Determine if regnum is a POWER7 Extended FP register. */
105#define IS_EFP_PSEUDOREG(tdep, regnum) ((tdep)->ppc_efpr0_regnum >= 0 \
106 && (regnum) >= (tdep)->ppc_efpr0_regnum \
d9492458 107 && (regnum) < (tdep)->ppc_efpr0_regnum + ppc_num_efprs)
604c2f83 108
55eddb0f
DJ
109/* The list of available "set powerpc ..." and "show powerpc ..."
110 commands. */
111static struct cmd_list_element *setpowerpccmdlist = NULL;
112static struct cmd_list_element *showpowerpccmdlist = NULL;
113
114static enum auto_boolean powerpc_soft_float_global = AUTO_BOOLEAN_AUTO;
115
116/* The vector ABI to use. Keep this in sync with powerpc_vector_abi. */
40478521 117static const char *const powerpc_vector_strings[] =
55eddb0f
DJ
118{
119 "auto",
120 "generic",
121 "altivec",
122 "spe",
123 NULL
124};
125
126/* A variable that can be configured by the user. */
127static enum powerpc_vector_abi powerpc_vector_abi_global = POWERPC_VEC_AUTO;
128static const char *powerpc_vector_abi_string = "auto";
129
0df8b418 130/* To be used by skip_prologue. */
7a78ae4e
ND
131
132struct rs6000_framedata
133 {
134 int offset; /* total size of frame --- the distance
135 by which we decrement sp to allocate
136 the frame */
137 int saved_gpr; /* smallest # of saved gpr */
46a9b8ed 138 unsigned int gpr_mask; /* Each bit is an individual saved GPR. */
7a78ae4e 139 int saved_fpr; /* smallest # of saved fpr */
6be8bc0c 140 int saved_vr; /* smallest # of saved vr */
96ff0de4 141 int saved_ev; /* smallest # of saved ev */
7a78ae4e 142 int alloca_reg; /* alloca register number (frame ptr) */
0df8b418
MS
143 char frameless; /* true if frameless functions. */
144 char nosavedpc; /* true if pc not saved. */
46a9b8ed 145 char used_bl; /* true if link register clobbered */
7a78ae4e
ND
146 int gpr_offset; /* offset of saved gprs from prev sp */
147 int fpr_offset; /* offset of saved fprs from prev sp */
6be8bc0c 148 int vr_offset; /* offset of saved vrs from prev sp */
96ff0de4 149 int ev_offset; /* offset of saved evs from prev sp */
7a78ae4e 150 int lr_offset; /* offset of saved lr */
46a9b8ed 151 int lr_register; /* register of saved lr, if trustworthy */
7a78ae4e 152 int cr_offset; /* offset of saved cr */
6be8bc0c 153 int vrsave_offset; /* offset of saved vrsave register */
7a78ae4e
ND
154 };
155
c906108c 156
604c2f83
LM
157/* Is REGNO a VSX register? Return 1 if so, 0 otherwise. */
158int
159vsx_register_p (struct gdbarch *gdbarch, int regno)
160{
161 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
162 if (tdep->ppc_vsr0_regnum < 0)
163 return 0;
164 else
165 return (regno >= tdep->ppc_vsr0_upper_regnum && regno
166 <= tdep->ppc_vsr0_upper_regnum + 31);
167}
168
64b84175
KB
169/* Is REGNO an AltiVec register? Return 1 if so, 0 otherwise. */
170int
be8626e0 171altivec_register_p (struct gdbarch *gdbarch, int regno)
64b84175 172{
be8626e0 173 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
64b84175
KB
174 if (tdep->ppc_vr0_regnum < 0 || tdep->ppc_vrsave_regnum < 0)
175 return 0;
176 else
177 return (regno >= tdep->ppc_vr0_regnum && regno <= tdep->ppc_vrsave_regnum);
178}
179
383f0f5b 180
867e2dc5
JB
181/* Return true if REGNO is an SPE register, false otherwise. */
182int
be8626e0 183spe_register_p (struct gdbarch *gdbarch, int regno)
867e2dc5 184{
be8626e0 185 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
867e2dc5
JB
186
187 /* Is it a reference to EV0 -- EV31, and do we have those? */
5a9e69ba 188 if (IS_SPE_PSEUDOREG (tdep, regno))
867e2dc5
JB
189 return 1;
190
6ced10dd
JB
191 /* Is it a reference to one of the raw upper GPR halves? */
192 if (tdep->ppc_ev0_upper_regnum >= 0
193 && tdep->ppc_ev0_upper_regnum <= regno
194 && regno < tdep->ppc_ev0_upper_regnum + ppc_num_gprs)
195 return 1;
196
867e2dc5
JB
197 /* Is it a reference to the 64-bit accumulator, and do we have that? */
198 if (tdep->ppc_acc_regnum >= 0
199 && tdep->ppc_acc_regnum == regno)
200 return 1;
201
202 /* Is it a reference to the SPE floating-point status and control register,
203 and do we have that? */
204 if (tdep->ppc_spefscr_regnum >= 0
205 && tdep->ppc_spefscr_regnum == regno)
206 return 1;
207
208 return 0;
209}
210
211
383f0f5b
JB
212/* Return non-zero if the architecture described by GDBARCH has
213 floating-point registers (f0 --- f31 and fpscr). */
0a613259
AC
214int
215ppc_floating_point_unit_p (struct gdbarch *gdbarch)
216{
383f0f5b
JB
217 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
218
219 return (tdep->ppc_fp0_regnum >= 0
220 && tdep->ppc_fpscr_regnum >= 0);
0a613259 221}
9f643768 222
604c2f83
LM
223/* Return non-zero if the architecture described by GDBARCH has
224 VSX registers (vsr0 --- vsr63). */
63807e1d 225static int
604c2f83
LM
226ppc_vsx_support_p (struct gdbarch *gdbarch)
227{
228 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
229
230 return tdep->ppc_vsr0_regnum >= 0;
231}
232
06caf7d2
CES
233/* Return non-zero if the architecture described by GDBARCH has
234 Altivec registers (vr0 --- vr31, vrsave and vscr). */
235int
236ppc_altivec_support_p (struct gdbarch *gdbarch)
237{
238 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
239
240 return (tdep->ppc_vr0_regnum >= 0
241 && tdep->ppc_vrsave_regnum >= 0);
242}
09991fa0
JB
243
244/* Check that TABLE[GDB_REGNO] is not already initialized, and then
245 set it to SIM_REGNO.
246
247 This is a helper function for init_sim_regno_table, constructing
248 the table mapping GDB register numbers to sim register numbers; we
249 initialize every element in that table to -1 before we start
250 filling it in. */
9f643768
JB
251static void
252set_sim_regno (int *table, int gdb_regno, int sim_regno)
253{
254 /* Make sure we don't try to assign any given GDB register a sim
255 register number more than once. */
256 gdb_assert (table[gdb_regno] == -1);
257 table[gdb_regno] = sim_regno;
258}
259
09991fa0
JB
260
261/* Initialize ARCH->tdep->sim_regno, the table mapping GDB register
262 numbers to simulator register numbers, based on the values placed
263 in the ARCH->tdep->ppc_foo_regnum members. */
9f643768
JB
264static void
265init_sim_regno_table (struct gdbarch *arch)
266{
267 struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
7cc46491 268 int total_regs = gdbarch_num_regs (arch);
9f643768
JB
269 int *sim_regno = GDBARCH_OBSTACK_CALLOC (arch, total_regs, int);
270 int i;
7cc46491
DJ
271 static const char *const segment_regs[] = {
272 "sr0", "sr1", "sr2", "sr3", "sr4", "sr5", "sr6", "sr7",
273 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15"
274 };
9f643768
JB
275
276 /* Presume that all registers not explicitly mentioned below are
277 unavailable from the sim. */
278 for (i = 0; i < total_regs; i++)
279 sim_regno[i] = -1;
280
281 /* General-purpose registers. */
282 for (i = 0; i < ppc_num_gprs; i++)
283 set_sim_regno (sim_regno, tdep->ppc_gp0_regnum + i, sim_ppc_r0_regnum + i);
284
285 /* Floating-point registers. */
286 if (tdep->ppc_fp0_regnum >= 0)
287 for (i = 0; i < ppc_num_fprs; i++)
288 set_sim_regno (sim_regno,
289 tdep->ppc_fp0_regnum + i,
290 sim_ppc_f0_regnum + i);
291 if (tdep->ppc_fpscr_regnum >= 0)
292 set_sim_regno (sim_regno, tdep->ppc_fpscr_regnum, sim_ppc_fpscr_regnum);
293
294 set_sim_regno (sim_regno, gdbarch_pc_regnum (arch), sim_ppc_pc_regnum);
295 set_sim_regno (sim_regno, tdep->ppc_ps_regnum, sim_ppc_ps_regnum);
296 set_sim_regno (sim_regno, tdep->ppc_cr_regnum, sim_ppc_cr_regnum);
297
298 /* Segment registers. */
7cc46491
DJ
299 for (i = 0; i < ppc_num_srs; i++)
300 {
301 int gdb_regno;
302
303 gdb_regno = user_reg_map_name_to_regnum (arch, segment_regs[i], -1);
304 if (gdb_regno >= 0)
305 set_sim_regno (sim_regno, gdb_regno, sim_ppc_sr0_regnum + i);
306 }
9f643768
JB
307
308 /* Altivec registers. */
309 if (tdep->ppc_vr0_regnum >= 0)
310 {
311 for (i = 0; i < ppc_num_vrs; i++)
312 set_sim_regno (sim_regno,
313 tdep->ppc_vr0_regnum + i,
314 sim_ppc_vr0_regnum + i);
315
316 /* FIXME: jimb/2004-07-15: when we have tdep->ppc_vscr_regnum,
317 we can treat this more like the other cases. */
318 set_sim_regno (sim_regno,
319 tdep->ppc_vr0_regnum + ppc_num_vrs,
320 sim_ppc_vscr_regnum);
321 }
322 /* vsave is a special-purpose register, so the code below handles it. */
323
324 /* SPE APU (E500) registers. */
6ced10dd
JB
325 if (tdep->ppc_ev0_upper_regnum >= 0)
326 for (i = 0; i < ppc_num_gprs; i++)
327 set_sim_regno (sim_regno,
328 tdep->ppc_ev0_upper_regnum + i,
329 sim_ppc_rh0_regnum + i);
9f643768
JB
330 if (tdep->ppc_acc_regnum >= 0)
331 set_sim_regno (sim_regno, tdep->ppc_acc_regnum, sim_ppc_acc_regnum);
332 /* spefscr is a special-purpose register, so the code below handles it. */
333
976102cd 334#ifdef WITH_PPC_SIM
9f643768
JB
335 /* Now handle all special-purpose registers. Verify that they
336 haven't mistakenly been assigned numbers by any of the above
7cc46491
DJ
337 code. */
338 for (i = 0; i < sim_ppc_num_sprs; i++)
339 {
340 const char *spr_name = sim_spr_register_name (i);
341 int gdb_regno = -1;
342
343 if (spr_name != NULL)
344 gdb_regno = user_reg_map_name_to_regnum (arch, spr_name, -1);
345
346 if (gdb_regno != -1)
347 set_sim_regno (sim_regno, gdb_regno, sim_ppc_spr0_regnum + i);
348 }
349#endif
9f643768
JB
350
351 /* Drop the initialized array into place. */
352 tdep->sim_regno = sim_regno;
353}
354
09991fa0
JB
355
356/* Given a GDB register number REG, return the corresponding SIM
357 register number. */
9f643768 358static int
e7faf938 359rs6000_register_sim_regno (struct gdbarch *gdbarch, int reg)
9f643768 360{
e7faf938 361 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9f643768
JB
362 int sim_regno;
363
7cc46491 364 if (tdep->sim_regno == NULL)
e7faf938 365 init_sim_regno_table (gdbarch);
7cc46491 366
f57d151a 367 gdb_assert (0 <= reg
e7faf938
MD
368 && reg <= gdbarch_num_regs (gdbarch)
369 + gdbarch_num_pseudo_regs (gdbarch));
9f643768
JB
370 sim_regno = tdep->sim_regno[reg];
371
372 if (sim_regno >= 0)
373 return sim_regno;
374 else
375 return LEGACY_SIM_REGNO_IGNORE;
376}
377
d195bc9f
MK
378\f
379
380/* Register set support functions. */
381
f2db237a
AM
382/* REGS + OFFSET contains register REGNUM in a field REGSIZE wide.
383 Write the register to REGCACHE. */
384
7284e1be 385void
d195bc9f 386ppc_supply_reg (struct regcache *regcache, int regnum,
f2db237a 387 const gdb_byte *regs, size_t offset, int regsize)
d195bc9f
MK
388{
389 if (regnum != -1 && offset != -1)
f2db237a
AM
390 {
391 if (regsize > 4)
392 {
393 struct gdbarch *gdbarch = get_regcache_arch (regcache);
394 int gdb_regsize = register_size (gdbarch, regnum);
395 if (gdb_regsize < regsize
396 && gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
397 offset += regsize - gdb_regsize;
398 }
399 regcache_raw_supply (regcache, regnum, regs + offset);
400 }
d195bc9f
MK
401}
402
f2db237a
AM
403/* Read register REGNUM from REGCACHE and store to REGS + OFFSET
404 in a field REGSIZE wide. Zero pad as necessary. */
405
7284e1be 406void
d195bc9f 407ppc_collect_reg (const struct regcache *regcache, int regnum,
f2db237a 408 gdb_byte *regs, size_t offset, int regsize)
d195bc9f
MK
409{
410 if (regnum != -1 && offset != -1)
f2db237a
AM
411 {
412 if (regsize > 4)
413 {
414 struct gdbarch *gdbarch = get_regcache_arch (regcache);
415 int gdb_regsize = register_size (gdbarch, regnum);
416 if (gdb_regsize < regsize)
417 {
418 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
419 {
420 memset (regs + offset, 0, regsize - gdb_regsize);
421 offset += regsize - gdb_regsize;
422 }
423 else
424 memset (regs + offset + regsize - gdb_regsize, 0,
425 regsize - gdb_regsize);
426 }
427 }
428 regcache_raw_collect (regcache, regnum, regs + offset);
429 }
d195bc9f
MK
430}
431
f2db237a
AM
432static int
433ppc_greg_offset (struct gdbarch *gdbarch,
434 struct gdbarch_tdep *tdep,
435 const struct ppc_reg_offsets *offsets,
436 int regnum,
437 int *regsize)
438{
439 *regsize = offsets->gpr_size;
440 if (regnum >= tdep->ppc_gp0_regnum
441 && regnum < tdep->ppc_gp0_regnum + ppc_num_gprs)
442 return (offsets->r0_offset
443 + (regnum - tdep->ppc_gp0_regnum) * offsets->gpr_size);
444
445 if (regnum == gdbarch_pc_regnum (gdbarch))
446 return offsets->pc_offset;
447
448 if (regnum == tdep->ppc_ps_regnum)
449 return offsets->ps_offset;
450
451 if (regnum == tdep->ppc_lr_regnum)
452 return offsets->lr_offset;
453
454 if (regnum == tdep->ppc_ctr_regnum)
455 return offsets->ctr_offset;
456
457 *regsize = offsets->xr_size;
458 if (regnum == tdep->ppc_cr_regnum)
459 return offsets->cr_offset;
460
461 if (regnum == tdep->ppc_xer_regnum)
462 return offsets->xer_offset;
463
464 if (regnum == tdep->ppc_mq_regnum)
465 return offsets->mq_offset;
466
467 return -1;
468}
469
470static int
471ppc_fpreg_offset (struct gdbarch_tdep *tdep,
472 const struct ppc_reg_offsets *offsets,
473 int regnum)
474{
475 if (regnum >= tdep->ppc_fp0_regnum
476 && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
477 return offsets->f0_offset + (regnum - tdep->ppc_fp0_regnum) * 8;
478
479 if (regnum == tdep->ppc_fpscr_regnum)
480 return offsets->fpscr_offset;
481
482 return -1;
483}
484
06caf7d2
CES
485static int
486ppc_vrreg_offset (struct gdbarch_tdep *tdep,
487 const struct ppc_reg_offsets *offsets,
488 int regnum)
489{
490 if (regnum >= tdep->ppc_vr0_regnum
491 && regnum < tdep->ppc_vr0_regnum + ppc_num_vrs)
492 return offsets->vr0_offset + (regnum - tdep->ppc_vr0_regnum) * 16;
493
494 if (regnum == tdep->ppc_vrsave_regnum - 1)
495 return offsets->vscr_offset;
496
497 if (regnum == tdep->ppc_vrsave_regnum)
498 return offsets->vrsave_offset;
499
500 return -1;
501}
502
d195bc9f
MK
503/* Supply register REGNUM in the general-purpose register set REGSET
504 from the buffer specified by GREGS and LEN to register cache
505 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
506
507void
508ppc_supply_gregset (const struct regset *regset, struct regcache *regcache,
509 int regnum, const void *gregs, size_t len)
510{
511 struct gdbarch *gdbarch = get_regcache_arch (regcache);
512 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
19ba03f4
SM
513 const struct ppc_reg_offsets *offsets
514 = (const struct ppc_reg_offsets *) regset->regmap;
d195bc9f 515 size_t offset;
f2db237a 516 int regsize;
d195bc9f 517
f2db237a 518 if (regnum == -1)
d195bc9f 519 {
f2db237a
AM
520 int i;
521 int gpr_size = offsets->gpr_size;
522
523 for (i = tdep->ppc_gp0_regnum, offset = offsets->r0_offset;
524 i < tdep->ppc_gp0_regnum + ppc_num_gprs;
525 i++, offset += gpr_size)
19ba03f4
SM
526 ppc_supply_reg (regcache, i, (const gdb_byte *) gregs, offset,
527 gpr_size);
f2db237a
AM
528
529 ppc_supply_reg (regcache, gdbarch_pc_regnum (gdbarch),
19ba03f4 530 (const gdb_byte *) gregs, offsets->pc_offset, gpr_size);
f2db237a 531 ppc_supply_reg (regcache, tdep->ppc_ps_regnum,
19ba03f4 532 (const gdb_byte *) gregs, offsets->ps_offset, gpr_size);
f2db237a 533 ppc_supply_reg (regcache, tdep->ppc_lr_regnum,
19ba03f4 534 (const gdb_byte *) gregs, offsets->lr_offset, gpr_size);
f2db237a 535 ppc_supply_reg (regcache, tdep->ppc_ctr_regnum,
19ba03f4 536 (const gdb_byte *) gregs, offsets->ctr_offset, gpr_size);
f2db237a 537 ppc_supply_reg (regcache, tdep->ppc_cr_regnum,
19ba03f4
SM
538 (const gdb_byte *) gregs, offsets->cr_offset,
539 offsets->xr_size);
f2db237a 540 ppc_supply_reg (regcache, tdep->ppc_xer_regnum,
19ba03f4
SM
541 (const gdb_byte *) gregs, offsets->xer_offset,
542 offsets->xr_size);
f2db237a 543 ppc_supply_reg (regcache, tdep->ppc_mq_regnum,
19ba03f4
SM
544 (const gdb_byte *) gregs, offsets->mq_offset,
545 offsets->xr_size);
f2db237a 546 return;
d195bc9f
MK
547 }
548
f2db237a 549 offset = ppc_greg_offset (gdbarch, tdep, offsets, regnum, &regsize);
19ba03f4 550 ppc_supply_reg (regcache, regnum, (const gdb_byte *) gregs, offset, regsize);
d195bc9f
MK
551}
552
553/* Supply register REGNUM in the floating-point register set REGSET
554 from the buffer specified by FPREGS and LEN to register cache
555 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
556
557void
558ppc_supply_fpregset (const struct regset *regset, struct regcache *regcache,
559 int regnum, const void *fpregs, size_t len)
560{
561 struct gdbarch *gdbarch = get_regcache_arch (regcache);
f2db237a
AM
562 struct gdbarch_tdep *tdep;
563 const struct ppc_reg_offsets *offsets;
d195bc9f 564 size_t offset;
d195bc9f 565
f2db237a
AM
566 if (!ppc_floating_point_unit_p (gdbarch))
567 return;
383f0f5b 568
f2db237a 569 tdep = gdbarch_tdep (gdbarch);
19ba03f4 570 offsets = (const struct ppc_reg_offsets *) regset->regmap;
f2db237a 571 if (regnum == -1)
d195bc9f 572 {
f2db237a
AM
573 int i;
574
575 for (i = tdep->ppc_fp0_regnum, offset = offsets->f0_offset;
576 i < tdep->ppc_fp0_regnum + ppc_num_fprs;
577 i++, offset += 8)
19ba03f4 578 ppc_supply_reg (regcache, i, (const gdb_byte *) fpregs, offset, 8);
f2db237a
AM
579
580 ppc_supply_reg (regcache, tdep->ppc_fpscr_regnum,
19ba03f4
SM
581 (const gdb_byte *) fpregs, offsets->fpscr_offset,
582 offsets->fpscr_size);
f2db237a 583 return;
d195bc9f
MK
584 }
585
f2db237a 586 offset = ppc_fpreg_offset (tdep, offsets, regnum);
19ba03f4 587 ppc_supply_reg (regcache, regnum, (const gdb_byte *) fpregs, offset,
f2db237a 588 regnum == tdep->ppc_fpscr_regnum ? offsets->fpscr_size : 8);
d195bc9f
MK
589}
590
604c2f83
LM
591/* Supply register REGNUM in the VSX register set REGSET
592 from the buffer specified by VSXREGS and LEN to register cache
593 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
594
595void
596ppc_supply_vsxregset (const struct regset *regset, struct regcache *regcache,
597 int regnum, const void *vsxregs, size_t len)
598{
599 struct gdbarch *gdbarch = get_regcache_arch (regcache);
600 struct gdbarch_tdep *tdep;
601
602 if (!ppc_vsx_support_p (gdbarch))
603 return;
604
605 tdep = gdbarch_tdep (gdbarch);
606
607 if (regnum == -1)
608 {
609 int i;
610
611 for (i = tdep->ppc_vsr0_upper_regnum;
612 i < tdep->ppc_vsr0_upper_regnum + 32;
613 i++)
19ba03f4 614 ppc_supply_reg (regcache, i, (const gdb_byte *) vsxregs, 0, 8);
604c2f83
LM
615
616 return;
617 }
618 else
19ba03f4 619 ppc_supply_reg (regcache, regnum, (const gdb_byte *) vsxregs, 0, 8);
604c2f83
LM
620}
621
06caf7d2
CES
622/* Supply register REGNUM in the Altivec register set REGSET
623 from the buffer specified by VRREGS and LEN to register cache
624 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
625
626void
627ppc_supply_vrregset (const struct regset *regset, struct regcache *regcache,
628 int regnum, const void *vrregs, size_t len)
629{
630 struct gdbarch *gdbarch = get_regcache_arch (regcache);
631 struct gdbarch_tdep *tdep;
632 const struct ppc_reg_offsets *offsets;
633 size_t offset;
634
635 if (!ppc_altivec_support_p (gdbarch))
636 return;
637
638 tdep = gdbarch_tdep (gdbarch);
19ba03f4 639 offsets = (const struct ppc_reg_offsets *) regset->regmap;
06caf7d2
CES
640 if (regnum == -1)
641 {
642 int i;
643
644 for (i = tdep->ppc_vr0_regnum, offset = offsets->vr0_offset;
645 i < tdep->ppc_vr0_regnum + ppc_num_vrs;
646 i++, offset += 16)
19ba03f4 647 ppc_supply_reg (regcache, i, (const gdb_byte *) vrregs, offset, 16);
06caf7d2
CES
648
649 ppc_supply_reg (regcache, (tdep->ppc_vrsave_regnum - 1),
19ba03f4 650 (const gdb_byte *) vrregs, offsets->vscr_offset, 4);
06caf7d2
CES
651
652 ppc_supply_reg (regcache, tdep->ppc_vrsave_regnum,
19ba03f4 653 (const gdb_byte *) vrregs, offsets->vrsave_offset, 4);
06caf7d2
CES
654 return;
655 }
656
657 offset = ppc_vrreg_offset (tdep, offsets, regnum);
658 if (regnum != tdep->ppc_vrsave_regnum
659 && regnum != tdep->ppc_vrsave_regnum - 1)
19ba03f4 660 ppc_supply_reg (regcache, regnum, (const gdb_byte *) vrregs, offset, 16);
06caf7d2
CES
661 else
662 ppc_supply_reg (regcache, regnum,
19ba03f4 663 (const gdb_byte *) vrregs, offset, 4);
06caf7d2
CES
664}
665
d195bc9f 666/* Collect register REGNUM in the general-purpose register set
f2db237a 667 REGSET from register cache REGCACHE into the buffer specified by
d195bc9f
MK
668 GREGS and LEN. If REGNUM is -1, do this for all registers in
669 REGSET. */
670
671void
672ppc_collect_gregset (const struct regset *regset,
673 const struct regcache *regcache,
674 int regnum, void *gregs, size_t len)
675{
676 struct gdbarch *gdbarch = get_regcache_arch (regcache);
677 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
19ba03f4
SM
678 const struct ppc_reg_offsets *offsets
679 = (const struct ppc_reg_offsets *) regset->regmap;
d195bc9f 680 size_t offset;
f2db237a 681 int regsize;
d195bc9f 682
f2db237a 683 if (regnum == -1)
d195bc9f 684 {
f2db237a
AM
685 int i;
686 int gpr_size = offsets->gpr_size;
687
688 for (i = tdep->ppc_gp0_regnum, offset = offsets->r0_offset;
689 i < tdep->ppc_gp0_regnum + ppc_num_gprs;
690 i++, offset += gpr_size)
19ba03f4 691 ppc_collect_reg (regcache, i, (gdb_byte *) gregs, offset, gpr_size);
f2db237a
AM
692
693 ppc_collect_reg (regcache, gdbarch_pc_regnum (gdbarch),
19ba03f4 694 (gdb_byte *) gregs, offsets->pc_offset, gpr_size);
f2db237a 695 ppc_collect_reg (regcache, tdep->ppc_ps_regnum,
19ba03f4 696 (gdb_byte *) gregs, offsets->ps_offset, gpr_size);
f2db237a 697 ppc_collect_reg (regcache, tdep->ppc_lr_regnum,
19ba03f4 698 (gdb_byte *) gregs, offsets->lr_offset, gpr_size);
f2db237a 699 ppc_collect_reg (regcache, tdep->ppc_ctr_regnum,
19ba03f4 700 (gdb_byte *) gregs, offsets->ctr_offset, gpr_size);
f2db237a 701 ppc_collect_reg (regcache, tdep->ppc_cr_regnum,
19ba03f4
SM
702 (gdb_byte *) gregs, offsets->cr_offset,
703 offsets->xr_size);
f2db237a 704 ppc_collect_reg (regcache, tdep->ppc_xer_regnum,
19ba03f4
SM
705 (gdb_byte *) gregs, offsets->xer_offset,
706 offsets->xr_size);
f2db237a 707 ppc_collect_reg (regcache, tdep->ppc_mq_regnum,
19ba03f4
SM
708 (gdb_byte *) gregs, offsets->mq_offset,
709 offsets->xr_size);
f2db237a 710 return;
d195bc9f
MK
711 }
712
f2db237a 713 offset = ppc_greg_offset (gdbarch, tdep, offsets, regnum, &regsize);
19ba03f4 714 ppc_collect_reg (regcache, regnum, (gdb_byte *) gregs, offset, regsize);
d195bc9f
MK
715}
716
717/* Collect register REGNUM in the floating-point register set
f2db237a 718 REGSET from register cache REGCACHE into the buffer specified by
d195bc9f
MK
719 FPREGS and LEN. If REGNUM is -1, do this for all registers in
720 REGSET. */
721
722void
723ppc_collect_fpregset (const struct regset *regset,
724 const struct regcache *regcache,
725 int regnum, void *fpregs, size_t len)
726{
727 struct gdbarch *gdbarch = get_regcache_arch (regcache);
f2db237a
AM
728 struct gdbarch_tdep *tdep;
729 const struct ppc_reg_offsets *offsets;
d195bc9f 730 size_t offset;
d195bc9f 731
f2db237a
AM
732 if (!ppc_floating_point_unit_p (gdbarch))
733 return;
383f0f5b 734
f2db237a 735 tdep = gdbarch_tdep (gdbarch);
19ba03f4 736 offsets = (const struct ppc_reg_offsets *) regset->regmap;
f2db237a 737 if (regnum == -1)
d195bc9f 738 {
f2db237a
AM
739 int i;
740
741 for (i = tdep->ppc_fp0_regnum, offset = offsets->f0_offset;
742 i < tdep->ppc_fp0_regnum + ppc_num_fprs;
743 i++, offset += 8)
19ba03f4 744 ppc_collect_reg (regcache, i, (gdb_byte *) fpregs, offset, 8);
f2db237a
AM
745
746 ppc_collect_reg (regcache, tdep->ppc_fpscr_regnum,
19ba03f4
SM
747 (gdb_byte *) fpregs, offsets->fpscr_offset,
748 offsets->fpscr_size);
f2db237a 749 return;
d195bc9f
MK
750 }
751
f2db237a 752 offset = ppc_fpreg_offset (tdep, offsets, regnum);
19ba03f4 753 ppc_collect_reg (regcache, regnum, (gdb_byte *) fpregs, offset,
f2db237a 754 regnum == tdep->ppc_fpscr_regnum ? offsets->fpscr_size : 8);
d195bc9f 755}
06caf7d2 756
604c2f83
LM
757/* Collect register REGNUM in the VSX register set
758 REGSET from register cache REGCACHE into the buffer specified by
759 VSXREGS and LEN. If REGNUM is -1, do this for all registers in
760 REGSET. */
761
762void
763ppc_collect_vsxregset (const struct regset *regset,
764 const struct regcache *regcache,
765 int regnum, void *vsxregs, size_t len)
766{
767 struct gdbarch *gdbarch = get_regcache_arch (regcache);
768 struct gdbarch_tdep *tdep;
769
770 if (!ppc_vsx_support_p (gdbarch))
771 return;
772
773 tdep = gdbarch_tdep (gdbarch);
774
775 if (regnum == -1)
776 {
777 int i;
778
779 for (i = tdep->ppc_vsr0_upper_regnum;
780 i < tdep->ppc_vsr0_upper_regnum + 32;
781 i++)
19ba03f4 782 ppc_collect_reg (regcache, i, (gdb_byte *) vsxregs, 0, 8);
604c2f83
LM
783
784 return;
785 }
786 else
19ba03f4 787 ppc_collect_reg (regcache, regnum, (gdb_byte *) vsxregs, 0, 8);
604c2f83
LM
788}
789
790
06caf7d2
CES
791/* Collect register REGNUM in the Altivec register set
792 REGSET from register cache REGCACHE into the buffer specified by
793 VRREGS and LEN. If REGNUM is -1, do this for all registers in
794 REGSET. */
795
796void
797ppc_collect_vrregset (const struct regset *regset,
798 const struct regcache *regcache,
799 int regnum, void *vrregs, size_t len)
800{
801 struct gdbarch *gdbarch = get_regcache_arch (regcache);
802 struct gdbarch_tdep *tdep;
803 const struct ppc_reg_offsets *offsets;
804 size_t offset;
805
806 if (!ppc_altivec_support_p (gdbarch))
807 return;
808
809 tdep = gdbarch_tdep (gdbarch);
19ba03f4 810 offsets = (const struct ppc_reg_offsets *) regset->regmap;
06caf7d2
CES
811 if (regnum == -1)
812 {
813 int i;
814
815 for (i = tdep->ppc_vr0_regnum, offset = offsets->vr0_offset;
816 i < tdep->ppc_vr0_regnum + ppc_num_vrs;
817 i++, offset += 16)
19ba03f4 818 ppc_collect_reg (regcache, i, (gdb_byte *) vrregs, offset, 16);
06caf7d2
CES
819
820 ppc_collect_reg (regcache, (tdep->ppc_vrsave_regnum - 1),
19ba03f4 821 (gdb_byte *) vrregs, offsets->vscr_offset, 4);
06caf7d2
CES
822
823 ppc_collect_reg (regcache, tdep->ppc_vrsave_regnum,
19ba03f4 824 (gdb_byte *) vrregs, offsets->vrsave_offset, 4);
06caf7d2
CES
825 return;
826 }
827
828 offset = ppc_vrreg_offset (tdep, offsets, regnum);
829 if (regnum != tdep->ppc_vrsave_regnum
830 && regnum != tdep->ppc_vrsave_regnum - 1)
19ba03f4 831 ppc_collect_reg (regcache, regnum, (gdb_byte *) vrregs, offset, 16);
06caf7d2
CES
832 else
833 ppc_collect_reg (regcache, regnum,
19ba03f4 834 (gdb_byte *) vrregs, offset, 4);
06caf7d2 835}
d195bc9f 836\f
0a613259 837
0d1243d9
PG
838static int
839insn_changes_sp_or_jumps (unsigned long insn)
840{
841 int opcode = (insn >> 26) & 0x03f;
842 int sd = (insn >> 21) & 0x01f;
843 int a = (insn >> 16) & 0x01f;
844 int subcode = (insn >> 1) & 0x3ff;
845
846 /* Changes the stack pointer. */
847
848 /* NOTE: There are many ways to change the value of a given register.
849 The ways below are those used when the register is R1, the SP,
850 in a funtion's epilogue. */
851
852 if (opcode == 31 && subcode == 444 && a == 1)
853 return 1; /* mr R1,Rn */
854 if (opcode == 14 && sd == 1)
855 return 1; /* addi R1,Rn,simm */
856 if (opcode == 58 && sd == 1)
857 return 1; /* ld R1,ds(Rn) */
858
859 /* Transfers control. */
860
861 if (opcode == 18)
862 return 1; /* b */
863 if (opcode == 16)
864 return 1; /* bc */
865 if (opcode == 19 && subcode == 16)
866 return 1; /* bclr */
867 if (opcode == 19 && subcode == 528)
868 return 1; /* bcctr */
869
870 return 0;
871}
872
873/* Return true if we are in the function's epilogue, i.e. after the
874 instruction that destroyed the function's stack frame.
875
876 1) scan forward from the point of execution:
877 a) If you find an instruction that modifies the stack pointer
878 or transfers control (except a return), execution is not in
879 an epilogue, return.
880 b) Stop scanning if you find a return instruction or reach the
881 end of the function or reach the hard limit for the size of
882 an epilogue.
883 2) scan backward from the point of execution:
884 a) If you find an instruction that modifies the stack pointer,
885 execution *is* in an epilogue, return.
886 b) Stop scanning if you reach an instruction that transfers
887 control or the beginning of the function or reach the hard
888 limit for the size of an epilogue. */
889
890static int
2608dbf8
WW
891rs6000_in_function_epilogue_frame_p (struct frame_info *curfrm,
892 struct gdbarch *gdbarch, CORE_ADDR pc)
0d1243d9 893{
46a9b8ed 894 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
e17a4113 895 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
0d1243d9
PG
896 bfd_byte insn_buf[PPC_INSN_SIZE];
897 CORE_ADDR scan_pc, func_start, func_end, epilogue_start, epilogue_end;
898 unsigned long insn;
0d1243d9
PG
899
900 /* Find the search limits based on function boundaries and hard limit. */
901
902 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
903 return 0;
904
905 epilogue_start = pc - PPC_MAX_EPILOGUE_INSTRUCTIONS * PPC_INSN_SIZE;
906 if (epilogue_start < func_start) epilogue_start = func_start;
907
908 epilogue_end = pc + PPC_MAX_EPILOGUE_INSTRUCTIONS * PPC_INSN_SIZE;
909 if (epilogue_end > func_end) epilogue_end = func_end;
910
0d1243d9
PG
911 /* Scan forward until next 'blr'. */
912
913 for (scan_pc = pc; scan_pc < epilogue_end; scan_pc += PPC_INSN_SIZE)
914 {
915 if (!safe_frame_unwind_memory (curfrm, scan_pc, insn_buf, PPC_INSN_SIZE))
916 return 0;
e17a4113 917 insn = extract_unsigned_integer (insn_buf, PPC_INSN_SIZE, byte_order);
0d1243d9
PG
918 if (insn == 0x4e800020)
919 break;
46a9b8ed
DJ
920 /* Assume a bctr is a tail call unless it points strictly within
921 this function. */
922 if (insn == 0x4e800420)
923 {
924 CORE_ADDR ctr = get_frame_register_unsigned (curfrm,
925 tdep->ppc_ctr_regnum);
926 if (ctr > func_start && ctr < func_end)
927 return 0;
928 else
929 break;
930 }
0d1243d9
PG
931 if (insn_changes_sp_or_jumps (insn))
932 return 0;
933 }
934
935 /* Scan backward until adjustment to stack pointer (R1). */
936
937 for (scan_pc = pc - PPC_INSN_SIZE;
938 scan_pc >= epilogue_start;
939 scan_pc -= PPC_INSN_SIZE)
940 {
941 if (!safe_frame_unwind_memory (curfrm, scan_pc, insn_buf, PPC_INSN_SIZE))
942 return 0;
e17a4113 943 insn = extract_unsigned_integer (insn_buf, PPC_INSN_SIZE, byte_order);
0d1243d9
PG
944 if (insn_changes_sp_or_jumps (insn))
945 return 1;
946 }
947
948 return 0;
949}
950
c9cf6e20 951/* Implement the stack_frame_destroyed_p gdbarch method. */
2608dbf8
WW
952
953static int
c9cf6e20 954rs6000_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
2608dbf8
WW
955{
956 return rs6000_in_function_epilogue_frame_p (get_current_frame (),
957 gdbarch, pc);
958}
959
143985b7 960/* Get the ith function argument for the current function. */
b9362cc7 961static CORE_ADDR
143985b7
AF
962rs6000_fetch_pointer_argument (struct frame_info *frame, int argi,
963 struct type *type)
964{
50fd1280 965 return get_frame_register_unsigned (frame, 3 + argi);
143985b7
AF
966}
967
c906108c
SS
968/* Sequence of bytes for breakpoint instruction. */
969
04180708
YQ
970constexpr gdb_byte big_breakpoint[] = { 0x7d, 0x82, 0x10, 0x08 };
971constexpr gdb_byte little_breakpoint[] = { 0x08, 0x10, 0x82, 0x7d };
d19280ad 972
04180708
YQ
973typedef BP_MANIPULATION_ENDIAN (little_breakpoint, big_breakpoint)
974 rs6000_breakpoint;
c906108c 975
f74c6cad
LM
976/* Instruction masks for displaced stepping. */
977#define BRANCH_MASK 0xfc000000
978#define BP_MASK 0xFC0007FE
979#define B_INSN 0x48000000
980#define BC_INSN 0x40000000
981#define BXL_INSN 0x4c000000
982#define BP_INSN 0x7C000008
983
7f03bd92
PA
984/* Instruction masks used during single-stepping of atomic
985 sequences. */
986#define LWARX_MASK 0xfc0007fe
987#define LWARX_INSTRUCTION 0x7c000028
988#define LDARX_INSTRUCTION 0x7c0000A8
989#define STWCX_MASK 0xfc0007ff
990#define STWCX_INSTRUCTION 0x7c00012d
991#define STDCX_INSTRUCTION 0x7c0001ad
992
993/* We can't displaced step atomic sequences. Otherwise this is just
994 like simple_displaced_step_copy_insn. */
995
996static struct displaced_step_closure *
997ppc_displaced_step_copy_insn (struct gdbarch *gdbarch,
998 CORE_ADDR from, CORE_ADDR to,
999 struct regcache *regs)
1000{
1001 size_t len = gdbarch_max_insn_length (gdbarch);
224c3ddb 1002 gdb_byte *buf = (gdb_byte *) xmalloc (len);
7f03bd92
PA
1003 struct cleanup *old_chain = make_cleanup (xfree, buf);
1004 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1005 int insn;
1006
1007 read_memory (from, buf, len);
1008
1009 insn = extract_signed_integer (buf, PPC_INSN_SIZE, byte_order);
1010
1011 /* Assume all atomic sequences start with a lwarx/ldarx instruction. */
1012 if ((insn & LWARX_MASK) == LWARX_INSTRUCTION
1013 || (insn & LWARX_MASK) == LDARX_INSTRUCTION)
1014 {
1015 if (debug_displaced)
1016 {
1017 fprintf_unfiltered (gdb_stdlog,
1018 "displaced: can't displaced step "
1019 "atomic sequence at %s\n",
1020 paddress (gdbarch, from));
1021 }
1022 do_cleanups (old_chain);
1023 return NULL;
1024 }
1025
1026 write_memory (to, buf, len);
1027
1028 if (debug_displaced)
1029 {
1030 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
1031 paddress (gdbarch, from), paddress (gdbarch, to));
1032 displaced_step_dump_bytes (gdb_stdlog, buf, len);
1033 }
1034
1035 discard_cleanups (old_chain);
1036 return (struct displaced_step_closure *) buf;
1037}
1038
f74c6cad
LM
1039/* Fix up the state of registers and memory after having single-stepped
1040 a displaced instruction. */
63807e1d 1041static void
f74c6cad 1042ppc_displaced_step_fixup (struct gdbarch *gdbarch,
63807e1d
PA
1043 struct displaced_step_closure *closure,
1044 CORE_ADDR from, CORE_ADDR to,
1045 struct regcache *regs)
f74c6cad 1046{
e17a4113 1047 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7f03bd92 1048 /* Our closure is a copy of the instruction. */
f74c6cad 1049 ULONGEST insn = extract_unsigned_integer ((gdb_byte *) closure,
e17a4113 1050 PPC_INSN_SIZE, byte_order);
f74c6cad
LM
1051 ULONGEST opcode = 0;
1052 /* Offset for non PC-relative instructions. */
1053 LONGEST offset = PPC_INSN_SIZE;
1054
1055 opcode = insn & BRANCH_MASK;
1056
1057 if (debug_displaced)
1058 fprintf_unfiltered (gdb_stdlog,
5af949e3
UW
1059 "displaced: (ppc) fixup (%s, %s)\n",
1060 paddress (gdbarch, from), paddress (gdbarch, to));
f74c6cad
LM
1061
1062
1063 /* Handle PC-relative branch instructions. */
1064 if (opcode == B_INSN || opcode == BC_INSN || opcode == BXL_INSN)
1065 {
a4fafde3 1066 ULONGEST current_pc;
f74c6cad
LM
1067
1068 /* Read the current PC value after the instruction has been executed
1069 in a displaced location. Calculate the offset to be applied to the
1070 original PC value before the displaced stepping. */
1071 regcache_cooked_read_unsigned (regs, gdbarch_pc_regnum (gdbarch),
1072 &current_pc);
1073 offset = current_pc - to;
1074
1075 if (opcode != BXL_INSN)
1076 {
1077 /* Check for AA bit indicating whether this is an absolute
1078 addressing or PC-relative (1: absolute, 0: relative). */
1079 if (!(insn & 0x2))
1080 {
1081 /* PC-relative addressing is being used in the branch. */
1082 if (debug_displaced)
1083 fprintf_unfiltered
1084 (gdb_stdlog,
5af949e3
UW
1085 "displaced: (ppc) branch instruction: %s\n"
1086 "displaced: (ppc) adjusted PC from %s to %s\n",
1087 paddress (gdbarch, insn), paddress (gdbarch, current_pc),
1088 paddress (gdbarch, from + offset));
f74c6cad 1089
0df8b418
MS
1090 regcache_cooked_write_unsigned (regs,
1091 gdbarch_pc_regnum (gdbarch),
f74c6cad
LM
1092 from + offset);
1093 }
1094 }
1095 else
1096 {
1097 /* If we're here, it means we have a branch to LR or CTR. If the
1098 branch was taken, the offset is probably greater than 4 (the next
1099 instruction), so it's safe to assume that an offset of 4 means we
1100 did not take the branch. */
1101 if (offset == PPC_INSN_SIZE)
1102 regcache_cooked_write_unsigned (regs, gdbarch_pc_regnum (gdbarch),
1103 from + PPC_INSN_SIZE);
1104 }
1105
1106 /* Check for LK bit indicating whether we should set the link
1107 register to point to the next instruction
1108 (1: Set, 0: Don't set). */
1109 if (insn & 0x1)
1110 {
1111 /* Link register needs to be set to the next instruction's PC. */
1112 regcache_cooked_write_unsigned (regs,
1113 gdbarch_tdep (gdbarch)->ppc_lr_regnum,
1114 from + PPC_INSN_SIZE);
1115 if (debug_displaced)
1116 fprintf_unfiltered (gdb_stdlog,
5af949e3
UW
1117 "displaced: (ppc) adjusted LR to %s\n",
1118 paddress (gdbarch, from + PPC_INSN_SIZE));
f74c6cad
LM
1119
1120 }
1121 }
1122 /* Check for breakpoints in the inferior. If we've found one, place the PC
1123 right at the breakpoint instruction. */
1124 else if ((insn & BP_MASK) == BP_INSN)
1125 regcache_cooked_write_unsigned (regs, gdbarch_pc_regnum (gdbarch), from);
1126 else
1127 /* Handle any other instructions that do not fit in the categories above. */
1128 regcache_cooked_write_unsigned (regs, gdbarch_pc_regnum (gdbarch),
1129 from + offset);
1130}
c906108c 1131
99e40580
UW
1132/* Always use hardware single-stepping to execute the
1133 displaced instruction. */
1134static int
1135ppc_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
1136 struct displaced_step_closure *closure)
1137{
1138 return 1;
1139}
1140
ce5eab59
UW
1141/* Checks for an atomic sequence of instructions beginning with a LWARX/LDARX
1142 instruction and ending with a STWCX/STDCX instruction. If such a sequence
1143 is found, attempt to step through it. A breakpoint is placed at the end of
1144 the sequence. */
1145
93f9a11f 1146VEC (CORE_ADDR) *
4a7622d1 1147ppc_deal_with_atomic_sequence (struct frame_info *frame)
ce5eab59 1148{
41e26ad3
YQ
1149 struct regcache *regcache = get_current_regcache ();
1150 struct gdbarch *gdbarch = get_regcache_arch (regcache);
e17a4113 1151 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
41e26ad3 1152 CORE_ADDR pc = regcache_read_pc (regcache);
ce5eab59
UW
1153 CORE_ADDR breaks[2] = {-1, -1};
1154 CORE_ADDR loc = pc;
24d45690 1155 CORE_ADDR closing_insn; /* Instruction that closes the atomic sequence. */
e17a4113 1156 int insn = read_memory_integer (loc, PPC_INSN_SIZE, byte_order);
ce5eab59
UW
1157 int insn_count;
1158 int index;
1159 int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
1160 const int atomic_sequence_length = 16; /* Instruction sequence length. */
ce5eab59 1161 int bc_insn_count = 0; /* Conditional branch instruction count. */
93f9a11f 1162 VEC (CORE_ADDR) *next_pcs = NULL;
ce5eab59
UW
1163
1164 /* Assume all atomic sequences start with a lwarx/ldarx instruction. */
1165 if ((insn & LWARX_MASK) != LWARX_INSTRUCTION
1166 && (insn & LWARX_MASK) != LDARX_INSTRUCTION)
93f9a11f 1167 return NULL;
ce5eab59
UW
1168
1169 /* Assume that no atomic sequence is longer than "atomic_sequence_length"
1170 instructions. */
1171 for (insn_count = 0; insn_count < atomic_sequence_length; ++insn_count)
1172 {
1173 loc += PPC_INSN_SIZE;
e17a4113 1174 insn = read_memory_integer (loc, PPC_INSN_SIZE, byte_order);
ce5eab59
UW
1175
1176 /* Assume that there is at most one conditional branch in the atomic
1177 sequence. If a conditional branch is found, put a breakpoint in
1178 its destination address. */
f74c6cad 1179 if ((insn & BRANCH_MASK) == BC_INSN)
ce5eab59 1180 {
a3769e0c
AM
1181 int immediate = ((insn & 0xfffc) ^ 0x8000) - 0x8000;
1182 int absolute = insn & 2;
4a7622d1 1183
ce5eab59
UW
1184 if (bc_insn_count >= 1)
1185 return 0; /* More than one conditional branch found, fallback
1186 to the standard single-step code. */
4a7622d1
UW
1187
1188 if (absolute)
1189 breaks[1] = immediate;
1190 else
a3769e0c 1191 breaks[1] = loc + immediate;
4a7622d1
UW
1192
1193 bc_insn_count++;
1194 last_breakpoint++;
ce5eab59
UW
1195 }
1196
1197 if ((insn & STWCX_MASK) == STWCX_INSTRUCTION
1198 || (insn & STWCX_MASK) == STDCX_INSTRUCTION)
1199 break;
1200 }
1201
1202 /* Assume that the atomic sequence ends with a stwcx/stdcx instruction. */
1203 if ((insn & STWCX_MASK) != STWCX_INSTRUCTION
1204 && (insn & STWCX_MASK) != STDCX_INSTRUCTION)
93f9a11f 1205 return NULL;
ce5eab59 1206
24d45690 1207 closing_insn = loc;
ce5eab59 1208 loc += PPC_INSN_SIZE;
e17a4113 1209 insn = read_memory_integer (loc, PPC_INSN_SIZE, byte_order);
ce5eab59
UW
1210
1211 /* Insert a breakpoint right after the end of the atomic sequence. */
1212 breaks[0] = loc;
1213
24d45690 1214 /* Check for duplicated breakpoints. Check also for a breakpoint
a3769e0c
AM
1215 placed (branch instruction's destination) anywhere in sequence. */
1216 if (last_breakpoint
1217 && (breaks[1] == breaks[0]
1218 || (breaks[1] >= pc && breaks[1] <= closing_insn)))
ce5eab59
UW
1219 last_breakpoint = 0;
1220
ce5eab59 1221 for (index = 0; index <= last_breakpoint; index++)
93f9a11f 1222 VEC_safe_push (CORE_ADDR, next_pcs, breaks[index]);
ce5eab59 1223
93f9a11f 1224 return next_pcs;
ce5eab59
UW
1225}
1226
c906108c 1227
c906108c
SS
1228#define SIGNED_SHORT(x) \
1229 ((sizeof (short) == 2) \
1230 ? ((int)(short)(x)) \
1231 : ((int)((((x) & 0xffff) ^ 0x8000) - 0x8000)))
1232
1233#define GET_SRC_REG(x) (((x) >> 21) & 0x1f)
1234
55d05f3b
KB
1235/* Limit the number of skipped non-prologue instructions, as the examining
1236 of the prologue is expensive. */
1237static int max_skip_non_prologue_insns = 10;
1238
773df3e5
JB
1239/* Return nonzero if the given instruction OP can be part of the prologue
1240 of a function and saves a parameter on the stack. FRAMEP should be
1241 set if one of the previous instructions in the function has set the
1242 Frame Pointer. */
1243
1244static int
1245store_param_on_stack_p (unsigned long op, int framep, int *r0_contains_arg)
1246{
1247 /* Move parameters from argument registers to temporary register. */
1248 if ((op & 0xfc0007fe) == 0x7c000378) /* mr(.) Rx,Ry */
1249 {
1250 /* Rx must be scratch register r0. */
1251 const int rx_regno = (op >> 16) & 31;
1252 /* Ry: Only r3 - r10 are used for parameter passing. */
1253 const int ry_regno = GET_SRC_REG (op);
1254
1255 if (rx_regno == 0 && ry_regno >= 3 && ry_regno <= 10)
1256 {
1257 *r0_contains_arg = 1;
1258 return 1;
1259 }
1260 else
1261 return 0;
1262 }
1263
1264 /* Save a General Purpose Register on stack. */
1265
1266 if ((op & 0xfc1f0003) == 0xf8010000 || /* std Rx,NUM(r1) */
1267 (op & 0xfc1f0000) == 0xd8010000) /* stfd Rx,NUM(r1) */
1268 {
1269 /* Rx: Only r3 - r10 are used for parameter passing. */
1270 const int rx_regno = GET_SRC_REG (op);
1271
1272 return (rx_regno >= 3 && rx_regno <= 10);
1273 }
1274
1275 /* Save a General Purpose Register on stack via the Frame Pointer. */
1276
1277 if (framep &&
1278 ((op & 0xfc1f0000) == 0x901f0000 || /* st rx,NUM(r31) */
1279 (op & 0xfc1f0000) == 0x981f0000 || /* stb Rx,NUM(r31) */
1280 (op & 0xfc1f0000) == 0xd81f0000)) /* stfd Rx,NUM(r31) */
1281 {
1282 /* Rx: Usually, only r3 - r10 are used for parameter passing.
1283 However, the compiler sometimes uses r0 to hold an argument. */
1284 const int rx_regno = GET_SRC_REG (op);
1285
1286 return ((rx_regno >= 3 && rx_regno <= 10)
1287 || (rx_regno == 0 && *r0_contains_arg));
1288 }
1289
1290 if ((op & 0xfc1f0000) == 0xfc010000) /* frsp, fp?,NUM(r1) */
1291 {
1292 /* Only f2 - f8 are used for parameter passing. */
1293 const int src_regno = GET_SRC_REG (op);
1294
1295 return (src_regno >= 2 && src_regno <= 8);
1296 }
1297
1298 if (framep && ((op & 0xfc1f0000) == 0xfc1f0000)) /* frsp, fp?,NUM(r31) */
1299 {
1300 /* Only f2 - f8 are used for parameter passing. */
1301 const int src_regno = GET_SRC_REG (op);
1302
1303 return (src_regno >= 2 && src_regno <= 8);
1304 }
1305
1306 /* Not an insn that saves a parameter on stack. */
1307 return 0;
1308}
55d05f3b 1309
3c77c82a
DJ
1310/* Assuming that INSN is a "bl" instruction located at PC, return
1311 nonzero if the destination of the branch is a "blrl" instruction.
1312
1313 This sequence is sometimes found in certain function prologues.
1314 It allows the function to load the LR register with a value that
1315 they can use to access PIC data using PC-relative offsets. */
1316
1317static int
e17a4113 1318bl_to_blrl_insn_p (CORE_ADDR pc, int insn, enum bfd_endian byte_order)
3c77c82a 1319{
0b1b3e42
UW
1320 CORE_ADDR dest;
1321 int immediate;
1322 int absolute;
3c77c82a
DJ
1323 int dest_insn;
1324
0b1b3e42
UW
1325 absolute = (int) ((insn >> 1) & 1);
1326 immediate = ((insn & ~3) << 6) >> 6;
1327 if (absolute)
1328 dest = immediate;
1329 else
1330 dest = pc + immediate;
1331
e17a4113 1332 dest_insn = read_memory_integer (dest, 4, byte_order);
3c77c82a
DJ
1333 if ((dest_insn & 0xfc00ffff) == 0x4c000021) /* blrl */
1334 return 1;
1335
1336 return 0;
1337}
1338
0df8b418 1339/* Masks for decoding a branch-and-link (bl) instruction.
8ab3d180
KB
1340
1341 BL_MASK and BL_INSTRUCTION are used in combination with each other.
1342 The former is anded with the opcode in question; if the result of
1343 this masking operation is equal to BL_INSTRUCTION, then the opcode in
1344 question is a ``bl'' instruction.
1345
1346 BL_DISPLACMENT_MASK is anded with the opcode in order to extract
1347 the branch displacement. */
1348
1349#define BL_MASK 0xfc000001
1350#define BL_INSTRUCTION 0x48000001
1351#define BL_DISPLACEMENT_MASK 0x03fffffc
1352
de9f48f0 1353static unsigned long
e17a4113 1354rs6000_fetch_instruction (struct gdbarch *gdbarch, const CORE_ADDR pc)
de9f48f0 1355{
e17a4113 1356 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
de9f48f0
JG
1357 gdb_byte buf[4];
1358 unsigned long op;
1359
1360 /* Fetch the instruction and convert it to an integer. */
1361 if (target_read_memory (pc, buf, 4))
1362 return 0;
e17a4113 1363 op = extract_unsigned_integer (buf, 4, byte_order);
de9f48f0
JG
1364
1365 return op;
1366}
1367
1368/* GCC generates several well-known sequences of instructions at the begining
1369 of each function prologue when compiling with -fstack-check. If one of
1370 such sequences starts at START_PC, then return the address of the
1371 instruction immediately past this sequence. Otherwise, return START_PC. */
1372
1373static CORE_ADDR
e17a4113 1374rs6000_skip_stack_check (struct gdbarch *gdbarch, const CORE_ADDR start_pc)
de9f48f0
JG
1375{
1376 CORE_ADDR pc = start_pc;
e17a4113 1377 unsigned long op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1378
1379 /* First possible sequence: A small number of probes.
1380 stw 0, -<some immediate>(1)
0df8b418 1381 [repeat this instruction any (small) number of times]. */
de9f48f0
JG
1382
1383 if ((op & 0xffff0000) == 0x90010000)
1384 {
1385 while ((op & 0xffff0000) == 0x90010000)
1386 {
1387 pc = pc + 4;
e17a4113 1388 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1389 }
1390 return pc;
1391 }
1392
1393 /* Second sequence: A probing loop.
1394 addi 12,1,-<some immediate>
1395 lis 0,-<some immediate>
1396 [possibly ori 0,0,<some immediate>]
1397 add 0,12,0
1398 cmpw 0,12,0
1399 beq 0,<disp>
1400 addi 12,12,-<some immediate>
1401 stw 0,0(12)
1402 b <disp>
0df8b418 1403 [possibly one last probe: stw 0,<some immediate>(12)]. */
de9f48f0
JG
1404
1405 while (1)
1406 {
1407 /* addi 12,1,-<some immediate> */
1408 if ((op & 0xffff0000) != 0x39810000)
1409 break;
1410
1411 /* lis 0,-<some immediate> */
1412 pc = pc + 4;
e17a4113 1413 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1414 if ((op & 0xffff0000) != 0x3c000000)
1415 break;
1416
1417 pc = pc + 4;
e17a4113 1418 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1419 /* [possibly ori 0,0,<some immediate>] */
1420 if ((op & 0xffff0000) == 0x60000000)
1421 {
1422 pc = pc + 4;
e17a4113 1423 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1424 }
1425 /* add 0,12,0 */
1426 if (op != 0x7c0c0214)
1427 break;
1428
1429 /* cmpw 0,12,0 */
1430 pc = pc + 4;
e17a4113 1431 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1432 if (op != 0x7c0c0000)
1433 break;
1434
1435 /* beq 0,<disp> */
1436 pc = pc + 4;
e17a4113 1437 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1438 if ((op & 0xff9f0001) != 0x41820000)
1439 break;
1440
1441 /* addi 12,12,-<some immediate> */
1442 pc = pc + 4;
e17a4113 1443 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1444 if ((op & 0xffff0000) != 0x398c0000)
1445 break;
1446
1447 /* stw 0,0(12) */
1448 pc = pc + 4;
e17a4113 1449 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1450 if (op != 0x900c0000)
1451 break;
1452
1453 /* b <disp> */
1454 pc = pc + 4;
e17a4113 1455 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1456 if ((op & 0xfc000001) != 0x48000000)
1457 break;
1458
0df8b418 1459 /* [possibly one last probe: stw 0,<some immediate>(12)]. */
de9f48f0 1460 pc = pc + 4;
e17a4113 1461 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1462 if ((op & 0xffff0000) == 0x900c0000)
1463 {
1464 pc = pc + 4;
e17a4113 1465 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1466 }
1467
1468 /* We found a valid stack-check sequence, return the new PC. */
1469 return pc;
1470 }
1471
1472 /* Third sequence: No probe; instead, a comparizon between the stack size
1473 limit (saved in a run-time global variable) and the current stack
1474 pointer:
1475
1476 addi 0,1,-<some immediate>
1477 lis 12,__gnat_stack_limit@ha
1478 lwz 12,__gnat_stack_limit@l(12)
1479 twllt 0,12
1480
1481 or, with a small variant in the case of a bigger stack frame:
1482 addis 0,1,<some immediate>
1483 addic 0,0,-<some immediate>
1484 lis 12,__gnat_stack_limit@ha
1485 lwz 12,__gnat_stack_limit@l(12)
1486 twllt 0,12
1487 */
1488 while (1)
1489 {
1490 /* addi 0,1,-<some immediate> */
1491 if ((op & 0xffff0000) != 0x38010000)
1492 {
1493 /* small stack frame variant not recognized; try the
1494 big stack frame variant: */
1495
1496 /* addis 0,1,<some immediate> */
1497 if ((op & 0xffff0000) != 0x3c010000)
1498 break;
1499
1500 /* addic 0,0,-<some immediate> */
1501 pc = pc + 4;
e17a4113 1502 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1503 if ((op & 0xffff0000) != 0x30000000)
1504 break;
1505 }
1506
1507 /* lis 12,<some immediate> */
1508 pc = pc + 4;
e17a4113 1509 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1510 if ((op & 0xffff0000) != 0x3d800000)
1511 break;
1512
1513 /* lwz 12,<some immediate>(12) */
1514 pc = pc + 4;
e17a4113 1515 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1516 if ((op & 0xffff0000) != 0x818c0000)
1517 break;
1518
1519 /* twllt 0,12 */
1520 pc = pc + 4;
e17a4113 1521 op = rs6000_fetch_instruction (gdbarch, pc);
de9f48f0
JG
1522 if ((op & 0xfffffffe) != 0x7c406008)
1523 break;
1524
1525 /* We found a valid stack-check sequence, return the new PC. */
1526 return pc;
1527 }
1528
1529 /* No stack check code in our prologue, return the start_pc. */
1530 return start_pc;
1531}
1532
6a16c029
TJB
1533/* return pc value after skipping a function prologue and also return
1534 information about a function frame.
1535
1536 in struct rs6000_framedata fdata:
1537 - frameless is TRUE, if function does not have a frame.
1538 - nosavedpc is TRUE, if function does not save %pc value in its frame.
1539 - offset is the initial size of this stack frame --- the amount by
1540 which we decrement the sp to allocate the frame.
1541 - saved_gpr is the number of the first saved gpr.
1542 - saved_fpr is the number of the first saved fpr.
1543 - saved_vr is the number of the first saved vr.
1544 - saved_ev is the number of the first saved ev.
1545 - alloca_reg is the number of the register used for alloca() handling.
1546 Otherwise -1.
1547 - gpr_offset is the offset of the first saved gpr from the previous frame.
1548 - fpr_offset is the offset of the first saved fpr from the previous frame.
1549 - vr_offset is the offset of the first saved vr from the previous frame.
1550 - ev_offset is the offset of the first saved ev from the previous frame.
1551 - lr_offset is the offset of the saved lr
1552 - cr_offset is the offset of the saved cr
0df8b418 1553 - vrsave_offset is the offset of the saved vrsave register. */
6a16c029 1554
7a78ae4e 1555static CORE_ADDR
be8626e0
MD
1556skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc,
1557 struct rs6000_framedata *fdata)
c906108c
SS
1558{
1559 CORE_ADDR orig_pc = pc;
55d05f3b 1560 CORE_ADDR last_prologue_pc = pc;
6be8bc0c 1561 CORE_ADDR li_found_pc = 0;
50fd1280 1562 gdb_byte buf[4];
c906108c
SS
1563 unsigned long op;
1564 long offset = 0;
6be8bc0c 1565 long vr_saved_offset = 0;
482ca3f5
KB
1566 int lr_reg = -1;
1567 int cr_reg = -1;
6be8bc0c 1568 int vr_reg = -1;
96ff0de4
EZ
1569 int ev_reg = -1;
1570 long ev_offset = 0;
6be8bc0c 1571 int vrsave_reg = -1;
c906108c
SS
1572 int reg;
1573 int framep = 0;
1574 int minimal_toc_loaded = 0;
ddb20c56 1575 int prev_insn_was_prologue_insn = 1;
55d05f3b 1576 int num_skip_non_prologue_insns = 0;
773df3e5 1577 int r0_contains_arg = 0;
be8626e0
MD
1578 const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch);
1579 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
e17a4113 1580 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
c906108c 1581
ddb20c56 1582 memset (fdata, 0, sizeof (struct rs6000_framedata));
c906108c
SS
1583 fdata->saved_gpr = -1;
1584 fdata->saved_fpr = -1;
6be8bc0c 1585 fdata->saved_vr = -1;
96ff0de4 1586 fdata->saved_ev = -1;
c906108c
SS
1587 fdata->alloca_reg = -1;
1588 fdata->frameless = 1;
1589 fdata->nosavedpc = 1;
46a9b8ed 1590 fdata->lr_register = -1;
c906108c 1591
e17a4113 1592 pc = rs6000_skip_stack_check (gdbarch, pc);
de9f48f0
JG
1593 if (pc >= lim_pc)
1594 pc = lim_pc;
1595
55d05f3b 1596 for (;; pc += 4)
c906108c 1597 {
ddb20c56
KB
1598 /* Sometimes it isn't clear if an instruction is a prologue
1599 instruction or not. When we encounter one of these ambiguous
1600 cases, we'll set prev_insn_was_prologue_insn to 0 (false).
0df8b418 1601 Otherwise, we'll assume that it really is a prologue instruction. */
ddb20c56
KB
1602 if (prev_insn_was_prologue_insn)
1603 last_prologue_pc = pc;
55d05f3b
KB
1604
1605 /* Stop scanning if we've hit the limit. */
4e463ff5 1606 if (pc >= lim_pc)
55d05f3b
KB
1607 break;
1608
ddb20c56
KB
1609 prev_insn_was_prologue_insn = 1;
1610
55d05f3b 1611 /* Fetch the instruction and convert it to an integer. */
ddb20c56
KB
1612 if (target_read_memory (pc, buf, 4))
1613 break;
e17a4113 1614 op = extract_unsigned_integer (buf, 4, byte_order);
c906108c 1615
c5aa993b
JM
1616 if ((op & 0xfc1fffff) == 0x7c0802a6)
1617 { /* mflr Rx */
43b1ab88
AC
1618 /* Since shared library / PIC code, which needs to get its
1619 address at runtime, can appear to save more than one link
1620 register vis:
1621
1622 *INDENT-OFF*
1623 stwu r1,-304(r1)
1624 mflr r3
1625 bl 0xff570d0 (blrl)
1626 stw r30,296(r1)
1627 mflr r30
1628 stw r31,300(r1)
1629 stw r3,308(r1);
1630 ...
1631 *INDENT-ON*
1632
1633 remember just the first one, but skip over additional
1634 ones. */
721d14ba 1635 if (lr_reg == -1)
46a9b8ed 1636 lr_reg = (op & 0x03e00000) >> 21;
773df3e5
JB
1637 if (lr_reg == 0)
1638 r0_contains_arg = 0;
c5aa993b 1639 continue;
c5aa993b
JM
1640 }
1641 else if ((op & 0xfc1fffff) == 0x7c000026)
1642 { /* mfcr Rx */
98f08d3d 1643 cr_reg = (op & 0x03e00000);
773df3e5
JB
1644 if (cr_reg == 0)
1645 r0_contains_arg = 0;
c5aa993b 1646 continue;
c906108c 1647
c906108c 1648 }
c5aa993b
JM
1649 else if ((op & 0xfc1f0000) == 0xd8010000)
1650 { /* stfd Rx,NUM(r1) */
1651 reg = GET_SRC_REG (op);
1652 if (fdata->saved_fpr == -1 || fdata->saved_fpr > reg)
1653 {
1654 fdata->saved_fpr = reg;
1655 fdata->fpr_offset = SIGNED_SHORT (op) + offset;
1656 }
1657 continue;
c906108c 1658
c5aa993b
JM
1659 }
1660 else if (((op & 0xfc1f0000) == 0xbc010000) || /* stm Rx, NUM(r1) */
7a78ae4e
ND
1661 (((op & 0xfc1f0000) == 0x90010000 || /* st rx,NUM(r1) */
1662 (op & 0xfc1f0003) == 0xf8010000) && /* std rx,NUM(r1) */
1663 (op & 0x03e00000) >= 0x01a00000)) /* rx >= r13 */
c5aa993b
JM
1664 {
1665
1666 reg = GET_SRC_REG (op);
46a9b8ed
DJ
1667 if ((op & 0xfc1f0000) == 0xbc010000)
1668 fdata->gpr_mask |= ~((1U << reg) - 1);
1669 else
1670 fdata->gpr_mask |= 1U << reg;
c5aa993b
JM
1671 if (fdata->saved_gpr == -1 || fdata->saved_gpr > reg)
1672 {
1673 fdata->saved_gpr = reg;
7a78ae4e 1674 if ((op & 0xfc1f0003) == 0xf8010000)
98f08d3d 1675 op &= ~3UL;
c5aa993b
JM
1676 fdata->gpr_offset = SIGNED_SHORT (op) + offset;
1677 }
1678 continue;
c906108c 1679
ddb20c56 1680 }
ef1bc9e7
AM
1681 else if ((op & 0xffff0000) == 0x3c4c0000
1682 || (op & 0xffff0000) == 0x3c400000
1683 || (op & 0xffff0000) == 0x38420000)
1684 {
1685 /* . 0: addis 2,12,.TOC.-0b@ha
1686 . addi 2,2,.TOC.-0b@l
1687 or
1688 . lis 2,.TOC.@ha
1689 . addi 2,2,.TOC.@l
1690 used by ELFv2 global entry points to set up r2. */
1691 continue;
1692 }
1693 else if (op == 0x60000000)
ddb20c56 1694 {
96ff0de4 1695 /* nop */
ddb20c56
KB
1696 /* Allow nops in the prologue, but do not consider them to
1697 be part of the prologue unless followed by other prologue
0df8b418 1698 instructions. */
ddb20c56
KB
1699 prev_insn_was_prologue_insn = 0;
1700 continue;
1701
c906108c 1702 }
c5aa993b 1703 else if ((op & 0xffff0000) == 0x3c000000)
ef1bc9e7 1704 { /* addis 0,0,NUM, used for >= 32k frames */
c5aa993b
JM
1705 fdata->offset = (op & 0x0000ffff) << 16;
1706 fdata->frameless = 0;
773df3e5 1707 r0_contains_arg = 0;
c5aa993b
JM
1708 continue;
1709
1710 }
1711 else if ((op & 0xffff0000) == 0x60000000)
ef1bc9e7 1712 { /* ori 0,0,NUM, 2nd half of >= 32k frames */
c5aa993b
JM
1713 fdata->offset |= (op & 0x0000ffff);
1714 fdata->frameless = 0;
773df3e5 1715 r0_contains_arg = 0;
c5aa993b
JM
1716 continue;
1717
1718 }
be723e22 1719 else if (lr_reg >= 0 &&
98f08d3d
KB
1720 /* std Rx, NUM(r1) || stdu Rx, NUM(r1) */
1721 (((op & 0xffff0000) == (lr_reg | 0xf8010000)) ||
1722 /* stw Rx, NUM(r1) */
1723 ((op & 0xffff0000) == (lr_reg | 0x90010000)) ||
1724 /* stwu Rx, NUM(r1) */
1725 ((op & 0xffff0000) == (lr_reg | 0x94010000))))
1726 { /* where Rx == lr */
1727 fdata->lr_offset = offset;
c5aa993b 1728 fdata->nosavedpc = 0;
be723e22
MS
1729 /* Invalidate lr_reg, but don't set it to -1.
1730 That would mean that it had never been set. */
1731 lr_reg = -2;
98f08d3d
KB
1732 if ((op & 0xfc000003) == 0xf8000000 || /* std */
1733 (op & 0xfc000000) == 0x90000000) /* stw */
1734 {
1735 /* Does not update r1, so add displacement to lr_offset. */
1736 fdata->lr_offset += SIGNED_SHORT (op);
1737 }
c5aa993b
JM
1738 continue;
1739
1740 }
be723e22 1741 else if (cr_reg >= 0 &&
98f08d3d
KB
1742 /* std Rx, NUM(r1) || stdu Rx, NUM(r1) */
1743 (((op & 0xffff0000) == (cr_reg | 0xf8010000)) ||
1744 /* stw Rx, NUM(r1) */
1745 ((op & 0xffff0000) == (cr_reg | 0x90010000)) ||
1746 /* stwu Rx, NUM(r1) */
1747 ((op & 0xffff0000) == (cr_reg | 0x94010000))))
1748 { /* where Rx == cr */
1749 fdata->cr_offset = offset;
be723e22
MS
1750 /* Invalidate cr_reg, but don't set it to -1.
1751 That would mean that it had never been set. */
1752 cr_reg = -2;
98f08d3d
KB
1753 if ((op & 0xfc000003) == 0xf8000000 ||
1754 (op & 0xfc000000) == 0x90000000)
1755 {
1756 /* Does not update r1, so add displacement to cr_offset. */
1757 fdata->cr_offset += SIGNED_SHORT (op);
1758 }
c5aa993b
JM
1759 continue;
1760
1761 }
721d14ba
DJ
1762 else if ((op & 0xfe80ffff) == 0x42800005 && lr_reg != -1)
1763 {
1764 /* bcl 20,xx,.+4 is used to get the current PC, with or without
1765 prediction bits. If the LR has already been saved, we can
1766 skip it. */
1767 continue;
1768 }
c5aa993b
JM
1769 else if (op == 0x48000005)
1770 { /* bl .+4 used in
1771 -mrelocatable */
46a9b8ed 1772 fdata->used_bl = 1;
c5aa993b
JM
1773 continue;
1774
1775 }
1776 else if (op == 0x48000004)
1777 { /* b .+4 (xlc) */
1778 break;
1779
c5aa993b 1780 }
6be8bc0c
EZ
1781 else if ((op & 0xffff0000) == 0x3fc00000 || /* addis 30,0,foo@ha, used
1782 in V.4 -mminimal-toc */
c5aa993b
JM
1783 (op & 0xffff0000) == 0x3bde0000)
1784 { /* addi 30,30,foo@l */
1785 continue;
c906108c 1786
c5aa993b
JM
1787 }
1788 else if ((op & 0xfc000001) == 0x48000001)
1789 { /* bl foo,
0df8b418 1790 to save fprs??? */
c906108c 1791
c5aa993b 1792 fdata->frameless = 0;
3c77c82a
DJ
1793
1794 /* If the return address has already been saved, we can skip
1795 calls to blrl (for PIC). */
e17a4113 1796 if (lr_reg != -1 && bl_to_blrl_insn_p (pc, op, byte_order))
46a9b8ed
DJ
1797 {
1798 fdata->used_bl = 1;
1799 continue;
1800 }
3c77c82a 1801
6be8bc0c 1802 /* Don't skip over the subroutine call if it is not within
ebd98106
FF
1803 the first three instructions of the prologue and either
1804 we have no line table information or the line info tells
1805 us that the subroutine call is not part of the line
1806 associated with the prologue. */
c5aa993b 1807 if ((pc - orig_pc) > 8)
ebd98106
FF
1808 {
1809 struct symtab_and_line prologue_sal = find_pc_line (orig_pc, 0);
1810 struct symtab_and_line this_sal = find_pc_line (pc, 0);
1811
0df8b418
MS
1812 if ((prologue_sal.line == 0)
1813 || (prologue_sal.line != this_sal.line))
ebd98106
FF
1814 break;
1815 }
c5aa993b 1816
e17a4113 1817 op = read_memory_integer (pc + 4, 4, byte_order);
c5aa993b 1818
6be8bc0c
EZ
1819 /* At this point, make sure this is not a trampoline
1820 function (a function that simply calls another functions,
1821 and nothing else). If the next is not a nop, this branch
0df8b418 1822 was part of the function prologue. */
c5aa993b
JM
1823
1824 if (op == 0x4def7b82 || op == 0) /* crorc 15, 15, 15 */
0df8b418
MS
1825 break; /* Don't skip over
1826 this branch. */
c5aa993b 1827
46a9b8ed
DJ
1828 fdata->used_bl = 1;
1829 continue;
c5aa993b 1830 }
98f08d3d
KB
1831 /* update stack pointer */
1832 else if ((op & 0xfc1f0000) == 0x94010000)
1833 { /* stu rX,NUM(r1) || stwu rX,NUM(r1) */
c5aa993b
JM
1834 fdata->frameless = 0;
1835 fdata->offset = SIGNED_SHORT (op);
1836 offset = fdata->offset;
1837 continue;
c5aa993b 1838 }
98f08d3d
KB
1839 else if ((op & 0xfc1f016a) == 0x7c01016e)
1840 { /* stwux rX,r1,rY */
0df8b418 1841 /* No way to figure out what r1 is going to be. */
98f08d3d
KB
1842 fdata->frameless = 0;
1843 offset = fdata->offset;
1844 continue;
1845 }
1846 else if ((op & 0xfc1f0003) == 0xf8010001)
1847 { /* stdu rX,NUM(r1) */
1848 fdata->frameless = 0;
1849 fdata->offset = SIGNED_SHORT (op & ~3UL);
1850 offset = fdata->offset;
1851 continue;
1852 }
1853 else if ((op & 0xfc1f016a) == 0x7c01016a)
1854 { /* stdux rX,r1,rY */
0df8b418 1855 /* No way to figure out what r1 is going to be. */
c5aa993b
JM
1856 fdata->frameless = 0;
1857 offset = fdata->offset;
1858 continue;
c5aa993b 1859 }
7313566f
FF
1860 else if ((op & 0xffff0000) == 0x38210000)
1861 { /* addi r1,r1,SIMM */
1862 fdata->frameless = 0;
1863 fdata->offset += SIGNED_SHORT (op);
1864 offset = fdata->offset;
1865 continue;
1866 }
4e463ff5
DJ
1867 /* Load up minimal toc pointer. Do not treat an epilogue restore
1868 of r31 as a minimal TOC load. */
0df8b418
MS
1869 else if (((op >> 22) == 0x20f || /* l r31,... or l r30,... */
1870 (op >> 22) == 0x3af) /* ld r31,... or ld r30,... */
4e463ff5 1871 && !framep
c5aa993b 1872 && !minimal_toc_loaded)
98f08d3d 1873 {
c5aa993b
JM
1874 minimal_toc_loaded = 1;
1875 continue;
1876
f6077098
KB
1877 /* move parameters from argument registers to local variable
1878 registers */
1879 }
1880 else if ((op & 0xfc0007fe) == 0x7c000378 && /* mr(.) Rx,Ry */
1881 (((op >> 21) & 31) >= 3) && /* R3 >= Ry >= R10 */
1882 (((op >> 21) & 31) <= 10) &&
0df8b418
MS
1883 ((long) ((op >> 16) & 31)
1884 >= fdata->saved_gpr)) /* Rx: local var reg */
f6077098
KB
1885 {
1886 continue;
1887
c5aa993b
JM
1888 /* store parameters in stack */
1889 }
e802b915 1890 /* Move parameters from argument registers to temporary register. */
773df3e5 1891 else if (store_param_on_stack_p (op, framep, &r0_contains_arg))
e802b915 1892 {
c5aa993b
JM
1893 continue;
1894
1895 /* Set up frame pointer */
1896 }
76219d77
JB
1897 else if (op == 0x603d0000) /* oril r29, r1, 0x0 */
1898 {
1899 fdata->frameless = 0;
1900 framep = 1;
1901 fdata->alloca_reg = (tdep->ppc_gp0_regnum + 29);
1902 continue;
1903
1904 /* Another way to set up the frame pointer. */
1905 }
c5aa993b
JM
1906 else if (op == 0x603f0000 /* oril r31, r1, 0x0 */
1907 || op == 0x7c3f0b78)
1908 { /* mr r31, r1 */
1909 fdata->frameless = 0;
1910 framep = 1;
6f99cb26 1911 fdata->alloca_reg = (tdep->ppc_gp0_regnum + 31);
c5aa993b
JM
1912 continue;
1913
1914 /* Another way to set up the frame pointer. */
1915 }
1916 else if ((op & 0xfc1fffff) == 0x38010000)
1917 { /* addi rX, r1, 0x0 */
1918 fdata->frameless = 0;
1919 framep = 1;
6f99cb26
AC
1920 fdata->alloca_reg = (tdep->ppc_gp0_regnum
1921 + ((op & ~0x38010000) >> 21));
c5aa993b 1922 continue;
c5aa993b 1923 }
6be8bc0c
EZ
1924 /* AltiVec related instructions. */
1925 /* Store the vrsave register (spr 256) in another register for
1926 later manipulation, or load a register into the vrsave
1927 register. 2 instructions are used: mfvrsave and
1928 mtvrsave. They are shorthand notation for mfspr Rn, SPR256
1929 and mtspr SPR256, Rn. */
1930 /* mfspr Rn SPR256 == 011111 nnnnn 0000001000 01010100110
1931 mtspr SPR256 Rn == 011111 nnnnn 0000001000 01110100110 */
1932 else if ((op & 0xfc1fffff) == 0x7c0042a6) /* mfvrsave Rn */
1933 {
1934 vrsave_reg = GET_SRC_REG (op);
1935 continue;
1936 }
1937 else if ((op & 0xfc1fffff) == 0x7c0043a6) /* mtvrsave Rn */
1938 {
1939 continue;
1940 }
1941 /* Store the register where vrsave was saved to onto the stack:
1942 rS is the register where vrsave was stored in a previous
1943 instruction. */
1944 /* 100100 sssss 00001 dddddddd dddddddd */
1945 else if ((op & 0xfc1f0000) == 0x90010000) /* stw rS, d(r1) */
1946 {
1947 if (vrsave_reg == GET_SRC_REG (op))
1948 {
1949 fdata->vrsave_offset = SIGNED_SHORT (op) + offset;
1950 vrsave_reg = -1;
1951 }
1952 continue;
1953 }
1954 /* Compute the new value of vrsave, by modifying the register
1955 where vrsave was saved to. */
1956 else if (((op & 0xfc000000) == 0x64000000) /* oris Ra, Rs, UIMM */
1957 || ((op & 0xfc000000) == 0x60000000))/* ori Ra, Rs, UIMM */
1958 {
1959 continue;
1960 }
1961 /* li r0, SIMM (short for addi r0, 0, SIMM). This is the first
1962 in a pair of insns to save the vector registers on the
1963 stack. */
1964 /* 001110 00000 00000 iiii iiii iiii iiii */
96ff0de4
EZ
1965 /* 001110 01110 00000 iiii iiii iiii iiii */
1966 else if ((op & 0xffff0000) == 0x38000000 /* li r0, SIMM */
1967 || (op & 0xffff0000) == 0x39c00000) /* li r14, SIMM */
6be8bc0c 1968 {
773df3e5
JB
1969 if ((op & 0xffff0000) == 0x38000000)
1970 r0_contains_arg = 0;
6be8bc0c
EZ
1971 li_found_pc = pc;
1972 vr_saved_offset = SIGNED_SHORT (op);
773df3e5
JB
1973
1974 /* This insn by itself is not part of the prologue, unless
0df8b418 1975 if part of the pair of insns mentioned above. So do not
773df3e5
JB
1976 record this insn as part of the prologue yet. */
1977 prev_insn_was_prologue_insn = 0;
6be8bc0c
EZ
1978 }
1979 /* Store vector register S at (r31+r0) aligned to 16 bytes. */
1980 /* 011111 sssss 11111 00000 00111001110 */
1981 else if ((op & 0xfc1fffff) == 0x7c1f01ce) /* stvx Vs, R31, R0 */
1982 {
1983 if (pc == (li_found_pc + 4))
1984 {
1985 vr_reg = GET_SRC_REG (op);
1986 /* If this is the first vector reg to be saved, or if
1987 it has a lower number than others previously seen,
1988 reupdate the frame info. */
1989 if (fdata->saved_vr == -1 || fdata->saved_vr > vr_reg)
1990 {
1991 fdata->saved_vr = vr_reg;
1992 fdata->vr_offset = vr_saved_offset + offset;
1993 }
1994 vr_saved_offset = -1;
1995 vr_reg = -1;
1996 li_found_pc = 0;
1997 }
1998 }
1999 /* End AltiVec related instructions. */
96ff0de4
EZ
2000
2001 /* Start BookE related instructions. */
2002 /* Store gen register S at (r31+uimm).
2003 Any register less than r13 is volatile, so we don't care. */
2004 /* 000100 sssss 11111 iiiii 01100100001 */
2005 else if (arch_info->mach == bfd_mach_ppc_e500
2006 && (op & 0xfc1f07ff) == 0x101f0321) /* evstdd Rs,uimm(R31) */
2007 {
2008 if ((op & 0x03e00000) >= 0x01a00000) /* Rs >= r13 */
2009 {
2010 unsigned int imm;
2011 ev_reg = GET_SRC_REG (op);
2012 imm = (op >> 11) & 0x1f;
2013 ev_offset = imm * 8;
2014 /* If this is the first vector reg to be saved, or if
2015 it has a lower number than others previously seen,
2016 reupdate the frame info. */
2017 if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
2018 {
2019 fdata->saved_ev = ev_reg;
2020 fdata->ev_offset = ev_offset + offset;
2021 }
2022 }
2023 continue;
2024 }
2025 /* Store gen register rS at (r1+rB). */
2026 /* 000100 sssss 00001 bbbbb 01100100000 */
2027 else if (arch_info->mach == bfd_mach_ppc_e500
2028 && (op & 0xffe007ff) == 0x13e00320) /* evstddx RS,R1,Rb */
2029 {
2030 if (pc == (li_found_pc + 4))
2031 {
2032 ev_reg = GET_SRC_REG (op);
2033 /* If this is the first vector reg to be saved, or if
2034 it has a lower number than others previously seen,
2035 reupdate the frame info. */
2036 /* We know the contents of rB from the previous instruction. */
2037 if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
2038 {
2039 fdata->saved_ev = ev_reg;
2040 fdata->ev_offset = vr_saved_offset + offset;
2041 }
2042 vr_saved_offset = -1;
2043 ev_reg = -1;
2044 li_found_pc = 0;
2045 }
2046 continue;
2047 }
2048 /* Store gen register r31 at (rA+uimm). */
2049 /* 000100 11111 aaaaa iiiii 01100100001 */
2050 else if (arch_info->mach == bfd_mach_ppc_e500
2051 && (op & 0xffe007ff) == 0x13e00321) /* evstdd R31,Ra,UIMM */
2052 {
2053 /* Wwe know that the source register is 31 already, but
2054 it can't hurt to compute it. */
2055 ev_reg = GET_SRC_REG (op);
2056 ev_offset = ((op >> 11) & 0x1f) * 8;
2057 /* If this is the first vector reg to be saved, or if
2058 it has a lower number than others previously seen,
2059 reupdate the frame info. */
2060 if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
2061 {
2062 fdata->saved_ev = ev_reg;
2063 fdata->ev_offset = ev_offset + offset;
2064 }
2065
2066 continue;
2067 }
2068 /* Store gen register S at (r31+r0).
2069 Store param on stack when offset from SP bigger than 4 bytes. */
2070 /* 000100 sssss 11111 00000 01100100000 */
2071 else if (arch_info->mach == bfd_mach_ppc_e500
2072 && (op & 0xfc1fffff) == 0x101f0320) /* evstddx Rs,R31,R0 */
2073 {
2074 if (pc == (li_found_pc + 4))
2075 {
2076 if ((op & 0x03e00000) >= 0x01a00000)
2077 {
2078 ev_reg = GET_SRC_REG (op);
2079 /* If this is the first vector reg to be saved, or if
2080 it has a lower number than others previously seen,
2081 reupdate the frame info. */
2082 /* We know the contents of r0 from the previous
2083 instruction. */
2084 if (fdata->saved_ev == -1 || fdata->saved_ev > ev_reg)
2085 {
2086 fdata->saved_ev = ev_reg;
2087 fdata->ev_offset = vr_saved_offset + offset;
2088 }
2089 ev_reg = -1;
2090 }
2091 vr_saved_offset = -1;
2092 li_found_pc = 0;
2093 continue;
2094 }
2095 }
2096 /* End BookE related instructions. */
2097
c5aa993b
JM
2098 else
2099 {
46a9b8ed
DJ
2100 unsigned int all_mask = ~((1U << fdata->saved_gpr) - 1);
2101
55d05f3b
KB
2102 /* Not a recognized prologue instruction.
2103 Handle optimizer code motions into the prologue by continuing
2104 the search if we have no valid frame yet or if the return
46a9b8ed
DJ
2105 address is not yet saved in the frame. Also skip instructions
2106 if some of the GPRs expected to be saved are not yet saved. */
2107 if (fdata->frameless == 0 && fdata->nosavedpc == 0
2108 && (fdata->gpr_mask & all_mask) == all_mask)
55d05f3b
KB
2109 break;
2110
2111 if (op == 0x4e800020 /* blr */
2112 || op == 0x4e800420) /* bctr */
2113 /* Do not scan past epilogue in frameless functions or
2114 trampolines. */
2115 break;
2116 if ((op & 0xf4000000) == 0x40000000) /* bxx */
64366f1c 2117 /* Never skip branches. */
55d05f3b
KB
2118 break;
2119
2120 if (num_skip_non_prologue_insns++ > max_skip_non_prologue_insns)
2121 /* Do not scan too many insns, scanning insns is expensive with
2122 remote targets. */
2123 break;
2124
2125 /* Continue scanning. */
2126 prev_insn_was_prologue_insn = 0;
2127 continue;
c5aa993b 2128 }
c906108c
SS
2129 }
2130
2131#if 0
2132/* I have problems with skipping over __main() that I need to address
0df8b418 2133 * sometime. Previously, I used to use misc_function_vector which
c906108c
SS
2134 * didn't work as well as I wanted to be. -MGO */
2135
2136 /* If the first thing after skipping a prolog is a branch to a function,
2137 this might be a call to an initializer in main(), introduced by gcc2.
64366f1c 2138 We'd like to skip over it as well. Fortunately, xlc does some extra
c906108c 2139 work before calling a function right after a prologue, thus we can
64366f1c 2140 single out such gcc2 behaviour. */
c906108c 2141
c906108c 2142
c5aa993b 2143 if ((op & 0xfc000001) == 0x48000001)
0df8b418 2144 { /* bl foo, an initializer function? */
e17a4113 2145 op = read_memory_integer (pc + 4, 4, byte_order);
c5aa993b
JM
2146
2147 if (op == 0x4def7b82)
2148 { /* cror 0xf, 0xf, 0xf (nop) */
c906108c 2149
64366f1c
EZ
2150 /* Check and see if we are in main. If so, skip over this
2151 initializer function as well. */
c906108c 2152
c5aa993b 2153 tmp = find_pc_misc_function (pc);
6314a349
AC
2154 if (tmp >= 0
2155 && strcmp (misc_function_vector[tmp].name, main_name ()) == 0)
c5aa993b
JM
2156 return pc + 8;
2157 }
c906108c 2158 }
c906108c 2159#endif /* 0 */
c5aa993b 2160
46a9b8ed
DJ
2161 if (pc == lim_pc && lr_reg >= 0)
2162 fdata->lr_register = lr_reg;
2163
c5aa993b 2164 fdata->offset = -fdata->offset;
ddb20c56 2165 return last_prologue_pc;
c906108c
SS
2166}
2167
7a78ae4e 2168static CORE_ADDR
4a7622d1 2169rs6000_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 2170{
4a7622d1 2171 struct rs6000_framedata frame;
e3acb115 2172 CORE_ADDR limit_pc, func_addr, func_end_addr = 0;
c906108c 2173
4a7622d1
UW
2174 /* See if we can determine the end of the prologue via the symbol table.
2175 If so, then return either PC, or the PC after the prologue, whichever
2176 is greater. */
e3acb115 2177 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr))
c5aa993b 2178 {
d80b854b
UW
2179 CORE_ADDR post_prologue_pc
2180 = skip_prologue_using_sal (gdbarch, func_addr);
4a7622d1 2181 if (post_prologue_pc != 0)
325fac50 2182 return std::max (pc, post_prologue_pc);
c906108c 2183 }
c906108c 2184
4a7622d1
UW
2185 /* Can't determine prologue from the symbol table, need to examine
2186 instructions. */
c906108c 2187
4a7622d1
UW
2188 /* Find an upper limit on the function prologue using the debug
2189 information. If the debug information could not be used to provide
2190 that bound, then use an arbitrary large number as the upper bound. */
d80b854b 2191 limit_pc = skip_prologue_using_sal (gdbarch, pc);
4a7622d1
UW
2192 if (limit_pc == 0)
2193 limit_pc = pc + 100; /* Magic. */
794a477a 2194
e3acb115
JB
2195 /* Do not allow limit_pc to be past the function end, if we know
2196 where that end is... */
2197 if (func_end_addr && limit_pc > func_end_addr)
2198 limit_pc = func_end_addr;
2199
4a7622d1
UW
2200 pc = skip_prologue (gdbarch, pc, limit_pc, &frame);
2201 return pc;
c906108c 2202}
c906108c 2203
8ab3d180
KB
2204/* When compiling for EABI, some versions of GCC emit a call to __eabi
2205 in the prologue of main().
2206
2207 The function below examines the code pointed at by PC and checks to
2208 see if it corresponds to a call to __eabi. If so, it returns the
2209 address of the instruction following that call. Otherwise, it simply
2210 returns PC. */
2211
63807e1d 2212static CORE_ADDR
8ab3d180
KB
2213rs6000_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
2214{
e17a4113 2215 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8ab3d180
KB
2216 gdb_byte buf[4];
2217 unsigned long op;
2218
2219 if (target_read_memory (pc, buf, 4))
2220 return pc;
e17a4113 2221 op = extract_unsigned_integer (buf, 4, byte_order);
8ab3d180
KB
2222
2223 if ((op & BL_MASK) == BL_INSTRUCTION)
2224 {
2225 CORE_ADDR displ = op & BL_DISPLACEMENT_MASK;
2226 CORE_ADDR call_dest = pc + 4 + displ;
7cbd4a93 2227 struct bound_minimal_symbol s = lookup_minimal_symbol_by_pc (call_dest);
8ab3d180
KB
2228
2229 /* We check for ___eabi (three leading underscores) in addition
2230 to __eabi in case the GCC option "-fleading-underscore" was
2231 used to compile the program. */
7cbd4a93 2232 if (s.minsym != NULL
efd66ac6
TT
2233 && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
2234 && (strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__eabi") == 0
2235 || strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "___eabi") == 0))
8ab3d180
KB
2236 pc += 4;
2237 }
2238 return pc;
2239}
383f0f5b 2240
4a7622d1
UW
2241/* All the ABI's require 16 byte alignment. */
2242static CORE_ADDR
2243rs6000_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
2244{
2245 return (addr & -16);
c906108c
SS
2246}
2247
977adac5
ND
2248/* Return whether handle_inferior_event() should proceed through code
2249 starting at PC in function NAME when stepping.
2250
2251 The AIX -bbigtoc linker option generates functions @FIX0, @FIX1, etc. to
2252 handle memory references that are too distant to fit in instructions
2253 generated by the compiler. For example, if 'foo' in the following
2254 instruction:
2255
2256 lwz r9,foo(r2)
2257
2258 is greater than 32767, the linker might replace the lwz with a branch to
2259 somewhere in @FIX1 that does the load in 2 instructions and then branches
2260 back to where execution should continue.
2261
2262 GDB should silently step over @FIX code, just like AIX dbx does.
2ec664f5
MS
2263 Unfortunately, the linker uses the "b" instruction for the
2264 branches, meaning that the link register doesn't get set.
2265 Therefore, GDB's usual step_over_function () mechanism won't work.
977adac5 2266
e76f05fa
UW
2267 Instead, use the gdbarch_skip_trampoline_code and
2268 gdbarch_skip_trampoline_code hooks in handle_inferior_event() to skip past
2ec664f5 2269 @FIX code. */
977adac5 2270
63807e1d 2271static int
e17a4113 2272rs6000_in_solib_return_trampoline (struct gdbarch *gdbarch,
2c02bd72 2273 CORE_ADDR pc, const char *name)
977adac5 2274{
61012eef 2275 return name && startswith (name, "@FIX");
977adac5
ND
2276}
2277
2278/* Skip code that the user doesn't want to see when stepping:
2279
2280 1. Indirect function calls use a piece of trampoline code to do context
2281 switching, i.e. to set the new TOC table. Skip such code if we are on
2282 its first instruction (as when we have single-stepped to here).
2283
2284 2. Skip shared library trampoline code (which is different from
c906108c 2285 indirect function call trampolines).
977adac5
ND
2286
2287 3. Skip bigtoc fixup code.
2288
c906108c 2289 Result is desired PC to step until, or NULL if we are not in
977adac5 2290 code that should be skipped. */
c906108c 2291
63807e1d 2292static CORE_ADDR
52f729a7 2293rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
c906108c 2294{
e17a4113
UW
2295 struct gdbarch *gdbarch = get_frame_arch (frame);
2296 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2297 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
52f0bd74 2298 unsigned int ii, op;
977adac5 2299 int rel;
c906108c 2300 CORE_ADDR solib_target_pc;
7cbd4a93 2301 struct bound_minimal_symbol msymbol;
c906108c 2302
c5aa993b
JM
2303 static unsigned trampoline_code[] =
2304 {
2305 0x800b0000, /* l r0,0x0(r11) */
2306 0x90410014, /* st r2,0x14(r1) */
2307 0x7c0903a6, /* mtctr r0 */
2308 0x804b0004, /* l r2,0x4(r11) */
2309 0x816b0008, /* l r11,0x8(r11) */
2310 0x4e800420, /* bctr */
2311 0x4e800020, /* br */
2312 0
c906108c
SS
2313 };
2314
977adac5
ND
2315 /* Check for bigtoc fixup code. */
2316 msymbol = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 2317 if (msymbol.minsym
e17a4113 2318 && rs6000_in_solib_return_trampoline (gdbarch, pc,
efd66ac6 2319 MSYMBOL_LINKAGE_NAME (msymbol.minsym)))
977adac5
ND
2320 {
2321 /* Double-check that the third instruction from PC is relative "b". */
e17a4113 2322 op = read_memory_integer (pc + 8, 4, byte_order);
977adac5
ND
2323 if ((op & 0xfc000003) == 0x48000000)
2324 {
2325 /* Extract bits 6-29 as a signed 24-bit relative word address and
2326 add it to the containing PC. */
2327 rel = ((int)(op << 6) >> 6);
2328 return pc + 8 + rel;
2329 }
2330 }
2331
c906108c 2332 /* If pc is in a shared library trampoline, return its target. */
52f729a7 2333 solib_target_pc = find_solib_trampoline_target (frame, pc);
c906108c
SS
2334 if (solib_target_pc)
2335 return solib_target_pc;
2336
c5aa993b
JM
2337 for (ii = 0; trampoline_code[ii]; ++ii)
2338 {
e17a4113 2339 op = read_memory_integer (pc + (ii * 4), 4, byte_order);
c5aa993b
JM
2340 if (op != trampoline_code[ii])
2341 return 0;
2342 }
0df8b418
MS
2343 ii = get_frame_register_unsigned (frame, 11); /* r11 holds destination
2344 addr. */
e17a4113 2345 pc = read_memory_unsigned_integer (ii, tdep->wordsize, byte_order);
c906108c
SS
2346 return pc;
2347}
2348
794ac428
UW
2349/* ISA-specific vector types. */
2350
2351static struct type *
2352rs6000_builtin_type_vec64 (struct gdbarch *gdbarch)
2353{
2354 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2355
2356 if (!tdep->ppc_builtin_type_vec64)
2357 {
df4df182
UW
2358 const struct builtin_type *bt = builtin_type (gdbarch);
2359
794ac428
UW
2360 /* The type we're building is this: */
2361#if 0
2362 union __gdb_builtin_type_vec64
2363 {
2364 int64_t uint64;
2365 float v2_float[2];
2366 int32_t v2_int32[2];
2367 int16_t v4_int16[4];
2368 int8_t v8_int8[8];
2369 };
2370#endif
2371
2372 struct type *t;
2373
e9bb382b
UW
2374 t = arch_composite_type (gdbarch,
2375 "__ppc_builtin_type_vec64", TYPE_CODE_UNION);
df4df182 2376 append_composite_type_field (t, "uint64", bt->builtin_int64);
794ac428 2377 append_composite_type_field (t, "v2_float",
df4df182 2378 init_vector_type (bt->builtin_float, 2));
794ac428 2379 append_composite_type_field (t, "v2_int32",
df4df182 2380 init_vector_type (bt->builtin_int32, 2));
794ac428 2381 append_composite_type_field (t, "v4_int16",
df4df182 2382 init_vector_type (bt->builtin_int16, 4));
794ac428 2383 append_composite_type_field (t, "v8_int8",
df4df182 2384 init_vector_type (bt->builtin_int8, 8));
794ac428 2385
876cecd0 2386 TYPE_VECTOR (t) = 1;
794ac428
UW
2387 TYPE_NAME (t) = "ppc_builtin_type_vec64";
2388 tdep->ppc_builtin_type_vec64 = t;
2389 }
2390
2391 return tdep->ppc_builtin_type_vec64;
2392}
2393
604c2f83
LM
2394/* Vector 128 type. */
2395
2396static struct type *
2397rs6000_builtin_type_vec128 (struct gdbarch *gdbarch)
2398{
2399 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2400
2401 if (!tdep->ppc_builtin_type_vec128)
2402 {
df4df182
UW
2403 const struct builtin_type *bt = builtin_type (gdbarch);
2404
604c2f83
LM
2405 /* The type we're building is this
2406
2407 type = union __ppc_builtin_type_vec128 {
2408 uint128_t uint128;
db9f5df8 2409 double v2_double[2];
604c2f83
LM
2410 float v4_float[4];
2411 int32_t v4_int32[4];
2412 int16_t v8_int16[8];
2413 int8_t v16_int8[16];
2414 }
2415 */
2416
2417 struct type *t;
2418
e9bb382b
UW
2419 t = arch_composite_type (gdbarch,
2420 "__ppc_builtin_type_vec128", TYPE_CODE_UNION);
df4df182 2421 append_composite_type_field (t, "uint128", bt->builtin_uint128);
db9f5df8
UW
2422 append_composite_type_field (t, "v2_double",
2423 init_vector_type (bt->builtin_double, 2));
604c2f83 2424 append_composite_type_field (t, "v4_float",
df4df182 2425 init_vector_type (bt->builtin_float, 4));
604c2f83 2426 append_composite_type_field (t, "v4_int32",
df4df182 2427 init_vector_type (bt->builtin_int32, 4));
604c2f83 2428 append_composite_type_field (t, "v8_int16",
df4df182 2429 init_vector_type (bt->builtin_int16, 8));
604c2f83 2430 append_composite_type_field (t, "v16_int8",
df4df182 2431 init_vector_type (bt->builtin_int8, 16));
604c2f83 2432
803e1097 2433 TYPE_VECTOR (t) = 1;
604c2f83
LM
2434 TYPE_NAME (t) = "ppc_builtin_type_vec128";
2435 tdep->ppc_builtin_type_vec128 = t;
2436 }
2437
2438 return tdep->ppc_builtin_type_vec128;
2439}
2440
7cc46491
DJ
2441/* Return the name of register number REGNO, or the empty string if it
2442 is an anonymous register. */
7a78ae4e 2443
fa88f677 2444static const char *
d93859e2 2445rs6000_register_name (struct gdbarch *gdbarch, int regno)
7a78ae4e 2446{
d93859e2 2447 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7a78ae4e 2448
7cc46491
DJ
2449 /* The upper half "registers" have names in the XML description,
2450 but we present only the low GPRs and the full 64-bit registers
2451 to the user. */
2452 if (tdep->ppc_ev0_upper_regnum >= 0
2453 && tdep->ppc_ev0_upper_regnum <= regno
2454 && regno < tdep->ppc_ev0_upper_regnum + ppc_num_gprs)
2455 return "";
2456
604c2f83
LM
2457 /* Hide the upper halves of the vs0~vs31 registers. */
2458 if (tdep->ppc_vsr0_regnum >= 0
2459 && tdep->ppc_vsr0_upper_regnum <= regno
2460 && regno < tdep->ppc_vsr0_upper_regnum + ppc_num_gprs)
2461 return "";
2462
7cc46491 2463 /* Check if the SPE pseudo registers are available. */
5a9e69ba 2464 if (IS_SPE_PSEUDOREG (tdep, regno))
7cc46491
DJ
2465 {
2466 static const char *const spe_regnames[] = {
2467 "ev0", "ev1", "ev2", "ev3", "ev4", "ev5", "ev6", "ev7",
2468 "ev8", "ev9", "ev10", "ev11", "ev12", "ev13", "ev14", "ev15",
2469 "ev16", "ev17", "ev18", "ev19", "ev20", "ev21", "ev22", "ev23",
2470 "ev24", "ev25", "ev26", "ev27", "ev28", "ev29", "ev30", "ev31",
2471 };
2472 return spe_regnames[regno - tdep->ppc_ev0_regnum];
2473 }
2474
f949c649
TJB
2475 /* Check if the decimal128 pseudo-registers are available. */
2476 if (IS_DFP_PSEUDOREG (tdep, regno))
2477 {
2478 static const char *const dfp128_regnames[] = {
2479 "dl0", "dl1", "dl2", "dl3",
2480 "dl4", "dl5", "dl6", "dl7",
2481 "dl8", "dl9", "dl10", "dl11",
2482 "dl12", "dl13", "dl14", "dl15"
2483 };
2484 return dfp128_regnames[regno - tdep->ppc_dl0_regnum];
2485 }
2486
604c2f83
LM
2487 /* Check if this is a VSX pseudo-register. */
2488 if (IS_VSX_PSEUDOREG (tdep, regno))
2489 {
2490 static const char *const vsx_regnames[] = {
2491 "vs0", "vs1", "vs2", "vs3", "vs4", "vs5", "vs6", "vs7",
2492 "vs8", "vs9", "vs10", "vs11", "vs12", "vs13", "vs14",
2493 "vs15", "vs16", "vs17", "vs18", "vs19", "vs20", "vs21",
2494 "vs22", "vs23", "vs24", "vs25", "vs26", "vs27", "vs28",
2495 "vs29", "vs30", "vs31", "vs32", "vs33", "vs34", "vs35",
2496 "vs36", "vs37", "vs38", "vs39", "vs40", "vs41", "vs42",
2497 "vs43", "vs44", "vs45", "vs46", "vs47", "vs48", "vs49",
2498 "vs50", "vs51", "vs52", "vs53", "vs54", "vs55", "vs56",
2499 "vs57", "vs58", "vs59", "vs60", "vs61", "vs62", "vs63"
2500 };
2501 return vsx_regnames[regno - tdep->ppc_vsr0_regnum];
2502 }
2503
2504 /* Check if the this is a Extended FP pseudo-register. */
2505 if (IS_EFP_PSEUDOREG (tdep, regno))
2506 {
2507 static const char *const efpr_regnames[] = {
2508 "f32", "f33", "f34", "f35", "f36", "f37", "f38",
2509 "f39", "f40", "f41", "f42", "f43", "f44", "f45",
2510 "f46", "f47", "f48", "f49", "f50", "f51",
2511 "f52", "f53", "f54", "f55", "f56", "f57",
2512 "f58", "f59", "f60", "f61", "f62", "f63"
2513 };
2514 return efpr_regnames[regno - tdep->ppc_efpr0_regnum];
2515 }
2516
d93859e2 2517 return tdesc_register_name (gdbarch, regno);
7a78ae4e
ND
2518}
2519
7cc46491
DJ
2520/* Return the GDB type object for the "standard" data type of data in
2521 register N. */
7a78ae4e
ND
2522
2523static struct type *
7cc46491 2524rs6000_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
7a78ae4e 2525{
691d145a 2526 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7a78ae4e 2527
7cc46491 2528 /* These are the only pseudo-registers we support. */
f949c649 2529 gdb_assert (IS_SPE_PSEUDOREG (tdep, regnum)
604c2f83
LM
2530 || IS_DFP_PSEUDOREG (tdep, regnum)
2531 || IS_VSX_PSEUDOREG (tdep, regnum)
2532 || IS_EFP_PSEUDOREG (tdep, regnum));
7cc46491 2533
f949c649
TJB
2534 /* These are the e500 pseudo-registers. */
2535 if (IS_SPE_PSEUDOREG (tdep, regnum))
2536 return rs6000_builtin_type_vec64 (gdbarch);
604c2f83
LM
2537 else if (IS_DFP_PSEUDOREG (tdep, regnum))
2538 /* PPC decimal128 pseudo-registers. */
f949c649 2539 return builtin_type (gdbarch)->builtin_declong;
604c2f83
LM
2540 else if (IS_VSX_PSEUDOREG (tdep, regnum))
2541 /* POWER7 VSX pseudo-registers. */
2542 return rs6000_builtin_type_vec128 (gdbarch);
2543 else
2544 /* POWER7 Extended FP pseudo-registers. */
2545 return builtin_type (gdbarch)->builtin_double;
7a78ae4e
ND
2546}
2547
c44ca51c
AC
2548/* Is REGNUM a member of REGGROUP? */
2549static int
7cc46491
DJ
2550rs6000_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
2551 struct reggroup *group)
c44ca51c
AC
2552{
2553 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
c44ca51c 2554
7cc46491 2555 /* These are the only pseudo-registers we support. */
f949c649 2556 gdb_assert (IS_SPE_PSEUDOREG (tdep, regnum)
604c2f83
LM
2557 || IS_DFP_PSEUDOREG (tdep, regnum)
2558 || IS_VSX_PSEUDOREG (tdep, regnum)
2559 || IS_EFP_PSEUDOREG (tdep, regnum));
c44ca51c 2560
604c2f83
LM
2561 /* These are the e500 pseudo-registers or the POWER7 VSX registers. */
2562 if (IS_SPE_PSEUDOREG (tdep, regnum) || IS_VSX_PSEUDOREG (tdep, regnum))
f949c649 2563 return group == all_reggroup || group == vector_reggroup;
7cc46491 2564 else
604c2f83 2565 /* PPC decimal128 or Extended FP pseudo-registers. */
f949c649 2566 return group == all_reggroup || group == float_reggroup;
c44ca51c
AC
2567}
2568
691d145a 2569/* The register format for RS/6000 floating point registers is always
64366f1c 2570 double, we need a conversion if the memory format is float. */
7a78ae4e
ND
2571
2572static int
0abe36f5
MD
2573rs6000_convert_register_p (struct gdbarch *gdbarch, int regnum,
2574 struct type *type)
7a78ae4e 2575{
0abe36f5 2576 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7cc46491
DJ
2577
2578 return (tdep->ppc_fp0_regnum >= 0
2579 && regnum >= tdep->ppc_fp0_regnum
2580 && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs
2581 && TYPE_CODE (type) == TYPE_CODE_FLT
0dfff4cb
UW
2582 && TYPE_LENGTH (type)
2583 != TYPE_LENGTH (builtin_type (gdbarch)->builtin_double));
7a78ae4e
ND
2584}
2585
8dccd430 2586static int
691d145a
JB
2587rs6000_register_to_value (struct frame_info *frame,
2588 int regnum,
2589 struct type *type,
8dccd430
PA
2590 gdb_byte *to,
2591 int *optimizedp, int *unavailablep)
7a78ae4e 2592{
0dfff4cb 2593 struct gdbarch *gdbarch = get_frame_arch (frame);
50fd1280 2594 gdb_byte from[MAX_REGISTER_SIZE];
691d145a 2595
691d145a 2596 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
7a78ae4e 2597
8dccd430
PA
2598 if (!get_frame_register_bytes (frame, regnum, 0,
2599 register_size (gdbarch, regnum),
2600 from, optimizedp, unavailablep))
2601 return 0;
2602
0dfff4cb
UW
2603 convert_typed_floating (from, builtin_type (gdbarch)->builtin_double,
2604 to, type);
8dccd430
PA
2605 *optimizedp = *unavailablep = 0;
2606 return 1;
691d145a 2607}
7a292a7a 2608
7a78ae4e 2609static void
691d145a
JB
2610rs6000_value_to_register (struct frame_info *frame,
2611 int regnum,
2612 struct type *type,
50fd1280 2613 const gdb_byte *from)
7a78ae4e 2614{
0dfff4cb 2615 struct gdbarch *gdbarch = get_frame_arch (frame);
50fd1280 2616 gdb_byte to[MAX_REGISTER_SIZE];
691d145a 2617
691d145a
JB
2618 gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
2619
0dfff4cb
UW
2620 convert_typed_floating (from, type,
2621 to, builtin_type (gdbarch)->builtin_double);
691d145a 2622 put_frame_register (frame, regnum, to);
7a78ae4e 2623}
c906108c 2624
05d1431c
PA
2625 /* The type of a function that moves the value of REG between CACHE
2626 or BUF --- in either direction. */
2627typedef enum register_status (*move_ev_register_func) (struct regcache *,
2628 int, void *);
2629
6ced10dd
JB
2630/* Move SPE vector register values between a 64-bit buffer and the two
2631 32-bit raw register halves in a regcache. This function handles
2632 both splitting a 64-bit value into two 32-bit halves, and joining
2633 two halves into a whole 64-bit value, depending on the function
2634 passed as the MOVE argument.
2635
2636 EV_REG must be the number of an SPE evN vector register --- a
2637 pseudoregister. REGCACHE must be a regcache, and BUFFER must be a
2638 64-bit buffer.
2639
2640 Call MOVE once for each 32-bit half of that register, passing
2641 REGCACHE, the number of the raw register corresponding to that
2642 half, and the address of the appropriate half of BUFFER.
2643
2644 For example, passing 'regcache_raw_read' as the MOVE function will
2645 fill BUFFER with the full 64-bit contents of EV_REG. Or, passing
2646 'regcache_raw_supply' will supply the contents of BUFFER to the
2647 appropriate pair of raw registers in REGCACHE.
2648
2649 You may need to cast away some 'const' qualifiers when passing
2650 MOVE, since this function can't tell at compile-time which of
2651 REGCACHE or BUFFER is acting as the source of the data. If C had
2652 co-variant type qualifiers, ... */
05d1431c
PA
2653
2654static enum register_status
2655e500_move_ev_register (move_ev_register_func move,
2656 struct regcache *regcache, int ev_reg, void *buffer)
6ced10dd
JB
2657{
2658 struct gdbarch *arch = get_regcache_arch (regcache);
2659 struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
2660 int reg_index;
19ba03f4 2661 gdb_byte *byte_buffer = (gdb_byte *) buffer;
05d1431c 2662 enum register_status status;
6ced10dd 2663
5a9e69ba 2664 gdb_assert (IS_SPE_PSEUDOREG (tdep, ev_reg));
6ced10dd
JB
2665
2666 reg_index = ev_reg - tdep->ppc_ev0_regnum;
2667
8b164abb 2668 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG)
6ced10dd 2669 {
05d1431c
PA
2670 status = move (regcache, tdep->ppc_ev0_upper_regnum + reg_index,
2671 byte_buffer);
2672 if (status == REG_VALID)
2673 status = move (regcache, tdep->ppc_gp0_regnum + reg_index,
2674 byte_buffer + 4);
6ced10dd
JB
2675 }
2676 else
2677 {
05d1431c
PA
2678 status = move (regcache, tdep->ppc_gp0_regnum + reg_index, byte_buffer);
2679 if (status == REG_VALID)
2680 status = move (regcache, tdep->ppc_ev0_upper_regnum + reg_index,
2681 byte_buffer + 4);
6ced10dd 2682 }
05d1431c
PA
2683
2684 return status;
6ced10dd
JB
2685}
2686
05d1431c
PA
2687static enum register_status
2688do_regcache_raw_read (struct regcache *regcache, int regnum, void *buffer)
2689{
19ba03f4 2690 return regcache_raw_read (regcache, regnum, (gdb_byte *) buffer);
05d1431c
PA
2691}
2692
2693static enum register_status
2694do_regcache_raw_write (struct regcache *regcache, int regnum, void *buffer)
2695{
19ba03f4 2696 regcache_raw_write (regcache, regnum, (const gdb_byte *) buffer);
05d1431c
PA
2697
2698 return REG_VALID;
2699}
2700
2701static enum register_status
c8001721 2702e500_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
50fd1280 2703 int reg_nr, gdb_byte *buffer)
f949c649 2704{
05d1431c 2705 return e500_move_ev_register (do_regcache_raw_read, regcache, reg_nr, buffer);
f949c649
TJB
2706}
2707
2708static void
2709e500_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
2710 int reg_nr, const gdb_byte *buffer)
2711{
05d1431c
PA
2712 e500_move_ev_register (do_regcache_raw_write, regcache,
2713 reg_nr, (void *) buffer);
f949c649
TJB
2714}
2715
604c2f83 2716/* Read method for DFP pseudo-registers. */
05d1431c 2717static enum register_status
604c2f83 2718dfp_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
f949c649
TJB
2719 int reg_nr, gdb_byte *buffer)
2720{
2721 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2722 int reg_index = reg_nr - tdep->ppc_dl0_regnum;
05d1431c 2723 enum register_status status;
f949c649
TJB
2724
2725 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
2726 {
2727 /* Read two FP registers to form a whole dl register. */
05d1431c
PA
2728 status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
2729 2 * reg_index, buffer);
2730 if (status == REG_VALID)
2731 status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
2732 2 * reg_index + 1, buffer + 8);
f949c649
TJB
2733 }
2734 else
2735 {
05d1431c 2736 status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
0ff3e01f 2737 2 * reg_index + 1, buffer);
05d1431c
PA
2738 if (status == REG_VALID)
2739 status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
0ff3e01f 2740 2 * reg_index, buffer + 8);
f949c649 2741 }
05d1431c
PA
2742
2743 return status;
f949c649
TJB
2744}
2745
604c2f83 2746/* Write method for DFP pseudo-registers. */
f949c649 2747static void
604c2f83 2748dfp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
f949c649
TJB
2749 int reg_nr, const gdb_byte *buffer)
2750{
2751 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2752 int reg_index = reg_nr - tdep->ppc_dl0_regnum;
2753
2754 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
2755 {
2756 /* Write each half of the dl register into a separate
2757 FP register. */
2758 regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
2759 2 * reg_index, buffer);
2760 regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
2761 2 * reg_index + 1, buffer + 8);
2762 }
2763 else
2764 {
2765 regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
0ff3e01f 2766 2 * reg_index + 1, buffer);
f949c649 2767 regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
0ff3e01f 2768 2 * reg_index, buffer + 8);
f949c649
TJB
2769 }
2770}
2771
604c2f83 2772/* Read method for POWER7 VSX pseudo-registers. */
05d1431c 2773static enum register_status
604c2f83
LM
2774vsx_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
2775 int reg_nr, gdb_byte *buffer)
2776{
2777 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2778 int reg_index = reg_nr - tdep->ppc_vsr0_regnum;
05d1431c 2779 enum register_status status;
604c2f83
LM
2780
2781 /* Read the portion that overlaps the VMX registers. */
2782 if (reg_index > 31)
05d1431c
PA
2783 status = regcache_raw_read (regcache, tdep->ppc_vr0_regnum +
2784 reg_index - 32, buffer);
604c2f83
LM
2785 else
2786 /* Read the portion that overlaps the FPR registers. */
2787 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
2788 {
05d1431c
PA
2789 status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
2790 reg_index, buffer);
2791 if (status == REG_VALID)
2792 status = regcache_raw_read (regcache, tdep->ppc_vsr0_upper_regnum +
2793 reg_index, buffer + 8);
604c2f83
LM
2794 }
2795 else
2796 {
05d1431c
PA
2797 status = regcache_raw_read (regcache, tdep->ppc_fp0_regnum +
2798 reg_index, buffer + 8);
2799 if (status == REG_VALID)
2800 status = regcache_raw_read (regcache, tdep->ppc_vsr0_upper_regnum +
2801 reg_index, buffer);
604c2f83 2802 }
05d1431c
PA
2803
2804 return status;
604c2f83
LM
2805}
2806
2807/* Write method for POWER7 VSX pseudo-registers. */
2808static void
2809vsx_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
2810 int reg_nr, const gdb_byte *buffer)
2811{
2812 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2813 int reg_index = reg_nr - tdep->ppc_vsr0_regnum;
2814
2815 /* Write the portion that overlaps the VMX registers. */
2816 if (reg_index > 31)
2817 regcache_raw_write (regcache, tdep->ppc_vr0_regnum +
2818 reg_index - 32, buffer);
2819 else
2820 /* Write the portion that overlaps the FPR registers. */
2821 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
2822 {
2823 regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
2824 reg_index, buffer);
2825 regcache_raw_write (regcache, tdep->ppc_vsr0_upper_regnum +
2826 reg_index, buffer + 8);
2827 }
2828 else
2829 {
2830 regcache_raw_write (regcache, tdep->ppc_fp0_regnum +
2831 reg_index, buffer + 8);
2832 regcache_raw_write (regcache, tdep->ppc_vsr0_upper_regnum +
2833 reg_index, buffer);
2834 }
2835}
2836
2837/* Read method for POWER7 Extended FP pseudo-registers. */
05d1431c 2838static enum register_status
604c2f83
LM
2839efpr_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
2840 int reg_nr, gdb_byte *buffer)
2841{
2842 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2843 int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
084ee545 2844 int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
604c2f83 2845
d9492458 2846 /* Read the portion that overlaps the VMX register. */
084ee545
UW
2847 return regcache_raw_read_part (regcache, tdep->ppc_vr0_regnum + reg_index,
2848 offset, register_size (gdbarch, reg_nr),
2849 buffer);
604c2f83
LM
2850}
2851
2852/* Write method for POWER7 Extended FP pseudo-registers. */
2853static void
2854efpr_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
2855 int reg_nr, const gdb_byte *buffer)
2856{
2857 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2858 int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
084ee545 2859 int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
604c2f83 2860
d9492458 2861 /* Write the portion that overlaps the VMX register. */
084ee545
UW
2862 regcache_raw_write_part (regcache, tdep->ppc_vr0_regnum + reg_index,
2863 offset, register_size (gdbarch, reg_nr),
2864 buffer);
604c2f83
LM
2865}
2866
05d1431c 2867static enum register_status
0df8b418
MS
2868rs6000_pseudo_register_read (struct gdbarch *gdbarch,
2869 struct regcache *regcache,
f949c649 2870 int reg_nr, gdb_byte *buffer)
c8001721 2871{
6ced10dd 2872 struct gdbarch *regcache_arch = get_regcache_arch (regcache);
c8001721
EZ
2873 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2874
6ced10dd 2875 gdb_assert (regcache_arch == gdbarch);
f949c649 2876
5a9e69ba 2877 if (IS_SPE_PSEUDOREG (tdep, reg_nr))
05d1431c 2878 return e500_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
f949c649 2879 else if (IS_DFP_PSEUDOREG (tdep, reg_nr))
05d1431c 2880 return dfp_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
604c2f83 2881 else if (IS_VSX_PSEUDOREG (tdep, reg_nr))
05d1431c 2882 return vsx_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
604c2f83 2883 else if (IS_EFP_PSEUDOREG (tdep, reg_nr))
05d1431c 2884 return efpr_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
6ced10dd 2885 else
a44bddec 2886 internal_error (__FILE__, __LINE__,
f949c649
TJB
2887 _("rs6000_pseudo_register_read: "
2888 "called on unexpected register '%s' (%d)"),
2889 gdbarch_register_name (gdbarch, reg_nr), reg_nr);
c8001721
EZ
2890}
2891
2892static void
f949c649
TJB
2893rs6000_pseudo_register_write (struct gdbarch *gdbarch,
2894 struct regcache *regcache,
2895 int reg_nr, const gdb_byte *buffer)
c8001721 2896{
6ced10dd 2897 struct gdbarch *regcache_arch = get_regcache_arch (regcache);
c8001721
EZ
2898 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2899
6ced10dd 2900 gdb_assert (regcache_arch == gdbarch);
f949c649 2901
5a9e69ba 2902 if (IS_SPE_PSEUDOREG (tdep, reg_nr))
f949c649
TJB
2903 e500_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
2904 else if (IS_DFP_PSEUDOREG (tdep, reg_nr))
604c2f83
LM
2905 dfp_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
2906 else if (IS_VSX_PSEUDOREG (tdep, reg_nr))
2907 vsx_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
2908 else if (IS_EFP_PSEUDOREG (tdep, reg_nr))
2909 efpr_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
6ced10dd 2910 else
a44bddec 2911 internal_error (__FILE__, __LINE__,
f949c649
TJB
2912 _("rs6000_pseudo_register_write: "
2913 "called on unexpected register '%s' (%d)"),
2914 gdbarch_register_name (gdbarch, reg_nr), reg_nr);
6ced10dd
JB
2915}
2916
2a2fa07b
MK
2917static int
2918rs6000_ax_pseudo_register_collect (struct gdbarch *gdbarch,
2919 struct agent_expr *ax, int reg_nr)
2920{
2921 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2922 if (IS_SPE_PSEUDOREG (tdep, reg_nr))
2923 {
2924 int reg_index = reg_nr - tdep->ppc_ev0_regnum;
2925 ax_reg_mask (ax, tdep->ppc_gp0_regnum + reg_index);
2926 ax_reg_mask (ax, tdep->ppc_ev0_upper_regnum + reg_index);
2927 }
2928 else if (IS_DFP_PSEUDOREG (tdep, reg_nr))
2929 {
2930 int reg_index = reg_nr - tdep->ppc_dl0_regnum;
2931 ax_reg_mask (ax, tdep->ppc_fp0_regnum + 2 * reg_index);
2932 ax_reg_mask (ax, tdep->ppc_fp0_regnum + 2 * reg_index + 1);
2933 }
2934 else if (IS_VSX_PSEUDOREG (tdep, reg_nr))
2935 {
2936 int reg_index = reg_nr - tdep->ppc_vsr0_regnum;
2937 if (reg_index > 31)
2938 {
2939 ax_reg_mask (ax, tdep->ppc_vr0_regnum + reg_index - 32);
2940 }
2941 else
2942 {
2943 ax_reg_mask (ax, tdep->ppc_fp0_regnum + reg_index);
2944 ax_reg_mask (ax, tdep->ppc_vsr0_upper_regnum + reg_index);
2945 }
2946 }
2947 else if (IS_EFP_PSEUDOREG (tdep, reg_nr))
2948 {
2949 int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
2950 ax_reg_mask (ax, tdep->ppc_vr0_regnum + reg_index);
2951 }
2952 else
2953 internal_error (__FILE__, __LINE__,
2954 _("rs6000_pseudo_register_collect: "
2955 "called on unexpected register '%s' (%d)"),
2956 gdbarch_register_name (gdbarch, reg_nr), reg_nr);
2957 return 0;
2958}
2959
2960
a67914de
MK
2961static void
2962rs6000_gen_return_address (struct gdbarch *gdbarch,
2963 struct agent_expr *ax, struct axs_value *value,
2964 CORE_ADDR scope)
2965{
2966 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2967 value->type = register_type (gdbarch, tdep->ppc_lr_regnum);
2968 value->kind = axs_lvalue_register;
2969 value->u.reg = tdep->ppc_lr_regnum;
2970}
2971
2972
18ed0c4e 2973/* Convert a DBX STABS register number to a GDB register number. */
c8001721 2974static int
d3f73121 2975rs6000_stab_reg_to_regnum (struct gdbarch *gdbarch, int num)
c8001721 2976{
d3f73121 2977 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
c8001721 2978
9f744501
JB
2979 if (0 <= num && num <= 31)
2980 return tdep->ppc_gp0_regnum + num;
2981 else if (32 <= num && num <= 63)
383f0f5b
JB
2982 /* FIXME: jimb/2004-05-05: What should we do when the debug info
2983 specifies registers the architecture doesn't have? Our
2984 callers don't check the value we return. */
366f009f 2985 return tdep->ppc_fp0_regnum + (num - 32);
18ed0c4e
JB
2986 else if (77 <= num && num <= 108)
2987 return tdep->ppc_vr0_regnum + (num - 77);
9f744501 2988 else if (1200 <= num && num < 1200 + 32)
e1ec1b42 2989 return tdep->ppc_ev0_upper_regnum + (num - 1200);
9f744501
JB
2990 else
2991 switch (num)
2992 {
2993 case 64:
2994 return tdep->ppc_mq_regnum;
2995 case 65:
2996 return tdep->ppc_lr_regnum;
2997 case 66:
2998 return tdep->ppc_ctr_regnum;
2999 case 76:
3000 return tdep->ppc_xer_regnum;
3001 case 109:
3002 return tdep->ppc_vrsave_regnum;
18ed0c4e
JB
3003 case 110:
3004 return tdep->ppc_vrsave_regnum - 1; /* vscr */
867e2dc5 3005 case 111:
18ed0c4e 3006 return tdep->ppc_acc_regnum;
867e2dc5 3007 case 112:
18ed0c4e 3008 return tdep->ppc_spefscr_regnum;
9f744501
JB
3009 default:
3010 return num;
3011 }
18ed0c4e 3012}
9f744501 3013
9f744501 3014
18ed0c4e
JB
3015/* Convert a Dwarf 2 register number to a GDB register number. */
3016static int
d3f73121 3017rs6000_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
18ed0c4e 3018{
d3f73121 3019 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9f744501 3020
18ed0c4e
JB
3021 if (0 <= num && num <= 31)
3022 return tdep->ppc_gp0_regnum + num;
3023 else if (32 <= num && num <= 63)
3024 /* FIXME: jimb/2004-05-05: What should we do when the debug info
3025 specifies registers the architecture doesn't have? Our
3026 callers don't check the value we return. */
3027 return tdep->ppc_fp0_regnum + (num - 32);
3028 else if (1124 <= num && num < 1124 + 32)
3029 return tdep->ppc_vr0_regnum + (num - 1124);
3030 else if (1200 <= num && num < 1200 + 32)
e1ec1b42 3031 return tdep->ppc_ev0_upper_regnum + (num - 1200);
18ed0c4e
JB
3032 else
3033 switch (num)
3034 {
a489f789
AS
3035 case 64:
3036 return tdep->ppc_cr_regnum;
18ed0c4e
JB
3037 case 67:
3038 return tdep->ppc_vrsave_regnum - 1; /* vscr */
3039 case 99:
3040 return tdep->ppc_acc_regnum;
3041 case 100:
3042 return tdep->ppc_mq_regnum;
3043 case 101:
3044 return tdep->ppc_xer_regnum;
3045 case 108:
3046 return tdep->ppc_lr_regnum;
3047 case 109:
3048 return tdep->ppc_ctr_regnum;
3049 case 356:
3050 return tdep->ppc_vrsave_regnum;
3051 case 612:
3052 return tdep->ppc_spefscr_regnum;
3053 default:
3054 return num;
3055 }
2188cbdd
EZ
3056}
3057
4fc771b8
DJ
3058/* Translate a .eh_frame register to DWARF register, or adjust a
3059 .debug_frame register. */
3060
3061static int
3062rs6000_adjust_frame_regnum (struct gdbarch *gdbarch, int num, int eh_frame_p)
3063{
3064 /* GCC releases before 3.4 use GCC internal register numbering in
3065 .debug_frame (and .debug_info, et cetera). The numbering is
3066 different from the standard SysV numbering for everything except
3067 for GPRs and FPRs. We can not detect this problem in most cases
3068 - to get accurate debug info for variables living in lr, ctr, v0,
3069 et cetera, use a newer version of GCC. But we must detect
3070 one important case - lr is in column 65 in .debug_frame output,
3071 instead of 108.
3072
3073 GCC 3.4, and the "hammer" branch, have a related problem. They
3074 record lr register saves in .debug_frame as 108, but still record
3075 the return column as 65. We fix that up too.
3076
3077 We can do this because 65 is assigned to fpsr, and GCC never
3078 generates debug info referring to it. To add support for
3079 handwritten debug info that restores fpsr, we would need to add a
3080 producer version check to this. */
3081 if (!eh_frame_p)
3082 {
3083 if (num == 65)
3084 return 108;
3085 else
3086 return num;
3087 }
3088
3089 /* .eh_frame is GCC specific. For binary compatibility, it uses GCC
3090 internal register numbering; translate that to the standard DWARF2
3091 register numbering. */
3092 if (0 <= num && num <= 63) /* r0-r31,fp0-fp31 */
3093 return num;
3094 else if (68 <= num && num <= 75) /* cr0-cr8 */
3095 return num - 68 + 86;
3096 else if (77 <= num && num <= 108) /* vr0-vr31 */
3097 return num - 77 + 1124;
3098 else
3099 switch (num)
3100 {
3101 case 64: /* mq */
3102 return 100;
3103 case 65: /* lr */
3104 return 108;
3105 case 66: /* ctr */
3106 return 109;
3107 case 76: /* xer */
3108 return 101;
3109 case 109: /* vrsave */
3110 return 356;
3111 case 110: /* vscr */
3112 return 67;
3113 case 111: /* spe_acc */
3114 return 99;
3115 case 112: /* spefscr */
3116 return 612;
3117 default:
3118 return num;
3119 }
3120}
c906108c 3121\f
c5aa993b 3122
7a78ae4e 3123/* Handling the various POWER/PowerPC variants. */
c906108c 3124
c906108c 3125/* Information about a particular processor variant. */
7a78ae4e 3126
c906108c 3127struct variant
c5aa993b
JM
3128 {
3129 /* Name of this variant. */
3130 char *name;
c906108c 3131
c5aa993b
JM
3132 /* English description of the variant. */
3133 char *description;
c906108c 3134
64366f1c 3135 /* bfd_arch_info.arch corresponding to variant. */
7a78ae4e
ND
3136 enum bfd_architecture arch;
3137
64366f1c 3138 /* bfd_arch_info.mach corresponding to variant. */
7a78ae4e
ND
3139 unsigned long mach;
3140
7cc46491
DJ
3141 /* Target description for this variant. */
3142 struct target_desc **tdesc;
c5aa993b 3143 };
c906108c 3144
489461e2 3145static struct variant variants[] =
c906108c 3146{
7a78ae4e 3147 {"powerpc", "PowerPC user-level", bfd_arch_powerpc,
7284e1be 3148 bfd_mach_ppc, &tdesc_powerpc_altivec32},
7a78ae4e 3149 {"power", "POWER user-level", bfd_arch_rs6000,
7cc46491 3150 bfd_mach_rs6k, &tdesc_rs6000},
7a78ae4e 3151 {"403", "IBM PowerPC 403", bfd_arch_powerpc,
7cc46491 3152 bfd_mach_ppc_403, &tdesc_powerpc_403},
4d09ffea
MS
3153 {"405", "IBM PowerPC 405", bfd_arch_powerpc,
3154 bfd_mach_ppc_405, &tdesc_powerpc_405},
7a78ae4e 3155 {"601", "Motorola PowerPC 601", bfd_arch_powerpc,
7cc46491 3156 bfd_mach_ppc_601, &tdesc_powerpc_601},
7a78ae4e 3157 {"602", "Motorola PowerPC 602", bfd_arch_powerpc,
7cc46491 3158 bfd_mach_ppc_602, &tdesc_powerpc_602},
7a78ae4e 3159 {"603", "Motorola/IBM PowerPC 603 or 603e", bfd_arch_powerpc,
7cc46491 3160 bfd_mach_ppc_603, &tdesc_powerpc_603},
7a78ae4e 3161 {"604", "Motorola PowerPC 604 or 604e", bfd_arch_powerpc,
7cc46491 3162 604, &tdesc_powerpc_604},
7a78ae4e 3163 {"403GC", "IBM PowerPC 403GC", bfd_arch_powerpc,
7cc46491 3164 bfd_mach_ppc_403gc, &tdesc_powerpc_403gc},
7a78ae4e 3165 {"505", "Motorola PowerPC 505", bfd_arch_powerpc,
7cc46491 3166 bfd_mach_ppc_505, &tdesc_powerpc_505},
7a78ae4e 3167 {"860", "Motorola PowerPC 860 or 850", bfd_arch_powerpc,
7cc46491 3168 bfd_mach_ppc_860, &tdesc_powerpc_860},
7a78ae4e 3169 {"750", "Motorola/IBM PowerPC 750 or 740", bfd_arch_powerpc,
7cc46491 3170 bfd_mach_ppc_750, &tdesc_powerpc_750},
1fcc0bb8 3171 {"7400", "Motorola/IBM PowerPC 7400 (G4)", bfd_arch_powerpc,
7cc46491 3172 bfd_mach_ppc_7400, &tdesc_powerpc_7400},
c8001721 3173 {"e500", "Motorola PowerPC e500", bfd_arch_powerpc,
7cc46491 3174 bfd_mach_ppc_e500, &tdesc_powerpc_e500},
7a78ae4e 3175
5d57ee30
KB
3176 /* 64-bit */
3177 {"powerpc64", "PowerPC 64-bit user-level", bfd_arch_powerpc,
7284e1be 3178 bfd_mach_ppc64, &tdesc_powerpc_altivec64},
7a78ae4e 3179 {"620", "Motorola PowerPC 620", bfd_arch_powerpc,
7cc46491 3180 bfd_mach_ppc_620, &tdesc_powerpc_64},
5d57ee30 3181 {"630", "Motorola PowerPC 630", bfd_arch_powerpc,
7cc46491 3182 bfd_mach_ppc_630, &tdesc_powerpc_64},
7a78ae4e 3183 {"a35", "PowerPC A35", bfd_arch_powerpc,
7cc46491 3184 bfd_mach_ppc_a35, &tdesc_powerpc_64},
5d57ee30 3185 {"rs64ii", "PowerPC rs64ii", bfd_arch_powerpc,
7cc46491 3186 bfd_mach_ppc_rs64ii, &tdesc_powerpc_64},
5d57ee30 3187 {"rs64iii", "PowerPC rs64iii", bfd_arch_powerpc,
7cc46491 3188 bfd_mach_ppc_rs64iii, &tdesc_powerpc_64},
5d57ee30 3189
64366f1c 3190 /* FIXME: I haven't checked the register sets of the following. */
7a78ae4e 3191 {"rs1", "IBM POWER RS1", bfd_arch_rs6000,
7cc46491 3192 bfd_mach_rs6k_rs1, &tdesc_rs6000},
7a78ae4e 3193 {"rsc", "IBM POWER RSC", bfd_arch_rs6000,
7cc46491 3194 bfd_mach_rs6k_rsc, &tdesc_rs6000},
7a78ae4e 3195 {"rs2", "IBM POWER RS2", bfd_arch_rs6000,
7cc46491 3196 bfd_mach_rs6k_rs2, &tdesc_rs6000},
7a78ae4e 3197
3e45d68b 3198 {0, 0, (enum bfd_architecture) 0, 0, 0}
c906108c
SS
3199};
3200
7a78ae4e 3201/* Return the variant corresponding to architecture ARCH and machine number
64366f1c 3202 MACH. If no such variant exists, return null. */
c906108c 3203
7a78ae4e
ND
3204static const struct variant *
3205find_variant_by_arch (enum bfd_architecture arch, unsigned long mach)
c906108c 3206{
7a78ae4e 3207 const struct variant *v;
c5aa993b 3208
7a78ae4e
ND
3209 for (v = variants; v->name; v++)
3210 if (arch == v->arch && mach == v->mach)
3211 return v;
c906108c 3212
7a78ae4e 3213 return NULL;
c906108c 3214}
9364a0ef
EZ
3215
3216static int
3217gdb_print_insn_powerpc (bfd_vma memaddr, disassemble_info *info)
3218{
40887e1a 3219 if (info->endian == BFD_ENDIAN_BIG)
9364a0ef
EZ
3220 return print_insn_big_powerpc (memaddr, info);
3221 else
3222 return print_insn_little_powerpc (memaddr, info);
3223}
7a78ae4e 3224\f
61a65099
KB
3225static CORE_ADDR
3226rs6000_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
3227{
3e8c568d 3228 return frame_unwind_register_unsigned (next_frame,
8b164abb 3229 gdbarch_pc_regnum (gdbarch));
61a65099
KB
3230}
3231
3232static struct frame_id
1af5d7ce 3233rs6000_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
61a65099 3234{
1af5d7ce
UW
3235 return frame_id_build (get_frame_register_unsigned
3236 (this_frame, gdbarch_sp_regnum (gdbarch)),
3237 get_frame_pc (this_frame));
61a65099
KB
3238}
3239
3240struct rs6000_frame_cache
3241{
3242 CORE_ADDR base;
3243 CORE_ADDR initial_sp;
3244 struct trad_frame_saved_reg *saved_regs;
50ae56ec
WW
3245
3246 /* Set BASE_P to true if this frame cache is properly initialized.
3247 Otherwise set to false because some registers or memory cannot
3248 collected. */
3249 int base_p;
3250 /* Cache PC for building unavailable frame. */
3251 CORE_ADDR pc;
61a65099
KB
3252};
3253
3254static struct rs6000_frame_cache *
1af5d7ce 3255rs6000_frame_cache (struct frame_info *this_frame, void **this_cache)
61a65099
KB
3256{
3257 struct rs6000_frame_cache *cache;
1af5d7ce 3258 struct gdbarch *gdbarch = get_frame_arch (this_frame);
61a65099 3259 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
e17a4113 3260 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
61a65099
KB
3261 struct rs6000_framedata fdata;
3262 int wordsize = tdep->wordsize;
338435ef 3263 CORE_ADDR func = 0, pc = 0;
61a65099
KB
3264
3265 if ((*this_cache) != NULL)
19ba03f4 3266 return (struct rs6000_frame_cache *) (*this_cache);
61a65099
KB
3267 cache = FRAME_OBSTACK_ZALLOC (struct rs6000_frame_cache);
3268 (*this_cache) = cache;
50ae56ec 3269 cache->pc = 0;
1af5d7ce 3270 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
61a65099 3271
50ae56ec
WW
3272 TRY
3273 {
3274 func = get_frame_func (this_frame);
3275 cache->pc = func;
3276 pc = get_frame_pc (this_frame);
3277 skip_prologue (gdbarch, func, pc, &fdata);
3278
3279 /* Figure out the parent's stack pointer. */
3280
3281 /* NOTE: cagney/2002-04-14: The ->frame points to the inner-most
3282 address of the current frame. Things might be easier if the
3283 ->frame pointed to the outer-most address of the frame. In
3284 the mean time, the address of the prev frame is used as the
3285 base address of this frame. */
3286 cache->base = get_frame_register_unsigned
3287 (this_frame, gdbarch_sp_regnum (gdbarch));
3288 }
3289 CATCH (ex, RETURN_MASK_ERROR)
3290 {
3291 if (ex.error != NOT_AVAILABLE_ERROR)
3292 throw_exception (ex);
1ed0c2a4 3293 return (struct rs6000_frame_cache *) (*this_cache);
50ae56ec
WW
3294 }
3295 END_CATCH
e10b1c4c
DJ
3296
3297 /* If the function appears to be frameless, check a couple of likely
3298 indicators that we have simply failed to find the frame setup.
3299 Two common cases of this are missing symbols (i.e.
ef02daa9 3300 get_frame_func returns the wrong address or 0), and assembly
e10b1c4c
DJ
3301 stubs which have a fast exit path but set up a frame on the slow
3302 path.
3303
3304 If the LR appears to return to this function, then presume that
3305 we have an ABI compliant frame that we failed to find. */
3306 if (fdata.frameless && fdata.lr_offset == 0)
61a65099 3307 {
e10b1c4c
DJ
3308 CORE_ADDR saved_lr;
3309 int make_frame = 0;
3310
1af5d7ce 3311 saved_lr = get_frame_register_unsigned (this_frame, tdep->ppc_lr_regnum);
e10b1c4c
DJ
3312 if (func == 0 && saved_lr == pc)
3313 make_frame = 1;
3314 else if (func != 0)
3315 {
3316 CORE_ADDR saved_func = get_pc_function_start (saved_lr);
3317 if (func == saved_func)
3318 make_frame = 1;
3319 }
3320
3321 if (make_frame)
3322 {
3323 fdata.frameless = 0;
de6a76fd 3324 fdata.lr_offset = tdep->lr_frame_offset;
e10b1c4c 3325 }
61a65099 3326 }
e10b1c4c
DJ
3327
3328 if (!fdata.frameless)
9d9bf2df
EBM
3329 {
3330 /* Frameless really means stackless. */
cc2c4da8 3331 ULONGEST backchain;
9d9bf2df 3332
cc2c4da8
MK
3333 if (safe_read_memory_unsigned_integer (cache->base, wordsize,
3334 byte_order, &backchain))
9d9bf2df
EBM
3335 cache->base = (CORE_ADDR) backchain;
3336 }
e10b1c4c 3337
3e8c568d 3338 trad_frame_set_value (cache->saved_regs,
8b164abb 3339 gdbarch_sp_regnum (gdbarch), cache->base);
61a65099
KB
3340
3341 /* if != -1, fdata.saved_fpr is the smallest number of saved_fpr.
3342 All fpr's from saved_fpr to fp31 are saved. */
3343
3344 if (fdata.saved_fpr >= 0)
3345 {
3346 int i;
3347 CORE_ADDR fpr_addr = cache->base + fdata.fpr_offset;
383f0f5b
JB
3348
3349 /* If skip_prologue says floating-point registers were saved,
3350 but the current architecture has no floating-point registers,
3351 then that's strange. But we have no indices to even record
3352 the addresses under, so we just ignore it. */
3353 if (ppc_floating_point_unit_p (gdbarch))
063715bf 3354 for (i = fdata.saved_fpr; i < ppc_num_fprs; i++)
383f0f5b
JB
3355 {
3356 cache->saved_regs[tdep->ppc_fp0_regnum + i].addr = fpr_addr;
3357 fpr_addr += 8;
3358 }
61a65099
KB
3359 }
3360
3361 /* if != -1, fdata.saved_gpr is the smallest number of saved_gpr.
46a9b8ed
DJ
3362 All gpr's from saved_gpr to gpr31 are saved (except during the
3363 prologue). */
61a65099
KB
3364
3365 if (fdata.saved_gpr >= 0)
3366 {
3367 int i;
3368 CORE_ADDR gpr_addr = cache->base + fdata.gpr_offset;
063715bf 3369 for (i = fdata.saved_gpr; i < ppc_num_gprs; i++)
61a65099 3370 {
46a9b8ed
DJ
3371 if (fdata.gpr_mask & (1U << i))
3372 cache->saved_regs[tdep->ppc_gp0_regnum + i].addr = gpr_addr;
61a65099
KB
3373 gpr_addr += wordsize;
3374 }
3375 }
3376
3377 /* if != -1, fdata.saved_vr is the smallest number of saved_vr.
3378 All vr's from saved_vr to vr31 are saved. */
3379 if (tdep->ppc_vr0_regnum != -1 && tdep->ppc_vrsave_regnum != -1)
3380 {
3381 if (fdata.saved_vr >= 0)
3382 {
3383 int i;
3384 CORE_ADDR vr_addr = cache->base + fdata.vr_offset;
3385 for (i = fdata.saved_vr; i < 32; i++)
3386 {
3387 cache->saved_regs[tdep->ppc_vr0_regnum + i].addr = vr_addr;
3388 vr_addr += register_size (gdbarch, tdep->ppc_vr0_regnum);
3389 }
3390 }
3391 }
3392
3393 /* if != -1, fdata.saved_ev is the smallest number of saved_ev.
0df8b418 3394 All vr's from saved_ev to ev31 are saved. ????? */
5a9e69ba 3395 if (tdep->ppc_ev0_regnum != -1)
61a65099
KB
3396 {
3397 if (fdata.saved_ev >= 0)
3398 {
3399 int i;
3400 CORE_ADDR ev_addr = cache->base + fdata.ev_offset;
dea80df0
MR
3401 CORE_ADDR off = (byte_order == BFD_ENDIAN_BIG ? 4 : 0);
3402
063715bf 3403 for (i = fdata.saved_ev; i < ppc_num_gprs; i++)
61a65099
KB
3404 {
3405 cache->saved_regs[tdep->ppc_ev0_regnum + i].addr = ev_addr;
dea80df0 3406 cache->saved_regs[tdep->ppc_gp0_regnum + i].addr = ev_addr + off;
61a65099 3407 ev_addr += register_size (gdbarch, tdep->ppc_ev0_regnum);
dea80df0 3408 }
61a65099
KB
3409 }
3410 }
3411
3412 /* If != 0, fdata.cr_offset is the offset from the frame that
3413 holds the CR. */
3414 if (fdata.cr_offset != 0)
0df8b418
MS
3415 cache->saved_regs[tdep->ppc_cr_regnum].addr
3416 = cache->base + fdata.cr_offset;
61a65099
KB
3417
3418 /* If != 0, fdata.lr_offset is the offset from the frame that
3419 holds the LR. */
3420 if (fdata.lr_offset != 0)
0df8b418
MS
3421 cache->saved_regs[tdep->ppc_lr_regnum].addr
3422 = cache->base + fdata.lr_offset;
46a9b8ed
DJ
3423 else if (fdata.lr_register != -1)
3424 cache->saved_regs[tdep->ppc_lr_regnum].realreg = fdata.lr_register;
61a65099 3425 /* The PC is found in the link register. */
8b164abb 3426 cache->saved_regs[gdbarch_pc_regnum (gdbarch)] =
3e8c568d 3427 cache->saved_regs[tdep->ppc_lr_regnum];
61a65099
KB
3428
3429 /* If != 0, fdata.vrsave_offset is the offset from the frame that
3430 holds the VRSAVE. */
3431 if (fdata.vrsave_offset != 0)
0df8b418
MS
3432 cache->saved_regs[tdep->ppc_vrsave_regnum].addr
3433 = cache->base + fdata.vrsave_offset;
61a65099
KB
3434
3435 if (fdata.alloca_reg < 0)
3436 /* If no alloca register used, then fi->frame is the value of the
3437 %sp for this frame, and it is good enough. */
1af5d7ce
UW
3438 cache->initial_sp
3439 = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch));
61a65099 3440 else
1af5d7ce
UW
3441 cache->initial_sp
3442 = get_frame_register_unsigned (this_frame, fdata.alloca_reg);
61a65099 3443
50ae56ec 3444 cache->base_p = 1;
61a65099
KB
3445 return cache;
3446}
3447
3448static void
1af5d7ce 3449rs6000_frame_this_id (struct frame_info *this_frame, void **this_cache,
61a65099
KB
3450 struct frame_id *this_id)
3451{
1af5d7ce 3452 struct rs6000_frame_cache *info = rs6000_frame_cache (this_frame,
61a65099 3453 this_cache);
50ae56ec
WW
3454
3455 if (!info->base_p)
3456 {
3457 (*this_id) = frame_id_build_unavailable_stack (info->pc);
3458 return;
3459 }
3460
5b197912
UW
3461 /* This marks the outermost frame. */
3462 if (info->base == 0)
3463 return;
3464
1af5d7ce 3465 (*this_id) = frame_id_build (info->base, get_frame_func (this_frame));
61a65099
KB
3466}
3467
1af5d7ce
UW
3468static struct value *
3469rs6000_frame_prev_register (struct frame_info *this_frame,
3470 void **this_cache, int regnum)
61a65099 3471{
1af5d7ce 3472 struct rs6000_frame_cache *info = rs6000_frame_cache (this_frame,
61a65099 3473 this_cache);
1af5d7ce 3474 return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
61a65099
KB
3475}
3476
3477static const struct frame_unwind rs6000_frame_unwind =
3478{
3479 NORMAL_FRAME,
8fbca658 3480 default_frame_unwind_stop_reason,
61a65099 3481 rs6000_frame_this_id,
1af5d7ce
UW
3482 rs6000_frame_prev_register,
3483 NULL,
3484 default_frame_sniffer
61a65099 3485};
2608dbf8 3486
ddeca1df
WW
3487/* Allocate and initialize a frame cache for an epilogue frame.
3488 SP is restored and prev-PC is stored in LR. */
3489
2608dbf8
WW
3490static struct rs6000_frame_cache *
3491rs6000_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
3492{
2608dbf8
WW
3493 struct rs6000_frame_cache *cache;
3494 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3495 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2608dbf8
WW
3496
3497 if (*this_cache)
19ba03f4 3498 return (struct rs6000_frame_cache *) *this_cache;
2608dbf8
WW
3499
3500 cache = FRAME_OBSTACK_ZALLOC (struct rs6000_frame_cache);
3501 (*this_cache) = cache;
3502 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
3503
492d29ea 3504 TRY
2608dbf8
WW
3505 {
3506 /* At this point the stack looks as if we just entered the
3507 function, and the return address is stored in LR. */
3508 CORE_ADDR sp, lr;
3509
3510 sp = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch));
3511 lr = get_frame_register_unsigned (this_frame, tdep->ppc_lr_regnum);
3512
3513 cache->base = sp;
3514 cache->initial_sp = sp;
3515
3516 trad_frame_set_value (cache->saved_regs,
3517 gdbarch_pc_regnum (gdbarch), lr);
3518 }
492d29ea 3519 CATCH (ex, RETURN_MASK_ERROR)
7556d4a4
PA
3520 {
3521 if (ex.error != NOT_AVAILABLE_ERROR)
3522 throw_exception (ex);
3523 }
492d29ea 3524 END_CATCH
2608dbf8
WW
3525
3526 return cache;
3527}
3528
ddeca1df
WW
3529/* Implementation of frame_unwind.this_id, as defined in frame_unwind.h.
3530 Return the frame ID of an epilogue frame. */
3531
2608dbf8
WW
3532static void
3533rs6000_epilogue_frame_this_id (struct frame_info *this_frame,
3534 void **this_cache, struct frame_id *this_id)
3535{
3536 CORE_ADDR pc;
3537 struct rs6000_frame_cache *info =
3538 rs6000_epilogue_frame_cache (this_frame, this_cache);
3539
3540 pc = get_frame_func (this_frame);
3541 if (info->base == 0)
3542 (*this_id) = frame_id_build_unavailable_stack (pc);
3543 else
3544 (*this_id) = frame_id_build (info->base, pc);
3545}
3546
ddeca1df
WW
3547/* Implementation of frame_unwind.prev_register, as defined in frame_unwind.h.
3548 Return the register value of REGNUM in previous frame. */
3549
2608dbf8
WW
3550static struct value *
3551rs6000_epilogue_frame_prev_register (struct frame_info *this_frame,
3552 void **this_cache, int regnum)
3553{
3554 struct rs6000_frame_cache *info =
3555 rs6000_epilogue_frame_cache (this_frame, this_cache);
3556 return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
3557}
3558
ddeca1df
WW
3559/* Implementation of frame_unwind.sniffer, as defined in frame_unwind.h.
3560 Check whether this an epilogue frame. */
3561
2608dbf8
WW
3562static int
3563rs6000_epilogue_frame_sniffer (const struct frame_unwind *self,
3564 struct frame_info *this_frame,
3565 void **this_prologue_cache)
3566{
3567 if (frame_relative_level (this_frame) == 0)
3568 return rs6000_in_function_epilogue_frame_p (this_frame,
3569 get_frame_arch (this_frame),
3570 get_frame_pc (this_frame));
3571 else
3572 return 0;
3573}
3574
ddeca1df
WW
3575/* Frame unwinder for epilogue frame. This is required for reverse step-over
3576 a function without debug information. */
3577
2608dbf8
WW
3578static const struct frame_unwind rs6000_epilogue_frame_unwind =
3579{
3580 NORMAL_FRAME,
3581 default_frame_unwind_stop_reason,
3582 rs6000_epilogue_frame_this_id, rs6000_epilogue_frame_prev_register,
3583 NULL,
3584 rs6000_epilogue_frame_sniffer
3585};
61a65099
KB
3586\f
3587
3588static CORE_ADDR
1af5d7ce 3589rs6000_frame_base_address (struct frame_info *this_frame, void **this_cache)
61a65099 3590{
1af5d7ce 3591 struct rs6000_frame_cache *info = rs6000_frame_cache (this_frame,
61a65099
KB
3592 this_cache);
3593 return info->initial_sp;
3594}
3595
3596static const struct frame_base rs6000_frame_base = {
3597 &rs6000_frame_unwind,
3598 rs6000_frame_base_address,
3599 rs6000_frame_base_address,
3600 rs6000_frame_base_address
3601};
3602
3603static const struct frame_base *
1af5d7ce 3604rs6000_frame_base_sniffer (struct frame_info *this_frame)
61a65099
KB
3605{
3606 return &rs6000_frame_base;
3607}
3608
9274a07c
LM
3609/* DWARF-2 frame support. Used to handle the detection of
3610 clobbered registers during function calls. */
3611
3612static void
3613ppc_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3614 struct dwarf2_frame_state_reg *reg,
4a4e5149 3615 struct frame_info *this_frame)
9274a07c
LM
3616{
3617 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3618
3619 /* PPC32 and PPC64 ABI's are the same regarding volatile and
3620 non-volatile registers. We will use the same code for both. */
3621
3622 /* Call-saved GP registers. */
3623 if ((regnum >= tdep->ppc_gp0_regnum + 14
3624 && regnum <= tdep->ppc_gp0_regnum + 31)
3625 || (regnum == tdep->ppc_gp0_regnum + 1))
3626 reg->how = DWARF2_FRAME_REG_SAME_VALUE;
3627
3628 /* Call-clobbered GP registers. */
3629 if ((regnum >= tdep->ppc_gp0_regnum + 3
3630 && regnum <= tdep->ppc_gp0_regnum + 12)
3631 || (regnum == tdep->ppc_gp0_regnum))
3632 reg->how = DWARF2_FRAME_REG_UNDEFINED;
3633
3634 /* Deal with FP registers, if supported. */
3635 if (tdep->ppc_fp0_regnum >= 0)
3636 {
3637 /* Call-saved FP registers. */
3638 if ((regnum >= tdep->ppc_fp0_regnum + 14
3639 && regnum <= tdep->ppc_fp0_regnum + 31))
3640 reg->how = DWARF2_FRAME_REG_SAME_VALUE;
3641
3642 /* Call-clobbered FP registers. */
3643 if ((regnum >= tdep->ppc_fp0_regnum
3644 && regnum <= tdep->ppc_fp0_regnum + 13))
3645 reg->how = DWARF2_FRAME_REG_UNDEFINED;
3646 }
3647
3648 /* Deal with ALTIVEC registers, if supported. */
3649 if (tdep->ppc_vr0_regnum > 0 && tdep->ppc_vrsave_regnum > 0)
3650 {
3651 /* Call-saved Altivec registers. */
3652 if ((regnum >= tdep->ppc_vr0_regnum + 20
3653 && regnum <= tdep->ppc_vr0_regnum + 31)
3654 || regnum == tdep->ppc_vrsave_regnum)
3655 reg->how = DWARF2_FRAME_REG_SAME_VALUE;
3656
3657 /* Call-clobbered Altivec registers. */
3658 if ((regnum >= tdep->ppc_vr0_regnum
3659 && regnum <= tdep->ppc_vr0_regnum + 19))
3660 reg->how = DWARF2_FRAME_REG_UNDEFINED;
3661 }
3662
3663 /* Handle PC register and Stack Pointer correctly. */
40a6adc1 3664 if (regnum == gdbarch_pc_regnum (gdbarch))
9274a07c 3665 reg->how = DWARF2_FRAME_REG_RA;
40a6adc1 3666 else if (regnum == gdbarch_sp_regnum (gdbarch))
9274a07c
LM
3667 reg->how = DWARF2_FRAME_REG_CFA;
3668}
3669
3670
74af9197
NF
3671/* Return true if a .gnu_attributes section exists in BFD and it
3672 indicates we are using SPE extensions OR if a .PPC.EMB.apuinfo
3673 section exists in BFD and it indicates that SPE extensions are in
3674 use. Check the .gnu.attributes section first, as the binary might be
3675 compiled for SPE, but not actually using SPE instructions. */
3676
3677static int
3678bfd_uses_spe_extensions (bfd *abfd)
3679{
3680 asection *sect;
3681 gdb_byte *contents = NULL;
3682 bfd_size_type size;
3683 gdb_byte *ptr;
3684 int success = 0;
3685 int vector_abi;
3686
3687 if (!abfd)
3688 return 0;
3689
50a99728 3690#ifdef HAVE_ELF
74af9197
NF
3691 /* Using Tag_GNU_Power_ABI_Vector here is a bit of a hack, as the user
3692 could be using the SPE vector abi without actually using any spe
3693 bits whatsoever. But it's close enough for now. */
3694 vector_abi = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_GNU,
3695 Tag_GNU_Power_ABI_Vector);
3696 if (vector_abi == 3)
3697 return 1;
50a99728 3698#endif
74af9197
NF
3699
3700 sect = bfd_get_section_by_name (abfd, ".PPC.EMB.apuinfo");
3701 if (!sect)
3702 return 0;
3703
3704 size = bfd_get_section_size (sect);
224c3ddb 3705 contents = (gdb_byte *) xmalloc (size);
74af9197
NF
3706 if (!bfd_get_section_contents (abfd, sect, contents, 0, size))
3707 {
3708 xfree (contents);
3709 return 0;
3710 }
3711
3712 /* Parse the .PPC.EMB.apuinfo section. The layout is as follows:
3713
3714 struct {
3715 uint32 name_len;
3716 uint32 data_len;
3717 uint32 type;
3718 char name[name_len rounded up to 4-byte alignment];
3719 char data[data_len];
3720 };
3721
3722 Technically, there's only supposed to be one such structure in a
3723 given apuinfo section, but the linker is not always vigilant about
3724 merging apuinfo sections from input files. Just go ahead and parse
3725 them all, exiting early when we discover the binary uses SPE
3726 insns.
3727
3728 It's not specified in what endianness the information in this
3729 section is stored. Assume that it's the endianness of the BFD. */
3730 ptr = contents;
3731 while (1)
3732 {
3733 unsigned int name_len;
3734 unsigned int data_len;
3735 unsigned int type;
3736
3737 /* If we can't read the first three fields, we're done. */
3738 if (size < 12)
3739 break;
3740
3741 name_len = bfd_get_32 (abfd, ptr);
3742 name_len = (name_len + 3) & ~3U; /* Round to 4 bytes. */
3743 data_len = bfd_get_32 (abfd, ptr + 4);
3744 type = bfd_get_32 (abfd, ptr + 8);
3745 ptr += 12;
3746
3747 /* The name must be "APUinfo\0". */
3748 if (name_len != 8
3749 && strcmp ((const char *) ptr, "APUinfo") != 0)
3750 break;
3751 ptr += name_len;
3752
3753 /* The type must be 2. */
3754 if (type != 2)
3755 break;
3756
3757 /* The data is stored as a series of uint32. The upper half of
3758 each uint32 indicates the particular APU used and the lower
3759 half indicates the revision of that APU. We just care about
3760 the upper half. */
3761
3762 /* Not 4-byte quantities. */
3763 if (data_len & 3U)
3764 break;
3765
3766 while (data_len)
3767 {
3768 unsigned int apuinfo = bfd_get_32 (abfd, ptr);
3769 unsigned int apu = apuinfo >> 16;
3770 ptr += 4;
3771 data_len -= 4;
3772
3773 /* The SPE APU is 0x100; the SPEFP APU is 0x101. Accept
3774 either. */
3775 if (apu == 0x100 || apu == 0x101)
3776 {
3777 success = 1;
3778 data_len = 0;
3779 }
3780 }
3781
3782 if (success)
3783 break;
3784 }
3785
3786 xfree (contents);
3787 return success;
3788}
3789
b4cdae6f
WW
3790/* These are macros for parsing instruction fields (I.1.6.28) */
3791
3792#define PPC_FIELD(value, from, len) \
3793 (((value) >> (32 - (from) - (len))) & ((1 << (len)) - 1))
3794#define PPC_SEXT(v, bs) \
3795 ((((CORE_ADDR) (v) & (((CORE_ADDR) 1 << (bs)) - 1)) \
3796 ^ ((CORE_ADDR) 1 << ((bs) - 1))) \
3797 - ((CORE_ADDR) 1 << ((bs) - 1)))
3798#define PPC_OP6(insn) PPC_FIELD (insn, 0, 6)
3799#define PPC_EXTOP(insn) PPC_FIELD (insn, 21, 10)
3800#define PPC_RT(insn) PPC_FIELD (insn, 6, 5)
3801#define PPC_RS(insn) PPC_FIELD (insn, 6, 5)
3802#define PPC_RA(insn) PPC_FIELD (insn, 11, 5)
3803#define PPC_RB(insn) PPC_FIELD (insn, 16, 5)
3804#define PPC_NB(insn) PPC_FIELD (insn, 16, 5)
3805#define PPC_VRT(insn) PPC_FIELD (insn, 6, 5)
3806#define PPC_FRT(insn) PPC_FIELD (insn, 6, 5)
3807#define PPC_SPR(insn) (PPC_FIELD (insn, 11, 5) \
3808 | (PPC_FIELD (insn, 16, 5) << 5))
3809#define PPC_BO(insn) PPC_FIELD (insn, 6, 5)
3810#define PPC_T(insn) PPC_FIELD (insn, 6, 5)
3811#define PPC_D(insn) PPC_SEXT (PPC_FIELD (insn, 16, 16), 16)
3812#define PPC_DS(insn) PPC_SEXT (PPC_FIELD (insn, 16, 14), 14)
6ec2b213 3813#define PPC_DQ(insn) PPC_SEXT (PPC_FIELD (insn, 16, 12), 12)
b4cdae6f
WW
3814#define PPC_BIT(insn,n) ((insn & (1 << (31 - (n)))) ? 1 : 0)
3815#define PPC_OE(insn) PPC_BIT (insn, 21)
3816#define PPC_RC(insn) PPC_BIT (insn, 31)
3817#define PPC_Rc(insn) PPC_BIT (insn, 21)
3818#define PPC_LK(insn) PPC_BIT (insn, 31)
3819#define PPC_TX(insn) PPC_BIT (insn, 31)
3820#define PPC_LEV(insn) PPC_FIELD (insn, 20, 7)
3821
3822#define PPC_XT(insn) ((PPC_TX (insn) << 5) | PPC_T (insn))
3823#define PPC_XER_NB(xer) (xer & 0x7f)
3824
ddeca1df
WW
3825/* Record Vector-Scalar Registers.
3826 For VSR less than 32, it's represented by an FPR and an VSR-upper register.
3827 Otherwise, it's just a VR register. Record them accordingly. */
b4cdae6f
WW
3828
3829static int
3830ppc_record_vsr (struct regcache *regcache, struct gdbarch_tdep *tdep, int vsr)
3831{
3832 if (vsr < 0 || vsr >= 64)
3833 return -1;
3834
3835 if (vsr >= 32)
3836 {
3837 if (tdep->ppc_vr0_regnum >= 0)
3838 record_full_arch_list_add_reg (regcache, tdep->ppc_vr0_regnum + vsr - 32);
3839 }
3840 else
3841 {
3842 if (tdep->ppc_fp0_regnum >= 0)
3843 record_full_arch_list_add_reg (regcache, tdep->ppc_fp0_regnum + vsr);
3844 if (tdep->ppc_vsr0_upper_regnum >= 0)
3845 record_full_arch_list_add_reg (regcache,
3846 tdep->ppc_vsr0_upper_regnum + vsr);
3847 }
3848
3849 return 0;
3850}
3851
ddeca1df
WW
3852/* Parse and record instructions primary opcode-4 at ADDR.
3853 Return 0 if successful. */
b4cdae6f
WW
3854
3855static int
3856ppc_process_record_op4 (struct gdbarch *gdbarch, struct regcache *regcache,
ddeca1df 3857 CORE_ADDR addr, uint32_t insn)
b4cdae6f
WW
3858{
3859 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3860 int ext = PPC_FIELD (insn, 21, 11);
6ec2b213 3861 int vra = PPC_FIELD (insn, 11, 5);
b4cdae6f
WW
3862
3863 switch (ext & 0x3f)
3864 {
3865 case 32: /* Vector Multiply-High-Add Signed Halfword Saturate */
3866 case 33: /* Vector Multiply-High-Round-Add Signed Halfword Saturate */
3867 case 39: /* Vector Multiply-Sum Unsigned Halfword Saturate */
3868 case 41: /* Vector Multiply-Sum Signed Halfword Saturate */
3869 record_full_arch_list_add_reg (regcache, PPC_VSCR_REGNUM);
3870 /* FALL-THROUGH */
3871 case 42: /* Vector Select */
3872 case 43: /* Vector Permute */
6ec2b213 3873 case 59: /* Vector Permute Right-indexed */
b4cdae6f
WW
3874 case 44: /* Vector Shift Left Double by Octet Immediate */
3875 case 45: /* Vector Permute and Exclusive-OR */
3876 case 60: /* Vector Add Extended Unsigned Quadword Modulo */
3877 case 61: /* Vector Add Extended & write Carry Unsigned Quadword */
3878 case 62: /* Vector Subtract Extended Unsigned Quadword Modulo */
3879 case 63: /* Vector Subtract Extended & write Carry Unsigned Quadword */
3880 case 34: /* Vector Multiply-Low-Add Unsigned Halfword Modulo */
6ec2b213 3881 case 35: /* Vector Multiply-Sum Unsigned Doubleword Modulo */
b4cdae6f
WW
3882 case 36: /* Vector Multiply-Sum Unsigned Byte Modulo */
3883 case 37: /* Vector Multiply-Sum Mixed Byte Modulo */
3884 case 38: /* Vector Multiply-Sum Unsigned Halfword Modulo */
3885 case 40: /* Vector Multiply-Sum Signed Halfword Modulo */
3886 case 46: /* Vector Multiply-Add Single-Precision */
3887 case 47: /* Vector Negative Multiply-Subtract Single-Precision */
3888 record_full_arch_list_add_reg (regcache,
3889 tdep->ppc_vr0_regnum + PPC_VRT (insn));
3890 return 0;
6ec2b213
EBM
3891
3892 case 48: /* Multiply-Add High Doubleword */
3893 case 49: /* Multiply-Add High Doubleword Unsigned */
3894 case 51: /* Multiply-Add Low Doubleword */
3895 record_full_arch_list_add_reg (regcache,
3896 tdep->ppc_gp0_regnum + PPC_RT (insn));
3897 return 0;
b4cdae6f
WW
3898 }
3899
3900 switch ((ext & 0x1ff))
3901 {
6ec2b213
EBM
3902 case 385:
3903 if (vra != 0 /* Decimal Convert To Signed Quadword */
3904 && vra != 2 /* Decimal Convert From Signed Quadword */
3905 && vra != 4 /* Decimal Convert To Zoned */
3906 && vra != 5 /* Decimal Convert To National */
3907 && vra != 6 /* Decimal Convert From Zoned */
3908 && vra != 7 /* Decimal Convert From National */
3909 && vra != 31) /* Decimal Set Sign */
3910 break;
b4cdae6f
WW
3911 /* 5.16 Decimal Integer Arithmetic Instructions */
3912 case 1: /* Decimal Add Modulo */
3913 case 65: /* Decimal Subtract Modulo */
3914
6ec2b213
EBM
3915 case 193: /* Decimal Shift */
3916 case 129: /* Decimal Unsigned Shift */
3917 case 449: /* Decimal Shift and Round */
3918
3919 case 257: /* Decimal Truncate */
3920 case 321: /* Decimal Unsigned Truncate */
3921
b4cdae6f
WW
3922 /* Bit-21 should be set. */
3923 if (!PPC_BIT (insn, 21))
3924 break;
3925
3926 record_full_arch_list_add_reg (regcache,
3927 tdep->ppc_vr0_regnum + PPC_VRT (insn));
3928 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
3929 return 0;
3930 }
3931
3932 /* Bit-21 is used for RC */
3933 switch (ext & 0x3ff)
3934 {
3935 case 6: /* Vector Compare Equal To Unsigned Byte */
3936 case 70: /* Vector Compare Equal To Unsigned Halfword */
3937 case 134: /* Vector Compare Equal To Unsigned Word */
3938 case 199: /* Vector Compare Equal To Unsigned Doubleword */
3939 case 774: /* Vector Compare Greater Than Signed Byte */
3940 case 838: /* Vector Compare Greater Than Signed Halfword */
3941 case 902: /* Vector Compare Greater Than Signed Word */
3942 case 967: /* Vector Compare Greater Than Signed Doubleword */
3943 case 518: /* Vector Compare Greater Than Unsigned Byte */
3944 case 646: /* Vector Compare Greater Than Unsigned Word */
3945 case 582: /* Vector Compare Greater Than Unsigned Halfword */
3946 case 711: /* Vector Compare Greater Than Unsigned Doubleword */
3947 case 966: /* Vector Compare Bounds Single-Precision */
3948 case 198: /* Vector Compare Equal To Single-Precision */
3949 case 454: /* Vector Compare Greater Than or Equal To Single-Precision */
3950 case 710: /* Vector Compare Greater Than Single-Precision */
6ec2b213
EBM
3951 case 7: /* Vector Compare Not Equal Byte */
3952 case 71: /* Vector Compare Not Equal Halfword */
3953 case 135: /* Vector Compare Not Equal Word */
3954 case 263: /* Vector Compare Not Equal or Zero Byte */
3955 case 327: /* Vector Compare Not Equal or Zero Halfword */
3956 case 391: /* Vector Compare Not Equal or Zero Word */
b4cdae6f
WW
3957 if (PPC_Rc (insn))
3958 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
3959 record_full_arch_list_add_reg (regcache,
3960 tdep->ppc_vr0_regnum + PPC_VRT (insn));
3961 return 0;
3962 }
3963
6ec2b213
EBM
3964 if (ext == 1538)
3965 {
3966 switch (vra)
3967 {
3968 case 0: /* Vector Count Leading Zero Least-Significant Bits
3969 Byte */
3970 case 1: /* Vector Count Trailing Zero Least-Significant Bits
3971 Byte */
3972 record_full_arch_list_add_reg (regcache,
3973 tdep->ppc_gp0_regnum + PPC_RT (insn));
3974 return 0;
3975
3976 case 6: /* Vector Negate Word */
3977 case 7: /* Vector Negate Doubleword */
3978 case 8: /* Vector Parity Byte Word */
3979 case 9: /* Vector Parity Byte Doubleword */
3980 case 10: /* Vector Parity Byte Quadword */
3981 case 16: /* Vector Extend Sign Byte To Word */
3982 case 17: /* Vector Extend Sign Halfword To Word */
3983 case 24: /* Vector Extend Sign Byte To Doubleword */
3984 case 25: /* Vector Extend Sign Halfword To Doubleword */
3985 case 26: /* Vector Extend Sign Word To Doubleword */
3986 case 28: /* Vector Count Trailing Zeros Byte */
3987 case 29: /* Vector Count Trailing Zeros Halfword */
3988 case 30: /* Vector Count Trailing Zeros Word */
3989 case 31: /* Vector Count Trailing Zeros Doubleword */
3990 record_full_arch_list_add_reg (regcache,
3991 tdep->ppc_vr0_regnum + PPC_VRT (insn));
3992 return 0;
3993 }
3994 }
3995
b4cdae6f
WW
3996 switch (ext)
3997 {
3998 case 142: /* Vector Pack Unsigned Halfword Unsigned Saturate */
3999 case 206: /* Vector Pack Unsigned Word Unsigned Saturate */
4000 case 270: /* Vector Pack Signed Halfword Unsigned Saturate */
4001 case 334: /* Vector Pack Signed Word Unsigned Saturate */
4002 case 398: /* Vector Pack Signed Halfword Signed Saturate */
4003 case 462: /* Vector Pack Signed Word Signed Saturate */
4004 case 1230: /* Vector Pack Unsigned Doubleword Unsigned Saturate */
4005 case 1358: /* Vector Pack Signed Doubleword Unsigned Saturate */
4006 case 1486: /* Vector Pack Signed Doubleword Signed Saturate */
4007 case 512: /* Vector Add Unsigned Byte Saturate */
4008 case 576: /* Vector Add Unsigned Halfword Saturate */
4009 case 640: /* Vector Add Unsigned Word Saturate */
4010 case 768: /* Vector Add Signed Byte Saturate */
4011 case 832: /* Vector Add Signed Halfword Saturate */
4012 case 896: /* Vector Add Signed Word Saturate */
4013 case 1536: /* Vector Subtract Unsigned Byte Saturate */
4014 case 1600: /* Vector Subtract Unsigned Halfword Saturate */
4015 case 1664: /* Vector Subtract Unsigned Word Saturate */
4016 case 1792: /* Vector Subtract Signed Byte Saturate */
4017 case 1856: /* Vector Subtract Signed Halfword Saturate */
4018 case 1920: /* Vector Subtract Signed Word Saturate */
4019
4020 case 1544: /* Vector Sum across Quarter Unsigned Byte Saturate */
4021 case 1800: /* Vector Sum across Quarter Signed Byte Saturate */
4022 case 1608: /* Vector Sum across Quarter Signed Halfword Saturate */
4023 case 1672: /* Vector Sum across Half Signed Word Saturate */
4024 case 1928: /* Vector Sum across Signed Word Saturate */
4025 case 970: /* Vector Convert To Signed Fixed-Point Word Saturate */
4026 case 906: /* Vector Convert To Unsigned Fixed-Point Word Saturate */
4027 record_full_arch_list_add_reg (regcache, PPC_VSCR_REGNUM);
4028 /* FALL-THROUGH */
4029 case 12: /* Vector Merge High Byte */
4030 case 14: /* Vector Pack Unsigned Halfword Unsigned Modulo */
4031 case 76: /* Vector Merge High Halfword */
4032 case 78: /* Vector Pack Unsigned Word Unsigned Modulo */
4033 case 140: /* Vector Merge High Word */
4034 case 268: /* Vector Merge Low Byte */
4035 case 332: /* Vector Merge Low Halfword */
4036 case 396: /* Vector Merge Low Word */
4037 case 526: /* Vector Unpack High Signed Byte */
4038 case 590: /* Vector Unpack High Signed Halfword */
4039 case 654: /* Vector Unpack Low Signed Byte */
4040 case 718: /* Vector Unpack Low Signed Halfword */
4041 case 782: /* Vector Pack Pixel */
4042 case 846: /* Vector Unpack High Pixel */
4043 case 974: /* Vector Unpack Low Pixel */
4044 case 1102: /* Vector Pack Unsigned Doubleword Unsigned Modulo */
4045 case 1614: /* Vector Unpack High Signed Word */
4046 case 1676: /* Vector Merge Odd Word */
4047 case 1742: /* Vector Unpack Low Signed Word */
4048 case 1932: /* Vector Merge Even Word */
4049 case 524: /* Vector Splat Byte */
4050 case 588: /* Vector Splat Halfword */
4051 case 652: /* Vector Splat Word */
4052 case 780: /* Vector Splat Immediate Signed Byte */
4053 case 844: /* Vector Splat Immediate Signed Halfword */
4054 case 908: /* Vector Splat Immediate Signed Word */
4055 case 452: /* Vector Shift Left */
4056 case 708: /* Vector Shift Right */
4057 case 1036: /* Vector Shift Left by Octet */
4058 case 1100: /* Vector Shift Right by Octet */
4059 case 0: /* Vector Add Unsigned Byte Modulo */
4060 case 64: /* Vector Add Unsigned Halfword Modulo */
4061 case 128: /* Vector Add Unsigned Word Modulo */
4062 case 192: /* Vector Add Unsigned Doubleword Modulo */
4063 case 256: /* Vector Add Unsigned Quadword Modulo */
4064 case 320: /* Vector Add & write Carry Unsigned Quadword */
4065 case 384: /* Vector Add and Write Carry-Out Unsigned Word */
4066 case 8: /* Vector Multiply Odd Unsigned Byte */
4067 case 72: /* Vector Multiply Odd Unsigned Halfword */
4068 case 136: /* Vector Multiply Odd Unsigned Word */
4069 case 264: /* Vector Multiply Odd Signed Byte */
4070 case 328: /* Vector Multiply Odd Signed Halfword */
4071 case 392: /* Vector Multiply Odd Signed Word */
4072 case 520: /* Vector Multiply Even Unsigned Byte */
4073 case 584: /* Vector Multiply Even Unsigned Halfword */
4074 case 648: /* Vector Multiply Even Unsigned Word */
4075 case 776: /* Vector Multiply Even Signed Byte */
4076 case 840: /* Vector Multiply Even Signed Halfword */
4077 case 904: /* Vector Multiply Even Signed Word */
4078 case 137: /* Vector Multiply Unsigned Word Modulo */
4079 case 1024: /* Vector Subtract Unsigned Byte Modulo */
4080 case 1088: /* Vector Subtract Unsigned Halfword Modulo */
4081 case 1152: /* Vector Subtract Unsigned Word Modulo */
4082 case 1216: /* Vector Subtract Unsigned Doubleword Modulo */
4083 case 1280: /* Vector Subtract Unsigned Quadword Modulo */
4084 case 1344: /* Vector Subtract & write Carry Unsigned Quadword */
4085 case 1408: /* Vector Subtract and Write Carry-Out Unsigned Word */
4086 case 1282: /* Vector Average Signed Byte */
4087 case 1346: /* Vector Average Signed Halfword */
4088 case 1410: /* Vector Average Signed Word */
4089 case 1026: /* Vector Average Unsigned Byte */
4090 case 1090: /* Vector Average Unsigned Halfword */
4091 case 1154: /* Vector Average Unsigned Word */
4092 case 258: /* Vector Maximum Signed Byte */
4093 case 322: /* Vector Maximum Signed Halfword */
4094 case 386: /* Vector Maximum Signed Word */
4095 case 450: /* Vector Maximum Signed Doubleword */
4096 case 2: /* Vector Maximum Unsigned Byte */
4097 case 66: /* Vector Maximum Unsigned Halfword */
4098 case 130: /* Vector Maximum Unsigned Word */
4099 case 194: /* Vector Maximum Unsigned Doubleword */
4100 case 770: /* Vector Minimum Signed Byte */
4101 case 834: /* Vector Minimum Signed Halfword */
4102 case 898: /* Vector Minimum Signed Word */
4103 case 962: /* Vector Minimum Signed Doubleword */
4104 case 514: /* Vector Minimum Unsigned Byte */
4105 case 578: /* Vector Minimum Unsigned Halfword */
4106 case 642: /* Vector Minimum Unsigned Word */
4107 case 706: /* Vector Minimum Unsigned Doubleword */
4108 case 1028: /* Vector Logical AND */
4109 case 1668: /* Vector Logical Equivalent */
4110 case 1092: /* Vector Logical AND with Complement */
4111 case 1412: /* Vector Logical NAND */
4112 case 1348: /* Vector Logical OR with Complement */
4113 case 1156: /* Vector Logical OR */
4114 case 1284: /* Vector Logical NOR */
4115 case 1220: /* Vector Logical XOR */
4116 case 4: /* Vector Rotate Left Byte */
4117 case 132: /* Vector Rotate Left Word VX-form */
4118 case 68: /* Vector Rotate Left Halfword */
4119 case 196: /* Vector Rotate Left Doubleword */
4120 case 260: /* Vector Shift Left Byte */
4121 case 388: /* Vector Shift Left Word */
4122 case 324: /* Vector Shift Left Halfword */
4123 case 1476: /* Vector Shift Left Doubleword */
4124 case 516: /* Vector Shift Right Byte */
4125 case 644: /* Vector Shift Right Word */
4126 case 580: /* Vector Shift Right Halfword */
4127 case 1732: /* Vector Shift Right Doubleword */
4128 case 772: /* Vector Shift Right Algebraic Byte */
4129 case 900: /* Vector Shift Right Algebraic Word */
4130 case 836: /* Vector Shift Right Algebraic Halfword */
4131 case 964: /* Vector Shift Right Algebraic Doubleword */
4132 case 10: /* Vector Add Single-Precision */
4133 case 74: /* Vector Subtract Single-Precision */
4134 case 1034: /* Vector Maximum Single-Precision */
4135 case 1098: /* Vector Minimum Single-Precision */
4136 case 842: /* Vector Convert From Signed Fixed-Point Word */
4137 case 778: /* Vector Convert From Unsigned Fixed-Point Word */
4138 case 714: /* Vector Round to Single-Precision Integer toward -Infinity */
4139 case 522: /* Vector Round to Single-Precision Integer Nearest */
4140 case 650: /* Vector Round to Single-Precision Integer toward +Infinity */
4141 case 586: /* Vector Round to Single-Precision Integer toward Zero */
4142 case 394: /* Vector 2 Raised to the Exponent Estimate Floating-Point */
4143 case 458: /* Vector Log Base 2 Estimate Floating-Point */
4144 case 266: /* Vector Reciprocal Estimate Single-Precision */
4145 case 330: /* Vector Reciprocal Square Root Estimate Single-Precision */
4146 case 1288: /* Vector AES Cipher */
4147 case 1289: /* Vector AES Cipher Last */
4148 case 1352: /* Vector AES Inverse Cipher */
4149 case 1353: /* Vector AES Inverse Cipher Last */
4150 case 1480: /* Vector AES SubBytes */
4151 case 1730: /* Vector SHA-512 Sigma Doubleword */
4152 case 1666: /* Vector SHA-256 Sigma Word */
4153 case 1032: /* Vector Polynomial Multiply-Sum Byte */
4154 case 1160: /* Vector Polynomial Multiply-Sum Word */
4155 case 1096: /* Vector Polynomial Multiply-Sum Halfword */
4156 case 1224: /* Vector Polynomial Multiply-Sum Doubleword */
4157 case 1292: /* Vector Gather Bits by Bytes by Doubleword */
4158 case 1794: /* Vector Count Leading Zeros Byte */
4159 case 1858: /* Vector Count Leading Zeros Halfword */
4160 case 1922: /* Vector Count Leading Zeros Word */
4161 case 1986: /* Vector Count Leading Zeros Doubleword */
4162 case 1795: /* Vector Population Count Byte */
4163 case 1859: /* Vector Population Count Halfword */
4164 case 1923: /* Vector Population Count Word */
4165 case 1987: /* Vector Population Count Doubleword */
4166 case 1356: /* Vector Bit Permute Quadword */
6ec2b213
EBM
4167 case 1484: /* Vector Bit Permute Doubleword */
4168 case 513: /* Vector Multiply-by-10 Unsigned Quadword */
4169 case 1: /* Vector Multiply-by-10 & write Carry Unsigned
4170 Quadword */
4171 case 577: /* Vector Multiply-by-10 Extended Unsigned Quadword */
4172 case 65: /* Vector Multiply-by-10 Extended & write Carry
4173 Unsigned Quadword */
4174 case 1027: /* Vector Absolute Difference Unsigned Byte */
4175 case 1091: /* Vector Absolute Difference Unsigned Halfword */
4176 case 1155: /* Vector Absolute Difference Unsigned Word */
4177 case 1796: /* Vector Shift Right Variable */
4178 case 1860: /* Vector Shift Left Variable */
4179 case 133: /* Vector Rotate Left Word then Mask Insert */
4180 case 197: /* Vector Rotate Left Doubleword then Mask Insert */
4181 case 389: /* Vector Rotate Left Word then AND with Mask */
4182 case 453: /* Vector Rotate Left Doubleword then AND with Mask */
4183 case 525: /* Vector Extract Unsigned Byte */
4184 case 589: /* Vector Extract Unsigned Halfword */
4185 case 653: /* Vector Extract Unsigned Word */
4186 case 717: /* Vector Extract Doubleword */
4187 case 781: /* Vector Insert Byte */
4188 case 845: /* Vector Insert Halfword */
4189 case 909: /* Vector Insert Word */
4190 case 973: /* Vector Insert Doubleword */
b4cdae6f
WW
4191 record_full_arch_list_add_reg (regcache,
4192 tdep->ppc_vr0_regnum + PPC_VRT (insn));
4193 return 0;
4194
6ec2b213
EBM
4195 case 1549: /* Vector Extract Unsigned Byte Left-Indexed */
4196 case 1613: /* Vector Extract Unsigned Halfword Left-Indexed */
4197 case 1677: /* Vector Extract Unsigned Word Left-Indexed */
4198 case 1805: /* Vector Extract Unsigned Byte Right-Indexed */
4199 case 1869: /* Vector Extract Unsigned Halfword Right-Indexed */
4200 case 1933: /* Vector Extract Unsigned Word Right-Indexed */
4201 record_full_arch_list_add_reg (regcache,
4202 tdep->ppc_gp0_regnum + PPC_RT (insn));
4203 return 0;
4204
b4cdae6f
WW
4205 case 1604: /* Move To Vector Status and Control Register */
4206 record_full_arch_list_add_reg (regcache, PPC_VSCR_REGNUM);
4207 return 0;
4208 case 1540: /* Move From Vector Status and Control Register */
4209 record_full_arch_list_add_reg (regcache,
4210 tdep->ppc_vr0_regnum + PPC_VRT (insn));
4211 return 0;
6ec2b213
EBM
4212 case 833: /* Decimal Copy Sign */
4213 record_full_arch_list_add_reg (regcache,
4214 tdep->ppc_vr0_regnum + PPC_VRT (insn));
4215 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4216 return 0;
b4cdae6f
WW
4217 }
4218
810c1026
WW
4219 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
4220 "at %s, 4-%d.\n", insn, paddress (gdbarch, addr), ext);
b4cdae6f
WW
4221 return -1;
4222}
4223
ddeca1df
WW
4224/* Parse and record instructions of primary opcode-19 at ADDR.
4225 Return 0 if successful. */
b4cdae6f
WW
4226
4227static int
4228ppc_process_record_op19 (struct gdbarch *gdbarch, struct regcache *regcache,
4229 CORE_ADDR addr, uint32_t insn)
4230{
4231 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4232 int ext = PPC_EXTOP (insn);
4233
6ec2b213
EBM
4234 switch (ext & 0x01f)
4235 {
4236 case 2: /* Add PC Immediate Shifted */
4237 record_full_arch_list_add_reg (regcache,
4238 tdep->ppc_gp0_regnum + PPC_RT (insn));
4239 return 0;
4240 }
4241
b4cdae6f
WW
4242 switch (ext)
4243 {
4244 case 0: /* Move Condition Register Field */
4245 case 33: /* Condition Register NOR */
4246 case 129: /* Condition Register AND with Complement */
4247 case 193: /* Condition Register XOR */
4248 case 225: /* Condition Register NAND */
4249 case 257: /* Condition Register AND */
4250 case 289: /* Condition Register Equivalent */
4251 case 417: /* Condition Register OR with Complement */
4252 case 449: /* Condition Register OR */
4253 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4254 return 0;
4255
4256 case 16: /* Branch Conditional */
4257 case 560: /* Branch Conditional to Branch Target Address Register */
4258 if ((PPC_BO (insn) & 0x4) == 0)
4259 record_full_arch_list_add_reg (regcache, tdep->ppc_ctr_regnum);
4260 /* FALL-THROUGH */
4261 case 528: /* Branch Conditional to Count Register */
4262 if (PPC_LK (insn))
4263 record_full_arch_list_add_reg (regcache, tdep->ppc_lr_regnum);
4264 return 0;
4265
4266 case 150: /* Instruction Synchronize */
4267 /* Do nothing. */
4268 return 0;
4269 }
4270
810c1026
WW
4271 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
4272 "at %s, 19-%d.\n", insn, paddress (gdbarch, addr), ext);
b4cdae6f
WW
4273 return -1;
4274}
4275
ddeca1df
WW
4276/* Parse and record instructions of primary opcode-31 at ADDR.
4277 Return 0 if successful. */
b4cdae6f
WW
4278
4279static int
4280ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
4281 CORE_ADDR addr, uint32_t insn)
4282{
4283 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4284 int ext = PPC_EXTOP (insn);
4285 int tmp, nr, nb, i;
4286 CORE_ADDR at_dcsz, ea = 0;
4287 ULONGEST rb, ra, xer;
4288 int size = 0;
4289
4290 /* These instructions have OE bit. */
4291 switch (ext & 0x1ff)
4292 {
4293 /* These write RT and XER. Update CR if RC is set. */
4294 case 8: /* Subtract from carrying */
4295 case 10: /* Add carrying */
4296 case 136: /* Subtract from extended */
4297 case 138: /* Add extended */
4298 case 200: /* Subtract from zero extended */
4299 case 202: /* Add to zero extended */
4300 case 232: /* Subtract from minus one extended */
4301 case 234: /* Add to minus one extended */
4302 /* CA is always altered, but SO/OV are only altered when OE=1.
4303 In any case, XER is always altered. */
4304 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4305 if (PPC_RC (insn))
4306 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4307 record_full_arch_list_add_reg (regcache,
4308 tdep->ppc_gp0_regnum + PPC_RT (insn));
4309 return 0;
4310
4311 /* These write RT. Update CR if RC is set and update XER if OE is set. */
4312 case 40: /* Subtract from */
4313 case 104: /* Negate */
4314 case 233: /* Multiply low doubleword */
4315 case 235: /* Multiply low word */
4316 case 266: /* Add */
4317 case 393: /* Divide Doubleword Extended Unsigned */
4318 case 395: /* Divide Word Extended Unsigned */
4319 case 425: /* Divide Doubleword Extended */
4320 case 427: /* Divide Word Extended */
4321 case 457: /* Divide Doubleword Unsigned */
4322 case 459: /* Divide Word Unsigned */
4323 case 489: /* Divide Doubleword */
4324 case 491: /* Divide Word */
4325 if (PPC_OE (insn))
4326 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4327 /* FALL-THROUGH */
4328 case 9: /* Multiply High Doubleword Unsigned */
4329 case 11: /* Multiply High Word Unsigned */
4330 case 73: /* Multiply High Doubleword */
4331 case 75: /* Multiply High Word */
4332 if (PPC_RC (insn))
4333 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4334 record_full_arch_list_add_reg (regcache,
4335 tdep->ppc_gp0_regnum + PPC_RT (insn));
4336 return 0;
4337 }
4338
4339 if ((ext & 0x1f) == 15)
4340 {
4341 /* Integer Select. bit[16:20] is used for BC. */
4342 record_full_arch_list_add_reg (regcache,
4343 tdep->ppc_gp0_regnum + PPC_RT (insn));
4344 return 0;
4345 }
4346
6ec2b213
EBM
4347 if ((ext & 0xff) == 170)
4348 {
4349 /* Add Extended using alternate carry bits */
4350 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4351 record_full_arch_list_add_reg (regcache,
4352 tdep->ppc_gp0_regnum + PPC_RT (insn));
4353 return 0;
4354 }
4355
b4cdae6f
WW
4356 switch (ext)
4357 {
4358 case 78: /* Determine Leftmost Zero Byte */
4359 if (PPC_RC (insn))
4360 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4361 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4362 record_full_arch_list_add_reg (regcache,
4363 tdep->ppc_gp0_regnum + PPC_RT (insn));
4364 return 0;
4365
4366 /* These only write RT. */
4367 case 19: /* Move from condition register */
4368 /* Move From One Condition Register Field */
4369 case 74: /* Add and Generate Sixes */
4370 case 74 | 0x200: /* Add and Generate Sixes (bit-21 dont-care) */
4371 case 302: /* Move From Branch History Rolling Buffer */
4372 case 339: /* Move From Special Purpose Register */
4373 case 371: /* Move From Time Base [Phased-Out] */
6ec2b213
EBM
4374 case 309: /* Load Doubleword Monitored Indexed */
4375 case 128: /* Set Boolean */
4376 case 755: /* Deliver A Random Number */
b4cdae6f
WW
4377 record_full_arch_list_add_reg (regcache,
4378 tdep->ppc_gp0_regnum + PPC_RT (insn));
4379 return 0;
4380
4381 /* These only write to RA. */
4382 case 51: /* Move From VSR Doubleword */
4383 case 115: /* Move From VSR Word and Zero */
4384 case 122: /* Population count bytes */
4385 case 378: /* Population count words */
4386 case 506: /* Population count doublewords */
4387 case 154: /* Parity Word */
4388 case 186: /* Parity Doubleword */
4389 case 252: /* Bit Permute Doubleword */
4390 case 282: /* Convert Declets To Binary Coded Decimal */
4391 case 314: /* Convert Binary Coded Decimal To Declets */
4392 case 508: /* Compare bytes */
6ec2b213 4393 case 307: /* Move From VSR Lower Doubleword */
b4cdae6f
WW
4394 record_full_arch_list_add_reg (regcache,
4395 tdep->ppc_gp0_regnum + PPC_RA (insn));
4396 return 0;
4397
4398 /* These write CR and optional RA. */
4399 case 792: /* Shift Right Algebraic Word */
4400 case 794: /* Shift Right Algebraic Doubleword */
4401 case 824: /* Shift Right Algebraic Word Immediate */
4402 case 826: /* Shift Right Algebraic Doubleword Immediate (413) */
4403 case 826 | 1: /* Shift Right Algebraic Doubleword Immediate (413) */
4404 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4405 record_full_arch_list_add_reg (regcache,
4406 tdep->ppc_gp0_regnum + PPC_RA (insn));
4407 /* FALL-THROUGH */
4408 case 0: /* Compare */
4409 case 32: /* Compare logical */
4410 case 144: /* Move To Condition Register Fields */
4411 /* Move To One Condition Register Field */
6ec2b213
EBM
4412 case 192: /* Compare Ranged Byte */
4413 case 224: /* Compare Equal Byte */
4414 case 576: /* Move XER to CR Extended */
4415 case 902: /* Paste (should always fail due to single-stepping and
4416 the memory location might not be accessible, so
4417 record only CR) */
b4cdae6f
WW
4418 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4419 return 0;
4420
4421 /* These write to RT. Update RA if 'update indexed.' */
4422 case 53: /* Load Doubleword with Update Indexed */
4423 case 119: /* Load Byte and Zero with Update Indexed */
4424 case 311: /* Load Halfword and Zero with Update Indexed */
4425 case 55: /* Load Word and Zero with Update Indexed */
4426 case 375: /* Load Halfword Algebraic with Update Indexed */
4427 case 373: /* Load Word Algebraic with Update Indexed */
4428 record_full_arch_list_add_reg (regcache,
4429 tdep->ppc_gp0_regnum + PPC_RA (insn));
4430 /* FALL-THROUGH */
4431 case 21: /* Load Doubleword Indexed */
4432 case 52: /* Load Byte And Reserve Indexed */
4433 case 116: /* Load Halfword And Reserve Indexed */
4434 case 20: /* Load Word And Reserve Indexed */
4435 case 84: /* Load Doubleword And Reserve Indexed */
4436 case 87: /* Load Byte and Zero Indexed */
4437 case 279: /* Load Halfword and Zero Indexed */
4438 case 23: /* Load Word and Zero Indexed */
4439 case 343: /* Load Halfword Algebraic Indexed */
4440 case 341: /* Load Word Algebraic Indexed */
4441 case 790: /* Load Halfword Byte-Reverse Indexed */
4442 case 534: /* Load Word Byte-Reverse Indexed */
4443 case 532: /* Load Doubleword Byte-Reverse Indexed */
6ec2b213
EBM
4444 case 582: /* Load Word Atomic */
4445 case 614: /* Load Doubleword Atomic */
4446 case 265: /* Modulo Unsigned Doubleword */
4447 case 777: /* Modulo Signed Doubleword */
4448 case 267: /* Modulo Unsigned Word */
4449 case 779: /* Modulo Signed Word */
b4cdae6f
WW
4450 record_full_arch_list_add_reg (regcache,
4451 tdep->ppc_gp0_regnum + PPC_RT (insn));
4452 return 0;
4453
4454 case 597: /* Load String Word Immediate */
4455 case 533: /* Load String Word Indexed */
4456 if (ext == 597)
4457 {
4458 nr = PPC_NB (insn);
4459 if (nr == 0)
4460 nr = 32;
4461 }
4462 else
4463 {
4464 regcache_raw_read_unsigned (regcache, tdep->ppc_xer_regnum, &xer);
4465 nr = PPC_XER_NB (xer);
4466 }
4467
4468 nr = (nr + 3) >> 2;
4469
4470 /* If n=0, the contents of register RT are undefined. */
4471 if (nr == 0)
4472 nr = 1;
4473
4474 for (i = 0; i < nr; i++)
4475 record_full_arch_list_add_reg (regcache,
4476 tdep->ppc_gp0_regnum
4477 + ((PPC_RT (insn) + i) & 0x1f));
4478 return 0;
4479
4480 case 276: /* Load Quadword And Reserve Indexed */
4481 tmp = tdep->ppc_gp0_regnum + (PPC_RT (insn) & ~1);
4482 record_full_arch_list_add_reg (regcache, tmp);
4483 record_full_arch_list_add_reg (regcache, tmp + 1);
4484 return 0;
4485
4486 /* These write VRT. */
4487 case 6: /* Load Vector for Shift Left Indexed */
4488 case 38: /* Load Vector for Shift Right Indexed */
4489 case 7: /* Load Vector Element Byte Indexed */
4490 case 39: /* Load Vector Element Halfword Indexed */
4491 case 71: /* Load Vector Element Word Indexed */
4492 case 103: /* Load Vector Indexed */
4493 case 359: /* Load Vector Indexed LRU */
4494 record_full_arch_list_add_reg (regcache,
4495 tdep->ppc_vr0_regnum + PPC_VRT (insn));
4496 return 0;
4497
4498 /* These write FRT. Update RA if 'update indexed.' */
4499 case 567: /* Load Floating-Point Single with Update Indexed */
4500 case 631: /* Load Floating-Point Double with Update Indexed */
4501 record_full_arch_list_add_reg (regcache,
4502 tdep->ppc_gp0_regnum + PPC_RA (insn));
4503 /* FALL-THROUGH */
4504 case 535: /* Load Floating-Point Single Indexed */
4505 case 599: /* Load Floating-Point Double Indexed */
4506 case 855: /* Load Floating-Point as Integer Word Algebraic Indexed */
4507 case 887: /* Load Floating-Point as Integer Word and Zero Indexed */
4508 record_full_arch_list_add_reg (regcache,
4509 tdep->ppc_fp0_regnum + PPC_FRT (insn));
4510 return 0;
4511
4512 case 791: /* Load Floating-Point Double Pair Indexed */
4513 tmp = tdep->ppc_fp0_regnum + (PPC_FRT (insn) & ~1);
4514 record_full_arch_list_add_reg (regcache, tmp);
4515 record_full_arch_list_add_reg (regcache, tmp + 1);
4516 return 0;
4517
4518 case 179: /* Move To VSR Doubleword */
4519 case 211: /* Move To VSR Word Algebraic */
4520 case 243: /* Move To VSR Word and Zero */
4521 case 588: /* Load VSX Scalar Doubleword Indexed */
4522 case 524: /* Load VSX Scalar Single-Precision Indexed */
4523 case 76: /* Load VSX Scalar as Integer Word Algebraic Indexed */
4524 case 12: /* Load VSX Scalar as Integer Word and Zero Indexed */
4525 case 844: /* Load VSX Vector Doubleword*2 Indexed */
4526 case 332: /* Load VSX Vector Doubleword & Splat Indexed */
4527 case 780: /* Load VSX Vector Word*4 Indexed */
6ec2b213
EBM
4528 case 268: /* Load VSX Vector Indexed */
4529 case 364: /* Load VSX Vector Word & Splat Indexed */
4530 case 812: /* Load VSX Vector Halfword*8 Indexed */
4531 case 876: /* Load VSX Vector Byte*16 Indexed */
4532 case 269: /* Load VSX Vector with Length */
4533 case 301: /* Load VSX Vector Left-justified with Length */
4534 case 781: /* Load VSX Scalar as Integer Byte & Zero Indexed */
4535 case 813: /* Load VSX Scalar as Integer Halfword & Zero Indexed */
4536 case 403: /* Move To VSR Word & Splat */
4537 case 435: /* Move To VSR Double Doubleword */
b4cdae6f
WW
4538 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
4539 return 0;
4540
4541 /* These write RA. Update CR if RC is set. */
4542 case 24: /* Shift Left Word */
4543 case 26: /* Count Leading Zeros Word */
4544 case 27: /* Shift Left Doubleword */
4545 case 28: /* AND */
4546 case 58: /* Count Leading Zeros Doubleword */
4547 case 60: /* AND with Complement */
4548 case 124: /* NOR */
4549 case 284: /* Equivalent */
4550 case 316: /* XOR */
4551 case 476: /* NAND */
4552 case 412: /* OR with Complement */
4553 case 444: /* OR */
4554 case 536: /* Shift Right Word */
4555 case 539: /* Shift Right Doubleword */
4556 case 922: /* Extend Sign Halfword */
4557 case 954: /* Extend Sign Byte */
4558 case 986: /* Extend Sign Word */
6ec2b213
EBM
4559 case 538: /* Count Trailing Zeros Word */
4560 case 570: /* Count Trailing Zeros Doubleword */
4561 case 890: /* Extend-Sign Word and Shift Left Immediate (445) */
4562 case 890 | 1: /* Extend-Sign Word and Shift Left Immediate (445) */
b4cdae6f
WW
4563 if (PPC_RC (insn))
4564 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4565 record_full_arch_list_add_reg (regcache,
4566 tdep->ppc_gp0_regnum + PPC_RA (insn));
4567 return 0;
4568
4569 /* Store memory. */
4570 case 181: /* Store Doubleword with Update Indexed */
4571 case 183: /* Store Word with Update Indexed */
4572 case 247: /* Store Byte with Update Indexed */
4573 case 439: /* Store Half Word with Update Indexed */
4574 case 695: /* Store Floating-Point Single with Update Indexed */
4575 case 759: /* Store Floating-Point Double with Update Indexed */
4576 record_full_arch_list_add_reg (regcache,
4577 tdep->ppc_gp0_regnum + PPC_RA (insn));
4578 /* FALL-THROUGH */
4579 case 135: /* Store Vector Element Byte Indexed */
4580 case 167: /* Store Vector Element Halfword Indexed */
4581 case 199: /* Store Vector Element Word Indexed */
4582 case 231: /* Store Vector Indexed */
4583 case 487: /* Store Vector Indexed LRU */
4584 case 716: /* Store VSX Scalar Doubleword Indexed */
4585 case 140: /* Store VSX Scalar as Integer Word Indexed */
4586 case 652: /* Store VSX Scalar Single-Precision Indexed */
4587 case 972: /* Store VSX Vector Doubleword*2 Indexed */
4588 case 908: /* Store VSX Vector Word*4 Indexed */
4589 case 149: /* Store Doubleword Indexed */
4590 case 151: /* Store Word Indexed */
4591 case 215: /* Store Byte Indexed */
4592 case 407: /* Store Half Word Indexed */
4593 case 694: /* Store Byte Conditional Indexed */
4594 case 726: /* Store Halfword Conditional Indexed */
4595 case 150: /* Store Word Conditional Indexed */
4596 case 214: /* Store Doubleword Conditional Indexed */
4597 case 182: /* Store Quadword Conditional Indexed */
4598 case 662: /* Store Word Byte-Reverse Indexed */
4599 case 918: /* Store Halfword Byte-Reverse Indexed */
4600 case 660: /* Store Doubleword Byte-Reverse Indexed */
4601 case 663: /* Store Floating-Point Single Indexed */
4602 case 727: /* Store Floating-Point Double Indexed */
4603 case 919: /* Store Floating-Point Double Pair Indexed */
4604 case 983: /* Store Floating-Point as Integer Word Indexed */
6ec2b213
EBM
4605 case 396: /* Store VSX Vector Indexed */
4606 case 940: /* Store VSX Vector Halfword*8 Indexed */
4607 case 1004: /* Store VSX Vector Byte*16 Indexed */
4608 case 909: /* Store VSX Scalar as Integer Byte Indexed */
4609 case 941: /* Store VSX Scalar as Integer Halfword Indexed */
b4cdae6f
WW
4610 if (ext == 694 || ext == 726 || ext == 150 || ext == 214 || ext == 182)
4611 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4612
4613 ra = 0;
4614 if (PPC_RA (insn) != 0)
4615 regcache_raw_read_unsigned (regcache,
4616 tdep->ppc_gp0_regnum + PPC_RA (insn), &ra);
4617 regcache_raw_read_unsigned (regcache,
4618 tdep->ppc_gp0_regnum + PPC_RB (insn), &rb);
4619 ea = ra + rb;
4620
4621 switch (ext)
4622 {
4623 case 183: /* Store Word with Update Indexed */
4624 case 199: /* Store Vector Element Word Indexed */
4625 case 140: /* Store VSX Scalar as Integer Word Indexed */
4626 case 652: /* Store VSX Scalar Single-Precision Indexed */
4627 case 151: /* Store Word Indexed */
4628 case 150: /* Store Word Conditional Indexed */
4629 case 662: /* Store Word Byte-Reverse Indexed */
4630 case 663: /* Store Floating-Point Single Indexed */
4631 case 695: /* Store Floating-Point Single with Update Indexed */
4632 case 983: /* Store Floating-Point as Integer Word Indexed */
4633 size = 4;
4634 break;
4635 case 247: /* Store Byte with Update Indexed */
4636 case 135: /* Store Vector Element Byte Indexed */
4637 case 215: /* Store Byte Indexed */
4638 case 694: /* Store Byte Conditional Indexed */
6ec2b213 4639 case 909: /* Store VSX Scalar as Integer Byte Indexed */
b4cdae6f
WW
4640 size = 1;
4641 break;
4642 case 439: /* Store Halfword with Update Indexed */
4643 case 167: /* Store Vector Element Halfword Indexed */
4644 case 407: /* Store Halfword Indexed */
4645 case 726: /* Store Halfword Conditional Indexed */
4646 case 918: /* Store Halfword Byte-Reverse Indexed */
6ec2b213 4647 case 941: /* Store VSX Scalar as Integer Halfword Indexed */
b4cdae6f
WW
4648 size = 2;
4649 break;
4650 case 181: /* Store Doubleword with Update Indexed */
4651 case 716: /* Store VSX Scalar Doubleword Indexed */
4652 case 149: /* Store Doubleword Indexed */
4653 case 214: /* Store Doubleword Conditional Indexed */
4654 case 660: /* Store Doubleword Byte-Reverse Indexed */
4655 case 727: /* Store Floating-Point Double Indexed */
4656 case 759: /* Store Floating-Point Double with Update Indexed */
4657 size = 8;
4658 break;
4659 case 972: /* Store VSX Vector Doubleword*2 Indexed */
4660 case 908: /* Store VSX Vector Word*4 Indexed */
4661 case 182: /* Store Quadword Conditional Indexed */
4662 case 231: /* Store Vector Indexed */
4663 case 487: /* Store Vector Indexed LRU */
4664 case 919: /* Store Floating-Point Double Pair Indexed */
6ec2b213
EBM
4665 case 396: /* Store VSX Vector Indexed */
4666 case 940: /* Store VSX Vector Halfword*8 Indexed */
4667 case 1004: /* Store VSX Vector Byte*16 Indexed */
b4cdae6f
WW
4668 size = 16;
4669 break;
4670 default:
4671 gdb_assert (0);
4672 }
4673
4674 /* Align address for Store Vector instructions. */
4675 switch (ext)
4676 {
4677 case 167: /* Store Vector Element Halfword Indexed */
4678 addr = addr & ~0x1ULL;
4679 break;
4680
4681 case 199: /* Store Vector Element Word Indexed */
4682 addr = addr & ~0x3ULL;
4683 break;
4684
4685 case 231: /* Store Vector Indexed */
4686 case 487: /* Store Vector Indexed LRU */
4687 addr = addr & ~0xfULL;
4688 break;
4689 }
4690
4691 record_full_arch_list_add_mem (addr, size);
4692 return 0;
4693
6ec2b213
EBM
4694 case 397: /* Store VSX Vector with Length */
4695 case 429: /* Store VSX Vector Left-justified with Length */
de678454 4696 ra = 0;
6ec2b213
EBM
4697 if (PPC_RA (insn) != 0)
4698 regcache_raw_read_unsigned (regcache,
de678454
EBM
4699 tdep->ppc_gp0_regnum + PPC_RA (insn), &ra);
4700 ea = ra;
6ec2b213
EBM
4701 regcache_raw_read_unsigned (regcache,
4702 tdep->ppc_gp0_regnum + PPC_RB (insn), &rb);
4703 /* Store up to 16 bytes. */
4704 nb = (rb & 0xff) > 16 ? 16 : (rb & 0xff);
4705 if (nb > 0)
4706 record_full_arch_list_add_mem (ea, nb);
4707 return 0;
4708
4709 case 710: /* Store Word Atomic */
4710 case 742: /* Store Doubleword Atomic */
de678454 4711 ra = 0;
6ec2b213
EBM
4712 if (PPC_RA (insn) != 0)
4713 regcache_raw_read_unsigned (regcache,
de678454
EBM
4714 tdep->ppc_gp0_regnum + PPC_RA (insn), &ra);
4715 ea = ra;
6ec2b213
EBM
4716 switch (ext)
4717 {
4718 case 710: /* Store Word Atomic */
4719 size = 8;
4720 break;
4721 case 742: /* Store Doubleword Atomic */
4722 size = 16;
4723 break;
4724 default:
4725 gdb_assert (0);
4726 }
4727 record_full_arch_list_add_mem (ea, size);
4728 return 0;
4729
b4cdae6f
WW
4730 case 725: /* Store String Word Immediate */
4731 ra = 0;
4732 if (PPC_RA (insn) != 0)
9f7efd5b
EBM
4733 regcache_raw_read_unsigned (regcache,
4734 tdep->ppc_gp0_regnum + PPC_RA (insn), &ra);
b4cdae6f
WW
4735 ea += ra;
4736
4737 nb = PPC_NB (insn);
4738 if (nb == 0)
4739 nb = 32;
4740
4741 record_full_arch_list_add_mem (ea, nb);
4742
4743 return 0;
4744
4745 case 661: /* Store String Word Indexed */
4746 ra = 0;
4747 if (PPC_RA (insn) != 0)
9f7efd5b
EBM
4748 regcache_raw_read_unsigned (regcache,
4749 tdep->ppc_gp0_regnum + PPC_RA (insn), &ra);
b4cdae6f
WW
4750 ea += ra;
4751
4752 regcache_raw_read_unsigned (regcache, tdep->ppc_xer_regnum, &xer);
4753 nb = PPC_XER_NB (xer);
4754
4755 if (nb != 0)
4756 {
9f7efd5b
EBM
4757 regcache_raw_read_unsigned (regcache,
4758 tdep->ppc_gp0_regnum + PPC_RB (insn),
4759 &rb);
b4cdae6f
WW
4760 ea += rb;
4761 record_full_arch_list_add_mem (ea, nb);
4762 }
4763
4764 return 0;
4765
4766 case 467: /* Move To Special Purpose Register */
4767 switch (PPC_SPR (insn))
4768 {
4769 case 1: /* XER */
4770 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4771 return 0;
4772 case 8: /* LR */
4773 record_full_arch_list_add_reg (regcache, tdep->ppc_lr_regnum);
4774 return 0;
4775 case 9: /* CTR */
4776 record_full_arch_list_add_reg (regcache, tdep->ppc_ctr_regnum);
4777 return 0;
4778 case 256: /* VRSAVE */
4779 record_full_arch_list_add_reg (regcache, tdep->ppc_vrsave_regnum);
4780 return 0;
4781 }
4782
4783 goto UNKNOWN_OP;
4784
4785 case 147: /* Move To Split Little Endian */
4786 record_full_arch_list_add_reg (regcache, tdep->ppc_ps_regnum);
4787 return 0;
4788
4789 case 512: /* Move to Condition Register from XER */
4790 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4791 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
4792 return 0;
4793
4794 case 4: /* Trap Word */
4795 case 68: /* Trap Doubleword */
4796 case 430: /* Clear BHRB */
4797 case 598: /* Synchronize */
4798 case 62: /* Wait for Interrupt */
6ec2b213 4799 case 30: /* Wait */
b4cdae6f
WW
4800 case 22: /* Instruction Cache Block Touch */
4801 case 854: /* Enforce In-order Execution of I/O */
4802 case 246: /* Data Cache Block Touch for Store */
4803 case 54: /* Data Cache Block Store */
4804 case 86: /* Data Cache Block Flush */
4805 case 278: /* Data Cache Block Touch */
4806 case 758: /* Data Cache Block Allocate */
4807 case 982: /* Instruction Cache Block Invalidate */
6ec2b213
EBM
4808 case 774: /* Copy */
4809 case 838: /* CP_Abort */
b4cdae6f
WW
4810 return 0;
4811
4812 case 654: /* Transaction Begin */
4813 case 686: /* Transaction End */
b4cdae6f
WW
4814 case 750: /* Transaction Suspend or Resume */
4815 case 782: /* Transaction Abort Word Conditional */
4816 case 814: /* Transaction Abort Doubleword Conditional */
4817 case 846: /* Transaction Abort Word Conditional Immediate */
4818 case 878: /* Transaction Abort Doubleword Conditional Immediate */
4819 case 910: /* Transaction Abort */
d44c67f3
EBM
4820 record_full_arch_list_add_reg (regcache, tdep->ppc_ps_regnum);
4821 /* FALL-THROUGH */
4822 case 718: /* Transaction Check */
4823 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4824 return 0;
b4cdae6f
WW
4825
4826 case 1014: /* Data Cache Block set to Zero */
4827 if (target_auxv_search (&current_target, AT_DCACHEBSIZE, &at_dcsz) <= 0
4828 || at_dcsz == 0)
4829 at_dcsz = 128; /* Assume 128-byte cache line size (POWER8) */
4830
bec734b2 4831 ra = 0;
b4cdae6f
WW
4832 if (PPC_RA (insn) != 0)
4833 regcache_raw_read_unsigned (regcache,
4834 tdep->ppc_gp0_regnum + PPC_RA (insn), &ra);
4835 regcache_raw_read_unsigned (regcache,
4836 tdep->ppc_gp0_regnum + PPC_RB (insn), &rb);
4837 ea = (ra + rb) & ~((ULONGEST) (at_dcsz - 1));
4838 record_full_arch_list_add_mem (ea, at_dcsz);
4839 return 0;
4840 }
4841
4842UNKNOWN_OP:
810c1026
WW
4843 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
4844 "at %s, 31-%d.\n", insn, paddress (gdbarch, addr), ext);
b4cdae6f
WW
4845 return -1;
4846}
4847
ddeca1df
WW
4848/* Parse and record instructions of primary opcode-59 at ADDR.
4849 Return 0 if successful. */
b4cdae6f
WW
4850
4851static int
4852ppc_process_record_op59 (struct gdbarch *gdbarch, struct regcache *regcache,
4853 CORE_ADDR addr, uint32_t insn)
4854{
4855 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4856 int ext = PPC_EXTOP (insn);
4857
4858 switch (ext & 0x1f)
4859 {
4860 case 18: /* Floating Divide */
4861 case 20: /* Floating Subtract */
4862 case 21: /* Floating Add */
4863 case 22: /* Floating Square Root */
4864 case 24: /* Floating Reciprocal Estimate */
4865 case 25: /* Floating Multiply */
4866 case 26: /* Floating Reciprocal Square Root Estimate */
4867 case 28: /* Floating Multiply-Subtract */
4868 case 29: /* Floating Multiply-Add */
4869 case 30: /* Floating Negative Multiply-Subtract */
4870 case 31: /* Floating Negative Multiply-Add */
4871 record_full_arch_list_add_reg (regcache,
4872 tdep->ppc_fp0_regnum + PPC_FRT (insn));
4873 if (PPC_RC (insn))
4874 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4875 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
4876
4877 return 0;
4878 }
4879
4880 switch (ext)
4881 {
4882 case 2: /* DFP Add */
4883 case 3: /* DFP Quantize */
4884 case 34: /* DFP Multiply */
4885 case 35: /* DFP Reround */
4886 case 67: /* DFP Quantize Immediate */
4887 case 99: /* DFP Round To FP Integer With Inexact */
4888 case 227: /* DFP Round To FP Integer Without Inexact */
4889 case 258: /* DFP Convert To DFP Long! */
4890 case 290: /* DFP Convert To Fixed */
4891 case 514: /* DFP Subtract */
4892 case 546: /* DFP Divide */
4893 case 770: /* DFP Round To DFP Short! */
4894 case 802: /* DFP Convert From Fixed */
4895 case 834: /* DFP Encode BCD To DPD */
4896 if (PPC_RC (insn))
4897 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4898 record_full_arch_list_add_reg (regcache,
4899 tdep->ppc_fp0_regnum + PPC_FRT (insn));
4900 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
4901 return 0;
4902
4903 case 130: /* DFP Compare Ordered */
4904 case 162: /* DFP Test Exponent */
4905 case 194: /* DFP Test Data Class */
4906 case 226: /* DFP Test Data Group */
4907 case 642: /* DFP Compare Unordered */
4908 case 674: /* DFP Test Significance */
6ec2b213 4909 case 675: /* DFP Test Significance Immediate */
b4cdae6f
WW
4910 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4911 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
4912 return 0;
4913
4914 case 66: /* DFP Shift Significand Left Immediate */
4915 case 98: /* DFP Shift Significand Right Immediate */
4916 case 322: /* DFP Decode DPD To BCD */
4917 case 354: /* DFP Extract Biased Exponent */
4918 case 866: /* DFP Insert Biased Exponent */
4919 record_full_arch_list_add_reg (regcache,
4920 tdep->ppc_fp0_regnum + PPC_FRT (insn));
4921 if (PPC_RC (insn))
4922 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4923 return 0;
4924
4925 case 846: /* Floating Convert From Integer Doubleword Single */
4926 case 974: /* Floating Convert From Integer Doubleword Unsigned
4927 Single */
4928 record_full_arch_list_add_reg (regcache,
4929 tdep->ppc_fp0_regnum + PPC_FRT (insn));
4930 if (PPC_RC (insn))
4931 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
4932 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
4933
4934 return 0;
4935 }
4936
810c1026
WW
4937 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
4938 "at %s, 59-%d.\n", insn, paddress (gdbarch, addr), ext);
b4cdae6f
WW
4939 return -1;
4940}
4941
ddeca1df
WW
4942/* Parse and record instructions of primary opcode-60 at ADDR.
4943 Return 0 if successful. */
b4cdae6f
WW
4944
4945static int
4946ppc_process_record_op60 (struct gdbarch *gdbarch, struct regcache *regcache,
4947 CORE_ADDR addr, uint32_t insn)
4948{
4949 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4950 int ext = PPC_EXTOP (insn);
b4cdae6f
WW
4951
4952 switch (ext >> 2)
4953 {
4954 case 0: /* VSX Scalar Add Single-Precision */
4955 case 32: /* VSX Scalar Add Double-Precision */
4956 case 24: /* VSX Scalar Divide Single-Precision */
4957 case 56: /* VSX Scalar Divide Double-Precision */
4958 case 176: /* VSX Scalar Copy Sign Double-Precision */
4959 case 33: /* VSX Scalar Multiply-Add Double-Precision */
4960 case 41: /* ditto */
4961 case 1: /* VSX Scalar Multiply-Add Single-Precision */
4962 case 9: /* ditto */
4963 case 160: /* VSX Scalar Maximum Double-Precision */
4964 case 168: /* VSX Scalar Minimum Double-Precision */
4965 case 49: /* VSX Scalar Multiply-Subtract Double-Precision */
4966 case 57: /* ditto */
4967 case 17: /* VSX Scalar Multiply-Subtract Single-Precision */
4968 case 25: /* ditto */
4969 case 48: /* VSX Scalar Multiply Double-Precision */
4970 case 16: /* VSX Scalar Multiply Single-Precision */
4971 case 161: /* VSX Scalar Negative Multiply-Add Double-Precision */
4972 case 169: /* ditto */
4973 case 129: /* VSX Scalar Negative Multiply-Add Single-Precision */
4974 case 137: /* ditto */
4975 case 177: /* VSX Scalar Negative Multiply-Subtract Double-Precision */
4976 case 185: /* ditto */
4977 case 145: /* VSX Scalar Negative Multiply-Subtract Single-Precision */
4978 case 153: /* ditto */
4979 case 40: /* VSX Scalar Subtract Double-Precision */
4980 case 8: /* VSX Scalar Subtract Single-Precision */
4981 case 96: /* VSX Vector Add Double-Precision */
4982 case 64: /* VSX Vector Add Single-Precision */
4983 case 120: /* VSX Vector Divide Double-Precision */
4984 case 88: /* VSX Vector Divide Single-Precision */
4985 case 97: /* VSX Vector Multiply-Add Double-Precision */
4986 case 105: /* ditto */
4987 case 65: /* VSX Vector Multiply-Add Single-Precision */
4988 case 73: /* ditto */
4989 case 224: /* VSX Vector Maximum Double-Precision */
4990 case 192: /* VSX Vector Maximum Single-Precision */
4991 case 232: /* VSX Vector Minimum Double-Precision */
4992 case 200: /* VSX Vector Minimum Single-Precision */
4993 case 113: /* VSX Vector Multiply-Subtract Double-Precision */
4994 case 121: /* ditto */
4995 case 81: /* VSX Vector Multiply-Subtract Single-Precision */
4996 case 89: /* ditto */
4997 case 112: /* VSX Vector Multiply Double-Precision */
4998 case 80: /* VSX Vector Multiply Single-Precision */
4999 case 225: /* VSX Vector Negative Multiply-Add Double-Precision */
5000 case 233: /* ditto */
5001 case 193: /* VSX Vector Negative Multiply-Add Single-Precision */
5002 case 201: /* ditto */
5003 case 241: /* VSX Vector Negative Multiply-Subtract Double-Precision */
5004 case 249: /* ditto */
5005 case 209: /* VSX Vector Negative Multiply-Subtract Single-Precision */
5006 case 217: /* ditto */
5007 case 104: /* VSX Vector Subtract Double-Precision */
5008 case 72: /* VSX Vector Subtract Single-Precision */
6ec2b213
EBM
5009 case 128: /* VSX Scalar Maximum Type-C Double-Precision */
5010 case 136: /* VSX Scalar Minimum Type-C Double-Precision */
5011 case 144: /* VSX Scalar Maximum Type-J Double-Precision */
5012 case 152: /* VSX Scalar Minimum Type-J Double-Precision */
5013 case 3: /* VSX Scalar Compare Equal Double-Precision */
5014 case 11: /* VSX Scalar Compare Greater Than Double-Precision */
5015 case 19: /* VSX Scalar Compare Greater Than or Equal
5016 Double-Precision */
b4cdae6f 5017 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
6ec2b213 5018 /* FALL-THROUGH */
b4cdae6f
WW
5019 case 240: /* VSX Vector Copy Sign Double-Precision */
5020 case 208: /* VSX Vector Copy Sign Single-Precision */
5021 case 130: /* VSX Logical AND */
5022 case 138: /* VSX Logical AND with Complement */
5023 case 186: /* VSX Logical Equivalence */
5024 case 178: /* VSX Logical NAND */
5025 case 170: /* VSX Logical OR with Complement */
5026 case 162: /* VSX Logical NOR */
5027 case 146: /* VSX Logical OR */
5028 case 154: /* VSX Logical XOR */
5029 case 18: /* VSX Merge High Word */
5030 case 50: /* VSX Merge Low Word */
5031 case 10: /* VSX Permute Doubleword Immediate (DM=0) */
5032 case 10 | 0x20: /* VSX Permute Doubleword Immediate (DM=1) */
5033 case 10 | 0x40: /* VSX Permute Doubleword Immediate (DM=2) */
5034 case 10 | 0x60: /* VSX Permute Doubleword Immediate (DM=3) */
5035 case 2: /* VSX Shift Left Double by Word Immediate (SHW=0) */
5036 case 2 | 0x20: /* VSX Shift Left Double by Word Immediate (SHW=1) */
5037 case 2 | 0x40: /* VSX Shift Left Double by Word Immediate (SHW=2) */
5038 case 2 | 0x60: /* VSX Shift Left Double by Word Immediate (SHW=3) */
6ec2b213
EBM
5039 case 216: /* VSX Vector Insert Exponent Single-Precision */
5040 case 248: /* VSX Vector Insert Exponent Double-Precision */
5041 case 26: /* VSX Vector Permute */
5042 case 58: /* VSX Vector Permute Right-indexed */
5043 case 213: /* VSX Vector Test Data Class Single-Precision (DC=0) */
5044 case 213 | 0x8: /* VSX Vector Test Data Class Single-Precision (DC=1) */
5045 case 245: /* VSX Vector Test Data Class Double-Precision (DC=0) */
5046 case 245 | 0x8: /* VSX Vector Test Data Class Double-Precision (DC=1) */
b4cdae6f
WW
5047 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5048 return 0;
5049
5050 case 61: /* VSX Scalar Test for software Divide Double-Precision */
5051 case 125: /* VSX Vector Test for software Divide Double-Precision */
5052 case 93: /* VSX Vector Test for software Divide Single-Precision */
5053 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5054 return 0;
5055
5056 case 35: /* VSX Scalar Compare Unordered Double-Precision */
5057 case 43: /* VSX Scalar Compare Ordered Double-Precision */
6ec2b213 5058 case 59: /* VSX Scalar Compare Exponents Double-Precision */
b4cdae6f
WW
5059 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5060 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5061 return 0;
5062 }
5063
5064 switch ((ext >> 2) & 0x7f) /* Mask out Rc-bit. */
5065 {
5066 case 99: /* VSX Vector Compare Equal To Double-Precision */
5067 case 67: /* VSX Vector Compare Equal To Single-Precision */
5068 case 115: /* VSX Vector Compare Greater Than or
5069 Equal To Double-Precision */
5070 case 83: /* VSX Vector Compare Greater Than or
5071 Equal To Single-Precision */
5072 case 107: /* VSX Vector Compare Greater Than Double-Precision */
5073 case 75: /* VSX Vector Compare Greater Than Single-Precision */
5074 if (PPC_Rc (insn))
5075 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5076 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5077 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5078 return 0;
5079 }
5080
5081 switch (ext >> 1)
5082 {
5083 case 265: /* VSX Scalar round Double-Precision to
5084 Single-Precision and Convert to
5085 Single-Precision format */
5086 case 344: /* VSX Scalar truncate Double-Precision to
5087 Integer and Convert to Signed Integer
5088 Doubleword format with Saturate */
5089 case 88: /* VSX Scalar truncate Double-Precision to
5090 Integer and Convert to Signed Integer Word
5091 Format with Saturate */
5092 case 328: /* VSX Scalar truncate Double-Precision integer
5093 and Convert to Unsigned Integer Doubleword
5094 Format with Saturate */
5095 case 72: /* VSX Scalar truncate Double-Precision to
5096 Integer and Convert to Unsigned Integer Word
5097 Format with Saturate */
5098 case 329: /* VSX Scalar Convert Single-Precision to
5099 Double-Precision format */
5100 case 376: /* VSX Scalar Convert Signed Integer
5101 Doubleword to floating-point format and
5102 Round to Double-Precision format */
5103 case 312: /* VSX Scalar Convert Signed Integer
5104 Doubleword to floating-point format and
5105 round to Single-Precision */
5106 case 360: /* VSX Scalar Convert Unsigned Integer
5107 Doubleword to floating-point format and
5108 Round to Double-Precision format */
5109 case 296: /* VSX Scalar Convert Unsigned Integer
5110 Doubleword to floating-point format and
5111 Round to Single-Precision */
5112 case 73: /* VSX Scalar Round to Double-Precision Integer
5113 Using Round to Nearest Away */
5114 case 107: /* VSX Scalar Round to Double-Precision Integer
5115 Exact using Current rounding mode */
5116 case 121: /* VSX Scalar Round to Double-Precision Integer
5117 Using Round toward -Infinity */
5118 case 105: /* VSX Scalar Round to Double-Precision Integer
5119 Using Round toward +Infinity */
5120 case 89: /* VSX Scalar Round to Double-Precision Integer
5121 Using Round toward Zero */
5122 case 90: /* VSX Scalar Reciprocal Estimate Double-Precision */
5123 case 26: /* VSX Scalar Reciprocal Estimate Single-Precision */
5124 case 281: /* VSX Scalar Round to Single-Precision */
5125 case 74: /* VSX Scalar Reciprocal Square Root Estimate
5126 Double-Precision */
5127 case 10: /* VSX Scalar Reciprocal Square Root Estimate
5128 Single-Precision */
5129 case 75: /* VSX Scalar Square Root Double-Precision */
5130 case 11: /* VSX Scalar Square Root Single-Precision */
5131 case 393: /* VSX Vector round Double-Precision to
5132 Single-Precision and Convert to
5133 Single-Precision format */
5134 case 472: /* VSX Vector truncate Double-Precision to
5135 Integer and Convert to Signed Integer
5136 Doubleword format with Saturate */
5137 case 216: /* VSX Vector truncate Double-Precision to
5138 Integer and Convert to Signed Integer Word
5139 Format with Saturate */
5140 case 456: /* VSX Vector truncate Double-Precision to
5141 Integer and Convert to Unsigned Integer
5142 Doubleword format with Saturate */
5143 case 200: /* VSX Vector truncate Double-Precision to
5144 Integer and Convert to Unsigned Integer Word
5145 Format with Saturate */
5146 case 457: /* VSX Vector Convert Single-Precision to
5147 Double-Precision format */
5148 case 408: /* VSX Vector truncate Single-Precision to
5149 Integer and Convert to Signed Integer
5150 Doubleword format with Saturate */
5151 case 152: /* VSX Vector truncate Single-Precision to
5152 Integer and Convert to Signed Integer Word
5153 Format with Saturate */
5154 case 392: /* VSX Vector truncate Single-Precision to
5155 Integer and Convert to Unsigned Integer
5156 Doubleword format with Saturate */
5157 case 136: /* VSX Vector truncate Single-Precision to
5158 Integer and Convert to Unsigned Integer Word
5159 Format with Saturate */
5160 case 504: /* VSX Vector Convert and round Signed Integer
5161 Doubleword to Double-Precision format */
5162 case 440: /* VSX Vector Convert and round Signed Integer
5163 Doubleword to Single-Precision format */
5164 case 248: /* VSX Vector Convert Signed Integer Word to
5165 Double-Precision format */
5166 case 184: /* VSX Vector Convert and round Signed Integer
5167 Word to Single-Precision format */
5168 case 488: /* VSX Vector Convert and round Unsigned
5169 Integer Doubleword to Double-Precision format */
5170 case 424: /* VSX Vector Convert and round Unsigned
5171 Integer Doubleword to Single-Precision format */
5172 case 232: /* VSX Vector Convert and round Unsigned
5173 Integer Word to Double-Precision format */
5174 case 168: /* VSX Vector Convert and round Unsigned
5175 Integer Word to Single-Precision format */
5176 case 201: /* VSX Vector Round to Double-Precision
5177 Integer using round to Nearest Away */
5178 case 235: /* VSX Vector Round to Double-Precision
5179 Integer Exact using Current rounding mode */
5180 case 249: /* VSX Vector Round to Double-Precision
5181 Integer using round toward -Infinity */
5182 case 233: /* VSX Vector Round to Double-Precision
5183 Integer using round toward +Infinity */
5184 case 217: /* VSX Vector Round to Double-Precision
5185 Integer using round toward Zero */
5186 case 218: /* VSX Vector Reciprocal Estimate Double-Precision */
5187 case 154: /* VSX Vector Reciprocal Estimate Single-Precision */
5188 case 137: /* VSX Vector Round to Single-Precision Integer
5189 Using Round to Nearest Away */
5190 case 171: /* VSX Vector Round to Single-Precision Integer
5191 Exact Using Current rounding mode */
5192 case 185: /* VSX Vector Round to Single-Precision Integer
5193 Using Round toward -Infinity */
5194 case 169: /* VSX Vector Round to Single-Precision Integer
5195 Using Round toward +Infinity */
5196 case 153: /* VSX Vector Round to Single-Precision Integer
5197 Using round toward Zero */
5198 case 202: /* VSX Vector Reciprocal Square Root Estimate
5199 Double-Precision */
5200 case 138: /* VSX Vector Reciprocal Square Root Estimate
5201 Single-Precision */
5202 case 203: /* VSX Vector Square Root Double-Precision */
5203 case 139: /* VSX Vector Square Root Single-Precision */
5204 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
6ec2b213 5205 /* FALL-THROUGH */
b4cdae6f
WW
5206 case 345: /* VSX Scalar Absolute Value Double-Precision */
5207 case 267: /* VSX Scalar Convert Scalar Single-Precision to
5208 Vector Single-Precision format Non-signalling */
5209 case 331: /* VSX Scalar Convert Single-Precision to
5210 Double-Precision format Non-signalling */
5211 case 361: /* VSX Scalar Negative Absolute Value Double-Precision */
5212 case 377: /* VSX Scalar Negate Double-Precision */
5213 case 473: /* VSX Vector Absolute Value Double-Precision */
5214 case 409: /* VSX Vector Absolute Value Single-Precision */
5215 case 489: /* VSX Vector Negative Absolute Value Double-Precision */
5216 case 425: /* VSX Vector Negative Absolute Value Single-Precision */
5217 case 505: /* VSX Vector Negate Double-Precision */
5218 case 441: /* VSX Vector Negate Single-Precision */
5219 case 164: /* VSX Splat Word */
6ec2b213
EBM
5220 case 165: /* VSX Vector Extract Unsigned Word */
5221 case 181: /* VSX Vector Insert Word */
b4cdae6f
WW
5222 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5223 return 0;
5224
6ec2b213
EBM
5225 case 298: /* VSX Scalar Test Data Class Single-Precision */
5226 case 362: /* VSX Scalar Test Data Class Double-Precision */
5227 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5228 /* FALL-THROUGH */
b4cdae6f
WW
5229 case 106: /* VSX Scalar Test for software Square Root
5230 Double-Precision */
5231 case 234: /* VSX Vector Test for software Square Root
5232 Double-Precision */
5233 case 170: /* VSX Vector Test for software Square Root
5234 Single-Precision */
5235 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5236 return 0;
6ec2b213
EBM
5237
5238 case 347:
5239 switch (PPC_FIELD (insn, 11, 5))
5240 {
5241 case 0: /* VSX Scalar Extract Exponent Double-Precision */
5242 case 1: /* VSX Scalar Extract Significand Double-Precision */
5243 record_full_arch_list_add_reg (regcache,
5244 tdep->ppc_gp0_regnum + PPC_RT (insn));
5245 return 0;
5246 case 16: /* VSX Scalar Convert Half-Precision format to
5247 Double-Precision format */
5248 case 17: /* VSX Scalar round & Convert Double-Precision format
5249 to Half-Precision format */
5250 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5251 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5252 return 0;
5253 }
5254 break;
5255
5256 case 475:
5257 switch (PPC_FIELD (insn, 11, 5))
5258 {
5259 case 24: /* VSX Vector Convert Half-Precision format to
5260 Single-Precision format */
5261 case 25: /* VSX Vector round and Convert Single-Precision format
5262 to Half-Precision format */
5263 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5264 /* FALL-THROUGH */
5265 case 0: /* VSX Vector Extract Exponent Double-Precision */
5266 case 1: /* VSX Vector Extract Significand Double-Precision */
5267 case 7: /* VSX Vector Byte-Reverse Halfword */
5268 case 8: /* VSX Vector Extract Exponent Single-Precision */
5269 case 9: /* VSX Vector Extract Significand Single-Precision */
5270 case 15: /* VSX Vector Byte-Reverse Word */
5271 case 23: /* VSX Vector Byte-Reverse Doubleword */
5272 case 31: /* VSX Vector Byte-Reverse Quadword */
5273 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5274 return 0;
5275 }
5276 break;
5277 }
5278
5279 switch (ext)
5280 {
5281 case 360: /* VSX Vector Splat Immediate Byte */
5282 if (PPC_FIELD (insn, 11, 2) == 0)
5283 {
5284 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5285 return 0;
5286 }
5287 break;
5288 case 918: /* VSX Scalar Insert Exponent Double-Precision */
5289 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5290 return 0;
b4cdae6f
WW
5291 }
5292
5293 if (((ext >> 3) & 0x3) == 3) /* VSX Select */
5294 {
5295 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5296 return 0;
5297 }
5298
810c1026
WW
5299 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
5300 "at %s, 60-%d.\n", insn, paddress (gdbarch, addr), ext);
b4cdae6f
WW
5301 return -1;
5302}
5303
6ec2b213
EBM
5304/* Parse and record instructions of primary opcode-61 at ADDR.
5305 Return 0 if successful. */
5306
5307static int
5308ppc_process_record_op61 (struct gdbarch *gdbarch, struct regcache *regcache,
5309 CORE_ADDR addr, uint32_t insn)
5310{
5311 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
5312 ULONGEST ea = 0;
5313 int size;
5314
5315 switch (insn & 0x3)
5316 {
5317 case 0: /* Store Floating-Point Double Pair */
5318 case 2: /* Store VSX Scalar Doubleword */
5319 case 3: /* Store VSX Scalar Single */
5320 if (PPC_RA (insn) != 0)
5321 regcache_raw_read_unsigned (regcache,
5322 tdep->ppc_gp0_regnum + PPC_RA (insn),
5323 &ea);
5324 ea += PPC_DS (insn) << 2;
5325 switch (insn & 0x3)
5326 {
5327 case 0: /* Store Floating-Point Double Pair */
5328 size = 16;
5329 break;
5330 case 2: /* Store VSX Scalar Doubleword */
5331 size = 8;
5332 break;
5333 case 3: /* Store VSX Scalar Single */
5334 size = 4;
5335 break;
5336 default:
5337 gdb_assert (0);
5338 }
5339 record_full_arch_list_add_mem (ea, size);
5340 return 0;
5341 }
5342
5343 switch (insn & 0x7)
5344 {
5345 case 1: /* Load VSX Vector */
5346 ppc_record_vsr (regcache, tdep, PPC_XT (insn));
5347 return 0;
5348 case 5: /* Store VSX Vector */
5349 if (PPC_RA (insn) != 0)
5350 regcache_raw_read_unsigned (regcache,
5351 tdep->ppc_gp0_regnum + PPC_RA (insn),
5352 &ea);
5353 ea += PPC_DQ (insn) << 4;
5354 record_full_arch_list_add_mem (ea, 16);
5355 return 0;
5356 }
5357
5358 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
5359 "at %s.\n", insn, paddress (gdbarch, addr));
5360 return -1;
5361}
5362
ddeca1df
WW
5363/* Parse and record instructions of primary opcode-63 at ADDR.
5364 Return 0 if successful. */
b4cdae6f
WW
5365
5366static int
5367ppc_process_record_op63 (struct gdbarch *gdbarch, struct regcache *regcache,
5368 CORE_ADDR addr, uint32_t insn)
5369{
5370 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
5371 int ext = PPC_EXTOP (insn);
5372 int tmp;
5373
5374 switch (ext & 0x1f)
5375 {
5376 case 18: /* Floating Divide */
5377 case 20: /* Floating Subtract */
5378 case 21: /* Floating Add */
5379 case 22: /* Floating Square Root */
5380 case 24: /* Floating Reciprocal Estimate */
5381 case 25: /* Floating Multiply */
5382 case 26: /* Floating Reciprocal Square Root Estimate */
5383 case 28: /* Floating Multiply-Subtract */
5384 case 29: /* Floating Multiply-Add */
5385 case 30: /* Floating Negative Multiply-Subtract */
5386 case 31: /* Floating Negative Multiply-Add */
5387 record_full_arch_list_add_reg (regcache,
5388 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5389 if (PPC_RC (insn))
5390 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5391 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5392 return 0;
5393
5394 case 23: /* Floating Select */
5395 record_full_arch_list_add_reg (regcache,
5396 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5397 if (PPC_RC (insn))
5398 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
8aabe2e2 5399 return 0;
b4cdae6f
WW
5400 }
5401
6ec2b213
EBM
5402 switch (ext & 0xff)
5403 {
5404 case 5: /* VSX Scalar Round to Quad-Precision Integer */
5405 case 37: /* VSX Scalar Round Quad-Precision to Double-Extended
5406 Precision */
5407 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5408 ppc_record_vsr (regcache, tdep, PPC_VRT (insn) + 32);
5409 return 0;
5410 }
5411
b4cdae6f
WW
5412 switch (ext)
5413 {
5414 case 2: /* DFP Add Quad */
5415 case 3: /* DFP Quantize Quad */
5416 case 34: /* DFP Multiply Quad */
5417 case 35: /* DFP Reround Quad */
5418 case 67: /* DFP Quantize Immediate Quad */
5419 case 99: /* DFP Round To FP Integer With Inexact Quad */
5420 case 227: /* DFP Round To FP Integer Without Inexact Quad */
5421 case 258: /* DFP Convert To DFP Extended Quad */
5422 case 514: /* DFP Subtract Quad */
5423 case 546: /* DFP Divide Quad */
5424 case 770: /* DFP Round To DFP Long Quad */
5425 case 802: /* DFP Convert From Fixed Quad */
5426 case 834: /* DFP Encode BCD To DPD Quad */
5427 if (PPC_RC (insn))
5428 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5429 tmp = tdep->ppc_fp0_regnum + (PPC_FRT (insn) & ~1);
5430 record_full_arch_list_add_reg (regcache, tmp);
5431 record_full_arch_list_add_reg (regcache, tmp + 1);
5432 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5433 return 0;
5434
5435 case 130: /* DFP Compare Ordered Quad */
5436 case 162: /* DFP Test Exponent Quad */
5437 case 194: /* DFP Test Data Class Quad */
5438 case 226: /* DFP Test Data Group Quad */
5439 case 642: /* DFP Compare Unordered Quad */
5440 case 674: /* DFP Test Significance Quad */
6ec2b213 5441 case 675: /* DFP Test Significance Immediate Quad */
b4cdae6f
WW
5442 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5443 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5444 return 0;
5445
5446 case 66: /* DFP Shift Significand Left Immediate Quad */
5447 case 98: /* DFP Shift Significand Right Immediate Quad */
5448 case 322: /* DFP Decode DPD To BCD Quad */
5449 case 866: /* DFP Insert Biased Exponent Quad */
5450 tmp = tdep->ppc_fp0_regnum + (PPC_FRT (insn) & ~1);
5451 record_full_arch_list_add_reg (regcache, tmp);
5452 record_full_arch_list_add_reg (regcache, tmp + 1);
5453 if (PPC_RC (insn))
5454 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5455 return 0;
5456
5457 case 290: /* DFP Convert To Fixed Quad */
5458 record_full_arch_list_add_reg (regcache,
5459 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5460 if (PPC_RC (insn))
5461 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5462 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
8aabe2e2 5463 return 0;
b4cdae6f
WW
5464
5465 case 354: /* DFP Extract Biased Exponent Quad */
5466 record_full_arch_list_add_reg (regcache,
5467 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5468 if (PPC_RC (insn))
5469 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5470 return 0;
5471
5472 case 12: /* Floating Round to Single-Precision */
5473 case 14: /* Floating Convert To Integer Word */
5474 case 15: /* Floating Convert To Integer Word
5475 with round toward Zero */
5476 case 142: /* Floating Convert To Integer Word Unsigned */
5477 case 143: /* Floating Convert To Integer Word Unsigned
5478 with round toward Zero */
5479 case 392: /* Floating Round to Integer Nearest */
5480 case 424: /* Floating Round to Integer Toward Zero */
5481 case 456: /* Floating Round to Integer Plus */
5482 case 488: /* Floating Round to Integer Minus */
5483 case 814: /* Floating Convert To Integer Doubleword */
5484 case 815: /* Floating Convert To Integer Doubleword
5485 with round toward Zero */
5486 case 846: /* Floating Convert From Integer Doubleword */
5487 case 942: /* Floating Convert To Integer Doubleword Unsigned */
5488 case 943: /* Floating Convert To Integer Doubleword Unsigned
5489 with round toward Zero */
5490 case 974: /* Floating Convert From Integer Doubleword Unsigned */
5491 record_full_arch_list_add_reg (regcache,
5492 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5493 if (PPC_RC (insn))
5494 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5495 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5496 return 0;
5497
6ec2b213
EBM
5498 case 583:
5499 switch (PPC_FIELD (insn, 11, 5))
5500 {
5501 case 1: /* Move From FPSCR & Clear Enables */
5502 case 20: /* Move From FPSCR Control & set DRN */
5503 case 21: /* Move From FPSCR Control & set DRN Immediate */
5504 case 22: /* Move From FPSCR Control & set RN */
5505 case 23: /* Move From FPSCR Control & set RN Immediate */
5506 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5507 case 0: /* Move From FPSCR */
5508 case 24: /* Move From FPSCR Lightweight */
5509 if (PPC_FIELD (insn, 11, 5) == 0 && PPC_RC (insn))
5510 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5511 record_full_arch_list_add_reg (regcache,
5512 tdep->ppc_fp0_regnum
5513 + PPC_FRT (insn));
5514 return 0;
5515 }
5516 break;
5517
b4cdae6f
WW
5518 case 8: /* Floating Copy Sign */
5519 case 40: /* Floating Negate */
5520 case 72: /* Floating Move Register */
5521 case 136: /* Floating Negative Absolute Value */
5522 case 264: /* Floating Absolute Value */
5523 record_full_arch_list_add_reg (regcache,
5524 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5525 if (PPC_RC (insn))
5526 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5527 return 0;
5528
5529 case 838: /* Floating Merge Odd Word */
5530 case 966: /* Floating Merge Even Word */
5531 record_full_arch_list_add_reg (regcache,
5532 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5533 return 0;
5534
5535 case 38: /* Move To FPSCR Bit 1 */
5536 case 70: /* Move To FPSCR Bit 0 */
5537 case 134: /* Move To FPSCR Field Immediate */
5538 case 711: /* Move To FPSCR Fields */
5539 if (PPC_RC (insn))
5540 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5541 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
8aabe2e2 5542 return 0;
b4cdae6f
WW
5543
5544 case 0: /* Floating Compare Unordered */
5545 case 32: /* Floating Compare Ordered */
5546 case 64: /* Move to Condition Register from FPSCR */
6ec2b213
EBM
5547 case 132: /* VSX Scalar Compare Ordered Quad-Precision */
5548 case 164: /* VSX Scalar Compare Exponents Quad-Precision */
5549 case 644: /* VSX Scalar Compare Unordered Quad-Precision */
5550 case 708: /* VSX Scalar Test Data Class Quad-Precision */
b4cdae6f
WW
5551 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5552 /* FALL-THROUGH */
5553 case 128: /* Floating Test for software Divide */
5554 case 160: /* Floating Test for software Square Root */
5555 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5556 return 0;
5557
6ec2b213
EBM
5558 case 4: /* VSX Scalar Add Quad-Precision */
5559 case 36: /* VSX Scalar Multiply Quad-Precision */
5560 case 388: /* VSX Scalar Multiply-Add Quad-Precision */
5561 case 420: /* VSX Scalar Multiply-Subtract Quad-Precision */
5562 case 452: /* VSX Scalar Negative Multiply-Add Quad-Precision */
5563 case 484: /* VSX Scalar Negative Multiply-Subtract
5564 Quad-Precision */
5565 case 516: /* VSX Scalar Subtract Quad-Precision */
5566 case 548: /* VSX Scalar Divide Quad-Precision */
5567 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5568 /* FALL-THROUGH */
5569 case 100: /* VSX Scalar Copy Sign Quad-Precision */
5570 case 868: /* VSX Scalar Insert Exponent Quad-Precision */
5571 ppc_record_vsr (regcache, tdep, PPC_VRT (insn) + 32);
5572 return 0;
5573
5574 case 804:
5575 switch (PPC_FIELD (insn, 11, 5))
5576 {
5577 case 27: /* VSX Scalar Square Root Quad-Precision */
5578 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5579 /* FALL-THROUGH */
5580 case 0: /* VSX Scalar Absolute Quad-Precision */
5581 case 2: /* VSX Scalar Extract Exponent Quad-Precision */
5582 case 8: /* VSX Scalar Negative Absolute Quad-Precision */
5583 case 16: /* VSX Scalar Negate Quad-Precision */
5584 case 18: /* VSX Scalar Extract Significand Quad-Precision */
5585 ppc_record_vsr (regcache, tdep, PPC_VRT (insn) + 32);
5586 return 0;
5587 }
5588 break;
5589
5590 case 836:
5591 switch (PPC_FIELD (insn, 11, 5))
5592 {
5593 case 1: /* VSX Scalar truncate & Convert Quad-Precision format
5594 to Unsigned Word format */
5595 case 2: /* VSX Scalar Convert Unsigned Doubleword format to
5596 Quad-Precision format */
5597 case 9: /* VSX Scalar truncate & Convert Quad-Precision format
5598 to Signed Word format */
5599 case 10: /* VSX Scalar Convert Signed Doubleword format to
5600 Quad-Precision format */
5601 case 17: /* VSX Scalar truncate & Convert Quad-Precision format
5602 to Unsigned Doubleword format */
5603 case 20: /* VSX Scalar round & Convert Quad-Precision format to
5604 Double-Precision format */
5605 case 22: /* VSX Scalar Convert Double-Precision format to
5606 Quad-Precision format */
5607 case 25: /* VSX Scalar truncate & Convert Quad-Precision format
5608 to Signed Doubleword format */
5609 record_full_arch_list_add_reg (regcache, tdep->ppc_fpscr_regnum);
5610 ppc_record_vsr (regcache, tdep, PPC_VRT (insn) + 32);
5611 return 0;
5612 }
b4cdae6f
WW
5613 }
5614
810c1026 5615 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
6ec2b213 5616 "at %s, 63-%d.\n", insn, paddress (gdbarch, addr), ext);
b4cdae6f
WW
5617 return -1;
5618}
5619
5620/* Parse the current instruction and record the values of the registers and
5621 memory that will be changed in current instruction to "record_arch_list".
5622 Return -1 if something wrong. */
5623
5624int
5625ppc_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
5626 CORE_ADDR addr)
5627{
5628 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
5629 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5630 uint32_t insn;
5631 int op6, tmp, i;
5632
5633 insn = read_memory_unsigned_integer (addr, 4, byte_order);
5634 op6 = PPC_OP6 (insn);
5635
5636 switch (op6)
5637 {
5638 case 2: /* Trap Doubleword Immediate */
5639 case 3: /* Trap Word Immediate */
5640 /* Do nothing. */
5641 break;
5642
5643 case 4:
5644 if (ppc_process_record_op4 (gdbarch, regcache, addr, insn) != 0)
5645 return -1;
5646 break;
5647
5648 case 17: /* System call */
5649 if (PPC_LEV (insn) != 0)
5650 goto UNKNOWN_OP;
5651
5652 if (tdep->ppc_syscall_record != NULL)
5653 {
5654 if (tdep->ppc_syscall_record (regcache) != 0)
5655 return -1;
5656 }
5657 else
5658 {
5659 printf_unfiltered (_("no syscall record support\n"));
5660 return -1;
5661 }
5662 break;
5663
5664 case 7: /* Multiply Low Immediate */
5665 record_full_arch_list_add_reg (regcache,
5666 tdep->ppc_gp0_regnum + PPC_RT (insn));
5667 break;
5668
5669 case 8: /* Subtract From Immediate Carrying */
5670 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
5671 record_full_arch_list_add_reg (regcache,
5672 tdep->ppc_gp0_regnum + PPC_RT (insn));
5673 break;
5674
5675 case 10: /* Compare Logical Immediate */
5676 case 11: /* Compare Immediate */
5677 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5678 break;
5679
5680 case 13: /* Add Immediate Carrying and Record */
5681 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5682 /* FALL-THROUGH */
5683 case 12: /* Add Immediate Carrying */
5684 record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
5685 /* FALL-THROUGH */
5686 case 14: /* Add Immediate */
5687 case 15: /* Add Immediate Shifted */
5688 record_full_arch_list_add_reg (regcache,
5689 tdep->ppc_gp0_regnum + PPC_RT (insn));
5690 break;
5691
5692 case 16: /* Branch Conditional */
5693 if ((PPC_BO (insn) & 0x4) == 0)
5694 record_full_arch_list_add_reg (regcache, tdep->ppc_ctr_regnum);
5695 /* FALL-THROUGH */
5696 case 18: /* Branch */
5697 if (PPC_LK (insn))
5698 record_full_arch_list_add_reg (regcache, tdep->ppc_lr_regnum);
5699 break;
5700
5701 case 19:
5702 if (ppc_process_record_op19 (gdbarch, regcache, addr, insn) != 0)
5703 return -1;
5704 break;
5705
5706 case 20: /* Rotate Left Word Immediate then Mask Insert */
5707 case 21: /* Rotate Left Word Immediate then AND with Mask */
5708 case 23: /* Rotate Left Word then AND with Mask */
5709 case 30: /* Rotate Left Doubleword Immediate then Clear Left */
5710 /* Rotate Left Doubleword Immediate then Clear Right */
5711 /* Rotate Left Doubleword Immediate then Clear */
5712 /* Rotate Left Doubleword then Clear Left */
5713 /* Rotate Left Doubleword then Clear Right */
5714 /* Rotate Left Doubleword Immediate then Mask Insert */
5715 if (PPC_RC (insn))
5716 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5717 record_full_arch_list_add_reg (regcache,
5718 tdep->ppc_gp0_regnum + PPC_RA (insn));
5719 break;
5720
5721 case 28: /* AND Immediate */
5722 case 29: /* AND Immediate Shifted */
5723 record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
5724 /* FALL-THROUGH */
5725 case 24: /* OR Immediate */
5726 case 25: /* OR Immediate Shifted */
5727 case 26: /* XOR Immediate */
5728 case 27: /* XOR Immediate Shifted */
5729 record_full_arch_list_add_reg (regcache,
5730 tdep->ppc_gp0_regnum + PPC_RA (insn));
5731 break;
5732
5733 case 31:
5734 if (ppc_process_record_op31 (gdbarch, regcache, addr, insn) != 0)
5735 return -1;
5736 break;
5737
5738 case 33: /* Load Word and Zero with Update */
5739 case 35: /* Load Byte and Zero with Update */
5740 case 41: /* Load Halfword and Zero with Update */
5741 case 43: /* Load Halfword Algebraic with Update */
5742 record_full_arch_list_add_reg (regcache,
5743 tdep->ppc_gp0_regnum + PPC_RA (insn));
5744 /* FALL-THROUGH */
5745 case 32: /* Load Word and Zero */
5746 case 34: /* Load Byte and Zero */
5747 case 40: /* Load Halfword and Zero */
5748 case 42: /* Load Halfword Algebraic */
5749 record_full_arch_list_add_reg (regcache,
5750 tdep->ppc_gp0_regnum + PPC_RT (insn));
5751 break;
5752
5753 case 46: /* Load Multiple Word */
5754 for (i = PPC_RT (insn); i < 32; i++)
5755 record_full_arch_list_add_reg (regcache, tdep->ppc_gp0_regnum + i);
5756 break;
5757
5758 case 56: /* Load Quadword */
5759 tmp = tdep->ppc_gp0_regnum + (PPC_RT (insn) & ~1);
5760 record_full_arch_list_add_reg (regcache, tmp);
5761 record_full_arch_list_add_reg (regcache, tmp + 1);
5762 break;
5763
5764 case 49: /* Load Floating-Point Single with Update */
5765 case 51: /* Load Floating-Point Double with Update */
5766 record_full_arch_list_add_reg (regcache,
5767 tdep->ppc_gp0_regnum + PPC_RA (insn));
5768 /* FALL-THROUGH */
5769 case 48: /* Load Floating-Point Single */
5770 case 50: /* Load Floating-Point Double */
5771 record_full_arch_list_add_reg (regcache,
5772 tdep->ppc_fp0_regnum + PPC_FRT (insn));
5773 break;
5774
5775 case 47: /* Store Multiple Word */
5776 {
5777 ULONGEST addr = 0;
5778
5779 if (PPC_RA (insn) != 0)
5780 regcache_raw_read_unsigned (regcache,
5781 tdep->ppc_gp0_regnum + PPC_RA (insn),
5782 &addr);
5783
5784 addr += PPC_D (insn);
5785 record_full_arch_list_add_mem (addr, 4 * (32 - PPC_RS (insn)));
5786 }
5787 break;
5788
5789 case 37: /* Store Word with Update */
5790 case 39: /* Store Byte with Update */
5791 case 45: /* Store Halfword with Update */
5792 case 53: /* Store Floating-Point Single with Update */
5793 case 55: /* Store Floating-Point Double with Update */
5794 record_full_arch_list_add_reg (regcache,
5795 tdep->ppc_gp0_regnum + PPC_RA (insn));
5796 /* FALL-THROUGH */
5797 case 36: /* Store Word */
5798 case 38: /* Store Byte */
5799 case 44: /* Store Halfword */
5800 case 52: /* Store Floating-Point Single */
5801 case 54: /* Store Floating-Point Double */
5802 {
5803 ULONGEST addr = 0;
5804 int size = -1;
5805
5806 if (PPC_RA (insn) != 0)
5807 regcache_raw_read_unsigned (regcache,
5808 tdep->ppc_gp0_regnum + PPC_RA (insn),
5809 &addr);
5810 addr += PPC_D (insn);
5811
5812 if (op6 == 36 || op6 == 37 || op6 == 52 || op6 == 53)
5813 size = 4;
5814 else if (op6 == 54 || op6 == 55)
5815 size = 8;
5816 else if (op6 == 44 || op6 == 45)
5817 size = 2;
5818 else if (op6 == 38 || op6 == 39)
5819 size = 1;
5820 else
5821 gdb_assert (0);
5822
5823 record_full_arch_list_add_mem (addr, size);
5824 }
5825 break;
5826
6ec2b213
EBM
5827 case 57:
5828 switch (insn & 0x3)
5829 {
5830 case 0: /* Load Floating-Point Double Pair */
5831 tmp = tdep->ppc_fp0_regnum + (PPC_RT (insn) & ~1);
5832 record_full_arch_list_add_reg (regcache, tmp);
5833 record_full_arch_list_add_reg (regcache, tmp + 1);
5834 break;
5835 case 2: /* Load VSX Scalar Doubleword */
5836 case 3: /* Load VSX Scalar Single */
5837 ppc_record_vsr (regcache, tdep, PPC_VRT (insn) + 32);
5838 break;
5839 default:
5840 goto UNKNOWN_OP;
5841 }
b4cdae6f
WW
5842 break;
5843
5844 case 58: /* Load Doubleword */
5845 /* Load Doubleword with Update */
5846 /* Load Word Algebraic */
5847 if (PPC_FIELD (insn, 30, 2) > 2)
5848 goto UNKNOWN_OP;
5849
5850 record_full_arch_list_add_reg (regcache,
5851 tdep->ppc_gp0_regnum + PPC_RT (insn));
5852 if (PPC_BIT (insn, 31))
5853 record_full_arch_list_add_reg (regcache,
5854 tdep->ppc_gp0_regnum + PPC_RA (insn));
5855 break;
5856
5857 case 59:
5858 if (ppc_process_record_op59 (gdbarch, regcache, addr, insn) != 0)
5859 return -1;
5860 break;
5861
5862 case 60:
5863 if (ppc_process_record_op60 (gdbarch, regcache, addr, insn) != 0)
5864 return -1;
5865 break;
5866
6ec2b213
EBM
5867 case 61:
5868 if (ppc_process_record_op61 (gdbarch, regcache, addr, insn) != 0)
5869 return -1;
5870 break;
5871
b4cdae6f
WW
5872 case 62: /* Store Doubleword */
5873 /* Store Doubleword with Update */
5874 /* Store Quadword with Update */
5875 {
5876 ULONGEST addr = 0;
5877 int size;
5878 int sub2 = PPC_FIELD (insn, 30, 2);
5879
6ec2b213 5880 if (sub2 > 2)
b4cdae6f
WW
5881 goto UNKNOWN_OP;
5882
5883 if (PPC_RA (insn) != 0)
5884 regcache_raw_read_unsigned (regcache,
5885 tdep->ppc_gp0_regnum + PPC_RA (insn),
5886 &addr);
5887
6ec2b213 5888 size = (sub2 == 2) ? 16 : 8;
b4cdae6f
WW
5889
5890 addr += PPC_DS (insn) << 2;
5891 record_full_arch_list_add_mem (addr, size);
5892
5893 if (op6 == 62 && sub2 == 1)
5894 record_full_arch_list_add_reg (regcache,
5895 tdep->ppc_gp0_regnum +
5896 PPC_RA (insn));
5897
5898 break;
5899 }
5900
5901 case 63:
5902 if (ppc_process_record_op63 (gdbarch, regcache, addr, insn) != 0)
5903 return -1;
5904 break;
5905
5906 default:
5907UNKNOWN_OP:
810c1026
WW
5908 fprintf_unfiltered (gdb_stdlog, "Warning: Don't know how to record %08x "
5909 "at %s, %d.\n", insn, paddress (gdbarch, addr), op6);
b4cdae6f
WW
5910 return -1;
5911 }
5912
5913 if (record_full_arch_list_add_reg (regcache, PPC_PC_REGNUM))
5914 return -1;
5915 if (record_full_arch_list_add_end ())
5916 return -1;
5917 return 0;
5918}
5919
7a78ae4e
ND
5920/* Initialize the current architecture based on INFO. If possible, re-use an
5921 architecture from ARCHES, which is a list of architectures already created
5922 during this debugging session.
c906108c 5923
7a78ae4e 5924 Called e.g. at program startup, when reading a core file, and when reading
64366f1c 5925 a binary file. */
c906108c 5926
7a78ae4e
ND
5927static struct gdbarch *
5928rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
5929{
5930 struct gdbarch *gdbarch;
5931 struct gdbarch_tdep *tdep;
7cc46491 5932 int wordsize, from_xcoff_exec, from_elf_exec;
7a78ae4e
ND
5933 enum bfd_architecture arch;
5934 unsigned long mach;
5935 bfd abfd;
55eddb0f
DJ
5936 enum auto_boolean soft_float_flag = powerpc_soft_float_global;
5937 int soft_float;
5938 enum powerpc_vector_abi vector_abi = powerpc_vector_abi_global;
cd453cd0 5939 enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO;
604c2f83
LM
5940 int have_fpu = 1, have_spe = 0, have_mq = 0, have_altivec = 0, have_dfp = 0,
5941 have_vsx = 0;
7cc46491
DJ
5942 int tdesc_wordsize = -1;
5943 const struct target_desc *tdesc = info.target_desc;
5944 struct tdesc_arch_data *tdesc_data = NULL;
f949c649 5945 int num_pseudoregs = 0;
604c2f83 5946 int cur_reg;
7a78ae4e 5947
f4d9bade
UW
5948 /* INFO may refer to a binary that is not of the PowerPC architecture,
5949 e.g. when debugging a stand-alone SPE executable on a Cell/B.E. system.
5950 In this case, we must not attempt to infer properties of the (PowerPC
5951 side) of the target system from properties of that executable. Trust
5952 the target description instead. */
5953 if (info.abfd
5954 && bfd_get_arch (info.abfd) != bfd_arch_powerpc
5955 && bfd_get_arch (info.abfd) != bfd_arch_rs6000)
5956 info.abfd = NULL;
5957
9aa1e687 5958 from_xcoff_exec = info.abfd && info.abfd->format == bfd_object &&
7a78ae4e
ND
5959 bfd_get_flavour (info.abfd) == bfd_target_xcoff_flavour;
5960
9aa1e687
KB
5961 from_elf_exec = info.abfd && info.abfd->format == bfd_object &&
5962 bfd_get_flavour (info.abfd) == bfd_target_elf_flavour;
5963
e712c1cf 5964 /* Check word size. If INFO is from a binary file, infer it from
64366f1c 5965 that, else choose a likely default. */
9aa1e687 5966 if (from_xcoff_exec)
c906108c 5967 {
11ed25ac 5968 if (bfd_xcoff_is_xcoff64 (info.abfd))
7a78ae4e
ND
5969 wordsize = 8;
5970 else
5971 wordsize = 4;
c906108c 5972 }
9aa1e687
KB
5973 else if (from_elf_exec)
5974 {
5975 if (elf_elfheader (info.abfd)->e_ident[EI_CLASS] == ELFCLASS64)
5976 wordsize = 8;
5977 else
5978 wordsize = 4;
5979 }
7cc46491
DJ
5980 else if (tdesc_has_registers (tdesc))
5981 wordsize = -1;
c906108c 5982 else
7a78ae4e 5983 {
27b15785 5984 if (info.bfd_arch_info != NULL && info.bfd_arch_info->bits_per_word != 0)
16d8013c
JB
5985 wordsize = (info.bfd_arch_info->bits_per_word
5986 / info.bfd_arch_info->bits_per_byte);
27b15785
KB
5987 else
5988 wordsize = 4;
7a78ae4e 5989 }
c906108c 5990
475bbd17
JB
5991 /* Get the architecture and machine from the BFD. */
5992 arch = info.bfd_arch_info->arch;
5993 mach = info.bfd_arch_info->mach;
5bf1c677
EZ
5994
5995 /* For e500 executables, the apuinfo section is of help here. Such
5996 section contains the identifier and revision number of each
5997 Application-specific Processing Unit that is present on the
5998 chip. The content of the section is determined by the assembler
5999 which looks at each instruction and determines which unit (and
74af9197
NF
6000 which version of it) can execute it. Grovel through the section
6001 looking for relevant e500 APUs. */
5bf1c677 6002
74af9197 6003 if (bfd_uses_spe_extensions (info.abfd))
5bf1c677 6004 {
74af9197
NF
6005 arch = info.bfd_arch_info->arch;
6006 mach = bfd_mach_ppc_e500;
6007 bfd_default_set_arch_mach (&abfd, arch, mach);
6008 info.bfd_arch_info = bfd_get_arch_info (&abfd);
5bf1c677
EZ
6009 }
6010
7cc46491
DJ
6011 /* Find a default target description which describes our register
6012 layout, if we do not already have one. */
6013 if (! tdesc_has_registers (tdesc))
6014 {
6015 const struct variant *v;
6016
6017 /* Choose variant. */
6018 v = find_variant_by_arch (arch, mach);
6019 if (!v)
6020 return NULL;
6021
6022 tdesc = *v->tdesc;
6023 }
6024
6025 gdb_assert (tdesc_has_registers (tdesc));
6026
6027 /* Check any target description for validity. */
6028 if (tdesc_has_registers (tdesc))
6029 {
6030 static const char *const gprs[] = {
6031 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6032 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6033 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6034 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6035 };
7cc46491
DJ
6036 const struct tdesc_feature *feature;
6037 int i, valid_p;
6038 static const char *const msr_names[] = { "msr", "ps" };
6039 static const char *const cr_names[] = { "cr", "cnd" };
6040 static const char *const ctr_names[] = { "ctr", "cnt" };
6041
6042 feature = tdesc_find_feature (tdesc,
6043 "org.gnu.gdb.power.core");
6044 if (feature == NULL)
6045 return NULL;
6046
6047 tdesc_data = tdesc_data_alloc ();
6048
6049 valid_p = 1;
6050 for (i = 0; i < ppc_num_gprs; i++)
6051 valid_p &= tdesc_numbered_register (feature, tdesc_data, i, gprs[i]);
6052 valid_p &= tdesc_numbered_register (feature, tdesc_data, PPC_PC_REGNUM,
6053 "pc");
6054 valid_p &= tdesc_numbered_register (feature, tdesc_data, PPC_LR_REGNUM,
6055 "lr");
6056 valid_p &= tdesc_numbered_register (feature, tdesc_data, PPC_XER_REGNUM,
6057 "xer");
6058
6059 /* Allow alternate names for these registers, to accomodate GDB's
6060 historic naming. */
6061 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
6062 PPC_MSR_REGNUM, msr_names);
6063 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
6064 PPC_CR_REGNUM, cr_names);
6065 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
6066 PPC_CTR_REGNUM, ctr_names);
6067
6068 if (!valid_p)
6069 {
6070 tdesc_data_cleanup (tdesc_data);
6071 return NULL;
6072 }
6073
6074 have_mq = tdesc_numbered_register (feature, tdesc_data, PPC_MQ_REGNUM,
6075 "mq");
6076
6077 tdesc_wordsize = tdesc_register_size (feature, "pc") / 8;
6078 if (wordsize == -1)
6079 wordsize = tdesc_wordsize;
6080
6081 feature = tdesc_find_feature (tdesc,
6082 "org.gnu.gdb.power.fpu");
6083 if (feature != NULL)
6084 {
6085 static const char *const fprs[] = {
6086 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
6087 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
6088 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
6089 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
6090 };
6091 valid_p = 1;
6092 for (i = 0; i < ppc_num_fprs; i++)
6093 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6094 PPC_F0_REGNUM + i, fprs[i]);
6095 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6096 PPC_FPSCR_REGNUM, "fpscr");
6097
6098 if (!valid_p)
6099 {
6100 tdesc_data_cleanup (tdesc_data);
6101 return NULL;
6102 }
6103 have_fpu = 1;
6104 }
6105 else
6106 have_fpu = 0;
6107
f949c649
TJB
6108 /* The DFP pseudo-registers will be available when there are floating
6109 point registers. */
6110 have_dfp = have_fpu;
6111
7cc46491
DJ
6112 feature = tdesc_find_feature (tdesc,
6113 "org.gnu.gdb.power.altivec");
6114 if (feature != NULL)
6115 {
6116 static const char *const vector_regs[] = {
6117 "vr0", "vr1", "vr2", "vr3", "vr4", "vr5", "vr6", "vr7",
6118 "vr8", "vr9", "vr10", "vr11", "vr12", "vr13", "vr14", "vr15",
6119 "vr16", "vr17", "vr18", "vr19", "vr20", "vr21", "vr22", "vr23",
6120 "vr24", "vr25", "vr26", "vr27", "vr28", "vr29", "vr30", "vr31"
6121 };
6122
6123 valid_p = 1;
6124 for (i = 0; i < ppc_num_gprs; i++)
6125 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6126 PPC_VR0_REGNUM + i,
6127 vector_regs[i]);
6128 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6129 PPC_VSCR_REGNUM, "vscr");
6130 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6131 PPC_VRSAVE_REGNUM, "vrsave");
6132
6133 if (have_spe || !valid_p)
6134 {
6135 tdesc_data_cleanup (tdesc_data);
6136 return NULL;
6137 }
6138 have_altivec = 1;
6139 }
6140 else
6141 have_altivec = 0;
6142
604c2f83
LM
6143 /* Check for POWER7 VSX registers support. */
6144 feature = tdesc_find_feature (tdesc,
6145 "org.gnu.gdb.power.vsx");
6146
6147 if (feature != NULL)
6148 {
6149 static const char *const vsx_regs[] = {
6150 "vs0h", "vs1h", "vs2h", "vs3h", "vs4h", "vs5h",
6151 "vs6h", "vs7h", "vs8h", "vs9h", "vs10h", "vs11h",
6152 "vs12h", "vs13h", "vs14h", "vs15h", "vs16h", "vs17h",
6153 "vs18h", "vs19h", "vs20h", "vs21h", "vs22h", "vs23h",
6154 "vs24h", "vs25h", "vs26h", "vs27h", "vs28h", "vs29h",
6155 "vs30h", "vs31h"
6156 };
6157
6158 valid_p = 1;
6159
6160 for (i = 0; i < ppc_num_vshrs; i++)
6161 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6162 PPC_VSR0_UPPER_REGNUM + i,
6163 vsx_regs[i]);
6164 if (!valid_p)
6165 {
6166 tdesc_data_cleanup (tdesc_data);
6167 return NULL;
6168 }
6169
6170 have_vsx = 1;
6171 }
6172 else
6173 have_vsx = 0;
6174
7cc46491
DJ
6175 /* On machines supporting the SPE APU, the general-purpose registers
6176 are 64 bits long. There are SIMD vector instructions to treat them
6177 as pairs of floats, but the rest of the instruction set treats them
6178 as 32-bit registers, and only operates on their lower halves.
6179
6180 In the GDB regcache, we treat their high and low halves as separate
6181 registers. The low halves we present as the general-purpose
6182 registers, and then we have pseudo-registers that stitch together
6183 the upper and lower halves and present them as pseudo-registers.
6184
6185 Thus, the target description is expected to supply the upper
6186 halves separately. */
6187
6188 feature = tdesc_find_feature (tdesc,
6189 "org.gnu.gdb.power.spe");
6190 if (feature != NULL)
6191 {
6192 static const char *const upper_spe[] = {
6193 "ev0h", "ev1h", "ev2h", "ev3h",
6194 "ev4h", "ev5h", "ev6h", "ev7h",
6195 "ev8h", "ev9h", "ev10h", "ev11h",
6196 "ev12h", "ev13h", "ev14h", "ev15h",
6197 "ev16h", "ev17h", "ev18h", "ev19h",
6198 "ev20h", "ev21h", "ev22h", "ev23h",
6199 "ev24h", "ev25h", "ev26h", "ev27h",
6200 "ev28h", "ev29h", "ev30h", "ev31h"
6201 };
6202
6203 valid_p = 1;
6204 for (i = 0; i < ppc_num_gprs; i++)
6205 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6206 PPC_SPE_UPPER_GP0_REGNUM + i,
6207 upper_spe[i]);
6208 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6209 PPC_SPE_ACC_REGNUM, "acc");
6210 valid_p &= tdesc_numbered_register (feature, tdesc_data,
6211 PPC_SPE_FSCR_REGNUM, "spefscr");
6212
6213 if (have_mq || have_fpu || !valid_p)
6214 {
6215 tdesc_data_cleanup (tdesc_data);
6216 return NULL;
6217 }
6218 have_spe = 1;
6219 }
6220 else
6221 have_spe = 0;
6222 }
6223
6224 /* If we have a 64-bit binary on a 32-bit target, complain. Also
6225 complain for a 32-bit binary on a 64-bit target; we do not yet
6226 support that. For instance, the 32-bit ABI routines expect
6227 32-bit GPRs.
6228
6229 As long as there isn't an explicit target description, we'll
6230 choose one based on the BFD architecture and get a word size
6231 matching the binary (probably powerpc:common or
6232 powerpc:common64). So there is only trouble if a 64-bit target
6233 supplies a 64-bit description while debugging a 32-bit
6234 binary. */
6235 if (tdesc_wordsize != -1 && tdesc_wordsize != wordsize)
6236 {
6237 tdesc_data_cleanup (tdesc_data);
6238 return NULL;
6239 }
6240
55eddb0f 6241#ifdef HAVE_ELF
cd453cd0
UW
6242 if (from_elf_exec)
6243 {
6244 switch (elf_elfheader (info.abfd)->e_flags & EF_PPC64_ABI)
6245 {
6246 case 1:
6247 elf_abi = POWERPC_ELF_V1;
6248 break;
6249 case 2:
6250 elf_abi = POWERPC_ELF_V2;
6251 break;
6252 default:
6253 break;
6254 }
6255 }
6256
55eddb0f
DJ
6257 if (soft_float_flag == AUTO_BOOLEAN_AUTO && from_elf_exec)
6258 {
6259 switch (bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_GNU,
6260 Tag_GNU_Power_ABI_FP))
6261 {
6262 case 1:
6263 soft_float_flag = AUTO_BOOLEAN_FALSE;
6264 break;
6265 case 2:
6266 soft_float_flag = AUTO_BOOLEAN_TRUE;
6267 break;
6268 default:
6269 break;
6270 }
6271 }
6272
6273 if (vector_abi == POWERPC_VEC_AUTO && from_elf_exec)
6274 {
6275 switch (bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_GNU,
6276 Tag_GNU_Power_ABI_Vector))
6277 {
6278 case 1:
6279 vector_abi = POWERPC_VEC_GENERIC;
6280 break;
6281 case 2:
6282 vector_abi = POWERPC_VEC_ALTIVEC;
6283 break;
6284 case 3:
6285 vector_abi = POWERPC_VEC_SPE;
6286 break;
6287 default:
6288 break;
6289 }
6290 }
6291#endif
6292
cd453cd0
UW
6293 /* At this point, the only supported ELF-based 64-bit little-endian
6294 operating system is GNU/Linux, and this uses the ELFv2 ABI by
6295 default. All other supported ELF-based operating systems use the
6296 ELFv1 ABI by default. Therefore, if the ABI marker is missing,
6297 e.g. because we run a legacy binary, or have attached to a process
6298 and have not found any associated binary file, set the default
6299 according to this heuristic. */
6300 if (elf_abi == POWERPC_ELF_AUTO)
6301 {
6302 if (wordsize == 8 && info.byte_order == BFD_ENDIAN_LITTLE)
6303 elf_abi = POWERPC_ELF_V2;
6304 else
6305 elf_abi = POWERPC_ELF_V1;
6306 }
6307
55eddb0f
DJ
6308 if (soft_float_flag == AUTO_BOOLEAN_TRUE)
6309 soft_float = 1;
6310 else if (soft_float_flag == AUTO_BOOLEAN_FALSE)
6311 soft_float = 0;
6312 else
6313 soft_float = !have_fpu;
6314
6315 /* If we have a hard float binary or setting but no floating point
6316 registers, downgrade to soft float anyway. We're still somewhat
6317 useful in this scenario. */
6318 if (!soft_float && !have_fpu)
6319 soft_float = 1;
6320
6321 /* Similarly for vector registers. */
6322 if (vector_abi == POWERPC_VEC_ALTIVEC && !have_altivec)
6323 vector_abi = POWERPC_VEC_GENERIC;
6324
6325 if (vector_abi == POWERPC_VEC_SPE && !have_spe)
6326 vector_abi = POWERPC_VEC_GENERIC;
6327
6328 if (vector_abi == POWERPC_VEC_AUTO)
6329 {
6330 if (have_altivec)
6331 vector_abi = POWERPC_VEC_ALTIVEC;
6332 else if (have_spe)
6333 vector_abi = POWERPC_VEC_SPE;
6334 else
6335 vector_abi = POWERPC_VEC_GENERIC;
6336 }
6337
6338 /* Do not limit the vector ABI based on available hardware, since we
6339 do not yet know what hardware we'll decide we have. Yuck! FIXME! */
6340
7cc46491
DJ
6341 /* Find a candidate among extant architectures. */
6342 for (arches = gdbarch_list_lookup_by_info (arches, &info);
6343 arches != NULL;
6344 arches = gdbarch_list_lookup_by_info (arches->next, &info))
6345 {
6346 /* Word size in the various PowerPC bfd_arch_info structs isn't
6347 meaningful, because 64-bit CPUs can run in 32-bit mode. So, perform
6348 separate word size check. */
6349 tdep = gdbarch_tdep (arches->gdbarch);
cd453cd0
UW
6350 if (tdep && tdep->elf_abi != elf_abi)
6351 continue;
55eddb0f
DJ
6352 if (tdep && tdep->soft_float != soft_float)
6353 continue;
6354 if (tdep && tdep->vector_abi != vector_abi)
6355 continue;
7cc46491
DJ
6356 if (tdep && tdep->wordsize == wordsize)
6357 {
6358 if (tdesc_data != NULL)
6359 tdesc_data_cleanup (tdesc_data);
6360 return arches->gdbarch;
6361 }
6362 }
6363
6364 /* None found, create a new architecture from INFO, whose bfd_arch_info
6365 validity depends on the source:
6366 - executable useless
6367 - rs6000_host_arch() good
6368 - core file good
6369 - "set arch" trust blindly
6370 - GDB startup useless but harmless */
6371
fc270c35 6372 tdep = XCNEW (struct gdbarch_tdep);
7cc46491 6373 tdep->wordsize = wordsize;
cd453cd0 6374 tdep->elf_abi = elf_abi;
55eddb0f
DJ
6375 tdep->soft_float = soft_float;
6376 tdep->vector_abi = vector_abi;
7cc46491 6377
7a78ae4e 6378 gdbarch = gdbarch_alloc (&info, tdep);
7a78ae4e 6379
7cc46491
DJ
6380 tdep->ppc_gp0_regnum = PPC_R0_REGNUM;
6381 tdep->ppc_toc_regnum = PPC_R0_REGNUM + 2;
6382 tdep->ppc_ps_regnum = PPC_MSR_REGNUM;
6383 tdep->ppc_cr_regnum = PPC_CR_REGNUM;
6384 tdep->ppc_lr_regnum = PPC_LR_REGNUM;
6385 tdep->ppc_ctr_regnum = PPC_CTR_REGNUM;
6386 tdep->ppc_xer_regnum = PPC_XER_REGNUM;
6387 tdep->ppc_mq_regnum = have_mq ? PPC_MQ_REGNUM : -1;
6388
6389 tdep->ppc_fp0_regnum = have_fpu ? PPC_F0_REGNUM : -1;
6390 tdep->ppc_fpscr_regnum = have_fpu ? PPC_FPSCR_REGNUM : -1;
604c2f83 6391 tdep->ppc_vsr0_upper_regnum = have_vsx ? PPC_VSR0_UPPER_REGNUM : -1;
7cc46491
DJ
6392 tdep->ppc_vr0_regnum = have_altivec ? PPC_VR0_REGNUM : -1;
6393 tdep->ppc_vrsave_regnum = have_altivec ? PPC_VRSAVE_REGNUM : -1;
6394 tdep->ppc_ev0_upper_regnum = have_spe ? PPC_SPE_UPPER_GP0_REGNUM : -1;
6395 tdep->ppc_acc_regnum = have_spe ? PPC_SPE_ACC_REGNUM : -1;
6396 tdep->ppc_spefscr_regnum = have_spe ? PPC_SPE_FSCR_REGNUM : -1;
6397
6398 set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM);
6399 set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1);
7cc46491 6400 set_gdbarch_fp0_regnum (gdbarch, tdep->ppc_fp0_regnum);
9f643768 6401 set_gdbarch_register_sim_regno (gdbarch, rs6000_register_sim_regno);
7cc46491
DJ
6402
6403 /* The XML specification for PowerPC sensibly calls the MSR "msr".
6404 GDB traditionally called it "ps", though, so let GDB add an
6405 alias. */
6406 set_gdbarch_ps_regnum (gdbarch, tdep->ppc_ps_regnum);
6407
4a7622d1 6408 if (wordsize == 8)
05580c65 6409 set_gdbarch_return_value (gdbarch, ppc64_sysv_abi_return_value);
afd48b75 6410 else
4a7622d1 6411 set_gdbarch_return_value (gdbarch, ppc_sysv_abi_return_value);
c8001721 6412
baffbae0
JB
6413 /* Set lr_frame_offset. */
6414 if (wordsize == 8)
6415 tdep->lr_frame_offset = 16;
baffbae0 6416 else
4a7622d1 6417 tdep->lr_frame_offset = 4;
baffbae0 6418
604c2f83 6419 if (have_spe || have_dfp || have_vsx)
7cc46491 6420 {
f949c649 6421 set_gdbarch_pseudo_register_read (gdbarch, rs6000_pseudo_register_read);
0df8b418
MS
6422 set_gdbarch_pseudo_register_write (gdbarch,
6423 rs6000_pseudo_register_write);
2a2fa07b
MK
6424 set_gdbarch_ax_pseudo_register_collect (gdbarch,
6425 rs6000_ax_pseudo_register_collect);
7cc46491 6426 }
1fcc0bb8 6427
a67914de
MK
6428 set_gdbarch_gen_return_address (gdbarch, rs6000_gen_return_address);
6429
e0d24f8d
WZ
6430 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
6431
56a6dfb9 6432 /* Select instruction printer. */
708ff411 6433 if (arch == bfd_arch_rs6000)
9364a0ef 6434 set_gdbarch_print_insn (gdbarch, print_insn_rs6000);
56a6dfb9 6435 else
9364a0ef 6436 set_gdbarch_print_insn (gdbarch, gdb_print_insn_powerpc);
7495d1dc 6437
5a9e69ba 6438 set_gdbarch_num_regs (gdbarch, PPC_NUM_REGS);
f949c649
TJB
6439
6440 if (have_spe)
6441 num_pseudoregs += 32;
6442 if (have_dfp)
6443 num_pseudoregs += 16;
604c2f83
LM
6444 if (have_vsx)
6445 /* Include both VSX and Extended FP registers. */
6446 num_pseudoregs += 96;
f949c649
TJB
6447
6448 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudoregs);
7a78ae4e
ND
6449
6450 set_gdbarch_ptr_bit (gdbarch, wordsize * TARGET_CHAR_BIT);
6451 set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
6452 set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
6453 set_gdbarch_long_bit (gdbarch, wordsize * TARGET_CHAR_BIT);
6454 set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
6455 set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
6456 set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4a7622d1 6457 set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
4e409299 6458 set_gdbarch_char_signed (gdbarch, 0);
7a78ae4e 6459
11269d7e 6460 set_gdbarch_frame_align (gdbarch, rs6000_frame_align);
4a7622d1 6461 if (wordsize == 8)
8b148df9
AC
6462 /* PPC64 SYSV. */
6463 set_gdbarch_frame_red_zone_size (gdbarch, 288);
7a78ae4e 6464
691d145a
JB
6465 set_gdbarch_convert_register_p (gdbarch, rs6000_convert_register_p);
6466 set_gdbarch_register_to_value (gdbarch, rs6000_register_to_value);
6467 set_gdbarch_value_to_register (gdbarch, rs6000_value_to_register);
6468
18ed0c4e
JB
6469 set_gdbarch_stab_reg_to_regnum (gdbarch, rs6000_stab_reg_to_regnum);
6470 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, rs6000_dwarf2_reg_to_regnum);
d217aaed 6471
4a7622d1 6472 if (wordsize == 4)
77b2b6d4 6473 set_gdbarch_push_dummy_call (gdbarch, ppc_sysv_abi_push_dummy_call);
4a7622d1 6474 else if (wordsize == 8)
8be9034a 6475 set_gdbarch_push_dummy_call (gdbarch, ppc64_sysv_abi_push_dummy_call);
7a78ae4e 6476
7a78ae4e 6477 set_gdbarch_skip_prologue (gdbarch, rs6000_skip_prologue);
c9cf6e20 6478 set_gdbarch_stack_frame_destroyed_p (gdbarch, rs6000_stack_frame_destroyed_p);
8ab3d180 6479 set_gdbarch_skip_main_prologue (gdbarch, rs6000_skip_main_prologue);
0d1243d9 6480
7a78ae4e 6481 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
04180708
YQ
6482
6483 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
6484 rs6000_breakpoint::kind_from_pc);
6485 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
6486 rs6000_breakpoint::bp_from_kind);
7a78ae4e 6487
203c3895 6488 /* The value of symbols of type N_SO and N_FUN maybe null when
0df8b418 6489 it shouldn't be. */
203c3895
UW
6490 set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
6491
ce5eab59 6492 /* Handles single stepping of atomic sequences. */
4a7622d1 6493 set_gdbarch_software_single_step (gdbarch, ppc_deal_with_atomic_sequence);
ce5eab59 6494
0df8b418 6495 /* Not sure on this. FIXMEmgo */
7a78ae4e
ND
6496 set_gdbarch_frame_args_skip (gdbarch, 8);
6497
143985b7
AF
6498 /* Helpers for function argument information. */
6499 set_gdbarch_fetch_pointer_argument (gdbarch, rs6000_fetch_pointer_argument);
6500
6f7f3f0d
UW
6501 /* Trampoline. */
6502 set_gdbarch_in_solib_return_trampoline
6503 (gdbarch, rs6000_in_solib_return_trampoline);
6504 set_gdbarch_skip_trampoline_code (gdbarch, rs6000_skip_trampoline_code);
6505
4fc771b8 6506 /* Hook in the DWARF CFI frame unwinder. */
1af5d7ce 6507 dwarf2_append_unwinders (gdbarch);
4fc771b8
DJ
6508 dwarf2_frame_set_adjust_regnum (gdbarch, rs6000_adjust_frame_regnum);
6509
9274a07c
LM
6510 /* Frame handling. */
6511 dwarf2_frame_set_init_reg (gdbarch, ppc_dwarf2_frame_init_reg);
6512
2454a024
UW
6513 /* Setup displaced stepping. */
6514 set_gdbarch_displaced_step_copy_insn (gdbarch,
7f03bd92 6515 ppc_displaced_step_copy_insn);
99e40580
UW
6516 set_gdbarch_displaced_step_hw_singlestep (gdbarch,
6517 ppc_displaced_step_hw_singlestep);
2454a024
UW
6518 set_gdbarch_displaced_step_fixup (gdbarch, ppc_displaced_step_fixup);
6519 set_gdbarch_displaced_step_free_closure (gdbarch,
6520 simple_displaced_step_free_closure);
6521 set_gdbarch_displaced_step_location (gdbarch,
6522 displaced_step_at_entry_point);
6523
6524 set_gdbarch_max_insn_length (gdbarch, PPC_INSN_SIZE);
6525
7b112f9c 6526 /* Hook in ABI-specific overrides, if they have been registered. */
8a4c2d24 6527 info.target_desc = tdesc;
ede5f151 6528 info.tdep_info = tdesc_data;
4be87837 6529 gdbarch_init_osabi (info, gdbarch);
7b112f9c 6530
61a65099
KB
6531 switch (info.osabi)
6532 {
f5aecab8 6533 case GDB_OSABI_LINUX:
61a65099
KB
6534 case GDB_OSABI_NETBSD_AOUT:
6535 case GDB_OSABI_NETBSD_ELF:
6536 case GDB_OSABI_UNKNOWN:
61a65099 6537 set_gdbarch_unwind_pc (gdbarch, rs6000_unwind_pc);
2608dbf8 6538 frame_unwind_append_unwinder (gdbarch, &rs6000_epilogue_frame_unwind);
1af5d7ce
UW
6539 frame_unwind_append_unwinder (gdbarch, &rs6000_frame_unwind);
6540 set_gdbarch_dummy_id (gdbarch, rs6000_dummy_id);
61a65099
KB
6541 frame_base_append_sniffer (gdbarch, rs6000_frame_base_sniffer);
6542 break;
6543 default:
61a65099 6544 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
81332287
KB
6545
6546 set_gdbarch_unwind_pc (gdbarch, rs6000_unwind_pc);
2608dbf8 6547 frame_unwind_append_unwinder (gdbarch, &rs6000_epilogue_frame_unwind);
1af5d7ce
UW
6548 frame_unwind_append_unwinder (gdbarch, &rs6000_frame_unwind);
6549 set_gdbarch_dummy_id (gdbarch, rs6000_dummy_id);
81332287 6550 frame_base_append_sniffer (gdbarch, rs6000_frame_base_sniffer);
61a65099
KB
6551 }
6552
7cc46491
DJ
6553 set_tdesc_pseudo_register_type (gdbarch, rs6000_pseudo_register_type);
6554 set_tdesc_pseudo_register_reggroup_p (gdbarch,
6555 rs6000_pseudo_register_reggroup_p);
6556 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
6557
6558 /* Override the normal target description method to make the SPE upper
6559 halves anonymous. */
6560 set_gdbarch_register_name (gdbarch, rs6000_register_name);
6561
604c2f83
LM
6562 /* Choose register numbers for all supported pseudo-registers. */
6563 tdep->ppc_ev0_regnum = -1;
6564 tdep->ppc_dl0_regnum = -1;
6565 tdep->ppc_vsr0_regnum = -1;
6566 tdep->ppc_efpr0_regnum = -1;
9f643768 6567
604c2f83
LM
6568 cur_reg = gdbarch_num_regs (gdbarch);
6569
6570 if (have_spe)
6571 {
6572 tdep->ppc_ev0_regnum = cur_reg;
6573 cur_reg += 32;
6574 }
6575 if (have_dfp)
6576 {
6577 tdep->ppc_dl0_regnum = cur_reg;
6578 cur_reg += 16;
6579 }
6580 if (have_vsx)
6581 {
6582 tdep->ppc_vsr0_regnum = cur_reg;
6583 cur_reg += 64;
6584 tdep->ppc_efpr0_regnum = cur_reg;
6585 cur_reg += 32;
6586 }
f949c649 6587
604c2f83
LM
6588 gdb_assert (gdbarch_num_regs (gdbarch)
6589 + gdbarch_num_pseudo_regs (gdbarch) == cur_reg);
f949c649 6590
debb1f09
JB
6591 /* Register the ravenscar_arch_ops. */
6592 if (mach == bfd_mach_ppc_e500)
6593 register_e500_ravenscar_ops (gdbarch);
6594 else
6595 register_ppc_ravenscar_ops (gdbarch);
6596
7a78ae4e 6597 return gdbarch;
c906108c
SS
6598}
6599
7b112f9c 6600static void
8b164abb 6601rs6000_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
7b112f9c 6602{
8b164abb 6603 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7b112f9c
JT
6604
6605 if (tdep == NULL)
6606 return;
6607
4be87837 6608 /* FIXME: Dump gdbarch_tdep. */
7b112f9c
JT
6609}
6610
55eddb0f
DJ
6611/* PowerPC-specific commands. */
6612
6613static void
6614set_powerpc_command (char *args, int from_tty)
6615{
6616 printf_unfiltered (_("\
6617\"set powerpc\" must be followed by an appropriate subcommand.\n"));
6618 help_list (setpowerpccmdlist, "set powerpc ", all_commands, gdb_stdout);
6619}
6620
6621static void
6622show_powerpc_command (char *args, int from_tty)
6623{
6624 cmd_show_list (showpowerpccmdlist, from_tty, "");
6625}
6626
6627static void
6628powerpc_set_soft_float (char *args, int from_tty,
6629 struct cmd_list_element *c)
6630{
6631 struct gdbarch_info info;
6632
6633 /* Update the architecture. */
6634 gdbarch_info_init (&info);
6635 if (!gdbarch_update_p (info))
9b20d036 6636 internal_error (__FILE__, __LINE__, _("could not update architecture"));
55eddb0f
DJ
6637}
6638
6639static void
6640powerpc_set_vector_abi (char *args, int from_tty,
6641 struct cmd_list_element *c)
6642{
6643 struct gdbarch_info info;
570dc176 6644 int vector_abi;
55eddb0f
DJ
6645
6646 for (vector_abi = POWERPC_VEC_AUTO;
6647 vector_abi != POWERPC_VEC_LAST;
6648 vector_abi++)
6649 if (strcmp (powerpc_vector_abi_string,
6650 powerpc_vector_strings[vector_abi]) == 0)
6651 {
aead7601 6652 powerpc_vector_abi_global = (enum powerpc_vector_abi) vector_abi;
55eddb0f
DJ
6653 break;
6654 }
6655
6656 if (vector_abi == POWERPC_VEC_LAST)
6657 internal_error (__FILE__, __LINE__, _("Invalid vector ABI accepted: %s."),
6658 powerpc_vector_abi_string);
6659
6660 /* Update the architecture. */
6661 gdbarch_info_init (&info);
6662 if (!gdbarch_update_p (info))
9b20d036 6663 internal_error (__FILE__, __LINE__, _("could not update architecture"));
55eddb0f
DJ
6664}
6665
e09342b5
TJB
6666/* Show the current setting of the exact watchpoints flag. */
6667
6668static void
6669show_powerpc_exact_watchpoints (struct ui_file *file, int from_tty,
6670 struct cmd_list_element *c,
6671 const char *value)
6672{
6673 fprintf_filtered (file, _("Use of exact watchpoints is %s.\n"), value);
6674}
6675
845d4708 6676/* Read a PPC instruction from memory. */
d78489bf
AT
6677
6678static unsigned int
845d4708 6679read_insn (struct frame_info *frame, CORE_ADDR pc)
d78489bf 6680{
845d4708
AM
6681 struct gdbarch *gdbarch = get_frame_arch (frame);
6682 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
6683
6684 return read_memory_unsigned_integer (pc, 4, byte_order);
d78489bf
AT
6685}
6686
6687/* Return non-zero if the instructions at PC match the series
6688 described in PATTERN, or zero otherwise. PATTERN is an array of
6689 'struct ppc_insn_pattern' objects, terminated by an entry whose
6690 mask is zero.
6691
6692 When the match is successful, fill INSN[i] with what PATTERN[i]
6693 matched. If PATTERN[i] is optional, and the instruction wasn't
6694 present, set INSN[i] to 0 (which is not a valid PPC instruction).
6695 INSN should have as many elements as PATTERN. Note that, if
6696 PATTERN contains optional instructions which aren't present in
6697 memory, then INSN will have holes, so INSN[i] isn't necessarily the
6698 i'th instruction in memory. */
6699
6700int
845d4708
AM
6701ppc_insns_match_pattern (struct frame_info *frame, CORE_ADDR pc,
6702 struct ppc_insn_pattern *pattern,
6703 unsigned int *insns)
d78489bf
AT
6704{
6705 int i;
845d4708 6706 unsigned int insn;
d78489bf 6707
845d4708 6708 for (i = 0, insn = 0; pattern[i].mask; i++)
d78489bf 6709 {
845d4708
AM
6710 if (insn == 0)
6711 insn = read_insn (frame, pc);
6712 insns[i] = 0;
6713 if ((insn & pattern[i].mask) == pattern[i].data)
6714 {
6715 insns[i] = insn;
6716 pc += 4;
6717 insn = 0;
6718 }
6719 else if (!pattern[i].optional)
d78489bf
AT
6720 return 0;
6721 }
6722
6723 return 1;
6724}
6725
6726/* Return the 'd' field of the d-form instruction INSN, properly
6727 sign-extended. */
6728
6729CORE_ADDR
6730ppc_insn_d_field (unsigned int insn)
6731{
6732 return ((((CORE_ADDR) insn & 0xffff) ^ 0x8000) - 0x8000);
6733}
6734
6735/* Return the 'ds' field of the ds-form instruction INSN, with the two
6736 zero bits concatenated at the right, and properly
6737 sign-extended. */
6738
6739CORE_ADDR
6740ppc_insn_ds_field (unsigned int insn)
6741{
6742 return ((((CORE_ADDR) insn & 0xfffc) ^ 0x8000) - 0x8000);
6743}
6744
c906108c
SS
6745/* Initialization code. */
6746
0df8b418
MS
6747/* -Wmissing-prototypes */
6748extern initialize_file_ftype _initialize_rs6000_tdep;
b9362cc7 6749
c906108c 6750void
fba45db2 6751_initialize_rs6000_tdep (void)
c906108c 6752{
7b112f9c
JT
6753 gdbarch_register (bfd_arch_rs6000, rs6000_gdbarch_init, rs6000_dump_tdep);
6754 gdbarch_register (bfd_arch_powerpc, rs6000_gdbarch_init, rs6000_dump_tdep);
7cc46491
DJ
6755
6756 /* Initialize the standard target descriptions. */
6757 initialize_tdesc_powerpc_32 ();
7284e1be 6758 initialize_tdesc_powerpc_altivec32 ();
604c2f83 6759 initialize_tdesc_powerpc_vsx32 ();
7cc46491
DJ
6760 initialize_tdesc_powerpc_403 ();
6761 initialize_tdesc_powerpc_403gc ();
4d09ffea 6762 initialize_tdesc_powerpc_405 ();
7cc46491
DJ
6763 initialize_tdesc_powerpc_505 ();
6764 initialize_tdesc_powerpc_601 ();
6765 initialize_tdesc_powerpc_602 ();
6766 initialize_tdesc_powerpc_603 ();
6767 initialize_tdesc_powerpc_604 ();
6768 initialize_tdesc_powerpc_64 ();
7284e1be 6769 initialize_tdesc_powerpc_altivec64 ();
604c2f83 6770 initialize_tdesc_powerpc_vsx64 ();
7cc46491
DJ
6771 initialize_tdesc_powerpc_7400 ();
6772 initialize_tdesc_powerpc_750 ();
6773 initialize_tdesc_powerpc_860 ();
6774 initialize_tdesc_powerpc_e500 ();
6775 initialize_tdesc_rs6000 ();
55eddb0f
DJ
6776
6777 /* Add root prefix command for all "set powerpc"/"show powerpc"
6778 commands. */
6779 add_prefix_cmd ("powerpc", no_class, set_powerpc_command,
6780 _("Various PowerPC-specific commands."),
6781 &setpowerpccmdlist, "set powerpc ", 0, &setlist);
6782
6783 add_prefix_cmd ("powerpc", no_class, show_powerpc_command,
6784 _("Various PowerPC-specific commands."),
6785 &showpowerpccmdlist, "show powerpc ", 0, &showlist);
6786
6787 /* Add a command to allow the user to force the ABI. */
6788 add_setshow_auto_boolean_cmd ("soft-float", class_support,
6789 &powerpc_soft_float_global,
6790 _("Set whether to use a soft-float ABI."),
6791 _("Show whether to use a soft-float ABI."),
6792 NULL,
6793 powerpc_set_soft_float, NULL,
6794 &setpowerpccmdlist, &showpowerpccmdlist);
6795
6796 add_setshow_enum_cmd ("vector-abi", class_support, powerpc_vector_strings,
6797 &powerpc_vector_abi_string,
6798 _("Set the vector ABI."),
6799 _("Show the vector ABI."),
6800 NULL, powerpc_set_vector_abi, NULL,
6801 &setpowerpccmdlist, &showpowerpccmdlist);
e09342b5
TJB
6802
6803 add_setshow_boolean_cmd ("exact-watchpoints", class_support,
6804 &target_exact_watchpoints,
6805 _("\
6806Set whether to use just one debug register for watchpoints on scalars."),
6807 _("\
6808Show whether to use just one debug register for watchpoints on scalars."),
6809 _("\
6810If true, GDB will use only one debug register when watching a variable of\n\
6811scalar type, thus assuming that the variable is accessed through the address\n\
6812of its first byte."),
6813 NULL, show_powerpc_exact_watchpoints,
6814 &setpowerpccmdlist, &showpowerpccmdlist);
c906108c 6815}
This page took 2.164102 seconds and 4 git commands to generate.