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