Fix reading of .debug_str_offsets{,.dwo} twice.
[deliverable/binutils-gdb.git] / gdb / amd64bsd-nat.c
CommitLineData
cced5e27
MK
1/* Native-dependent code for AMD64 BSD's.
2
32d0add0 3 Copyright (C) 2003-2015 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
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
28439f5e
PA
42amd64bsd_fetch_inferior_registers (struct target_ops *ops,
43 struct regcache *regcache, int regnum)
cced5e27 44{
f8028488
MD
45 struct gdbarch *gdbarch = get_regcache_arch (regcache);
46
47 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
48 {
49 struct reg regs;
50
dfd4cc63 51 if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
9f8e0089 52 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 53 perror_with_name (_("Couldn't get registers"));
cced5e27 54
56be3814 55 amd64_supply_native_gregset (regcache, &regs, -1);
cced5e27
MK
56 if (regnum != -1)
57 return;
58 }
59
f8028488 60 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
61 {
62 struct fpreg fpregs;
63
dfd4cc63 64 if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid),
9f8e0089 65 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 66 perror_with_name (_("Couldn't get floating point status"));
cced5e27 67
56be3814 68 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
69 }
70}
71
72/* Store register REGNUM back into the inferior. If REGNUM is -1, do
73 this for all registers (including the floating-point registers). */
74
6a5c78a3 75static void
28439f5e
PA
76amd64bsd_store_inferior_registers (struct target_ops *ops,
77 struct regcache *regcache, int regnum)
cced5e27 78{
f8028488
MD
79 struct gdbarch *gdbarch = get_regcache_arch (regcache);
80
81 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
82 {
83 struct reg regs;
84
dfd4cc63 85 if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
9f8e0089 86 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 87 perror_with_name (_("Couldn't get registers"));
cced5e27 88
56be3814 89 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27 90
dfd4cc63 91 if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
9f8e0089 92 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 93 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
94
95 if (regnum != -1)
96 return;
97 }
98
f8028488 99 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
100 {
101 struct fpreg fpregs;
102
dfd4cc63 103 if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid),
9f8e0089 104 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 105 perror_with_name (_("Couldn't get floating point status"));
cced5e27 106
56be3814 107 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27 108
dfd4cc63 109 if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid),
9f8e0089 110 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 111 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
112 }
113}
6a5c78a3
MK
114
115/* Create a prototype *BSD/amd64 target. The client can override it
116 with local methods. */
117
118struct target_ops *
119amd64bsd_target (void)
120{
121 struct target_ops *t;
122
123 t = inf_ptrace_target ();
124 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
125 t->to_store_registers = amd64bsd_store_inferior_registers;
126 return t;
127}
1916efaf
PA
128\f
129
130/* Support for debug registers. */
131
132#ifdef HAVE_PT_GETDBREGS
133
134static unsigned long
135amd64bsd_dr_get (ptid_t ptid, int regnum)
136{
137 struct dbreg dbregs;
138
dfd4cc63 139 if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid),
1916efaf
PA
140 (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
141 perror_with_name (_("Couldn't read debug registers"));
142
143 return DBREG_DRX ((&dbregs), regnum);
144}
145
146static void
147amd64bsd_dr_set (int regnum, unsigned long value)
148{
149 struct dbreg dbregs;
150
dfd4cc63 151 if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid),
1916efaf
PA
152 (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
153 perror_with_name (_("Couldn't get debug registers"));
154
155 /* For some mysterious reason, some of the reserved bits in the
156 debug control register get set. Mask these off, otherwise the
157 ptrace call below will fail. */
158 DBREG_DRX ((&dbregs), 7) &= ~(0xffffffff0000fc00);
159
160 DBREG_DRX ((&dbregs), regnum) = value;
161
dfd4cc63 162 if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid),
1916efaf
PA
163 (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
164 perror_with_name (_("Couldn't write debug registers"));
165}
166
167void
168amd64bsd_dr_set_control (unsigned long control)
169{
170 amd64bsd_dr_set (7, control);
171}
172
173void
174amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr)
175{
176 gdb_assert (regnum >= 0 && regnum <= 4);
177
178 amd64bsd_dr_set (regnum, addr);
179}
180
181CORE_ADDR
182amd64bsd_dr_get_addr (int regnum)
183{
184 return amd64bsd_dr_get (inferior_ptid, regnum);
185}
186
187unsigned long
188amd64bsd_dr_get_status (void)
189{
190 return amd64bsd_dr_get (inferior_ptid, 6);
191}
192
193unsigned long
194amd64bsd_dr_get_control (void)
195{
196 return amd64bsd_dr_get (inferior_ptid, 7);
197}
198
199#endif /* PT_GETDBREGS */
This page took 0.702631 seconds and 4 git commands to generate.