mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
* rs6000-aix-tdep.c: Include "regcache.h", "regset.h", and
"gdb_string.h". (rs6000_aix32_reg_offsets, rs6000_aix64_reg_offsets): New variables. (rs6000_aix_supply_regset, rs6000_aix_collect_regset): New functions. (rs6000_aix32_regset, rs6000_aix64_regset): New variables. (rs6000_aix_regset_from_core_section): New function. (rs6000_aix_init_osabi): Register it. (_initialize_rs6000_aix_tdep): Register GDB_OSABI_AIX osabi and sniffer for bfd_arch_powerpc as well as bfd_arch_rs6000. * rs6000-nat.c (CoreRegs): Do not define type. (fetch_core_registers, rs6000_core_fns): Remove. (_initialize_core_rs6000): Do not register it. Rename to ... (_initialize_rs6000_nat): ... this. * Makefile.in (rs6000-aix-tdep.o): Update dependencies.
This commit is contained in:
parent
d7d4c8debe
commit
7a61a01c89
@ -1,3 +1,20 @@
|
||||
2007-04-28 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* rs6000-aix-tdep.c: Include "regcache.h", "regset.h", and
|
||||
"gdb_string.h".
|
||||
(rs6000_aix32_reg_offsets, rs6000_aix64_reg_offsets): New variables.
|
||||
(rs6000_aix_supply_regset, rs6000_aix_collect_regset): New functions.
|
||||
(rs6000_aix32_regset, rs6000_aix64_regset): New variables.
|
||||
(rs6000_aix_regset_from_core_section): New function.
|
||||
(rs6000_aix_init_osabi): Register it.
|
||||
(_initialize_rs6000_aix_tdep): Register GDB_OSABI_AIX osabi and
|
||||
sniffer for bfd_arch_powerpc as well as bfd_arch_rs6000.
|
||||
* rs6000-nat.c (CoreRegs): Do not define type.
|
||||
(fetch_core_registers, rs6000_core_fns): Remove.
|
||||
(_initialize_core_rs6000): Do not register it. Rename to ...
|
||||
(_initialize_rs6000_nat): ... this.
|
||||
* Makefile.in (rs6000-aix-tdep.o): Update dependencies.
|
||||
|
||||
2007-04-27 Kevin Buettner <kevinb@redhat.com>
|
||||
|
||||
* dwarf2expr.c (unsigned_address_type): Add forward declaration.
|
||||
|
@ -2519,8 +2519,8 @@ rs6000-tdep.o: rs6000-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
|
||||
$(coff_xcoff_h) $(libxcoff_h) $(elf_bfd_h) $(solib_svr4_h) \
|
||||
$(ppc_tdep_h) $(gdb_assert_h) $(dis_asm_h) $(trad_frame_h) \
|
||||
$(frame_unwind_h) $(frame_base_h) $(rs6000_tdep_h) $(dwarf2_frame_h)
|
||||
rs6000-aix-tdep.o: rs6000-aix-tdep.c $(defs_h) $(osabi_h) $(rs6000_tdep_h) \
|
||||
$(ppc_tdep_h)
|
||||
rs6000-aix-tdep.o: rs6000-aix-tdep.c $(defs_h) $(gdb_string_h) $(osabi_h) \
|
||||
$(regcache_h) $(regset_h) $(rs6000_tdep_h) $(ppc_tdep_h)
|
||||
s390-nat.o: s390-nat.c $(defs_h) $(regcache_h) $(inferior_h) \
|
||||
$(s390_tdep_h) $(target_h) $(linux_nat_h)
|
||||
s390-tdep.o: s390-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) $(inferior_h) \
|
||||
|
@ -22,10 +22,130 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "gdb_string.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "regset.h"
|
||||
#include "rs6000-tdep.h"
|
||||
#include "ppc-tdep.h"
|
||||
|
||||
|
||||
/* Core file support. */
|
||||
|
||||
static struct ppc_reg_offsets rs6000_aix32_reg_offsets =
|
||||
{
|
||||
/* General-purpose registers. */
|
||||
208, /* r0_offset */
|
||||
24, /* pc_offset */
|
||||
28, /* ps_offset */
|
||||
32, /* cr_offset */
|
||||
36, /* lr_offset */
|
||||
40, /* ctr_offset */
|
||||
44, /* xer_offset */
|
||||
48, /* mq_offset */
|
||||
|
||||
/* Floating-point registers. */
|
||||
336, /* f0_offset */
|
||||
56, /* fpscr_offset */
|
||||
|
||||
/* AltiVec registers. */
|
||||
-1, /* vr0_offset */
|
||||
-1, /* vscr_offset */
|
||||
-1 /* vrsave_offset */
|
||||
};
|
||||
|
||||
static struct ppc_reg_offsets rs6000_aix64_reg_offsets =
|
||||
{
|
||||
/* General-purpose registers. */
|
||||
0, /* r0_offset */
|
||||
264, /* pc_offset */
|
||||
256, /* ps_offset */
|
||||
288, /* cr_offset */
|
||||
272, /* lr_offset */
|
||||
280, /* ctr_offset */
|
||||
292, /* xer_offset */
|
||||
-1, /* mq_offset */
|
||||
|
||||
/* Floating-point registers. */
|
||||
312, /* f0_offset */
|
||||
296, /* fpscr_offset */
|
||||
|
||||
/* AltiVec registers. */
|
||||
-1, /* vr0_offset */
|
||||
-1, /* vscr_offset */
|
||||
-1 /* vrsave_offset */
|
||||
};
|
||||
|
||||
|
||||
/* Supply register REGNUM in the general-purpose register set REGSET
|
||||
from the buffer specified by GREGS and LEN to register cache
|
||||
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
|
||||
|
||||
static void
|
||||
rs6000_aix_supply_regset (const struct regset *regset,
|
||||
struct regcache *regcache, int regnum,
|
||||
const void *gregs, size_t len)
|
||||
{
|
||||
ppc_supply_gregset (regset, regcache, regnum, gregs, len);
|
||||
|
||||
if (ppc_floating_point_unit_p (get_regcache_arch (regcache)))
|
||||
ppc_supply_fpregset (regset, regcache, regnum, gregs, len);
|
||||
}
|
||||
|
||||
/* Collect register REGNUM in the general-purpose register set
|
||||
REGSET. from register cache REGCACHE into the buffer specified by
|
||||
GREGS and LEN. If REGNUM is -1, do this for all registers in
|
||||
REGSET. */
|
||||
|
||||
static void
|
||||
rs6000_aix_collect_regset (const struct regset *regset,
|
||||
const struct regcache *regcache, int regnum,
|
||||
void *gregs, size_t len)
|
||||
{
|
||||
ppc_collect_gregset (regset, regcache, regnum, gregs, len);
|
||||
|
||||
if (ppc_floating_point_unit_p (get_regcache_arch (regcache)))
|
||||
ppc_collect_fpregset (regset, regcache, regnum, gregs, len);
|
||||
}
|
||||
|
||||
/* AIX register set. */
|
||||
|
||||
static struct regset rs6000_aix32_regset =
|
||||
{
|
||||
&rs6000_aix32_reg_offsets,
|
||||
rs6000_aix_supply_regset,
|
||||
rs6000_aix_collect_regset,
|
||||
};
|
||||
|
||||
static struct regset rs6000_aix64_regset =
|
||||
{
|
||||
&rs6000_aix64_reg_offsets,
|
||||
rs6000_aix_supply_regset,
|
||||
rs6000_aix_collect_regset,
|
||||
};
|
||||
|
||||
/* Return the appropriate register set for the core section identified
|
||||
by SECT_NAME and SECT_SIZE. */
|
||||
|
||||
static const struct regset *
|
||||
rs6000_aix_regset_from_core_section (struct gdbarch *gdbarch,
|
||||
const char *sect_name, size_t sect_size)
|
||||
{
|
||||
if (gdbarch_tdep (gdbarch)->wordsize == 4)
|
||||
{
|
||||
if (strcmp (sect_name, ".reg") == 0 && sect_size >= 592)
|
||||
return &rs6000_aix32_regset;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp (sect_name, ".reg") == 0 && sect_size >= 576)
|
||||
return &rs6000_aix64_regset;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static enum gdb_osabi
|
||||
rs6000_aix_osabi_sniffer (bfd *abfd)
|
||||
{
|
||||
@ -42,6 +162,10 @@ rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
/* RS6000/AIX does not support PT_STEP. Has to be simulated. */
|
||||
set_gdbarch_software_single_step (gdbarch, rs6000_software_single_step);
|
||||
|
||||
/* Core file support. */
|
||||
set_gdbarch_regset_from_core_section
|
||||
(gdbarch, rs6000_aix_regset_from_core_section);
|
||||
|
||||
/* Minimum possible text address in AIX. */
|
||||
gdbarch_tdep (gdbarch)->text_segment_base = 0x10000000;
|
||||
}
|
||||
@ -52,8 +176,13 @@ _initialize_rs6000_aix_tdep (void)
|
||||
gdbarch_register_osabi_sniffer (bfd_arch_rs6000,
|
||||
bfd_target_xcoff_flavour,
|
||||
rs6000_aix_osabi_sniffer);
|
||||
gdbarch_register_osabi_sniffer (bfd_arch_powerpc,
|
||||
bfd_target_xcoff_flavour,
|
||||
rs6000_aix_osabi_sniffer);
|
||||
|
||||
gdbarch_register_osabi (bfd_arch_rs6000, 0, GDB_OSABI_AIX,
|
||||
rs6000_aix_init_osabi);
|
||||
gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_AIX,
|
||||
rs6000_aix_init_osabi);
|
||||
}
|
||||
|
||||
|
108
gdb/rs6000-nat.c
108
gdb/rs6000-nat.c
@ -79,17 +79,6 @@
|
||||
# define ARCH64() (register_size (current_gdbarch, 0) == 8)
|
||||
#endif
|
||||
|
||||
/* Union of 32-bit and 64-bit ".reg" core file sections. */
|
||||
|
||||
typedef union {
|
||||
#ifdef ARCH3264
|
||||
struct __context64 r64;
|
||||
#else
|
||||
struct mstsave r64;
|
||||
#endif
|
||||
struct mstsave r32;
|
||||
} CoreRegs;
|
||||
|
||||
/* Union of 32-bit and 64-bit versions of ld_info. */
|
||||
|
||||
typedef union {
|
||||
@ -142,8 +131,6 @@ static int objfile_symbol_add (void *);
|
||||
|
||||
static void vmap_symtab (struct vmap *);
|
||||
|
||||
static void fetch_core_registers (char *, unsigned int, int, CORE_ADDR);
|
||||
|
||||
static void exec_one_dummy_insn (void);
|
||||
|
||||
extern void fixup_breakpoints (CORE_ADDR low, CORE_ADDR high, CORE_ADDR delta);
|
||||
@ -624,87 +611,6 @@ exec_one_dummy_insn (void)
|
||||
write_pc (prev_pc);
|
||||
deprecated_remove_raw_breakpoint (bp);
|
||||
}
|
||||
|
||||
/* Fetch registers from the register section in core bfd. */
|
||||
|
||||
static void
|
||||
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
|
||||
int which, CORE_ADDR reg_addr)
|
||||
{
|
||||
CoreRegs *regs;
|
||||
int regi;
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
|
||||
|
||||
if (which != 0)
|
||||
{
|
||||
fprintf_unfiltered
|
||||
(gdb_stderr,
|
||||
"Gdb error: unknown parameter to fetch_core_registers().\n");
|
||||
return;
|
||||
}
|
||||
|
||||
regs = (CoreRegs *) core_reg_sect;
|
||||
|
||||
/* Put the register values from the core file section in the regcache. */
|
||||
|
||||
if (ARCH64 ())
|
||||
{
|
||||
for (regi = 0; regi < ppc_num_gprs; regi++)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_gp0_regnum + regi,
|
||||
(char *) ®s->r64.gpr[regi]);
|
||||
|
||||
if (tdep->ppc_fp0_regnum >= 0)
|
||||
for (regi = 0; regi < ppc_num_fprs; regi++)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_fp0_regnum + regi,
|
||||
(char *) ®s->r64.fpr[regi]);
|
||||
|
||||
regcache_raw_supply (current_regcache, PC_REGNUM,
|
||||
(char *) ®s->r64.iar);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_ps_regnum,
|
||||
(char *) ®s->r64.msr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_cr_regnum,
|
||||
(char *) ®s->r64.cr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_lr_regnum,
|
||||
(char *) ®s->r64.lr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_ctr_regnum,
|
||||
(char *) ®s->r64.ctr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_xer_regnum,
|
||||
(char *) ®s->r64.xer);
|
||||
if (tdep->ppc_fpscr_regnum >= 0)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_fpscr_regnum,
|
||||
(char *) ®s->r64.fpscr);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (regi = 0; regi < ppc_num_gprs; regi++)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_gp0_regnum + regi,
|
||||
(char *) ®s->r32.gpr[regi]);
|
||||
|
||||
if (tdep->ppc_fp0_regnum >= 0)
|
||||
for (regi = 0; regi < ppc_num_fprs; regi++)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_fp0_regnum + regi,
|
||||
(char *) ®s->r32.fpr[regi]);
|
||||
|
||||
regcache_raw_supply (current_regcache, PC_REGNUM,
|
||||
(char *) ®s->r32.iar);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_ps_regnum,
|
||||
(char *) ®s->r32.msr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_cr_regnum,
|
||||
(char *) ®s->r32.cr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_lr_regnum,
|
||||
(char *) ®s->r32.lr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_ctr_regnum,
|
||||
(char *) ®s->r32.ctr);
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_xer_regnum,
|
||||
(char *) ®s->r32.xer);
|
||||
if (tdep->ppc_fpscr_regnum >= 0)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_fpscr_regnum,
|
||||
(char *) ®s->r32.fpscr);
|
||||
if (tdep->ppc_mq_regnum >= 0)
|
||||
regcache_raw_supply (current_regcache, tdep->ppc_mq_regnum,
|
||||
(char *) ®s->r32.mq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Copy information about text and data sections from LDI to VP for a 64-bit
|
||||
@ -1291,19 +1197,9 @@ find_toc_address (CORE_ADDR pc)
|
||||
error (_("Unable to find TOC entry for pc %s."), hex_string (pc));
|
||||
}
|
||||
|
||||
/* Register that we are able to handle rs6000 core file formats. */
|
||||
|
||||
static struct core_fns rs6000_core_fns =
|
||||
{
|
||||
bfd_target_xcoff_flavour, /* core_flavour */
|
||||
default_check_format, /* check_format */
|
||||
default_core_sniffer, /* core_sniffer */
|
||||
fetch_core_registers, /* core_read_registers */
|
||||
NULL /* next */
|
||||
};
|
||||
|
||||
void
|
||||
_initialize_core_rs6000 (void)
|
||||
_initialize_rs6000_nat (void)
|
||||
{
|
||||
struct target_ops *t;
|
||||
|
||||
@ -1322,6 +1218,4 @@ _initialize_core_rs6000 (void)
|
||||
/* Initialize hook in rs6000-tdep.c for determining the TOC address
|
||||
when calling functions in the inferior. */
|
||||
rs6000_find_toc_address_hook = find_toc_address;
|
||||
|
||||
deprecated_add_core_fns (&rs6000_core_fns);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user