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