Cast the pointer assigned to ss_sp to char *.
[deliverable/binutils-gdb.git] / gdb / amd64bsd-nat.c
CommitLineData
cced5e27
MK
1/* Native-dependent code for AMD64 BSD's.
2
618f726f 3 Copyright (C) 2003-2016 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. */
cced5e27
MK
27#include <signal.h>
28#include <sys/types.h>
29#include <sys/ptrace.h>
30#include <machine/reg.h>
31
85be1ca6 32#include "amd64-tdep.h"
cced5e27 33#include "amd64-nat.h"
649c7061 34#include "amd64bsd-nat.h"
6a5c78a3 35#include "inf-ptrace.h"
cced5e27
MK
36\f
37
97de3545
JB
38#ifdef PT_GETXSTATE_INFO
39size_t amd64bsd_xsave_len;
40#endif
41
cced5e27
MK
42/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
43 for all registers (including the floating-point registers). */
44
6a5c78a3 45static void
28439f5e
PA
46amd64bsd_fetch_inferior_registers (struct target_ops *ops,
47 struct regcache *regcache, int regnum)
cced5e27 48{
f8028488
MD
49 struct gdbarch *gdbarch = get_regcache_arch (regcache);
50
51 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
52 {
53 struct reg regs;
54
94309df7 55 if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 56 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 57 perror_with_name (_("Couldn't get registers"));
cced5e27 58
56be3814 59 amd64_supply_native_gregset (regcache, &regs, -1);
cced5e27
MK
60 if (regnum != -1)
61 return;
62 }
63
f8028488 64 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
65 {
66 struct fpreg fpregs;
97de3545
JB
67#ifdef PT_GETXSTATE_INFO
68 char *xstateregs;
69
70 if (amd64bsd_xsave_len != 0)
71 {
72 xstateregs = alloca (amd64bsd_xsave_len);
94309df7 73 if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
97de3545
JB
74 (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
75 perror_with_name (_("Couldn't get extended state status"));
76
77 amd64_supply_xsave (regcache, -1, xstateregs);
78 return;
79 }
80#endif
cced5e27 81
94309df7 82 if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 83 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 84 perror_with_name (_("Couldn't get floating point status"));
cced5e27 85
56be3814 86 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
87 }
88}
89
90/* Store register REGNUM back into the inferior. If REGNUM is -1, do
91 this for all registers (including the floating-point registers). */
92
6a5c78a3 93static void
28439f5e
PA
94amd64bsd_store_inferior_registers (struct target_ops *ops,
95 struct regcache *regcache, int regnum)
cced5e27 96{
f8028488
MD
97 struct gdbarch *gdbarch = get_regcache_arch (regcache);
98
99 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
100 {
101 struct reg regs;
102
94309df7 103 if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 104 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 105 perror_with_name (_("Couldn't get registers"));
cced5e27 106
56be3814 107 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27 108
94309df7 109 if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 110 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 111 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
112
113 if (regnum != -1)
114 return;
115 }
116
f8028488 117 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
118 {
119 struct fpreg fpregs;
97de3545
JB
120#ifdef PT_GETXSTATE_INFO
121 char *xstateregs;
122
123 if (amd64bsd_xsave_len != 0)
124 {
125 xstateregs = alloca (amd64bsd_xsave_len);
94309df7 126 if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
97de3545
JB
127 (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
128 perror_with_name (_("Couldn't get extended state status"));
129
130 amd64_collect_xsave (regcache, regnum, xstateregs, 0);
131
94309df7 132 if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid),
97de3545
JB
133 (PTRACE_TYPE_ARG3) xstateregs, amd64bsd_xsave_len) == -1)
134 perror_with_name (_("Couldn't write extended state status"));
135 return;
136 }
137#endif
cced5e27 138
94309df7 139 if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 140 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 141 perror_with_name (_("Couldn't get floating point status"));
cced5e27 142
56be3814 143 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27 144
94309df7 145 if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 146 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 147 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
148 }
149}
6a5c78a3
MK
150
151/* Create a prototype *BSD/amd64 target. The client can override it
152 with local methods. */
153
154struct target_ops *
155amd64bsd_target (void)
156{
157 struct target_ops *t;
158
159 t = inf_ptrace_target ();
160 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
161 t->to_store_registers = amd64bsd_store_inferior_registers;
162 return t;
163}
1916efaf
PA
164\f
165
166/* Support for debug registers. */
167
168#ifdef HAVE_PT_GETDBREGS
169
170static unsigned long
171amd64bsd_dr_get (ptid_t ptid, int regnum)
172{
173 struct dbreg dbregs;
174
94309df7 175 if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
1916efaf
PA
176 (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
177 perror_with_name (_("Couldn't read debug registers"));
178
179 return DBREG_DRX ((&dbregs), regnum);
180}
181
182static void
183amd64bsd_dr_set (int regnum, unsigned long value)
184{
185 struct dbreg dbregs;
186
94309df7 187 if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
1916efaf
PA
188 (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
189 perror_with_name (_("Couldn't get debug registers"));
190
191 /* For some mysterious reason, some of the reserved bits in the
192 debug control register get set. Mask these off, otherwise the
193 ptrace call below will fail. */
194 DBREG_DRX ((&dbregs), 7) &= ~(0xffffffff0000fc00);
195
196 DBREG_DRX ((&dbregs), regnum) = value;
197
94309df7 198 if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid),
1916efaf
PA
199 (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
200 perror_with_name (_("Couldn't write debug registers"));
201}
202
203void
204amd64bsd_dr_set_control (unsigned long control)
205{
206 amd64bsd_dr_set (7, control);
207}
208
209void
210amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr)
211{
212 gdb_assert (regnum >= 0 && regnum <= 4);
213
214 amd64bsd_dr_set (regnum, addr);
215}
216
217CORE_ADDR
218amd64bsd_dr_get_addr (int regnum)
219{
220 return amd64bsd_dr_get (inferior_ptid, regnum);
221}
222
223unsigned long
224amd64bsd_dr_get_status (void)
225{
226 return amd64bsd_dr_get (inferior_ptid, 6);
227}
228
229unsigned long
230amd64bsd_dr_get_control (void)
231{
232 return amd64bsd_dr_get (inferior_ptid, 7);
233}
234
235#endif /* PT_GETDBREGS */
This page took 0.891565 seconds and 4 git commands to generate.