ChangeLog:
[deliverable/binutils-gdb.git] / gdb / amd64bsd-nat.c
CommitLineData
cced5e27
MK
1/* Native-dependent code for AMD64 BSD's.
2
9b254dd1 3 Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
cced5e27
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
cced5e27
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
cced5e27
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
6a5c78a3 23#include "target.h"
cced5e27
MK
24
25/* We include <signal.h> to make sure `struct fxsave64' is defined on
26 NetBSD, since NetBSD's <machine/reg.h> needs it. */
27#include "gdb_assert.h"
28#include <signal.h>
29#include <sys/types.h>
30#include <sys/ptrace.h>
31#include <machine/reg.h>
32
85be1ca6 33#include "amd64-tdep.h"
cced5e27 34#include "amd64-nat.h"
6a5c78a3 35#include "inf-ptrace.h"
cced5e27
MK
36\f
37
38/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
39 for all registers (including the floating-point registers). */
40
6a5c78a3 41static void
56be3814 42amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
cced5e27 43{
f8028488
MD
44 struct gdbarch *gdbarch = get_regcache_arch (regcache);
45
46 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
47 {
48 struct reg regs;
49
50 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 51 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 52 perror_with_name (_("Couldn't get registers"));
cced5e27 53
56be3814 54 amd64_supply_native_gregset (regcache, &regs, -1);
cced5e27
MK
55 if (regnum != -1)
56 return;
57 }
58
f8028488 59 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
60 {
61 struct fpreg fpregs;
62
63 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 64 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 65 perror_with_name (_("Couldn't get floating point status"));
cced5e27 66
56be3814 67 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
68 }
69}
70
71/* Store register REGNUM back into the inferior. If REGNUM is -1, do
72 this for all registers (including the floating-point registers). */
73
6a5c78a3 74static void
56be3814 75amd64bsd_store_inferior_registers (struct regcache *regcache, int regnum)
cced5e27 76{
f8028488
MD
77 struct gdbarch *gdbarch = get_regcache_arch (regcache);
78
79 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
80 {
81 struct reg regs;
82
83 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 84 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 85 perror_with_name (_("Couldn't get registers"));
cced5e27 86
56be3814 87 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27
MK
88
89 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 90 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 91 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
92
93 if (regnum != -1)
94 return;
95 }
96
f8028488 97 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
98 {
99 struct fpreg fpregs;
100
101 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 102 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 103 perror_with_name (_("Couldn't get floating point status"));
cced5e27 104
56be3814 105 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27
MK
106
107 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 108 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 109 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
110 }
111}
6a5c78a3
MK
112
113/* Create a prototype *BSD/amd64 target. The client can override it
114 with local methods. */
115
116struct target_ops *
117amd64bsd_target (void)
118{
119 struct target_ops *t;
120
121 t = inf_ptrace_target ();
122 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
123 t->to_store_registers = amd64bsd_store_inferior_registers;
124 return t;
125}
This page took 0.260048 seconds and 4 git commands to generate.