mirror of
https://git.freebsd.org/ports.git
synced 2025-06-27 23:50:30 -04:00
191 lines
5.7 KiB
Text
191 lines
5.7 KiB
Text
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) ®s, 0) == -1)
|
||
+ perror_with_name (_("Couldn't get registers"));
|
||
+
|
||
+ mips_fbsd_supply_gregs (regcache, regnum, ®s, 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) ®s, 0) == -1)
|
||
+ perror_with_name (_("Couldn't get registers"));
|
||
+
|
||
+ mips_fbsd_collect_gregs (regcache, regnum, (char *) ®s,
|
||
+ sizeof (register_t));
|
||
+
|
||
+ if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
|
||
+ (PTRACE_TYPE_ARG3) ®s, 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);
|
||
+}
|