diff options
author | Mark Kettenis <kettenis@gnu.org> | 2003-10-18 18:41:22 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2003-10-18 18:41:22 +0000 |
commit | cced5e27e61ec91c00eecd61b48096f7e49b7141 (patch) | |
tree | 484866ad5e8755a1cde09bc72512daf41c291fa9 /gdb/amd64bsd-nat.c | |
parent | 89b7466f7671017df5609bcbfcf2e6d836517535 (diff) | |
download | gdb-cced5e27e61ec91c00eecd61b48096f7e49b7141.zip gdb-cced5e27e61ec91c00eecd61b48096f7e49b7141.tar.gz gdb-cced5e27e61ec91c00eecd61b48096f7e49b7141.tar.bz2 |
Add NetBSD/amd64 native configuration:
* x86-64-tdep.h (amd64nbsd_r_reg_offset): Add extern declarations.
* amd64nbsd-tdep.c: New file.
* amd64nbsd-nat.c: New file.
* amd64bsd-nat.c: New file.
* config/i386/nbsd64.mh: New file.
* config/i386/nbsd64.mt: New file.
* configure.host: Add x86_64-*-netbsd*.
* configure.tgt: Add x86_64-*-netbsd*.
* Makefile.in (amd64bsd-nat.o, amd64nbsd-nat.o, amd64nbsd-tdep.o):
New targets.
* NEWS (New native configurations): Mention NetBSD/amd64.
Diffstat (limited to 'gdb/amd64bsd-nat.c')
-rw-r--r-- | gdb/amd64bsd-nat.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c new file mode 100644 index 0000000..6c85f20 --- /dev/null +++ b/gdb/amd64bsd-nat.c @@ -0,0 +1,107 @@ +/* Native-dependent code for AMD64 BSD's. + + Copyright 2003 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 "defs.h" +#include "inferior.h" +#include "regcache.h" + +/* We include <signal.h> to make sure `struct fxsave64' is defined on + NetBSD, since NetBSD's <machine/reg.h> needs it. */ +#include "gdb_assert.h" +#include <signal.h> +#include <sys/types.h> +#include <sys/ptrace.h> +#include <machine/reg.h> + +#include "x86-64-tdep.h" +#include "amd64-nat.h" + + +/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this + for all registers (including the floating-point registers). */ + +void +fetch_inferior_registers (int regnum) +{ + if (regnum == -1 || amd64_native_gregset_supplies_p (regnum)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't get registers"); + + amd64_supply_native_gregset (current_regcache, ®s, -1); + if (regnum != -1) + return; + } + + if (regnum == -1 || regnum >= X86_64_ST0_REGNUM) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't get floating point status"); + + x86_64_supply_fxsave (current_regcache, -1, &fpregs); + } +} + +/* Store register REGNUM back into the inferior. If REGNUM is -1, do + this for all registers (including the floating-point registers). */ + +void +store_inferior_registers (int regnum) +{ + if (regnum == -1 || amd64_native_gregset_supplies_p (regnum)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't get registers"); + + amd64_collect_native_gregset (current_regcache, ®s, regnum); + + if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't write registers"); + + if (regnum != -1) + return; + } + + if (regnum == -1 || regnum >= X86_64_ST0_REGNUM) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't get floating point status"); + + x86_64_fill_fxsave ((char *) &fpregs, regnum); + + if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't write floating point status"); + } +} |