1 /* Target-dependent code for the S+core architecture, for GDB,
4 Copyright (C) 2006-2017 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 score7_fetch_inst (struct gdbarch *gdbarch, CORE_ADDR addr, gdb_byte *memblock)
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 };
138 if (target_has_execution && memblock != NULL)
140 /* Fetch instruction from local MEMBLOCK. */
141 memcpy (buf, memblock, SCORE_INSTLEN);
145 /* Fetch instruction from target. */
146 ret = target_read_memory (addr & ~0x3, buf, SCORE_INSTLEN);
149 error (_("Error: target_read_memory in file:%s, line:%d!"),
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);
161 if (big ^ ((addr & 0x2) == 2))
162 inst.v = G_FLD (inst.v, 29, 15);
164 inst.v = G_FLD (inst.v, 14, 0);
170 score3_adjust_pc_and_fetch_inst (CORE_ADDR *pcptr, int *lenptr,
171 enum bfd_endian byte_order)
173 static inst_t inst = { 0, 0, 0 };
180 /* raw table 1 (column 2, 3, 4)
184 table 2 (column 1, 2, 3)
190 static const struct breakplace bk_table[16] =
212 #define EXTRACT_LEN 2
213 CORE_ADDR adjust_pc = *pcptr & ~0x1;
214 gdb_byte buf[5][EXTRACT_LEN] =
224 unsigned int cbits = 0;
233 for (i = 0; i < 5; i++)
235 ret = target_read_memory (adjust_pc + 2 * i, buf[i], EXTRACT_LEN);
241 error (_("Error: target_read_memory in file:%s, line:%d!"),
245 raw = extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
246 cbits = (cbits << 1) | (raw >> 15);
253 cbits = (cbits >> 1) & 0x7;
259 cbits = (cbits >> 2) & 0x7;
260 bk_index = cbits + 8;
263 gdb_assert (!((bk_table[bk_index].break_offset == 0)
264 && (bk_table[bk_index].inst_len == 0)));
266 inst.len = bk_table[bk_index].inst_len;
268 i = (bk_table[bk_index].break_offset + 4) / 2;
269 count = inst.len / 2;
270 for (; count > 0; i++, count--)
272 inst.raw = (inst.raw << 16)
273 | extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
279 inst.v = inst.raw & 0x7FFF;
282 inst.v = ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
285 inst.v = ((inst.raw >> 32 & 0x7FFF) << 30)
286 | ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
291 *pcptr = adjust_pc + bk_table[bk_index].break_offset;
293 *lenptr = bk_table[bk_index].inst_len;
300 /* Implement the breakpoint_kind_from_pc gdbarch method. */
303 score7_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
307 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
308 gdb_byte buf[SCORE_INSTLEN] = { 0 };
310 if ((ret = target_read_memory (*pcptr & ~0x3, buf, SCORE_INSTLEN)) != 0)
312 error (_("Error: target_read_memory in file:%s, line:%d!"),
315 raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);
317 if (!(raw & 0x80008000))
319 /* 16bits instruction. */
325 /* 32bits instruction. */
331 /* Implement the sw_breakpoint_from_kind gdbarch method. */
333 static const gdb_byte *
334 score7_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
336 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
342 static gdb_byte big_breakpoint32[] = { 0x80, 0x00, 0x80, 0x06 };
343 static gdb_byte little_breakpoint32[] = { 0x06, 0x80, 0x00, 0x80 };
345 if (byte_order == BFD_ENDIAN_BIG)
346 return big_breakpoint32;
348 return little_breakpoint32;
352 static gdb_byte big_breakpoint16[] = { 0x60, 0x02 };
353 static gdb_byte little_breakpoint16[] = { 0x02, 0x60 };
355 if (byte_order == BFD_ENDIAN_BIG)
356 return big_breakpoint16;
358 return little_breakpoint16;
362 /* Implement the breakpoint_kind_from_pc gdbarch method. */
365 score3_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
367 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
370 score3_adjust_pc_and_fetch_inst (pcptr, &len, byte_order);
375 /* Implement the sw_breakpoint_from_kind gdbarch method. */
377 static const gdb_byte *
378 score3_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
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. */
385 { 0x80, 0x00, 0x00, 0x06 },
386 { 0x80, 0x00, 0x80, 0x00, 0x00, 0x00 },
387 /* The following three instructions are little endian. */
389 { 0x00, 0x80, 0x06, 0x00 },
390 { 0x00, 0x80, 0x00, 0x80, 0x00, 0x00 }};
394 index = ((byte_order == BFD_ENDIAN_BIG) ? 0 : 3) + (kind / 2 - 1);
395 return score_break_insns[index];
399 score_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
401 CORE_ADDR adjust_pc = bpaddr;
403 if (target_mach == bfd_mach_score3)
404 score3_adjust_pc_and_fetch_inst (&adjust_pc, NULL,
405 gdbarch_byte_order (gdbarch));
407 adjust_pc = align_down (adjust_pc, 2);
413 score_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
415 return align_down (addr, 16);
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)
424 gdb_assert (regnum >= 0
425 && regnum < ((target_mach == bfd_mach_score7)
426 ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
431 reg_offset = SCORE_REGSIZE - length;
433 case BFD_ENDIAN_LITTLE:
436 case BFD_ENDIAN_UNKNOWN:
440 error (_("Error: score_xfer_register in file:%s, line:%d!"),
445 regcache_cooked_read_part (regcache, regnum, reg_offset, length,
446 readbuf + buf_offset);
447 if (writebuf != NULL)
448 regcache_cooked_write_part (regcache, regnum, reg_offset, length,
449 writebuf + buf_offset);
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)
457 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
458 || TYPE_CODE (type) == TYPE_CODE_UNION
459 || TYPE_CODE (type) == TYPE_CODE_ARRAY)
460 return RETURN_VALUE_STRUCT_CONVENTION;
465 for (offset = 0, regnum = SCORE_A0_REGNUM;
466 offset < TYPE_LENGTH (type);
467 offset += SCORE_REGSIZE, regnum++)
469 int xfer = SCORE_REGSIZE;
471 if (offset + xfer > TYPE_LENGTH (type))
472 xfer = TYPE_LENGTH (type) - offset;
473 score_xfer_register (regcache, regnum, xfer,
474 gdbarch_byte_order(gdbarch),
475 readbuf, writebuf, offset);
477 return RETURN_VALUE_REGISTER_CONVENTION;
481 static struct frame_id
482 score_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
484 return frame_id_build (get_frame_register_unsigned (this_frame,
486 get_frame_pc (this_frame));
490 score_type_needs_double_align (struct type *type)
492 enum type_code typecode = TYPE_CODE (type);
494 if ((typecode == TYPE_CODE_INT && TYPE_LENGTH (type) == 8)
495 || (typecode == TYPE_CODE_FLT && TYPE_LENGTH (type) == 8))
497 else if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
501 n = TYPE_NFIELDS (type);
502 for (i = 0; i < n; i++)
503 if (score_type_needs_double_align (TYPE_FIELD_TYPE (type, i)))
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)
516 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
520 CORE_ADDR stack_offset = 0;
523 /* Step 1, Save RA. */
524 regcache_cooked_write_unsigned (regcache, SCORE_RA_REGNUM, bp_addr);
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])),
532 sp -= align_up (arglen, 16);
534 argreg = SCORE_BEGIN_ARG_REGNUM;
536 /* Step 3, Check if struct return then save the struct address to
537 r4 and increase the stack_offset by 4. */
540 regcache_cooked_write_unsigned (regcache, argreg++, struct_addr);
541 stack_offset += SCORE_REGSIZE;
544 /* Step 4, Load arguments:
545 If arg length is too long (> 4 bytes), then split the arg and
547 for (argnum = 0; argnum < nargs; argnum++)
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;
556 arglen = TYPE_LENGTH (arg_type);
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))
566 /* If sizeof a block < SCORE_REGSIZE, then Score GCC will chose
567 the default "downward"/"upward" method:
573 char a; char b; char c;
574 } s = {'a', 'b', 'c'};
576 Big endian: s = {X, 'a', 'b', 'c'}
577 Little endian: s = {'a', 'b', 'c', X}
579 Where X is a hole. */
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);
590 int partial_len = arglen < SCORE_REGSIZE ? arglen : SCORE_REGSIZE;
591 ULONGEST regval = extract_unsigned_integer (val, partial_len,
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);
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);
606 if (argreg <= SCORE_LAST_ARG_REGNUM)
608 regcache_cooked_write_unsigned (regcache, argreg++, regval);
609 if (arglen > SCORE_REGSIZE && arglen < SCORE_REGSIZE * 2)
614 arglen -= partial_len;
615 stack_offset += align_up (partial_len, SCORE_REGSIZE);
619 /* Step 5, Save SP. */
620 regcache_cooked_write_unsigned (regcache, SCORE_SP_REGNUM, sp);
626 score7_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
629 int iscan = 32, stack_sub = 0;
632 inst_t *inst = score7_fetch_inst (gdbarch, cpc, NULL);
635 if ((inst->len == 4) && !stack_sub
636 && (G_FLD (inst->v, 29, 25) == 0x1
637 && G_FLD (inst->v, 24, 20) == 0x0))
639 /* addi r0, offset */
640 stack_sub = cpc + SCORE_INSTLEN;
641 pc = cpc + SCORE_INSTLEN;
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))
651 pc = cpc + SCORE_INSTLEN;
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))
661 pc = cpc + SCORE16_INSTLEN;
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! */
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 */
677 cpc += (inst->len == 2) ? SCORE16_INSTLEN : SCORE_INSTLEN;
683 score3_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
686 int iscan = 32, stack_sub = 0;
690 = score3_adjust_pc_and_fetch_inst (&cpc, NULL,
691 gdbarch_byte_order (gdbarch));
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))
700 /* addi r0, offset */
701 stack_sub = cpc + inst->len;
702 pc = cpc + inst->len;
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))
712 pc = cpc + inst->len;
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))
721 pc = cpc + inst->len;
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! */
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 */
739 /* Implement the stack_frame_destroyed_p gdbarch method. */
742 score7_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
744 inst_t *inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
747 return 1; /* mv! r0, r2 */
748 else if (G_FLD (inst->v, 14, 12) == 0x2
749 && G_FLD (inst->v, 3, 0) == 0xa)
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 */
765 /* Implement the stack_frame_destroyed_p gdbarch method. */
768 score3_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
770 CORE_ADDR pc = cur_pc;
772 = score3_adjust_pc_and_fetch_inst (&pc, NULL,
773 gdbarch_byte_order (gdbarch));
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))
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 */
813 score7_malloc_and_get_memblock (CORE_ADDR addr, CORE_ADDR size)
816 gdb_byte *memblock = NULL;
821 memblock = (gdb_byte *) xmalloc (size);
822 memset (memblock, 0, size);
823 ret = target_read_memory (addr & ~0x3, memblock, size);
826 error (_("Error: target_read_memory in file:%s, line:%d!"),
834 score7_free_memblock (gdb_byte *memblock)
840 score7_adjust_memblock_ptr (gdb_byte **memblock, CORE_ADDR prev_pc,
845 /* First time call this function, do nothing. */
847 else if (cur_pc - prev_pc == 2 && (cur_pc & 0x3) == 0)
849 /* First 16-bit instruction, then 32-bit instruction. */
850 *memblock += SCORE_INSTLEN;
852 else if (cur_pc - prev_pc == 4)
854 /* Is 32-bit instruction, increase MEMBLOCK by 4. */
855 *memblock += SCORE_INSTLEN;
860 score7_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
861 struct frame_info *this_frame,
862 struct score_frame_cache *this_cache)
864 struct gdbarch *gdbarch = get_frame_arch (this_frame);
867 CORE_ADDR cur_pc = startaddr;
876 gdb_byte *memblock = NULL;
877 gdb_byte *memblock_ptr = NULL;
878 CORE_ADDR prev_pc = -1;
880 /* Allocate MEMBLOCK if PC - STARTADDR > 0. */
881 memblock_ptr = memblock =
882 score7_malloc_and_get_memblock (startaddr, pc - startaddr);
884 sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
885 fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
887 for (; cur_pc < pc; prev_pc = cur_pc, cur_pc += inst_len)
890 if (memblock != NULL)
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);
899 /* Otherwise, we fetch 4 bytes from target, and GDB also
901 inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
904 /* FIXME: make a full-power prologue analyzer. */
907 inst_len = SCORE16_INSTLEN;
909 if (G_FLD (inst->v, 14, 12) == 0x2
910 && G_FLD (inst->v, 3, 0) == 0xe)
915 if (G_FLD (inst->v, 11, 7) == 0x6
919 ra_offset = sp_offset;
922 else if (G_FLD (inst->v, 11, 7) == 0x4
926 fp_offset = sp_offset;
930 else if (G_FLD (inst->v, 14, 12) == 0x2
931 && G_FLD (inst->v, 3, 0) == 0xa)
936 else if (G_FLD (inst->v, 14, 7) == 0xc1
937 && G_FLD (inst->v, 2, 0) == 0x0)
940 sp_offset += (int) pow (2, G_FLD (inst->v, 6, 3));
942 else if (G_FLD (inst->v, 14, 7) == 0xc0
943 && G_FLD (inst->v, 2, 0) == 0x0)
946 sp_offset -= (int) pow (2, G_FLD (inst->v, 6, 3));
951 inst_len = SCORE_INSTLEN;
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)
957 /* sw rD, [r0, offset]+ */
958 sp_offset += SCORE_INSTLEN;
960 if (G_FLD(inst->v, 24, 20) == 0x3)
963 if (ra_offset_p == 0)
965 ra_offset = sp_offset;
969 else if (G_FLD(inst->v, 24, 20) == 0x2)
972 if (fp_offset_p == 0)
974 fp_offset = sp_offset;
979 else if (G_FLD(inst->v, 29, 25) == 0x14
980 && G_FLD(inst->v, 19,15) == 0)
982 /* sw rD, [r0, offset] */
983 if (G_FLD(inst->v, 24, 20) == 0x3)
986 ra_offset = sp_offset - G_FLD(inst->v, 14, 0);
989 else if (G_FLD(inst->v, 24, 20) == 0x2)
992 fp_offset = sp_offset - G_FLD(inst->v, 14, 0);
996 else if (G_FLD (inst->v, 29, 15) == 0x1c60
997 && G_FLD (inst->v, 2, 0) == 0x0)
999 /* lw r3, [r0]+, 4 */
1000 sp_offset -= SCORE_INSTLEN;
1003 else if (G_FLD (inst->v, 29, 15) == 0x1c40
1004 && G_FLD (inst->v, 2, 0) == 0x0)
1006 /* lw r2, [r0]+, 4 */
1007 sp_offset -= SCORE_INSTLEN;
1011 else if (G_FLD (inst->v, 29, 17) == 0x100
1012 && G_FLD (inst->v, 0, 0) == 0x0)
1014 /* addi r0, -offset */
1015 sp_offset += 65536 - G_FLD (inst->v, 16, 1);
1017 else if (G_FLD (inst->v, 29, 17) == 0x110
1018 && G_FLD (inst->v, 0, 0) == 0x0)
1020 /* addi r2, offset */
1021 if (pc - cur_pc > 4)
1023 unsigned int save_v = inst->v;
1025 score7_fetch_inst (gdbarch, cur_pc + SCORE_INSTLEN, NULL);
1026 if (inst2->v == 0x23)
1029 sp_offset -= G_FLD (save_v, 16, 1);
1037 if (ra_offset_p == 1)
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;
1045 this_cache->saved_regs[SCORE_PC_REGNUM] =
1046 this_cache->saved_regs[SCORE_RA_REGNUM];
1050 if (fp_offset_p == 1)
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;
1057 /* Save SP and FP. */
1058 this_cache->base = sp + sp_offset;
1059 this_cache->fp = fp;
1061 /* Don't forget to free MEMBLOCK if we allocated it. */
1062 if (memblock_ptr != NULL)
1063 score7_free_memblock (memblock_ptr);
1067 score3_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
1068 struct frame_info *this_frame,
1069 struct score_frame_cache *this_cache)
1073 CORE_ADDR cur_pc = startaddr;
1074 enum bfd_endian byte_order
1075 = gdbarch_byte_order (get_frame_arch (this_frame));
1080 int ra_offset_p = 0;
1081 int fp_offset_p = 0;
1084 sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
1085 fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
1087 for (; cur_pc < pc; cur_pc += inst_len)
1089 inst_t *inst = NULL;
1091 inst = score3_adjust_pc_and_fetch_inst (&cur_pc, &inst_len, byte_order);
1093 /* FIXME: make a full-power prologue analyzer. */
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)
1103 if (G_FLD (inst->v, 4, 0) == 0x3
1104 && ra_offset_p == 0)
1106 /* push! r3, [r0] */
1107 ra_offset = sp_offset;
1110 else if (G_FLD (inst->v, 4, 0) == 0x2
1111 && fp_offset_p == 0)
1113 /* push! r2, [r0] */
1114 fp_offset = sp_offset;
1118 else if (G_FLD (inst->v, 14, 12) == 0x6
1119 && G_FLD (inst->v, 11, 10) == 0x3)
1122 int start_r = G_FLD (inst->v, 9, 5);
1123 int cnt = G_FLD (inst->v, 4, 0);
1125 if ((ra_offset_p == 0)
1126 && (start_r <= SCORE_RA_REGNUM)
1127 && (SCORE_RA_REGNUM < start_r + cnt))
1129 /* rpush! contains r3 */
1131 ra_offset = sp_offset + 4 * (SCORE_RA_REGNUM - start_r) + 4;
1134 if ((fp_offset_p == 0)
1135 && (start_r <= SCORE_FP_REGNUM)
1136 && (SCORE_FP_REGNUM < start_r + cnt))
1138 /* rpush! contains r2 */
1140 fp_offset = sp_offset + 4 * (SCORE_FP_REGNUM - start_r) + 4;
1143 sp_offset += 4 * cnt;
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)
1152 else if (G_FLD (inst->v, 14, 12) == 0x6
1153 && G_FLD (inst->v, 11, 10) == 0x2)
1156 sp_offset -= 4 * G_FLD (inst->v, 4, 0);
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)
1162 /* addi! r0, -offset */
1163 int imm = G_FLD (inst->v, 5, 0);
1165 imm = -(0x3F - imm + 1);
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)
1172 /* addi! r2, offset */
1173 if (pc - cur_pc >= 2)
1177 cur_pc += inst->len;
1178 inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
1182 && G_FLD (inst2->v, 14, 10) == 0x10
1183 && G_FLD (inst2->v, 9, 5) == 0x0
1184 && G_FLD (inst2->v, 4, 0) == 0x2)
1187 int imm = G_FLD (inst->v, 5, 0);
1189 imm = -(0x3F - imm + 1);
1195 else if (inst->len == 4)
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)
1202 /* sw r3, [r0, offset]+ */
1203 sp_offset += inst->len;
1204 if (ra_offset_p == 0)
1206 ra_offset = sp_offset;
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)
1215 /* sw r2, [r0, offset]+ */
1216 sp_offset += inst->len;
1217 if (fp_offset_p == 0)
1219 fp_offset = sp_offset;
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)
1228 /* lw r3, [r0]+, 4 */
1229 sp_offset -= inst->len;
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)
1237 /* lw r2, [r0]+, 4 */
1238 sp_offset -= inst->len;
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)
1246 /* addi r0, -offset */
1247 int imm = G_FLD (inst->v, 16, 1);
1249 imm = -(0xFFFF - imm + 1);
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)
1257 /* addi r2, offset */
1258 if (pc - cur_pc >= 2)
1262 cur_pc += inst->len;
1263 inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
1267 && G_FLD (inst2->v, 14, 10) == 0x10
1268 && G_FLD (inst2->v, 9, 5) == 0x0
1269 && G_FLD (inst2->v, 4, 0) == 0x2)
1272 int imm = G_FLD (inst->v, 16, 1);
1274 imm = -(0xFFFF - imm + 1);
1283 if (ra_offset_p == 1)
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;
1291 this_cache->saved_regs[SCORE_PC_REGNUM] =
1292 this_cache->saved_regs[SCORE_RA_REGNUM];
1296 if (fp_offset_p == 1)
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;
1303 /* Save SP and FP. */
1304 this_cache->base = sp + sp_offset;
1305 this_cache->fp = fp;
1308 static struct score_frame_cache *
1309 score_make_prologue_cache (struct frame_info *this_frame, void **this_cache)
1311 struct score_frame_cache *cache;
1313 if ((*this_cache) != NULL)
1314 return (struct score_frame_cache *) (*this_cache);
1316 cache = FRAME_OBSTACK_ZALLOC (struct score_frame_cache);
1317 (*this_cache) = cache;
1318 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1320 /* Analyze the prologue. */
1322 const CORE_ADDR pc = get_frame_pc (this_frame);
1323 CORE_ADDR start_addr;
1325 find_pc_partial_function (pc, NULL, &start_addr, NULL);
1326 if (start_addr == 0)
1329 if (target_mach == bfd_mach_score3)
1330 score3_analyze_prologue (start_addr, pc, this_frame,
1331 (struct score_frame_cache *) *this_cache);
1333 score7_analyze_prologue (start_addr, pc, this_frame,
1334 (struct score_frame_cache *) *this_cache);
1338 trad_frame_set_value (cache->saved_regs, SCORE_SP_REGNUM, cache->base);
1340 return (struct score_frame_cache *) (*this_cache);
1344 score_prologue_this_id (struct frame_info *this_frame, void **this_cache,
1345 struct frame_id *this_id)
1347 struct score_frame_cache *info = score_make_prologue_cache (this_frame,
1349 (*this_id) = frame_id_build (info->base, get_frame_func (this_frame));
1352 static struct value *
1353 score_prologue_prev_register (struct frame_info *this_frame,
1354 void **this_cache, int regnum)
1356 struct score_frame_cache *info = score_make_prologue_cache (this_frame,
1358 return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
1361 static const struct frame_unwind score_prologue_unwind =
1364 default_frame_unwind_stop_reason,
1365 score_prologue_this_id,
1366 score_prologue_prev_register,
1368 default_frame_sniffer,
1373 score_prologue_frame_base_address (struct frame_info *this_frame,
1376 struct score_frame_cache *info =
1377 score_make_prologue_cache (this_frame, this_cache);
1381 static const struct frame_base score_prologue_frame_base =
1383 &score_prologue_unwind,
1384 score_prologue_frame_base_address,
1385 score_prologue_frame_base_address,
1386 score_prologue_frame_base_address,
1389 static const struct frame_base *
1390 score_prologue_frame_base_sniffer (struct frame_info *this_frame)
1392 return &score_prologue_frame_base;
1395 /* Core file support. */
1397 static const struct regcache_map_entry score7_linux_gregmap[] =
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 */
1416 #define SCORE7_LINUX_EPC_OFFSET (44 * 4)
1417 #define SCORE7_LINUX_SIZEOF_GREGSET (49 * 4)
1420 score7_linux_supply_gregset(const struct regset *regset,
1421 struct regcache *regcache,
1422 int regnum, const void *buf,
1425 regcache_supply_regset (regset, regcache, regnum, buf, size);
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)
1431 regcache_raw_supply (regcache, SCORE_EPC_REGNUM,
1432 (const gdb_byte *) buf
1433 + SCORE7_LINUX_EPC_OFFSET);
1436 static const struct regset score7_linux_gregset =
1438 score7_linux_gregmap,
1439 score7_linux_supply_gregset,
1440 regcache_collect_regset
1443 /* Iterate over core file register note sections. */
1446 score7_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
1447 iterate_over_regset_sections_cb *cb,
1449 const struct regcache *regcache)
1451 cb (".reg", SCORE7_LINUX_SIZEOF_GREGSET, &score7_linux_gregset,
1455 static struct gdbarch *
1456 score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1458 struct gdbarch *gdbarch;
1459 target_mach = info.bfd_arch_info->mach;
1461 arches = gdbarch_list_lookup_by_info (arches, &info);
1464 return (arches->gdbarch);
1466 gdbarch = gdbarch_alloc (&info, NULL);
1468 set_gdbarch_short_bit (gdbarch, 16);
1469 set_gdbarch_int_bit (gdbarch, 32);
1470 set_gdbarch_float_bit (gdbarch, 32);
1471 set_gdbarch_double_bit (gdbarch, 64);
1472 set_gdbarch_long_double_bit (gdbarch, 64);
1474 set_gdbarch_register_sim_regno (gdbarch, score_register_sim_regno);
1476 set_gdbarch_pc_regnum (gdbarch, SCORE_PC_REGNUM);
1477 set_gdbarch_sp_regnum (gdbarch, SCORE_SP_REGNUM);
1478 set_gdbarch_adjust_breakpoint_address (gdbarch,
1479 score_adjust_breakpoint_address);
1480 set_gdbarch_register_type (gdbarch, score_register_type);
1481 set_gdbarch_frame_align (gdbarch, score_frame_align);
1482 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1483 set_gdbarch_unwind_sp (gdbarch, score_unwind_sp);
1484 set_gdbarch_unwind_pc (gdbarch, score_unwind_pc);
1486 switch (target_mach)
1488 case bfd_mach_score7:
1489 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
1490 score7_breakpoint_kind_from_pc);
1491 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
1492 score7_sw_breakpoint_from_kind);
1493 set_gdbarch_skip_prologue (gdbarch, score7_skip_prologue);
1494 set_gdbarch_stack_frame_destroyed_p (gdbarch,
1495 score7_stack_frame_destroyed_p);
1496 set_gdbarch_register_name (gdbarch, score7_register_name);
1497 set_gdbarch_num_regs (gdbarch, SCORE7_NUM_REGS);
1498 /* Core file support. */
1499 set_gdbarch_iterate_over_regset_sections
1500 (gdbarch, score7_linux_iterate_over_regset_sections);
1503 case bfd_mach_score3:
1504 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
1505 score3_breakpoint_kind_from_pc);
1506 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
1507 score3_sw_breakpoint_from_kind);
1508 set_gdbarch_skip_prologue (gdbarch, score3_skip_prologue);
1509 set_gdbarch_stack_frame_destroyed_p (gdbarch,
1510 score3_stack_frame_destroyed_p);
1511 set_gdbarch_register_name (gdbarch, score3_register_name);
1512 set_gdbarch_num_regs (gdbarch, SCORE3_NUM_REGS);
1516 /* Watchpoint hooks. */
1517 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
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);
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);
1535 _initialize_score_tdep (void)
1537 gdbarch_register (bfd_arch_score, score_gdbarch_init, NULL);