mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-01 03:41:58 +08:00
SCORE: Fill 'collect_regset' in regset structure.
Also rewrite the 'supply_regset' method, making it platform independent. To avoid code duplication, move the logic for both to a register map in regcache_map_entry format.
This commit is contained in:

committed by
Ulrich Weigand

parent
81580573ba
commit
c5741217d3
@ -1,3 +1,18 @@
|
|||||||
|
2014-08-07 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* score-tdep.c (score7_linux_supply_gregset): Reduce to small stub
|
||||||
|
that calls regcache_supply_regset and handles the EPC register
|
||||||
|
separately. Move main logic to...
|
||||||
|
(score7_linux_gregmap): ... this new register map.
|
||||||
|
(SCORE7_LINUX_SIZEOF_GREGSET, SCORE7_LINUX_EPC_OFFSET): New macros.
|
||||||
|
(score7_linux_gregset): Refer to register map. Add collect method.
|
||||||
|
(score7_linux_regset_from_core_section): Replace
|
||||||
|
sizeof elf_gregset_t by SCORE7_LINUX_SIZEOF_GREGSET.
|
||||||
|
* score-tdep.h (enum gdb_regnum): New enum value SCORE_EPC_REGNUM.
|
||||||
|
(struct regset): Delete unused forward declaraction.
|
||||||
|
(struct pt_regs): Delete structure definition.
|
||||||
|
(elf_gregset_t): Delete typedef.
|
||||||
|
|
||||||
2014-08-07 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
2014-08-07 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* nios2-linux-tdep.c (nios2_collect_gregset): New function.
|
* nios2-linux-tdep.c (nios2_collect_gregset): New function.
|
||||||
|
@ -1397,59 +1397,52 @@ score_prologue_frame_base_sniffer (struct frame_info *this_frame)
|
|||||||
return &score_prologue_frame_base;
|
return &score_prologue_frame_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Core file support (dirty hack)
|
/* Core file support. */
|
||||||
|
|
||||||
The core file MUST be generated by GNU/Linux on S+core. */
|
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
|
static void
|
||||||
score7_linux_supply_gregset(const struct regset *regset,
|
score7_linux_supply_gregset(const struct regset *regset,
|
||||||
struct regcache *regcache,
|
struct regcache *regcache,
|
||||||
int regnum, const void *gregs_buf, size_t len)
|
int regnum, const void *buf,
|
||||||
|
size_t size)
|
||||||
{
|
{
|
||||||
int regno;
|
regcache_supply_regset (regset, regcache, regnum, buf, size);
|
||||||
elf_gregset_t *gregs;
|
|
||||||
|
|
||||||
gdb_assert (regset != NULL);
|
/* Supply the EPC from the same slot as the PC. Note that the
|
||||||
gdb_assert ((regcache != NULL) && (gregs_buf != NULL));
|
collect function will store the PC in that slot. */
|
||||||
|
if ((regnum == -1 || regnum == SCORE_EPC_REGNUM)
|
||||||
gregs = (elf_gregset_t *) gregs_buf;
|
&& size >= SCORE7_LINUX_EPC_OFFSET + 4)
|
||||||
|
regcache_raw_supply (regcache, SCORE_EPC_REGNUM,
|
||||||
for (regno = 0; regno < 32; regno++)
|
(const gdb_byte *) buf
|
||||||
if (regnum == -1 || regnum == regno)
|
+ SCORE7_LINUX_EPC_OFFSET);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct regset score7_linux_gregset =
|
static const struct regset score7_linux_gregset =
|
||||||
{
|
{
|
||||||
NULL,
|
score7_linux_gregmap,
|
||||||
score7_linux_supply_gregset, NULL
|
score7_linux_supply_gregset,
|
||||||
|
regcache_collect_regset
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Return the appropriate register set from the core section identified
|
/* Return the appropriate register set from the core section identified
|
||||||
@ -1462,7 +1455,8 @@ score7_linux_regset_from_core_section(struct gdbarch *gdbarch,
|
|||||||
gdb_assert (gdbarch != NULL);
|
gdb_assert (gdbarch != NULL);
|
||||||
gdb_assert (sect_name != NULL);
|
gdb_assert (sect_name != NULL);
|
||||||
|
|
||||||
if (strcmp(sect_name, ".reg") == 0 && sect_size == sizeof(elf_gregset_t))
|
if (strcmp(sect_name, ".reg") == 0
|
||||||
|
&& sect_size == SCORE7_LINUX_SIZEOF_GREGSET)
|
||||||
return &score7_linux_gregset;
|
return &score7_linux_gregset;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -32,6 +32,7 @@ enum gdb_regnum
|
|||||||
SCORE_RA_REGNUM = 3,
|
SCORE_RA_REGNUM = 3,
|
||||||
SCORE_A0_REGNUM = 4,
|
SCORE_A0_REGNUM = 4,
|
||||||
SCORE_AL_REGNUM = 7,
|
SCORE_AL_REGNUM = 7,
|
||||||
|
SCORE_EPC_REGNUM = 37,
|
||||||
SCORE_PC_REGNUM = 49,
|
SCORE_PC_REGNUM = 49,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -46,37 +47,4 @@ enum gdb_regnum
|
|||||||
#define SCORE_INSTLEN 4
|
#define SCORE_INSTLEN 4
|
||||||
#define SCORE16_INSTLEN 2
|
#define SCORE16_INSTLEN 2
|
||||||
|
|
||||||
/* Forward declarations. */
|
|
||||||
struct regset;
|
|
||||||
|
|
||||||
/* Linux Core file support (dirty hack)
|
|
||||||
|
|
||||||
S+core Linux register set definition, copy from S+core Linux. */
|
|
||||||
struct pt_regs {
|
|
||||||
/* Pad bytes for argument save space on the stack. */
|
|
||||||
unsigned long pad0[6]; /* may be 4, MIPS accept 6var, SCore
|
|
||||||
accepts 4 Var--yuchen */
|
|
||||||
|
|
||||||
/* Saved main processor registers. */
|
|
||||||
unsigned long orig_r4;
|
|
||||||
unsigned long regs[32];
|
|
||||||
|
|
||||||
/* Other saved registers. */
|
|
||||||
unsigned long cel;
|
|
||||||
unsigned long ceh;
|
|
||||||
|
|
||||||
unsigned long sr0; /*cnt*/
|
|
||||||
unsigned long sr1; /*lcr*/
|
|
||||||
unsigned long sr2; /*scr*/
|
|
||||||
|
|
||||||
/* saved cp0 registers */
|
|
||||||
unsigned long cp0_epc;
|
|
||||||
unsigned long cp0_ema;
|
|
||||||
unsigned long cp0_psr;
|
|
||||||
unsigned long cp0_ecr;
|
|
||||||
unsigned long cp0_condition;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct pt_regs elf_gregset_t;
|
|
||||||
|
|
||||||
#endif /* SCORE_TDEP_H */
|
#endif /* SCORE_TDEP_H */
|
||||||
|
Reference in New Issue
Block a user