Include the fs_base and gs_base registers in amd64 target descriptions.
[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 45 struct gdbarch *gdbarch = get_regcache_arch (regcache);
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
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);
49907934
JB
69 if (ptrace (PT_GETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, 0)
70 == -1)
97de3545
JB
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
49907934 78 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 79 perror_with_name (_("Couldn't get floating point status"));
cced5e27 80
56be3814 81 amd64_supply_fxsave (regcache, -1, &fpregs);
cced5e27
MK
82 }
83}
84
85/* Store register REGNUM back into the inferior. If REGNUM is -1, do
86 this for all registers (including the floating-point registers). */
87
6a5c78a3 88static void
28439f5e
PA
89amd64bsd_store_inferior_registers (struct target_ops *ops,
90 struct regcache *regcache, int regnum)
cced5e27 91{
f8028488 92 struct gdbarch *gdbarch = get_regcache_arch (regcache);
49907934 93 pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache));
f8028488
MD
94
95 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
96 {
97 struct reg regs;
98
49907934 99 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 100 perror_with_name (_("Couldn't get registers"));
cced5e27 101
56be3814 102 amd64_collect_native_gregset (regcache, &regs, regnum);
cced5e27 103
49907934 104 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
edefbb7c 105 perror_with_name (_("Couldn't write registers"));
cced5e27
MK
106
107 if (regnum != -1)
108 return;
109 }
110
f8028488 111 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
cced5e27
MK
112 {
113 struct fpreg fpregs;
97de3545 114#ifdef PT_GETXSTATE_INFO
21002a63 115 void *xstateregs;
97de3545 116
a3405d12 117 if (x86bsd_xsave_len != 0)
97de3545 118 {
a3405d12 119 xstateregs = alloca (x86bsd_xsave_len);
49907934
JB
120 if (ptrace (PT_GETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, 0)
121 == -1)
97de3545
JB
122 perror_with_name (_("Couldn't get extended state status"));
123
124 amd64_collect_xsave (regcache, regnum, xstateregs, 0);
125
49907934
JB
126 if (ptrace (PT_SETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs,
127 x86bsd_xsave_len) == -1)
97de3545
JB
128 perror_with_name (_("Couldn't write extended state status"));
129 return;
130 }
131#endif
cced5e27 132
49907934 133 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 134 perror_with_name (_("Couldn't get floating point status"));
cced5e27 135
56be3814 136 amd64_collect_fxsave (regcache, regnum, &fpregs);
cced5e27 137
49907934 138 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 139 perror_with_name (_("Couldn't write floating point status"));
cced5e27
MK
140 }
141}
6a5c78a3
MK
142
143/* Create a prototype *BSD/amd64 target. The client can override it
144 with local methods. */
145
146struct target_ops *
147amd64bsd_target (void)
148{
149 struct target_ops *t;
150
a3405d12 151 t = x86bsd_target ();
6a5c78a3
MK
152 t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
153 t->to_store_registers = amd64bsd_store_inferior_registers;
154 return t;
155}
This page took 0.818848 seconds and 4 git commands to generate.