dwarf2read.c: C++fy lnp_state_machine
[deliverable/binutils-gdb.git] / gdb / amd64-bsd-nat.c
CommitLineData
cced5e27
MK
1/* Native-dependent code for AMD64 BSD's.
2
61baf725 3 Copyright (C) 2003-2017 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{
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
94309df7 51 if (ptrace (PT_GETREGS, get_ptrace_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;
97de3545 63#ifdef PT_GETXSTATE_INFO
21002a63 64 void *xstateregs;
97de3545 65
a3405d12 66 if (x86bsd_xsave_len != 0)
97de3545 67 {
a3405d12 68 xstateregs = alloca (x86bsd_xsave_len);
94309df7 69 if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
97de3545
JB
70 (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
71 perror_with_name (_("Couldn't get extended state status"));
72
73 amd64_supply_xsave (regcache, -1, xstateregs);
74 return;
75 }
76#endif
cced5e27 77
94309df7 78 if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 79 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 80 perror_with_name (_("Couldn't get floating point status"));
cced5e27 81
56be3814 82 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
83 }
84}
85
86/* Store register REGNUM back into the inferior. If REGNUM is -1, do
87 this for all registers (including the floating-point registers). */
88
6a5c78a3 89static void
28439f5e
PA
90amd64bsd_store_inferior_registers (struct target_ops *ops,
91 struct regcache *regcache, int regnum)
cced5e27 92{
f8028488
MD
93 struct gdbarch *gdbarch = get_regcache_arch (regcache);
94
95 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
96 {
97 struct reg regs;
98
94309df7 99 if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 100 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 101 perror_with_name (_("Couldn't get registers"));
cced5e27 102
56be3814 103 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27 104
94309df7 105 if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 106 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 107 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
108
109 if (regnum != -1)
110 return;
111 }
112
f8028488 113 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
114 {
115 struct fpreg fpregs;
97de3545 116#ifdef PT_GETXSTATE_INFO
21002a63 117 void *xstateregs;
97de3545 118
a3405d12 119 if (x86bsd_xsave_len != 0)
97de3545 120 {
a3405d12 121 xstateregs = alloca (x86bsd_xsave_len);
94309df7 122 if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
97de3545
JB
123 (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
124 perror_with_name (_("Couldn't get extended state status"));
125
126 amd64_collect_xsave (regcache, regnum, xstateregs, 0);
127
94309df7 128 if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid),
a3405d12 129 (PTRACE_TYPE_ARG3) xstateregs, x86bsd_xsave_len) == -1)
97de3545
JB
130 perror_with_name (_("Couldn't write extended state status"));
131 return;
132 }
133#endif
cced5e27 134
94309df7 135 if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 136 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 137 perror_with_name (_("Couldn't get floating point status"));
cced5e27 138
56be3814 139 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27 140
94309df7 141 if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid),
9f8e0089 142 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 143 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
144 }
145}
6a5c78a3
MK
146
147/* Create a prototype *BSD/amd64 target. The client can override it
148 with local methods. */
149
150struct target_ops *
151amd64bsd_target (void)
152{
153 struct target_ops *t;
154
a3405d12 155 t = x86bsd_target ();
6a5c78a3
MK
156 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
157 t->to_store_registers = amd64bsd_store_inferior_registers;
158 return t;
159}
This page took 0.833287 seconds and 4 git commands to generate.