/* Target-dependent code for the S+core architecture, for GDB,
   the GNU Debugger.

   Copyright (C) 2006-2021 Free Software Foundation, Inc.

   Contributed by Qinwei (qinwei@sunnorth.com.cn)
   Contributed by Ching-Peng Lin (cplin@sunplus.com)

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "inferior.h"
#include "symtab.h"
#include "objfiles.h"
#include "gdbcore.h"
#include "target.h"
#include "arch-utils.h"
#include "regcache.h"
#include "regset.h"
#include "dis-asm.h"
#include "frame-unwind.h"
#include "frame-base.h"
#include "trad-frame.h"
#include "dwarf2/frame.h"
#include "score-tdep.h"

#define G_FLD(_i,_ms,_ls) \
    ((unsigned)((_i) << (31 - (_ms))) >> (31 - (_ms) + (_ls)))

typedef struct{
  unsigned long long v;
  unsigned long long raw;
  unsigned int len;
}inst_t;

struct score_frame_cache
{
  CORE_ADDR base;
  CORE_ADDR fp;
  trad_frame_saved_reg *saved_regs;
};

static int target_mach = bfd_mach_score7;

static struct type *
score_register_type (struct gdbarch *gdbarch, int regnum)
{
  gdb_assert (regnum >= 0 
	      && regnum < ((target_mach == bfd_mach_score7)
			   ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
  return builtin_type (gdbarch)->builtin_uint32;
}

static const char *
score7_register_name (struct gdbarch *gdbarch, int regnum)
{
  const char *score_register_names[] = {
    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",

    "PSR",     "COND",  "ECR",     "EXCPVEC", "CCR",
    "EPC",     "EMA",   "TLBLOCK", "TLBPT",   "PEADDR",
    "TLBRPT",  "PEVN",  "PECTX",   "LIMPFN",  "LDMPFN", 
    "PREV",    "DREG",  "PC",      "DSAVE",   "COUNTER",
    "LDCR",    "STCR",  "CEH",     "CEL",
  };

  gdb_assert (regnum >= 0 && regnum < SCORE7_NUM_REGS);
  return score_register_names[regnum];
}

static const char *
score3_register_name (struct gdbarch *gdbarch, int regnum)
{
  const char *score_register_names[] = {
    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",

    "PSR",      "COND",   "ECR",   "EXCPVEC",  "CCR",
    "EPC",      "EMA",    "PREV",  "DREG",     "DSAVE",
    "COUNTER",  "LDCR",   "STCR",  "CEH",      "CEL",
    "",         "",       "PC",
  };

  gdb_assert (regnum >= 0 && regnum < SCORE3_NUM_REGS);
  return score_register_names[regnum];
}

#if WITH_SIM
static int
score_register_sim_regno (struct gdbarch *gdbarch, int regnum)
{
  gdb_assert (regnum >= 0 
	      && regnum < ((target_mach == bfd_mach_score7)
			   ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
  return regnum;
}
#endif

static inst_t *
score7_fetch_inst (struct gdbarch *gdbarch, CORE_ADDR addr, gdb_byte *memblock)
{
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  static inst_t inst = { 0, 0, 0 };
  gdb_byte buf[SCORE_INSTLEN] = { 0 };
  int big;
  int ret;

  if (target_has_execution () && memblock != NULL)
    {
      /* Fetch instruction from local MEMBLOCK.  */
      memcpy (buf, memblock, SCORE_INSTLEN);
    }
  else
    {
      /* Fetch instruction from target.  */
      ret = target_read_memory (addr & ~0x3, buf, SCORE_INSTLEN);
      if (ret)
	{
	  error (_("Error: target_read_memory in file:%s, line:%d!"),
		  __FILE__, __LINE__);
	  return 0;
	}
    }

  inst.raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);
  inst.len = (inst.raw & 0x80008000) ? 4 : 2;
  inst.v = ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF); 
  big = (byte_order == BFD_ENDIAN_BIG);
  if (inst.len == 2)
    {
      if (big ^ ((addr & 0x2) == 2))
	inst.v = G_FLD (inst.v, 29, 15);
      else
	inst.v = G_FLD (inst.v, 14, 0);
    }
  return &inst;
}

static inst_t *
score3_adjust_pc_and_fetch_inst (CORE_ADDR *pcptr, int *lenptr,
				 enum bfd_endian byte_order)
{
  static inst_t inst = { 0, 0, 0 };

  struct breakplace
  {
    int break_offset;
    int inst_len;
  };
  /*     raw        table 1 (column 2, 3, 4)
    *  0  1  0  *   # 2
    *  0  1  1  0   # 3
    0  1  1  0  *   # 6
		    table 2 (column 1, 2, 3)
    *  0  0  *  *   # 0, 4
    0  1  0  *  *   # 2
    1  1  0  *  *   # 6
   */

  static const struct breakplace bk_table[16] =
    {
      /* table 1 */
      {0, 0},
      {0, 0},
      {0, 4},
      {0, 6},
      {0, 0},
      {0, 0},
      {-2, 6},
      {0, 0},
      /* table 2 */
      {0, 2},
      {0, 0},
      {-2, 4},
      {0, 0},
      {0, 2},
      {0, 0},
      {-4, 6},
      {0, 0}
    };

#define EXTRACT_LEN 2
  CORE_ADDR adjust_pc = *pcptr & ~0x1;
  gdb_byte buf[5][EXTRACT_LEN] =
    {
      {'\0', '\0'},
      {'\0', '\0'},
      {'\0', '\0'},
      {'\0', '\0'},
      {'\0', '\0'}
    };
  int ret;
  unsigned int raw;
  unsigned int cbits = 0;
  int bk_index;
  int i, count;

  inst.v = 0;
  inst.raw = 0;
  inst.len = 0;

  adjust_pc -= 4;
  for (i = 0; i < 5; i++)
    {
      ret = target_read_memory (adjust_pc + 2 * i, buf[i], EXTRACT_LEN);
      if (ret != 0)
	{
	  buf[i][0] = '\0';
	  buf[i][1] = '\0';
	  if (i == 2)
	    error (_("Error: target_read_memory in file:%s, line:%d!"),
		   __FILE__, __LINE__);
	}

      raw = extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
      cbits = (cbits << 1) | (raw >> 15); 
    }
  adjust_pc += 4;

  if (cbits & 0x4)
    {
      /* table 1 */
      cbits = (cbits >> 1) & 0x7;
      bk_index = cbits;
    }
  else
    {
      /* table 2 */
      cbits = (cbits >> 2) & 0x7;
      bk_index = cbits + 8; 
    }

  gdb_assert (!((bk_table[bk_index].break_offset == 0)
		&& (bk_table[bk_index].inst_len == 0)));

  inst.len = bk_table[bk_index].inst_len;

  i = (bk_table[bk_index].break_offset + 4) / 2;
  count = inst.len / 2;
  for (; count > 0; i++, count--)
    {
      inst.raw = (inst.raw << 16)
		 | extract_unsigned_integer (buf[i], EXTRACT_LEN, byte_order);
    }

  switch (inst.len)
    {
    case 2:
      inst.v = inst.raw & 0x7FFF;
      break;
    case 4:
      inst.v = ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
      break;
    case 6:
      inst.v = ((inst.raw >> 32 & 0x7FFF) << 30)
	       | ((inst.raw >> 16 & 0x7FFF) << 15) | (inst.raw & 0x7FFF);
      break;
    }

  if (pcptr)
    *pcptr = adjust_pc + bk_table[bk_index].break_offset;
  if (lenptr)
    *lenptr = bk_table[bk_index].inst_len;

#undef EXTRACT_LEN

  return &inst;
}

/* Implement the breakpoint_kind_from_pc gdbarch method.  */

static int
score7_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
{
  int ret;
  unsigned int raw;
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  gdb_byte buf[SCORE_INSTLEN] = { 0 };

  if ((ret = target_read_memory (*pcptr & ~0x3, buf, SCORE_INSTLEN)) != 0)
    {
      error (_("Error: target_read_memory in file:%s, line:%d!"),
	     __FILE__, __LINE__);
    }
  raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);

  if (!(raw & 0x80008000))
    {
      /* 16bits instruction.  */
      *pcptr &= ~0x1;
      return 2;
    }
  else
    {
      /* 32bits instruction.  */
      *pcptr &= ~0x3;
      return 4;
    }
}

/* Implement the sw_breakpoint_from_kind gdbarch method.  */

static const gdb_byte *
score7_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
{
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);

  *size = kind;

  if (kind == 4)
    {
      static gdb_byte big_breakpoint32[] = { 0x80, 0x00, 0x80, 0x06 };
      static gdb_byte little_breakpoint32[] = { 0x06, 0x80, 0x00, 0x80 };

      if (byte_order == BFD_ENDIAN_BIG)
	return big_breakpoint32;
      else
	return little_breakpoint32;
    }
  else
    {
      static gdb_byte big_breakpoint16[] = { 0x60, 0x02 };
      static gdb_byte little_breakpoint16[] = { 0x02, 0x60 };

      if (byte_order == BFD_ENDIAN_BIG)
	return big_breakpoint16;
      else
	return little_breakpoint16;
    }
}

/* Implement the breakpoint_kind_from_pc gdbarch method.  */

static int
score3_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
{
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  int len;

  score3_adjust_pc_and_fetch_inst (pcptr, &len, byte_order);

  return len;
}

/* Implement the sw_breakpoint_from_kind gdbarch method.  */

static const gdb_byte *
score3_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
{
  int index = 0;
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  static gdb_byte score_break_insns[6][6] = {
    /* The following three instructions are big endian.  */
    { 0x00, 0x20 },
    { 0x80, 0x00, 0x00, 0x06 },
    { 0x80, 0x00, 0x80, 0x00, 0x00, 0x00 },
    /* The following three instructions are little endian.  */
    { 0x20, 0x00 },
    { 0x00, 0x80, 0x06, 0x00 },
    { 0x00, 0x80, 0x00, 0x80, 0x00, 0x00 }};

  *size = kind;

  index = ((byte_order == BFD_ENDIAN_BIG) ? 0 : 3) + (kind / 2 - 1);
  return score_break_insns[index];
}

static CORE_ADDR
score_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
{
  CORE_ADDR adjust_pc = bpaddr; 

  if (target_mach == bfd_mach_score3)
    score3_adjust_pc_and_fetch_inst (&adjust_pc, NULL,
		    		     gdbarch_byte_order (gdbarch));
  else
    adjust_pc = align_down (adjust_pc, 2);
  
  return adjust_pc;
}

static CORE_ADDR
score_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
{
  return align_down (addr, 16);
}

static void
score_xfer_register (struct regcache *regcache, int regnum, int length,
		     enum bfd_endian endian, gdb_byte *readbuf,
		     const gdb_byte *writebuf, int buf_offset)
{
  int reg_offset = 0;
  gdb_assert (regnum >= 0 
	      && regnum < ((target_mach == bfd_mach_score7)
			   ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));

  switch (endian)
    {
    case BFD_ENDIAN_BIG:
      reg_offset = SCORE_REGSIZE - length;
      break;
    case BFD_ENDIAN_LITTLE:
      reg_offset = 0;
      break;
    case BFD_ENDIAN_UNKNOWN:
      reg_offset = 0;
      break;
    default:
      error (_("Error: score_xfer_register in file:%s, line:%d!"),
	     __FILE__, __LINE__);
    }

  if (readbuf != NULL)
    regcache->cooked_read_part (regnum, reg_offset, length,
				readbuf + buf_offset);
  if (writebuf != NULL)
    regcache->cooked_write_part (regnum, reg_offset, length,
				 writebuf + buf_offset);
}

static enum return_value_convention
score_return_value (struct gdbarch *gdbarch, struct value *function,
		    struct type *type, struct regcache *regcache,
		    gdb_byte * readbuf, const gdb_byte * writebuf)
{
  if (type->code () == TYPE_CODE_STRUCT
      || type->code () == TYPE_CODE_UNION
      || type->code () == TYPE_CODE_ARRAY)
    return RETURN_VALUE_STRUCT_CONVENTION;
  else
    {
      int offset;
      int regnum;
      for (offset = 0, regnum = SCORE_A0_REGNUM;
	   offset < TYPE_LENGTH (type);
	   offset += SCORE_REGSIZE, regnum++)
	{
	  int xfer = SCORE_REGSIZE;

	  if (offset + xfer > TYPE_LENGTH (type))
	    xfer = TYPE_LENGTH (type) - offset;
	  score_xfer_register (regcache, regnum, xfer,
			       gdbarch_byte_order(gdbarch),
			       readbuf, writebuf, offset);
	}
      return RETURN_VALUE_REGISTER_CONVENTION;
    }
}

static int
score_type_needs_double_align (struct type *type)
{
  enum type_code typecode = type->code ();

  if ((typecode == TYPE_CODE_INT && TYPE_LENGTH (type) == 8)
      || (typecode == TYPE_CODE_FLT && TYPE_LENGTH (type) == 8))
    return 1;
  else if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
    {
      int i, n;

      n = type->num_fields ();
      for (i = 0; i < n; i++)
	if (score_type_needs_double_align (type->field (i).type ()))
	  return 1;
      return 0;
    }
  return 0;
}

static CORE_ADDR
score_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
		       struct regcache *regcache, CORE_ADDR bp_addr,
		       int nargs, struct value **args, CORE_ADDR sp,
		       function_call_return_method return_method,
		       CORE_ADDR struct_addr)
{
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  int argnum;
  int argreg;
  int arglen = 0;
  CORE_ADDR stack_offset = 0;
  CORE_ADDR addr = 0;

  /* Step 1, Save RA.  */
  regcache_cooked_write_unsigned (regcache, SCORE_RA_REGNUM, bp_addr);

  /* Step 2, Make space on the stack for the args.  */
  struct_addr = align_down (struct_addr, 16);
  sp = align_down (sp, 16);
  for (argnum = 0; argnum < nargs; argnum++)
    arglen += align_up (TYPE_LENGTH (value_type (args[argnum])),
			SCORE_REGSIZE);
  sp -= align_up (arglen, 16);

  argreg = SCORE_BEGIN_ARG_REGNUM;

  /* Step 3, Check if struct return then save the struct address to
     r4 and increase the stack_offset by 4.  */
  if (return_method == return_method_struct)
    {
      regcache_cooked_write_unsigned (regcache, argreg++, struct_addr);
      stack_offset += SCORE_REGSIZE;
    }

  /* Step 4, Load arguments:
     If arg length is too long (> 4 bytes), then split the arg and
     save every parts.  */
  for (argnum = 0; argnum < nargs; argnum++)
    {
      struct value *arg = args[argnum];
      struct type *arg_type = check_typedef (value_type (arg));
      enum type_code typecode = arg_type->code ();
      const gdb_byte *val = value_contents (arg);
      int downward_offset = 0;
      int arg_last_part_p = 0;

      arglen = TYPE_LENGTH (arg_type);

      /* If a arg should be aligned to 8 bytes (long long or double),
	 the value should be put to even register numbers.  */
      if (score_type_needs_double_align (arg_type))
	{
	  if (argreg & 1)
	    argreg++;
	}

      /* If sizeof a block < SCORE_REGSIZE, then Score GCC will chose
	 the default "downward"/"upward" method:

	 Example:

	 struct struc
	 {
	   char a; char b; char c;
	 } s = {'a', 'b', 'c'};

	 Big endian:    s = {X, 'a', 'b', 'c'}
	 Little endian: s = {'a', 'b', 'c', X}

	 Where X is a hole.  */

      if (gdbarch_byte_order(gdbarch) == BFD_ENDIAN_BIG
	  && (typecode == TYPE_CODE_STRUCT
	      || typecode == TYPE_CODE_UNION)
	  && argreg > SCORE_LAST_ARG_REGNUM
	  && arglen < SCORE_REGSIZE)
	downward_offset += (SCORE_REGSIZE - arglen);

      while (arglen > 0)
	{
	  int partial_len = arglen < SCORE_REGSIZE ? arglen : SCORE_REGSIZE;
	  ULONGEST regval = extract_unsigned_integer (val, partial_len,
			  			      byte_order);

	  /* The last part of a arg should shift left when
	     gdbarch_byte_order is BFD_ENDIAN_BIG.  */
	  if (byte_order == BFD_ENDIAN_BIG
	      && arg_last_part_p == 1
	      && (typecode == TYPE_CODE_STRUCT
		  || typecode == TYPE_CODE_UNION))
	    regval <<= ((SCORE_REGSIZE - partial_len) * TARGET_CHAR_BIT);

	  /* Always increase the stack_offset and save args to stack.  */
	  addr = sp + stack_offset + downward_offset;
	  write_memory (addr, val, partial_len);

	  if (argreg <= SCORE_LAST_ARG_REGNUM)
	    {
	      regcache_cooked_write_unsigned (regcache, argreg++, regval);
	      if (arglen > SCORE_REGSIZE && arglen < SCORE_REGSIZE * 2)
		arg_last_part_p = 1;
	    }

	  val += partial_len;
	  arglen -= partial_len;
	  stack_offset += align_up (partial_len, SCORE_REGSIZE);
	}
    }

  /* Step 5, Save SP.  */
  regcache_cooked_write_unsigned (regcache, SCORE_SP_REGNUM, sp);

  return sp;
}

static CORE_ADDR
score7_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
{
  CORE_ADDR cpc = pc;
  int iscan = 32, stack_sub = 0;
  while (iscan-- > 0)
    {
      inst_t *inst = score7_fetch_inst (gdbarch, cpc, NULL);
      if (!inst)
	break;
      if ((inst->len == 4) && !stack_sub
	  && (G_FLD (inst->v, 29, 25) == 0x1
	      && G_FLD (inst->v, 24, 20) == 0x0))
	{
	  /* addi r0, offset */
	  stack_sub = cpc + SCORE_INSTLEN;
	  pc = cpc + SCORE_INSTLEN;
	}
      else if ((inst->len == 4)
	       && (G_FLD (inst->v, 29, 25) == 0x0)
	       && (G_FLD (inst->v, 24, 20) == 0x2)
	       && (G_FLD (inst->v, 19, 15) == 0x0)
	       && (G_FLD (inst->v, 14, 10) == 0xF)
	       && (G_FLD (inst->v, 9, 0) == 0x56))
	{
	  /* mv r2, r0  */
	  pc = cpc + SCORE_INSTLEN;
	  break;
	}
      else if ((inst->len == 2)
	       && (G_FLD (inst->v, 14, 12) == 0x0)
	       && (G_FLD (inst->v, 11, 8) == 0x2)
	       && (G_FLD (inst->v, 7, 4) == 0x0)
	       && (G_FLD (inst->v, 3, 0) == 0x3))
	{
	  /* mv! r2, r0 */
	  pc = cpc + SCORE16_INSTLEN;
	  break;
	}
      else if ((inst->len == 2)
	       && ((G_FLD (inst->v, 14, 12) == 3)    /* j15 form */
		   || (G_FLD (inst->v, 14, 12) == 4) /* b15 form */
		   || (G_FLD (inst->v, 14, 12) == 0x0
		       && G_FLD (inst->v, 3, 0) == 0x4))) /* br! */
	break;
      else if ((inst->len == 4)
	       && ((G_FLD (inst->v, 29, 25) == 2)    /* j32 form */
		   || (G_FLD (inst->v, 29, 25) == 4) /* b32 form */
		   || (G_FLD (inst->v, 29, 25) == 0x0
		       && G_FLD (inst->v, 6, 1) == 0x4)))  /* br */
	break;

      cpc += (inst->len == 2) ? SCORE16_INSTLEN : SCORE_INSTLEN;
    }
  return pc;
}

static CORE_ADDR
score3_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
{
  CORE_ADDR cpc = pc;
  int iscan = 32, stack_sub = 0;
  while (iscan-- > 0)
    {
      inst_t *inst
	= score3_adjust_pc_and_fetch_inst (&cpc, NULL,
					   gdbarch_byte_order (gdbarch));

      if (!inst)
	break;
      if (inst->len == 4 && !stack_sub
	  && (G_FLD (inst->v, 29, 25) == 0x1)
	  && (G_FLD (inst->v, 19, 17) == 0x0)
	  && (G_FLD (inst->v, 24, 20) == 0x0))
	{
	  /* addi r0, offset */
	  stack_sub = cpc + inst->len;
	  pc = cpc + inst->len;
	}
      else if (inst->len == 4
	       && (G_FLD (inst->v, 29, 25) == 0x0)
	       && (G_FLD (inst->v, 24, 20) == 0x2)
	       && (G_FLD (inst->v, 19, 15) == 0x0)
	       && (G_FLD (inst->v, 14, 10) == 0xF)
	       && (G_FLD (inst->v, 9, 0) == 0x56))
	{
	  /* mv r2, r0  */
	  pc = cpc + inst->len;
	  break;
	}
      else if ((inst->len == 2)
	       && (G_FLD (inst->v, 14, 10) == 0x10)
	       && (G_FLD (inst->v, 9, 5) == 0x2)
	       && (G_FLD (inst->v, 4, 0) == 0x0))
	{
	  /* mv! r2, r0 */
	  pc = cpc + inst->len;
	  break;
	}
      else if (inst->len == 2
	       && ((G_FLD (inst->v, 14, 12) == 3) /* b15 form */
		   || (G_FLD (inst->v, 14, 12) == 0x0
		       && G_FLD (inst->v, 11, 5) == 0x4))) /* br! */
	break;
      else if (inst->len == 4
	       && ((G_FLD (inst->v, 29, 25) == 2)    /* j32 form */
		   || (G_FLD (inst->v, 29, 25) == 4))) /* b32 form */
	break;

      cpc += inst->len;
    }
  return pc;
}

/* Implement the stack_frame_destroyed_p gdbarch method. */

static int
score7_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
{
  inst_t *inst = score7_fetch_inst (gdbarch, cur_pc, NULL);

  if (inst->v == 0x23)
    return 1;   /* mv! r0, r2 */
  else if (G_FLD (inst->v, 14, 12) == 0x2
	   && G_FLD (inst->v, 3, 0) == 0xa)
    return 1;   /* pop! */
  else if (G_FLD (inst->v, 14, 12) == 0x0
	   && G_FLD (inst->v, 7, 0) == 0x34)
    return 1;   /* br! r3 */
  else if (G_FLD (inst->v, 29, 15) == 0x2
	   && G_FLD (inst->v, 6, 1) == 0x2b)
    return 1;   /* mv r0, r2 */
  else if (G_FLD (inst->v, 29, 25) == 0x0
	   && G_FLD (inst->v, 6, 1) == 0x4
	   && G_FLD (inst->v, 19, 15) == 0x3)
    return 1;   /* br r3 */
  else
    return 0;
}

/* Implement the stack_frame_destroyed_p gdbarch method. */

static int
score3_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
{
  CORE_ADDR pc = cur_pc;
  inst_t *inst
    = score3_adjust_pc_and_fetch_inst (&pc, NULL,
				       gdbarch_byte_order (gdbarch));

  if (inst->len == 2
      && (G_FLD (inst->v, 14, 10) == 0x10)
      && (G_FLD (inst->v, 9, 5) == 0x0)
      && (G_FLD (inst->v, 4, 0) == 0x2))
    return 1;   /* mv! r0, r2 */
  else if (inst->len == 4
	   && (G_FLD (inst->v, 29, 25) == 0x0)
	   && (G_FLD (inst->v, 24, 20) == 0x2)
	   && (G_FLD (inst->v, 19, 15) == 0x0)
	   && (G_FLD (inst->v, 14, 10) == 0xF)
	   && (G_FLD (inst->v, 9, 0) == 0x56))
    return 1;   /* mv r0, r2 */
  else if (inst->len == 2
	   && (G_FLD (inst->v, 14, 12) == 0x0)
	   && (G_FLD (inst->v, 11, 5) == 0x2))
    return 1;   /* pop! */
  else if (inst->len == 2
	   && (G_FLD (inst->v, 14, 12) == 0x0)
	   && (G_FLD (inst->v, 11, 7) == 0x0)
	   && (G_FLD (inst->v, 6, 5) == 0x2))
    return 1;   /* rpop! */
  else if (inst->len == 2
	   && (G_FLD (inst->v, 14, 12) == 0x0)
	   && (G_FLD (inst->v, 11, 5) == 0x4)
	   && (G_FLD (inst->v, 4, 0) == 0x3))
    return 1;   /* br! r3 */
  else if (inst->len == 4
	   && (G_FLD (inst->v, 29, 25) == 0x0)
	   && (G_FLD (inst->v, 24, 20) == 0x0)
	   && (G_FLD (inst->v, 19, 15) == 0x3)
	   && (G_FLD (inst->v, 14, 10) == 0xF)
	   && (G_FLD (inst->v, 9, 0) == 0x8))
    return 1;   /* br r3 */
  else
    return 0;
}

static gdb_byte *
score7_malloc_and_get_memblock (CORE_ADDR addr, CORE_ADDR size)
{
  int ret;
  gdb_byte *memblock = NULL;

  if (size == 0)
    return NULL;

  memblock = (gdb_byte *) xmalloc (size);
  memset (memblock, 0, size);
  ret = target_read_memory (addr & ~0x3, memblock, size);
  if (ret)
    {
      error (_("Error: target_read_memory in file:%s, line:%d!"),
	     __FILE__, __LINE__);
      return NULL;
    }
  return memblock;
}

static void
score7_free_memblock (gdb_byte *memblock)
{
  xfree (memblock);
}

static void
score7_adjust_memblock_ptr (gdb_byte **memblock, CORE_ADDR prev_pc,
			   CORE_ADDR cur_pc)
{
  if (prev_pc == -1)
    {
      /* First time call this function, do nothing.  */
    }
  else if (cur_pc - prev_pc == 2 && (cur_pc & 0x3) == 0)
    {
      /* First 16-bit instruction, then 32-bit instruction.  */
      *memblock += SCORE_INSTLEN;
    }
  else if (cur_pc - prev_pc == 4)
    {
      /* Is 32-bit instruction, increase MEMBLOCK by 4.  */
      *memblock += SCORE_INSTLEN;
    }
}

static void
score7_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
			struct frame_info *this_frame,
			struct score_frame_cache *this_cache)
{
  struct gdbarch *gdbarch = get_frame_arch (this_frame);
  CORE_ADDR sp;
  CORE_ADDR fp;
  CORE_ADDR cur_pc = startaddr;

  int sp_offset = 0;
  int ra_offset = 0;
  int fp_offset = 0;
  int ra_offset_p = 0;
  int fp_offset_p = 0;
  int inst_len = 0;

  gdb_byte *memblock = NULL;
  gdb_byte *memblock_ptr = NULL;
  CORE_ADDR prev_pc = -1;

  /* Allocate MEMBLOCK if PC - STARTADDR > 0.  */
  memblock_ptr = memblock =
    score7_malloc_and_get_memblock (startaddr, pc - startaddr);

  sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
  fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);

  for (; cur_pc < pc; prev_pc = cur_pc, cur_pc += inst_len)
    {
      inst_t *inst = NULL;
      if (memblock != NULL)
	{
	  /* Reading memory block from target successfully and got all
	     the instructions(from STARTADDR to PC) needed.  */
	  score7_adjust_memblock_ptr (&memblock, prev_pc, cur_pc);
	  inst = score7_fetch_inst (gdbarch, cur_pc, memblock);
	}
      else
	{
	  /* Otherwise, we fetch 4 bytes from target, and GDB also
	     work correctly.  */
	  inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
	}

      /* FIXME: make a full-power prologue analyzer.  */
      if (inst->len == 2)
	{
	  inst_len = SCORE16_INSTLEN;

	  if (G_FLD (inst->v, 14, 12) == 0x2
	      && G_FLD (inst->v, 3, 0) == 0xe)
	    {
	      /* push! */
	      sp_offset += 4;

	      if (G_FLD (inst->v, 11, 7) == 0x6
		  && ra_offset_p == 0)
		{
		  /* push! r3, [r0] */
		  ra_offset = sp_offset;
		  ra_offset_p = 1;
		}
	      else if (G_FLD (inst->v, 11, 7) == 0x4
		       && fp_offset_p == 0)
		{
		  /* push! r2, [r0] */
		  fp_offset = sp_offset;
		  fp_offset_p = 1;
		}
	    }
	  else if (G_FLD (inst->v, 14, 12) == 0x2
		   && G_FLD (inst->v, 3, 0) == 0xa)
	    {
	      /* pop! */
	      sp_offset -= 4;
	    }
	  else if (G_FLD (inst->v, 14, 7) == 0xc1
		   && G_FLD (inst->v, 2, 0) == 0x0)
	    {
	      /* subei! r0, n */
	      sp_offset += (int) pow (2.0, G_FLD (inst->v, 6, 3));
	    }
	  else if (G_FLD (inst->v, 14, 7) == 0xc0
		   && G_FLD (inst->v, 2, 0) == 0x0)
	    {
	      /* addei! r0, n */
	      /* Solaris 11+gcc 5.5 has ambiguous overloads of pow, so we
		 pass 2.0 instead of 2 to get the right one.  */
	      sp_offset -= (int) pow (2.0, G_FLD (inst->v, 6, 3));
	    }
	}
      else
	{
	  inst_len = SCORE_INSTLEN;

	  if (G_FLD(inst->v, 29, 25) == 0x3
	      && G_FLD(inst->v, 2, 0) == 0x4
	      && G_FLD(inst->v, 19, 15) == 0)
	    {
		/* sw rD, [r0, offset]+ */
		sp_offset += SCORE_INSTLEN;

		if (G_FLD(inst->v, 24, 20) == 0x3)
		  {
		      /* rD = r3 */
		      if (ra_offset_p == 0)
			{
			    ra_offset = sp_offset;
			    ra_offset_p = 1;
			}
		  }
		else if (G_FLD(inst->v, 24, 20) == 0x2)
		  {
		      /* rD = r2 */
		      if (fp_offset_p == 0)
			{
			    fp_offset = sp_offset;
			    fp_offset_p = 1;
			}
		  }
	    }
	  else if (G_FLD(inst->v, 29, 25) == 0x14
		   && G_FLD(inst->v, 19,15) == 0)
	    {
		/* sw rD, [r0, offset] */
		if (G_FLD(inst->v, 24, 20) == 0x3)
		  {
		      /* rD = r3 */
		      ra_offset = sp_offset - G_FLD(inst->v, 14, 0);
		      ra_offset_p = 1;
		  }
		else if (G_FLD(inst->v, 24, 20) == 0x2)
		  {
		      /* rD = r2 */
		      fp_offset = sp_offset - G_FLD(inst->v, 14, 0);
		      fp_offset_p = 1;
		  }
	    }
	  else if (G_FLD (inst->v, 29, 15) == 0x1c60
		   && G_FLD (inst->v, 2, 0) == 0x0)
	    {
	      /* lw r3, [r0]+, 4 */
	      sp_offset -= SCORE_INSTLEN;
	      ra_offset_p = 1;
	    }
	  else if (G_FLD (inst->v, 29, 15) == 0x1c40
		   && G_FLD (inst->v, 2, 0) == 0x0)
	    {
	      /* lw r2, [r0]+, 4 */
	      sp_offset -= SCORE_INSTLEN;
	      fp_offset_p = 1;
	    }

	  else if (G_FLD (inst->v, 29, 17) == 0x100
		   && G_FLD (inst->v, 0, 0) == 0x0)
	    {
	      /* addi r0, -offset */
	      sp_offset += 65536 - G_FLD (inst->v, 16, 1);
	    }
	  else if (G_FLD (inst->v, 29, 17) == 0x110
		   && G_FLD (inst->v, 0, 0) == 0x0)
	    {
	      /* addi r2, offset */
	      if (pc - cur_pc > 4)
		{
		  unsigned int save_v = inst->v;
		  inst_t *inst2 =
		    score7_fetch_inst (gdbarch, cur_pc + SCORE_INSTLEN, NULL);
		  if (inst2->v == 0x23)
		    {
		      /* mv! r0, r2 */
		      sp_offset -= G_FLD (save_v, 16, 1);
		    }
		}
	    }
	}
    }

  /* Save RA.  */
  if (ra_offset_p == 1)
    {
      if (this_cache->saved_regs[SCORE_PC_REGNUM].is_realreg ()
	  && this_cache->saved_regs[SCORE_PC_REGNUM].realreg ()
	     == SCORE_PC_REGNUM)
	this_cache->saved_regs[SCORE_PC_REGNUM].set_addr (sp + sp_offset
							  - ra_offset);
    }
  else
    {
      this_cache->saved_regs[SCORE_PC_REGNUM] =
	this_cache->saved_regs[SCORE_RA_REGNUM];
    }

  /* Save FP.  */
  if (fp_offset_p == 1)
    {
      if (this_cache->saved_regs[SCORE_FP_REGNUM].is_realreg ()
	  && this_cache->saved_regs[SCORE_FP_REGNUM].realreg ()
	     == SCORE_FP_REGNUM)
	this_cache->saved_regs[SCORE_FP_REGNUM].set_addr (sp + sp_offset
							  - fp_offset);
    }

  /* Save SP and FP.  */
  this_cache->base = sp + sp_offset;
  this_cache->fp = fp;

  /* Don't forget to free MEMBLOCK if we allocated it.  */
  if (memblock_ptr != NULL)
    score7_free_memblock (memblock_ptr);
}

static void
score3_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
			struct frame_info *this_frame,
			struct score_frame_cache *this_cache)
{
  CORE_ADDR sp;
  CORE_ADDR fp;
  CORE_ADDR cur_pc = startaddr;
  enum bfd_endian byte_order
    = gdbarch_byte_order (get_frame_arch (this_frame));

  int sp_offset = 0;
  int ra_offset = 0;
  int fp_offset = 0;
  int ra_offset_p = 0;
  int fp_offset_p = 0;
  int inst_len = 0;

  sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
  fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);

  for (; cur_pc < pc; cur_pc += inst_len)
    {
      inst_t *inst = NULL;

      inst = score3_adjust_pc_and_fetch_inst (&cur_pc, &inst_len, byte_order);

      /* FIXME: make a full-power prologue analyzer.  */
      if (inst->len == 2)
	{
	  if (G_FLD (inst->v, 14, 12) == 0x0
	      && G_FLD (inst->v, 11, 7) == 0x0
	      && G_FLD (inst->v, 6, 5) == 0x3)
	    {
	      /* push! */
	      sp_offset += 4;

	      if (G_FLD (inst->v, 4, 0) == 0x3
		  && ra_offset_p == 0)
		{
		  /* push! r3, [r0] */
		  ra_offset = sp_offset;
		  ra_offset_p = 1;
		}
	      else if (G_FLD (inst->v, 4, 0) == 0x2
		       && fp_offset_p == 0)
		{
		  /* push! r2, [r0] */
		  fp_offset = sp_offset;
		  fp_offset_p = 1;
		}
	    }
	  else if (G_FLD (inst->v, 14, 12) == 0x6
		   && G_FLD (inst->v, 11, 10) == 0x3)
	    {
	      /* rpush! */
	      int start_r = G_FLD (inst->v, 9, 5);
	      int cnt = G_FLD (inst->v, 4, 0);
     
	      if ((ra_offset_p == 0)
		  && (start_r <= SCORE_RA_REGNUM)
		  && (SCORE_RA_REGNUM < start_r + cnt))
		{
		  /* rpush! contains r3 */
		  ra_offset_p = 1;
		  ra_offset = sp_offset + 4 * (SCORE_RA_REGNUM - start_r) + 4;
		}

	      if ((fp_offset_p == 0)
		  && (start_r <= SCORE_FP_REGNUM)
		  && (SCORE_FP_REGNUM < start_r + cnt))
		{
		  /* rpush! contains r2 */
		  fp_offset_p = 1;
		  fp_offset = sp_offset + 4 * (SCORE_FP_REGNUM - start_r) + 4;
		}

	      sp_offset += 4 * cnt;
	    }
	  else if (G_FLD (inst->v, 14, 12) == 0x0
		   && G_FLD (inst->v, 11, 7) == 0x0
		   && G_FLD (inst->v, 6, 5) == 0x2)
	    {
	      /* pop! */
	      sp_offset -= 4;
	    }
	  else if (G_FLD (inst->v, 14, 12) == 0x6
		   && G_FLD (inst->v, 11, 10) == 0x2)
	    {
	      /* rpop! */
	      sp_offset -= 4 * G_FLD (inst->v, 4, 0);
	    }
	  else if (G_FLD (inst->v, 14, 12) == 0x5
		   && G_FLD (inst->v, 11, 10) == 0x3
		   && G_FLD (inst->v, 9, 6) == 0x0)
	    {
	      /* addi! r0, -offset */
	      int imm = G_FLD (inst->v, 5, 0);
	      if (imm >> 5)
		imm = -(0x3F - imm + 1);
	      sp_offset -= imm;
	    }
	  else if (G_FLD (inst->v, 14, 12) == 0x5
		   && G_FLD (inst->v, 11, 10) == 0x3
		   && G_FLD (inst->v, 9, 6) == 0x2)
	    {
	      /* addi! r2, offset */
	      if (pc - cur_pc >= 2)
		{
		  inst_t *inst2;
		  
		  cur_pc += inst->len;
		  inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
							   byte_order);

		  if (inst2->len == 2
		      && G_FLD (inst2->v, 14, 10) == 0x10
		      && G_FLD (inst2->v, 9, 5) == 0x0
		      && G_FLD (inst2->v, 4, 0) == 0x2)
		    {
		      /* mv! r0, r2 */
		      int imm = G_FLD (inst->v, 5, 0);
		      if (imm >> 5)
			imm = -(0x3F - imm + 1);
		      sp_offset -= imm;
		    }
		}
	    }
	}
      else if (inst->len == 4)
	{
	  if (G_FLD (inst->v, 29, 25) == 0x3
	      && G_FLD (inst->v, 2, 0) == 0x4
	      && G_FLD (inst->v, 24, 20) == 0x3
	      && G_FLD (inst->v, 19, 15) == 0x0)
	    {
	      /* sw r3, [r0, offset]+ */
	      sp_offset += inst->len;
	      if (ra_offset_p == 0)
		{
		  ra_offset = sp_offset;
		  ra_offset_p = 1;
		}
	    }
	  else if (G_FLD (inst->v, 29, 25) == 0x3
		   && G_FLD (inst->v, 2, 0) == 0x4
		   && G_FLD (inst->v, 24, 20) == 0x2
		   && G_FLD (inst->v, 19, 15) == 0x0)
	    {
	      /* sw r2, [r0, offset]+ */
	      sp_offset += inst->len;
	      if (fp_offset_p == 0)
		{
		  fp_offset = sp_offset;
		  fp_offset_p = 1;
		}
	    }
	  else if (G_FLD (inst->v, 29, 25) == 0x7
		   && G_FLD (inst->v, 2, 0) == 0x0
		   && G_FLD (inst->v, 24, 20) == 0x3
		   && G_FLD (inst->v, 19, 15) == 0x0)
	    {
	      /* lw r3, [r0]+, 4 */
	      sp_offset -= inst->len;
	      ra_offset_p = 1;
	    }
	  else if (G_FLD (inst->v, 29, 25) == 0x7
		   && G_FLD (inst->v, 2, 0) == 0x0
		   && G_FLD (inst->v, 24, 20) == 0x2
		   && G_FLD (inst->v, 19, 15) == 0x0)
	    {
	      /* lw r2, [r0]+, 4 */
	      sp_offset -= inst->len;
	      fp_offset_p = 1;
	    }
	  else if (G_FLD (inst->v, 29, 25) == 0x1
		   && G_FLD (inst->v, 19, 17) == 0x0
		   && G_FLD (inst->v, 24, 20) == 0x0
		   && G_FLD (inst->v, 0, 0) == 0x0)
	    {
	      /* addi r0, -offset */
	      int imm = G_FLD (inst->v, 16, 1);
	      if (imm >> 15)
		imm = -(0xFFFF - imm + 1);
	      sp_offset -= imm;
	    }
	  else if (G_FLD (inst->v, 29, 25) == 0x1
		   && G_FLD (inst->v, 19, 17) == 0x0
		   && G_FLD (inst->v, 24, 20) == 0x2
		   && G_FLD (inst->v, 0, 0) == 0x0)
	    {
	      /* addi r2, offset */
	      if (pc - cur_pc >= 2)
		{
		  inst_t *inst2;
		  
		  cur_pc += inst->len;
		  inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
							   byte_order);

		  if (inst2->len == 2
		      && G_FLD (inst2->v, 14, 10) == 0x10
		      && G_FLD (inst2->v, 9, 5) == 0x0
		      && G_FLD (inst2->v, 4, 0) == 0x2)
		    {
		      /* mv! r0, r2 */
		      int imm = G_FLD (inst->v, 16, 1);
		      if (imm >> 15)
			imm = -(0xFFFF - imm + 1);
		      sp_offset -= imm;
		    }
		}
	    }
	}
    }

  /* Save RA.  */
  if (ra_offset_p == 1)
    {
      if (this_cache->saved_regs[SCORE_PC_REGNUM].is_realreg ()
	  && this_cache->saved_regs[SCORE_PC_REGNUM].realreg ()
	     == SCORE_PC_REGNUM)
	this_cache->saved_regs[SCORE_PC_REGNUM].set_addr (sp + sp_offset
							  - ra_offset);
    }
  else
    {
      this_cache->saved_regs[SCORE_PC_REGNUM] =
	this_cache->saved_regs[SCORE_RA_REGNUM];
    }

  /* Save FP.  */
  if (fp_offset_p == 1)
    {
      if (this_cache->saved_regs[SCORE_FP_REGNUM].is_realreg ()
	  && this_cache->saved_regs[SCORE_FP_REGNUM].realreg ()
	     == SCORE_FP_REGNUM)
	this_cache->saved_regs[SCORE_FP_REGNUM].set_addr (sp + sp_offset
							  - fp_offset);
    }

  /* Save SP and FP.  */
  this_cache->base = sp + sp_offset;
  this_cache->fp = fp;
}

static struct score_frame_cache *
score_make_prologue_cache (struct frame_info *this_frame, void **this_cache)
{
  struct score_frame_cache *cache;

  if ((*this_cache) != NULL)
    return (struct score_frame_cache *) (*this_cache);

  cache = FRAME_OBSTACK_ZALLOC (struct score_frame_cache);
  (*this_cache) = cache;
  cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);

  /* Analyze the prologue.  */
  {
    const CORE_ADDR pc = get_frame_pc (this_frame);
    CORE_ADDR start_addr;

    find_pc_partial_function (pc, NULL, &start_addr, NULL);
    if (start_addr == 0)
      return cache;

    if (target_mach == bfd_mach_score3)
      score3_analyze_prologue (start_addr, pc, this_frame,
			       (struct score_frame_cache *) *this_cache);
    else
      score7_analyze_prologue (start_addr, pc, this_frame,
			       (struct score_frame_cache *) *this_cache);
  }

  /* Save SP.  */
  cache->saved_regs[SCORE_SP_REGNUM].set_value (cache->base);

  return (struct score_frame_cache *) (*this_cache);
}

static void
score_prologue_this_id (struct frame_info *this_frame, void **this_cache,
			struct frame_id *this_id)
{
  struct score_frame_cache *info = score_make_prologue_cache (this_frame,
							      this_cache);
  (*this_id) = frame_id_build (info->base, get_frame_func (this_frame));
}

static struct value *
score_prologue_prev_register (struct frame_info *this_frame,
			      void **this_cache, int regnum)
{
  struct score_frame_cache *info = score_make_prologue_cache (this_frame,
							      this_cache);
  return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}

static const struct frame_unwind score_prologue_unwind =
{
  "score prologue",
  NORMAL_FRAME,
  default_frame_unwind_stop_reason,
  score_prologue_this_id,
  score_prologue_prev_register,
  NULL,
  default_frame_sniffer,
  NULL
};

static CORE_ADDR
score_prologue_frame_base_address (struct frame_info *this_frame,
				   void **this_cache)
{
  struct score_frame_cache *info =
    score_make_prologue_cache (this_frame, this_cache);
  return info->fp;
}

static const struct frame_base score_prologue_frame_base =
{
  &score_prologue_unwind,
  score_prologue_frame_base_address,
  score_prologue_frame_base_address,
  score_prologue_frame_base_address,
};

static const struct frame_base *
score_prologue_frame_base_sniffer (struct frame_info *this_frame)
{
  return &score_prologue_frame_base;
}

/* Core file support.  */

static const struct regcache_map_entry score7_linux_gregmap[] =
  {
    /* FIXME: According to the current Linux kernel, r0 is preceded by
       9 rather than 7 words.  */
    { 7, REGCACHE_MAP_SKIP, 4 },
    { 32, 0, 4 },		/* r0 ... r31 */
    { 1, 55, 4 },		/* CEL */
    { 1, 54, 4 },		/* CEH */
    { 1, 53, 4 },		/* sr0, i.e. cnt or COUNTER */
    { 1, 52, 4 },		/* sr1, i.e. lcr or LDCR */
    { 1, 51, 4 },		/* sr2, i.e. scr or STCR */
    { 1, 49, 4 },		/* PC (same slot as EPC) */
    { 1, 38, 4 },		/* EMA */
    { 1, 32, 4 },		/* PSR */
    { 1, 34, 4 },		/* ECR */
    { 1, 33, 4 },		/* COND */
    { 0 }
  };

#define SCORE7_LINUX_EPC_OFFSET (44 * 4)
#define SCORE7_LINUX_SIZEOF_GREGSET (49 * 4)

static void
score7_linux_supply_gregset(const struct regset *regset,
			    struct regcache *regcache,
			    int regnum, const void *buf,
			    size_t size)
{
  regcache_supply_regset (regset, regcache, regnum, buf, size);

  /* Supply the EPC from the same slot as the PC.  Note that the
     collect function will store the PC in that slot.  */
  if ((regnum == -1 || regnum == SCORE_EPC_REGNUM)
      && size >= SCORE7_LINUX_EPC_OFFSET + 4)
    regcache->raw_supply
      (SCORE_EPC_REGNUM, (const gdb_byte *) buf + SCORE7_LINUX_EPC_OFFSET);
}

static const struct regset score7_linux_gregset =
  {
    score7_linux_gregmap,
    score7_linux_supply_gregset,
    regcache_collect_regset
  };

/* Iterate over core file register note sections.  */

static void
score7_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
					   iterate_over_regset_sections_cb *cb,
					   void *cb_data,
					   const struct regcache *regcache)
{
  cb (".reg", SCORE7_LINUX_SIZEOF_GREGSET, SCORE7_LINUX_SIZEOF_GREGSET,
      &score7_linux_gregset, NULL, cb_data);
}

static struct gdbarch *
score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{
  struct gdbarch *gdbarch;
  target_mach = info.bfd_arch_info->mach;

  arches = gdbarch_list_lookup_by_info (arches, &info);
  if (arches != NULL)
    {
      return (arches->gdbarch);
    }
  gdbarch = gdbarch_alloc (&info, NULL);

  set_gdbarch_short_bit (gdbarch, 16);
  set_gdbarch_int_bit (gdbarch, 32);
  set_gdbarch_float_bit (gdbarch, 32);
  set_gdbarch_double_bit (gdbarch, 64);
  set_gdbarch_long_double_bit (gdbarch, 64);
#if WITH_SIM
  set_gdbarch_register_sim_regno (gdbarch, score_register_sim_regno);
#endif
  set_gdbarch_pc_regnum (gdbarch, SCORE_PC_REGNUM);
  set_gdbarch_sp_regnum (gdbarch, SCORE_SP_REGNUM);
  set_gdbarch_adjust_breakpoint_address (gdbarch,
					 score_adjust_breakpoint_address);
  set_gdbarch_register_type (gdbarch, score_register_type);
  set_gdbarch_frame_align (gdbarch, score_frame_align);
  set_gdbarch_inner_than (gdbarch, core_addr_lessthan);

  switch (target_mach)
    {
    case bfd_mach_score7:
      set_gdbarch_breakpoint_kind_from_pc (gdbarch,
					   score7_breakpoint_kind_from_pc);
      set_gdbarch_sw_breakpoint_from_kind (gdbarch,
					   score7_sw_breakpoint_from_kind);
      set_gdbarch_skip_prologue (gdbarch, score7_skip_prologue);
      set_gdbarch_stack_frame_destroyed_p (gdbarch,
					   score7_stack_frame_destroyed_p);
      set_gdbarch_register_name (gdbarch, score7_register_name);
      set_gdbarch_num_regs (gdbarch, SCORE7_NUM_REGS);
      /* Core file support.  */
      set_gdbarch_iterate_over_regset_sections
	(gdbarch, score7_linux_iterate_over_regset_sections);
      break;

    case bfd_mach_score3:
      set_gdbarch_breakpoint_kind_from_pc (gdbarch,
					   score3_breakpoint_kind_from_pc);
      set_gdbarch_sw_breakpoint_from_kind (gdbarch,
					   score3_sw_breakpoint_from_kind);
      set_gdbarch_skip_prologue (gdbarch, score3_skip_prologue);
      set_gdbarch_stack_frame_destroyed_p (gdbarch,
					   score3_stack_frame_destroyed_p);
      set_gdbarch_register_name (gdbarch, score3_register_name);
      set_gdbarch_num_regs (gdbarch, SCORE3_NUM_REGS);
      break;
    }

  /* Watchpoint hooks.  */
  set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);

  /* Dummy frame hooks.  */
  set_gdbarch_return_value (gdbarch, score_return_value);
  set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
  set_gdbarch_push_dummy_call (gdbarch, score_push_dummy_call);

  /* Normal frame hooks.  */
  dwarf2_append_unwinders (gdbarch);
  frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
  frame_unwind_append_unwinder (gdbarch, &score_prologue_unwind);
  frame_base_append_sniffer (gdbarch, score_prologue_frame_base_sniffer);

  return gdbarch;
}

void _initialize_score_tdep ();
void
_initialize_score_tdep ()
{
  gdbarch_register (bfd_arch_score, score_gdbarch_init, NULL);
}
