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