X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Frs6000-nat.c;h=38944c0f727aab6c32465f49c3fb967c38c6edf7;hb=20d430180173f00e57c7a920d41d08e6d9227fce;hp=8fac1d847a12aee646cda8beed935922c369312d;hpb=fb494327894be28eab9f84a977c3c45acced545e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 8fac1d847a..38944c0f72 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -1,5 +1,6 @@ /* IBM RS/6000 native-dependent code for GDB, the GNU debugger. - Copyright 1986, 1987, 1989, 1991, 1992, 1994 Free Software Foundation, Inc. + Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996 + Free Software Foundation, Inc. This file is part of GDB. @@ -15,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "inferior.h" @@ -40,7 +41,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include -#include +#include "gdb_stat.h" #include #include @@ -50,6 +51,24 @@ extern struct vmap * map_vmap PARAMS ((bfd *bf, bfd *arch)); extern struct target_ops exec_ops; +static void +vmap_exec PARAMS ((void)); + +static void +vmap_ldinfo PARAMS ((struct ld_info *)); + +static struct vmap * +add_vmap PARAMS ((struct ld_info *)); + +static int +objfile_symbol_add PARAMS ((char *)); + +static void +vmap_symtab PARAMS ((struct vmap *)); + +static void +fetch_core_registers PARAMS ((char *, unsigned int, int, CORE_ADDR)); + static void exec_one_dummy_insn PARAMS ((void)); @@ -230,6 +249,7 @@ exec_one_dummy_insn () char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */ unsigned int status, pid; + CORE_ADDR prev_pc; /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We assume that this address will never be executed again by the real code. */ @@ -237,7 +257,16 @@ exec_one_dummy_insn () target_insert_breakpoint (DUMMY_INSN_ADDR, shadow_contents); errno = 0; - ptrace (PT_CONTINUE, inferior_pid, (PTRACE_ARG3_TYPE) DUMMY_INSN_ADDR, 0, 0); + + /* You might think this could be done with a single ptrace call, and + you'd be correct for just about every platform I've ever worked + on. However, rs6000-ibm-aix4.1.3 seems to have screwed this up -- + the inferior never hits the breakpoint (it's also worth noting + powerpc-ibm-aix4.1.3 works correctly). */ + prev_pc = read_pc (); + write_pc (DUMMY_INSN_ADDR); + ptrace (PT_CONTINUE, inferior_pid, (PTRACE_ARG3_TYPE)1, 0, 0); + if (errno) perror ("pt_continue"); @@ -245,15 +274,16 @@ exec_one_dummy_insn () pid = wait (&status); } while (pid != inferior_pid); + write_pc (prev_pc); target_remove_breakpoint (DUMMY_INSN_ADDR, shadow_contents); } -void +static void fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) char *core_reg_sect; unsigned core_reg_size; int which; - unsigned int reg_addr; /* Unused in this version */ + CORE_ADDR reg_addr; /* Unused in this version */ { /* fetch GPRs and special registers from the first register section in core bfd. */ @@ -390,7 +420,7 @@ add_vmap (ldi) bfd_close (abfd); /* FIXME -- should be error */ warning ("\"%s\": member \"%s\" missing.", abfd->filename, mem); - return; + return 0; } if (!bfd_check_format(last, bfd_object)) @@ -435,7 +465,7 @@ vmap_ldinfo (ldi) struct stat ii, vi; register struct vmap *vp; int got_one, retried; - int got_exec_file; + int got_exec_file = 0; /* For each *ldi, see if we have a corresponding *vp. If so, update the mapping, and symbol table. @@ -500,6 +530,16 @@ vmap_ldinfo (ldi) if (vp->objfile == NULL) got_exec_file = 1; +#ifdef DONT_RELOCATE_SYMFILE_OBJFILE + if (vp->objfile == symfile_objfile + || vp->objfile == NULL) + { + ldi->ldinfo_dataorg = 0; + vp->dstart = (CORE_ADDR) 0; + vp->dend = ldi->ldinfo_datasize; + } +#endif + /* relocate symbol table(s). */ vmap_symtab (vp); @@ -707,6 +747,14 @@ xcoff_relocate_core (target) vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg; vp->dend = vp->dstart + ldip->ldinfo_datasize; +#ifdef DONT_RELOCATE_SYMFILE_OBJFILE + if (vp == vmap) + { + vp->dstart = (CORE_ADDR) 0; + vp->dend = ldip->ldinfo_datasize; + } +#endif + if (vp->tadj != 0) { vp->tstart += vp->tadj; @@ -719,6 +767,11 @@ xcoff_relocate_core (target) { int count; struct section_table *stp; + int update_coreops; + + /* We must update the to_sections field in the core_ops structure + now to avoid dangling pointer dereferences. */ + update_coreops = core_ops.to_sections == target->to_sections; count = target->to_sections_end - target->to_sections; count += 2; @@ -726,6 +779,14 @@ xcoff_relocate_core (target) xrealloc (target->to_sections, sizeof (struct section_table) * count); target->to_sections_end = target->to_sections + count; + + /* Update the to_sections field in the core_ops structure + if needed. */ + if (update_coreops) + { + core_ops.to_sections = target->to_sections; + core_ops.to_sections_end = target->to_sections_end; + } stp = target->to_sections_end - 2; /* "Why do we add bfd_section_vma?", I hear you cry. @@ -755,3 +816,29 @@ xcoff_relocate_core (target) breakpoint_re_set (); do_cleanups (old); } + +int +kernel_u_size () +{ + return (sizeof (struct user)); +} + + +/* Register that we are able to handle rs6000 core file formats. */ + +static struct core_fns rs6000_core_fns = +{ + bfd_target_coff_flavour, + fetch_core_registers, + NULL +}; + +void +_initialize_core_rs6000 () +{ + /* For native configurations, where this module is included, inform + the xcoffsolib module where it can find the function for symbol table + relocation at runtime. */ + xcoff_relocate_symtab_hook = &xcoff_relocate_symtab; + add_core_fns (&rs6000_core_fns); +}