Update copyright year range in all GDB files
[deliverable/binutils-gdb.git] / gdb / amd64-bsd-nat.c
CommitLineData
cced5e27
MK
1/* Native-dependent code for AMD64 BSD's.
2
e2882c85 3 Copyright (C) 2003-2018 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"
03b62bbb 34#include "x86-bsd-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{
ac7936df 45 struct gdbarch *gdbarch = regcache->arch ();
49907934 46 pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
f8028488
MD
47
48 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
49 {
50 struct reg regs;
51
49907934 52 if (ptrace (PT_GETREGS, pid, (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
0aa37b65
JB
60#ifdef PT_GETFSBASE
61 if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM)
62 {
63 register_t base;
64
65 if (ptrace (PT_GETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
66 perror_with_name (_("Couldn't get segment register fs_base"));
67
68 regcache_raw_supply (regcache, AMD64_FSBASE_REGNUM, &base);
69 if (regnum != -1)
70 return;
71 }
72#endif
73#ifdef PT_GETGSBASE
74 if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM)
75 {
76 register_t base;
77
78 if (ptrace (PT_GETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
79 perror_with_name (_("Couldn't get segment register gs_base"));
80
81 regcache_raw_supply (regcache, AMD64_GSBASE_REGNUM, &base);
82 if (regnum != -1)
83 return;
84 }
85#endif
86
f8028488 87 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
88 {
89 struct fpreg fpregs;
97de3545 90#ifdef PT_GETXSTATE_INFO
21002a63 91 void *xstateregs;
97de3545 92
a3405d12 93 if (x86bsd_xsave_len != 0)
97de3545 94 {
a3405d12 95 xstateregs = alloca (x86bsd_xsave_len);
49907934
JB
96 if (ptrace (PT_GETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, 0)
97 == -1)
97de3545
JB
98 perror_with_name (_("Couldn't get extended state status"));
99
100 amd64_supply_xsave (regcache, -1, xstateregs);
101 return;
102 }
103#endif
cced5e27 104
49907934 105 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 106 perror_with_name (_("Couldn't get floating point status"));
cced5e27 107
56be3814 108 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
109 }
110}
111
112/* Store register REGNUM back into the inferior. If REGNUM is -1, do
113 this for all registers (including the floating-point registers). */
114
6a5c78a3 115static void
28439f5e
PA
116amd64bsd_store_inferior_registers (struct target_ops *ops,
117 struct regcache *regcache, int regnum)
cced5e27 118{
ac7936df 119 struct gdbarch *gdbarch = regcache->arch ();
49907934 120 pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
f8028488
MD
121
122 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
123 {
124 struct reg regs;
125
49907934 126 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 127 perror_with_name (_("Couldn't get registers"));
cced5e27 128
56be3814 129 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27 130
49907934 131 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 132 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
133
134 if (regnum != -1)
135 return;
136 }
137
0aa37b65
JB
138#ifdef PT_SETFSBASE
139 if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM)
140 {
141 register_t base;
142
143 regcache_raw_collect (regcache, AMD64_FSBASE_REGNUM, &base);
144
145 if (ptrace (PT_SETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
146 perror_with_name (_("Couldn't write segment register fs_base"));
147 if (regnum != -1)
148 return;
149 }
150#endif
151#ifdef PT_SETGSBASE
152 if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM)
153 {
154 register_t base;
155
156 regcache_raw_collect (regcache, AMD64_GSBASE_REGNUM, &base);
157
158 if (ptrace (PT_SETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1)
159 perror_with_name (_("Couldn't write segment register gs_base"));
160 if (regnum != -1)
161 return;
162 }
163#endif
164
f8028488 165 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
166 {
167 struct fpreg fpregs;
97de3545 168#ifdef PT_GETXSTATE_INFO
21002a63 169 void *xstateregs;
97de3545 170
a3405d12 171 if (x86bsd_xsave_len != 0)
97de3545 172 {
a3405d12 173 xstateregs = alloca (x86bsd_xsave_len);
49907934
JB
174 if (ptrace (PT_GETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, 0)
175 == -1)
97de3545
JB
176 perror_with_name (_("Couldn't get extended state status"));
177
178 amd64_collect_xsave (regcache, regnum, xstateregs, 0);
179
49907934
JB
180 if (ptrace (PT_SETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs,
181 x86bsd_xsave_len) == -1)
97de3545
JB
182 perror_with_name (_("Couldn't write extended state status"));
183 return;
184 }
185#endif
cced5e27 186
49907934 187 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 188 perror_with_name (_("Couldn't get floating point status"));
cced5e27 189
56be3814 190 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27 191
49907934 192 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 193 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
194 }
195}
6a5c78a3
MK
196
197/* Create a prototype *BSD/amd64 target. The client can override it
198 with local methods. */
199
200struct target_ops *
201amd64bsd_target (void)
202{
203 struct target_ops *t;
204
a3405d12 205 t = x86bsd_target ();
6a5c78a3
MK
206 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
207 t->to_store_registers = amd64bsd_store_inferior_registers;
208 return t;
209}
This page took 1.018333 seconds and 4 git commands to generate.