From 7a61a01c8945b93ece98a4f420ac188ea4f144bd Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Sat, 28 Apr 2007 16:47:00 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 17 ++++++ gdb/Makefile.in | 4 +- gdb/rs6000-aix-tdep.c | 129 ++++++++++++++++++++++++++++++++++++++++++ gdb/rs6000-nat.c | 108 +---------------------------------- 4 files changed, 149 insertions(+), 109 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8799fa602a5..d30267b1253 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2007-04-28 Ulrich Weigand + + * 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 * dwarf2expr.c (unsigned_address_type): Add forward declaration. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index d17cd840b71..92ca08bb2e2 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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) \ diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 6e195a23eed..ee6b03962d6 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); } diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 1281da22fce..dca083020c6 100644 --- a/gdb/rs6000-nat.c +++ b/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); }