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