GDB (xrefs)
/tmp/gdb-8.1/gdb/spu-tdep.c
Go to the documentation of this file.
1 /* SPU target-dependent code for GDB, the GNU debugger.
2  Copyright (C) 2006-2018 Free Software Foundation, Inc.
3 
4  Contributed by Ulrich Weigand <uweigand@de.ibm.com>.
5  Based on a port by Sid Manning <sid@us.ibm.com>.
6 
7  This file is part of GDB.
8 
9  This program is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 3 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 
22 #include "defs.h"
23 #include "arch-utils.h"
24 #include "gdbtypes.h"
25 #include "gdbcmd.h"
26 #include "gdbcore.h"
27 #include "frame.h"
28 #include "frame-unwind.h"
29 #include "frame-base.h"
30 #include "trad-frame.h"
31 #include "symtab.h"
32 #include "symfile.h"
33 #include "value.h"
34 #include "inferior.h"
35 #include "dis-asm.h"
36 #include "disasm.h"
37 #include "objfiles.h"
38 #include "language.h"
39 #include "regcache.h"
40 #include "reggroups.h"
41 #include "block.h"
42 #include "observer.h"
43 #include "infcall.h"
44 #include "dwarf2.h"
45 #include "dwarf2-frame.h"
46 #include "ax.h"
47 #include "spu-tdep.h"
48 #include "location.h"
49 
50 /* The list of available "set spu " and "show spu " commands. */
51 static struct cmd_list_element *setspucmdlist = NULL;
52 static struct cmd_list_element *showspucmdlist = NULL;
53 
54 /* Whether to stop for new SPE contexts. */
55 static int spu_stop_on_load_p = 0;
56 /* Whether to automatically flush the SW-managed cache. */
57 static int spu_auto_flush_cache_p = 1;
58 
59 
60 /* The tdep structure. */
61 struct gdbarch_tdep
62 {
63  /* The spufs ID identifying our address space. */
64  int id;
65 
66  /* SPU-specific vector type. */
68 };
69 
70 
71 /* SPU-specific vector type. */
72 static struct type *
74 {
75  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
76 
77  if (!tdep->spu_builtin_type_vec128)
78  {
79  const struct builtin_type *bt = builtin_type (gdbarch);
80  struct type *t;
81 
83  "__spu_builtin_type_vec128", TYPE_CODE_UNION);
84  append_composite_type_field (t, "uint128", bt->builtin_int128);
85  append_composite_type_field (t, "v2_int64",
87  append_composite_type_field (t, "v4_int32",
89  append_composite_type_field (t, "v8_int16",
91  append_composite_type_field (t, "v16_int8",
92  init_vector_type (bt->builtin_int8, 16));
93  append_composite_type_field (t, "v2_double",
95  append_composite_type_field (t, "v4_float",
97 
98  TYPE_VECTOR (t) = 1;
99  TYPE_NAME (t) = "spu_builtin_type_vec128";
100 
101  tdep->spu_builtin_type_vec128 = t;
102  }
103 
104  return tdep->spu_builtin_type_vec128;
105 }
106 
107 
108 /* The list of available "info spu " commands. */
109 static struct cmd_list_element *infospucmdlist = NULL;
110 
111 /* Registers. */
112 
113 static const char *
114 spu_register_name (struct gdbarch *gdbarch, int reg_nr)
115 {
116  static const char *register_names[] =
117  {
118  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
119  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
120  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
121  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
122  "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
123  "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
124  "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
125  "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
126  "r64", "r65", "r66", "r67", "r68", "r69", "r70", "r71",
127  "r72", "r73", "r74", "r75", "r76", "r77", "r78", "r79",
128  "r80", "r81", "r82", "r83", "r84", "r85", "r86", "r87",
129  "r88", "r89", "r90", "r91", "r92", "r93", "r94", "r95",
130  "r96", "r97", "r98", "r99", "r100", "r101", "r102", "r103",
131  "r104", "r105", "r106", "r107", "r108", "r109", "r110", "r111",
132  "r112", "r113", "r114", "r115", "r116", "r117", "r118", "r119",
133  "r120", "r121", "r122", "r123", "r124", "r125", "r126", "r127",
134  "id", "pc", "sp", "fpscr", "srr0", "lslr", "decr", "decr_status"
135  };
136 
137  if (reg_nr < 0)
138  return NULL;
139  if (reg_nr >= sizeof register_names / sizeof *register_names)
140  return NULL;
141 
142  return register_names[reg_nr];
143 }
144 
145 static struct type *
146 spu_register_type (struct gdbarch *gdbarch, int reg_nr)
147 {
148  if (reg_nr < SPU_NUM_GPRS)
150 
151  switch (reg_nr)
152  {
153  case SPU_ID_REGNUM:
155 
156  case SPU_PC_REGNUM:
158 
159  case SPU_SP_REGNUM:
161 
162  case SPU_FPSCR_REGNUM:
164 
165  case SPU_SRR0_REGNUM:
167 
168  case SPU_LSLR_REGNUM:
170 
171  case SPU_DECR_REGNUM:
173 
176 
177  default:
178  internal_error (__FILE__, __LINE__, _("invalid regnum"));
179  }
180 }
181 
182 /* Pseudo registers for preferred slots - stack pointer. */
183 
184 static enum register_status
185 spu_pseudo_register_read_spu (struct regcache *regcache, const char *regname,
186  gdb_byte *buf)
187 {
188  struct gdbarch *gdbarch = regcache->arch ();
189  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
190  enum register_status status;
191  gdb_byte reg[32];
192  char annex[32];
193  ULONGEST id;
194  ULONGEST ul;
195 
197  if (status != REG_VALID)
198  return status;
199  xsnprintf (annex, sizeof annex, "%d/%s", (int) id, regname);
200  memset (reg, 0, sizeof reg);
202  reg, 0, sizeof reg);
203 
204  ul = strtoulst ((char *) reg, NULL, 16);
205  store_unsigned_integer (buf, 4, byte_order, ul);
206  return REG_VALID;
207 }
208 
209 static enum register_status
211  int regnum, gdb_byte *buf)
212 {
213  gdb_byte reg[16];
214  char annex[32];
215  ULONGEST id;
216  enum register_status status;
217 
218  switch (regnum)
219  {
220  case SPU_SP_REGNUM:
222  if (status != REG_VALID)
223  return status;
224  memcpy (buf, reg, 4);
225  return status;
226 
227  case SPU_FPSCR_REGNUM:
229  if (status != REG_VALID)
230  return status;
231  xsnprintf (annex, sizeof annex, "%d/fpcr", (int) id);
232  target_read (&current_target, TARGET_OBJECT_SPU, annex, buf, 0, 16);
233  return status;
234 
235  case SPU_SRR0_REGNUM:
236  return spu_pseudo_register_read_spu (regcache, "srr0", buf);
237 
238  case SPU_LSLR_REGNUM:
239  return spu_pseudo_register_read_spu (regcache, "lslr", buf);
240 
241  case SPU_DECR_REGNUM:
242  return spu_pseudo_register_read_spu (regcache, "decr", buf);
243 
245  return spu_pseudo_register_read_spu (regcache, "decr_status", buf);
246 
247  default:
248  internal_error (__FILE__, __LINE__, _("invalid regnum"));
249  }
250 }
251 
252 static void
253 spu_pseudo_register_write_spu (struct regcache *regcache, const char *regname,
254  const gdb_byte *buf)
255 {
256  struct gdbarch *gdbarch = regcache->arch ();
257  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
258  char reg[32];
259  char annex[32];
260  ULONGEST id;
261 
263  xsnprintf (annex, sizeof annex, "%d/%s", (int) id, regname);
264  xsnprintf (reg, sizeof reg, "0x%s",
267  (gdb_byte *) reg, 0, strlen (reg));
268 }
269 
270 static void
272  int regnum, const gdb_byte *buf)
273 {
274  gdb_byte reg[16];
275  char annex[32];
276  ULONGEST id;
277 
278  switch (regnum)
279  {
280  case SPU_SP_REGNUM:
282  memcpy (reg, buf, 4);
284  break;
285 
286  case SPU_FPSCR_REGNUM:
288  xsnprintf (annex, sizeof annex, "%d/fpcr", (int) id);
289  target_write (&current_target, TARGET_OBJECT_SPU, annex, buf, 0, 16);
290  break;
291 
292  case SPU_SRR0_REGNUM:
294  break;
295 
296  case SPU_LSLR_REGNUM:
298  break;
299 
300  case SPU_DECR_REGNUM:
302  break;
303 
305  spu_pseudo_register_write_spu (regcache, "decr_status", buf);
306  break;
307 
308  default:
309  internal_error (__FILE__, __LINE__, _("invalid regnum"));
310  }
311 }
312 
313 static int
315  struct agent_expr *ax, int regnum)
316 {
317  switch (regnum)
318  {
319  case SPU_SP_REGNUM:
321  return 0;
322 
323  case SPU_FPSCR_REGNUM:
324  case SPU_SRR0_REGNUM:
325  case SPU_LSLR_REGNUM:
326  case SPU_DECR_REGNUM:
328  return -1;
329 
330  default:
331  internal_error (__FILE__, __LINE__, _("invalid regnum"));
332  }
333 }
334 
335 static int
337  struct agent_expr *ax, int regnum)
338 {
339  switch (regnum)
340  {
341  case SPU_SP_REGNUM:
343  return 0;
344 
345  case SPU_FPSCR_REGNUM:
346  case SPU_SRR0_REGNUM:
347  case SPU_LSLR_REGNUM:
348  case SPU_DECR_REGNUM:
350  return -1;
351 
352  default:
353  internal_error (__FILE__, __LINE__, _("invalid regnum"));
354  }
355 }
356 
357 
358 /* Value conversion -- access scalar values at the preferred slot. */
359 
360 static struct value *
362  int regnum, struct frame_id frame_id)
363 {
365  regnum, frame_id);
366  LONGEST len = TYPE_LENGTH (type);
367 
368  if (regnum < SPU_NUM_GPRS && len < 16)
369  {
370  int preferred_slot = len < 4 ? 4 - len : 0;
371  set_value_offset (value, preferred_slot);
372  }
373 
374  return value;
375 }
376 
377 /* Register groups. */
378 
379 static int
381  struct reggroup *group)
382 {
383  /* Registers displayed via 'info regs'. */
384  if (group == general_reggroup)
385  return 1;
386 
387  /* Registers displayed via 'info float'. */
388  if (group == float_reggroup)
389  return 0;
390 
391  /* Registers that need to be saved/restored in order to
392  push or pop frames. */
393  if (group == save_reggroup || group == restore_reggroup)
394  return 1;
395 
396  return default_register_reggroup_p (gdbarch, regnum, group);
397 }
398 
399 /* DWARF-2 register numbers. */
400 
401 static int
403 {
404  /* Use cooked instead of raw SP. */
405  return (reg == SPU_RAW_SP_REGNUM)? SPU_SP_REGNUM : reg;
406 }
407 
408 
409 /* Address handling. */
410 
411 static int
413 {
414  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
415  int id = tdep->id;
416 
417  /* The objfile architecture of a standalone SPU executable does not
418  provide an SPU ID. Retrieve it from the objfile's relocated
419  address range in this special case. */
420  if (id == -1
421  && symfile_objfile && symfile_objfile->obfd
422  && bfd_get_arch (symfile_objfile->obfd) == bfd_arch_spu
423  && symfile_objfile->sections != symfile_objfile->sections_end)
424  id = SPUADDR_SPU (obj_section_addr (symfile_objfile->sections));
425 
426  return id;
427 }
428 
429 static int
430 spu_address_class_type_flags (int byte_size, int dwarf2_addr_class)
431 {
432  if (dwarf2_addr_class == 1)
434  else
435  return 0;
436 }
437 
438 static const char *
440 {
441  if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1)
442  return "__ea";
443  else
444  return NULL;
445 }
446 
447 static int
449  const char *name, int *type_flags_ptr)
450 {
451  if (strcmp (name, "__ea") == 0)
452  {
453  *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
454  return 1;
455  }
456  else
457  return 0;
458 }
459 
460 static void
462  struct type *type, gdb_byte *buf, CORE_ADDR addr)
463 {
464  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
465  store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order,
466  SPUADDR_ADDR (addr));
467 }
468 
469 static CORE_ADDR
471  struct type *type, const gdb_byte *buf)
472 {
473  int id = spu_gdbarch_id (gdbarch);
474  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
475  ULONGEST addr
476  = extract_unsigned_integer (buf, TYPE_LENGTH (type), byte_order);
477 
478  /* Do not convert __ea pointers. */
480  return addr;
481 
482  return addr? SPUADDR (id, addr) : 0;
483 }
484 
485 static CORE_ADDR
487  struct type *type, const gdb_byte *buf)
488 {
489  int id = spu_gdbarch_id (gdbarch);
490  ULONGEST addr = unpack_long (type, buf);
491 
492  return SPUADDR (id, addr);
493 }
494 
495 
496 /* Decoding SPU instructions. */
497 
498 enum
499  {
500  op_lqd = 0x34,
501  op_lqx = 0x3c4,
502  op_lqa = 0x61,
503  op_lqr = 0x67,
504  op_stqd = 0x24,
505  op_stqx = 0x144,
506  op_stqa = 0x41,
507  op_stqr = 0x47,
508 
509  op_il = 0x081,
510  op_ila = 0x21,
511  op_a = 0x0c0,
512  op_ai = 0x1c,
513 
514  op_selb = 0x8,
515 
516  op_br = 0x64,
517  op_bra = 0x60,
518  op_brsl = 0x66,
519  op_brasl = 0x62,
520  op_brnz = 0x42,
521  op_brz = 0x40,
522  op_brhnz = 0x46,
523  op_brhz = 0x44,
524  op_bi = 0x1a8,
525  op_bisl = 0x1a9,
526  op_biz = 0x128,
527  op_binz = 0x129,
528  op_bihz = 0x12a,
529  op_bihnz = 0x12b,
530  };
531 
532 static int
533 is_rr (unsigned int insn, int op, int *rt, int *ra, int *rb)
534 {
535  if ((insn >> 21) == op)
536  {
537  *rt = insn & 127;
538  *ra = (insn >> 7) & 127;
539  *rb = (insn >> 14) & 127;
540  return 1;
541  }
542 
543  return 0;
544 }
545 
546 static int
547 is_rrr (unsigned int insn, int op, int *rt, int *ra, int *rb, int *rc)
548 {
549  if ((insn >> 28) == op)
550  {
551  *rt = (insn >> 21) & 127;
552  *ra = (insn >> 7) & 127;
553  *rb = (insn >> 14) & 127;
554  *rc = insn & 127;
555  return 1;
556  }
557 
558  return 0;
559 }
560 
561 static int
562 is_ri7 (unsigned int insn, int op, int *rt, int *ra, int *i7)
563 {
564  if ((insn >> 21) == op)
565  {
566  *rt = insn & 127;
567  *ra = (insn >> 7) & 127;
568  *i7 = (((insn >> 14) & 127) ^ 0x40) - 0x40;
569  return 1;
570  }
571 
572  return 0;
573 }
574 
575 static int
576 is_ri10 (unsigned int insn, int op, int *rt, int *ra, int *i10)
577 {
578  if ((insn >> 24) == op)
579  {
580  *rt = insn & 127;
581  *ra = (insn >> 7) & 127;
582  *i10 = (((insn >> 14) & 0x3ff) ^ 0x200) - 0x200;
583  return 1;
584  }
585 
586  return 0;
587 }
588 
589 static int
590 is_ri16 (unsigned int insn, int op, int *rt, int *i16)
591 {
592  if ((insn >> 23) == op)
593  {
594  *rt = insn & 127;
595  *i16 = (((insn >> 7) & 0xffff) ^ 0x8000) - 0x8000;
596  return 1;
597  }
598 
599  return 0;
600 }
601 
602 static int
603 is_ri18 (unsigned int insn, int op, int *rt, int *i18)
604 {
605  if ((insn >> 25) == op)
606  {
607  *rt = insn & 127;
608  *i18 = (((insn >> 7) & 0x3ffff) ^ 0x20000) - 0x20000;
609  return 1;
610  }
611 
612  return 0;
613 }
614 
615 static int
616 is_branch (unsigned int insn, int *offset, int *reg)
617 {
618  int rt, i7, i16;
619 
620  if (is_ri16 (insn, op_br, &rt, &i16)
621  || is_ri16 (insn, op_brsl, &rt, &i16)
622  || is_ri16 (insn, op_brnz, &rt, &i16)
623  || is_ri16 (insn, op_brz, &rt, &i16)
624  || is_ri16 (insn, op_brhnz, &rt, &i16)
625  || is_ri16 (insn, op_brhz, &rt, &i16))
626  {
627  *reg = SPU_PC_REGNUM;
628  *offset = i16 << 2;
629  return 1;
630  }
631 
632  if (is_ri16 (insn, op_bra, &rt, &i16)
633  || is_ri16 (insn, op_brasl, &rt, &i16))
634  {
635  *reg = -1;
636  *offset = i16 << 2;
637  return 1;
638  }
639 
640  if (is_ri7 (insn, op_bi, &rt, reg, &i7)
641  || is_ri7 (insn, op_bisl, &rt, reg, &i7)
642  || is_ri7 (insn, op_biz, &rt, reg, &i7)
643  || is_ri7 (insn, op_binz, &rt, reg, &i7)
644  || is_ri7 (insn, op_bihz, &rt, reg, &i7)
645  || is_ri7 (insn, op_bihnz, &rt, reg, &i7))
646  {
647  *offset = 0;
648  return 1;
649  }
650 
651  return 0;
652 }
653 
654 
655 /* Prolog parsing. */
656 
658  {
659  /* Stack frame size. -1 if analysis was unsuccessful. */
660  int size;
661 
662  /* How to find the CFA. The CFA is equal to SP at function entry. */
663  int cfa_reg;
665 
666  /* Offset relative to CFA where a register is saved. -1 if invalid. */
668  };
669 
670 static CORE_ADDR
672  CORE_ADDR start_pc, CORE_ADDR end_pc,
673  struct spu_prologue_data *data)
674 {
675  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
676  int found_sp = 0;
677  int found_fp = 0;
678  int found_lr = 0;
679  int found_bc = 0;
680  int reg_immed[SPU_NUM_GPRS];
681  gdb_byte buf[16];
682  CORE_ADDR prolog_pc = start_pc;
683  CORE_ADDR pc;
684  int i;
685 
686 
687  /* Initialize DATA to default values. */
688  data->size = -1;
689 
690  data->cfa_reg = SPU_RAW_SP_REGNUM;
691  data->cfa_offset = 0;
692 
693  for (i = 0; i < SPU_NUM_GPRS; i++)
694  data->reg_offset[i] = -1;
695 
696  /* Set up REG_IMMED array. This is non-zero for a register if we know its
697  preferred slot currently holds this immediate value. */
698  for (i = 0; i < SPU_NUM_GPRS; i++)
699  reg_immed[i] = 0;
700 
701  /* Scan instructions until the first branch.
702 
703  The following instructions are important prolog components:
704 
705  - The first instruction to set up the stack pointer.
706  - The first instruction to set up the frame pointer.
707  - The first instruction to save the link register.
708  - The first instruction to save the backchain.
709 
710  We return the instruction after the latest of these four,
711  or the incoming PC if none is found. The first instruction
712  to set up the stack pointer also defines the frame size.
713 
714  Note that instructions saving incoming arguments to their stack
715  slots are not counted as important, because they are hard to
716  identify with certainty. This should not matter much, because
717  arguments are relevant only in code compiled with debug data,
718  and in such code the GDB core will advance until the first source
719  line anyway, using SAL data.
720 
721  For purposes of stack unwinding, we analyze the following types
722  of instructions in addition:
723 
724  - Any instruction adding to the current frame pointer.
725  - Any instruction loading an immediate constant into a register.
726  - Any instruction storing a register onto the stack.
727 
728  These are used to compute the CFA and REG_OFFSET output. */
729 
730  for (pc = start_pc; pc < end_pc; pc += 4)
731  {
732  unsigned int insn;
733  int rt, ra, rb, rc, immed;
734 
735  if (target_read_memory (pc, buf, 4))
736  break;
737  insn = extract_unsigned_integer (buf, 4, byte_order);
738 
739  /* AI is the typical instruction to set up a stack frame.
740  It is also used to initialize the frame pointer. */
741  if (is_ri10 (insn, op_ai, &rt, &ra, &immed))
742  {
743  if (rt == data->cfa_reg && ra == data->cfa_reg)
744  data->cfa_offset -= immed;
745 
746  if (rt == SPU_RAW_SP_REGNUM && ra == SPU_RAW_SP_REGNUM
747  && !found_sp)
748  {
749  found_sp = 1;
750  prolog_pc = pc + 4;
751 
752  data->size = -immed;
753  }
754  else if (rt == SPU_FP_REGNUM && ra == SPU_RAW_SP_REGNUM
755  && !found_fp)
756  {
757  found_fp = 1;
758  prolog_pc = pc + 4;
759 
760  data->cfa_reg = SPU_FP_REGNUM;
761  data->cfa_offset -= immed;
762  }
763  }
764 
765  /* A is used to set up stack frames of size >= 512 bytes.
766  If we have tracked the contents of the addend register,
767  we can handle this as well. */
768  else if (is_rr (insn, op_a, &rt, &ra, &rb))
769  {
770  if (rt == data->cfa_reg && ra == data->cfa_reg)
771  {
772  if (reg_immed[rb] != 0)
773  data->cfa_offset -= reg_immed[rb];
774  else
775  data->cfa_reg = -1; /* We don't know the CFA any more. */
776  }
777 
778  if (rt == SPU_RAW_SP_REGNUM && ra == SPU_RAW_SP_REGNUM
779  && !found_sp)
780  {
781  found_sp = 1;
782  prolog_pc = pc + 4;
783 
784  if (reg_immed[rb] != 0)
785  data->size = -reg_immed[rb];
786  }
787  }
788 
789  /* We need to track IL and ILA used to load immediate constants
790  in case they are later used as input to an A instruction. */
791  else if (is_ri16 (insn, op_il, &rt, &immed))
792  {
793  reg_immed[rt] = immed;
794 
795  if (rt == SPU_RAW_SP_REGNUM && !found_sp)
796  found_sp = 1;
797  }
798 
799  else if (is_ri18 (insn, op_ila, &rt, &immed))
800  {
801  reg_immed[rt] = immed & 0x3ffff;
802 
803  if (rt == SPU_RAW_SP_REGNUM && !found_sp)
804  found_sp = 1;
805  }
806 
807  /* STQD is used to save registers to the stack. */
808  else if (is_ri10 (insn, op_stqd, &rt, &ra, &immed))
809  {
810  if (ra == data->cfa_reg)
811  data->reg_offset[rt] = data->cfa_offset - (immed << 4);
812 
813  if (ra == data->cfa_reg && rt == SPU_LR_REGNUM
814  && !found_lr)
815  {
816  found_lr = 1;
817  prolog_pc = pc + 4;
818  }
819 
820  if (ra == SPU_RAW_SP_REGNUM
821  && (found_sp? immed == 0 : rt == SPU_RAW_SP_REGNUM)
822  && !found_bc)
823  {
824  found_bc = 1;
825  prolog_pc = pc + 4;
826  }
827  }
828 
829  /* _start uses SELB to set up the stack pointer. */
830  else if (is_rrr (insn, op_selb, &rt, &ra, &rb, &rc))
831  {
832  if (rt == SPU_RAW_SP_REGNUM && !found_sp)
833  found_sp = 1;
834  }
835 
836  /* We terminate if we find a branch. */
837  else if (is_branch (insn, &immed, &ra))
838  break;
839  }
840 
841 
842  /* If we successfully parsed until here, and didn't find any instruction
843  modifying SP, we assume we have a frameless function. */
844  if (!found_sp)
845  data->size = 0;
846 
847  /* Return cooked instead of raw SP. */
848  if (data->cfa_reg == SPU_RAW_SP_REGNUM)
849  data->cfa_reg = SPU_SP_REGNUM;
850 
851  return prolog_pc;
852 }
853 
854 /* Return the first instruction after the prologue starting at PC. */
855 static CORE_ADDR
857 {
858  struct spu_prologue_data data;
859  return spu_analyze_prologue (gdbarch, pc, (CORE_ADDR)-1, &data);
860 }
861 
862 /* Return the frame pointer in use at address PC. */
863 static void
865  int *reg, LONGEST *offset)
866 {
867  struct spu_prologue_data data;
868  spu_analyze_prologue (gdbarch, pc, (CORE_ADDR)-1, &data);
869 
870  if (data.size != -1 && data.cfa_reg != -1)
871  {
872  /* The 'frame pointer' address is CFA minus frame size. */
873  *reg = data.cfa_reg;
874  *offset = data.cfa_offset - data.size;
875  }
876  else
877  {
878  /* ??? We don't really know ... */
879  *reg = SPU_SP_REGNUM;
880  *offset = 0;
881  }
882 }
883 
884 /* Implement the stack_frame_destroyed_p gdbarch method.
885 
886  1) scan forward from the point of execution:
887  a) If you find an instruction that modifies the stack pointer
888  or transfers control (except a return), execution is not in
889  an epilogue, return.
890  b) Stop scanning if you find a return instruction or reach the
891  end of the function or reach the hard limit for the size of
892  an epilogue.
893  2) scan backward from the point of execution:
894  a) If you find an instruction that modifies the stack pointer,
895  execution *is* in an epilogue, return.
896  b) Stop scanning if you reach an instruction that transfers
897  control or the beginning of the function or reach the hard
898  limit for the size of an epilogue. */
899 
900 static int
902 {
903  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
904  CORE_ADDR scan_pc, func_start, func_end, epilogue_start, epilogue_end;
905  bfd_byte buf[4];
906  unsigned int insn;
907  int rt, ra, rb, immed;
908 
909  /* Find the search limits based on function boundaries and hard limit.
910  We assume the epilogue can be up to 64 instructions long. */
911 
912  const int spu_max_epilogue_size = 64 * 4;
913 
914  if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
915  return 0;
916 
917  if (pc - func_start < spu_max_epilogue_size)
918  epilogue_start = func_start;
919  else
920  epilogue_start = pc - spu_max_epilogue_size;
921 
922  if (func_end - pc < spu_max_epilogue_size)
923  epilogue_end = func_end;
924  else
925  epilogue_end = pc + spu_max_epilogue_size;
926 
927  /* Scan forward until next 'bi $0'. */
928 
929  for (scan_pc = pc; scan_pc < epilogue_end; scan_pc += 4)
930  {
931  if (target_read_memory (scan_pc, buf, 4))
932  return 0;
933  insn = extract_unsigned_integer (buf, 4, byte_order);
934 
935  if (is_branch (insn, &immed, &ra))
936  {
937  if (immed == 0 && ra == SPU_LR_REGNUM)
938  break;
939 
940  return 0;
941  }
942 
943  if (is_ri10 (insn, op_ai, &rt, &ra, &immed)
944  || is_rr (insn, op_a, &rt, &ra, &rb)
945  || is_ri10 (insn, op_lqd, &rt, &ra, &immed))
946  {
947  if (rt == SPU_RAW_SP_REGNUM)
948  return 0;
949  }
950  }
951 
952  if (scan_pc >= epilogue_end)
953  return 0;
954 
955  /* Scan backward until adjustment to stack pointer (R1). */
956 
957  for (scan_pc = pc - 4; scan_pc >= epilogue_start; scan_pc -= 4)
958  {
959  if (target_read_memory (scan_pc, buf, 4))
960  return 0;
961  insn = extract_unsigned_integer (buf, 4, byte_order);
962 
963  if (is_branch (insn, &immed, &ra))
964  return 0;
965 
966  if (is_ri10 (insn, op_ai, &rt, &ra, &immed)
967  || is_rr (insn, op_a, &rt, &ra, &rb)
968  || is_ri10 (insn, op_lqd, &rt, &ra, &immed))
969  {
970  if (rt == SPU_RAW_SP_REGNUM)
971  return 1;
972  }
973  }
974 
975  return 0;
976 }
977 
978 
979 /* Normal stack frames. */
980 
982 {
986 
988 };
989 
990 static struct spu_unwind_cache *
991 spu_frame_unwind_cache (struct frame_info *this_frame,
992  void **this_prologue_cache)
993 {
994  struct gdbarch *gdbarch = get_frame_arch (this_frame);
995  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
996  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
997  struct spu_unwind_cache *info;
998  struct spu_prologue_data data;
999  CORE_ADDR id = tdep->id;
1000  gdb_byte buf[16];
1001 
1002  if (*this_prologue_cache)
1003  return (struct spu_unwind_cache *) *this_prologue_cache;
1004 
1005  info = FRAME_OBSTACK_ZALLOC (struct spu_unwind_cache);
1006  *this_prologue_cache = info;
1007  info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1008  info->frame_base = 0;
1009  info->local_base = 0;
1010 
1011  /* Find the start of the current function, and analyze its prologue. */
1012  info->func = get_frame_func (this_frame);
1013  if (info->func == 0)
1014  {
1015  /* Fall back to using the current PC as frame ID. */
1016  info->func = get_frame_pc (this_frame);
1017  data.size = -1;
1018  }
1019  else
1020  spu_analyze_prologue (gdbarch, info->func, get_frame_pc (this_frame),
1021  &data);
1022 
1023  /* If successful, use prologue analysis data. */
1024  if (data.size != -1 && data.cfa_reg != -1)
1025  {
1026  CORE_ADDR cfa;
1027  int i;
1028 
1029  /* Determine CFA via unwound CFA_REG plus CFA_OFFSET. */
1030  get_frame_register (this_frame, data.cfa_reg, buf);
1031  cfa = extract_unsigned_integer (buf, 4, byte_order) + data.cfa_offset;
1032  cfa = SPUADDR (id, cfa);
1033 
1034  /* Call-saved register slots. */
1035  for (i = 0; i < SPU_NUM_GPRS; i++)
1036  if (i == SPU_LR_REGNUM
1037  || (i >= SPU_SAVED1_REGNUM && i <= SPU_SAVEDN_REGNUM))
1038  if (data.reg_offset[i] != -1)
1039  info->saved_regs[i].addr = cfa - data.reg_offset[i];
1040 
1041  /* Frame bases. */
1042  info->frame_base = cfa;
1043  info->local_base = cfa - data.size;
1044  }
1045 
1046  /* Otherwise, fall back to reading the backchain link. */
1047  else
1048  {
1049  CORE_ADDR reg;
1050  LONGEST backchain;
1051  ULONGEST lslr;
1052  int status;
1053 
1054  /* Get local store limit. */
1055  lslr = get_frame_register_unsigned (this_frame, SPU_LSLR_REGNUM);
1056  if (!lslr)
1057  lslr = (ULONGEST) -1;
1058 
1059  /* Get the backchain. */
1061  status = safe_read_memory_integer (SPUADDR (id, reg), 4, byte_order,
1062  &backchain);
1063 
1064  /* A zero backchain terminates the frame chain. Also, sanity
1065  check against the local store size limit. */
1066  if (status && backchain > 0 && backchain <= lslr)
1067  {
1068  /* Assume the link register is saved into its slot. */
1069  if (backchain + 16 <= lslr)
1070  info->saved_regs[SPU_LR_REGNUM].addr = SPUADDR (id,
1071  backchain + 16);
1072 
1073  /* Frame bases. */
1074  info->frame_base = SPUADDR (id, backchain);
1075  info->local_base = SPUADDR (id, reg);
1076  }
1077  }
1078 
1079  /* If we didn't find a frame, we cannot determine SP / return address. */
1080  if (info->frame_base == 0)
1081  return info;
1082 
1083  /* The previous SP is equal to the CFA. */
1085  SPUADDR_ADDR (info->frame_base));
1086 
1087  /* Read full contents of the unwound link register in order to
1088  be able to determine the return address. */
1090  target_read_memory (info->saved_regs[SPU_LR_REGNUM].addr, buf, 16);
1091  else
1092  get_frame_register (this_frame, SPU_LR_REGNUM, buf);
1093 
1094  /* Normally, the return address is contained in the slot 0 of the
1095  link register, and slots 1-3 are zero. For an overlay return,
1096  slot 0 contains the address of the overlay manager return stub,
1097  slot 1 contains the partition number of the overlay section to
1098  be returned to, and slot 2 contains the return address within
1099  that section. Return the latter address in that case. */
1100  if (extract_unsigned_integer (buf + 8, 4, byte_order) != 0)
1102  extract_unsigned_integer (buf + 8, 4, byte_order));
1103  else
1105  extract_unsigned_integer (buf, 4, byte_order));
1106 
1107  return info;
1108 }
1109 
1110 static void
1111 spu_frame_this_id (struct frame_info *this_frame,
1112  void **this_prologue_cache, struct frame_id *this_id)
1113 {
1114  struct spu_unwind_cache *info =
1115  spu_frame_unwind_cache (this_frame, this_prologue_cache);
1116 
1117  if (info->frame_base == 0)
1118  return;
1119 
1120  *this_id = frame_id_build (info->frame_base, info->func);
1121 }
1122 
1123 static struct value *
1125  void **this_prologue_cache, int regnum)
1126 {
1127  struct spu_unwind_cache *info
1128  = spu_frame_unwind_cache (this_frame, this_prologue_cache);
1129 
1130  /* Special-case the stack pointer. */
1131  if (regnum == SPU_RAW_SP_REGNUM)
1133 
1134  return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
1135 }
1136 
1137 static const struct frame_unwind spu_frame_unwind = {
1138  NORMAL_FRAME,
1142  NULL,
1144 };
1145 
1146 static CORE_ADDR
1147 spu_frame_base_address (struct frame_info *this_frame, void **this_cache)
1148 {
1149  struct spu_unwind_cache *info
1150  = spu_frame_unwind_cache (this_frame, this_cache);
1151  return info->local_base;
1152 }
1153 
1154 static const struct frame_base spu_frame_base = {
1159 };
1160 
1161 static CORE_ADDR
1162 spu_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
1163 {
1164  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1166  /* Mask off interrupt enable bit. */
1167  return SPUADDR (tdep->id, pc & -4);
1168 }
1169 
1170 static CORE_ADDR
1171 spu_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
1172 {
1173  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1175  return SPUADDR (tdep->id, sp);
1176 }
1177 
1178 static CORE_ADDR
1180 {
1181  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
1182  ULONGEST pc;
1184  /* Mask off interrupt enable bit. */
1185  return SPUADDR (tdep->id, pc & -4);
1186 }
1187 
1188 static void
1190 {
1191  /* Keep interrupt enabled state unchanged. */
1192  ULONGEST old_pc;
1193 
1196  (SPUADDR_ADDR (pc) & -4) | (old_pc & 3));
1197 }
1198 
1199 
1200 /* Cell/B.E. cross-architecture unwinder support. */
1201 
1203 {
1206 };
1207 
1208 static struct gdbarch *
1209 spu2ppu_prev_arch (struct frame_info *this_frame, void **this_cache)
1210 {
1211  struct spu2ppu_cache *cache = (struct spu2ppu_cache *) *this_cache;
1212  return cache->regcache->arch ();
1213 }
1214 
1215 static void
1216 spu2ppu_this_id (struct frame_info *this_frame,
1217  void **this_cache, struct frame_id *this_id)
1218 {
1219  struct spu2ppu_cache *cache = (struct spu2ppu_cache *) *this_cache;
1220  *this_id = cache->frame_id;
1221 }
1222 
1223 static struct value *
1224 spu2ppu_prev_register (struct frame_info *this_frame,
1225  void **this_cache, int regnum)
1226 {
1227  struct spu2ppu_cache *cache = (struct spu2ppu_cache *) *this_cache;
1228  struct gdbarch *gdbarch = cache->regcache->arch ();
1229  gdb_byte *buf;
1230 
1231  buf = (gdb_byte *) alloca (register_size (gdbarch, regnum));
1232  regcache_cooked_read (cache->regcache, regnum, buf);
1233  return frame_unwind_got_bytes (this_frame, regnum, buf);
1234 }
1235 
1236 static int
1237 spu2ppu_sniffer (const struct frame_unwind *self,
1238  struct frame_info *this_frame, void **this_prologue_cache)
1239 {
1240  struct gdbarch *gdbarch = get_frame_arch (this_frame);
1241  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1242  CORE_ADDR base, func, backchain;
1243  gdb_byte buf[4];
1244 
1245  if (gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_spu)
1246  return 0;
1247 
1248  base = get_frame_sp (this_frame);
1249  func = get_frame_pc (this_frame);
1250  if (target_read_memory (base, buf, 4))
1251  return 0;
1252  backchain = extract_unsigned_integer (buf, 4, byte_order);
1253 
1254  if (!backchain)
1255  {
1256  struct frame_info *fi;
1257 
1258  struct spu2ppu_cache *cache
1259  = FRAME_OBSTACK_CALLOC (1, struct spu2ppu_cache);
1260 
1261  cache->frame_id = frame_id_build (base + 16, func);
1262 
1263  for (fi = get_next_frame (this_frame); fi; fi = get_next_frame (fi))
1264  if (gdbarch_bfd_arch_info (get_frame_arch (fi))->arch != bfd_arch_spu)
1265  break;
1266 
1267  if (fi)
1268  {
1269  cache->regcache = frame_save_as_regcache (fi).release ();
1270  *this_prologue_cache = cache;
1271  return 1;
1272  }
1273  else
1274  {
1275  struct regcache *regcache;
1277  cache->regcache = regcache_dup (regcache);
1278  *this_prologue_cache = cache;
1279  return 1;
1280  }
1281  }
1282 
1283  return 0;
1284 }
1285 
1286 static void
1287 spu2ppu_dealloc_cache (struct frame_info *self, void *this_cache)
1288 {
1289  struct spu2ppu_cache *cache = (struct spu2ppu_cache *) this_cache;
1290  delete cache->regcache;
1291 }
1292 
1293 static const struct frame_unwind spu2ppu_unwind = {
1294  ARCH_FRAME,
1298  NULL,
1302 };
1303 
1304 
1305 /* Function calling convention. */
1306 
1307 static CORE_ADDR
1309 {
1310  return sp & ~15;
1311 }
1312 
1313 static CORE_ADDR
1315  struct value **args, int nargs, struct type *value_type,
1316  CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
1317  struct regcache *regcache)
1318 {
1319  /* Allocate space sufficient for a breakpoint, keeping the stack aligned. */
1320  sp = (sp - 4) & ~15;
1321  /* Store the address of that breakpoint */
1322  *bp_addr = sp;
1323  /* The call starts at the callee's entry point. */
1324  *real_pc = funaddr;
1325 
1326  return sp;
1327 }
1328 
1329 static int
1331 {
1332  switch (TYPE_CODE (type))
1333  {
1334  case TYPE_CODE_INT:
1335  case TYPE_CODE_ENUM:
1336  case TYPE_CODE_RANGE:
1337  case TYPE_CODE_CHAR:
1338  case TYPE_CODE_BOOL:
1339  case TYPE_CODE_PTR:
1340  case TYPE_CODE_REF:
1341  case TYPE_CODE_RVALUE_REF:
1342  return TYPE_LENGTH (type) <= 16;
1343 
1344  default:
1345  return 0;
1346  }
1347 }
1348 
1349 static void
1351  struct type *type, const gdb_byte *in)
1352 {
1353  int len = TYPE_LENGTH (type);
1354 
1355  if (spu_scalar_value_p (type))
1356  {
1357  int preferred_slot = len < 4 ? 4 - len : 0;
1358  regcache_cooked_write_part (regcache, regnum, preferred_slot, len, in);
1359  }
1360  else
1361  {
1362  while (len >= 16)
1363  {
1365  in += 16;
1366  len -= 16;
1367  }
1368 
1369  if (len > 0)
1371  }
1372 }
1373 
1374 static void
1376  struct type *type, gdb_byte *out)
1377 {
1378  int len = TYPE_LENGTH (type);
1379 
1380  if (spu_scalar_value_p (type))
1381  {
1382  int preferred_slot = len < 4 ? 4 - len : 0;
1383  regcache_cooked_read_part (regcache, regnum, preferred_slot, len, out);
1384  }
1385  else
1386  {
1387  while (len >= 16)
1388  {
1390  out += 16;
1391  len -= 16;
1392  }
1393 
1394  if (len > 0)
1395  regcache_cooked_read_part (regcache, regnum, 0, len, out);
1396  }
1397 }
1398 
1399 static CORE_ADDR
1400 spu_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
1401  struct regcache *regcache, CORE_ADDR bp_addr,
1402  int nargs, struct value **args, CORE_ADDR sp,
1403  int struct_return, CORE_ADDR struct_addr)
1404 {
1405  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1406  CORE_ADDR sp_delta;
1407  int i;
1408  int regnum = SPU_ARG1_REGNUM;
1409  int stack_arg = -1;
1410  gdb_byte buf[16];
1411 
1412  /* Set the return address. */
1413  memset (buf, 0, sizeof buf);
1414  store_unsigned_integer (buf, 4, byte_order, SPUADDR_ADDR (bp_addr));
1416 
1417  /* If STRUCT_RETURN is true, then the struct return address (in
1418  STRUCT_ADDR) will consume the first argument-passing register.
1419  Both adjust the register count and store that value. */
1420  if (struct_return)
1421  {
1422  memset (buf, 0, sizeof buf);
1423  store_unsigned_integer (buf, 4, byte_order, SPUADDR_ADDR (struct_addr));
1425  }
1426 
1427  /* Fill in argument registers. */
1428  for (i = 0; i < nargs; i++)
1429  {
1430  struct value *arg = args[i];
1431  struct type *type = check_typedef (value_type (arg));
1432  const gdb_byte *contents = value_contents (arg);
1433  int n_regs = align_up (TYPE_LENGTH (type), 16) / 16;
1434 
1435  /* If the argument doesn't wholly fit into registers, it and
1436  all subsequent arguments go to the stack. */
1437  if (regnum + n_regs - 1 > SPU_ARGN_REGNUM)
1438  {
1439  stack_arg = i;
1440  break;
1441  }
1442 
1443  spu_value_to_regcache (regcache, regnum, type, contents);
1444  regnum += n_regs;
1445  }
1446 
1447  /* Overflow arguments go to the stack. */
1448  if (stack_arg != -1)
1449  {
1450  CORE_ADDR ap;
1451 
1452  /* Allocate all required stack size. */
1453  for (i = stack_arg; i < nargs; i++)
1454  {
1455  struct type *type = check_typedef (value_type (args[i]));
1456  sp -= align_up (TYPE_LENGTH (type), 16);
1457  }
1458 
1459  /* Fill in stack arguments. */
1460  ap = sp;
1461  for (i = stack_arg; i < nargs; i++)
1462  {
1463  struct value *arg = args[i];
1464  struct type *type = check_typedef (value_type (arg));
1465  int len = TYPE_LENGTH (type);
1466  int preferred_slot;
1467 
1468  if (spu_scalar_value_p (type))
1469  preferred_slot = len < 4 ? 4 - len : 0;
1470  else
1471  preferred_slot = 0;
1472 
1473  target_write_memory (ap + preferred_slot, value_contents (arg), len);
1474  ap += align_up (TYPE_LENGTH (type), 16);
1475  }
1476  }
1477 
1478  /* Allocate stack frame header. */
1479  sp -= 32;
1480 
1481  /* Store stack back chain. */
1483  target_write_memory (sp, buf, 16);
1484 
1485  /* Finally, update all slots of the SP register. */
1486  sp_delta = sp - extract_unsigned_integer (buf, 4, byte_order);
1487  for (i = 0; i < 4; i++)
1488  {
1489  CORE_ADDR sp_slot = extract_unsigned_integer (buf + 4*i, 4, byte_order);
1490  store_unsigned_integer (buf + 4*i, 4, byte_order, sp_slot + sp_delta);
1491  }
1493 
1494  return sp;
1495 }
1496 
1497 static struct frame_id
1498 spu_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
1499 {
1500  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1503  return frame_id_build (SPUADDR (tdep->id, sp), SPUADDR (tdep->id, pc & -4));
1504 }
1505 
1506 /* Function return value access. */
1507 
1508 static enum return_value_convention
1509 spu_return_value (struct gdbarch *gdbarch, struct value *function,
1510  struct type *type, struct regcache *regcache,
1511  gdb_byte *out, const gdb_byte *in)
1512 {
1513  struct type *func_type = function ? value_type (function) : NULL;
1514  enum return_value_convention rvc;
1515  int opencl_vector = 0;
1516 
1517  if (func_type)
1518  {
1520 
1523 
1525  && TYPE_CALLING_CONVENTION (func_type) == DW_CC_GDB_IBM_OpenCL
1527  && TYPE_VECTOR (type))
1528  opencl_vector = 1;
1529  }
1530 
1531  if (TYPE_LENGTH (type) <= (SPU_ARGN_REGNUM - SPU_ARG1_REGNUM + 1) * 16)
1533  else
1535 
1536  if (in)
1537  {
1538  switch (rvc)
1539  {
1541  if (opencl_vector && TYPE_LENGTH (type) == 2)
1543  else
1545  break;
1546 
1548  error (_("Cannot set function return value."));
1549  break;
1550  }
1551  }
1552  else if (out)
1553  {
1554  switch (rvc)
1555  {
1557  if (opencl_vector && TYPE_LENGTH (type) == 2)
1559  else
1561  break;
1562 
1564  error (_("Function return value unknown."));
1565  break;
1566  }
1567  }
1568 
1569  return rvc;
1570 }
1571 
1572 
1573 /* Breakpoints. */
1574 constexpr gdb_byte spu_break_insn[] = { 0x00, 0x00, 0x3f, 0xff };
1575 
1576 typedef BP_MANIPULATION (spu_break_insn) spu_breakpoint;
1577 
1578 static int
1579 spu_memory_remove_breakpoint (struct gdbarch *gdbarch,
1580  struct bp_target_info *bp_tgt)
1581 {
1582  /* We work around a problem in combined Cell/B.E. debugging here. Consider
1583  that in a combined application, we have some breakpoints inserted in SPU
1584  code, and now the application forks (on the PPU side). GDB common code
1585  will assume that the fork system call copied all breakpoints into the new
1586  process' address space, and that all those copies now need to be removed
1587  (see breakpoint.c:detach_breakpoints).
1588 
1589  While this is certainly true for PPU side breakpoints, it is not true
1590  for SPU side breakpoints. fork will clone the SPU context file
1591  descriptors, so that all the existing SPU contexts are in accessible
1592  in the new process. However, the contents of the SPU contexts themselves
1593  are *not* cloned. Therefore the effect of detach_breakpoints is to
1594  remove SPU breakpoints from the *original* SPU context's local store
1595  -- this is not the correct behaviour.
1596 
1597  The workaround is to check whether the PID we are asked to remove this
1598  breakpoint from (i.e. ptid_get_pid (inferior_ptid)) is different from the
1599  PID of the current inferior (i.e. current_inferior ()->pid). This is only
1600  true in the context of detach_breakpoints. If so, we simply do nothing.
1601  [ Note that for the fork child process, it does not matter if breakpoints
1602  remain inserted, because those SPU contexts are not runnable anyway --
1603  the Linux kernel allows only the original process to invoke spu_run. */
1604 
1606  return 0;
1607 
1608  return default_memory_remove_breakpoint (gdbarch, bp_tgt);
1609 }
1610 
1611 
1612 /* Software single-stepping support. */
1613 
1614 static std::vector<CORE_ADDR>
1616 {
1617  struct gdbarch *gdbarch = regcache->arch ();
1618  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1619  CORE_ADDR pc, next_pc;
1620  unsigned int insn;
1621  int offset, reg;
1622  gdb_byte buf[4];
1623  ULONGEST lslr;
1624  std::vector<CORE_ADDR> next_pcs;
1625 
1626  pc = regcache_read_pc (regcache);
1627 
1628  if (target_read_memory (pc, buf, 4))
1629  throw_error (MEMORY_ERROR, _("Could not read instruction at %s."),
1630  paddress (gdbarch, pc));
1631 
1632  insn = extract_unsigned_integer (buf, 4, byte_order);
1633 
1634  /* Get local store limit. */
1636  != REG_VALID) || !lslr)
1637  lslr = (ULONGEST) -1;
1638 
1639  /* Next sequential instruction is at PC + 4, except if the current
1640  instruction is a PPE-assisted call, in which case it is at PC + 8.
1641  Wrap around LS limit to be on the safe side. */
1642  if ((insn & 0xffffff00) == 0x00002100)
1643  next_pc = (SPUADDR_ADDR (pc) + 8) & lslr;
1644  else
1645  next_pc = (SPUADDR_ADDR (pc) + 4) & lslr;
1646 
1647  next_pcs.push_back (SPUADDR (SPUADDR_SPU (pc), next_pc));
1648 
1649  if (is_branch (insn, &offset, &reg))
1650  {
1651  CORE_ADDR target = offset;
1652 
1653  if (reg == SPU_PC_REGNUM)
1654  target += SPUADDR_ADDR (pc);
1655  else if (reg != -1)
1656  {
1657  regcache_raw_read_part (regcache, reg, 0, 4, buf);
1658  target += extract_unsigned_integer (buf, 4, byte_order) & -4;
1659  }
1660 
1661  target = target & lslr;
1662  if (target != next_pc)
1663  next_pcs.push_back (SPUADDR (SPUADDR_SPU (pc), target));
1664  }
1665 
1666  return next_pcs;
1667 }
1668 
1669 
1670 /* Longjmp support. */
1671 
1672 static int
1674 {
1675  struct gdbarch *gdbarch = get_frame_arch (frame);
1676  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1677  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1678  gdb_byte buf[4];
1679  CORE_ADDR jb_addr;
1680  int optim, unavail;
1681 
1682  /* Jump buffer is pointed to by the argument register $r3. */
1683  if (!get_frame_register_bytes (frame, SPU_ARG1_REGNUM, 0, 4, buf,
1684  &optim, &unavail))
1685  return 0;
1686 
1687  jb_addr = extract_unsigned_integer (buf, 4, byte_order);
1688  if (target_read_memory (SPUADDR (tdep->id, jb_addr), buf, 4))
1689  return 0;
1690 
1691  *pc = extract_unsigned_integer (buf, 4, byte_order);
1692  *pc = SPUADDR (tdep->id, *pc);
1693  return 1;
1694 }
1695 
1696 
1697 /* Disassembler. */
1698 
1699 struct spu_dis_asm_info : disassemble_info
1700 {
1701  int id;
1702 };
1703 
1704 static void
1705 spu_dis_asm_print_address (bfd_vma addr, struct disassemble_info *info)
1706 {
1707  struct spu_dis_asm_info *data = (struct spu_dis_asm_info *) info;
1708  gdb_disassembler *di
1709  = static_cast<gdb_disassembler *>(info->application_data);
1710 
1711  print_address (di->arch (), SPUADDR (data->id, addr),
1712  (struct ui_file *) info->stream);
1713 }
1714 
1715 static int
1716 gdb_print_insn_spu (bfd_vma memaddr, struct disassemble_info *info)
1717 {
1718  /* The opcodes disassembler does 18-bit address arithmetic. Make
1719  sure the SPU ID encoded in the high bits is added back when we
1720  call print_address. */
1721  struct spu_dis_asm_info spu_info;
1722 
1723  memcpy (&spu_info, info, sizeof (*info));
1724  spu_info.id = SPUADDR_SPU (memaddr);
1725  spu_info.print_address_func = spu_dis_asm_print_address;
1726  return default_print_insn (memaddr, &spu_info);
1727 }
1728 
1729 
1730 /* Target overlays for the SPU overlay manager.
1731 
1732  See the documentation of simple_overlay_update for how the
1733  interface is supposed to work.
1734 
1735  Data structures used by the overlay manager:
1736 
1737  struct ovly_table
1738  {
1739  u32 vma;
1740  u32 size;
1741  u32 pos;
1742  u32 buf;
1743  } _ovly_table[]; -- one entry per overlay section
1744 
1745  struct ovly_buf_table
1746  {
1747  u32 mapped;
1748  } _ovly_buf_table[]; -- one entry per overlay buffer
1749 
1750  _ovly_table should never change.
1751 
1752  Both tables are aligned to a 16-byte boundary, the symbols
1753  _ovly_table and _ovly_buf_table are of type STT_OBJECT and their
1754  size set to the size of the respective array. buf in _ovly_table is
1755  an index into _ovly_buf_table.
1756 
1757  mapped is an index into _ovly_table. Both the mapped and buf indices start
1758  from one to reference the first entry in their respective tables. */
1759 
1760 /* Using the per-objfile private data mechanism, we store for each
1761  objfile an array of "struct spu_overlay_table" structures, one
1762  for each obj_section of the objfile. This structure holds two
1763  fields, MAPPED_PTR and MAPPED_VAL. If MAPPED_PTR is zero, this
1764  is *not* an overlay section. If it is non-zero, it represents
1765  a target address. The overlay section is mapped iff the target
1766  integer at this location equals MAPPED_VAL. */
1767 
1768 static const struct objfile_data *spu_overlay_data;
1769 
1771  {
1774  };
1775 
1776 /* Retrieve the overlay table for OBJFILE. If not already cached, read
1777  the _ovly_table data structure from the target and initialize the
1778  spu_overlay_table data structure from it. */
1779 static struct spu_overlay_table *
1781 {
1782  enum bfd_endian byte_order = bfd_big_endian (objfile->obfd)?
1783  BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
1784  struct bound_minimal_symbol ovly_table_msym, ovly_buf_table_msym;
1785  CORE_ADDR ovly_table_base, ovly_buf_table_base;
1786  unsigned ovly_table_size, ovly_buf_table_size;
1787  struct spu_overlay_table *tbl;
1788  struct obj_section *osect;
1789  gdb_byte *ovly_table;
1790  int i;
1791 
1792  tbl = (struct spu_overlay_table *) objfile_data (objfile, spu_overlay_data);
1793  if (tbl)
1794  return tbl;
1795 
1796  ovly_table_msym = lookup_minimal_symbol ("_ovly_table", NULL, objfile);
1797  if (!ovly_table_msym.minsym)
1798  return NULL;
1799 
1800  ovly_buf_table_msym = lookup_minimal_symbol ("_ovly_buf_table",
1801  NULL, objfile);
1802  if (!ovly_buf_table_msym.minsym)
1803  return NULL;
1804 
1805  ovly_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_table_msym);
1806  ovly_table_size = MSYMBOL_SIZE (ovly_table_msym.minsym);
1807 
1808  ovly_buf_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym);
1809  ovly_buf_table_size = MSYMBOL_SIZE (ovly_buf_table_msym.minsym);
1810 
1811  ovly_table = (gdb_byte *) xmalloc (ovly_table_size);
1812  read_memory (ovly_table_base, ovly_table, ovly_table_size);
1813 
1816  struct spu_overlay_table);
1817 
1818  for (i = 0; i < ovly_table_size / 16; i++)
1819  {
1820  CORE_ADDR vma = extract_unsigned_integer (ovly_table + 16*i + 0,
1821  4, byte_order);
1822  CORE_ADDR size = extract_unsigned_integer (ovly_table + 16*i + 4,
1823  4, byte_order);
1824  CORE_ADDR pos = extract_unsigned_integer (ovly_table + 16*i + 8,
1825  4, byte_order);
1826  CORE_ADDR buf = extract_unsigned_integer (ovly_table + 16*i + 12,
1827  4, byte_order);
1828 
1829  if (buf == 0 || (buf - 1) * 4 >= ovly_buf_table_size)
1830  continue;
1831 
1833  if (vma == bfd_section_vma (objfile->obfd, osect->the_bfd_section)
1834  && pos == osect->the_bfd_section->filepos)
1835  {
1836  int ndx = osect - objfile->sections;
1837  tbl[ndx].mapped_ptr = ovly_buf_table_base + (buf - 1) * 4;
1838  tbl[ndx].mapped_val = i + 1;
1839  break;
1840  }
1841  }
1842 
1843  xfree (ovly_table);
1844  set_objfile_data (objfile, spu_overlay_data, tbl);
1845  return tbl;
1846 }
1847 
1848 /* Read _ovly_buf_table entry from the target to dermine whether
1849  OSECT is currently mapped, and update the mapped state. */
1850 static void
1852 {
1853  enum bfd_endian byte_order = bfd_big_endian (osect->objfile->obfd)?
1854  BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
1855  struct spu_overlay_table *ovly_table;
1856  CORE_ADDR id, val;
1857 
1858  ovly_table = spu_get_overlay_table (osect->objfile);
1859  if (!ovly_table)
1860  return;
1861 
1862  ovly_table += osect - osect->objfile->sections;
1863  if (ovly_table->mapped_ptr == 0)
1864  return;
1865 
1866  id = SPUADDR_SPU (obj_section_addr (osect));
1867  val = read_memory_unsigned_integer (SPUADDR (id, ovly_table->mapped_ptr),
1868  4, byte_order);
1869  osect->ovly_mapped = (val == ovly_table->mapped_val);
1870 }
1871 
1872 /* If OSECT is NULL, then update all sections' mapped state.
1873  If OSECT is non-NULL, then update only OSECT's mapped state. */
1874 static void
1876 {
1877  /* Just one section. */
1878  if (osect)
1879  spu_overlay_update_osect (osect);
1880 
1881  /* All sections. */
1882  else
1883  {
1884  struct objfile *objfile;
1885 
1886  ALL_OBJSECTIONS (objfile, osect)
1887  if (section_is_overlay (osect))
1888  spu_overlay_update_osect (osect);
1889  }
1890 }
1891 
1892 /* Whenever a new objfile is loaded, read the target's _ovly_table.
1893  If there is one, go through all sections and make sure for non-
1894  overlay sections LMA equals VMA, while for overlay sections LMA
1895  is larger than SPU_OVERLAY_LMA. */
1896 static void
1898 {
1899  struct spu_overlay_table *ovly_table;
1900  struct obj_section *osect;
1901 
1902  /* If we've already touched this file, do nothing. */
1903  if (!objfile || objfile_data (objfile, spu_overlay_data) != NULL)
1904  return;
1905 
1906  /* Consider only SPU objfiles. */
1907  if (bfd_get_arch (objfile->obfd) != bfd_arch_spu)
1908  return;
1909 
1910  /* Check if this objfile has overlays. */
1911  ovly_table = spu_get_overlay_table (objfile);
1912  if (!ovly_table)
1913  return;
1914 
1915  /* Now go and fiddle with all the LMAs. */
1917  {
1918  asection *bsect = osect->the_bfd_section;
1919  int ndx = osect - objfile->sections;
1920 
1921  if (ovly_table[ndx].mapped_ptr == 0)
1922  bfd_section_lma (obfd, bsect) = bfd_section_vma (obfd, bsect);
1923  else
1924  bfd_section_lma (obfd, bsect) = SPU_OVERLAY_LMA + bsect->filepos;
1925  }
1926 }
1927 
1928 
1929 /* Insert temporary breakpoint on "main" function of newly loaded
1930  SPE context OBJFILE. */
1931 static void
1933 {
1935  struct compunit_symtab *cust;
1936  CORE_ADDR pc;
1937 
1938  /* Do this only if requested by "set spu stop-on-load on". */
1939  if (!spu_stop_on_load_p)
1940  return;
1941 
1942  /* Consider only SPU objfiles. */
1943  if (!objfile || bfd_get_arch (objfile->obfd) != bfd_arch_spu)
1944  return;
1945 
1946  /* The main objfile is handled differently. */
1947  if (objfile == symfile_objfile)
1948  return;
1949 
1950  /* There can be multiple symbols named "main". Search for the
1951  "main" in *this* objfile. */
1952  minsym = lookup_minimal_symbol ("main", NULL, objfile);
1953  if (!minsym.minsym)
1954  return;
1955 
1956  /* If we have debugging information, try to use it -- this
1957  will allow us to properly skip the prologue. */
1958  pc = BMSYMBOL_VALUE_ADDRESS (minsym);
1959  cust
1961  minsym.minsym));
1962  if (cust != NULL)
1963  {
1964  const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust);
1965  struct block *block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1966  struct symbol *sym;
1967  struct symtab_and_line sal;
1968 
1969  sym = block_lookup_symbol (block, "main",
1971  VAR_DOMAIN);
1972  if (sym)
1973  {
1975  sal = find_function_start_sal (sym, 1);
1976  pc = sal.pc;
1977  }
1978  }
1979 
1980  /* Use a numerical address for the set_breakpoint command to avoid having
1981  the breakpoint re-set incorrectly. */
1982  event_location_up location = new_address_location (pc, NULL, 0);
1983  create_breakpoint (get_objfile_arch (objfile), location.get (),
1984  NULL /* cond_string */, -1 /* thread */,
1985  NULL /* extra_string */,
1986  0 /* parse_condition_and_thread */, 1 /* tempflag */,
1987  bp_breakpoint /* type_wanted */,
1988  0 /* ignore_count */,
1989  AUTO_BOOLEAN_FALSE /* pending_break_support */,
1990  &bkpt_breakpoint_ops /* ops */, 0 /* from_tty */,
1991  1 /* enabled */, 0 /* internal */, 0);
1992 }
1993 
1994 
1995 /* Look up OBJFILE loaded into FRAME's SPU context. */
1996 static struct objfile *
1998 {
1999  struct gdbarch *gdbarch = get_frame_arch (frame);
2000  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2001  struct objfile *obj;
2002 
2003  if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_spu)
2004  return NULL;
2005 
2006  ALL_OBJFILES (obj)
2007  {
2008  if (obj->sections != obj->sections_end
2009  && SPUADDR_SPU (obj_section_addr (obj->sections)) == tdep->id)
2010  return obj;
2011  }
2012 
2013  return NULL;
2014 }
2015 
2016 /* Flush cache for ea pointer access if available. */
2017 static void
2019 {
2020  struct bound_minimal_symbol msymbol;
2021  struct objfile *obj;
2022 
2023  if (!has_stack_frames ())
2024  return;
2025 
2027  if (obj == NULL)
2028  return;
2029 
2030  /* Lookup inferior function __cache_flush. */
2031  msymbol = lookup_minimal_symbol ("__cache_flush", NULL, obj);
2032  if (msymbol.minsym != NULL)
2033  {
2034  struct type *type;
2035  CORE_ADDR addr;
2036 
2037  type = objfile_type (obj)->builtin_void;
2040  addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
2041 
2042  call_function_by_hand (value_from_pointer (type, addr), NULL, 0, NULL);
2043  }
2044 }
2045 
2046 /* This handler is called when the inferior has stopped. If it is stopped in
2047  SPU architecture then flush the ea cache if used. */
2048 static void
2050 {
2052  return;
2053 
2054  /* Temporarily reset spu_auto_flush_cache_p to avoid recursively
2055  re-entering this function when __cache_flush stops. */
2057  flush_ea_cache ();
2059 }
2060 
2061 
2062 /* "info spu" commands. */
2063 
2064 static void
2065 info_spu_event_command (const char *args, int from_tty)
2066 {
2067  struct frame_info *frame = get_selected_frame (NULL);
2068  ULONGEST event_status = 0;
2069  ULONGEST event_mask = 0;
2070  gdb_byte buf[100];
2071  char annex[32];
2072  LONGEST len;
2073  int id;
2074 
2075  if (gdbarch_bfd_arch_info (get_frame_arch (frame))->arch != bfd_arch_spu)
2076  error (_("\"info spu\" is only supported on the SPU architecture."));
2077 
2079 
2080  xsnprintf (annex, sizeof annex, "%d/event_status", id);
2082  buf, 0, (sizeof (buf) - 1));
2083  if (len <= 0)
2084  error (_("Could not read event_status."));
2085  buf[len] = '\0';
2086  event_status = strtoulst ((char *) buf, NULL, 16);
2087 
2088  xsnprintf (annex, sizeof annex, "%d/event_mask", id);
2090  buf, 0, (sizeof (buf) - 1));
2091  if (len <= 0)
2092  error (_("Could not read event_mask."));
2093  buf[len] = '\0';
2094  event_mask = strtoulst ((char *) buf, NULL, 16);
2095 
2096  ui_out_emit_tuple tuple_emitter (current_uiout, "SPUInfoEvent");
2097 
2098  if (current_uiout->is_mi_like_p ())
2099  {
2100  current_uiout->field_fmt ("event_status",
2101  "0x%s", phex_nz (event_status, 4));
2102  current_uiout->field_fmt ("event_mask",
2103  "0x%s", phex_nz (event_mask, 4));
2104  }
2105  else
2106  {
2107  printf_filtered (_("Event Status 0x%s\n"), phex (event_status, 4));
2108  printf_filtered (_("Event Mask 0x%s\n"), phex (event_mask, 4));
2109  }
2110 }
2111 
2112 static void
2113 info_spu_signal_command (const char *args, int from_tty)
2114 {
2115  struct frame_info *frame = get_selected_frame (NULL);
2116  struct gdbarch *gdbarch = get_frame_arch (frame);
2117  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2118  ULONGEST signal1 = 0;
2119  ULONGEST signal1_type = 0;
2120  int signal1_pending = 0;
2121  ULONGEST signal2 = 0;
2122  ULONGEST signal2_type = 0;
2123  int signal2_pending = 0;
2124  char annex[32];
2125  gdb_byte buf[100];
2126  LONGEST len;
2127  int id;
2128 
2129  if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_spu)
2130  error (_("\"info spu\" is only supported on the SPU architecture."));
2131 
2133 
2134  xsnprintf (annex, sizeof annex, "%d/signal1", id);
2135  len = target_read (&current_target, TARGET_OBJECT_SPU, annex, buf, 0, 4);
2136  if (len < 0)
2137  error (_("Could not read signal1."));
2138  else if (len == 4)
2139  {
2140  signal1 = extract_unsigned_integer (buf, 4, byte_order);
2141  signal1_pending = 1;
2142  }
2143 
2144  xsnprintf (annex, sizeof annex, "%d/signal1_type", id);
2146  buf, 0, (sizeof (buf) - 1));
2147  if (len <= 0)
2148  error (_("Could not read signal1_type."));
2149  buf[len] = '\0';
2150  signal1_type = strtoulst ((char *) buf, NULL, 16);
2151 
2152  xsnprintf (annex, sizeof annex, "%d/signal2", id);
2153  len = target_read (&current_target, TARGET_OBJECT_SPU, annex, buf, 0, 4);
2154  if (len < 0)
2155  error (_("Could not read signal2."));
2156  else if (len == 4)
2157  {
2158  signal2 = extract_unsigned_integer (buf, 4, byte_order);
2159  signal2_pending = 1;
2160  }
2161 
2162  xsnprintf (annex, sizeof annex, "%d/signal2_type", id);
2164  buf, 0, (sizeof (buf) - 1));
2165  if (len <= 0)
2166  error (_("Could not read signal2_type."));
2167  buf[len] = '\0';
2168  signal2_type = strtoulst ((char *) buf, NULL, 16);
2169 
2170  ui_out_emit_tuple tuple_emitter (current_uiout, "SPUInfoSignal");
2171 
2172  if (current_uiout->is_mi_like_p ())
2173  {
2174  current_uiout->field_int ("signal1_pending", signal1_pending);
2175  current_uiout->field_fmt ("signal1", "0x%s", phex_nz (signal1, 4));
2176  current_uiout->field_int ("signal1_type", signal1_type);
2177  current_uiout->field_int ("signal2_pending", signal2_pending);
2178  current_uiout->field_fmt ("signal2", "0x%s", phex_nz (signal2, 4));
2179  current_uiout->field_int ("signal2_type", signal2_type);
2180  }
2181  else
2182  {
2183  if (signal1_pending)
2184  printf_filtered (_("Signal 1 control word 0x%s "), phex (signal1, 4));
2185  else
2186  printf_filtered (_("Signal 1 not pending "));
2187 
2188  if (signal1_type)
2189  printf_filtered (_("(Type Or)\n"));
2190  else
2191  printf_filtered (_("(Type Overwrite)\n"));
2192 
2193  if (signal2_pending)
2194  printf_filtered (_("Signal 2 control word 0x%s "), phex (signal2, 4));
2195  else
2196  printf_filtered (_("Signal 2 not pending "));
2197 
2198  if (signal2_type)
2199  printf_filtered (_("(Type Or)\n"));
2200  else
2201  printf_filtered (_("(Type Overwrite)\n"));
2202  }
2203 }
2204 
2205 static void
2206 info_spu_mailbox_list (gdb_byte *buf, int nr, enum bfd_endian byte_order,
2207  const char *field, const char *msg)
2208 {
2209  int i;
2210 
2211  if (nr <= 0)
2212  return;
2213 
2214  ui_out_emit_table table_emitter (current_uiout, 1, nr, "mbox");
2215 
2216  current_uiout->table_header (32, ui_left, field, msg);
2217  current_uiout->table_body ();
2218 
2219  for (i = 0; i < nr; i++)
2220  {
2221  {
2222  ULONGEST val;
2223  ui_out_emit_tuple tuple_emitter (current_uiout, "mbox");
2224  val = extract_unsigned_integer (buf + 4*i, 4, byte_order);
2225  current_uiout->field_fmt (field, "0x%s", phex (val, 4));
2226  }
2227 
2228  if (!current_uiout->is_mi_like_p ())
2229  printf_filtered ("\n");
2230  }
2231 }
2232 
2233 static void
2234 info_spu_mailbox_command (const char *args, int from_tty)
2235 {
2236  struct frame_info *frame = get_selected_frame (NULL);
2237  struct gdbarch *gdbarch = get_frame_arch (frame);
2238  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2239  char annex[32];
2240  gdb_byte buf[1024];
2241  LONGEST len;
2242  int id;
2243 
2244  if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_spu)
2245  error (_("\"info spu\" is only supported on the SPU architecture."));
2246 
2248 
2249  ui_out_emit_tuple tuple_emitter (current_uiout, "SPUInfoMailbox");
2250 
2251  xsnprintf (annex, sizeof annex, "%d/mbox_info", id);
2253  buf, 0, sizeof buf);
2254  if (len < 0)
2255  error (_("Could not read mbox_info."));
2256 
2257  info_spu_mailbox_list (buf, len / 4, byte_order,
2258  "mbox", "SPU Outbound Mailbox");
2259 
2260  xsnprintf (annex, sizeof annex, "%d/ibox_info", id);
2262  buf, 0, sizeof buf);
2263  if (len < 0)
2264  error (_("Could not read ibox_info."));
2265 
2266  info_spu_mailbox_list (buf, len / 4, byte_order,
2267  "ibox", "SPU Outbound Interrupt Mailbox");
2268 
2269  xsnprintf (annex, sizeof annex, "%d/wbox_info", id);
2271  buf, 0, sizeof buf);
2272  if (len < 0)
2273  error (_("Could not read wbox_info."));
2274 
2275  info_spu_mailbox_list (buf, len / 4, byte_order,
2276  "wbox", "SPU Inbound Mailbox");
2277 }
2278 
2279 static ULONGEST
2280 spu_mfc_get_bitfield (ULONGEST word, int first, int last)
2281 {
2282  ULONGEST mask = ~(~(ULONGEST)0 << (last - first + 1));
2283  return (word >> (63 - last)) & mask;
2284 }
2285 
2286 static void
2287 info_spu_dma_cmdlist (gdb_byte *buf, int nr, enum bfd_endian byte_order)
2288 {
2289  static const char *spu_mfc_opcode[256] =
2290  {
2291  /* 00 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2292  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2293  /* 10 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2294  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2295  /* 20 */ "put", "putb", "putf", NULL, "putl", "putlb", "putlf", NULL,
2296  "puts", "putbs", "putfs", NULL, NULL, NULL, NULL, NULL,
2297  /* 30 */ "putr", "putrb", "putrf", NULL, "putrl", "putrlb", "putrlf", NULL,
2298  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2299  /* 40 */ "get", "getb", "getf", NULL, "getl", "getlb", "getlf", NULL,
2300  "gets", "getbs", "getfs", NULL, NULL, NULL, NULL, NULL,
2301  /* 50 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2302  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2303  /* 60 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2304  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2305  /* 70 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2306  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2307  /* 80 */ "sdcrt", "sdcrtst", NULL, NULL, NULL, NULL, NULL, NULL,
2308  NULL, "sdcrz", NULL, NULL, NULL, "sdcrst", NULL, "sdcrf",
2309  /* 90 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2310  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2311  /* a0 */ "sndsig", "sndsigb", "sndsigf", NULL, NULL, NULL, NULL, NULL,
2312  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2313  /* b0 */ "putlluc", NULL, NULL, NULL, "putllc", NULL, NULL, NULL,
2314  "putqlluc", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2315  /* c0 */ "barrier", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2316  "mfceieio", NULL, NULL, NULL, "mfcsync", NULL, NULL, NULL,
2317  /* d0 */ "getllar", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2318  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2319  /* e0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2320  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2321  /* f0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2322  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2323  };
2324 
2325  int *seq = XALLOCAVEC (int, nr);
2326  int done = 0;
2327  int i, j;
2328 
2329 
2330  /* Determine sequence in which to display (valid) entries. */
2331  for (i = 0; i < nr; i++)
2332  {
2333  /* Search for the first valid entry all of whose
2334  dependencies are met. */
2335  for (j = 0; j < nr; j++)
2336  {
2337  ULONGEST mfc_cq_dw3;
2338  ULONGEST dependencies;
2339 
2340  if (done & (1 << (nr - 1 - j)))
2341  continue;
2342 
2343  mfc_cq_dw3
2344  = extract_unsigned_integer (buf + 32*j + 24,8, byte_order);
2345  if (!spu_mfc_get_bitfield (mfc_cq_dw3, 16, 16))
2346  continue;
2347 
2348  dependencies = spu_mfc_get_bitfield (mfc_cq_dw3, 0, nr - 1);
2349  if ((dependencies & done) != dependencies)
2350  continue;
2351 
2352  seq[i] = j;
2353  done |= 1 << (nr - 1 - j);
2354  break;
2355  }
2356 
2357  if (j == nr)
2358  break;
2359  }
2360 
2361  nr = i;
2362 
2363 
2364  ui_out_emit_table table_emitter (current_uiout, 10, nr, "dma_cmd");
2365 
2366  current_uiout->table_header (7, ui_left, "opcode", "Opcode");
2367  current_uiout->table_header (3, ui_left, "tag", "Tag");
2368  current_uiout->table_header (3, ui_left, "tid", "TId");
2369  current_uiout->table_header (3, ui_left, "rid", "RId");
2370  current_uiout->table_header (18, ui_left, "ea", "EA");
2371  current_uiout->table_header (7, ui_left, "lsa", "LSA");
2372  current_uiout->table_header (7, ui_left, "size", "Size");
2373  current_uiout->table_header (7, ui_left, "lstaddr", "LstAddr");
2374  current_uiout->table_header (7, ui_left, "lstsize", "LstSize");
2375  current_uiout->table_header (1, ui_left, "error_p", "E");
2376 
2377  current_uiout->table_body ();
2378 
2379  for (i = 0; i < nr; i++)
2380  {
2381  ULONGEST mfc_cq_dw0;
2382  ULONGEST mfc_cq_dw1;
2383  ULONGEST mfc_cq_dw2;
2384  int mfc_cmd_opcode, mfc_cmd_tag, rclass_id, tclass_id;
2385  int list_lsa, list_size, mfc_lsa, mfc_size;
2386  ULONGEST mfc_ea;
2387  int list_valid_p, qw_valid_p, ea_valid_p, cmd_error_p;
2388 
2389  /* Decode contents of MFC Command Queue Context Save/Restore Registers.
2390  See "Cell Broadband Engine Registers V1.3", section 3.3.2.1. */
2391 
2392  mfc_cq_dw0
2393  = extract_unsigned_integer (buf + 32*seq[i], 8, byte_order);
2394  mfc_cq_dw1
2395  = extract_unsigned_integer (buf + 32*seq[i] + 8, 8, byte_order);
2396  mfc_cq_dw2
2397  = extract_unsigned_integer (buf + 32*seq[i] + 16, 8, byte_order);
2398 
2399  list_lsa = spu_mfc_get_bitfield (mfc_cq_dw0, 0, 14);
2400  list_size = spu_mfc_get_bitfield (mfc_cq_dw0, 15, 26);
2401  mfc_cmd_opcode = spu_mfc_get_bitfield (mfc_cq_dw0, 27, 34);
2402  mfc_cmd_tag = spu_mfc_get_bitfield (mfc_cq_dw0, 35, 39);
2403  list_valid_p = spu_mfc_get_bitfield (mfc_cq_dw0, 40, 40);
2404  rclass_id = spu_mfc_get_bitfield (mfc_cq_dw0, 41, 43);
2405  tclass_id = spu_mfc_get_bitfield (mfc_cq_dw0, 44, 46);
2406 
2407  mfc_ea = spu_mfc_get_bitfield (mfc_cq_dw1, 0, 51) << 12
2408  | spu_mfc_get_bitfield (mfc_cq_dw2, 25, 36);
2409 
2410  mfc_lsa = spu_mfc_get_bitfield (mfc_cq_dw2, 0, 13);
2411  mfc_size = spu_mfc_get_bitfield (mfc_cq_dw2, 14, 24);
2412  qw_valid_p = spu_mfc_get_bitfield (mfc_cq_dw2, 38, 38);
2413  ea_valid_p = spu_mfc_get_bitfield (mfc_cq_dw2, 39, 39);
2414  cmd_error_p = spu_mfc_get_bitfield (mfc_cq_dw2, 40, 40);
2415 
2416  {
2417  ui_out_emit_tuple tuple_emitter (current_uiout, "cmd");
2418 
2419  if (spu_mfc_opcode[mfc_cmd_opcode])
2420  current_uiout->field_string ("opcode", spu_mfc_opcode[mfc_cmd_opcode]);
2421  else
2422  current_uiout->field_int ("opcode", mfc_cmd_opcode);
2423 
2424  current_uiout->field_int ("tag", mfc_cmd_tag);
2425  current_uiout->field_int ("tid", tclass_id);
2426  current_uiout->field_int ("rid", rclass_id);
2427 
2428  if (ea_valid_p)
2429  current_uiout->field_fmt ("ea", "0x%s", phex (mfc_ea, 8));
2430  else
2431  current_uiout->field_skip ("ea");
2432 
2433  current_uiout->field_fmt ("lsa", "0x%05x", mfc_lsa << 4);
2434  if (qw_valid_p)
2435  current_uiout->field_fmt ("size", "0x%05x", mfc_size << 4);
2436  else
2437  current_uiout->field_fmt ("size", "0x%05x", mfc_size);
2438 
2439  if (list_valid_p)
2440  {
2441  current_uiout->field_fmt ("lstaddr", "0x%05x", list_lsa << 3);
2442  current_uiout->field_fmt ("lstsize", "0x%05x", list_size << 3);
2443  }
2444  else
2445  {
2446  current_uiout->field_skip ("lstaddr");
2447  current_uiout->field_skip ("lstsize");
2448  }
2449 
2450  if (cmd_error_p)
2451  current_uiout->field_string ("error_p", "*");
2452  else
2453  current_uiout->field_skip ("error_p");
2454  }
2455 
2456  if (!current_uiout->is_mi_like_p ())
2457  printf_filtered ("\n");
2458  }
2459 }
2460 
2461 static void
2462 info_spu_dma_command (const char *args, int from_tty)
2463 {
2464  struct frame_info *frame = get_selected_frame (NULL);
2465  struct gdbarch *gdbarch = get_frame_arch (frame);
2466  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2467  ULONGEST dma_info_type;
2468  ULONGEST dma_info_mask;
2469  ULONGEST dma_info_status;
2470  ULONGEST dma_info_stall_and_notify;
2471  ULONGEST dma_info_atomic_command_status;
2472  char annex[32];
2473  gdb_byte buf[1024];
2474  LONGEST len;
2475  int id;
2476 
2477  if (gdbarch_bfd_arch_info (get_frame_arch (frame))->arch != bfd_arch_spu)
2478  error (_("\"info spu\" is only supported on the SPU architecture."));
2479 
2481 
2482  xsnprintf (annex, sizeof annex, "%d/dma_info", id);
2484  buf, 0, 40 + 16 * 32);
2485  if (len <= 0)
2486  error (_("Could not read dma_info."));
2487 
2488  dma_info_type
2490  dma_info_mask
2491  = extract_unsigned_integer (buf + 8, 8, byte_order);
2492  dma_info_status
2493  = extract_unsigned_integer (buf + 16, 8, byte_order);
2494  dma_info_stall_and_notify
2495  = extract_unsigned_integer (buf + 24, 8, byte_order);
2496  dma_info_atomic_command_status
2497  = extract_unsigned_integer (buf + 32, 8, byte_order);
2498 
2499  ui_out_emit_tuple tuple_emitter (current_uiout, "SPUInfoDMA");
2500 
2501  if (current_uiout->is_mi_like_p ())
2502  {
2503  current_uiout->field_fmt ("dma_info_type", "0x%s",
2504  phex_nz (dma_info_type, 4));
2505  current_uiout->field_fmt ("dma_info_mask", "0x%s",
2506  phex_nz (dma_info_mask, 4));
2507  current_uiout->field_fmt ("dma_info_status", "0x%s",
2508  phex_nz (dma_info_status, 4));
2509  current_uiout->field_fmt ("dma_info_stall_and_notify", "0x%s",
2510  phex_nz (dma_info_stall_and_notify, 4));
2511  current_uiout->field_fmt ("dma_info_atomic_command_status", "0x%s",
2512  phex_nz (dma_info_atomic_command_status, 4));
2513  }
2514  else
2515  {
2516  const char *query_msg = _("no query pending");
2517 
2518  if (dma_info_type & 4)
2519  switch (dma_info_type & 3)
2520  {
2521  case 1: query_msg = _("'any' query pending"); break;
2522  case 2: query_msg = _("'all' query pending"); break;
2523  default: query_msg = _("undefined query type"); break;
2524  }
2525 
2526  printf_filtered (_("Tag-Group Status 0x%s\n"),
2527  phex (dma_info_status, 4));
2528  printf_filtered (_("Tag-Group Mask 0x%s (%s)\n"),
2529  phex (dma_info_mask, 4), query_msg);
2530  printf_filtered (_("Stall-and-Notify 0x%s\n"),
2531  phex (dma_info_stall_and_notify, 4));
2532  printf_filtered (_("Atomic Cmd Status 0x%s\n"),
2533  phex (dma_info_atomic_command_status, 4));
2534  printf_filtered ("\n");
2535  }
2536 
2537  info_spu_dma_cmdlist (buf + 40, 16, byte_order);
2538 }
2539 
2540 static void
2541 info_spu_proxydma_command (const char *args, int from_tty)
2542 {
2543  struct frame_info *frame = get_selected_frame (NULL);
2544  struct gdbarch *gdbarch = get_frame_arch (frame);
2545  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2546  ULONGEST dma_info_type;
2547  ULONGEST dma_info_mask;
2548  ULONGEST dma_info_status;
2549  char annex[32];
2550  gdb_byte buf[1024];
2551  LONGEST len;
2552  int id;
2553 
2554  if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_spu)
2555  error (_("\"info spu\" is only supported on the SPU architecture."));
2556 
2558 
2559  xsnprintf (annex, sizeof annex, "%d/proxydma_info", id);
2561  buf, 0, 24 + 8 * 32);
2562  if (len <= 0)
2563  error (_("Could not read proxydma_info."));
2564 
2565  dma_info_type = extract_unsigned_integer (buf, 8, byte_order);
2566  dma_info_mask = extract_unsigned_integer (buf + 8, 8, byte_order);
2567  dma_info_status = extract_unsigned_integer (buf + 16, 8, byte_order);
2568 
2569  ui_out_emit_tuple tuple_emitter (current_uiout, "SPUInfoProxyDMA");
2570 
2571  if (current_uiout->is_mi_like_p ())
2572  {
2573  current_uiout->field_fmt ("proxydma_info_type", "0x%s",
2574  phex_nz (dma_info_type, 4));
2575  current_uiout->field_fmt ("proxydma_info_mask", "0x%s",
2576  phex_nz (dma_info_mask, 4));
2577  current_uiout->field_fmt ("proxydma_info_status", "0x%s",
2578  phex_nz (dma_info_status, 4));
2579  }
2580  else
2581  {
2582  const char *query_msg;
2583 
2584  switch (dma_info_type & 3)
2585  {
2586  case 0: query_msg = _("no query pending"); break;
2587  case 1: query_msg = _("'any' query pending"); break;
2588  case 2: query_msg = _("'all' query pending"); break;
2589  default: query_msg = _("undefined query type"); break;
2590  }
2591 
2592  printf_filtered (_("Tag-Group Status 0x%s\n"),
2593  phex (dma_info_status, 4));
2594  printf_filtered (_("Tag-Group Mask 0x%s (%s)\n"),
2595  phex (dma_info_mask, 4), query_msg);
2596  printf_filtered ("\n");
2597  }
2598 
2599  info_spu_dma_cmdlist (buf + 24, 8, byte_order);
2600 }
2601 
2602 static void
2603 info_spu_command (const char *args, int from_tty)
2604 {
2605  printf_unfiltered (_("\"info spu\" must be followed by "
2606  "the name of an SPU facility.\n"));
2608 }
2609 
2610 
2611 /* Root of all "set spu "/"show spu " commands. */
2612 
2613 static void
2614 show_spu_command (const char *args, int from_tty)
2615 {
2617 }
2618 
2619 static void
2620 set_spu_command (const char *args, int from_tty)
2621 {
2623 }
2624 
2625 static void
2626 show_spu_stop_on_load (struct ui_file *file, int from_tty,
2627  struct cmd_list_element *c, const char *value)
2628 {
2629  fprintf_filtered (file, _("Stopping for new SPE threads is %s.\n"),
2630  value);
2631 }
2632 
2633 static void
2634 show_spu_auto_flush_cache (struct ui_file *file, int from_tty,
2635  struct cmd_list_element *c, const char *value)
2636 {
2637  fprintf_filtered (file, _("Automatic software-cache flush is %s.\n"),
2638  value);
2639 }
2640 
2641 
2642 /* Set up gdbarch struct. */
2643 
2644 static struct gdbarch *
2645 spu_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2646 {
2647  struct gdbarch *gdbarch;
2648  struct gdbarch_tdep *tdep;
2649  int id = -1;
2650 
2651  /* Which spufs ID was requested as address space? */
2652  if (info.id)
2653  id = *info.id;
2654  /* For objfile architectures of SPU solibs, decode the ID from the name.
2655  This assumes the filename convention employed by solib-spu.c. */
2656  else if (info.abfd)
2657  {
2658  const char *name = strrchr (info.abfd->filename, '@');
2659  if (name)
2660  sscanf (name, "@0x%*x <%d>", &id);
2661  }
2662 
2663  /* Find a candidate among extant architectures. */
2664  for (arches = gdbarch_list_lookup_by_info (arches, &info);
2665  arches != NULL;
2666  arches = gdbarch_list_lookup_by_info (arches->next, &info))
2667  {
2668  tdep = gdbarch_tdep (arches->gdbarch);
2669  if (tdep && tdep->id == id)
2670  return arches->gdbarch;
2671  }
2672 
2673  /* None found, so create a new architecture. */
2674  tdep = XCNEW (struct gdbarch_tdep);
2675  tdep->id = id;
2676  gdbarch = gdbarch_alloc (&info, tdep);
2677 
2678  /* Disassembler. */
2680 
2681  /* Registers. */
2699 
2700  /* Data types. */
2714 
2715  /* Address handling. */
2724 
2725  /* We need to support more than "addr_bit" significant address bits
2726  in order to support SPUADDR_ADDR encoded values. */
2728 
2729  /* Inferior function calls. */
2737 
2738  /* Frame handling. */
2749 
2750  /* Cell/B.E. cross-architecture unwinder support. */
2752 
2753  /* Breakpoints. */
2755  set_gdbarch_breakpoint_kind_from_pc (gdbarch, spu_breakpoint::kind_from_pc);
2756  set_gdbarch_sw_breakpoint_from_kind (gdbarch, spu_breakpoint::bp_from_kind);
2757  set_gdbarch_memory_remove_breakpoint (gdbarch, spu_memory_remove_breakpoint);
2760 
2761  /* Overlays. */
2763 
2764  return gdbarch;
2765 }
2766 
2767 void
2769 {
2770  register_gdbarch_init (bfd_arch_spu, spu_gdbarch_init);
2771 
2772  /* Add ourselves to objfile event chain. */
2774  spu_overlay_data = register_objfile_data ();
2775 
2776  /* Install spu stop-on-load handler. */
2778 
2779  /* Add ourselves to normal_stop event chain. */
2781 
2782  /* Add root prefix command for all "set spu"/"show spu" commands. */
2784  _("Various SPU specific commands."),
2785  &setspucmdlist, "set spu ", 0, &setlist);
2787  _("Various SPU specific commands."),
2788  &showspucmdlist, "show spu ", 0, &showlist);
2789 
2790  /* Toggle whether or not to add a temporary breakpoint at the "main"
2791  function of new SPE contexts. */
2792  add_setshow_boolean_cmd ("stop-on-load", class_support,
2793  &spu_stop_on_load_p, _("\
2794 Set whether to stop for new SPE threads."),
2795  _("\
2796 Show whether to stop for new SPE threads."),
2797  _("\
2798 Use \"on\" to give control to the user when a new SPE thread\n\
2799 enters its \"main\" function.\n\
2800 Use \"off\" to disable stopping for new SPE threads."),
2801  NULL,
2804 
2805  /* Toggle whether or not to automatically flush the software-managed
2806  cache whenever SPE execution stops. */
2807  add_setshow_boolean_cmd ("auto-flush-cache", class_support,
2809 Set whether to automatically flush the software-managed cache."),
2810  _("\
2811 Show whether to automatically flush the software-managed cache."),
2812  _("\
2813 Use \"on\" to automatically flush the software-managed cache\n\
2814 whenever SPE execution stops.\n\
2815 Use \"off\" to never automatically flush the software-managed cache."),
2816  NULL,
2819 
2820  /* Add root prefix command for all "info spu" commands. */
2822  _("Various SPU specific commands."),
2823  &infospucmdlist, "info spu ", 0, &infolist);
2824 
2825  /* Add various "info spu" commands. */
2827  _("Display SPU event facility status.\n"),
2828  &infospucmdlist);
2830  _("Display SPU signal notification facility status.\n"),
2831  &infospucmdlist);
2833  _("Display SPU mailbox facility status.\n"),
2834  &infospucmdlist);
2836  _("Display MFC DMA status.\n"),
2837  &infospucmdlist);
2839  _("Display MFC Proxy-DMA status.\n"),
2840  &infospucmdlist);
2841 }
struct gdbarch * target_gdbarch(void)
Definition: gdbarch.c:5467
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
Definition: gdbarch.c:2050
void set_gdbarch_double_bit(struct gdbarch *gdbarch, int double_bit)
Definition: gdbarch.c:1723
void set_gdbarch_frame_align(struct gdbarch *gdbarch, gdbarch_frame_align_ftype frame_align)
Definition: gdbarch.c:3151
int * id
Definition: gdbarch.h:1653
void set_gdbarch_float_format(struct gdbarch *gdbarch, const struct floatformat **float_format)
Definition: gdbarch.c:1706
void set_gdbarch_address_class_type_flags_to_name(struct gdbarch *gdbarch, gdbarch_address_class_type_flags_to_name_ftype address_class_type_flags_to_name)
Definition: gdbarch.c:3541
static void info_spu_proxydma_command(const char *args, int from_tty)
Definition: spu-tdep.c:2541
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:624
#define SPUADDR(spu, addr)
Definition: spu-tdep.h:104
struct gdbarch * arch()
Definition: disasm.h:53
void set_gdbarch_get_longjmp_target(struct gdbarch *gdbarch, gdbarch_get_longjmp_target_ftype get_longjmp_target)
Definition: gdbarch.c:2572
struct value * frame_unwind_got_bytes(struct frame_info *frame, int regnum, gdb_byte *buf)
Definition: frame-unwind.c:260
constexpr gdb_byte spu_break_insn[]
Definition: spu-tdep.c:1574
#define OBSTACK_CALLOC(OBSTACK, NUMBER, TYPE)
Definition: gdb_obstack.h:30
static void spu_dis_asm_print_address(bfd_vma addr, struct disassemble_info *info)
Definition: spu-tdep.c:1705
bfd * obfd
Definition: objfiles.h:342
struct frame_info * get_selected_frame(const char *message)
Definition: frame.c:1638
struct type * builtin_func_ptr
Definition: gdbtypes.h:1565
void set_gdbarch_float_bit(struct gdbarch *gdbarch, int float_bit)
Definition: gdbarch.c:1690
CORE_ADDR get_frame_pc(struct frame_info *frame)
Definition: frame.c:2376
static int is_ri7(unsigned int insn, int op, int *rt, int *ra, int *i7)
Definition: spu-tdep.c:562
static void show_spu_command(const char *args, int from_tty)
Definition: spu-tdep.c:2614
static void spu_overlay_update_osect(struct obj_section *osect)
Definition: spu-tdep.c:1851
struct frame_info * get_current_frame(void)
Definition: frame.c:1563
struct type * builtin_void
Definition: gdbtypes.h:1591
static struct type * spu_register_type(struct gdbarch *gdbarch, int reg_nr)
Definition: spu-tdep.c:146
bfd_vma CORE_ADDR
Definition: common-types.h:41
static struct cmd_list_element * showspucmdlist
Definition: spu-tdep.c:52
void _initialize_spu_tdep(void)
Definition: spu-tdep.c:2768
static int spu_auto_flush_cache_p
Definition: spu-tdep.c:57
int target_write_memory(CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
Definition: target.c:1451
void print_address(struct gdbarch *, CORE_ADDR, struct ui_file *)
Definition: printcmd.c:706
int ptid_get_pid(const ptid_t &ptid)
Definition: ptid.c:47
CORE_ADDR mapped_val
Definition: spu-tdep.c:1773
int reg_offset[SPU_NUM_GPRS]
Definition: spu-tdep.c:667
void ax_reg_mask(struct agent_expr *ax, int reg)
Definition: ax-general.c:425
struct value * trad_frame_get_prev_register(struct frame_info *this_frame, struct trad_frame_saved_reg this_saved_regs[], int regnum)
Definition: trad-frame.c:142
void xfree(void *)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
Definition: gnu-nat.c:1824
const struct floatformat * floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]
Definition: gdbtypes.c:76
static void spu_virtual_frame_pointer(struct gdbarch *gdbarch, CORE_ADDR pc, int *reg, LONGEST *offset)
Definition: spu-tdep.c:864
int trad_frame_addr_p(struct trad_frame_saved_reg this_saved_regs[], int regnum)
Definition: trad-frame.c:84
static void show_spu_stop_on_load(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
Definition: spu-tdep.c:2626
int section_is_overlay(struct obj_section *section)
Definition: symfile.c:2978
struct gdbarch * arch
Definition: frame.c:116
void(* func)(char *)
static CORE_ADDR spu_read_pc(struct regcache *regcache)
Definition: spu-tdep.c:1179
struct bfd_section * the_bfd_section
Definition: objfiles.h:126
#define BMSYMBOL_VALUE_ADDRESS(symbol)
Definition: symtab.h:691
regcache(gdbarch *gdbarch)
Definition: regcache.h:235
void trad_frame_set_value(struct trad_frame_saved_reg this_saved_regs[], int regnum, LONGEST val)
Definition: trad-frame.c:99
#define SPUADDR_SPU(addr)
Definition: spu-tdep.h:107
static struct value * spu_value_from_register(struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id)
Definition: spu-tdep.c:361
#define TYPE_NAME(thistype)
Definition: gdbtypes.h:1224
void set_gdbarch_overlay_update(struct gdbarch *gdbarch, gdbarch_overlay_update_ftype overlay_update)
Definition: gdbarch.c:4048
void set_gdbarch_write_pc(struct gdbarch *gdbarch, gdbarch_write_pc_ftype write_pc)
Definition: gdbarch.c:1943
CORE_ADDR mapped_ptr
Definition: spu-tdep.c:1772
LONGEST target_write(struct target_ops *ops, enum target_object object, const char *annex, const gdb_byte *buf, ULONGEST offset, LONGEST len)
Definition: target.c:1841
static void show_spu_auto_flush_cache(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
Definition: spu-tdep.c:2634
static int spu_stack_frame_destroyed_p(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: spu-tdep.c:901
static CORE_ADDR spu_frame_base_address(struct frame_info *this_frame, void **this_cache)
Definition: spu-tdep.c:1147
static const struct frame_unwind spu2ppu_unwind
Definition: spu-tdep.c:1293
void set_gdbarch_integer_to_address(struct gdbarch *gdbarch, gdbarch_integer_to_address_ftype integer_to_address)
Definition: gdbarch.c:2714
static void spu_value_to_regcache(struct regcache *regcache, int regnum, struct type *type, const gdb_byte *in)
Definition: spu-tdep.c:1350
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1279
static void spu2ppu_dealloc_cache(struct frame_info *self, void *this_cache)
Definition: spu-tdep.c:1287
void set_gdbarch_short_bit(struct gdbarch *gdbarch, int short_bit)
Definition: gdbarch.c:1572
static void spu_pseudo_register_write(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, const gdb_byte *buf)
Definition: spu-tdep.c:271
static const char * spu_register_name(struct gdbarch *gdbarch, int reg_nr)
Definition: spu-tdep.c:114
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
Definition: gdbtypes.c:5217
static void spu_catch_start(struct objfile *objfile)
Definition: spu-tdep.c:1932
static int is_ri16(unsigned int insn, int op, int *rt, int *i16)
Definition: spu-tdep.c:590
const struct objfile_type * objfile_type(struct objfile *objfile)
Definition: gdbtypes.c:5363
static CORE_ADDR spu_pointer_to_address(struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf)
Definition: spu-tdep.c:470
CORE_ADDR get_frame_sp(struct frame_info *this_frame)
Definition: frame.c:2782
void set_gdbarch_frame_red_zone_size(struct gdbarch *gdbarch, int frame_red_zone_size)
Definition: gdbarch.c:3184
void * memset(T *s, int c, size_t n)=delete
void internal_error(const char *file, int line, const char *fmt,...)
Definition: errors.c:50
void set_gdbarch_ax_pseudo_register_collect(struct gdbarch *gdbarch, gdbarch_ax_pseudo_register_collect_ftype ax_pseudo_register_collect)
Definition: gdbarch.c:2091
struct m32c_reg * pc
Definition: m32c-tdep.c:116
return_value_convention
Definition: defs.h:247
static ULONGEST spu_mfc_get_bitfield(ULONGEST word, int first, int last)
Definition: spu-tdep.c:2280
void set_gdbarch_register_reggroup_p(struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype register_reggroup_p)
Definition: gdbarch.c:3599
int safe_read_memory_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order, LONGEST *return_value)
Definition: corefile.c:284
#define ON_STACK
Definition: inferior.h:263
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
Definition: cli-decode.c:262
#define ALL_OBJSECTIONS(objfile, osect)
Definition: objfiles.h:663
static void spu_frame_this_id(struct frame_info *this_frame, void **this_prologue_cache, struct frame_id *this_id)
Definition: spu-tdep.c:1111
Definition: ax.h:83
void regcache_cooked_write_part(struct regcache *regcache, int regnum, int offset, int len, const gdb_byte *buf)
Definition: regcache.c:987
static int is_ri18(unsigned int insn, int op, int *rt, int *i18)
Definition: spu-tdep.c:603
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
Definition: objfiles.h:630
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
Definition: gdbarch.c:5309
register_status
#define BLOCKVECTOR_BLOCK(blocklist, n)
Definition: block.h:125
struct gdbarch_list * next
Definition: gdbarch.h:1623
struct reggroup *const restore_reggroup
Definition: reggroups.c:320
static CORE_ADDR spu_integer_to_address(struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf)
Definition: spu-tdep.c:486
void ax_reg(struct agent_expr *x, int reg)
Definition: ax-general.c:274
static struct gdbarch * spu_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
Definition: spu-tdep.c:2645
#define _(String)
Definition: gdb_locale.h:35
struct type * spu_builtin_type_vec128
Definition: spu-tdep.c:67
struct symtab_and_line find_function_start_sal(struct symbol *sym, int funfirstline)
Definition: symtab.c:3585
void set_gdbarch_dwarf2_reg_to_regnum(struct gdbarch *gdbarch, gdbarch_dwarf2_reg_to_regnum_ftype dwarf2_reg_to_regnum)
Definition: gdbarch.c:2275
Definition: ui-out.h:44
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1491
static enum register_status spu_pseudo_register_read_spu(struct regcache *regcache, const char *regname, gdb_byte *buf)
Definition: spu-tdep.c:185
void frame_unwind_prepend_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:64
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:79
void set_gdbarch_significant_addr_bit(struct gdbarch *gdbarch, int significant_addr_bit)
Definition: gdbarch.c:3234
struct type * builtin_int32
Definition: gdbtypes.h:1538
Definition: spu-tdep.c:511
#define FRAME_OBSTACK_ZALLOC(TYPE)
Definition: frame.h:678
static void spu_overlay_new_objfile(struct objfile *objfile)
Definition: spu-tdep.c:1897
void printf_filtered(const char *format,...)
Definition: utils.c:2045
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
Definition: utils.c:2745
struct regcache * regcache_dup(struct regcache *src)
Definition: regcache.c:353
static int spu_ax_pseudo_register_push_stack(struct gdbarch *gdbarch, struct agent_expr *ax, int regnum)
Definition: spu-tdep.c:336
struct cmd_list_element * add_prefix_cmd(const char *name, enum command_class theclass, cmd_const_cfunc_ftype *fun, const char *doc, struct cmd_list_element **prefixlist, const char *prefixname, int allow_unknown, struct cmd_list_element **list)
Definition: cli-decode.c:367
#define MSYMBOL_OBJ_SECTION(objfile, symbol)
Definition: symtab.h:700
void set_gdbarch_addr_bit(struct gdbarch *gdbarch, int addr_bit)
Definition: gdbarch.c:1859
struct reggroup *const float_reggroup
Definition: reggroups.c:315
struct cmd_list_element * infolist
Definition: cli-cmds.c:83
void frame_base_set_default(struct gdbarch *gdbarch, const struct frame_base *default_base)
Definition: frame-base.c:95
struct cmd_list_element * setlist
Definition: cli-cmds.c:111
const char *const name
Definition: aarch64-tdep.c:76
struct type * builtin_int128
Definition: gdbtypes.h:1542
static void info_spu_signal_command(const char *args, int from_tty)
Definition: spu-tdep.c:2113
void set_gdbarch_pseudo_register_write(struct gdbarch *gdbarch, gdbarch_pseudo_register_write_ftype pseudo_register_write)
Definition: gdbarch.c:2032
static const char * spu_address_class_type_flags_to_name(struct gdbarch *gdbarch, int type_flags)
Definition: spu-tdep.c:439
static void spu_address_to_pointer(struct gdbarch *gdbarch, struct type *type, gdb_byte *buf, CORE_ADDR addr)
Definition: spu-tdep.c:461
void append_composite_type_field(struct type *t, const char *name, struct type *field)
Definition: gdbtypes.c:5208
void set_gdbarch_register_type(struct gdbarch *gdbarch, gdbarch_register_type_ftype register_type)
Definition: gdbarch.c:2316
struct type * check_typedef(struct type *type)
Definition: gdbtypes.c:2421
const gdb_byte * value_contents(struct value *value)
Definition: value.c:1407
struct reggroup *const general_reggroup
Definition: reggroups.c:314
enum register_status regcache_raw_read_part(struct regcache *regcache, int regnum, int offset, int len, gdb_byte *buf)
Definition: regcache.c:943
#define SPU_OVERLAY_LMA
Definition: spu-tdep.h:115
static struct spu_overlay_table * spu_get_overlay_table(struct objfile *objfile)
Definition: spu-tdep.c:1780
static CORE_ADDR spu_analyze_prologue(struct gdbarch *gdbarch, CORE_ADDR start_pc, CORE_ADDR end_pc, struct spu_prologue_data *data)
Definition: spu-tdep.c:671
static struct objfile * spu_objfile_from_frame(struct frame_info *frame)
Definition: spu-tdep.c:1997
struct target_ops current_target
static void info_spu_event_command(const char *args, int from_tty)
Definition: spu-tdep.c:2065
objfile(bfd *, const char *, objfile_flags)
Definition: objfiles.c:373
static int spu_address_class_name_to_type_flags(struct gdbarch *gdbarch, const char *name, int *type_flags_ptr)
Definition: spu-tdep.c:448
struct value::@186::@187 reg
void fprintf_filtered(struct ui_file *stream, const char *format,...)
Definition: utils.c:2008
static std::vector< CORE_ADDR > spu_software_single_step(struct regcache *regcache)
Definition: spu-tdep.c:1615
void set_gdbarch_stack_frame_destroyed_p(struct gdbarch *gdbarch, gdbarch_stack_frame_destroyed_p_ftype stack_frame_destroyed_p)
Definition: gdbarch.c:3367
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
Definition: defs.h:577
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
Definition: regcache.c:777
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
Definition: gdbarch.c:2156
bfd * abfd
Definition: gdbarch.h:1637
void set_gdbarch_decr_pc_after_break(struct gdbarch *gdbarch, CORE_ADDR decr_pc_after_break)
Definition: gdbarch.c:2980
static int is_ri10(unsigned int insn, int op, int *rt, int *ra, int *i10)
Definition: spu-tdep.c:576
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype dummy_id)
Definition: gdbarch.c:2340
#define SPU_NUM_REGS
Definition: spu-tdep.h:23
struct cmd_list_element * showlist
Definition: cli-cmds.c:119
struct_return
Definition: arm-tdep.h:88
void set_gdbarch_address_to_pointer(struct gdbarch *gdbarch, gdbarch_address_to_pointer_ftype address_to_pointer)
Definition: gdbarch.c:2690
#define TYPE_VECTOR(t)
Definition: gdbtypes.h:252
struct type * builtin_int16
Definition: gdbtypes.h:1536
int default_print_insn(bfd_vma memaddr, disassemble_info *info)
Definition: arch-utils.c:950
#define MSYMBOL_SIZE(msymbol)
Definition: symtab.h:672
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
#define current_uiout
Definition: ui-out.h:39
struct gdbarch * get_objfile_arch(const struct objfile *objfile)
Definition: objfiles.c:445
static struct cmd_list_element * setspucmdlist
Definition: spu-tdep.c:51
struct obj_section * sections
Definition: objfiles.h:423
Definition: gdbtypes.h:749
int find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr)
Definition: blockframe.c:320
struct type * init_vector_type(struct type *elt_type, int n)
Definition: gdbtypes.c:1334
static const struct frame_unwind spu_frame_unwind
Definition: spu-tdep.c:1137
#define SPU_NUM_GPRS
Definition: spu-tdep.h:25
static void set_spu_command(const char *args, int from_tty)
Definition: spu-tdep.c:2620
void set_gdbarch_value_from_register(struct gdbarch *gdbarch, gdbarch_value_from_register_ftype value_from_register)
Definition: gdbarch.c:2656
void set_gdbarch_unwind_pc(struct gdbarch *gdbarch, gdbarch_unwind_pc_ftype unwind_pc)
Definition: gdbarch.c:3079
struct type * builtin_uint32
Definition: gdbtypes.h:1539
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
Definition: frame-unwind.c:174
static const char * type
Definition: language.c:113
static CORE_ADDR spu_frame_align(struct gdbarch *gdbarch, CORE_ADDR sp)
Definition: spu-tdep.c:1308
static CORE_ADDR spu_push_dummy_code(struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR funaddr, struct value **args, int nargs, struct type *value_type, CORE_ADDR *real_pc, CORE_ADDR *bp_addr, struct regcache *regcache)
Definition: spu-tdep.c:1314
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
Definition: gnu-nat.c:1822
static struct value * spu2ppu_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
Definition: spu-tdep.c:1224
struct compunit_symtab * find_pc_sect_compunit_symtab(CORE_ADDR pc, struct obj_section *section)
Definition: symtab.c:2872
#define symfile_objfile
Definition: progspace.h:227
void set_gdbarch_read_pc(struct gdbarch *gdbarch, gdbarch_read_pc_ftype read_pc)
Definition: gdbarch.c:1919
std::unique_ptr< event_location, event_location_deleter > event_location_up
Definition: location.h:140
void set_gdbarch_pointer_to_address(struct gdbarch *gdbarch, gdbarch_pointer_to_address_ftype pointer_to_address)
Definition: gdbarch.c:2673
void set_gdbarch_unwind_sp(struct gdbarch *gdbarch, gdbarch_unwind_sp_ftype unwind_sp)
Definition: gdbarch.c:3103
struct regcache * regcache
Definition: spu-tdep.c:1205
ULONGEST strtoulst(const char *num, const char **trailer, int base)
Definition: common-utils.c:266
void set_value_offset(struct value *value, LONGEST offset)
Definition: value.c:1111
struct gdbarch * gdbarch
Definition: gdbarch.h:1622
void set_gdbarch_ax_pseudo_register_push_stack(struct gdbarch *gdbarch, gdbarch_ax_pseudo_register_push_stack_ftype ax_pseudo_register_push_stack)
Definition: gdbarch.c:2115
int regnum
Definition: aarch64-tdep.c:77
void printf_unfiltered(const char *format,...)
Definition: utils.c:2056
void read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: corefile.c:258
#define TYPE_ADDRESS_CLASS_1(t)
Definition: gdbtypes.h:367
CORE_ADDR local_base
Definition: spu-tdep.c:985
static void info_spu_dma_command(const char *args, int from_tty)
Definition: spu-tdep.c:2462
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1308
struct breakpoint_ops bkpt_breakpoint_ops
Definition: breakpoint.c:255
void * xmalloc(YYSIZE_T)
event_location_up new_address_location(CORE_ADDR addr, const char *addr_string, int addr_string_len)
Definition: location.c:121
struct type * builtin_uint128
Definition: gdbtypes.h:1543
void set_gdbarch_breakpoint_kind_from_pc(struct gdbarch *gdbarch, gdbarch_breakpoint_kind_from_pc_ftype breakpoint_kind_from_pc)
Definition: gdbarch.c:2871
struct trad_frame_saved_reg * trad_frame_alloc_saved_regs(struct gdbarch *gdbarch)
Definition: trad-frame.c:47
void set_gdbarch_frame_args_skip(struct gdbarch *gdbarch, CORE_ADDR frame_args_skip)
Definition: gdbarch.c:3055
void set_gdbarch_long_long_bit(struct gdbarch *gdbarch, int long_long_bit)
Definition: gdbarch.c:1623
LONGEST unpack_long(struct type *type, const gdb_byte *valaddr)
Definition: value.c:2880
static int spu_get_longjmp_target(struct frame_info *frame, CORE_ADDR *pc)
Definition: spu-tdep.c:1673
Definition: regdef.h:22
static int gdb_print_insn_spu(bfd_vma memaddr, struct disassemble_info *info)
Definition: spu-tdep.c:1716
static int spu_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
Definition: spu-tdep.c:380
static struct frame_id spu_dummy_id(struct gdbarch *gdbarch, struct frame_info *this_frame)
Definition: spu-tdep.c:1498
Definition: block.h:60
Definition: value.c:169
static enum return_value_convention spu_return_value(struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *out, const gdb_byte *in)
Definition: spu-tdep.c:1509
void set_gdbarch_software_single_step(struct gdbarch *gdbarch, gdbarch_software_single_step_ftype software_single_step)
Definition: gdbarch.c:3258
const struct floatformat * floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]
Definition: gdbtypes.c:72
std::unique_ptr< struct regcache > frame_save_as_regcache(struct frame_info *this_frame)
Definition: frame.c:1021
void set_gdbarch_push_dummy_code(struct gdbarch *gdbarch, gdbarch_push_dummy_code_ftype push_dummy_code)
Definition: gdbarch.c:2422
static struct cmd_list_element * infospucmdlist
Definition: spu-tdep.c:109
#define COMPUNIT_BLOCKVECTOR(cust)
Definition: symtab.h:1465
struct symbol * fixup_symbol_section(struct symbol *sym, struct objfile *objfile)
Definition: symtab.c:1718
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
Definition: arch-utils.c:117
bfd_byte gdb_byte
Definition: common-types.h:38
struct frame_id frame_id
Definition: spu-tdep.c:1204
struct frame_info * get_next_frame(struct frame_info *this_frame)
Definition: frame.c:1771
void help_list(struct cmd_list_element *list, const char *cmdtype, enum command_class theclass, struct ui_file *stream)
Definition: cli-decode.c:1071
struct value * value_from_pointer(struct type *type, CORE_ADDR addr)
Definition: value.c:3560
static const struct frame_base spu_frame_base
Definition: spu-tdep.c:1154
static void print_frame(struct frame_info *frame, int print_level, enum print_what print_what, int print_args, struct symtab_and_line sal)
void set_gdbarch_pseudo_register_read(struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype pseudo_register_read)
Definition: gdbarch.c:1984
ULONGEST align_up(ULONGEST v, int n)
Definition: utils.c:2997
void set_gdbarch_char_signed(struct gdbarch *gdbarch, int char_signed)
Definition: gdbarch.c:1895
#define TYPE_TARGET_TYPE(thistype)
Definition: gdbtypes.h:1226
struct type * builtin_double
Definition: gdbtypes.h:1511
void set_gdbarch_address_class_type_flags(struct gdbarch *gdbarch, gdbarch_address_class_type_flags_ftype address_class_type_flags)
Definition: gdbarch.c:3517
static int is_branch(unsigned int insn, int *offset, int *reg)
Definition: spu-tdep.c:616
static int spu_gdbarch_id(struct gdbarch *gdbarch)
Definition: spu-tdep.c:412
static void spu2ppu_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
Definition: spu-tdep.c:1216
static CORE_ADDR spu_unwind_sp(struct gdbarch *gdbarch, struct frame_info *next_frame)
Definition: spu-tdep.c:1171
static void spu_attach_normal_stop(struct bpstats *bs, int print_frame)
Definition: spu-tdep.c:2049
int default_memory_remove_breakpoint(struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
Definition: mem-break.c:74
#define XCNEW(T)
Definition: poison.h:121
void set_gdbarch_address_class_name_to_type_flags(struct gdbarch *gdbarch, gdbarch_address_class_name_to_type_flags_ftype address_class_name_to_type_flags)
Definition: gdbarch.c:3582
static void info_spu_mailbox_command(const char *args, int from_tty)
Definition: spu-tdep.c:2234
int xsnprintf(char *str, size_t size, const char *format,...)
Definition: common-utils.c:134
static struct gdbarch * spu2ppu_prev_arch(struct frame_info *this_frame, void **this_cache)
Definition: spu-tdep.c:1209
#define TYPE_CODE(thistype)
Definition: gdbtypes.h:1238
enum register_status regcache_raw_read(struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: regcache.c:565
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
Definition: regcache.c:806
static void spu_pseudo_register_write_spu(struct regcache *regcache, const char *regname, const gdb_byte *buf)
Definition: spu-tdep.c:253
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: target.c:1370
CORE_ADDR regcache_read_pc(struct regcache *regcache)
Definition: regcache.c:1229
static int spu_scalar_value_p(struct type *type)
Definition: spu-tdep.c:1330
ptid_t inferior_ptid
Definition: infcmd.c:94
struct type * builtin_data_ptr
Definition: gdbtypes.h:1554
#define TYPE_CALLING_CONVENTION(thistype)
Definition: gdbtypes.h:1327
void set_gdbarch_int_bit(struct gdbarch *gdbarch, int int_bit)
Definition: gdbarch.c:1589
struct minimal_symbol * minsym
Definition: minsyms.h:34
static int spu_address_class_type_flags(int byte_size, int dwarf2_addr_class)
Definition: spu-tdep.c:430
static struct value * spu_frame_prev_register(struct frame_info *this_frame, void **this_prologue_cache, int regnum)
Definition: spu-tdep.c:1124
#define obj_section_addr(s)
Definition: objfiles.h:140
CORE_ADDR frame_base
Definition: spu-tdep.c:984
int create_breakpoint(struct gdbarch *gdbarch, const struct event_location *location, const char *cond_string, int thread, const char *extra_string, int parse_extra, int tempflag, enum bptype type_wanted, int ignore_count, enum auto_boolean pending_break_support, const struct breakpoint_ops *ops, int from_tty, int enabled, int internal, unsigned flags)
Definition: breakpoint.c:9325
static int spu_dwarf_reg_to_regnum(struct gdbarch *gdbarch, int reg)
Definition: spu-tdep.c:402
int offset
Definition: agent.c:65
void add_setshow_boolean_cmd(const char *name, enum command_class theclass, int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
Definition: cli-decode.c:569
static void info_spu_command(const char *args, int from_tty)
Definition: spu-tdep.c:2603
void set_gdbarch_virtual_frame_pointer(struct gdbarch *gdbarch, gdbarch_virtual_frame_pointer_ftype virtual_frame_pointer)
Definition: gdbarch.c:1960
static struct spu_unwind_cache * spu_frame_unwind_cache(struct frame_info *this_frame, void **this_prologue_cache)
Definition: spu-tdep.c:991
void get_frame_register(struct frame_info *frame, int regnum, gdb_byte *buf)
Definition: frame.c:1165
struct objfile * objfile
Definition: objfiles.h:129
struct value * default_value_from_register(struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id)
Definition: findvar.c:821
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
Definition: gdbarch.c:2067
gdbarch * arch() const
Definition: regcache.c:221
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
enum register_status regcache_cooked_read(struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: regcache.c:661
static int spu_stop_on_load_p
Definition: spu-tdep.c:55
static void spu_write_pc(struct regcache *regcache, CORE_ADDR pc)
Definition: spu-tdep.c:1189
static CORE_ADDR spu_unwind_pc(struct gdbarch *gdbarch, struct frame_info *next_frame)
Definition: spu-tdep.c:1162
CORE_ADDR pc
Definition: symtab.h:1759
typedef BP_MANIPULATION(spu_break_insn)
Definition: spu-tdep.c:1576
static void spu_overlay_update(struct obj_section *osect)
Definition: spu-tdep.c:1875
struct m32c_reg * sp
Definition: m32c-tdep.c:119
void set_gdbarch_double_format(struct gdbarch *gdbarch, const struct floatformat **double_format)
Definition: gdbarch.c:1739
void set_gdbarch_memory_remove_breakpoint(struct gdbarch *gdbarch, gdbarch_memory_remove_breakpoint_ftype memory_remove_breakpoint)
Definition: gdbarch.c:2963
static void info_spu_mailbox_list(gdb_byte *buf, int nr, enum bfd_endian byte_order, const char *field, const char *msg)
Definition: spu-tdep.c:2206
struct inferior * current_inferior(void)
Definition: inferior.c:58
#define SPU_NUM_PSEUDO_REGS
Definition: spu-tdep.h:24
int get_frame_register_bytes(struct frame_info *frame, int regnum, CORE_ADDR offset, int len, gdb_byte *myaddr, int *optimizedp, int *unavailablep)
Definition: frame.c:1388
static void spu_regcache_to_value(struct regcache *regcache, int regnum, struct type *type, gdb_byte *out)
Definition: spu-tdep.c:1375
void set_gdbarch_call_dummy_location(struct gdbarch *gdbarch, int call_dummy_location)
Definition: gdbarch.c:2398
unsigned long long ULONGEST
Definition: common-types.h:53
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
Definition: frame-unwind.c:184
struct value * call_function_by_hand(struct value *function, type *default_return_type, int nargs, struct value **args)
Definition: infcall.c:690
static int is_rr(unsigned int insn, int op, int *rt, int *ra, int *rb)
Definition: spu-tdep.c:533
int register_size(struct gdbarch *gdbarch, int regnum)
Definition: regcache.c:164
struct observer * observer_attach_normal_stop(observer_normal_stop_ftype *f)
struct observer * observer_attach_new_objfile(observer_new_objfile_ftype *f)
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
Definition: gdbarch.c:1756
struct type * value_type(const struct value *value)
Definition: value.c:1095
static const struct objfile_data * spu_overlay_data
Definition: spu-tdep.c:1768
struct type * builtin_int64
Definition: gdbtypes.h:1540
void set_gdbarch_long_bit(struct gdbarch *gdbarch, int long_bit)
Definition: gdbarch.c:1606
enum register_status regcache_cooked_read_part(struct regcache *regcache, int regnum, int offset, int len, gdb_byte *buf)
Definition: regcache.c:972
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
Definition: gdbarch.c:2738
LONGEST target_read(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *buf, ULONGEST offset, LONGEST len)
Definition: target.c:1562
const struct bfd_arch_info * gdbarch_bfd_arch_info(struct gdbarch *gdbarch)
Definition: gdbarch.c:1500
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
Definition: gdbarch.c:1772
int default_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
Definition: reggroups.c:192
struct reggroup *const save_reggroup
Definition: reggroups.c:319
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1235
void set_gdbarch_ptr_bit(struct gdbarch *gdbarch, int ptr_bit)
Definition: gdbarch.c:1841
struct objfile * objfile
Definition: minsyms.h:39
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
Definition: regcache.c:612
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype push_dummy_call)
Definition: gdbarch.c:2381
CORE_ADDR func
Definition: spu-tdep.c:983
ULONGEST read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
Definition: corefile.c:326
static CORE_ADDR spu_push_dummy_call(struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr)
Definition: spu-tdep.c:1400
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype sw_breakpoint_from_kind)
Definition: gdbarch.c:2888
#define ALL_OBJFILES(obj)
Definition: objfiles.h:582
void register_gdbarch_init(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init)
Definition: gdbarch.c:5299
int ovly_mapped
Definition: objfiles.h:132
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype skip_prologue)
Definition: gdbarch.c:2772
struct type * builtin_int8
Definition: gdbtypes.h:1534
struct symbol * block_lookup_symbol(const struct block *block, const char *name, symbol_name_match_type match_type, const domain_enum domain)
Definition: block.c:675
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
Definition: minsyms.c:311
struct trad_frame_saved_reg * saved_regs
Definition: spu-tdep.c:987
enum bfd_endian byte_order
Definition: gdbarch.c:137
static int spu_ax_pseudo_register_collect(struct gdbarch *gdbarch, struct agent_expr *ax, int regnum)
Definition: spu-tdep.c:314
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
Definition: gdbarch.c:2173
int has_stack_frames(void)
Definition: frame.c:1609
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype register_name)
Definition: gdbarch.c:2292
static enum register_status spu_pseudo_register_read(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: spu-tdep.c:210
CORE_ADDR get_frame_func(struct frame_info *this_frame)
Definition: frame.c:1001
void error(const char *fmt,...)
Definition: errors.c:38
size_t size
Definition: go32-nat.c:242
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, struct gdbarch_tdep *tdep)
Definition: gdbarch.c:361
#define SPUADDR_ADDR(addr)
Definition: spu-tdep.h:112
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype inner_than)
Definition: gdbarch.c:2837
static struct type * spu_builtin_type_vec128(struct gdbarch *gdbarch)
Definition: spu-tdep.c:73
static void flush_ea_cache(void)
Definition: spu-tdep.c:2018
struct type * lookup_pointer_type(struct type *type)
Definition: gdbtypes.c:381
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2691
#define FRAME_OBSTACK_CALLOC(NUMBER, TYPE)
Definition: frame.h:680
void throw_error(enum errors error, const char *fmt,...)
long long LONGEST
Definition: common-types.h:52
struct type * arch_composite_type(struct gdbarch *gdbarch, const char *name, enum type_code code)
Definition: gdbtypes.c:5132
void regcache_cooked_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
Definition: regcache.c:873
struct regcache * get_thread_arch_regcache(ptid_t ptid, struct gdbarch *gdbarch)
Definition: regcache.c:423
struct type * lookup_function_type(struct type *type)
Definition: gdbtypes.c:519
void set_gdbarch_print_insn(struct gdbarch *gdbarch, gdbarch_print_insn_ftype print_insn)
Definition: gdbarch.c:3299
static CORE_ADDR spu_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: spu-tdep.c:856
struct type * builtin_float
Definition: gdbtypes.h:1510
struct obj_section * sections_end
Definition: objfiles.h:424
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
Definition: defs.h:604
#define gdb_stdout
Definition: utils.h:340
static int is_rrr(unsigned int insn, int op, int *rt, int *ra, int *rb, int *rc)
Definition: spu-tdep.c:547
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
Definition: regcache.c:831
static void info_spu_dma_cmdlist(gdb_byte *buf, int nr, enum bfd_endian byte_order)
Definition: spu-tdep.c:2287
static int spu2ppu_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
Definition: spu-tdep.c:1237