/* Target-dependent code for the S+core architecture, for GDB,
the GNU Debugger.
- Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2006-2013 Free Software Foundation, Inc.
Contributed by Qinwei (qinwei@sunnorth.com.cn)
Contributed by Ching-Peng Lin (cplin@sunplus.com)
((unsigned)((_i) << (31 - (_ms))) >> (31 - (_ms) + (_ls)))
typedef struct{
- unsigned long long v;
- unsigned long long raw;
- unsigned int len;
+ unsigned long long v;
+ unsigned long long raw;
+ unsigned int len;
}inst_t;
struct score_frame_cache
static int target_mach = bfd_mach_score7;
-#if 0
-int
-score_target_can_use_watch (int type, int cnt, int othertype)
-{
- if (strcmp (current_target.to_shortname, "sim") == 0)
- return soc_gh_can_use_watch (type, cnt);
- return (*current_target.to_can_use_hw_breakpoint) (type, cnt, othertype);
-}
-
-int
-score_stopped_by_watch (void)
-{
- if (strcmp (current_target.to_shortname, "sim") == 0)
- return soc_gh_stopped_by_watch ();
- return (*current_target.to_stopped_by_watchpoint) ();
-}
-
-int
-score_target_insert_watchpoint (CORE_ADDR addr, int len, int type)
-{
- if (strcmp (current_target.to_shortname, "sim") == 0)
- return soc_gh_add_watch (addr, len, type);
- return (*current_target.to_insert_watchpoint) (addr, len, type);
-}
-
-int
-score_target_remove_watchpoint (CORE_ADDR addr, int len, int type)
-{
- if (strcmp (current_target.to_shortname, "sim") == 0)
- return soc_gh_del_watch (addr, len, type);
- return (*current_target.to_remove_watchpoint) (addr, len, type);
-}
-
-int
-score_target_insert_hw_breakpoint (struct gdbarch *gdbarch,
- struct bp_target_info * bp_tgt)
-{
- if (strcmp (current_target.to_shortname, "sim") == 0)
- return soc_gh_add_hardbp (bp_tgt->placed_address);
- return (*current_target.to_insert_hw_breakpoint) (gdbarch, bp_tgt);
-}
-
-int
-score_target_remove_hw_breakpoint (struct gdbarch *gdbarch,
- struct bp_target_info * bp_tgt)
-{
- if (strcmp (current_target.to_shortname, "sim") == 0)
- return soc_gh_del_hardbp (bp_tgt->placed_address);
- return (*current_target.to_remove_hw_breakpoint) (gdbarch, bp_tgt);
-}
-#endif
-
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));
+ && regnum < ((target_mach == bfd_mach_score7)
+ ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
return builtin_type (gdbarch)->builtin_uint32;
}
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));
+ && regnum < ((target_mach == bfd_mach_score7)
+ ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
return regnum;
}
#endif
ret = target_read_memory (addr & ~0x3, buf, SCORE_INSTLEN);
if (ret)
{
- error ("Error: target_read_memory in file:%s, line:%d!",
+ error (_("Error: target_read_memory in file:%s, line:%d!"),
__FILE__, __LINE__);
return 0;
}
#define EXTRACT_LEN 2
CORE_ADDR adjust_pc = *pcptr & ~0x1;
- int inst_len;
gdb_byte buf[5][EXTRACT_LEN] =
{
{'\0', '\0'},
buf[i][0] = '\0';
buf[i][1] = '\0';
if (i == 2)
- error ("Error: target_read_memory in file:%s, line:%d!",
+ error (_("Error: target_read_memory in file:%s, line:%d!"),
__FILE__, __LINE__);
}
if ((ret = target_read_memory (*pcptr & ~0x3, buf, SCORE_INSTLEN)) != 0)
{
- error ("Error: target_read_memory in file:%s, line:%d!",
+ error (_("Error: target_read_memory in file:%s, line:%d!"),
__FILE__, __LINE__);
}
raw = extract_unsigned_integer (buf, SCORE_INSTLEN, byte_order);
{
int reg_offset = 0;
gdb_assert (regnum >= 0
- && regnum < ((target_mach == bfd_mach_score7) ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
+ && regnum < ((target_mach == bfd_mach_score7)
+ ? SCORE7_NUM_REGS : SCORE3_NUM_REGS));
switch (endian)
{
reg_offset = 0;
break;
default:
- error ("Error: score_xfer_register in file:%s, line:%d!",
+ error (_("Error: score_xfer_register in file:%s, line:%d!"),
__FILE__, __LINE__);
}
}
static enum return_value_convention
-score_return_value (struct gdbarch *gdbarch, struct type *func_type,
+score_return_value (struct gdbarch *gdbarch, struct value *function,
struct type *type, struct regcache *regcache,
gdb_byte * readbuf, const gdb_byte * writebuf)
{
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,
static struct frame_id
score_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
- return frame_id_build (
- get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM),
- get_frame_pc (this_frame));
+ return frame_id_build (get_frame_register_unsigned (this_frame,
+ SCORE_SP_REGNUM),
+ get_frame_pc (this_frame));
}
static int
while (iscan-- > 0)
{
inst_t *inst
- = score3_adjust_pc_and_fetch_inst (&cpc, NULL, gdbarch_byte_order (gdbarch));
+ = score3_adjust_pc_and_fetch_inst (&cpc, NULL,
+ gdbarch_byte_order (gdbarch));
if (!inst)
break;
{
CORE_ADDR pc = cur_pc;
inst_t *inst
- = score3_adjust_pc_and_fetch_inst (&pc, NULL, gdbarch_byte_order (gdbarch));
+ = score3_adjust_pc_and_fetch_inst (&pc, NULL,
+ gdbarch_byte_order (gdbarch));
if (inst->len == 2
&& (G_FLD (inst->v, 14, 10) == 0x10)
if (size < 0)
{
- error ("Error: malloc size < 0 in file:%s, line:%d!",
+ error (_("Error: malloc size < 0 in file:%s, line:%d!"),
__FILE__, __LINE__);
return NULL;
}
ret = target_read_memory (addr & ~0x3, memblock, size);
if (ret)
{
- error ("Error: target_read_memory in file:%s, line:%d!",
+ error (_("Error: target_read_memory in file:%s, line:%d!"),
__FILE__, __LINE__);
return NULL;
}
inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
}
- /* FIXME: make a full-power prologue analyzer */
+ /* FIXME: make a full-power prologue analyzer. */
if (inst->len == 2)
{
inst_len = SCORE16_INSTLEN;
CORE_ADDR sp;
CORE_ADDR fp;
CORE_ADDR cur_pc = startaddr;
- enum bfd_endian byte_order = gdbarch_byte_order (get_frame_arch (this_frame));
+ enum bfd_endian byte_order
+ = gdbarch_byte_order (get_frame_arch (this_frame));
int sp_offset = 0;
int ra_offset = 0;
inst = score3_adjust_pc_and_fetch_inst (&cur_pc, &inst_len, byte_order);
- /* FIXME: make a full-power prologue analyzer */
+ /* FIXME: make a full-power prologue analyzer. */
if (inst->len == 2)
{
if (G_FLD (inst->v, 14, 12) == 0x0
inst_t *inst2;
cur_pc += inst->len;
- inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL, byte_order);
+ inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
+ byte_order);
if (inst2->len == 2
&& G_FLD (inst2->v, 14, 10) == 0x10
inst_t *inst2;
cur_pc += inst->len;
- inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL, byte_order);
+ inst2 = score3_adjust_pc_and_fetch_inst (&cur_pc, NULL,
+ byte_order);
if (inst2->len == 2
&& G_FLD (inst2->v, 14, 10) == 0x10
static const struct frame_unwind score_prologue_unwind =
{
NORMAL_FRAME,
+ default_frame_unwind_stop_reason,
score_prologue_this_id,
score_prologue_prev_register,
NULL,
/* Core file support (dirty hack)
- The core file MUST be generated by GNU/Linux on S+core */
+ The core file MUST be generated by GNU/Linux on S+core. */
static void
score7_linux_supply_gregset(const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs_buf, size_t len)
{
- int regno;
- elf_gregset_t *gregs;
+ int regno;
+ elf_gregset_t *gregs;
- gdb_assert (regset != NULL);
- gdb_assert ((regcache != NULL) && (gregs_buf != NULL));
+ gdb_assert (regset != NULL);
+ gdb_assert ((regcache != NULL) && (gregs_buf != NULL));
- gregs = (elf_gregset_t *) gregs_buf;
+ gregs = (elf_gregset_t *) gregs_buf;
- for (regno = 0; regno < 32; regno++)
- if (regnum == -1 || regnum == regno)
- regcache_raw_supply (regcache, regno, gregs->regs + regno);
+ for (regno = 0; regno < 32; regno++)
+ if (regnum == -1 || regnum == regno)
+ regcache_raw_supply (regcache, regno, gregs->regs + regno);
- {
- struct sreg {
- int regnum;
- void *buf;
- } sregs [] = {
- { 55, &(gregs->cel) }, /* CEL */
- { 54, &(gregs->ceh) }, /* CEH */
- { 53, &(gregs->sr0) }, /* sr0, i.e. cnt or COUNTER */
- { 52, &(gregs->sr1) }, /* sr1, i.e. lcr or LDCR */
- { 51, &(gregs->sr1) }, /* sr2, i.e. scr or STCR */
-
- /* Exception occured at this address, exactly the PC we want */
- { 49, &(gregs->cp0_epc) }, /* PC */
-
- { 38, &(gregs->cp0_ema) }, /* EMA */
- { 37, &(gregs->cp0_epc) }, /* EPC */
- { 34, &(gregs->cp0_ecr) }, /* ECR */
- { 33, &(gregs->cp0_condition) }, /* COND */
- { 32, &(gregs->cp0_psr) }, /* PSR */
- };
-
- for (regno = 0; regno < sizeof(sregs)/sizeof(sregs[0]); regno++)
- if (regnum == -1 || regnum == sregs[regno].regnum)
- regcache_raw_supply (regcache, sregs[regno].regnum, sregs[regno].buf);
- }
+ {
+ struct sreg {
+ int regnum;
+ void *buf;
+ } sregs [] = {
+ { 55, &(gregs->cel) }, /* CEL */
+ { 54, &(gregs->ceh) }, /* CEH */
+ { 53, &(gregs->sr0) }, /* sr0, i.e. cnt or COUNTER */
+ { 52, &(gregs->sr1) }, /* sr1, i.e. lcr or LDCR */
+ { 51, &(gregs->sr1) }, /* sr2, i.e. scr or STCR */
+
+ /* Exception occured at this address, exactly the PC we want */
+ { 49, &(gregs->cp0_epc) }, /* PC */
+
+ { 38, &(gregs->cp0_ema) }, /* EMA */
+ { 37, &(gregs->cp0_epc) }, /* EPC */
+ { 34, &(gregs->cp0_ecr) }, /* ECR */
+ { 33, &(gregs->cp0_condition) }, /* COND */
+ { 32, &(gregs->cp0_psr) }, /* PSR */
+ };
+
+ for (regno = 0; regno < sizeof(sregs)/sizeof(sregs[0]); regno++)
+ if (regnum == -1 || regnum == sregs[regno].regnum)
+ regcache_raw_supply (regcache,
+ sregs[regno].regnum, sregs[regno].buf);
+ }
}
/* Return the appropriate register set from the core section identified
- by SECT_NAME and SECT_SIZE. */
+ by SECT_NAME and SECT_SIZE. */
static const struct regset *
score7_linux_regset_from_core_section(struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
- struct gdbarch_tdep *tdep;
+ struct gdbarch_tdep *tdep;
- gdb_assert (gdbarch != NULL);
- gdb_assert (sect_name != NULL);
+ gdb_assert (gdbarch != NULL);
+ gdb_assert (sect_name != NULL);
- tdep = gdbarch_tdep (gdbarch);
+ tdep = gdbarch_tdep (gdbarch);
- if (strcmp(sect_name, ".reg") == 0 && sect_size == sizeof(elf_gregset_t))
+ if (strcmp(sect_name, ".reg") == 0 && sect_size == sizeof(elf_gregset_t))
{
- if (tdep->gregset == NULL)
- tdep->gregset = regset_alloc (gdbarch, score7_linux_supply_gregset, NULL);
- return tdep->gregset;
+ if (tdep->gregset == NULL)
+ tdep->gregset = regset_alloc (gdbarch,
+ score7_linux_supply_gregset, NULL);
+ return tdep->gregset;
}
- return NULL;
+ return NULL;
}
static struct gdbarch *
#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_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);
case bfd_mach_score7:
set_gdbarch_breakpoint_from_pc (gdbarch, score7_breakpoint_from_pc);
set_gdbarch_skip_prologue (gdbarch, score7_skip_prologue);
- set_gdbarch_in_function_epilogue_p (gdbarch, score7_in_function_epilogue_p);
+ set_gdbarch_in_function_epilogue_p (gdbarch,
+ score7_in_function_epilogue_p);
set_gdbarch_register_name (gdbarch, score7_register_name);
set_gdbarch_num_regs (gdbarch, SCORE7_NUM_REGS);
- /* Core file support. */
- set_gdbarch_regset_from_core_section (gdbarch, score7_linux_regset_from_core_section);
+ /* Core file support. */
+ set_gdbarch_regset_from_core_section (gdbarch,
+ score7_linux_regset_from_core_section);
break;
case bfd_mach_score3:
set_gdbarch_breakpoint_from_pc (gdbarch, score3_breakpoint_from_pc);
set_gdbarch_skip_prologue (gdbarch, score3_skip_prologue);
- set_gdbarch_in_function_epilogue_p (gdbarch, score3_in_function_epilogue_p);
+ set_gdbarch_in_function_epilogue_p (gdbarch,
+ score3_in_function_epilogue_p);
set_gdbarch_register_name (gdbarch, score3_register_name);
set_gdbarch_num_regs (gdbarch, SCORE3_NUM_REGS);
break;