windows-nat: Don't change current_event.dwThreadId in handle_output_debug_string()
[deliverable/binutils-gdb.git] / gdb / amd64-linux-nat.c
CommitLineData
a4b6fc86 1/* Native-dependent code for GNU/Linux x86-64.
0a65a603 2
32d0add0 3 Copyright (C) 2001-2015 Free Software Foundation, Inc.
53e95fcf
JS
4 Contributed by Jiri Smid, SuSE Labs.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
53e95fcf
JS
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
53e95fcf
JS
20
21#include "defs.h"
22#include "inferior.h"
53e95fcf 23#include "regcache.h"
a055a187 24#include "elf/common.h"
35782f14 25#include <sys/uio.h>
53e95fcf 26#include <sys/ptrace.h>
c43af07c 27#include <asm/prctl.h>
33a0a2ac 28#include <sys/reg.h>
c4f35dd8 29#include "gregset.h"
3116063b 30#include "gdb_proc_service.h"
c4f35dd8 31
3116063b
GB
32#include "amd64-nat.h"
33#include "linux-nat.h"
9c1488cb 34#include "amd64-tdep.h"
3116063b 35#include "amd64-linux-tdep.h"
60fac5b8 36#include "i386-linux-tdep.h"
df7e5265 37#include "x86-xstate.h"
a055a187 38
040baaf6 39#include "x86-linux-nat.h"
60fac5b8 40
60fac5b8
MK
41/* Mapping between the general-purpose registers in GNU/Linux x86-64
42 `struct user' format and GDB's register cache layout for GNU/Linux
43 i386.
44
45 Note that most GNU/Linux x86-64 registers are 64-bit, while the
46 GNU/Linux i386 registers are all 32-bit, but since we're
47 little-endian we get away with that. */
48
49/* From <sys/reg.h> on GNU/Linux i386. */
430eaf2e 50static int amd64_linux_gregset32_reg_offset[] =
60fac5b8 51{
f5859b4d
MK
52 RAX * 8, RCX * 8, /* %eax, %ecx */
53 RDX * 8, RBX * 8, /* %edx, %ebx */
54 RSP * 8, RBP * 8, /* %esp, %ebp */
55 RSI * 8, RDI * 8, /* %esi, %edi */
56 RIP * 8, EFLAGS * 8, /* %eip, %eflags */
57 CS * 8, SS * 8, /* %cs, %ss */
58 DS * 8, ES * 8, /* %ds, %es */
59 FS * 8, GS * 8, /* %fs, %gs */
60fac5b8
MK
60 -1, -1, -1, -1, -1, -1, -1, -1,
61 -1, -1, -1, -1, -1, -1, -1, -1,
62 -1, -1, -1, -1, -1, -1, -1, -1, -1,
a055a187 63 -1, -1, -1, -1, -1, -1, -1, -1,
01f9f808
MS
64 -1, -1, -1, -1, /* MPX registers BND0 ... BND3. */
65 -1, -1, /* MPX registers BNDCFGU, BNDSTATUS. */
66 -1, -1, -1, -1, -1, -1, -1, -1, /* k0 ... k7 (AVX512) */
67 -1, -1, -1, -1, -1, -1, -1, -1, /* zmm0 ... zmm7 (AVX512) */
68 ORIG_RAX * 8 /* "orig_eax" */
60fac5b8 69};
53e95fcf
JS
70\f
71
72/* Transfering the general-purpose registers between GDB, inferiors
73 and core files. */
74
60fac5b8 75/* Fill GDB's register cache with the general-purpose register values
53e95fcf
JS
76 in *GREGSETP. */
77
78void
7f7fe91e 79supply_gregset (struct regcache *regcache, const elf_gregset_t *gregsetp)
53e95fcf 80{
7f7fe91e 81 amd64_supply_native_gregset (regcache, gregsetp, -1);
53e95fcf
JS
82}
83
60fac5b8
MK
84/* Fill register REGNUM (if it is a general-purpose register) in
85 *GREGSETP with the value in GDB's register cache. If REGNUM is -1,
53e95fcf
JS
86 do this for all registers. */
87
88void
7f7fe91e
UW
89fill_gregset (const struct regcache *regcache,
90 elf_gregset_t *gregsetp, int regnum)
53e95fcf 91{
7f7fe91e 92 amd64_collect_native_gregset (regcache, gregsetp, regnum);
53e95fcf
JS
93}
94
53e95fcf
JS
95/* Transfering floating-point registers between GDB, inferiors and cores. */
96
60fac5b8 97/* Fill GDB's register cache with the floating-point and SSE register
c4f35dd8 98 values in *FPREGSETP. */
53e95fcf
JS
99
100void
7f7fe91e 101supply_fpregset (struct regcache *regcache, const elf_fpregset_t *fpregsetp)
53e95fcf 102{
7f7fe91e 103 amd64_supply_fxsave (regcache, -1, fpregsetp);
53e95fcf
JS
104}
105
8dda9770 106/* Fill register REGNUM (if it is a floating-point or SSE register) in
60fac5b8 107 *FPREGSETP with the value in GDB's register cache. If REGNUM is
c4f35dd8 108 -1, do this for all registers. */
53e95fcf
JS
109
110void
7f7fe91e
UW
111fill_fpregset (const struct regcache *regcache,
112 elf_fpregset_t *fpregsetp, int regnum)
53e95fcf 113{
7f7fe91e 114 amd64_collect_fxsave (regcache, regnum, fpregsetp);
53e95fcf 115}
53e95fcf
JS
116\f
117
118/* Transferring arbitrary registers between GDB and inferior. */
119
60fac5b8 120/* Fetch register REGNUM from the child process. If REGNUM is -1, do
53e95fcf
JS
121 this for all registers (including the floating point and SSE
122 registers). */
123
10d6c8cd 124static void
28439f5e
PA
125amd64_linux_fetch_inferior_registers (struct target_ops *ops,
126 struct regcache *regcache, int regnum)
53e95fcf 127{
f8028488 128 struct gdbarch *gdbarch = get_regcache_arch (regcache);
53e95fcf
JS
129 int tid;
130
a4b6fc86 131 /* GNU/Linux LWP ID's are process ID's. */
dfd4cc63 132 tid = ptid_get_lwp (inferior_ptid);
c4f35dd8 133 if (tid == 0)
dfd4cc63 134 tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */
53e95fcf 135
f8028488 136 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
53e95fcf 137 {
99679982
MK
138 elf_gregset_t regs;
139
140 if (ptrace (PTRACE_GETREGS, tid, 0, (long) &regs) < 0)
edefbb7c 141 perror_with_name (_("Couldn't get registers"));
99679982 142
56be3814 143 amd64_supply_native_gregset (regcache, &regs, -1);
60fac5b8
MK
144 if (regnum != -1)
145 return;
53e95fcf
JS
146 }
147
f8028488 148 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
53e95fcf 149 {
99679982 150 elf_fpregset_t fpregs;
53e95fcf 151
a055a187
L
152 if (have_ptrace_getregset)
153 {
df7e5265 154 char xstateregs[X86_XSTATE_MAX_SIZE];
a055a187
L
155 struct iovec iov;
156
157 iov.iov_base = xstateregs;
158 iov.iov_len = sizeof (xstateregs);
159 if (ptrace (PTRACE_GETREGSET, tid,
160 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
161 perror_with_name (_("Couldn't get extended state status"));
99679982 162
a055a187
L
163 amd64_supply_xsave (regcache, -1, xstateregs);
164 }
165 else
166 {
167 if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
168 perror_with_name (_("Couldn't get floating point status"));
169
170 amd64_supply_fxsave (regcache, -1, &fpregs);
171 }
99679982 172 }
53e95fcf
JS
173}
174
60fac5b8
MK
175/* Store register REGNUM back into the child process. If REGNUM is
176 -1, do this for all registers (including the floating-point and SSE
53e95fcf 177 registers). */
c4f35dd8 178
10d6c8cd 179static void
28439f5e
PA
180amd64_linux_store_inferior_registers (struct target_ops *ops,
181 struct regcache *regcache, int regnum)
53e95fcf 182{
f8028488 183 struct gdbarch *gdbarch = get_regcache_arch (regcache);
53e95fcf
JS
184 int tid;
185
a4b6fc86 186 /* GNU/Linux LWP ID's are process ID's. */
dfd4cc63 187 tid = ptid_get_lwp (inferior_ptid);
c4f35dd8 188 if (tid == 0)
dfd4cc63 189 tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */
53e95fcf 190
f8028488 191 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
53e95fcf 192 {
99679982
MK
193 elf_gregset_t regs;
194
195 if (ptrace (PTRACE_GETREGS, tid, 0, (long) &regs) < 0)
edefbb7c 196 perror_with_name (_("Couldn't get registers"));
99679982 197
56be3814 198 amd64_collect_native_gregset (regcache, &regs, regnum);
99679982
MK
199
200 if (ptrace (PTRACE_SETREGS, tid, 0, (long) &regs) < 0)
edefbb7c 201 perror_with_name (_("Couldn't write registers"));
99679982 202
60fac5b8
MK
203 if (regnum != -1)
204 return;
53e95fcf
JS
205 }
206
f8028488 207 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
53e95fcf 208 {
99679982
MK
209 elf_fpregset_t fpregs;
210
a055a187
L
211 if (have_ptrace_getregset)
212 {
df7e5265 213 char xstateregs[X86_XSTATE_MAX_SIZE];
a055a187
L
214 struct iovec iov;
215
216 iov.iov_base = xstateregs;
217 iov.iov_len = sizeof (xstateregs);
218 if (ptrace (PTRACE_GETREGSET, tid,
219 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
220 perror_with_name (_("Couldn't get extended state status"));
99679982 221
a055a187
L
222 amd64_collect_xsave (regcache, regnum, xstateregs, 0);
223
224 if (ptrace (PTRACE_SETREGSET, tid,
225 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
226 perror_with_name (_("Couldn't write extended state status"));
227 }
228 else
229 {
230 if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
231 perror_with_name (_("Couldn't get floating point status"));
99679982 232
a055a187 233 amd64_collect_fxsave (regcache, regnum, &fpregs);
99679982 234
a055a187
L
235 if (ptrace (PTRACE_SETFPREGS, tid, 0, (long) &fpregs) < 0)
236 perror_with_name (_("Couldn't write floating point status"));
237 }
53e95fcf 238 }
53e95fcf
JS
239}
240\f
1aa7e42c 241
50d71875
AC
242/* This function is called by libthread_db as part of its handling of
243 a request for a thread's local storage address. */
244
5bca7895 245ps_err_e
c43af07c
EZ
246ps_get_thread_area (const struct ps_prochandle *ph,
247 lwpid_t lwpid, int idx, void **base)
248{
f5656ead 249 if (gdbarch_bfd_arch_info (target_gdbarch ())->bits_per_word == 32)
50d71875 250 {
8c420b8d
GB
251 unsigned int base_addr;
252 ps_err_e result;
253
254 result = x86_linux_get_thread_area (lwpid, (void *) (long) idx,
255 &base_addr);
256 if (result == PS_OK)
257 {
258 /* Extend the value to 64 bits. Here it's assumed that
259 a "long" and a "void *" are the same. */
260 (*base) = (void *) (long) base_addr;
261 }
262 return result;
50d71875
AC
263 }
264 else
265 {
266 /* This definition comes from prctl.h, but some kernels may not
267 have it. */
c43af07c
EZ
268#ifndef PTRACE_ARCH_PRCTL
269#define PTRACE_ARCH_PRCTL 30
270#endif
50d71875
AC
271 /* FIXME: ezannoni-2003-07-09 see comment above about include
272 file order. We could be getting bogus values for these two. */
273 gdb_assert (FS < ELF_NGREG);
274 gdb_assert (GS < ELF_NGREG);
275 switch (idx)
276 {
277 case FS:
6fea9e18
L
278#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
279 {
280 /* PTRACE_ARCH_PRCTL is obsolete since 2.6.25, where the
281 fs_base and gs_base fields of user_regs_struct can be
282 used directly. */
283 unsigned long fs;
284 errno = 0;
285 fs = ptrace (PTRACE_PEEKUSER, lwpid,
286 offsetof (struct user_regs_struct, fs_base), 0);
287 if (errno == 0)
288 {
289 *base = (void *) fs;
290 return PS_OK;
291 }
292 }
293#endif
50d71875
AC
294 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
295 return PS_OK;
296 break;
297 case GS:
6fea9e18
L
298#ifdef HAVE_STRUCT_USER_REGS_STRUCT_GS_BASE
299 {
300 unsigned long gs;
301 errno = 0;
302 gs = ptrace (PTRACE_PEEKUSER, lwpid,
303 offsetof (struct user_regs_struct, gs_base), 0);
304 if (errno == 0)
305 {
306 *base = (void *) gs;
307 return PS_OK;
308 }
309 }
310#endif
50d71875
AC
311 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
312 return PS_OK;
313 break;
314 default: /* Should not happen. */
315 return PS_BADADDR;
316 }
c43af07c 317 }
b6d42148 318 return PS_ERR; /* ptrace failed. */
c43af07c 319}
5bca7895 320\f
c43af07c 321
5b009018
PA
322/* When GDB is built as a 64-bit application on linux, the
323 PTRACE_GETSIGINFO data is always presented in 64-bit layout. Since
324 debugging a 32-bit inferior with a 64-bit GDB should look the same
325 as debugging it with a 32-bit GDB, we do the 32-bit <-> 64-bit
326 conversion in-place ourselves. */
327
328/* These types below (compat_*) define a siginfo type that is layout
329 compatible with the siginfo type exported by the 32-bit userspace
330 support. */
331
332typedef int compat_int_t;
333typedef unsigned int compat_uptr_t;
334
335typedef int compat_time_t;
336typedef int compat_timer_t;
337typedef int compat_clock_t;
338
339struct compat_timeval
340{
341 compat_time_t tv_sec;
342 int tv_usec;
343};
344
345typedef union compat_sigval
346{
347 compat_int_t sival_int;
348 compat_uptr_t sival_ptr;
349} compat_sigval_t;
350
351typedef struct compat_siginfo
352{
353 int si_signo;
354 int si_errno;
355 int si_code;
356
357 union
358 {
359 int _pad[((128 / sizeof (int)) - 3)];
360
361 /* kill() */
362 struct
363 {
364 unsigned int _pid;
365 unsigned int _uid;
366 } _kill;
367
368 /* POSIX.1b timers */
369 struct
370 {
371 compat_timer_t _tid;
372 int _overrun;
373 compat_sigval_t _sigval;
374 } _timer;
375
376 /* POSIX.1b signals */
377 struct
378 {
379 unsigned int _pid;
380 unsigned int _uid;
381 compat_sigval_t _sigval;
382 } _rt;
383
384 /* SIGCHLD */
385 struct
386 {
387 unsigned int _pid;
388 unsigned int _uid;
389 int _status;
390 compat_clock_t _utime;
391 compat_clock_t _stime;
392 } _sigchld;
393
394 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
395 struct
396 {
397 unsigned int _addr;
398 } _sigfault;
399
400 /* SIGPOLL */
401 struct
402 {
403 int _band;
404 int _fd;
405 } _sigpoll;
406 } _sifields;
407} compat_siginfo_t;
408
ba224c70
L
409/* For x32, clock_t in _sigchld is 64bit aligned at 4 bytes. */
410typedef struct compat_x32_clock
411{
412 int lower;
413 int upper;
414} compat_x32_clock_t;
415
416typedef struct compat_x32_siginfo
417{
418 int si_signo;
419 int si_errno;
420 int si_code;
421
422 union
423 {
424 int _pad[((128 / sizeof (int)) - 3)];
425
426 /* kill() */
427 struct
428 {
429 unsigned int _pid;
430 unsigned int _uid;
431 } _kill;
432
433 /* POSIX.1b timers */
434 struct
435 {
436 compat_timer_t _tid;
437 int _overrun;
438 compat_sigval_t _sigval;
439 } _timer;
440
441 /* POSIX.1b signals */
442 struct
443 {
444 unsigned int _pid;
445 unsigned int _uid;
446 compat_sigval_t _sigval;
447 } _rt;
448
449 /* SIGCHLD */
450 struct
451 {
452 unsigned int _pid;
453 unsigned int _uid;
454 int _status;
455 compat_x32_clock_t _utime;
456 compat_x32_clock_t _stime;
457 } _sigchld;
458
459 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
460 struct
461 {
462 unsigned int _addr;
463 } _sigfault;
464
465 /* SIGPOLL */
466 struct
467 {
468 int _band;
469 int _fd;
470 } _sigpoll;
471 } _sifields;
472} compat_x32_siginfo_t;
473
5b009018
PA
474#define cpt_si_pid _sifields._kill._pid
475#define cpt_si_uid _sifields._kill._uid
476#define cpt_si_timerid _sifields._timer._tid
477#define cpt_si_overrun _sifields._timer._overrun
478#define cpt_si_status _sifields._sigchld._status
479#define cpt_si_utime _sifields._sigchld._utime
480#define cpt_si_stime _sifields._sigchld._stime
481#define cpt_si_ptr _sifields._rt._sigval.sival_ptr
482#define cpt_si_addr _sifields._sigfault._addr
483#define cpt_si_band _sifields._sigpoll._band
484#define cpt_si_fd _sifields._sigpoll._fd
485
14064aa2
DE
486/* glibc at least up to 2.3.2 doesn't have si_timerid, si_overrun.
487 In their place is si_timer1,si_timer2. */
488#ifndef si_timerid
489#define si_timerid si_timer1
490#endif
491#ifndef si_overrun
492#define si_overrun si_timer2
493#endif
494
5b009018
PA
495static void
496compat_siginfo_from_siginfo (compat_siginfo_t *to, siginfo_t *from)
497{
498 memset (to, 0, sizeof (*to));
499
500 to->si_signo = from->si_signo;
501 to->si_errno = from->si_errno;
502 to->si_code = from->si_code;
503
b53a1623 504 if (to->si_code == SI_TIMER)
5b009018 505 {
b53a1623
PA
506 to->cpt_si_timerid = from->si_timerid;
507 to->cpt_si_overrun = from->si_overrun;
5b009018
PA
508 to->cpt_si_ptr = (intptr_t) from->si_ptr;
509 }
510 else if (to->si_code == SI_USER)
511 {
512 to->cpt_si_pid = from->si_pid;
513 to->cpt_si_uid = from->si_uid;
514 }
b53a1623 515 else if (to->si_code < 0)
5b009018 516 {
b53a1623
PA
517 to->cpt_si_pid = from->si_pid;
518 to->cpt_si_uid = from->si_uid;
5b009018
PA
519 to->cpt_si_ptr = (intptr_t) from->si_ptr;
520 }
521 else
522 {
523 switch (to->si_signo)
524 {
525 case SIGCHLD:
526 to->cpt_si_pid = from->si_pid;
527 to->cpt_si_uid = from->si_uid;
528 to->cpt_si_status = from->si_status;
529 to->cpt_si_utime = from->si_utime;
530 to->cpt_si_stime = from->si_stime;
531 break;
532 case SIGILL:
533 case SIGFPE:
534 case SIGSEGV:
535 case SIGBUS:
536 to->cpt_si_addr = (intptr_t) from->si_addr;
537 break;
538 case SIGPOLL:
539 to->cpt_si_band = from->si_band;
540 to->cpt_si_fd = from->si_fd;
541 break;
542 default:
543 to->cpt_si_pid = from->si_pid;
544 to->cpt_si_uid = from->si_uid;
545 to->cpt_si_ptr = (intptr_t) from->si_ptr;
546 break;
547 }
548 }
549}
550
551static void
552siginfo_from_compat_siginfo (siginfo_t *to, compat_siginfo_t *from)
553{
554 memset (to, 0, sizeof (*to));
555
556 to->si_signo = from->si_signo;
557 to->si_errno = from->si_errno;
558 to->si_code = from->si_code;
559
b53a1623 560 if (to->si_code == SI_TIMER)
5b009018 561 {
b53a1623
PA
562 to->si_timerid = from->cpt_si_timerid;
563 to->si_overrun = from->cpt_si_overrun;
5b009018
PA
564 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
565 }
566 else if (to->si_code == SI_USER)
567 {
568 to->si_pid = from->cpt_si_pid;
569 to->si_uid = from->cpt_si_uid;
570 }
b53a1623 571 if (to->si_code < 0)
5b009018 572 {
b53a1623
PA
573 to->si_pid = from->cpt_si_pid;
574 to->si_uid = from->cpt_si_uid;
5b009018
PA
575 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
576 }
577 else
578 {
579 switch (to->si_signo)
580 {
581 case SIGCHLD:
582 to->si_pid = from->cpt_si_pid;
583 to->si_uid = from->cpt_si_uid;
584 to->si_status = from->cpt_si_status;
585 to->si_utime = from->cpt_si_utime;
586 to->si_stime = from->cpt_si_stime;
587 break;
588 case SIGILL:
589 case SIGFPE:
590 case SIGSEGV:
591 case SIGBUS:
592 to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
593 break;
594 case SIGPOLL:
595 to->si_band = from->cpt_si_band;
596 to->si_fd = from->cpt_si_fd;
597 break;
598 default:
599 to->si_pid = from->cpt_si_pid;
600 to->si_uid = from->cpt_si_uid;
601 to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
602 break;
603 }
604 }
605}
606
ba224c70
L
607static void
608compat_x32_siginfo_from_siginfo (compat_x32_siginfo_t *to,
609 siginfo_t *from)
610{
611 memset (to, 0, sizeof (*to));
612
613 to->si_signo = from->si_signo;
614 to->si_errno = from->si_errno;
615 to->si_code = from->si_code;
616
617 if (to->si_code == SI_TIMER)
618 {
619 to->cpt_si_timerid = from->si_timerid;
620 to->cpt_si_overrun = from->si_overrun;
621 to->cpt_si_ptr = (intptr_t) from->si_ptr;
622 }
623 else if (to->si_code == SI_USER)
624 {
625 to->cpt_si_pid = from->si_pid;
626 to->cpt_si_uid = from->si_uid;
627 }
628 else if (to->si_code < 0)
629 {
630 to->cpt_si_pid = from->si_pid;
631 to->cpt_si_uid = from->si_uid;
632 to->cpt_si_ptr = (intptr_t) from->si_ptr;
633 }
634 else
635 {
636 switch (to->si_signo)
637 {
638 case SIGCHLD:
639 to->cpt_si_pid = from->si_pid;
640 to->cpt_si_uid = from->si_uid;
641 to->cpt_si_status = from->si_status;
642 memcpy (&to->cpt_si_utime, &from->si_utime,
643 sizeof (to->cpt_si_utime));
644 memcpy (&to->cpt_si_stime, &from->si_stime,
645 sizeof (to->cpt_si_stime));
646 break;
647 case SIGILL:
648 case SIGFPE:
649 case SIGSEGV:
650 case SIGBUS:
651 to->cpt_si_addr = (intptr_t) from->si_addr;
652 break;
653 case SIGPOLL:
654 to->cpt_si_band = from->si_band;
655 to->cpt_si_fd = from->si_fd;
656 break;
657 default:
658 to->cpt_si_pid = from->si_pid;
659 to->cpt_si_uid = from->si_uid;
660 to->cpt_si_ptr = (intptr_t) from->si_ptr;
661 break;
662 }
663 }
664}
665
666static void
667siginfo_from_compat_x32_siginfo (siginfo_t *to,
668 compat_x32_siginfo_t *from)
669{
670 memset (to, 0, sizeof (*to));
671
672 to->si_signo = from->si_signo;
673 to->si_errno = from->si_errno;
674 to->si_code = from->si_code;
675
676 if (to->si_code == SI_TIMER)
677 {
678 to->si_timerid = from->cpt_si_timerid;
679 to->si_overrun = from->cpt_si_overrun;
680 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
681 }
682 else if (to->si_code == SI_USER)
683 {
684 to->si_pid = from->cpt_si_pid;
685 to->si_uid = from->cpt_si_uid;
686 }
687 if (to->si_code < 0)
688 {
689 to->si_pid = from->cpt_si_pid;
690 to->si_uid = from->cpt_si_uid;
691 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
692 }
693 else
694 {
695 switch (to->si_signo)
696 {
697 case SIGCHLD:
698 to->si_pid = from->cpt_si_pid;
699 to->si_uid = from->cpt_si_uid;
700 to->si_status = from->cpt_si_status;
701 memcpy (&to->si_utime, &from->cpt_si_utime,
702 sizeof (to->si_utime));
703 memcpy (&to->si_stime, &from->cpt_si_stime,
704 sizeof (to->si_stime));
705 break;
706 case SIGILL:
707 case SIGFPE:
708 case SIGSEGV:
709 case SIGBUS:
710 to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
711 break;
712 case SIGPOLL:
713 to->si_band = from->cpt_si_band;
714 to->si_fd = from->cpt_si_fd;
715 break;
716 default:
717 to->si_pid = from->cpt_si_pid;
718 to->si_uid = from->cpt_si_uid;
719 to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
720 break;
721 }
722 }
723}
724
5b009018
PA
725/* Convert a native/host siginfo object, into/from the siginfo in the
726 layout of the inferiors' architecture. Returns true if any
727 conversion was done; false otherwise. If DIRECTION is 1, then copy
728 from INF to NATIVE. If DIRECTION is 0, copy from NATIVE to
729 INF. */
730
731static int
a5362b9a 732amd64_linux_siginfo_fixup (siginfo_t *native, gdb_byte *inf, int direction)
5b009018 733{
ba224c70
L
734 struct gdbarch *gdbarch = get_frame_arch (get_current_frame ());
735
5b009018
PA
736 /* Is the inferior 32-bit? If so, then do fixup the siginfo
737 object. */
ba224c70 738 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
5b009018 739 {
a5362b9a 740 gdb_assert (sizeof (siginfo_t) == sizeof (compat_siginfo_t));
5b009018
PA
741
742 if (direction == 0)
743 compat_siginfo_from_siginfo ((struct compat_siginfo *) inf, native);
744 else
745 siginfo_from_compat_siginfo (native, (struct compat_siginfo *) inf);
746
ba224c70
L
747 return 1;
748 }
749 /* No fixup for native x32 GDB. */
750 else if (gdbarch_addr_bit (gdbarch) == 32 && sizeof (void *) == 8)
751 {
752 gdb_assert (sizeof (siginfo_t) == sizeof (compat_x32_siginfo_t));
753
754 if (direction == 0)
755 compat_x32_siginfo_from_siginfo ((struct compat_x32_siginfo *) inf,
756 native);
757 else
758 siginfo_from_compat_x32_siginfo (native,
759 (struct compat_x32_siginfo *) inf);
760
5b009018
PA
761 return 1;
762 }
763 else
764 return 0;
765}
040baaf6 766\f
c1e246a0
GB
767
768/* Provide a prototype to silence -Wmissing-prototypes. */
769void _initialize_amd64_linux_nat (void);
770
771void
772_initialize_amd64_linux_nat (void)
773{
774 struct target_ops *t;
775
776 amd64_native_gregset32_reg_offset = amd64_linux_gregset32_reg_offset;
777 amd64_native_gregset32_num_regs = I386_LINUX_NUM_REGS;
778 amd64_native_gregset64_reg_offset = amd64_linux_gregset_reg_offset;
779 amd64_native_gregset64_num_regs = AMD64_LINUX_NUM_REGS;
780
781 gdb_assert (ARRAY_SIZE (amd64_linux_gregset32_reg_offset)
782 == amd64_native_gregset32_num_regs);
783
784 /* Create a generic x86 GNU/Linux target. */
785 t = x86_linux_create_target ();
786
787 /* Add our register access methods. */
788 t->to_fetch_registers = amd64_linux_fetch_inferior_registers;
789 t->to_store_registers = amd64_linux_store_inferior_registers;
790
791 /* Add the target. */
792 x86_linux_add_target (t);
793
794 /* Add our siginfo layout converter. */
795 linux_nat_set_siginfo_fixup (t, amd64_linux_siginfo_fixup);
796}
This page took 1.20673 seconds and 4 git commands to generate.