diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2007-04-28 16:47:00 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2007-04-28 16:47:00 +0000 |
commit | 7a61a01c8945b93ece98a4f420ac188ea4f144bd (patch) | |
tree | 9ce512c296f970e15edd05e330c92acf9c5230d0 /gdb/rs6000-aix-tdep.c | |
parent | d7d4c8debeaced278c18126aa602c1ce62827f05 (diff) | |
download | gdb-7a61a01c8945b93ece98a4f420ac188ea4f144bd.zip gdb-7a61a01c8945b93ece98a4f420ac188ea4f144bd.tar.gz gdb-7a61a01c8945b93ece98a4f420ac188ea4f144bd.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/rs6000-aix-tdep.c')
-rw-r--r-- | gdb/rs6000-aix-tdep.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 6e195a2..ee6b039 100644 --- a/gdb/rs6000-aix-tdep.c +++ b/gdb/rs6000-aix-tdep.c @@ -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); } |