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