mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-27 22:10:32 +00:00
2004-11-12 Kei Sakamoto <sakamoto.kei@renesas.com>
* Makefile.in (m32r-linux-tdep.o): Update dependencies. * m32r-linux-tdep.c (m32r_linux_init_abi): Call set_gdbarch_regset_from_core_section for core file support. (m32r_linux_supply_gregset, m32r_linux_regset_from_core_section): New functions.
This commit is contained in:
parent
a71f8c301e
commit
9b098f24af
@ -1,3 +1,11 @@
|
||||
2004-11-12 Kei Sakamoto <sakamoto.kei@renesas.com>
|
||||
|
||||
* Makefile.in (m32r-linux-tdep.o): Update dependencies.
|
||||
* m32r-linux-tdep.c (m32r_linux_init_abi): Call
|
||||
set_gdbarch_regset_from_core_section for core file support.
|
||||
(m32r_linux_supply_gregset, m32r_linux_regset_from_core_section):
|
||||
New functions.
|
||||
|
||||
2004-11-11 Randolph Chung <tausq@debian.org>
|
||||
|
||||
* hppa-tdep.c (skip_prologue_hard_way): Make static, add
|
||||
|
@ -2157,7 +2157,7 @@ m32r-linux-nat.o: m32r-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
|
||||
m32r-linux-tdep.o: m32r-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
|
||||
$(value_h) $(regcache_h) $(inferior_h) $(osabi_h) $(reggroups_h) \
|
||||
$(gdb_string_h) $(glibc_tdep_h) $(solib_svr4_h) $(trad_frame_h) \
|
||||
$(frame_unwind_h) $(m32r_tdep_h)
|
||||
$(frame_unwind_h) $(regset_h) $(m32r_tdep_h)
|
||||
m32r-rom.o: m32r-rom.c $(defs_h) $(gdbcore_h) $(target_h) $(monitor_h) \
|
||||
$(serial_h) $(symtab_h) $(command_h) $(gdbcmd_h) $(symfile_h) \
|
||||
$(gdb_string_h) $(objfiles_h) $(inferior_h) $(regcache_h)
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "inferior.h"
|
||||
#include "osabi.h"
|
||||
#include "reggroups.h"
|
||||
#include "regset.h"
|
||||
|
||||
#include "gdb_string.h"
|
||||
|
||||
@ -309,6 +310,97 @@ m32r_linux_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Mapping between the registers in `struct pt_regs'
|
||||
format and GDB's register array layout. */
|
||||
|
||||
static int m32r_pt_regs_offset[] = {
|
||||
4 * 4, /* r0 */
|
||||
4 * 5, /* r1 */
|
||||
4 * 6, /* r2 */
|
||||
4 * 7, /* r3 */
|
||||
4 * 0, /* r4 */
|
||||
4 * 1, /* r5 */
|
||||
4 * 2, /* r6 */
|
||||
4 * 8, /* r7 */
|
||||
4 * 9, /* r8 */
|
||||
4 * 10, /* r9 */
|
||||
4 * 11, /* r10 */
|
||||
4 * 12, /* r11 */
|
||||
4 * 13, /* r12 */
|
||||
4 * 24, /* fp */
|
||||
4 * 25, /* lr */
|
||||
4 * 23, /* sp */
|
||||
4 * 19, /* psw */
|
||||
4 * 19, /* cbr */
|
||||
4 * 26, /* spi */
|
||||
4 * 23, /* spu */
|
||||
4 * 22, /* bpc */
|
||||
4 * 20, /* pc */
|
||||
4 * 16, /* accl */
|
||||
4 * 15 /* acch */
|
||||
};
|
||||
|
||||
#define PSW_OFFSET (4 * 19)
|
||||
#define BBPSW_OFFSET (4 * 21)
|
||||
#define SPU_OFFSET (4 * 23)
|
||||
#define SPI_OFFSET (4 * 26)
|
||||
|
||||
static void
|
||||
m32r_linux_supply_gregset (const struct regset *regset,
|
||||
struct regcache *regcache, int regnum,
|
||||
const void *gregs, size_t size)
|
||||
{
|
||||
const char *regs = gregs;
|
||||
unsigned long psw, bbpsw;
|
||||
int i;
|
||||
|
||||
psw = *((unsigned long *) (regs + PSW_OFFSET));
|
||||
bbpsw = *((unsigned long *) (regs + BBPSW_OFFSET));
|
||||
|
||||
for (i = 0; i < sizeof (m32r_pt_regs_offset) / 4; i++)
|
||||
{
|
||||
if (regnum != -1 && regnum != i)
|
||||
continue;
|
||||
|
||||
switch (i)
|
||||
{
|
||||
case PSW_REGNUM:
|
||||
*((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
|
||||
((0x00c1 & bbpsw) << 8) | ((0xc100 & psw) >> 8);
|
||||
break;
|
||||
case CBR_REGNUM:
|
||||
*((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
|
||||
((psw >> 8) & 1);
|
||||
break;
|
||||
case M32R_SP_REGNUM:
|
||||
if (psw & 0x8000)
|
||||
*((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
|
||||
*((unsigned long *) (regs + SPU_OFFSET));
|
||||
else
|
||||
*((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
|
||||
*((unsigned long *) (regs + SPI_OFFSET));
|
||||
break;
|
||||
}
|
||||
|
||||
regcache_raw_supply (current_regcache, i,
|
||||
regs + m32r_pt_regs_offset[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static struct regset m32r_linux_gregset = {
|
||||
NULL, m32r_linux_supply_gregset
|
||||
};
|
||||
|
||||
static const struct regset *
|
||||
m32r_linux_regset_from_core_section (struct gdbarch *core_arch,
|
||||
const char *sect_name, size_t sect_size)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (core_arch);
|
||||
if (strcmp (sect_name, ".reg") == 0)
|
||||
return &m32r_linux_gregset;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
m32r_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
@ -323,6 +415,10 @@ m32r_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
|
||||
/* Core file support. */
|
||||
set_gdbarch_regset_from_core_section
|
||||
(gdbarch, m32r_linux_regset_from_core_section);
|
||||
}
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
|
Loading…
Reference in New Issue
Block a user