summaryrefslogtreecommitdiff
path: root/gdb/ppcnbsd-nat.c
diff options
context:
space:
mode:
authorJ.T. Conklin <jtc@redback.com>2000-05-18 23:43:58 +0000
committerJ.T. Conklin <jtc@redback.com>2000-05-18 23:43:58 +0000
commit6d6372704a9ce991c972cde77bf675b9d16e64e6 (patch)
treeecbade2d7c9e696919bf49675950ee4bc0582488 /gdb/ppcnbsd-nat.c
parent976eb2cafa455203d507e5bbda8d6874236e12ec (diff)
downloadgdb-6d6372704a9ce991c972cde77bf675b9d16e64e6.tar.gz
* configure.host, configure.tgt (powerpc-*-netbsd*): New entry.
* config/powerpc/nbsd.mh, config/powerpc/nbsd.mt, config/powerpc/tm-nbsd.h, config/powerpc/nm-nbsd.h, config/powerpc/xm-nbsd.h: New files.
Diffstat (limited to 'gdb/ppcnbsd-nat.c')
-rw-r--r--gdb/ppcnbsd-nat.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/gdb/ppcnbsd-nat.c b/gdb/ppcnbsd-nat.c
new file mode 100644
index 00000000000..b754fa71a48
--- /dev/null
+++ b/gdb/ppcnbsd-nat.c
@@ -0,0 +1,135 @@
+/* Native-dependent code for PowerPC's running NetBSD, for GDB.
+ Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000 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. */
+
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#include <machine/reg.h>
+#include <machine/frame.h>
+
+#include "defs.h"
+#include "inferior.h"
+#include "gdbcore.h"
+
+#define RF(dst, src) \
+ memcpy(&registers[REGISTER_BYTE(dst)], &src, sizeof(src))
+
+#define RS(src, dst) \
+ memcpy(&dst, &registers[REGISTER_BYTE(src)], sizeof(dst))
+
+void
+fetch_inferior_registers (regno)
+ int regno;
+{
+ struct reg inferior_registers;
+ struct fpreg inferior_fp_registers;
+ int i;
+
+ ptrace (PT_GETREGS, inferior_pid,
+ (PTRACE_ARG3_TYPE) & inferior_registers, 0);
+ for (i = 0; i < 32; i++)
+ RF (i, inferior_registers.fixreg[i]);
+ RF (LR_REGNUM, inferior_registers.lr);
+ RF (CR_REGNUM, inferior_registers.cr);
+ RF (XER_REGNUM, inferior_registers.xer);
+ RF (CTR_REGNUM, inferior_registers.ctr);
+ RF (PC_REGNUM, inferior_registers.pc);
+
+ ptrace (PT_GETFPREGS, inferior_pid,
+ (PTRACE_ARG3_TYPE) & inferior_fp_registers, 0);
+ for (i = 0; i < 32; i++)
+ RF (FP0_REGNUM + i, inferior_fp_registers.r_regs[i]);
+
+ registers_fetched ();
+}
+
+void
+store_inferior_registers (regno)
+ int regno;
+{
+ struct reg inferior_registers;
+ struct fpreg inferior_fp_registers;
+ int i;
+
+ for (i = 0; i < 32; i++)
+ RS (i, inferior_registers.fixreg[i]);
+ RS (LR_REGNUM, inferior_registers.lr);
+ RS (CR_REGNUM, inferior_registers.cr);
+ RS (XER_REGNUM, inferior_registers.xer);
+ RS (CTR_REGNUM, inferior_registers.ctr);
+ RS (PC_REGNUM, inferior_registers.pc);
+
+ ptrace (PT_SETREGS, inferior_pid,
+ (PTRACE_ARG3_TYPE) & inferior_registers, 0);
+
+ for (i = 0; i < 32; i++)
+ RS (FP0_REGNUM + i, inferior_fp_registers.r_regs[i]);
+ ptrace (PT_SETFPREGS, inferior_pid,
+ (PTRACE_ARG3_TYPE) & inferior_fp_registers, 0);
+}
+
+struct md_core
+{
+ struct reg intreg;
+ struct fpreg freg;
+};
+
+void
+fetch_core_registers (core_reg_sect, core_reg_size, which, ignore)
+ char *core_reg_sect;
+ unsigned core_reg_size;
+ int which;
+ CORE_ADDR ignore;
+{
+ struct md_core *core_reg = (struct md_core *) core_reg_sect;
+ int i;
+
+ /* Integer registers */
+ for (i = 0; i < 32; i++)
+ RF (i, core_reg->intreg.fixreg[i]);
+ RF (LR_REGNUM, core_reg->intreg.lr);
+ RF (CR_REGNUM, core_reg->intreg.cr);
+ RF (XER_REGNUM, core_reg->intreg.xer);
+ RF (CTR_REGNUM, core_reg->intreg.ctr);
+ RF (PC_REGNUM, core_reg->intreg.pc);
+
+ /* Floating point registers */
+ for (i = 0; i < 32; i++)
+ RF (FP0_REGNUM + i, core_reg->freg.r_regs[i]);
+
+ registers_fetched ();
+}
+
+/* Register that we are able to handle ppcnbsd core file formats.
+ FIXME: is this really bfd_target_unknown_flavour? */
+
+static struct core_fns ppcnbsd_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 */
+};
+
+void
+_initialize_ppcnbsd_nat ()
+{
+ add_core_fns (&ppcnbsd_core_fns);
+}