diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/Makefile.in | 1 | ||||
-rw-r--r-- | gdb/NEWS | 4 | ||||
-rw-r--r-- | gdb/aarch64-fbsd-nat.c | 129 | ||||
-rw-r--r-- | gdb/configure.host | 1 | ||||
-rw-r--r-- | gdb/configure.nat | 5 |
6 files changed, 148 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c44401c..3d83ee3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2017-09-06 John Baldwin <jhb@FreeBSD.org> + * Makefile.in (ALLDEPFILES): Add mips-fbsd-nat.c. + * NEWS: Mention new FreeBSD/mips native configuration. + * configure.host: Add aarch64*-*-freebsd*. + * configure.nat: Likewise. + * aarch64-fbsd-nat.c: New file. + +2017-09-06 John Baldwin <jhb@FreeBSD.org> + * Makefile.in (ALL_64_TARGET_OBS): Add aarch64-fbsd-tdep.o. (ALLDEPFILES): Add aarch64-fbsd-tdep.c. * NEWS: Mention new FreeBSD/aarch64 target. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8593f73..2aa474e 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2497,6 +2497,7 @@ force_update: MAKEOVERRIDES = ALLDEPFILES = \ + aarch64-fbsd-nat.c \ aarch64-fbsd-tdep.c \ aarch64-linux-nat.c \ aarch64-linux-tdep.c \ @@ -92,6 +92,10 @@ show debug separate-debug-file (gdb) p (float) var $3 = 3.14 +* New native configurations + +FreeBSD/aarch64 aarch64*-*-freebsd* + * New targets FreeBSD/aarch64 aarch64*-*-freebsd* diff --git a/gdb/aarch64-fbsd-nat.c b/gdb/aarch64-fbsd-nat.c new file mode 100644 index 0000000..ffe7d5b --- /dev/null +++ b/gdb/aarch64-fbsd-nat.c @@ -0,0 +1,129 @@ +/* Native-dependent code for FreeBSD/aarch64. + + 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 "target.h" + +#include <sys/types.h> +#include <sys/ptrace.h> +#include <machine/reg.h> + +#include "fbsd-nat.h" +#include "aarch64-tdep.h" +#include "aarch64-fbsd-tdep.h" +#include "inf-ptrace.h" + +/* Determine if PT_GETREGS fetches REGNUM. */ + +static bool +getregs_supplies (struct gdbarch *gdbarch, int regnum) +{ + return (regnum >= AARCH64_X0_REGNUM && regnum <= AARCH64_CPSR_REGNUM); +} + +/* Determine if PT_GETFPREGS fetches REGNUM. */ + +static bool +getfpregs_supplies (struct gdbarch *gdbarch, int regnum) +{ + return (regnum >= AARCH64_V0_REGNUM && regnum <= AARCH64_FPCR_REGNUM); +} + +/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this + for all registers. */ + +static void +aarch64_fbsd_fetch_inferior_registers (struct target_ops *ops, + struct regcache *regcache, int regnum) +{ + pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache)); + + struct gdbarch *gdbarch = get_regcache_arch (regcache); + if (regnum == -1 || getregs_supplies (gdbarch, regnum)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + perror_with_name (_("Couldn't get registers")); + + regcache->supply_regset (&aarch64_fbsd_gregset, regnum, ®s, + sizeof (regs)); + } + + if (regnum == -1 || getfpregs_supplies (gdbarch, regnum)) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + perror_with_name (_("Couldn't get floating point status")); + + regcache->supply_regset (&aarch64_fbsd_fpregset, regnum, &fpregs, + sizeof (fpregs)); + } +} + +/* Store register REGNUM back into the inferior. If REGNUM is -1, do + this for all registers. */ + +static void +aarch64_fbsd_store_inferior_registers (struct target_ops *ops, + struct regcache *regcache, int regnum) +{ + pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache)); + + struct gdbarch *gdbarch = get_regcache_arch (regcache); + if (regnum == -1 || getregs_supplies (gdbarch, regnum)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + perror_with_name (_("Couldn't get registers")); + + regcache->collect_regset (&aarch64_fbsd_gregset, regnum, ®s, + sizeof (regs)); + + if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + perror_with_name (_("Couldn't write registers")); + } + + if (regnum == -1 || getfpregs_supplies (gdbarch, regnum)) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + perror_with_name (_("Couldn't get floating point status")); + + regcache->collect_regset (&aarch64_fbsd_fpregset, regnum, &fpregs, + sizeof (fpregs)); + + if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + perror_with_name (_("Couldn't write floating point status")); + } +} + +void +_initialize_aarch64_fbsd_nat (void) +{ + struct target_ops *t; + + t = inf_ptrace_target (); + t->to_fetch_registers = aarch64_fbsd_fetch_inferior_registers; + t->to_store_registers = aarch64_fbsd_store_inferior_registers; + fbsd_nat_add_target (t); +} diff --git a/gdb/configure.host b/gdb/configure.host index d74fd04..304675f 100644 --- a/gdb/configure.host +++ b/gdb/configure.host @@ -84,6 +84,7 @@ case "${host}" in *-*-darwin*) gdb_host=darwin ;; aarch64*-*-linux*) gdb_host=linux ;; +aarch64*-*-freebsd*) gdb_host=fbsd ;; alpha*-*-linux*) gdb_host=alpha-linux ;; alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu) diff --git a/gdb/configure.nat b/gdb/configure.nat index b1dda30..8a01f4b 100644 --- a/gdb/configure.nat +++ b/gdb/configure.nat @@ -144,6 +144,11 @@ case ${gdb_host} in ;; fbsd) case ${gdb_host_cpu} in + aarch64) + # Host: FreeBSD/aarch64 + NATDEPFILES="${NATDEPFILES} aarch64-fbsd-nat.o" + LOADLIBES= + ;; i386) # Host: FreeBSD/i386 NATDEPFILES="${NATDEPFILES} x86-nat.o x86-dregs.o \ |