GDB (xrefs)
/tmp/gdb-8.1/gdb/score-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for the S+core architecture, for GDB,
2  the GNU Debugger.
3 
4  Copyright (C) 2006-2018 Free Software Foundation, Inc.
5 
6  Contributed by Qinwei (qinwei@sunnorth.com.cn)
7  Contributed by Ching-Peng Lin (cplin@sunplus.com)
8 
9  This file is part of GDB.
10 
11  This program is free software; you can redistribute it and/or modify
12  it under the terms of the GNU General Public License as published by
13  the Free Software Foundation; either version 3 of the License, or
14  (at your option) any later version.
15 
16  This program is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  GNU General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 
24 #include "defs.h"
25 #include "inferior.h"
26 #include "symtab.h"
27 #include "objfiles.h"
28 #include "gdbcore.h"
29 #include "target.h"
30 #include "arch-utils.h"
31 #include "regcache.h"
32 #include "regset.h"
33 #include "dis-asm.h"
34 #include "frame-unwind.h"
35 #include "frame-base.h"
36 #include "trad-frame.h"
37 #include "dwarf2-frame.h"
38 #include "score-tdep.h"
39 
40 #define G_FLD(_i,_ms,_ls) \
41  ((unsigned)((_i) << (31 - (_ms))) >> (31 - (_ms) + (_ls)))
42 
43 typedef struct{
44  unsigned long long v;
45  unsigned long long raw;
46  unsigned int len;
47 }inst_t;
48 
50 {
54 };
55 
56 static int target_mach = bfd_mach_score7;
57 
58 static struct type *
60 {
61  gdb_assert (regnum >= 0
62  && regnum < ((target_mach == bfd_mach_score7)
65 }
66 
67 static CORE_ADDR
68 score_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
69 {
71 }
72 
73 static CORE_ADDR
74 score_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
75 {
77 }
78 
79 static const char *
81 {
82  const char *score_register_names[] = {
83  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
84  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
85  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
86  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
87 
88  "PSR", "COND", "ECR", "EXCPVEC", "CCR",
89  "EPC", "EMA", "TLBLOCK", "TLBPT", "PEADDR",
90  "TLBRPT", "PEVN", "PECTX", "LIMPFN", "LDMPFN",
91  "PREV", "DREG", "PC", "DSAVE", "COUNTER",
92  "LDCR", "STCR", "CEH", "CEL",
93  };
94 
96  return score_register_names[regnum];
97 }
98 
99 static const char *
101 {
102  const char *score_register_names[] = {
103  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
104  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
105  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
106  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
107 
108  "PSR", "COND", "ECR", "EXCPVEC", "CCR",
109  "EPC", "EMA", "PREV", "DREG", "DSAVE",
110  "COUNTER", "LDCR", "STCR", "CEH", "CEL",
111  "", "", "PC",
112  };
113 
115  return score_register_names[regnum];
116 }
117 
118 #if WITH_SIM
119 static int
120 score_register_sim_regno (struct gdbarch *gdbarch, int regnum)
121 {
122  gdb_assert (regnum >= 0
123  && regnum < ((target_mach == bfd_mach_score7)
125  return regnum;
126 }
127 #endif
128 
129 static inst_t *
131 {
132  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
133  static inst_t inst = { 0, 0, 0 };
134  gdb_byte buf[SCORE_INSTLEN] = { 0 };
135  int big;
136  int ret;
137 
138  if (target_has_execution && memblock != NULL)
139  {
140  /* Fetch instruction from local MEMBLOCK. */
141  memcpy (buf, memblock, SCORE_INSTLEN);
142  }
143  else
144  {
145  /* Fetch instruction from target. */
146  ret = target_read_memory (addr & ~0x3, buf, SCORE_INSTLEN);
147  if (ret)
148  {
149  error (_("Error: target_read_memory in file:%s, line:%d!"),
150  __FILE__, __LINE__);
151  return 0;
152  }
153  }
154 
155  inst.raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);
156  inst.len = (inst.raw & 0x80008000) ? 4 : 2;
157  inst.v = ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
158  big = (byte_order == BFD_ENDIAN_BIG);
159  if (inst.len == 2)
160  {
161  if (big ^ ((addr & 0x2) == 2))
162  inst.v = G_FLD (inst.v, 29, 15);
163  else
164  inst.v = G_FLD (inst.v, 14, 0);
165  }
166  return &inst;
167 }
168 
169 static inst_t *
171  enum bfd_endian byte_order)
172 {
173  static inst_t inst = { 0, 0, 0 };
174 
175  struct breakplace
176  {
177  int break_offset;
178  int inst_len;
179  };
180  /* raw table 1 (column 2, 3, 4)
181  * 0 1 0 * # 2
182  * 0 1 1 0 # 3
183  0 1 1 0 * # 6
184  table 2 (column 1, 2, 3)
185  * 0 0 * * # 0, 4
186  0 1 0 * * # 2
187  1 1 0 * * # 6
188  */
189 
190  static const struct breakplace bk_table[16] =
191  {
192  /* table 1 */
193  {0, 0},
194  {0, 0},
195  {0, 4},
196  {0, 6},
197  {0, 0},
198  {0, 0},
199  {-2, 6},
200  {0, 0},
201  /* table 2 */
202  {0, 2},
203  {0, 0},
204  {-2, 4},
205  {0, 0},
206  {0, 2},
207  {0, 0},
208  {-4, 6},
209  {0, 0}
210  };
211 
212 #define EXTRACT_LEN 2
213  CORE_ADDR adjust_pc = *pcptr & ~0x1;
214  gdb_byte buf[5][EXTRACT_LEN] =
215  {
216  {'\0', '\0'},
217  {'\0', '\0'},
218  {'\0', '\0'},
219  {'\0', '\0'},
220  {'\0', '\0'}
221  };
222  int ret;
223  unsigned int raw;
224  unsigned int cbits = 0;
225  int bk_index;
226  int i, count;
227 
228  inst.v = 0;
229  inst.raw = 0;
230  inst.len = 0;
231 
232  adjust_pc -= 4;
233  for (i = 0; i < 5; i++)
234  {
235  ret = target_read_memory (adjust_pc + 2 * i, buf[i], EXTRACT_LEN);
236  if (ret != 0)
237  {
238  buf[i][0] = '\0';
239  buf[i][1] = '\0';
240  if (i == 2)
241  error (_("Error: target_read_memory in file:%s, line:%d!"),
242  __FILE__, __LINE__);
243  }
244 
245  raw = extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
246  cbits = (cbits << 1) | (raw >> 15);
247  }
248  adjust_pc += 4;
249 
250  if (cbits & 0x4)
251  {
252  /* table 1 */
253  cbits = (cbits >> 1) & 0x7;
254  bk_index = cbits;
255  }
256  else
257  {
258  /* table 2 */
259  cbits = (cbits >> 2) & 0x7;
260  bk_index = cbits + 8;
261  }
262 
263  gdb_assert (!((bk_table[bk_index].break_offset == 0)
264  && (bk_table[bk_index].inst_len == 0)));
265 
266  inst.len = bk_table[bk_index].inst_len;
267 
268  i = (bk_table[bk_index].break_offset + 4) / 2;
269  count = inst.len / 2;
270  for (; count > 0; i++, count--)
271  {
272  inst.raw = (inst.raw << 16)
273  | extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
274  }
275 
276  switch (inst.len)
277  {
278  case 2:
279  inst.v = inst.raw & 0x7FFF;
280  break;
281  case 4:
282  inst.v = ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
283  break;
284  case 6:
285  inst.v = ((inst.raw >> 32 & 0x7FFF) << 30)
286  | ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
287  break;
288  }
289 
290  if (pcptr)
291  *pcptr = adjust_pc + bk_table[bk_index].break_offset;
292  if (lenptr)
293  *lenptr = bk_table[bk_index].inst_len;
294 
295 #undef EXTRACT_LEN
296 
297  return &inst;
298 }
299 
300 /* Implement the breakpoint_kind_from_pc gdbarch method. */
301 
302 static int
304 {
305  int ret;
306  unsigned int raw;
307  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
308  gdb_byte buf[SCORE_INSTLEN] = { 0 };
309 
310  if ((ret = target_read_memory (*pcptr & ~0x3, buf, SCORE_INSTLEN)) != 0)
311  {
312  error (_("Error: target_read_memory in file:%s, line:%d!"),
313  __FILE__, __LINE__);
314  }
315  raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);
316 
317  if (!(raw & 0x80008000))
318  {
319  /* 16bits instruction. */
320  *pcptr &= ~0x1;
321  return 2;
322  }
323  else
324  {
325  /* 32bits instruction. */
326  *pcptr &= ~0x3;
327  return 4;
328  }
329 }
330 
331 /* Implement the sw_breakpoint_from_kind gdbarch method. */
332 
333 static const gdb_byte *
335 {
336  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
337 
338  *size = kind;
339 
340  if (kind == 4)
341  {
342  static gdb_byte big_breakpoint32[] = { 0x80, 0x00, 0x80, 0x06 };
343  static gdb_byte little_breakpoint32[] = { 0x06, 0x80, 0x00, 0x80 };
344 
345  if (byte_order == BFD_ENDIAN_BIG)
346  return big_breakpoint32;
347  else
348  return little_breakpoint32;
349  }
350  else
351  {
352  static gdb_byte big_breakpoint16[] = { 0x60, 0x02 };
353  static gdb_byte little_breakpoint16[] = { 0x02, 0x60 };
354 
355  if (byte_order == BFD_ENDIAN_BIG)
356  return big_breakpoint16;
357  else
358  return little_breakpoint16;
359  }
360 }
361 
362 /* Implement the breakpoint_kind_from_pc gdbarch method. */
363 
364 static int
366 {
367  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
368  int len;
369 
370  score3_adjust_pc_and_fetch_inst (pcptr, &len, byte_order);
371 
372  return len;
373 }
374 
375 /* Implement the sw_breakpoint_from_kind gdbarch method. */
376 
377 static const gdb_byte *
379 {
380  int index = 0;
381  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
382  static gdb_byte score_break_insns[6][6] = {
383  /* The following three instructions are big endian. */
384  { 0x00, 0x20 },
385  { 0x80, 0x00, 0x00, 0x06 },
386  { 0x80, 0x00, 0x80, 0x00, 0x00, 0x00 },
387  /* The following three instructions are little endian. */
388  { 0x20, 0x00 },
389  { 0x00, 0x80, 0x06, 0x00 },
390  { 0x00, 0x80, 0x00, 0x80, 0x00, 0x00 }};
391 
392  *size = kind;
393 
394  index = ((byte_order == BFD_ENDIAN_BIG) ? 0 : 3) + (kind / 2 - 1);
395  return score_break_insns[index];
396 }
397 
398 static CORE_ADDR
400 {
401  CORE_ADDR adjust_pc = bpaddr;
402 
403  if (target_mach == bfd_mach_score3)
404  score3_adjust_pc_and_fetch_inst (&adjust_pc, NULL,
406  else
407  adjust_pc = align_down (adjust_pc, 2);
408 
409  return adjust_pc;
410 }
411 
412 static CORE_ADDR
414 {
415  return align_down (addr, 16);
416 }
417 
418 static void
419 score_xfer_register (struct regcache *regcache, int regnum, int length,
420  enum bfd_endian endian, gdb_byte *readbuf,
421  const gdb_byte *writebuf, int buf_offset)
422 {
423  int reg_offset = 0;
424  gdb_assert (regnum >= 0
425  && regnum < ((target_mach == bfd_mach_score7)
427 
428  switch (endian)
429  {
430  case BFD_ENDIAN_BIG:
431  reg_offset = SCORE_REGSIZE - length;
432  break;
433  case BFD_ENDIAN_LITTLE:
434  reg_offset = 0;
435  break;
436  case BFD_ENDIAN_UNKNOWN:
437  reg_offset = 0;
438  break;
439  default:
440  error (_("Error: score_xfer_register in file:%s, line:%d!"),
441  __FILE__, __LINE__);
442  }
443 
444  if (readbuf != NULL)
446  readbuf + buf_offset);
447  if (writebuf != NULL)
449  writebuf + buf_offset);
450 }
451 
452 static enum return_value_convention
453 score_return_value (struct gdbarch *gdbarch, struct value *function,
454  struct type *type, struct regcache *regcache,
455  gdb_byte * readbuf, const gdb_byte * writebuf)
456 {
461  else
462  {
463  int offset;
464  int regnum;
465  for (offset = 0, regnum = SCORE_A0_REGNUM;
466  offset < TYPE_LENGTH (type);
468  {
469  int xfer = SCORE_REGSIZE;
470 
471  if (offset + xfer > TYPE_LENGTH (type))
472  xfer = TYPE_LENGTH (type) - offset;
475  readbuf, writebuf, offset);
476  }
478  }
479 }
480 
481 static struct frame_id
482 score_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
483 {
484  return frame_id_build (get_frame_register_unsigned (this_frame,
486  get_frame_pc (this_frame));
487 }
488 
489 static int
491 {
492  enum type_code typecode = TYPE_CODE (type);
493 
494  if ((typecode == TYPE_CODE_INT && TYPE_LENGTH (type) == 8)
495  || (typecode == TYPE_CODE_FLT && TYPE_LENGTH (type) == 8))
496  return 1;
497  else if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
498  {
499  int i, n;
500 
501  n = TYPE_NFIELDS (type);
502  for (i = 0; i < n; i++)
504  return 1;
505  return 0;
506  }
507  return 0;
508 }
509 
510 static CORE_ADDR
511 score_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
512  struct regcache *regcache, CORE_ADDR bp_addr,
513  int nargs, struct value **args, CORE_ADDR sp,
514  int struct_return, CORE_ADDR struct_addr)
515 {
516  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
517  int argnum;
518  int argreg;
519  int arglen = 0;
520  CORE_ADDR stack_offset = 0;
521  CORE_ADDR addr = 0;
522 
523  /* Step 1, Save RA. */
525 
526  /* Step 2, Make space on the stack for the args. */
527  struct_addr = align_down (struct_addr, 16);
528  sp = align_down (sp, 16);
529  for (argnum = 0; argnum < nargs; argnum++)
530  arglen += align_up (TYPE_LENGTH (value_type (args[argnum])),
531  SCORE_REGSIZE);
532  sp -= align_up (arglen, 16);
533 
534  argreg = SCORE_BEGIN_ARG_REGNUM;
535 
536  /* Step 3, Check if struct return then save the struct address to
537  r4 and increase the stack_offset by 4. */
538  if (struct_return)
539  {
540  regcache_cooked_write_unsigned (regcache, argreg++, struct_addr);
541  stack_offset += SCORE_REGSIZE;
542  }
543 
544  /* Step 4, Load arguments:
545  If arg length is too long (> 4 bytes), then split the arg and
546  save every parts. */
547  for (argnum = 0; argnum < nargs; argnum++)
548  {
549  struct value *arg = args[argnum];
550  struct type *arg_type = check_typedef (value_type (arg));
551  enum type_code typecode = TYPE_CODE (arg_type);
552  const gdb_byte *val = value_contents (arg);
553  int downward_offset = 0;
554  int arg_last_part_p = 0;
555 
556  arglen = TYPE_LENGTH (arg_type);
557 
558  /* If a arg should be aligned to 8 bytes (long long or double),
559  the value should be put to even register numbers. */
560  if (score_type_needs_double_align (arg_type))
561  {
562  if (argreg & 1)
563  argreg++;
564  }
565 
566  /* If sizeof a block < SCORE_REGSIZE, then Score GCC will chose
567  the default "downward"/"upward" method:
568 
569  Example:
570 
571  struct struc
572  {
573  char a; char b; char c;
574  } s = {'a', 'b', 'c'};
575 
576  Big endian: s = {X, 'a', 'b', 'c'}
577  Little endian: s = {'a', 'b', 'c', X}
578 
579  Where X is a hole. */
580 
581  if (gdbarch_byte_order(gdbarch) == BFD_ENDIAN_BIG
582  && (typecode == TYPE_CODE_STRUCT
583  || typecode == TYPE_CODE_UNION)
584  && argreg > SCORE_LAST_ARG_REGNUM
585  && arglen < SCORE_REGSIZE)
586  downward_offset += (SCORE_REGSIZE - arglen);
587 
588  while (arglen > 0)
589  {
590  int partial_len = arglen < SCORE_REGSIZE ? arglen : SCORE_REGSIZE;
591  ULONGEST regval = extract_unsigned_integer (val, partial_len,
592  byte_order);
593 
594  /* The last part of a arg should shift left when
595  gdbarch_byte_order is BFD_ENDIAN_BIG. */
596  if (byte_order == BFD_ENDIAN_BIG
597  && arg_last_part_p == 1
598  && (typecode == TYPE_CODE_STRUCT
599  || typecode == TYPE_CODE_UNION))
600  regval <<= ((SCORE_REGSIZE - partial_len) * TARGET_CHAR_BIT);
601 
602  /* Always increase the stack_offset and save args to stack. */
603  addr = sp + stack_offset + downward_offset;
604  write_memory (addr, val, partial_len);
605 
606  if (argreg <= SCORE_LAST_ARG_REGNUM)
607  {
608  regcache_cooked_write_unsigned (regcache, argreg++, regval);
609  if (arglen > SCORE_REGSIZE && arglen < SCORE_REGSIZE * 2)
610  arg_last_part_p = 1;
611  }
612 
613  val += partial_len;
614  arglen -= partial_len;
615  stack_offset += align_up (partial_len, SCORE_REGSIZE);
616  }
617  }
618 
619  /* Step 5, Save SP. */
621 
622  return sp;
623 }
624 
625 static CORE_ADDR
627 {
628  CORE_ADDR cpc = pc;
629  int iscan = 32, stack_sub = 0;
630  while (iscan-- > 0)
631  {
632  inst_t *inst = score7_fetch_inst (gdbarch, cpc, NULL);
633  if (!inst)
634  break;
635  if ((inst->len == 4) && !stack_sub
636  && (G_FLD (inst->v, 29, 25) == 0x1
637  && G_FLD (inst->v, 24, 20) == 0x0))
638  {
639  /* addi r0, offset */
640  stack_sub = cpc + SCORE_INSTLEN;
641  pc = cpc + SCORE_INSTLEN;
642  }
643  else if ((inst->len == 4)
644  && (G_FLD (inst->v, 29, 25) == 0x0)
645  && (G_FLD (inst->v, 24, 20) == 0x2)
646  && (G_FLD (inst->v, 19, 15) == 0x0)
647  && (G_FLD (inst->v, 14, 10) == 0xF)
648  && (G_FLD (inst->v, 9, 0) == 0x56))
649  {
650  /* mv r2, r0 */
651  pc = cpc + SCORE_INSTLEN;
652  break;
653  }
654  else if ((inst->len == 2)
655  && (G_FLD (inst->v, 14, 12) == 0x0)
656  && (G_FLD (inst->v, 11, 8) == 0x2)
657  && (G_FLD (inst->v, 7, 4) == 0x0)
658  && (G_FLD (inst->v, 3, 0) == 0x3))
659  {
660  /* mv! r2, r0 */
661  pc = cpc + SCORE16_INSTLEN;
662  break;
663  }
664  else if ((inst->len == 2)
665  && ((G_FLD (inst->v, 14, 12) == 3) /* j15 form */
666  || (G_FLD (inst->v, 14, 12) == 4) /* b15 form */
667  || (G_FLD (inst->v, 14, 12) == 0x0
668  && G_FLD (inst->v, 3, 0) == 0x4))) /* br! */
669  break;
670  else if ((inst->len == 4)
671  && ((G_FLD (inst->v, 29, 25) == 2) /* j32 form */
672  || (G_FLD (inst->v, 29, 25) == 4) /* b32 form */
673  || (G_FLD (inst->v, 29, 25) == 0x0
674  && G_FLD (inst->v, 6, 1) == 0x4))) /* br */
675  break;
676 
677  cpc += (inst->len == 2) ? SCORE16_INSTLEN : SCORE_INSTLEN;
678  }
679  return pc;
680 }
681 
682 static CORE_ADDR
684 {
685  CORE_ADDR cpc = pc;
686  int iscan = 32, stack_sub = 0;
687  while (iscan-- > 0)
688  {
689  inst_t *inst
690  = score3_adjust_pc_and_fetch_inst (&cpc, NULL,
692 
693  if (!inst)
694  break;
695  if (inst->len == 4 && !stack_sub
696  && (G_FLD (inst->v, 29, 25) == 0x1)
697  && (G_FLD (inst->v, 19, 17) == 0x0)
698  && (G_FLD (inst->v, 24, 20) == 0x0))
699  {
700  /* addi r0, offset */
701  stack_sub = cpc + inst->len;
702  pc = cpc + inst->len;
703  }
704  else if (inst->len == 4
705  && (G_FLD (inst->v, 29, 25) == 0x0)
706  && (G_FLD (inst->v, 24, 20) == 0x2)
707  && (G_FLD (inst->v, 19, 15) == 0x0)
708  && (G_FLD (inst->v, 14, 10) == 0xF)
709  && (G_FLD (inst->v, 9, 0) == 0x56))
710  {
711  /* mv r2, r0 */
712  pc = cpc + inst->len;
713  break;
714  }
715  else if ((inst->len == 2)
716  && (G_FLD (inst->v, 14, 10) == 0x10)
717  && (G_FLD (inst->v, 9, 5) == 0x2)
718  && (G_FLD (inst->v, 4, 0) == 0x0))
719  {
720  /* mv! r2, r0 */
721  pc = cpc + inst->len;
722  break;
723  }
724  else if (inst->len == 2
725  && ((G_FLD (inst->v, 14, 12) == 3) /* b15 form */
726  || (G_FLD (inst->v, 14, 12) == 0x0
727  && G_FLD (inst->v, 11, 5) == 0x4))) /* br! */
728  break;
729  else if (inst->len == 4
730  && ((G_FLD (inst->v, 29, 25) == 2) /* j32 form */
731  || (G_FLD (inst->v, 29, 25) == 4))) /* b32 form */
732  break;
733 
734  cpc += inst->len;
735  }
736  return pc;
737 }
738 
739 /* Implement the stack_frame_destroyed_p gdbarch method. */
740 
741 static int
743 {
744  inst_t *inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
745 
746  if (inst->v == 0x23)
747  return 1; /* mv! r0, r2 */
748  else if (G_FLD (inst->v, 14, 12) == 0x2
749  && G_FLD (inst->v, 3, 0) == 0xa)
750  return 1; /* pop! */
751  else if (G_FLD (inst->v, 14, 12) == 0x0
752  && G_FLD (inst->v, 7, 0) == 0x34)
753  return 1; /* br! r3 */
754  else if (G_FLD (inst->v, 29, 15) == 0x2
755  && G_FLD (inst->v, 6, 1) == 0x2b)
756  return 1; /* mv r0, r2 */
757  else if (G_FLD (inst->v, 29, 25) == 0x0
758  && G_FLD (inst->v, 6, 1) == 0x4
759  && G_FLD (inst->v, 19, 15) == 0x3)
760  return 1; /* br r3 */
761  else
762  return 0;
763 }
764 
765 /* Implement the stack_frame_destroyed_p gdbarch method. */
766 
767 static int
769 {
770  CORE_ADDR pc = cur_pc;
771  inst_t *inst
772  = score3_adjust_pc_and_fetch_inst (&pc, NULL,
774 
775  if (inst->len == 2
776  && (G_FLD (inst->v, 14, 10) == 0x10)
777  && (G_FLD (inst->v, 9, 5) == 0x0)
778  && (G_FLD (inst->v, 4, 0) == 0x2))
779  return 1; /* mv! r0, r2 */
780  else if (inst->len == 4
781  && (G_FLD (inst->v, 29, 25) == 0x0)
782  && (G_FLD (inst->v, 24, 20) == 0x2)
783  && (G_FLD (inst->v, 19, 15) == 0x0)
784  && (G_FLD (inst->v, 14, 10) == 0xF)
785  && (G_FLD (inst->v, 9, 0) == 0x56))
786  return 1; /* mv r0, r2 */
787  else if (inst->len == 2
788  && (G_FLD (inst->v, 14, 12) == 0x0)
789  && (G_FLD (inst->v, 11, 5) == 0x2))
790  return 1; /* pop! */
791  else if (inst->len == 2
792  && (G_FLD (inst->v, 14, 12) == 0x0)
793  && (G_FLD (inst->v, 11, 7) == 0x0)
794  && (G_FLD (inst->v, 6, 5) == 0x2))
795  return 1; /* rpop! */
796  else if (inst->len == 2
797  && (G_FLD (inst->v, 14, 12) == 0x0)
798  && (G_FLD (inst->v, 11, 5) == 0x4)
799  && (G_FLD (inst->v, 4, 0) == 0x3))
800  return 1; /* br! r3 */
801  else if (inst->len == 4
802  && (G_FLD (inst->v, 29, 25) == 0x0)
803  && (G_FLD (inst->v, 24, 20) == 0x0)
804  && (G_FLD (inst->v, 19, 15) == 0x3)
805  && (G_FLD (inst->v, 14, 10) == 0xF)
806  && (G_FLD (inst->v, 9, 0) == 0x8))
807  return 1; /* br r3 */
808  else
809  return 0;
810 }
811 
812 static gdb_byte *
814 {
815  int ret;
816  gdb_byte *memblock = NULL;
817 
818  if (size == 0)
819  return NULL;
820 
821  memblock = (gdb_byte *) xmalloc (size);
822  memset (memblock, 0, size);
823  ret = target_read_memory (addr & ~0x3, memblock, size);
824  if (ret)
825  {
826  error (_("Error: target_read_memory in file:%s, line:%d!"),
827  __FILE__, __LINE__);
828  return NULL;
829  }
830  return memblock;
831 }
832 
833 static void
835 {
836  xfree (memblock);
837 }
838 
839 static void
841  CORE_ADDR cur_pc)
842 {
843  if (prev_pc == -1)
844  {
845  /* First time call this function, do nothing. */
846  }
847  else if (cur_pc - prev_pc == 2 && (cur_pc & 0x3) == 0)
848  {
849  /* First 16-bit instruction, then 32-bit instruction. */
850  *memblock += SCORE_INSTLEN;
851  }
852  else if (cur_pc - prev_pc == 4)
853  {
854  /* Is 32-bit instruction, increase MEMBLOCK by 4. */
855  *memblock += SCORE_INSTLEN;
856  }
857 }
858 
859 static void
861  struct frame_info *this_frame,
862  struct score_frame_cache *this_cache)
863 {
864  struct gdbarch *gdbarch = get_frame_arch (this_frame);
865  CORE_ADDR sp;
866  CORE_ADDR fp;
867  CORE_ADDR cur_pc = startaddr;
868 
869  int sp_offset = 0;
870  int ra_offset = 0;
871  int fp_offset = 0;
872  int ra_offset_p = 0;
873  int fp_offset_p = 0;
874  int inst_len = 0;
875 
876  gdb_byte *memblock = NULL;
877  gdb_byte *memblock_ptr = NULL;
878  CORE_ADDR prev_pc = -1;
879 
880  /* Allocate MEMBLOCK if PC - STARTADDR > 0. */
881  memblock_ptr = memblock =
882  score7_malloc_and_get_memblock (startaddr, pc - startaddr);
883 
884  sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
885  fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
886 
887  for (; cur_pc < pc; prev_pc = cur_pc, cur_pc += inst_len)
888  {
889  inst_t *inst = NULL;
890  if (memblock != NULL)
891  {
892  /* Reading memory block from target succefully and got all
893  the instructions(from STARTADDR to PC) needed. */
894  score7_adjust_memblock_ptr (&memblock, prev_pc, cur_pc);
895  inst = score7_fetch_inst (gdbarch, cur_pc, memblock);
896  }
897  else
898  {
899  /* Otherwise, we fetch 4 bytes from target, and GDB also
900  work correctly. */
901  inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
902  }
903 
904  /* FIXME: make a full-power prologue analyzer. */
905  if (inst->len == 2)
906  {
907  inst_len = SCORE16_INSTLEN;
908 
909  if (G_FLD (inst->v, 14, 12) == 0x2
910  && G_FLD (inst->v, 3, 0) == 0xe)
911  {
912  /* push! */
913  sp_offset += 4;
914 
915  if (G_FLD (inst->v, 11, 7) == 0x6
916  && ra_offset_p == 0)
917  {
918  /* push! r3, [r0] */
919  ra_offset = sp_offset;
920  ra_offset_p = 1;
921  }
922  else if (G_FLD (inst->v, 11, 7) == 0x4
923  && fp_offset_p == 0)
924  {
925  /* push! r2, [r0] */
926  fp_offset = sp_offset;
927  fp_offset_p = 1;
928  }
929  }
930  else if (G_FLD (inst->v, 14, 12) == 0x2
931  && G_FLD (inst->v, 3, 0) == 0xa)
932  {
933  /* pop! */
934  sp_offset -= 4;
935  }
936  else if (G_FLD (inst->v, 14, 7) == 0xc1
937  && G_FLD (inst->v, 2, 0) == 0x0)
938  {
939  /* subei! r0, n */
940  sp_offset += (int) pow (2, G_FLD (inst->v, 6, 3));
941  }
942  else if (G_FLD (inst->v, 14, 7) == 0xc0
943  && G_FLD (inst->v, 2, 0) == 0x0)
944  {
945  /* addei! r0, n */
946  sp_offset -= (int) pow (2, G_FLD (inst->v, 6, 3));
947  }
948  }
949  else
950  {
951  inst_len = SCORE_INSTLEN;
952 
953  if (G_FLD(inst->v, 29, 25) == 0x3
954  && G_FLD(inst->v, 2, 0) == 0x4
955  && G_FLD(inst->v, 19, 15) == 0)
956  {
957  /* sw rD, [r0, offset]+ */
958  sp_offset += SCORE_INSTLEN;
959 
960  if (G_FLD(inst->v, 24, 20) == 0x3)
961  {
962  /* rD = r3 */
963  if (ra_offset_p == 0)
964  {
965  ra_offset = sp_offset;
966  ra_offset_p = 1;
967  }
968  }
969  else if (G_FLD(inst->v, 24, 20) == 0x2)
970  {
971  /* rD = r2 */
972  if (fp_offset_p == 0)
973  {
974  fp_offset = sp_offset;
975  fp_offset_p = 1;
976  }
977  }
978  }
979  else if (G_FLD(inst->v, 29, 25) == 0x14
980  && G_FLD(inst->v, 19,15) == 0)
981  {
982  /* sw rD, [r0, offset] */
983  if (G_FLD(inst->v, 24, 20) == 0x3)
984  {
985  /* rD = r3 */
986  ra_offset = sp_offset - G_FLD(inst->v, 14, 0);
987  ra_offset_p = 1;
988  }
989  else if (G_FLD(inst->v, 24, 20) == 0x2)
990  {
991  /* rD = r2 */
992  fp_offset = sp_offset - G_FLD(inst->v, 14, 0);
993  fp_offset_p = 1;
994  }
995  }
996  else if (G_FLD (inst->v, 29, 15) == 0x1c60
997  && G_FLD (inst->v, 2, 0) == 0x0)
998  {
999  /* lw r3, [r0]+, 4 */
1000  sp_offset -= SCORE_INSTLEN;
1001  ra_offset_p = 1;
1002  }
1003  else if (G_FLD (inst->v, 29, 15) == 0x1c40
1004  && G_FLD (inst->v, 2, 0) == 0x0)
1005  {
1006  /* lw r2, [r0]+, 4 */
1007  sp_offset -= SCORE_INSTLEN;
1008  fp_offset_p = 1;
1009  }
1010 
1011  else if (G_FLD (inst->v, 29, 17) == 0x100
1012  && G_FLD (inst->v, 0, 0) == 0x0)
1013  {
1014  /* addi r0, -offset */
1015  sp_offset += 65536 - G_FLD (inst->v, 16, 1);
1016  }
1017  else if (G_FLD (inst->v, 29, 17) == 0x110
1018  && G_FLD (inst->v, 0, 0) == 0x0)
1019  {
1020  /* addi r2, offset */
1021  if (pc - cur_pc > 4)
1022  {
1023  unsigned int save_v = inst->v;
1024  inst_t *inst2 =
1025  score7_fetch_inst (gdbarch, cur_pc + SCORE_INSTLEN, NULL);
1026  if (inst2->v == 0x23)
1027  {
1028  /* mv! r0, r2 */
1029  sp_offset -= G_FLD (save_v, 16, 1);
1030  }
1031  }
1032  }
1033  }
1034  }
1035 
1036  /* Save RA. */
1037  if (ra_offset_p == 1)
1038  {
1039  if (this_cache->saved_regs[SCORE_PC_REGNUM].addr == -1)
1040  this_cache->saved_regs[SCORE_PC_REGNUM].addr =
1041  sp + sp_offset - ra_offset;
1042  }
1043  else
1044  {
1045  this_cache->saved_regs[SCORE_PC_REGNUM] =
1046  this_cache->saved_regs[SCORE_RA_REGNUM];
1047  }
1048 
1049  /* Save FP. */
1050  if (fp_offset_p == 1)
1051  {
1052  if (this_cache->saved_regs[SCORE_FP_REGNUM].addr == -1)
1053  this_cache->saved_regs[SCORE_FP_REGNUM].addr =
1054  sp + sp_offset - fp_offset;
1055  }
1056 
1057  /* Save SP and FP. */
1058  this_cache->base = sp + sp_offset;
1059  this_cache->fp = fp;
1060 
1061  /* Don't forget to free MEMBLOCK if we allocated it. */
1062  if (memblock_ptr != NULL)
1063  score7_free_memblock (memblock_ptr);
1064 }
1065 
1066 static void
1068  struct frame_info *this_frame,
1069  struct score_frame_cache *this_cache)
1070 {
1071  CORE_ADDR sp;
1072  CORE_ADDR fp;
1073  CORE_ADDR cur_pc = startaddr;
1074  enum bfd_endian byte_order
1075  = gdbarch_byte_order (get_frame_arch (this_frame));
1076 
1077  int sp_offset = 0;
1078  int ra_offset = 0;
1079  int fp_offset = 0;
1080  int ra_offset_p = 0;
1081  int fp_offset_p = 0;
1082  int inst_len = 0;
1083 
1084  sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
1085  fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
1086 
1087  for (; cur_pc < pc; cur_pc += inst_len)
1088  {
1089  inst_t *inst = NULL;
1090 
1091  inst = score3_adjust_pc_and_fetch_inst (&cur_pc, &inst_len, byte_order);
1092 
1093  /* FIXME: make a full-power prologue analyzer. */
1094  if (inst->len == 2)
1095  {
1096  if (G_FLD (inst->v, 14, 12) == 0x0
1097  && G_FLD (inst->v, 11, 7) == 0x0
1098  && G_FLD (inst->v, 6, 5) == 0x3)
1099  {
1100  /* push! */
1101  sp_offset += 4;
1102 
1103  if (G_FLD (inst->v, 4, 0) == 0x3
1104  && ra_offset_p == 0)
1105  {
1106  /* push! r3, [r0] */
1107  ra_offset = sp_offset;
1108  ra_offset_p = 1;
1109  }
1110  else if (G_FLD (inst->v, 4, 0) == 0x2
1111  && fp_offset_p == 0)
1112  {
1113  /* push! r2, [r0] */
1114  fp_offset = sp_offset;
1115  fp_offset_p = 1;
1116  }
1117  }
1118  else if (G_FLD (inst->v, 14, 12) == 0x6
1119  && G_FLD (inst->v, 11, 10) == 0x3)
1120  {
1121  /* rpush! */
1122  int start_r = G_FLD (inst->v, 9, 5);
1123  int cnt = G_FLD (inst->v, 4, 0);
1124 
1125  if ((ra_offset_p == 0)
1126  && (start_r <= SCORE_RA_REGNUM)
1127  && (SCORE_RA_REGNUM < start_r + cnt))
1128  {
1129  /* rpush! contains r3 */
1130  ra_offset_p = 1;
1131  ra_offset = sp_offset + 4 * (SCORE_RA_REGNUM - start_r) + 4;
1132  }
1133 
1134  if ((fp_offset_p == 0)
1135  && (start_r <= SCORE_FP_REGNUM)
1136  && (SCORE_FP_REGNUM < start_r + cnt))
1137  {
1138  /* rpush! contains r2 */
1139  fp_offset_p = 1;
1140  fp_offset = sp_offset + 4 * (SCORE_FP_REGNUM - start_r) + 4;
1141  }
1142 
1143  sp_offset += 4 * cnt;
1144  }
1145  else if (G_FLD (inst->v, 14, 12) == 0x0
1146  && G_FLD (inst->v, 11, 7) == 0x0
1147  && G_FLD (inst->v, 6, 5) == 0x2)
1148  {
1149  /* pop! */
1150  sp_offset -= 4;
1151  }
1152  else if (G_FLD (inst->v, 14, 12) == 0x6
1153  && G_FLD (inst->v, 11, 10) == 0x2)
1154  {
1155  /* rpop! */
1156  sp_offset -= 4 * G_FLD (inst->v, 4, 0);
1157  }
1158  else if (G_FLD (inst->v, 14, 12) == 0x5
1159  && G_FLD (inst->v, 11, 10) == 0x3
1160  && G_FLD (inst->v, 9, 6) == 0x0)
1161  {
1162  /* addi! r0, -offset */
1163  int imm = G_FLD (inst->v, 5, 0);
1164  if (imm >> 5)
1165  imm = -(0x3F - imm + 1);
1166  sp_offset -= imm;
1167  }
1168  else if (G_FLD (inst->v, 14, 12) == 0x5
1169  && G_FLD (inst->v, 11, 10) == 0x3
1170  && G_FLD (inst->v, 9, 6) == 0x2)
1171  {
1172  /* addi! r2, offset */
1173  if (pc - cur_pc >= 2)
1174  {
1175  inst_t *inst2;
1176 
1177  cur_pc += inst->len;
1178  inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
1179  byte_order);
1180 
1181  if (inst2->len == 2
1182  && G_FLD (inst2->v, 14, 10) == 0x10
1183  && G_FLD (inst2->v, 9, 5) == 0x0
1184  && G_FLD (inst2->v, 4, 0) == 0x2)
1185  {
1186  /* mv! r0, r2 */
1187  int imm = G_FLD (inst->v, 5, 0);
1188  if (imm >> 5)
1189  imm = -(0x3F - imm + 1);
1190  sp_offset -= imm;
1191  }
1192  }
1193  }
1194  }
1195  else if (inst->len == 4)
1196  {
1197  if (G_FLD (inst->v, 29, 25) == 0x3
1198  && G_FLD (inst->v, 2, 0) == 0x4
1199  && G_FLD (inst->v, 24, 20) == 0x3
1200  && G_FLD (inst->v, 19, 15) == 0x0)
1201  {
1202  /* sw r3, [r0, offset]+ */
1203  sp_offset += inst->len;
1204  if (ra_offset_p == 0)
1205  {
1206  ra_offset = sp_offset;
1207  ra_offset_p = 1;
1208  }
1209  }
1210  else if (G_FLD (inst->v, 29, 25) == 0x3
1211  && G_FLD (inst->v, 2, 0) == 0x4
1212  && G_FLD (inst->v, 24, 20) == 0x2
1213  && G_FLD (inst->v, 19, 15) == 0x0)
1214  {
1215  /* sw r2, [r0, offset]+ */
1216  sp_offset += inst->len;
1217  if (fp_offset_p == 0)
1218  {
1219  fp_offset = sp_offset;
1220  fp_offset_p = 1;
1221  }
1222  }
1223  else if (G_FLD (inst->v, 29, 25) == 0x7
1224  && G_FLD (inst->v, 2, 0) == 0x0
1225  && G_FLD (inst->v, 24, 20) == 0x3
1226  && G_FLD (inst->v, 19, 15) == 0x0)
1227  {
1228  /* lw r3, [r0]+, 4 */
1229  sp_offset -= inst->len;
1230  ra_offset_p = 1;
1231  }
1232  else if (G_FLD (inst->v, 29, 25) == 0x7
1233  && G_FLD (inst->v, 2, 0) == 0x0
1234  && G_FLD (inst->v, 24, 20) == 0x2
1235  && G_FLD (inst->v, 19, 15) == 0x0)
1236  {
1237  /* lw r2, [r0]+, 4 */
1238  sp_offset -= inst->len;
1239  fp_offset_p = 1;
1240  }
1241  else if (G_FLD (inst->v, 29, 25) == 0x1
1242  && G_FLD (inst->v, 19, 17) == 0x0
1243  && G_FLD (inst->v, 24, 20) == 0x0
1244  && G_FLD (inst->v, 0, 0) == 0x0)
1245  {
1246  /* addi r0, -offset */
1247  int imm = G_FLD (inst->v, 16, 1);
1248  if (imm >> 15)
1249  imm = -(0xFFFF - imm + 1);
1250  sp_offset -= imm;
1251  }
1252  else if (G_FLD (inst->v, 29, 25) == 0x1
1253  && G_FLD (inst->v, 19, 17) == 0x0
1254  && G_FLD (inst->v, 24, 20) == 0x2
1255  && G_FLD (inst->v, 0, 0) == 0x0)
1256  {
1257  /* addi r2, offset */
1258  if (pc - cur_pc >= 2)
1259  {
1260  inst_t *inst2;
1261 
1262  cur_pc += inst->len;
1263  inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
1264  byte_order);
1265 
1266  if (inst2->len == 2
1267  && G_FLD (inst2->v, 14, 10) == 0x10
1268  && G_FLD (inst2->v, 9, 5) == 0x0
1269  && G_FLD (inst2->v, 4, 0) == 0x2)
1270  {
1271  /* mv! r0, r2 */
1272  int imm = G_FLD (inst->v, 16, 1);
1273  if (imm >> 15)
1274  imm = -(0xFFFF - imm + 1);
1275  sp_offset -= imm;
1276  }
1277  }
1278  }
1279  }
1280  }
1281 
1282  /* Save RA. */
1283  if (ra_offset_p == 1)
1284  {
1285  if (this_cache->saved_regs[SCORE_PC_REGNUM].addr == -1)
1286  this_cache->saved_regs[SCORE_PC_REGNUM].addr =
1287  sp + sp_offset - ra_offset;
1288  }
1289  else
1290  {
1291  this_cache->saved_regs[SCORE_PC_REGNUM] =
1292  this_cache->saved_regs[SCORE_RA_REGNUM];
1293  }
1294 
1295  /* Save FP. */
1296  if (fp_offset_p == 1)
1297  {
1298  if (this_cache->saved_regs[SCORE_FP_REGNUM].addr == -1)
1299  this_cache->saved_regs[SCORE_FP_REGNUM].addr =
1300  sp + sp_offset - fp_offset;
1301  }
1302 
1303  /* Save SP and FP. */
1304  this_cache->base = sp + sp_offset;
1305  this_cache->fp = fp;
1306 }
1307 
1308 static struct score_frame_cache *
1309 score_make_prologue_cache (struct frame_info *this_frame, void **this_cache)
1310 {
1311  struct score_frame_cache *cache;
1312 
1313  if ((*this_cache) != NULL)
1314  return (struct score_frame_cache *) (*this_cache);
1315 
1316  cache = FRAME_OBSTACK_ZALLOC (struct score_frame_cache);
1317  (*this_cache) = cache;
1318  cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1319 
1320  /* Analyze the prologue. */
1321  {
1322  const CORE_ADDR pc = get_frame_pc (this_frame);
1323  CORE_ADDR start_addr;
1324 
1325  find_pc_partial_function (pc, NULL, &start_addr, NULL);
1326  if (start_addr == 0)
1327  return cache;
1328 
1329  if (target_mach == bfd_mach_score3)
1330  score3_analyze_prologue (start_addr, pc, this_frame,
1331  (struct score_frame_cache *) *this_cache);
1332  else
1333  score7_analyze_prologue (start_addr, pc, this_frame,
1334  (struct score_frame_cache *) *this_cache);
1335  }
1336 
1337  /* Save SP. */
1339 
1340  return (struct score_frame_cache *) (*this_cache);
1341 }
1342 
1343 static void
1344 score_prologue_this_id (struct frame_info *this_frame, void **this_cache,
1345  struct frame_id *this_id)
1346 {
1347  struct score_frame_cache *info = score_make_prologue_cache (this_frame,
1348  this_cache);
1349  (*this_id) = frame_id_build (info->base, get_frame_func (this_frame));
1350 }
1351 
1352 static struct value *
1354  void **this_cache, int regnum)
1355 {
1356  struct score_frame_cache *info = score_make_prologue_cache (this_frame,
1357  this_cache);
1358  return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
1359 }
1360 
1362 {
1363  NORMAL_FRAME,
1367  NULL,
1369  NULL
1370 };
1371 
1372 static CORE_ADDR
1374  void **this_cache)
1375 {
1376  struct score_frame_cache *info =
1377  score_make_prologue_cache (this_frame, this_cache);
1378  return info->fp;
1379 }
1380 
1382 {
1387 };
1388 
1389 static const struct frame_base *
1391 {
1392  return &score_prologue_frame_base;
1393 }
1394 
1395 /* Core file support. */
1396 
1398  {
1399  /* FIXME: According to the current Linux kernel, r0 is preceded by
1400  9 rather than 7 words. */
1401  { 7, REGCACHE_MAP_SKIP, 4 },
1402  { 32, 0, 4 }, /* r0 ... r31 */
1403  { 1, 55, 4 }, /* CEL */
1404  { 1, 54, 4 }, /* CEH */
1405  { 1, 53, 4 }, /* sr0, i.e. cnt or COUNTER */
1406  { 1, 52, 4 }, /* sr1, i.e. lcr or LDCR */
1407  { 1, 51, 4 }, /* sr2, i.e. scr or STCR */
1408  { 1, 49, 4 }, /* PC (same slot as EPC) */
1409  { 1, 38, 4 }, /* EMA */
1410  { 1, 32, 4 }, /* PSR */
1411  { 1, 34, 4 }, /* ECR */
1412  { 1, 33, 4 }, /* COND */
1413  { 0 }
1414  };
1415 
1416 #define SCORE7_LINUX_EPC_OFFSET (44 * 4)
1417 #define SCORE7_LINUX_SIZEOF_GREGSET (49 * 4)
1418 
1419 static void
1421  struct regcache *regcache,
1422  int regnum, const void *buf,
1423  size_t size)
1424 {
1426 
1427  /* Supply the EPC from the same slot as the PC. Note that the
1428  collect function will store the PC in that slot. */
1429  if ((regnum == -1 || regnum == SCORE_EPC_REGNUM)
1430  && size >= SCORE7_LINUX_EPC_OFFSET + 4)
1432  (const gdb_byte *) buf
1434 }
1435 
1436 static const struct regset score7_linux_gregset =
1437  {
1441  };
1442 
1443 /* Iterate over core file register note sections. */
1444 
1445 static void
1448  void *cb_data,
1449  const struct regcache *regcache)
1450 {
1452  NULL, cb_data);
1453 }
1454 
1455 static struct gdbarch *
1456 score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1457 {
1458  struct gdbarch *gdbarch;
1459  target_mach = info.bfd_arch_info->mach;
1460 
1461  arches = gdbarch_list_lookup_by_info (arches, &info);
1462  if (arches != NULL)
1463  {
1464  return (arches->gdbarch);
1465  }
1466  gdbarch = gdbarch_alloc (&info, NULL);
1467 
1473 #if WITH_SIM
1474  set_gdbarch_register_sim_regno (gdbarch, score_register_sim_regno);
1475 #endif
1485 
1486  switch (target_mach)
1487  {
1488  case bfd_mach_score7:
1498  /* Core file support. */
1501  break;
1502 
1503  case bfd_mach_score3:
1513  break;
1514  }
1515 
1516  /* Watchpoint hooks. */
1518 
1519  /* Dummy frame hooks. */
1524 
1525  /* Normal frame hooks. */
1530 
1531  return gdbarch;
1532 }
1533 
1534 void
1536 {
1537  gdbarch_register (bfd_arch_score, score_gdbarch_init, NULL);
1538 }
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
void set_gdbarch_have_nonsteppable_watchpoint(struct gdbarch *gdbarch, int have_nonsteppable_watchpoint)
Definition: gdbarch.c:3493
static const struct regset score7_linux_gregset
Definition: score-tdep.c:1436
type_code
Definition: gdbtypes.h:80
static CORE_ADDR score7_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: score-tdep.c:626
static int score3_stack_frame_destroyed_p(struct gdbarch *gdbarch, CORE_ADDR cur_pc)
Definition: score-tdep.c:768
static int reg_offset[]
Definition: i386-gnu-nat.c:46
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:624
static int score_type_needs_double_align(struct type *type)
Definition: score-tdep.c:490
struct trad_frame_saved_reg * saved_regs
Definition: score-tdep.c:53
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
bfd_vma CORE_ADDR
Definition: common-types.h:41
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 *)
void() iterate_over_regset_sections_cb(const char *sect_name, int size, const struct regset *regset, const char *human_name, void *cb_data)
Definition: gdbarch.h:99
void trad_frame_set_value(struct trad_frame_saved_reg this_saved_regs[], int regnum, LONGEST val)
Definition: trad-frame.c:99
ULONGEST align_down(ULONGEST v, int n)
Definition: utils.c:3005
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1279
void set_gdbarch_short_bit(struct gdbarch *gdbarch, int short_bit)
Definition: gdbarch.c:1572
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
Definition: gdbtypes.c:5217
void * memset(T *s, int c, size_t n)=delete
return_value_convention
Definition: defs.h:247
void regcache_supply_regset(const struct regset *regset, struct regcache *regcache, int regnum, const void *buf, size_t size)
Definition: regcache.c:1192
static void score7_linux_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
Definition: score-tdep.c:1446
static struct frame_id score_dummy_id(struct gdbarch *gdbarch, struct frame_info *this_frame)
Definition: score-tdep.c:482
void regcache_cooked_write_part(struct regcache *regcache, int regnum, int offset, int len, const gdb_byte *buf)
Definition: regcache.c:987
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
Definition: gdbarch.c:5309
static int target_mach
Definition: score-tdep.c:56
static struct gdbarch * score_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
Definition: score-tdep.c:1456
#define SCORE7_LINUX_EPC_OFFSET
Definition: score-tdep.c:1416
#define _(String)
Definition: gdb_locale.h:35
const struct bfd_arch_info * bfd_arch_info
Definition: gdbarch.h:1629
static CORE_ADDR score3_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: score-tdep.c:683
#define TYPE_FIELD_TYPE(thistype, n)
Definition: gdbtypes.h:1371
unsigned long long raw
Definition: score-tdep.c:45
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:79
#define SCORE_BEGIN_ARG_REGNUM
Definition: score-tdep.h:44
#define FRAME_OBSTACK_ZALLOC(TYPE)
Definition: frame.h:678
void gdbarch_register(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init, gdbarch_dump_tdep_ftype *dump_tdep)
Definition: gdbarch.c:5257
Definition: regset.h:34
static const struct frame_base * score_prologue_frame_base_sniffer(struct frame_info *this_frame)
Definition: score-tdep.c:1390
static gdb_byte * score7_malloc_and_get_memblock(CORE_ADDR addr, CORE_ADDR size)
Definition: score-tdep.c:813
static CORE_ADDR score_unwind_pc(struct gdbarch *gdbarch, struct frame_info *next_frame)
Definition: score-tdep.c:74
#define SCORE_LAST_ARG_REGNUM
Definition: score-tdep.h:45
#define AT_ENTRY_POINT
Definition: inferior.h:264
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 struct frame_base * dwarf2_frame_base_sniffer(struct frame_info *this_frame)
const gdb_byte * value_contents(struct value *value)
Definition: value.c:1407
#define EXTRACT_LEN
static const struct frame_base score_prologue_frame_base
Definition: score-tdep.c:1381
static const char * score3_register_name(struct gdbarch *gdbarch, int regnum)
Definition: score-tdep.c:100
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
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
Definition: gdbarch.c:2156
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype dummy_id)
Definition: gdbarch.c:2340
static struct value * score_prologue_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
Definition: score-tdep.c:1353
struct_return
Definition: arm-tdep.h:88
void set_gdbarch_adjust_breakpoint_address(struct gdbarch *gdbarch, gdbarch_adjust_breakpoint_address_ftype adjust_breakpoint_address)
Definition: gdbarch.c:2929
#define SCORE_REGSIZE
Definition: score-tdep.h:41
static void score_prologue_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
Definition: score-tdep.c:1344
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
static CORE_ADDR score_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: score-tdep.c:511
void set_gdbarch_register_sim_regno(struct gdbarch *gdbarch, gdbarch_register_sim_regno_ftype register_sim_regno)
Definition: gdbarch.c:2514
#define SCORE16_INSTLEN
Definition: score-tdep.h:48
static void score3_analyze_prologue(CORE_ADDR startaddr, CORE_ADDR pc, struct frame_info *this_frame, struct score_frame_cache *this_cache)
Definition: score-tdep.c:1067
#define TARGET_CHAR_BIT
Definition: host-defs.h:29
#define SCORE7_LINUX_SIZEOF_GREGSET
Definition: score-tdep.c:1417
CORE_ADDR fp
Definition: score-tdep.c:52
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
void regcache_collect_regset(const struct regset *regset, const struct regcache *regcache, int regnum, void *buf, size_t size)
Definition: regcache.c:1211
void set_gdbarch_unwind_pc(struct gdbarch *gdbarch, gdbarch_unwind_pc_ftype unwind_pc)
Definition: gdbarch.c:3079
static void score_xfer_register(struct regcache *regcache, int regnum, int length, enum bfd_endian endian, gdb_byte *readbuf, const gdb_byte *writebuf, int buf_offset)
Definition: score-tdep.c:419
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
unsigned int len
Definition: score-tdep.c:46
void set_gdbarch_unwind_sp(struct gdbarch *gdbarch, gdbarch_unwind_sp_ftype unwind_sp)
Definition: gdbarch.c:3103
#define target_has_execution
Definition: target.h:1756
static const struct regcache_map_entry score7_linux_gregmap[]
Definition: score-tdep.c:1397
#define SCORE7_NUM_REGS
Definition: score-tdep.h:42
static int score3_breakpoint_kind_from_pc(struct gdbarch *gdbarch, CORE_ADDR *pcptr)
Definition: score-tdep.c:365
struct gdbarch * gdbarch
Definition: gdbarch.h:1622
int regnum
Definition: aarch64-tdep.c:77
static CORE_ADDR score_frame_align(struct gdbarch *gdbarch, CORE_ADDR addr)
Definition: score-tdep.c:413
static void score7_free_memblock(gdb_byte *memblock)
Definition: score-tdep.c:834
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1308
void * xmalloc(YYSIZE_T)
#define SCORE3_NUM_REGS
Definition: score-tdep.h:43
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
#define gdb_assert(expr)
Definition: gdb_assert.h:32
Definition: value.c:169
static struct score_frame_cache * score_make_prologue_cache(struct frame_info *this_frame, void **this_cache)
Definition: score-tdep.c:1309
static CORE_ADDR score_prologue_frame_base_address(struct frame_info *this_frame, void **this_cache)
Definition: score-tdep.c:1373
static const char * score7_register_name(struct gdbarch *gdbarch, int regnum)
Definition: score-tdep.c:80
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
Definition: arch-utils.c:117
bfd_byte gdb_byte
Definition: common-types.h:38
ULONGEST align_up(ULONGEST v, int n)
Definition: utils.c:2997
static CORE_ADDR score_unwind_sp(struct gdbarch *gdbarch, struct frame_info *next_frame)
Definition: score-tdep.c:68
#define SCORE_INSTLEN
Definition: score-tdep.h:47
static const gdb_byte * score7_sw_breakpoint_from_kind(struct gdbarch *gdbarch, int kind, int *size)
Definition: score-tdep.c:334
#define TYPE_CODE(thistype)
Definition: gdbtypes.h:1238
static struct type * score_register_type(struct gdbarch *gdbarch, int regnum)
Definition: score-tdep.c:59
static int score7_stack_frame_destroyed_p(struct gdbarch *gdbarch, CORE_ADDR cur_pc)
Definition: score-tdep.c:742
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
Definition: regcache.c:806
static const struct frame_unwind score_prologue_unwind
Definition: score-tdep.c:1361
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: target.c:1370
void set_gdbarch_int_bit(struct gdbarch *gdbarch, int int_bit)
Definition: gdbarch.c:1589
int offset
Definition: agent.c:65
#define TYPE_NFIELDS(thistype)
Definition: gdbtypes.h:1239
void _initialize_score_tdep(void)
Definition: score-tdep.c:1535
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
static CORE_ADDR score_adjust_breakpoint_address(struct gdbarch *gdbarch, CORE_ADDR bpaddr)
Definition: score-tdep.c:399
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
Definition: regcache.c:1004
void frame_base_append_sniffer(struct gdbarch *gdbarch, frame_base_sniffer_ftype *sniffer)
Definition: frame-base.c:82
static int score7_breakpoint_kind_from_pc(struct gdbarch *gdbarch, CORE_ADDR *pcptr)
Definition: score-tdep.c:303
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
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
Definition: gdbarch.c:1756
unsigned long long v
Definition: score-tdep.c:44
#define G_FLD(_i, _ms, _ls)
Definition: score-tdep.c:40
struct type * value_type(const struct value *value)
Definition: value.c:1095
CORE_ADDR addr
Definition: frame.c:128
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
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1235
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype push_dummy_call)
Definition: gdbarch.c:2381
static inst_t * score3_adjust_pc_and_fetch_inst(CORE_ADDR *pcptr, int *lenptr, enum bfd_endian byte_order)
Definition: score-tdep.c:170
static const gdb_byte * score3_sw_breakpoint_from_kind(struct gdbarch *gdbarch, int kind, int *size)
Definition: score-tdep.c:378
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype sw_breakpoint_from_kind)
Definition: gdbarch.c:2888
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
Definition: gdbarch.c:3647
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
Definition: corefile.c:394
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype skip_prologue)
Definition: gdbarch.c:2772
static void score7_adjust_memblock_ptr(gdb_byte **memblock, CORE_ADDR prev_pc, CORE_ADDR cur_pc)
Definition: score-tdep.c:840
CORE_ADDR base
Definition: score-tdep.c:51
static enum return_value_convention score_return_value(struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
Definition: score-tdep.c:453
enum bfd_endian byte_order
Definition: gdbarch.c:137
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
Definition: gdbarch.c:2173
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype register_name)
Definition: gdbarch.c:2292
CORE_ADDR get_frame_func(struct frame_info *this_frame)
Definition: frame.c:1001
static void score7_linux_supply_gregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *buf, size_t size)
Definition: score-tdep.c:1420
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
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype inner_than)
Definition: gdbarch.c:2837
static void score7_analyze_prologue(CORE_ADDR startaddr, CORE_ADDR pc, struct frame_info *this_frame, struct score_frame_cache *this_cache)
Definition: score-tdep.c:860
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2691
Definition: regcache.h:157
static inst_t * score7_fetch_inst(struct gdbarch *gdbarch, CORE_ADDR addr, gdb_byte *memblock)
Definition: score-tdep.c:130