ports/devel/gdb/files/commit-b268007c68

191 lines
5.7 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

commit acde9e8dc95a053909e137c1fcda94c719eb8cc1
Author: John Baldwin <jhb@FreeBSD.org>
Date: Wed Jan 4 09:41:58 2017 -0800
Add native target for FreeBSD/mips.
This supports the o32 and n64 ABIs.
gdb/ChangeLog:
* Makefile.in (ALLDEPFILES): Add mips-fbsd-nat.c.
* NEWS: Mention new FreeBSD/mips native configuration.
* config/mips/fbsd.mh: New file.
* configure.host: Add mips*-*-freebsd*.
* mips-fbsd-nat.c: New file.
diff --git gdb/Makefile.in gdb/Makefile.in
index 300c2cb702..433dd1203a 100644
--- gdb/Makefile.in
+++ gdb/Makefile.in
@@ -1725,6 +1725,7 @@ ALLDEPFILES = \
m88k-tdep.c m88kbsd-nat.c \
microblaze-tdep.c microblaze-linux-tdep.c \
mingw-hdep.c common/mingw-strerror.c \
+ mips-fbsd-nat.c \
mips-fbsd-tdep.c \
mips-linux-nat.c mips-linux-tdep.c \
mips-sde-tdep.c \
diff --git gdb/config/mips/fbsd.mh gdb/config/mips/fbsd.mh
new file mode 100644
index 0000000000..f433347a20
--- /dev/null
+++ gdb/config/mips/fbsd.mh
@@ -0,0 +1,3 @@
+# Host: FreeBSD/mips
+NATDEPFILES= fork-child.o inf-ptrace.o fbsd-nat.o mips-fbsd-nat.o
+HAVE_NATIVE_GCORE_HOST = 1
diff --git gdb/configure.host gdb/configure.host
index ef265ebe29..c45f61dbba 100644
--- gdb/configure.host
+++ gdb/configure.host
@@ -129,6 +129,7 @@ m88*-*-openbsd*) gdb_host=obsd ;;
mips*-*-linux*) gdb_host=linux ;;
mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
gdb_host=nbsd ;;
+mips*-*-freebsd*) gdb_host=fbsd ;;
mips64*-*-openbsd*) gdb_host=obsd64 ;;
powerpc-*-aix* | rs6000-*-* | powerpc64-*-aix*)
diff --git gdb/mips-fbsd-nat.c gdb/mips-fbsd-nat.c
new file mode 100644
index 0000000000..0472df88f4
--- /dev/null
+++ gdb/mips-fbsd-nat.c
@@ -0,0 +1,136 @@
+/* Native-dependent code for FreeBSD/mips.
+
+ Copyright (C) 2017 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#include "defs.h"
+#include "inferior.h"
+#include "regcache.h"
+#include "target.h"
+
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#include <machine/reg.h>
+
+#include "fbsd-nat.h"
+#include "mips-tdep.h"
+#include "mips-fbsd-tdep.h"
+#include "inf-ptrace.h"
+
+/* Determine if PT_GETREGS fetches this register. */
+
+static bool
+getregs_supplies (struct gdbarch *gdbarch, int regnum)
+{
+ return (regnum >= MIPS_ZERO_REGNUM
+ && regnum <= gdbarch_pc_regnum (gdbarch));
+}
+
+/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
+ for all registers. */
+
+static void
+mips_fbsd_fetch_inferior_registers (struct target_ops *ops,
+ struct regcache *regcache, int regnum)
+{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ if (regnum == -1 || getregs_supplies (gdbarch, regnum))
+ {
+ struct reg regs;
+
+ if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ perror_with_name (_("Couldn't get registers"));
+
+ mips_fbsd_supply_gregs (regcache, regnum, &regs, sizeof (register_t));
+ if (regnum != -1)
+ return;
+ }
+
+ if (regnum == -1
+ || regnum >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
+ {
+ struct fpreg fpregs;
+
+ if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ perror_with_name (_("Couldn't get floating point status"));
+
+ mips_fbsd_supply_fpregs (regcache, regnum, &fpregs,
+ sizeof (f_register_t));
+ }
+}
+
+/* Store register REGNUM back into the inferior. If REGNUM is -1, do
+ this for all registers. */
+
+static void
+mips_fbsd_store_inferior_registers (struct target_ops *ops,
+ struct regcache *regcache, int regnum)
+{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ if (regnum == -1 || getregs_supplies (gdbarch, regnum))
+ {
+ struct reg regs;
+
+ if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ perror_with_name (_("Couldn't get registers"));
+
+ mips_fbsd_collect_gregs (regcache, regnum, (char *) &regs,
+ sizeof (register_t));
+
+ if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ perror_with_name (_("Couldn't write registers"));
+
+ if (regnum != -1)
+ return;
+ }
+
+ if (regnum == -1
+ || regnum >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
+ {
+ struct fpreg fpregs;
+
+ if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ perror_with_name (_("Couldn't get floating point status"));
+
+ mips_fbsd_collect_fpregs (regcache, regnum, (char *) &fpregs,
+ sizeof (f_register_t));
+
+ if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ perror_with_name (_("Couldn't write floating point status"));
+ }
+}
+
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+void _initialize_mips_fbsd_nat (void);
+
+void
+_initialize_mips_fbsd_nat (void)
+{
+ struct target_ops *t;
+
+ t = inf_ptrace_target ();
+ t->to_fetch_registers = mips_fbsd_fetch_inferior_registers;
+ t->to_store_registers = mips_fbsd_store_inferior_registers;
+ fbsd_nat_add_target (t);
+}