summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2006-08-24 02:43:20 +0000
committermarcel <marcel@FreeBSD.org>2006-08-24 02:43:20 +0000
commitf820e4f79e7a97d1ce74e636fe0cc10bfefcc5aa (patch)
tree30f6e261cda1ad63a0c81571ff080faa11940d66 /contrib
parented7e5304507293a5c815101bfd9a147fd7d25f71 (diff)
parente1ca5f48d2ca1e292b0e281bfc6249875436f141 (diff)
downloadFreeBSD-src-f820e4f79e7a97d1ce74e636fe0cc10bfefcc5aa.zip
FreeBSD-src-f820e4f79e7a97d1ce74e636fe0cc10bfefcc5aa.tar.gz
This commit was generated by cvs2svn to compensate for changes in r161561,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/gdb/gdb/config/powerpc/fbsd.mh5
-rw-r--r--contrib/gdb/gdb/config/powerpc/fbsd.mt4
-rw-r--r--contrib/gdb/gdb/config/powerpc/nm-fbsd.h18
-rw-r--r--contrib/gdb/gdb/ppcfbsd-nat.c157
-rw-r--r--contrib/gdb/gdb/ppcfbsd-tdep.c291
-rw-r--r--contrib/gdb/gdb/ppcfbsd-tdep.h30
6 files changed, 505 insertions, 0 deletions
diff --git a/contrib/gdb/gdb/config/powerpc/fbsd.mh b/contrib/gdb/gdb/config/powerpc/fbsd.mh
new file mode 100644
index 0000000..104aff3
--- /dev/null
+++ b/contrib/gdb/gdb/config/powerpc/fbsd.mh
@@ -0,0 +1,5 @@
+# Host: FreeBSD/powerpc
+NATDEPFILES= fbsd-proc.o fork-child.o gcore.o \
+ infptrace.o inftarg.o ppcfbsd-nat.o
+
+NAT_FILE= nm-fbsd.h
diff --git a/contrib/gdb/gdb/config/powerpc/fbsd.mt b/contrib/gdb/gdb/config/powerpc/fbsd.mt
new file mode 100644
index 0000000..856793b
--- /dev/null
+++ b/contrib/gdb/gdb/config/powerpc/fbsd.mt
@@ -0,0 +1,4 @@
+# Target: FreeBSD/powerpc
+TDEPFILES= rs6000-tdep.o ppc-sysv-tdep.o ppcfbsd-tdep.o \
+ corelow.o solib.o solib-svr4.o
+TM_FILE= tm-ppc-eabi.h
diff --git a/contrib/gdb/gdb/config/powerpc/nm-fbsd.h b/contrib/gdb/gdb/config/powerpc/nm-fbsd.h
new file mode 100644
index 0000000..10b6823
--- /dev/null
+++ b/contrib/gdb/gdb/config/powerpc/nm-fbsd.h
@@ -0,0 +1,18 @@
+/* GNU GPL */
+
+#ifndef NM_FBSD_H
+#define NM_FBSD_H
+
+/* Type of the third argument to the `ptrace' system call. */
+#define PTRACE_ARG3_TYPE caddr_t
+
+/* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */
+#define FETCH_INFERIOR_REGISTERS
+
+/* We can attach and detach. */
+#define ATTACH_DETACH
+
+/* Override child_pid_to_exec_file in 'inftarg.c'. */
+#define CHILD_PID_TO_EXEC_FILE
+
+#endif /* NM_FBSD_H */
diff --git a/contrib/gdb/gdb/ppcfbsd-nat.c b/contrib/gdb/gdb/ppcfbsd-nat.c
new file mode 100644
index 0000000..660a0ed
--- /dev/null
+++ b/contrib/gdb/gdb/ppcfbsd-nat.c
@@ -0,0 +1,157 @@
+/* Native-dependent code for PowerPC's running FreeBSD, for GDB.
+ Copyright 2002, 2004 Free Software Foundation, Inc.
+ Contributed by Wasabi Systems, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#include <machine/reg.h>
+#include <machine/frame.h>
+
+#include "defs.h"
+#include "inferior.h"
+#include "gdb_assert.h"
+#include "gdbcore.h"
+#include "regcache.h"
+
+#include "ppc-tdep.h"
+#include "ppcfbsd-tdep.h"
+
+/* Returns true if PT_GETREGS fetches this register. */
+static int
+getregs_supplies (int regno)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+ return ((regno >= tdep->ppc_gp0_regnum && regno <= tdep->ppc_gplast_regnum)
+ || regno == tdep->ppc_lr_regnum
+ || regno == tdep->ppc_cr_regnum
+ || regno == tdep->ppc_xer_regnum
+ || regno == tdep->ppc_ctr_regnum
+ || regno == PC_REGNUM);
+}
+
+/* Like above, but for PT_GETFPREGS. */
+static int
+getfpregs_supplies (int regno)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+ /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
+ point registers. Traditionally, GDB's register set has still
+ listed the floating point registers for such machines, so this
+ code is harmless. However, the new E500 port actually omits the
+ floating point registers entirely from the register set --- they
+ don't even have register numbers assigned to them.
+
+ It's not clear to me how best to update this code, so this assert
+ will alert the first person to encounter the NetBSD/E500
+ combination to the problem. */
+ gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
+
+ return ((regno >= FP0_REGNUM && regno <= FPLAST_REGNUM)
+ || regno == tdep->ppc_fpscr_regnum);
+}
+
+void
+fetch_inferior_registers (int regno)
+{
+ if (regno == -1 || getregs_supplies (regno))
+ {
+ struct reg regs;
+
+ if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &regs, 0) == -1)
+ perror_with_name (_("Couldn't get registers"));
+
+ ppcfbsd_supply_reg ((char *) &regs, regno);
+ if (regno != -1)
+ return;
+ }
+
+ if (regno == -1 || getfpregs_supplies (regno))
+ {
+ struct fpreg fpregs;
+
+ if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
+ perror_with_name (_("Couldn't get FP registers"));
+
+ ppcfbsd_supply_fpreg ((char *) &fpregs, regno);
+ if (regno != -1)
+ return;
+ }
+}
+
+void
+store_inferior_registers (int regno)
+{
+ if (regno == -1 || getregs_supplies (regno))
+ {
+ struct reg regs;
+
+ if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &regs, 0) == -1)
+ perror_with_name (_("Couldn't get registers"));
+
+ ppcfbsd_fill_reg ((char *) &regs, regno);
+
+ if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &regs, 0) == -1)
+ perror_with_name (_("Couldn't write registers"));
+
+ if (regno != -1)
+ return;
+ }
+
+ if (regno == -1 || getfpregs_supplies (regno))
+ {
+ struct fpreg fpregs;
+
+ if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
+ perror_with_name (_("Couldn't get FP registers"));
+
+ ppcfbsd_fill_fpreg ((char *) &fpregs, regno);
+
+ if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
+ perror_with_name (_("Couldn't set FP registers"));
+ }
+}
+
+void
+fill_gregset (char *regs, int regnum)
+{
+ ppcfbsd_fill_reg (regs, regnum);
+}
+
+void
+fill_fpregset (char *fpregs, int regnum)
+{
+ ppcfbsd_fill_fpreg (fpregs, regnum);
+}
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+void _initialize_ppcfbsd_nat (void);
+
+void
+_initialize_ppcfbsd_nat (void)
+{
+}
diff --git a/contrib/gdb/gdb/ppcfbsd-tdep.c b/contrib/gdb/gdb/ppcfbsd-tdep.c
new file mode 100644
index 0000000..296be18
--- /dev/null
+++ b/contrib/gdb/gdb/ppcfbsd-tdep.c
@@ -0,0 +1,291 @@
+/* Target-dependent code for PowerPC systems running FreeBSD.
+
+ Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ Contributed by Wasabi Systems, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include "defs.h"
+#include "gdbcore.h"
+#include "regcache.h"
+#include "target.h"
+#include "breakpoint.h"
+#include "value.h"
+#include "osabi.h"
+
+#include "ppc-tdep.h"
+#include "ppcfbsd-tdep.h"
+#include "trad-frame.h"
+#include "gdb_assert.h"
+#include "solib-svr4.h"
+
+#define REG_FIXREG_OFFSET(x) ((x) * 4)
+#define REG_LR_OFFSET (32 * 4)
+#define REG_CR_OFFSET (33 * 4)
+#define REG_XER_OFFSET (34 * 4)
+#define REG_CTR_OFFSET (35 * 4)
+#define REG_PC_OFFSET (36 * 4)
+#define SIZEOF_STRUCT_REG (37 * 4)
+
+#define FPREG_FPR_OFFSET(x) ((x) * 8)
+#define FPREG_FPSCR_OFFSET (32 * 8)
+#define SIZEOF_STRUCT_FPREG (33 * 8)
+
+void
+ppcfbsd_supply_reg (char *regs, int regno)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+ int i;
+
+ for (i = tdep->ppc_gp0_regnum; i <= tdep->ppc_gplast_regnum; i++)
+ {
+ if (regno == i || regno == -1)
+ regcache_raw_supply (current_regcache, i, regs +
+ REG_FIXREG_OFFSET (i - tdep->ppc_gp0_regnum));
+ }
+
+ if (regno == tdep->ppc_lr_regnum || regno == -1)
+ regcache_raw_supply (current_regcache, tdep->ppc_lr_regnum,
+ regs + REG_LR_OFFSET);
+
+ if (regno == tdep->ppc_cr_regnum || regno == -1)
+ regcache_raw_supply (current_regcache, tdep->ppc_cr_regnum,
+ regs + REG_CR_OFFSET);
+
+ if (regno == tdep->ppc_xer_regnum || regno == -1)
+ regcache_raw_supply (current_regcache, tdep->ppc_xer_regnum,
+ regs + REG_XER_OFFSET);
+
+ if (regno == tdep->ppc_ctr_regnum || regno == -1)
+ regcache_raw_supply (current_regcache, tdep->ppc_ctr_regnum,
+ regs + REG_CTR_OFFSET);
+
+ if (regno == PC_REGNUM || regno == -1)
+ regcache_raw_supply (current_regcache, PC_REGNUM,
+ regs + REG_PC_OFFSET);
+}
+
+void
+ppcfbsd_fill_reg (char *regs, int regno)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+ int i;
+
+ for (i = tdep->ppc_gp0_regnum; i <= tdep->ppc_gplast_regnum; i++)
+ {
+ if (regno == i || regno == -1)
+ regcache_raw_collect (current_regcache, i, regs +
+ REG_FIXREG_OFFSET (i - tdep->ppc_gp0_regnum));
+ }
+
+ if (regno == tdep->ppc_lr_regnum || regno == -1)
+ regcache_raw_collect (current_regcache, tdep->ppc_lr_regnum,
+ regs + REG_LR_OFFSET);
+
+ if (regno == tdep->ppc_cr_regnum || regno == -1)
+ regcache_raw_collect (current_regcache, tdep->ppc_cr_regnum,
+ regs + REG_CR_OFFSET);
+
+ if (regno == tdep->ppc_xer_regnum || regno == -1)
+ regcache_raw_collect (current_regcache, tdep->ppc_xer_regnum,
+ regs + REG_XER_OFFSET);
+
+ if (regno == tdep->ppc_ctr_regnum || regno == -1)
+ regcache_raw_collect (current_regcache, tdep->ppc_ctr_regnum,
+ regs + REG_CTR_OFFSET);
+
+ if (regno == PC_REGNUM || regno == -1)
+ regcache_raw_collect (current_regcache, PC_REGNUM, regs + REG_PC_OFFSET);
+}
+
+void
+ppcfbsd_supply_fpreg (char *fpregs, int regno)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+ int i;
+
+ /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
+ point registers. Traditionally, GDB's register set has still
+ listed the floating point registers for such machines, so this
+ code is harmless. However, the new E500 port actually omits the
+ floating point registers entirely from the register set --- they
+ don't even have register numbers assigned to them.
+
+ It's not clear to me how best to update this code, so this assert
+ will alert the first person to encounter the NetBSD/E500
+ combination to the problem. */
+ gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
+
+ for (i = FP0_REGNUM; i <= FPLAST_REGNUM; i++)
+ {
+ if (regno == i || regno == -1)
+ regcache_raw_supply (current_regcache, i, fpregs +
+ FPREG_FPR_OFFSET (i - FP0_REGNUM));
+ }
+
+ if (regno == tdep->ppc_fpscr_regnum || regno == -1)
+ regcache_raw_supply (current_regcache, tdep->ppc_fpscr_regnum,
+ fpregs + FPREG_FPSCR_OFFSET);
+}
+
+void
+ppcfbsd_fill_fpreg (char *fpregs, int regno)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+ int i;
+
+ /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
+ point registers. Traditionally, GDB's register set has still
+ listed the floating point registers for such machines, so this
+ code is harmless. However, the new E500 port actually omits the
+ floating point registers entirely from the register set --- they
+ don't even have register numbers assigned to them.
+
+ It's not clear to me how best to update this code, so this assert
+ will alert the first person to encounter the NetBSD/E500
+ combination to the problem. */
+ gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
+
+ for (i = FP0_REGNUM; i <= FPLAST_REGNUM; i++)
+ {
+ if (regno == i || regno == -1)
+ regcache_raw_collect (current_regcache, i, fpregs +
+ FPREG_FPR_OFFSET (i - FP0_REGNUM));
+ }
+
+ if (regno == tdep->ppc_fpscr_regnum || regno == -1)
+ regcache_raw_collect (current_regcache, tdep->ppc_fpscr_regnum,
+ fpregs + FPREG_FPSCR_OFFSET);
+}
+
+static void
+fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
+ CORE_ADDR ignore)
+{
+ char *regs, *fpregs;
+
+ /* We get everything from one section. */
+ if (which != 0)
+ return;
+
+ regs = core_reg_sect;
+ fpregs = core_reg_sect + SIZEOF_STRUCT_REG;
+
+ /* Integer registers. */
+ ppcfbsd_supply_reg (regs, -1);
+
+ /* Floating point registers. */
+ ppcfbsd_supply_fpreg (fpregs, -1);
+}
+
+static void
+fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which,
+ CORE_ADDR ignore)
+{
+ switch (which)
+ {
+ case 0: /* Integer registers. */
+ if (core_reg_size != SIZEOF_STRUCT_REG)
+ warning (_("Wrong size register set in core file."));
+ else
+ ppcfbsd_supply_reg (core_reg_sect, -1);
+ break;
+
+ case 2: /* Floating point registers. */
+ if (core_reg_size != SIZEOF_STRUCT_FPREG)
+ warning (_("Wrong size FP register set in core file."));
+ else
+ ppcfbsd_supply_fpreg (core_reg_sect, -1);
+ break;
+
+ default:
+ /* Don't know what kind of register request this is; just ignore it. */
+ break;
+ }
+}
+
+static struct core_fns ppcfbsd_core_fns =
+{
+ bfd_target_unknown_flavour, /* core_flavour */
+ default_check_format, /* check_format */
+ default_core_sniffer, /* core_sniffer */
+ fetch_core_registers, /* core_read_registers */
+ NULL /* next */
+};
+
+static struct core_fns ppcfbsd_elfcore_fns =
+{
+ bfd_target_elf_flavour, /* core_flavour */
+ default_check_format, /* check_format */
+ default_core_sniffer, /* core_sniffer */
+ fetch_elfcore_registers, /* core_read_registers */
+ NULL /* next */
+};
+
+static int
+ppcfbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
+{
+ return (pc >= 0x7fffef00U) ? 1 : 0;
+}
+
+/* NetBSD is confused. It appears that 1.5 was using the correct SVr4
+ convention but, 1.6 switched to the below broken convention. For
+ the moment use the broken convention. Ulgh!. */
+
+static enum return_value_convention
+ppcfbsd_return_value (struct gdbarch *gdbarch, struct type *valtype,
+ struct regcache *regcache, void *readbuf,
+ const void *writebuf)
+{
+ if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
+ || TYPE_CODE (valtype) == TYPE_CODE_UNION)
+ && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8))
+ && !(TYPE_LENGTH (valtype) == 1
+ || TYPE_LENGTH (valtype) == 2
+ || TYPE_LENGTH (valtype) == 4
+ || TYPE_LENGTH (valtype) == 8))
+ return RETURN_VALUE_STRUCT_CONVENTION;
+ else
+ return ppc_sysv_abi_broken_return_value (gdbarch, valtype, regcache,
+ readbuf, writebuf);
+}
+
+static void
+ppcfbsd_init_abi (struct gdbarch_info info,
+ struct gdbarch *gdbarch)
+{
+ set_gdbarch_pc_in_sigtramp (gdbarch, ppcfbsd_pc_in_sigtramp);
+ /* For NetBSD, this is an on again, off again thing. Some systems
+ do use the broken struct convention, and some don't. */
+ set_gdbarch_return_value (gdbarch, ppcfbsd_return_value);
+ set_solib_svr4_fetch_link_map_offsets (gdbarch,
+ svr4_ilp32_fetch_link_map_offsets);
+}
+
+void
+_initialize_ppcfbsd_tdep (void)
+{
+ gdbarch_register_osabi (bfd_arch_rs6000, 0, GDB_OSABI_FREEBSD_ELF,
+ ppcfbsd_init_abi);
+ gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_FREEBSD_ELF,
+ ppcfbsd_init_abi);
+
+ add_core_fns (&ppcfbsd_core_fns);
+ add_core_fns (&ppcfbsd_elfcore_fns);
+}
diff --git a/contrib/gdb/gdb/ppcfbsd-tdep.h b/contrib/gdb/gdb/ppcfbsd-tdep.h
new file mode 100644
index 0000000..1fe90be
--- /dev/null
+++ b/contrib/gdb/gdb/ppcfbsd-tdep.h
@@ -0,0 +1,30 @@
+/* Common target dependent code for GDB on PowerPC systems running FreeBSD.
+ Copyright 2002 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef PPCFBSD_TDEP_H
+#define PPCFBSD_TDEP_H
+
+void ppcfbsd_supply_reg (char *, int);
+void ppcfbsd_fill_reg (char *, int);
+
+void ppcfbsd_supply_fpreg (char *, int);
+void ppcfbsd_fill_fpreg (char *, int);
+
+#endif /* PPCFBSD_TDEP_H */
OpenPOWER on IntegriCloud