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