GDB (xrefs)
/tmp/gdb-8.1/gdb/x86-linux-nat.c
Go to the documentation of this file.
1 /* Native-dependent code for GNU/Linux x86 (i386 and x86-64).
2 
3  Copyright (C) 1999-2018 Free Software Foundation, Inc.
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
9  the Free Software Foundation; either version 3 of the License, or
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
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "inferior.h"
22 #include "elf/common.h"
23 #include "gdb_proc_service.h"
24 #include "nat/gdb_ptrace.h"
25 #include <sys/user.h>
26 #include <sys/procfs.h>
27 #include <sys/uio.h>
28 
29 #include "x86-nat.h"
30 #include "linux-nat.h"
31 #ifndef __x86_64__
32 #include "i386-linux-nat.h"
33 #endif
34 #include "x86-linux-nat.h"
35 #include "i386-linux-tdep.h"
36 #ifdef __x86_64__
37 #include "amd64-linux-tdep.h"
38 #endif
39 #include "x86-xstate.h"
40 #include "nat/linux-btrace.h"
41 #include "nat/linux-nat.h"
42 #include "nat/x86-linux.h"
43 #include "nat/x86-linux-dregs.h"
44 #include "nat/linux-ptrace.h"
45 
46 /* linux_nat_new_fork hook. */
47 
48 static void
49 x86_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
50 {
51  pid_t parent_pid;
52  struct x86_debug_reg_state *parent_state;
53  struct x86_debug_reg_state *child_state;
54 
55  /* NULL means no watchpoint has ever been set in the parent. In
56  that case, there's nothing to do. */
57  if (parent->arch_private == NULL)
58  return;
59 
60  /* Linux kernel before 2.6.33 commit
61  72f674d203cd230426437cdcf7dd6f681dad8b0d
62  will inherit hardware debug registers from parent
63  on fork/vfork/clone. Newer Linux kernels create such tasks with
64  zeroed debug registers.
65 
66  GDB core assumes the child inherits the watchpoints/hw
67  breakpoints of the parent, and will remove them all from the
68  forked off process. Copy the debug registers mirrors into the
69  new process so that all breakpoints and watchpoints can be
70  removed together. The debug registers mirror will become zeroed
71  in the end before detaching the forked off process, thus making
72  this compatible with older Linux kernels too. */
73 
74  parent_pid = ptid_get_pid (parent->ptid);
75  parent_state = x86_debug_reg_state (parent_pid);
76  child_state = x86_debug_reg_state (child_pid);
77  *child_state = *parent_state;
78 }
79 
80 
81 static void (*super_post_startup_inferior) (struct target_ops *self,
82  ptid_t ptid);
83 
84 static void
86 {
88  super_post_startup_inferior (self, ptid);
89 }
90 
91 #ifdef __x86_64__
92 /* Value of CS segment register:
93  64bit process: 0x33
94  32bit process: 0x23 */
95 #define AMD64_LINUX_USER64_CS 0x33
96 
97 /* Value of DS segment register:
98  LP64 process: 0x0
99  X32 process: 0x2b */
100 #define AMD64_LINUX_X32_DS 0x2b
101 #endif
102 
103 /* Get Linux/x86 target description from running target. */
104 
105 static const struct target_desc *
107 {
108  int tid;
109  int is_64bit = 0;
110 #ifdef __x86_64__
111  int is_x32;
112 #endif
113  static uint64_t xcr0;
114  uint64_t xcr0_features_bits;
115 
116  /* GNU/Linux LWP ID's are process ID's. */
118  if (tid == 0)
119  tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */
120 
121 #ifdef __x86_64__
122  {
123  unsigned long cs;
124  unsigned long ds;
125 
126  /* Get CS register. */
127  errno = 0;
128  cs = ptrace (PTRACE_PEEKUSER, tid,
129  offsetof (struct user_regs_struct, cs), 0);
130  if (errno != 0)
131  perror_with_name (_("Couldn't get CS register"));
132 
133  is_64bit = cs == AMD64_LINUX_USER64_CS;
134 
135  /* Get DS register. */
136  errno = 0;
137  ds = ptrace (PTRACE_PEEKUSER, tid,
138  offsetof (struct user_regs_struct, ds), 0);
139  if (errno != 0)
140  perror_with_name (_("Couldn't get DS register"));
141 
142  is_x32 = ds == AMD64_LINUX_X32_DS;
143 
144  if (sizeof (void *) == 4 && is_64bit && !is_x32)
145  error (_("Can't debug 64-bit process with 32-bit GDB"));
146  }
147 #elif HAVE_PTRACE_GETFPXREGS
148  if (have_ptrace_getfpxregs == -1)
149  {
150  elf_fpxregset_t fpxregs;
151 
152  if (ptrace (PTRACE_GETFPXREGS, tid, 0, (int) &fpxregs) < 0)
153  {
157  }
158  }
159 #endif
160 
162  {
163  uint64_t xstateregs[(X86_XSTATE_SSE_SIZE / sizeof (uint64_t))];
164  struct iovec iov;
165 
166  iov.iov_base = xstateregs;
167  iov.iov_len = sizeof (xstateregs);
168 
169  /* Check if PTRACE_GETREGSET works. */
171  (unsigned int) NT_X86_XSTATE, &iov) < 0)
173  else
174  {
176 
177  /* Get XCR0 from XSAVE extended state. */
178  xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET
179  / sizeof (uint64_t))];
180  }
181  }
182 
183  /* Check the native XCR0 only if PTRACE_GETREGSET is available. If
184  PTRACE_GETREGSET is not available then set xcr0_features_bits to
185  zero so that the "no-features" descriptions are returned by the
186  switches below. */
188  xcr0_features_bits = xcr0 & X86_XSTATE_ALL_MASK;
189  else
190  xcr0_features_bits = 0;
191 
192  if (is_64bit)
193  {
194 #ifdef __x86_64__
195  return amd64_linux_read_description (xcr0_features_bits, is_x32);
196 #endif
197  }
198  else
199  {
200  const struct target_desc * tdesc
201  = i386_linux_read_description (xcr0_features_bits);
202 
203  if (tdesc == NULL)
205 
206  return tdesc;
207  }
208 
209  gdb_assert_not_reached ("failed to return tdesc");
210 }
211 
212 
213 /* Enable branch tracing. */
214 
215 static struct btrace_target_info *
217  const struct btrace_config *conf)
218 {
219  struct btrace_target_info *tinfo;
220 
221  errno = 0;
222  tinfo = linux_enable_btrace (ptid, conf);
223 
224  if (tinfo == NULL)
225  error (_("Could not enable branch tracing for %s: %s."),
227 
228  return tinfo;
229 }
230 
231 /* Disable branch tracing. */
232 
233 static void
235  struct btrace_target_info *tinfo)
236 {
237  enum btrace_error errcode = linux_disable_btrace (tinfo);
238 
239  if (errcode != BTRACE_ERR_NONE)
240  error (_("Could not disable branch tracing."));
241 }
242 
243 /* Teardown branch tracing. */
244 
245 static void
247  struct btrace_target_info *tinfo)
248 {
249  /* Ignore errors. */
250  linux_disable_btrace (tinfo);
251 }
252 
253 static enum btrace_error
255  struct btrace_data *data,
256  struct btrace_target_info *btinfo,
257  enum btrace_read_type type)
258 {
259  return linux_read_btrace (data, btinfo, type);
260 }
261 
262 /* See to_btrace_conf in target.h. */
263 
264 static const struct btrace_config *
266  const struct btrace_target_info *btinfo)
267 {
268  return linux_btrace_conf (btinfo);
269 }
270 
271 
272 
273 /* Helper for ps_get_thread_area. Sets BASE_ADDR to a pointer to
274  the thread local storage (or its descriptor) and returns PS_OK
275  on success. Returns PS_ERR on failure. */
276 
277 ps_err_e
278 x86_linux_get_thread_area (pid_t pid, void *addr, unsigned int *base_addr)
279 {
280  /* NOTE: cagney/2003-08-26: The definition of this buffer is found
281  in the kernel header <asm-i386/ldt.h>. It, after padding, is 4 x
282  4 byte integers in size: `entry_number', `base_addr', `limit',
283  and a bunch of status bits.
284 
285  The values returned by this ptrace call should be part of the
286  regcache buffer, and ps_get_thread_area should channel its
287  request through the regcache. That way remote targets could
288  provide the value using the remote protocol and not this direct
289  call.
290 
291  Is this function needed? I'm guessing that the `base' is the
292  address of a descriptor that libthread_db uses to find the
293  thread local address base that GDB needs. Perhaps that
294  descriptor is defined by the ABI. Anyway, given that
295  libthread_db calls this function without prompting (gdb
296  requesting tls base) I guess it needs info in there anyway. */
297  unsigned int desc[4];
298 
299  /* This code assumes that "int" is 32 bits and that
300  GET_THREAD_AREA returns no more than 4 int values. */
301  gdb_assert (sizeof (int) == 4);
302 
303 #ifndef PTRACE_GET_THREAD_AREA
304 #define PTRACE_GET_THREAD_AREA 25
305 #endif
306 
307  if (ptrace (PTRACE_GET_THREAD_AREA, pid, addr, &desc) < 0)
308  return PS_ERR;
309 
310  *base_addr = desc[1];
311  return PS_OK;
312 }
313 
314 
315 /* Create an x86 GNU/Linux target. */
316 
317 struct target_ops *
319 {
320  /* Fill in the generic GNU/Linux methods. */
321  struct target_ops *t = linux_target ();
322 
323  /* Initialize the debug register function vectors. */
330  x86_set_debug_register_length (sizeof (void *));
331 
332  /* Override the GNU/Linux inferior startup hook. */
335 
336  /* Add the description reader. */
338 
339  /* Add btrace methods. */
346 
347  return t;
348 }
349 
350 /* Add an x86 GNU/Linux target. */
351 
352 void
354 {
361 }
struct x86_debug_reg_state * x86_debug_reg_state(pid_t pid)
Definition: x86-nat.c:105
struct arch_lwp_info * arch_private
Definition: linux-nat.h:102
unsigned long x86_linux_dr_get_status(void)
static constexpr ptid_t tid
const struct target_desc *(* to_read_description)(struct target_ops *ops) TARGET_DEFAULT_RETURN(NULL)
Definition: target.h:790
static const struct btrace_config * x86_linux_btrace_conf(struct target_ops *self, const struct btrace_target_info *btinfo)
const struct target_desc * i386_linux_read_description(uint64_t xcr0)
#define X86_XSTATE_SSE_MASK
Definition: x86-xstate.h:42
int ptid_get_pid(const ptid_t &ptid)
Definition: ptid.c:47
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
Definition: gnu-nat.c:1824
void linux_nat_set_new_thread(struct target_ops *t, void(*new_thread)(struct lwp_info *))
Definition: linux-nat.c:4873
ptid_t ptid
Definition: linux-nat.h:34
static void x86_linux_disable_btrace(struct target_ops *self, struct btrace_target_info *tinfo)
static void(* super_post_startup_inferior)(struct target_ops *self, ptid_t ptid)
Definition: x86-linux-nat.c:81
struct target_ops * x86_linux_create_target(void)
ps_err_e
ps_err_e x86_linux_get_thread_area(pid_t pid, void *addr, unsigned int *base_addr)
enum btrace_error linux_read_btrace(struct btrace_data *btrace, struct btrace_target_info *tinfo, enum btrace_read_type type)
#define _(String)
Definition: gdb_locale.h:35
void(* set_control)(unsigned long)
Definition: x86-dregs.h:44
int have_ptrace_getfpxregs
#define PTRACE_GET_THREAD_AREA
void x86_linux_dr_set_control(unsigned long control)
struct x86_dr_low_type x86_dr_low
Definition: x86-nat.c:37
void linux_nat_set_new_fork(struct target_ops *t, linux_nat_new_fork_ftype *new_fork)
Definition: linux-nat.c:4896
CORE_ADDR(* get_addr)(int)
Definition: x86-dregs.h:52
PTRACE_TYPE_RET ptrace()
void x86_linux_new_thread(struct lwp_info *lwp)
Definition: x86-linux.c:63
int linux_supports_btrace(struct target_ops *ops, enum btrace_format format)
void(* set_addr)(int, CORE_ADDR)
Definition: x86-dregs.h:48
enum tribool have_ptrace_getregset
Definition: linux-nat.c:190
unsigned long(* get_status)(void)
Definition: x86-dregs.h:56
Definition: ptid.h:35
#define X86_XSTATE_SSE_SIZE
Definition: x86-xstate.h:53
#define gdb_assert_not_reached(message)
Definition: gdb_assert.h:55
const struct btrace_config * linux_btrace_conf(const struct btrace_target_info *tinfo)
btrace_read_type
void linux_nat_set_prepare_to_resume(struct target_ops *t, void(*prepare_to_resume)(struct lwp_info *))
Definition: linux-nat.c:4938
struct btrace_target_info *(* to_enable_btrace)(struct target_ops *, ptid_t ptid, const struct btrace_config *conf) TARGET_DEFAULT_NORETURN(tcomplain())
Definition: target.h:1118
Definition: gdbtypes.h:749
static const struct target_desc * x86_linux_read_description(struct target_ops *ops)
void x86_linux_add_target(struct target_ops *t)
void linux_nat_add_target(struct target_ops *t)
Definition: linux-nat.c:4804
static enum btrace_error x86_linux_read_btrace(struct target_ops *self, struct btrace_data *data, struct btrace_target_info *btinfo, enum btrace_read_type type)
const struct btrace_config *(* to_btrace_conf)(struct target_ops *self, const struct btrace_target_info *) TARGET_DEFAULT_RETURN(NULL)
Definition: target.h:1145
btrace_error
void x86_linux_dr_set_addr(int regnum, CORE_ADDR addr)
struct btrace_config conf
Definition: linux-btrace.h:91
const target_desc * amd64_linux_read_description(uint64_t xcr0_features_bit, bool is_x32)
struct target_ops * linux_target(void)
Definition: linux-nat.c:4377
long ptid_get_lwp(const ptid_t &ptid)
Definition: ptid.c:55
unsigned long(* get_control)(void)
Definition: x86-dregs.h:60
#define PTRACE_GETREGSET
Definition: linux-ptrace.h:47
#define gdb_assert(expr)
Definition: gdb_assert.h:32
CORE_ADDR x86_linux_dr_get_addr(int regnum)
enum btrace_error(* to_read_btrace)(struct target_ops *self, struct btrace_data *data, struct btrace_target_info *btinfo, enum btrace_read_type type) TARGET_DEFAULT_NORETURN(tcomplain())
Definition: target.h:1138
#define X86_XSTATE_X87_MASK
Definition: x86-xstate.h:41
void x86_forget_process(pid_t pid)
Definition: x86-nat.c:113
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
Definition: utils.c:692
void x86_linux_delete_thread(struct arch_lwp_info *arch_lwp)
Definition: x86-linux.c:71
void(* to_teardown_btrace)(struct target_ops *, struct btrace_target_info *tinfo) TARGET_DEFAULT_NORETURN(tcomplain())
Definition: target.h:1132
enum btrace_error linux_disable_btrace(struct btrace_target_info *tinfo)
ptid_t inferior_ptid
Definition: infcmd.c:94
char * safe_strerror(int)
const char * target_pid_to_str(ptid_t ptid)
Definition: target.c:2194
unsigned long x86_linux_dr_get_control(void)
static void x86_linux_teardown_btrace(struct target_ops *self, struct btrace_target_info *tinfo)
static void x86_linux_new_fork(struct lwp_info *parent, pid_t child_pid)
Definition: x86-linux-nat.c:49
void x86_set_debug_register_length(int len)
Definition: x86-nat.c:303
void x86_use_watchpoints(struct target_ops *t)
Definition: x86-nat.c:285
struct btrace_target_info * linux_enable_btrace(ptid_t ptid, const struct btrace_config *conf)
#define I386_LINUX_XSAVE_XCR0_OFFSET
void linux_nat_set_forget_process(struct target_ops *t, linux_nat_forget_process_ftype *fn)
Definition: linux-nat.c:4906
int(* to_supports_btrace)(struct target_ops *, enum btrace_format) TARGET_DEFAULT_RETURN(0)
Definition: target.h:1112
void x86_cleanup_dregs(void)
Definition: x86-nat.c:139
void linux_nat_set_delete_thread(struct target_ops *t, void(*delete_thread)(struct arch_lwp_info *))
Definition: linux-nat.c:4884
void(* to_disable_btrace)(struct target_ops *, struct btrace_target_info *tinfo) TARGET_DEFAULT_NORETURN(tcomplain())
Definition: target.h:1124
void error(const char *fmt,...)
Definition: errors.c:38
void x86_linux_prepare_to_resume(struct lwp_info *lwp)
Definition: x86-linux.c:79
static struct btrace_target_info * x86_linux_enable_btrace(struct target_ops *self, ptid_t ptid, const struct btrace_config *conf)
static void x86_linux_child_post_startup_inferior(struct target_ops *self, ptid_t ptid)
Definition: x86-linux-nat.c:85
void(* to_post_startup_inferior)(struct target_ops *, ptid_t) TARGET_DEFAULT_IGNORE()
Definition: target.h:582
#define X86_XSTATE_ALL_MASK
Definition: x86-xstate.h:50