1 /* Target-dependent code for the S+core architecture, for GDB,
4 Copyright (C) 2006-2015 Free Software Foundation, Inc.
6 Contributed by Qinwei (qinwei@sunnorth.com.cn)
7 Contributed by Ching-Peng Lin (cplin@sunplus.com)
9 This file is part of GDB.
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.
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.
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/>. */
30 #include "arch-utils.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"
40 #define G_FLD(_i,_ms,_ls) \
41 ((unsigned)((_i) << (31 - (_ms))) >> (31 - (_ms) + (_ls)))
45 unsigned long long raw;
49 struct score_frame_cache
53 struct trad_frame_saved_reg *saved_regs;
56 static int target_mach = bfd_mach_score7;
59 score_register_type (struct gdbarch *gdbarch, int regnum)
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;
68 score_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
70 return frame_unwind_register_unsigned (next_frame, SCORE_SP_REGNUM);
74 score_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
76 return frame_unwind_register_unsigned (next_frame, SCORE_PC_REGNUM);
80 score7_register_name (struct gdbarch *gdbarch, int regnum)
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",
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",
95 gdb_assert (regnum >= 0 && regnum < SCORE7_NUM_REGS);
96 return score_register_names[regnum];
100 score3_register_name (struct gdbarch *gdbarch, int regnum)
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",
108 "PSR", "COND", "ECR", "EXCPVEC", "CCR",
109 "EPC", "EMA", "PREV", "DREG", "DSAVE",
110 "COUNTER", "LDCR", "STCR", "CEH", "CEL",
114 gdb_assert (regnum >= 0 && regnum < SCORE3_NUM_REGS);
115 return score_register_names[regnum];
120 score_register_sim_regno (struct gdbarch *gdbarch, int regnum)
122 gdb_assert (regnum >= 0
123 && regnum < ((target_mach == bfd_mach_score7)
124 ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
130 score_print_insn (bfd_vma memaddr, struct disassemble_info *info)
132 if (info->endian == BFD_ENDIAN_BIG)
133 return print_insn_big_score (memaddr, info);
135 return print_insn_little_score (memaddr, info);
139 score7_fetch_inst (struct gdbarch *gdbarch, CORE_ADDR addr, gdb_byte *memblock)
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 };
147 if (target_has_execution && memblock != NULL)
149 /* Fetch instruction from local MEMBLOCK. */
150 memcpy (buf, memblock, SCORE_INSTLEN);
154 /* Fetch instruction from target. */
155 ret = target_read_memory (addr & ~0x3, buf, SCORE_INSTLEN);
158 error (_("Error: target_read_memory in file:%s, line:%d!"),
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);
170 if (big ^ ((addr & 0x2) == 2))
171 inst.v = G_FLD (inst.v, 29, 15);
173 inst.v = G_FLD (inst.v, 14, 0);
179 score3_adjust_pc_and_fetch_inst (CORE_ADDR *pcptr, int *lenptr,
180 enum bfd_endian byte_order)
182 static inst_t inst = { 0, 0, 0 };
189 /* raw table 1 (column 2, 3, 4)
193 table 2 (column 1, 2, 3)
199 static const struct breakplace bk_table[16] =
221 #define EXTRACT_LEN 2
222 CORE_ADDR adjust_pc = *pcptr & ~0x1;
223 gdb_byte buf[5][EXTRACT_LEN] =
233 unsigned int cbits = 0;
242 for (i = 0; i < 5; i++)
244 ret = target_read_memory (adjust_pc + 2 * i, buf[i], EXTRACT_LEN);
250 error (_("Error: target_read_memory in file:%s, line:%d!"),
254 raw = extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
255 cbits = (cbits << 1) | (raw >> 15);
262 cbits = (cbits >> 1) & 0x7;
268 cbits = (cbits >> 2) & 0x7;
269 bk_index = cbits + 8;
272 gdb_assert (!((bk_table[bk_index].break_offset == 0)
273 && (bk_table[bk_index].inst_len == 0)));
275 inst.len = bk_table[bk_index].inst_len;
277 i = (bk_table[bk_index].break_offset + 4) / 2;
278 count = inst.len / 2;
279 for (; count > 0; i++, count--)
281 inst.raw = (inst.raw << 16)
282 | extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
288 inst.v = inst.raw & 0x7FFF;
291 inst.v = ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
294 inst.v = ((inst.raw >> 32 & 0x7FFF) << 30)
295 | ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
300 *pcptr = adjust_pc + bk_table[bk_index].break_offset;
302 *lenptr = bk_table[bk_index].inst_len;
309 static const gdb_byte *
310 score7_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
313 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
314 gdb_byte buf[SCORE_INSTLEN] = { 0 };
318 if ((ret = target_read_memory (*pcptr & ~0x3, buf, SCORE_INSTLEN)) != 0)
320 error (_("Error: target_read_memory in file:%s, line:%d!"),
323 raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);
325 if (byte_order == BFD_ENDIAN_BIG)
327 if (!(raw & 0x80008000))
329 /* 16bits instruction. */
330 static gdb_byte big_breakpoint16[] = { 0x60, 0x02 };
332 *lenptr = sizeof (big_breakpoint16);
333 return big_breakpoint16;
337 /* 32bits instruction. */
338 static gdb_byte big_breakpoint32[] = { 0x80, 0x00, 0x80, 0x06 };
340 *lenptr = sizeof (big_breakpoint32);
341 return big_breakpoint32;
346 if (!(raw & 0x80008000))
348 /* 16bits instruction. */
349 static gdb_byte little_breakpoint16[] = { 0x02, 0x60 };
351 *lenptr = sizeof (little_breakpoint16);
352 return little_breakpoint16;
356 /* 32bits instruction. */
357 static gdb_byte little_breakpoint32[] = { 0x06, 0x80, 0x00, 0x80 };
359 *lenptr = sizeof (little_breakpoint32);
360 return little_breakpoint32;
365 static const gdb_byte *
366 score3_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
369 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
370 CORE_ADDR adjust_pc = *pcptr;
372 static gdb_byte score_break_insns[6][6] = {
373 /* The following three instructions are big endian. */
375 { 0x80, 0x00, 0x00, 0x06 },
376 { 0x80, 0x00, 0x80, 0x00, 0x00, 0x00 },
377 /* The following three instructions are little endian. */
379 { 0x00, 0x80, 0x06, 0x00 },
380 { 0x00, 0x80, 0x00, 0x80, 0x00, 0x00 }};
385 score3_adjust_pc_and_fetch_inst (&adjust_pc, &len, byte_order);
387 index = ((byte_order == BFD_ENDIAN_BIG) ? 0 : 3) + (len / 2 - 1);
388 p = score_break_insns[index];
397 score_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
399 CORE_ADDR adjust_pc = bpaddr;
401 if (target_mach == bfd_mach_score3)
402 score3_adjust_pc_and_fetch_inst (&adjust_pc, NULL,
403 gdbarch_byte_order (gdbarch));
405 adjust_pc = align_down (adjust_pc, 2);
411 score_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
413 return align_down (addr, 16);
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)
422 gdb_assert (regnum >= 0
423 && regnum < ((target_mach == bfd_mach_score7)
424 ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
429 reg_offset = SCORE_REGSIZE - length;
431 case BFD_ENDIAN_LITTLE:
434 case BFD_ENDIAN_UNKNOWN:
438 error (_("Error: score_xfer_register in file:%s, line:%d!"),
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);
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)
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;
463 for (offset = 0, regnum = SCORE_A0_REGNUM;
464 offset < TYPE_LENGTH (type);
465 offset += SCORE_REGSIZE, regnum++)
467 int xfer = SCORE_REGSIZE;
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);
475 return RETURN_VALUE_REGISTER_CONVENTION;
479 static struct frame_id
480 score_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
482 return frame_id_build (get_frame_register_unsigned (this_frame,
484 get_frame_pc (this_frame));
488 score_type_needs_double_align (struct type *type)
490 enum type_code typecode = TYPE_CODE (type);
492 if ((typecode == TYPE_CODE_INT && TYPE_LENGTH (type) == 8)
493 || (typecode == TYPE_CODE_FLT && TYPE_LENGTH (type) == 8))
495 else if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
499 n = TYPE_NFIELDS (type);
500 for (i = 0; i < n; i++)
501 if (score_type_needs_double_align (TYPE_FIELD_TYPE (type, i)))
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)
514 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
518 CORE_ADDR stack_offset = 0;
521 /* Step 1, Save RA. */
522 regcache_cooked_write_unsigned (regcache, SCORE_RA_REGNUM, bp_addr);
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])),
530 sp -= align_up (arglen, 16);
532 argreg = SCORE_BEGIN_ARG_REGNUM;
534 /* Step 3, Check if struct return then save the struct address to
535 r4 and increase the stack_offset by 4. */
538 regcache_cooked_write_unsigned (regcache, argreg++, struct_addr);
539 stack_offset += SCORE_REGSIZE;
542 /* Step 4, Load arguments:
543 If arg length is too long (> 4 bytes), then split the arg and
545 for (argnum = 0; argnum < nargs; argnum++)
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;
555 arglen = TYPE_LENGTH (arg_type);
556 odd_sized_struct_p = (arglen > SCORE_REGSIZE
557 && arglen % SCORE_REGSIZE != 0);
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))
567 /* If sizeof a block < SCORE_REGSIZE, then Score GCC will chose
568 the default "downward"/"upward" method:
574 char a; char b; char c;
575 } s = {'a', 'b', 'c'};
577 Big endian: s = {X, 'a', 'b', 'c'}
578 Little endian: s = {'a', 'b', 'c', X}
580 Where X is a hole. */
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);
591 int partial_len = arglen < SCORE_REGSIZE ? arglen : SCORE_REGSIZE;
592 ULONGEST regval = extract_unsigned_integer (val, partial_len,
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);
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);
607 if (argreg <= SCORE_LAST_ARG_REGNUM)
609 regcache_cooked_write_unsigned (regcache, argreg++, regval);
610 if (arglen > SCORE_REGSIZE && arglen < SCORE_REGSIZE * 2)
615 arglen -= partial_len;
616 stack_offset += align_up (partial_len, SCORE_REGSIZE);
620 /* Step 5, Save SP. */
621 regcache_cooked_write_unsigned (regcache, SCORE_SP_REGNUM, sp);
627 score7_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
630 int iscan = 32, stack_sub = 0;
633 inst_t *inst = score7_fetch_inst (gdbarch, cpc, NULL);
636 if ((inst->len == 4) && !stack_sub
637 && (G_FLD (inst->v, 29, 25) == 0x1
638 && G_FLD (inst->v, 24, 20) == 0x0))
640 /* addi r0, offset */
641 stack_sub = cpc + SCORE_INSTLEN;
642 pc = cpc + SCORE_INSTLEN;
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))
652 pc = cpc + SCORE_INSTLEN;
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))
662 pc = cpc + SCORE16_INSTLEN;
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! */
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 */
678 cpc += (inst->len == 2) ? SCORE16_INSTLEN : SCORE_INSTLEN;
684 score3_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
687 int iscan = 32, stack_sub = 0;
691 = score3_adjust_pc_and_fetch_inst (&cpc, NULL,
692 gdbarch_byte_order (gdbarch));
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))
701 /* addi r0, offset */
702 stack_sub = cpc + inst->len;
703 pc = cpc + inst->len;
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))
713 pc = cpc + inst->len;
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))
722 pc = cpc + inst->len;
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! */
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 */
740 /* Implement the stack_frame_destroyed_p gdbarch method. */
743 score7_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
745 inst_t *inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
748 return 1; /* mv! r0, r2 */
749 else if (G_FLD (inst->v, 14, 12) == 0x2
750 && G_FLD (inst->v, 3, 0) == 0xa)
752 else if (G_FLD (inst->v, 14, 12) == 0x0
753 && G_FLD (inst->v, 7, 0) == 0x34)
754 return 1; /* br! r3 */
755 else if (G_FLD (inst->v, 29, 15) == 0x2
756 && G_FLD (inst->v, 6, 1) == 0x2b)
757 return 1; /* mv r0, r2 */
758 else if (G_FLD (inst->v, 29, 25) == 0x0
759 && G_FLD (inst->v, 6, 1) == 0x4
760 && G_FLD (inst->v, 19, 15) == 0x3)
761 return 1; /* br r3 */
766 /* Implement the stack_frame_destroyed_p gdbarch method. */
769 score3_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
771 CORE_ADDR pc = cur_pc;
773 = score3_adjust_pc_and_fetch_inst (&pc, NULL,
774 gdbarch_byte_order (gdbarch));
777 && (G_FLD (inst->v, 14, 10) == 0x10)
778 && (G_FLD (inst->v, 9, 5) == 0x0)
779 && (G_FLD (inst->v, 4, 0) == 0x2))
780 return 1; /* mv! r0, r2 */
781 else if (inst->len == 4
782 && (G_FLD (inst->v, 29, 25) == 0x0)
783 && (G_FLD (inst->v, 24, 20) == 0x2)
784 && (G_FLD (inst->v, 19, 15) == 0x0)
785 && (G_FLD (inst->v, 14, 10) == 0xF)
786 && (G_FLD (inst->v, 9, 0) == 0x56))
787 return 1; /* mv r0, r2 */
788 else if (inst->len == 2
789 && (G_FLD (inst->v, 14, 12) == 0x0)
790 && (G_FLD (inst->v, 11, 5) == 0x2))
792 else if (inst->len == 2
793 && (G_FLD (inst->v, 14, 12) == 0x0)
794 && (G_FLD (inst->v, 11, 7) == 0x0)
795 && (G_FLD (inst->v, 6, 5) == 0x2))
796 return 1; /* rpop! */
797 else if (inst->len == 2
798 && (G_FLD (inst->v, 14, 12) == 0x0)
799 && (G_FLD (inst->v, 11, 5) == 0x4)
800 && (G_FLD (inst->v, 4, 0) == 0x3))
801 return 1; /* br! r3 */
802 else if (inst->len == 4
803 && (G_FLD (inst->v, 29, 25) == 0x0)
804 && (G_FLD (inst->v, 24, 20) == 0x0)
805 && (G_FLD (inst->v, 19, 15) == 0x3)
806 && (G_FLD (inst->v, 14, 10) == 0xF)
807 && (G_FLD (inst->v, 9, 0) == 0x8))
808 return 1; /* br r3 */
814 score7_malloc_and_get_memblock (CORE_ADDR addr, CORE_ADDR size)
817 gdb_byte *memblock = NULL;
821 error (_("Error: malloc size < 0 in file:%s, line:%d!"),
828 memblock = (gdb_byte *) xmalloc (size);
829 memset (memblock, 0, size);
830 ret = target_read_memory (addr & ~0x3, memblock, size);
833 error (_("Error: target_read_memory in file:%s, line:%d!"),
841 score7_free_memblock (gdb_byte *memblock)
847 score7_adjust_memblock_ptr (gdb_byte **memblock, CORE_ADDR prev_pc,
852 /* First time call this function, do nothing. */
854 else if (cur_pc - prev_pc == 2 && (cur_pc & 0x3) == 0)
856 /* First 16-bit instruction, then 32-bit instruction. */
857 *memblock += SCORE_INSTLEN;
859 else if (cur_pc - prev_pc == 4)
861 /* Is 32-bit instruction, increase MEMBLOCK by 4. */
862 *memblock += SCORE_INSTLEN;
867 score7_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
868 struct frame_info *this_frame,
869 struct score_frame_cache *this_cache)
871 struct gdbarch *gdbarch = get_frame_arch (this_frame);
874 CORE_ADDR cur_pc = startaddr;
883 gdb_byte *memblock = NULL;
884 gdb_byte *memblock_ptr = NULL;
885 CORE_ADDR prev_pc = -1;
887 /* Allocate MEMBLOCK if PC - STARTADDR > 0. */
888 memblock_ptr = memblock =
889 score7_malloc_and_get_memblock (startaddr, pc - startaddr);
891 sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
892 fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
894 for (; cur_pc < pc; prev_pc = cur_pc, cur_pc += inst_len)
897 if (memblock != NULL)
899 /* Reading memory block from target succefully and got all
900 the instructions(from STARTADDR to PC) needed. */
901 score7_adjust_memblock_ptr (&memblock, prev_pc, cur_pc);
902 inst = score7_fetch_inst (gdbarch, cur_pc, memblock);
906 /* Otherwise, we fetch 4 bytes from target, and GDB also
908 inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
911 /* FIXME: make a full-power prologue analyzer. */
914 inst_len = SCORE16_INSTLEN;
916 if (G_FLD (inst->v, 14, 12) == 0x2
917 && G_FLD (inst->v, 3, 0) == 0xe)
922 if (G_FLD (inst->v, 11, 7) == 0x6
926 ra_offset = sp_offset;
929 else if (G_FLD (inst->v, 11, 7) == 0x4
933 fp_offset = sp_offset;
937 else if (G_FLD (inst->v, 14, 12) == 0x2
938 && G_FLD (inst->v, 3, 0) == 0xa)
943 else if (G_FLD (inst->v, 14, 7) == 0xc1
944 && G_FLD (inst->v, 2, 0) == 0x0)
947 sp_offset += (int) pow (2, G_FLD (inst->v, 6, 3));
949 else if (G_FLD (inst->v, 14, 7) == 0xc0
950 && G_FLD (inst->v, 2, 0) == 0x0)
953 sp_offset -= (int) pow (2, G_FLD (inst->v, 6, 3));
958 inst_len = SCORE_INSTLEN;
960 if (G_FLD(inst->v, 29, 25) == 0x3
961 && G_FLD(inst->v, 2, 0) == 0x4
962 && G_FLD(inst->v, 19, 15) == 0)
964 /* sw rD, [r0, offset]+ */
965 sp_offset += SCORE_INSTLEN;
967 if (G_FLD(inst->v, 24, 20) == 0x3)
970 if (ra_offset_p == 0)
972 ra_offset = sp_offset;
976 else if (G_FLD(inst->v, 24, 20) == 0x2)
979 if (fp_offset_p == 0)
981 fp_offset = sp_offset;
986 else if (G_FLD(inst->v, 29, 25) == 0x14
987 && G_FLD(inst->v, 19,15) == 0)
989 /* sw rD, [r0, offset] */
990 if (G_FLD(inst->v, 24, 20) == 0x3)
993 ra_offset = sp_offset - G_FLD(inst->v, 14, 0);
996 else if (G_FLD(inst->v, 24, 20) == 0x2)
999 fp_offset = sp_offset - G_FLD(inst->v, 14, 0);
1003 else if (G_FLD (inst->v, 29, 15) == 0x1c60
1004 && G_FLD (inst->v, 2, 0) == 0x0)
1006 /* lw r3, [r0]+, 4 */
1007 sp_offset -= SCORE_INSTLEN;
1010 else if (G_FLD (inst->v, 29, 15) == 0x1c40
1011 && G_FLD (inst->v, 2, 0) == 0x0)
1013 /* lw r2, [r0]+, 4 */
1014 sp_offset -= SCORE_INSTLEN;
1018 else if (G_FLD (inst->v, 29, 17) == 0x100
1019 && G_FLD (inst->v, 0, 0) == 0x0)
1021 /* addi r0, -offset */
1022 sp_offset += 65536 - G_FLD (inst->v, 16, 1);
1024 else if (G_FLD (inst->v, 29, 17) == 0x110
1025 && G_FLD (inst->v, 0, 0) == 0x0)
1027 /* addi r2, offset */
1028 if (pc - cur_pc > 4)
1030 unsigned int save_v = inst->v;
1032 score7_fetch_inst (gdbarch, cur_pc + SCORE_INSTLEN, NULL);
1033 if (inst2->v == 0x23)
1036 sp_offset -= G_FLD (save_v, 16, 1);
1044 if (ra_offset_p == 1)
1046 if (this_cache->saved_regs[SCORE_PC_REGNUM].addr == -1)
1047 this_cache->saved_regs[SCORE_PC_REGNUM].addr =
1048 sp + sp_offset - ra_offset;
1052 this_cache->saved_regs[SCORE_PC_REGNUM] =
1053 this_cache->saved_regs[SCORE_RA_REGNUM];
1057 if (fp_offset_p == 1)
1059 if (this_cache->saved_regs[SCORE_FP_REGNUM].addr == -1)
1060 this_cache->saved_regs[SCORE_FP_REGNUM].addr =
1061 sp + sp_offset - fp_offset;
1064 /* Save SP and FP. */
1065 this_cache->base = sp + sp_offset;
1066 this_cache->fp = fp;
1068 /* Don't forget to free MEMBLOCK if we allocated it. */
1069 if (memblock_ptr != NULL)
1070 score7_free_memblock (memblock_ptr);
1074 score3_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
1075 struct frame_info *this_frame,
1076 struct score_frame_cache *this_cache)
1080 CORE_ADDR cur_pc = startaddr;
1081 enum bfd_endian byte_order
1082 = gdbarch_byte_order (get_frame_arch (this_frame));
1087 int ra_offset_p = 0;
1088 int fp_offset_p = 0;
1091 CORE_ADDR prev_pc = -1;
1093 sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
1094 fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
1096 for (; cur_pc < pc; prev_pc = cur_pc, cur_pc += inst_len)
1098 inst_t *inst = NULL;
1100 inst = score3_adjust_pc_and_fetch_inst (&cur_pc, &inst_len, byte_order);
1102 /* FIXME: make a full-power prologue analyzer. */
1105 if (G_FLD (inst->v, 14, 12) == 0x0
1106 && G_FLD (inst->v, 11, 7) == 0x0
1107 && G_FLD (inst->v, 6, 5) == 0x3)
1112 if (G_FLD (inst->v, 4, 0) == 0x3
1113 && ra_offset_p == 0)
1115 /* push! r3, [r0] */
1116 ra_offset = sp_offset;
1119 else if (G_FLD (inst->v, 4, 0) == 0x2
1120 && fp_offset_p == 0)
1122 /* push! r2, [r0] */
1123 fp_offset = sp_offset;
1127 else if (G_FLD (inst->v, 14, 12) == 0x6
1128 && G_FLD (inst->v, 11, 10) == 0x3)
1131 int start_r = G_FLD (inst->v, 9, 5);
1132 int cnt = G_FLD (inst->v, 4, 0);
1134 if ((ra_offset_p == 0)
1135 && (start_r <= SCORE_RA_REGNUM)
1136 && (SCORE_RA_REGNUM < start_r + cnt))
1138 /* rpush! contains r3 */
1140 ra_offset = sp_offset + 4 * (SCORE_RA_REGNUM - start_r) + 4;
1143 if ((fp_offset_p == 0)
1144 && (start_r <= SCORE_FP_REGNUM)
1145 && (SCORE_FP_REGNUM < start_r + cnt))
1147 /* rpush! contains r2 */
1149 fp_offset = sp_offset + 4 * (SCORE_FP_REGNUM - start_r) + 4;
1152 sp_offset += 4 * cnt;
1154 else if (G_FLD (inst->v, 14, 12) == 0x0
1155 && G_FLD (inst->v, 11, 7) == 0x0
1156 && G_FLD (inst->v, 6, 5) == 0x2)
1161 else if (G_FLD (inst->v, 14, 12) == 0x6
1162 && G_FLD (inst->v, 11, 10) == 0x2)
1165 sp_offset -= 4 * G_FLD (inst->v, 4, 0);
1167 else if (G_FLD (inst->v, 14, 12) == 0x5
1168 && G_FLD (inst->v, 11, 10) == 0x3
1169 && G_FLD (inst->v, 9, 6) == 0x0)
1171 /* addi! r0, -offset */
1172 int imm = G_FLD (inst->v, 5, 0);
1174 imm = -(0x3F - imm + 1);
1177 else if (G_FLD (inst->v, 14, 12) == 0x5
1178 && G_FLD (inst->v, 11, 10) == 0x3
1179 && G_FLD (inst->v, 9, 6) == 0x2)
1181 /* addi! r2, offset */
1182 if (pc - cur_pc >= 2)
1184 unsigned int save_v = inst->v;
1187 cur_pc += inst->len;
1188 inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
1192 && G_FLD (inst2->v, 14, 10) == 0x10
1193 && G_FLD (inst2->v, 9, 5) == 0x0
1194 && G_FLD (inst2->v, 4, 0) == 0x2)
1197 int imm = G_FLD (inst->v, 5, 0);
1199 imm = -(0x3F - imm + 1);
1205 else if (inst->len == 4)
1207 if (G_FLD (inst->v, 29, 25) == 0x3
1208 && G_FLD (inst->v, 2, 0) == 0x4
1209 && G_FLD (inst->v, 24, 20) == 0x3
1210 && G_FLD (inst->v, 19, 15) == 0x0)
1212 /* sw r3, [r0, offset]+ */
1213 sp_offset += inst->len;
1214 if (ra_offset_p == 0)
1216 ra_offset = sp_offset;
1220 else if (G_FLD (inst->v, 29, 25) == 0x3
1221 && G_FLD (inst->v, 2, 0) == 0x4
1222 && G_FLD (inst->v, 24, 20) == 0x2
1223 && G_FLD (inst->v, 19, 15) == 0x0)
1225 /* sw r2, [r0, offset]+ */
1226 sp_offset += inst->len;
1227 if (fp_offset_p == 0)
1229 fp_offset = sp_offset;
1233 else if (G_FLD (inst->v, 29, 25) == 0x7
1234 && G_FLD (inst->v, 2, 0) == 0x0
1235 && G_FLD (inst->v, 24, 20) == 0x3
1236 && G_FLD (inst->v, 19, 15) == 0x0)
1238 /* lw r3, [r0]+, 4 */
1239 sp_offset -= inst->len;
1242 else if (G_FLD (inst->v, 29, 25) == 0x7
1243 && G_FLD (inst->v, 2, 0) == 0x0
1244 && G_FLD (inst->v, 24, 20) == 0x2
1245 && G_FLD (inst->v, 19, 15) == 0x0)
1247 /* lw r2, [r0]+, 4 */
1248 sp_offset -= inst->len;
1251 else if (G_FLD (inst->v, 29, 25) == 0x1
1252 && G_FLD (inst->v, 19, 17) == 0x0
1253 && G_FLD (inst->v, 24, 20) == 0x0
1254 && G_FLD (inst->v, 0, 0) == 0x0)
1256 /* addi r0, -offset */
1257 int imm = G_FLD (inst->v, 16, 1);
1259 imm = -(0xFFFF - imm + 1);
1262 else if (G_FLD (inst->v, 29, 25) == 0x1
1263 && G_FLD (inst->v, 19, 17) == 0x0
1264 && G_FLD (inst->v, 24, 20) == 0x2
1265 && G_FLD (inst->v, 0, 0) == 0x0)
1267 /* addi r2, offset */
1268 if (pc - cur_pc >= 2)
1270 unsigned int save_v = inst->v;
1273 cur_pc += inst->len;
1274 inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
1278 && G_FLD (inst2->v, 14, 10) == 0x10
1279 && G_FLD (inst2->v, 9, 5) == 0x0
1280 && G_FLD (inst2->v, 4, 0) == 0x2)
1283 int imm = G_FLD (inst->v, 16, 1);
1285 imm = -(0xFFFF - imm + 1);
1294 if (ra_offset_p == 1)
1296 if (this_cache->saved_regs[SCORE_PC_REGNUM].addr == -1)
1297 this_cache->saved_regs[SCORE_PC_REGNUM].addr =
1298 sp + sp_offset - ra_offset;
1302 this_cache->saved_regs[SCORE_PC_REGNUM] =
1303 this_cache->saved_regs[SCORE_RA_REGNUM];
1307 if (fp_offset_p == 1)
1309 if (this_cache->saved_regs[SCORE_FP_REGNUM].addr == -1)
1310 this_cache->saved_regs[SCORE_FP_REGNUM].addr =
1311 sp + sp_offset - fp_offset;
1314 /* Save SP and FP. */
1315 this_cache->base = sp + sp_offset;
1316 this_cache->fp = fp;
1319 static struct score_frame_cache *
1320 score_make_prologue_cache (struct frame_info *this_frame, void **this_cache)
1322 struct score_frame_cache *cache;
1324 if ((*this_cache) != NULL)
1325 return (struct score_frame_cache *) (*this_cache);
1327 cache = FRAME_OBSTACK_ZALLOC (struct score_frame_cache);
1328 (*this_cache) = cache;
1329 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1331 /* Analyze the prologue. */
1333 const CORE_ADDR pc = get_frame_pc (this_frame);
1334 CORE_ADDR start_addr;
1336 find_pc_partial_function (pc, NULL, &start_addr, NULL);
1337 if (start_addr == 0)
1340 if (target_mach == bfd_mach_score3)
1341 score3_analyze_prologue (start_addr, pc, this_frame,
1342 (struct score_frame_cache *) *this_cache);
1344 score7_analyze_prologue (start_addr, pc, this_frame,
1345 (struct score_frame_cache *) *this_cache);
1349 trad_frame_set_value (cache->saved_regs, SCORE_SP_REGNUM, cache->base);
1351 return (struct score_frame_cache *) (*this_cache);
1355 score_prologue_this_id (struct frame_info *this_frame, void **this_cache,
1356 struct frame_id *this_id)
1358 struct score_frame_cache *info = score_make_prologue_cache (this_frame,
1360 (*this_id) = frame_id_build (info->base, get_frame_func (this_frame));
1363 static struct value *
1364 score_prologue_prev_register (struct frame_info *this_frame,
1365 void **this_cache, int regnum)
1367 struct score_frame_cache *info = score_make_prologue_cache (this_frame,
1369 return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
1372 static const struct frame_unwind score_prologue_unwind =
1375 default_frame_unwind_stop_reason,
1376 score_prologue_this_id,
1377 score_prologue_prev_register,
1379 default_frame_sniffer,
1384 score_prologue_frame_base_address (struct frame_info *this_frame,
1387 struct score_frame_cache *info =
1388 score_make_prologue_cache (this_frame, this_cache);
1392 static const struct frame_base score_prologue_frame_base =
1394 &score_prologue_unwind,
1395 score_prologue_frame_base_address,
1396 score_prologue_frame_base_address,
1397 score_prologue_frame_base_address,
1400 static const struct frame_base *
1401 score_prologue_frame_base_sniffer (struct frame_info *this_frame)
1403 return &score_prologue_frame_base;
1406 /* Core file support. */
1408 static const struct regcache_map_entry score7_linux_gregmap[] =
1410 /* FIXME: According to the current Linux kernel, r0 is preceded by
1411 9 rather than 7 words. */
1412 { 7, REGCACHE_MAP_SKIP, 4 },
1413 { 32, 0, 4 }, /* r0 ... r31 */
1414 { 1, 55, 4 }, /* CEL */
1415 { 1, 54, 4 }, /* CEH */
1416 { 1, 53, 4 }, /* sr0, i.e. cnt or COUNTER */
1417 { 1, 52, 4 }, /* sr1, i.e. lcr or LDCR */
1418 { 1, 51, 4 }, /* sr2, i.e. scr or STCR */
1419 { 1, 49, 4 }, /* PC (same slot as EPC) */
1420 { 1, 38, 4 }, /* EMA */
1421 { 1, 32, 4 }, /* PSR */
1422 { 1, 34, 4 }, /* ECR */
1423 { 1, 33, 4 }, /* COND */
1427 #define SCORE7_LINUX_EPC_OFFSET (44 * 4)
1428 #define SCORE7_LINUX_SIZEOF_GREGSET (49 * 4)
1431 score7_linux_supply_gregset(const struct regset *regset,
1432 struct regcache *regcache,
1433 int regnum, const void *buf,
1436 regcache_supply_regset (regset, regcache, regnum, buf, size);
1438 /* Supply the EPC from the same slot as the PC. Note that the
1439 collect function will store the PC in that slot. */
1440 if ((regnum == -1 || regnum == SCORE_EPC_REGNUM)
1441 && size >= SCORE7_LINUX_EPC_OFFSET + 4)
1442 regcache_raw_supply (regcache, SCORE_EPC_REGNUM,
1443 (const gdb_byte *) buf
1444 + SCORE7_LINUX_EPC_OFFSET);
1447 static const struct regset score7_linux_gregset =
1449 score7_linux_gregmap,
1450 score7_linux_supply_gregset,
1451 regcache_collect_regset
1454 /* Iterate over core file register note sections. */
1457 score7_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
1458 iterate_over_regset_sections_cb *cb,
1460 const struct regcache *regcache)
1462 cb (".reg", SCORE7_LINUX_SIZEOF_GREGSET, &score7_linux_gregset,
1466 static struct gdbarch *
1467 score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1469 struct gdbarch *gdbarch;
1470 target_mach = info.bfd_arch_info->mach;
1472 arches = gdbarch_list_lookup_by_info (arches, &info);
1475 return (arches->gdbarch);
1477 gdbarch = gdbarch_alloc (&info, NULL);
1479 set_gdbarch_short_bit (gdbarch, 16);
1480 set_gdbarch_int_bit (gdbarch, 32);
1481 set_gdbarch_float_bit (gdbarch, 32);
1482 set_gdbarch_double_bit (gdbarch, 64);
1483 set_gdbarch_long_double_bit (gdbarch, 64);
1485 set_gdbarch_register_sim_regno (gdbarch, score_register_sim_regno);
1487 set_gdbarch_pc_regnum (gdbarch, SCORE_PC_REGNUM);
1488 set_gdbarch_sp_regnum (gdbarch, SCORE_SP_REGNUM);
1489 set_gdbarch_adjust_breakpoint_address (gdbarch,
1490 score_adjust_breakpoint_address);
1491 set_gdbarch_register_type (gdbarch, score_register_type);
1492 set_gdbarch_frame_align (gdbarch, score_frame_align);
1493 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1494 set_gdbarch_unwind_sp (gdbarch, score_unwind_sp);
1495 set_gdbarch_unwind_pc (gdbarch, score_unwind_pc);
1496 set_gdbarch_print_insn (gdbarch, score_print_insn);
1498 switch (target_mach)
1500 case bfd_mach_score7:
1501 set_gdbarch_breakpoint_from_pc (gdbarch, score7_breakpoint_from_pc);
1502 set_gdbarch_skip_prologue (gdbarch, score7_skip_prologue);
1503 set_gdbarch_stack_frame_destroyed_p (gdbarch,
1504 score7_stack_frame_destroyed_p);
1505 set_gdbarch_register_name (gdbarch, score7_register_name);
1506 set_gdbarch_num_regs (gdbarch, SCORE7_NUM_REGS);
1507 /* Core file support. */
1508 set_gdbarch_iterate_over_regset_sections
1509 (gdbarch, score7_linux_iterate_over_regset_sections);
1512 case bfd_mach_score3:
1513 set_gdbarch_breakpoint_from_pc (gdbarch, score3_breakpoint_from_pc);
1514 set_gdbarch_skip_prologue (gdbarch, score3_skip_prologue);
1515 set_gdbarch_stack_frame_destroyed_p (gdbarch,
1516 score3_stack_frame_destroyed_p);
1517 set_gdbarch_register_name (gdbarch, score3_register_name);
1518 set_gdbarch_num_regs (gdbarch, SCORE3_NUM_REGS);
1522 /* Watchpoint hooks. */
1523 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
1525 /* Dummy frame hooks. */
1526 set_gdbarch_return_value (gdbarch, score_return_value);
1527 set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1528 set_gdbarch_dummy_id (gdbarch, score_dummy_id);
1529 set_gdbarch_push_dummy_call (gdbarch, score_push_dummy_call);
1531 /* Normal frame hooks. */
1532 dwarf2_append_unwinders (gdbarch);
1533 frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
1534 frame_unwind_append_unwinder (gdbarch, &score_prologue_unwind);
1535 frame_base_append_sniffer (gdbarch, score_prologue_frame_base_sniffer);
1540 extern initialize_file_ftype _initialize_score_tdep;
1543 _initialize_score_tdep (void)
1545 gdbarch_register (bfd_arch_score, score_gdbarch_init, NULL);