* ppc-linux-nat.c (ppc_register_u_addr): Add gdbarch as parameter.
[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
MK
43{
44 if (regnum == -1 || amd64_native_gregset_supplies_p (regnum))
45 {
46 struct reg regs;
47
48 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 49 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 50 perror_with_name (_("Couldn't get registers"));
cced5e27 51
56be3814 52 amd64_supply_native_gregset (regcache, &regs, -1);
cced5e27
MK
53 if (regnum != -1)
54 return;
55 }
56
18bbbd9e 57 if (regnum == -1 || !amd64_native_gregset_supplies_p (regnum))
cced5e27
MK
58 {
59 struct fpreg fpregs;
60
61 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 62 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 63 perror_with_name (_("Couldn't get floating point status"));
cced5e27 64
56be3814 65 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
66 }
67}
68
69/* Store register REGNUM back into the inferior. If REGNUM is -1, do
70 this for all registers (including the floating-point registers). */
71
6a5c78a3 72static void
56be3814 73amd64bsd_store_inferior_registers (struct regcache *regcache, int regnum)
cced5e27
MK
74{
75 if (regnum == -1 || amd64_native_gregset_supplies_p (regnum))
76 {
77 struct reg regs;
78
79 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 80 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 81 perror_with_name (_("Couldn't get registers"));
cced5e27 82
56be3814 83 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27
MK
84
85 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 86 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 87 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
88
89 if (regnum != -1)
90 return;
91 }
92
18bbbd9e 93 if (regnum == -1 || !amd64_native_gregset_supplies_p (regnum))
cced5e27
MK
94 {
95 struct fpreg fpregs;
96
97 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 98 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 99 perror_with_name (_("Couldn't get floating point status"));
cced5e27 100
56be3814 101 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27
MK
102
103 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 104 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 105 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
106 }
107}
6a5c78a3
MK
108
109/* Create a prototype *BSD/amd64 target. The client can override it
110 with local methods. */
111
112struct target_ops *
113amd64bsd_target (void)
114{
115 struct target_ops *t;
116
117 t = inf_ptrace_target ();
118 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
119 t->to_store_registers = amd64bsd_store_inferior_registers;
120 return t;
121}
This page took 0.328022 seconds and 4 git commands to generate.