/* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
- Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995
+ Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996
Free Software Foundation, Inc.
This file is part of GDB.
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));
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. */
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");
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. */
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))
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.
breakpoint_re_set ();
do_cleanups (old);
}
+
+int
+kernel_u_size ()
+{
+ return (sizeof (struct user));
+}
+
+\f
+/* 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);
+}