diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c44401c041..3d83ee31a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-09-06 John Baldwin + + * 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 * Makefile.in (ALL_64_TARGET_OBS): Add aarch64-fbsd-tdep.o. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8593f73e16..2aa474e598 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 \ diff --git a/gdb/NEWS b/gdb/NEWS index 038abbff21..0280a2eedd 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -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 0000000000..ffe7d5ba3a --- /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 . */ + +#include "defs.h" +#include "target.h" + +#include +#include +#include + +#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 d74fd04934..304675f137 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 b1dda30852..8a01f4b5d4 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 \