1 /* Native-dependent code for GNU/Linux x86-64.
3 Copyright (C) 2001-2013 Free Software Foundation, Inc.
4 Contributed by Jiri Smid, SuSE Labs.
6 This file is part of GDB.
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
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
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.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
26 #include "linux-nat.h"
27 #include "amd64-linux-tdep.h"
28 #include "linux-btrace.h"
31 #include "gdb_assert.h"
32 #include "gdb_string.h"
33 #include "elf/common.h"
35 #include <sys/ptrace.h>
36 #include <sys/debugreg.h>
37 #include <sys/syscall.h>
38 #include <sys/procfs.h>
40 #include <asm/prctl.h>
41 /* FIXME ezannoni-2003-07-09: we need <sys/reg.h> to be included after
42 <asm/ptrace.h> because the latter redefines FS and GS for no apparent
43 reason, and those definitions don't match the ones that libpthread_db
44 uses, which come from <sys/reg.h>. */
45 /* ezannoni-2003-07-09: I think this is fixed. The extraneous defs have
46 been removed from ptrace.h in the kernel. However, better safe than
48 #include <asm/ptrace.h>
50 #include "gdb_proc_service.h"
52 /* Prototypes for supply_gregset etc. */
55 #include "amd64-tdep.h"
56 #include "i386-linux-tdep.h"
57 #include "amd64-nat.h"
59 #include "i386-xstate.h"
61 #ifndef PTRACE_GETREGSET
62 #define PTRACE_GETREGSET 0x4204
65 #ifndef PTRACE_SETREGSET
66 #define PTRACE_SETREGSET 0x4205
69 /* Per-thread arch-specific data we want to keep. */
73 /* Non-zero if our copy differs from what's recorded in the thread. */
74 int debug_registers_changed;
77 /* Does the current host support PTRACE_GETREGSET? */
78 static int have_ptrace_getregset = -1;
80 /* Mapping between the general-purpose registers in GNU/Linux x86-64
81 `struct user' format and GDB's register cache layout for GNU/Linux
84 Note that most GNU/Linux x86-64 registers are 64-bit, while the
85 GNU/Linux i386 registers are all 32-bit, but since we're
86 little-endian we get away with that. */
88 /* From <sys/reg.h> on GNU/Linux i386. */
89 static int amd64_linux_gregset32_reg_offset[] =
91 RAX * 8, RCX * 8, /* %eax, %ecx */
92 RDX * 8, RBX * 8, /* %edx, %ebx */
93 RSP * 8, RBP * 8, /* %esp, %ebp */
94 RSI * 8, RDI * 8, /* %esi, %edi */
95 RIP * 8, EFLAGS * 8, /* %eip, %eflags */
96 CS * 8, SS * 8, /* %cs, %ss */
97 DS * 8, ES * 8, /* %ds, %es */
98 FS * 8, GS * 8, /* %fs, %gs */
99 -1, -1, -1, -1, -1, -1, -1, -1,
100 -1, -1, -1, -1, -1, -1, -1, -1,
101 -1, -1, -1, -1, -1, -1, -1, -1, -1,
102 -1, -1, -1, -1, -1, -1, -1, -1,
103 ORIG_RAX * 8 /* "orig_eax" */
107 /* Transfering the general-purpose registers between GDB, inferiors
110 /* Fill GDB's register cache with the general-purpose register values
114 supply_gregset (struct regcache *regcache, const elf_gregset_t *gregsetp)
116 amd64_supply_native_gregset (regcache, gregsetp, -1);
119 /* Fill register REGNUM (if it is a general-purpose register) in
120 *GREGSETP with the value in GDB's register cache. If REGNUM is -1,
121 do this for all registers. */
124 fill_gregset (const struct regcache *regcache,
125 elf_gregset_t *gregsetp, int regnum)
127 amd64_collect_native_gregset (regcache, gregsetp, regnum);
130 /* Transfering floating-point registers between GDB, inferiors and cores. */
132 /* Fill GDB's register cache with the floating-point and SSE register
133 values in *FPREGSETP. */
136 supply_fpregset (struct regcache *regcache, const elf_fpregset_t *fpregsetp)
138 amd64_supply_fxsave (regcache, -1, fpregsetp);
141 /* Fill register REGNUM (if it is a floating-point or SSE register) in
142 *FPREGSETP with the value in GDB's register cache. If REGNUM is
143 -1, do this for all registers. */
146 fill_fpregset (const struct regcache *regcache,
147 elf_fpregset_t *fpregsetp, int regnum)
149 amd64_collect_fxsave (regcache, regnum, fpregsetp);
153 /* Transferring arbitrary registers between GDB and inferior. */
155 /* Fetch register REGNUM from the child process. If REGNUM is -1, do
156 this for all registers (including the floating point and SSE
160 amd64_linux_fetch_inferior_registers (struct target_ops *ops,
161 struct regcache *regcache, int regnum)
163 struct gdbarch *gdbarch = get_regcache_arch (regcache);
166 /* GNU/Linux LWP ID's are process ID's. */
167 tid = ptid_get_lwp (inferior_ptid);
169 tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */
171 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
175 if (ptrace (PTRACE_GETREGS, tid, 0, (long) ®s) < 0)
176 perror_with_name (_("Couldn't get registers"));
178 amd64_supply_native_gregset (regcache, ®s, -1);
183 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
185 elf_fpregset_t fpregs;
187 if (have_ptrace_getregset)
189 char xstateregs[I386_XSTATE_MAX_SIZE];
192 iov.iov_base = xstateregs;
193 iov.iov_len = sizeof (xstateregs);
194 if (ptrace (PTRACE_GETREGSET, tid,
195 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
196 perror_with_name (_("Couldn't get extended state status"));
198 amd64_supply_xsave (regcache, -1, xstateregs);
202 if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
203 perror_with_name (_("Couldn't get floating point status"));
205 amd64_supply_fxsave (regcache, -1, &fpregs);
210 /* Store register REGNUM back into the child process. If REGNUM is
211 -1, do this for all registers (including the floating-point and SSE
215 amd64_linux_store_inferior_registers (struct target_ops *ops,
216 struct regcache *regcache, int regnum)
218 struct gdbarch *gdbarch = get_regcache_arch (regcache);
221 /* GNU/Linux LWP ID's are process ID's. */
222 tid = ptid_get_lwp (inferior_ptid);
224 tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */
226 if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
230 if (ptrace (PTRACE_GETREGS, tid, 0, (long) ®s) < 0)
231 perror_with_name (_("Couldn't get registers"));
233 amd64_collect_native_gregset (regcache, ®s, regnum);
235 if (ptrace (PTRACE_SETREGS, tid, 0, (long) ®s) < 0)
236 perror_with_name (_("Couldn't write registers"));
242 if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
244 elf_fpregset_t fpregs;
246 if (have_ptrace_getregset)
248 char xstateregs[I386_XSTATE_MAX_SIZE];
251 iov.iov_base = xstateregs;
252 iov.iov_len = sizeof (xstateregs);
253 if (ptrace (PTRACE_GETREGSET, tid,
254 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
255 perror_with_name (_("Couldn't get extended state status"));
257 amd64_collect_xsave (regcache, regnum, xstateregs, 0);
259 if (ptrace (PTRACE_SETREGSET, tid,
260 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
261 perror_with_name (_("Couldn't write extended state status"));
265 if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
266 perror_with_name (_("Couldn't get floating point status"));
268 amd64_collect_fxsave (regcache, regnum, &fpregs);
270 if (ptrace (PTRACE_SETFPREGS, tid, 0, (long) &fpregs) < 0)
271 perror_with_name (_("Couldn't write floating point status"));
276 /* Support for debug registers. */
279 amd64_linux_dr_get (ptid_t ptid, int regnum)
284 tid = ptid_get_lwp (ptid);
286 tid = ptid_get_pid (ptid);
289 value = ptrace (PTRACE_PEEKUSER, tid,
290 offsetof (struct user, u_debugreg[regnum]), 0);
292 perror_with_name (_("Couldn't read debug register"));
297 /* Set debug register REGNUM to VALUE in only the one LWP of PTID. */
300 amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
304 tid = ptid_get_lwp (ptid);
306 tid = ptid_get_pid (ptid);
309 ptrace (PTRACE_POKEUSER, tid,
310 offsetof (struct user, u_debugreg[regnum]), value);
312 perror_with_name (_("Couldn't write debug register"));
315 /* Return the inferior's debug register REGNUM. */
318 amd64_linux_dr_get_addr (int regnum)
320 /* DR6 and DR7 are retrieved with some other way. */
321 gdb_assert (DR_FIRSTADDR <= regnum && regnum <= DR_LASTADDR);
323 return amd64_linux_dr_get (inferior_ptid, regnum);
326 /* Return the inferior's DR7 debug control register. */
329 amd64_linux_dr_get_control (void)
331 return amd64_linux_dr_get (inferior_ptid, DR_CONTROL);
334 /* Get DR_STATUS from only the one LWP of INFERIOR_PTID. */
337 amd64_linux_dr_get_status (void)
339 return amd64_linux_dr_get (inferior_ptid, DR_STATUS);
342 /* Callback for iterate_over_lwps. Update the debug registers of
346 update_debug_registers_callback (struct lwp_info *lwp, void *arg)
348 if (lwp->arch_private == NULL)
349 lwp->arch_private = XCNEW (struct arch_lwp_info);
351 /* The actual update is done later just before resuming the lwp, we
352 just mark that the registers need updating. */
353 lwp->arch_private->debug_registers_changed = 1;
355 /* If the lwp isn't stopped, force it to momentarily pause, so we
356 can update its debug registers. */
358 linux_stop_lwp (lwp);
360 /* Continue the iteration. */
364 /* Set DR_CONTROL to CONTROL in all LWPs of the current inferior. */
367 amd64_linux_dr_set_control (unsigned long control)
369 ptid_t pid_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
371 iterate_over_lwps (pid_ptid, update_debug_registers_callback, NULL);
374 /* Set address REGNUM (zero based) to ADDR in all LWPs of the current
378 amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr)
380 ptid_t pid_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
382 gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
384 iterate_over_lwps (pid_ptid, update_debug_registers_callback, NULL);
387 /* Called when resuming a thread.
388 If the debug regs have changed, update the thread's copies. */
391 amd64_linux_prepare_to_resume (struct lwp_info *lwp)
393 int clear_status = 0;
395 /* NULL means this is the main thread still going through the shell,
396 or, no watchpoint has been set yet. In that case, there's
398 if (lwp->arch_private == NULL)
401 if (lwp->arch_private->debug_registers_changed)
403 struct i386_debug_reg_state *state
404 = i386_debug_reg_state (ptid_get_pid (lwp->ptid));
407 /* On Linux kernel before 2.6.33 commit
408 72f674d203cd230426437cdcf7dd6f681dad8b0d
409 if you enable a breakpoint by the DR_CONTROL bits you need to have
410 already written the corresponding DR_FIRSTADDR...DR_LASTADDR registers.
412 Ensure DR_CONTROL gets written as the very last register here. */
414 for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
415 if (state->dr_ref_count[i] > 0)
417 amd64_linux_dr_set (lwp->ptid, i, state->dr_mirror[i]);
419 /* If we're setting a watchpoint, any change the inferior
420 had done itself to the debug registers needs to be
421 discarded, otherwise, i386_stopped_data_address can get
426 amd64_linux_dr_set (lwp->ptid, DR_CONTROL, state->dr_control_mirror);
428 lwp->arch_private->debug_registers_changed = 0;
431 if (clear_status || lwp->stopped_by_watchpoint)
432 amd64_linux_dr_set (lwp->ptid, DR_STATUS, 0);
436 amd64_linux_new_thread (struct lwp_info *lp)
438 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
440 info->debug_registers_changed = 1;
442 lp->arch_private = info;
445 /* linux_nat_new_fork hook. */
448 amd64_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
451 struct i386_debug_reg_state *parent_state;
452 struct i386_debug_reg_state *child_state;
454 /* NULL means no watchpoint has ever been set in the parent. In
455 that case, there's nothing to do. */
456 if (parent->arch_private == NULL)
459 /* Linux kernel before 2.6.33 commit
460 72f674d203cd230426437cdcf7dd6f681dad8b0d
461 will inherit hardware debug registers from parent
462 on fork/vfork/clone. Newer Linux kernels create such tasks with
463 zeroed debug registers.
465 GDB core assumes the child inherits the watchpoints/hw
466 breakpoints of the parent, and will remove them all from the
467 forked off process. Copy the debug registers mirrors into the
468 new process so that all breakpoints and watchpoints can be
469 removed together. The debug registers mirror will become zeroed
470 in the end before detaching the forked off process, thus making
471 this compatible with older Linux kernels too. */
473 parent_pid = ptid_get_pid (parent->ptid);
474 parent_state = i386_debug_reg_state (parent_pid);
475 child_state = i386_debug_reg_state (child_pid);
476 *child_state = *parent_state;
481 /* This function is called by libthread_db as part of its handling of
482 a request for a thread's local storage address. */
485 ps_get_thread_area (const struct ps_prochandle *ph,
486 lwpid_t lwpid, int idx, void **base)
488 if (gdbarch_bfd_arch_info (target_gdbarch ())->bits_per_word == 32)
490 /* The full structure is found in <asm-i386/ldt.h>. The second
491 integer is the LDT's base_address and that is used to locate
492 the thread's local storage. See i386-linux-nat.c more
494 unsigned int desc[4];
496 /* This code assumes that "int" is 32 bits and that
497 GET_THREAD_AREA returns no more than 4 int values. */
498 gdb_assert (sizeof (int) == 4);
499 #ifndef PTRACE_GET_THREAD_AREA
500 #define PTRACE_GET_THREAD_AREA 25
502 if (ptrace (PTRACE_GET_THREAD_AREA,
503 lwpid, (void *) (long) idx, (unsigned long) &desc) < 0)
506 /* Extend the value to 64 bits. Here it's assumed that a "long"
507 and a "void *" are the same. */
508 (*base) = (void *) (long) desc[1];
513 /* This definition comes from prctl.h, but some kernels may not
515 #ifndef PTRACE_ARCH_PRCTL
516 #define PTRACE_ARCH_PRCTL 30
518 /* FIXME: ezannoni-2003-07-09 see comment above about include
519 file order. We could be getting bogus values for these two. */
520 gdb_assert (FS < ELF_NGREG);
521 gdb_assert (GS < ELF_NGREG);
525 #ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
527 /* PTRACE_ARCH_PRCTL is obsolete since 2.6.25, where the
528 fs_base and gs_base fields of user_regs_struct can be
532 fs = ptrace (PTRACE_PEEKUSER, lwpid,
533 offsetof (struct user_regs_struct, fs_base), 0);
541 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
545 #ifdef HAVE_STRUCT_USER_REGS_STRUCT_GS_BASE
549 gs = ptrace (PTRACE_PEEKUSER, lwpid,
550 offsetof (struct user_regs_struct, gs_base), 0);
558 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
561 default: /* Should not happen. */
565 return PS_ERR; /* ptrace failed. */
569 static void (*super_post_startup_inferior) (ptid_t ptid);
572 amd64_linux_child_post_startup_inferior (ptid_t ptid)
574 i386_cleanup_dregs ();
575 super_post_startup_inferior (ptid);
579 /* When GDB is built as a 64-bit application on linux, the
580 PTRACE_GETSIGINFO data is always presented in 64-bit layout. Since
581 debugging a 32-bit inferior with a 64-bit GDB should look the same
582 as debugging it with a 32-bit GDB, we do the 32-bit <-> 64-bit
583 conversion in-place ourselves. */
585 /* These types below (compat_*) define a siginfo type that is layout
586 compatible with the siginfo type exported by the 32-bit userspace
589 typedef int compat_int_t;
590 typedef unsigned int compat_uptr_t;
592 typedef int compat_time_t;
593 typedef int compat_timer_t;
594 typedef int compat_clock_t;
596 struct compat_timeval
598 compat_time_t tv_sec;
602 typedef union compat_sigval
604 compat_int_t sival_int;
605 compat_uptr_t sival_ptr;
608 typedef struct compat_siginfo
616 int _pad[((128 / sizeof (int)) - 3)];
625 /* POSIX.1b timers */
630 compat_sigval_t _sigval;
633 /* POSIX.1b signals */
638 compat_sigval_t _sigval;
647 compat_clock_t _utime;
648 compat_clock_t _stime;
651 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
666 /* For x32, clock_t in _sigchld is 64bit aligned at 4 bytes. */
667 typedef struct compat_x32_clock
671 } compat_x32_clock_t;
673 typedef struct compat_x32_siginfo
681 int _pad[((128 / sizeof (int)) - 3)];
690 /* POSIX.1b timers */
695 compat_sigval_t _sigval;
698 /* POSIX.1b signals */
703 compat_sigval_t _sigval;
712 compat_x32_clock_t _utime;
713 compat_x32_clock_t _stime;
716 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
729 } compat_x32_siginfo_t;
731 #define cpt_si_pid _sifields._kill._pid
732 #define cpt_si_uid _sifields._kill._uid
733 #define cpt_si_timerid _sifields._timer._tid
734 #define cpt_si_overrun _sifields._timer._overrun
735 #define cpt_si_status _sifields._sigchld._status
736 #define cpt_si_utime _sifields._sigchld._utime
737 #define cpt_si_stime _sifields._sigchld._stime
738 #define cpt_si_ptr _sifields._rt._sigval.sival_ptr
739 #define cpt_si_addr _sifields._sigfault._addr
740 #define cpt_si_band _sifields._sigpoll._band
741 #define cpt_si_fd _sifields._sigpoll._fd
743 /* glibc at least up to 2.3.2 doesn't have si_timerid, si_overrun.
744 In their place is si_timer1,si_timer2. */
746 #define si_timerid si_timer1
749 #define si_overrun si_timer2
753 compat_siginfo_from_siginfo (compat_siginfo_t *to, siginfo_t *from)
755 memset (to, 0, sizeof (*to));
757 to->si_signo = from->si_signo;
758 to->si_errno = from->si_errno;
759 to->si_code = from->si_code;
761 if (to->si_code == SI_TIMER)
763 to->cpt_si_timerid = from->si_timerid;
764 to->cpt_si_overrun = from->si_overrun;
765 to->cpt_si_ptr = (intptr_t) from->si_ptr;
767 else if (to->si_code == SI_USER)
769 to->cpt_si_pid = from->si_pid;
770 to->cpt_si_uid = from->si_uid;
772 else if (to->si_code < 0)
774 to->cpt_si_pid = from->si_pid;
775 to->cpt_si_uid = from->si_uid;
776 to->cpt_si_ptr = (intptr_t) from->si_ptr;
780 switch (to->si_signo)
783 to->cpt_si_pid = from->si_pid;
784 to->cpt_si_uid = from->si_uid;
785 to->cpt_si_status = from->si_status;
786 to->cpt_si_utime = from->si_utime;
787 to->cpt_si_stime = from->si_stime;
793 to->cpt_si_addr = (intptr_t) from->si_addr;
796 to->cpt_si_band = from->si_band;
797 to->cpt_si_fd = from->si_fd;
800 to->cpt_si_pid = from->si_pid;
801 to->cpt_si_uid = from->si_uid;
802 to->cpt_si_ptr = (intptr_t) from->si_ptr;
809 siginfo_from_compat_siginfo (siginfo_t *to, compat_siginfo_t *from)
811 memset (to, 0, sizeof (*to));
813 to->si_signo = from->si_signo;
814 to->si_errno = from->si_errno;
815 to->si_code = from->si_code;
817 if (to->si_code == SI_TIMER)
819 to->si_timerid = from->cpt_si_timerid;
820 to->si_overrun = from->cpt_si_overrun;
821 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
823 else if (to->si_code == SI_USER)
825 to->si_pid = from->cpt_si_pid;
826 to->si_uid = from->cpt_si_uid;
830 to->si_pid = from->cpt_si_pid;
831 to->si_uid = from->cpt_si_uid;
832 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
836 switch (to->si_signo)
839 to->si_pid = from->cpt_si_pid;
840 to->si_uid = from->cpt_si_uid;
841 to->si_status = from->cpt_si_status;
842 to->si_utime = from->cpt_si_utime;
843 to->si_stime = from->cpt_si_stime;
849 to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
852 to->si_band = from->cpt_si_band;
853 to->si_fd = from->cpt_si_fd;
856 to->si_pid = from->cpt_si_pid;
857 to->si_uid = from->cpt_si_uid;
858 to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
865 compat_x32_siginfo_from_siginfo (compat_x32_siginfo_t *to,
868 memset (to, 0, sizeof (*to));
870 to->si_signo = from->si_signo;
871 to->si_errno = from->si_errno;
872 to->si_code = from->si_code;
874 if (to->si_code == SI_TIMER)
876 to->cpt_si_timerid = from->si_timerid;
877 to->cpt_si_overrun = from->si_overrun;
878 to->cpt_si_ptr = (intptr_t) from->si_ptr;
880 else if (to->si_code == SI_USER)
882 to->cpt_si_pid = from->si_pid;
883 to->cpt_si_uid = from->si_uid;
885 else if (to->si_code < 0)
887 to->cpt_si_pid = from->si_pid;
888 to->cpt_si_uid = from->si_uid;
889 to->cpt_si_ptr = (intptr_t) from->si_ptr;
893 switch (to->si_signo)
896 to->cpt_si_pid = from->si_pid;
897 to->cpt_si_uid = from->si_uid;
898 to->cpt_si_status = from->si_status;
899 memcpy (&to->cpt_si_utime, &from->si_utime,
900 sizeof (to->cpt_si_utime));
901 memcpy (&to->cpt_si_stime, &from->si_stime,
902 sizeof (to->cpt_si_stime));
908 to->cpt_si_addr = (intptr_t) from->si_addr;
911 to->cpt_si_band = from->si_band;
912 to->cpt_si_fd = from->si_fd;
915 to->cpt_si_pid = from->si_pid;
916 to->cpt_si_uid = from->si_uid;
917 to->cpt_si_ptr = (intptr_t) from->si_ptr;
924 siginfo_from_compat_x32_siginfo (siginfo_t *to,
925 compat_x32_siginfo_t *from)
927 memset (to, 0, sizeof (*to));
929 to->si_signo = from->si_signo;
930 to->si_errno = from->si_errno;
931 to->si_code = from->si_code;
933 if (to->si_code == SI_TIMER)
935 to->si_timerid = from->cpt_si_timerid;
936 to->si_overrun = from->cpt_si_overrun;
937 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
939 else if (to->si_code == SI_USER)
941 to->si_pid = from->cpt_si_pid;
942 to->si_uid = from->cpt_si_uid;
946 to->si_pid = from->cpt_si_pid;
947 to->si_uid = from->cpt_si_uid;
948 to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
952 switch (to->si_signo)
955 to->si_pid = from->cpt_si_pid;
956 to->si_uid = from->cpt_si_uid;
957 to->si_status = from->cpt_si_status;
958 memcpy (&to->si_utime, &from->cpt_si_utime,
959 sizeof (to->si_utime));
960 memcpy (&to->si_stime, &from->cpt_si_stime,
961 sizeof (to->si_stime));
967 to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
970 to->si_band = from->cpt_si_band;
971 to->si_fd = from->cpt_si_fd;
974 to->si_pid = from->cpt_si_pid;
975 to->si_uid = from->cpt_si_uid;
976 to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
982 /* Convert a native/host siginfo object, into/from the siginfo in the
983 layout of the inferiors' architecture. Returns true if any
984 conversion was done; false otherwise. If DIRECTION is 1, then copy
985 from INF to NATIVE. If DIRECTION is 0, copy from NATIVE to
989 amd64_linux_siginfo_fixup (siginfo_t *native, gdb_byte *inf, int direction)
991 struct gdbarch *gdbarch = get_frame_arch (get_current_frame ());
993 /* Is the inferior 32-bit? If so, then do fixup the siginfo
995 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
997 gdb_assert (sizeof (siginfo_t) == sizeof (compat_siginfo_t));
1000 compat_siginfo_from_siginfo ((struct compat_siginfo *) inf, native);
1002 siginfo_from_compat_siginfo (native, (struct compat_siginfo *) inf);
1006 /* No fixup for native x32 GDB. */
1007 else if (gdbarch_addr_bit (gdbarch) == 32 && sizeof (void *) == 8)
1009 gdb_assert (sizeof (siginfo_t) == sizeof (compat_x32_siginfo_t));
1012 compat_x32_siginfo_from_siginfo ((struct compat_x32_siginfo *) inf,
1015 siginfo_from_compat_x32_siginfo (native,
1016 (struct compat_x32_siginfo *) inf);
1024 /* Get Linux/x86 target description from running target.
1026 Value of CS segment register:
1027 1. 64bit process: 0x33.
1028 2. 32bit process: 0x23.
1030 Value of DS segment register:
1031 1. LP64 process: 0x0.
1032 2. X32 process: 0x2b.
1035 #define AMD64_LINUX_USER64_CS 0x33
1036 #define AMD64_LINUX_X32_DS 0x2b
1038 static const struct target_desc *
1039 amd64_linux_read_description (struct target_ops *ops)
1046 static uint64_t xcr0;
1048 /* GNU/Linux LWP ID's are process ID's. */
1049 tid = ptid_get_lwp (inferior_ptid);
1051 tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */
1053 /* Get CS register. */
1055 cs = ptrace (PTRACE_PEEKUSER, tid,
1056 offsetof (struct user_regs_struct, cs), 0);
1058 perror_with_name (_("Couldn't get CS register"));
1060 is_64bit = cs == AMD64_LINUX_USER64_CS;
1062 /* Get DS register. */
1064 ds = ptrace (PTRACE_PEEKUSER, tid,
1065 offsetof (struct user_regs_struct, ds), 0);
1067 perror_with_name (_("Couldn't get DS register"));
1069 is_x32 = ds == AMD64_LINUX_X32_DS;
1071 if (sizeof (void *) == 4 && is_64bit && !is_x32)
1072 error (_("Can't debug 64-bit process with 32-bit GDB"));
1074 if (have_ptrace_getregset == -1)
1076 uint64_t xstateregs[(I386_XSTATE_SSE_SIZE / sizeof (uint64_t))];
1079 iov.iov_base = xstateregs;
1080 iov.iov_len = sizeof (xstateregs);
1082 /* Check if PTRACE_GETREGSET works. */
1083 if (ptrace (PTRACE_GETREGSET, tid,
1084 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
1085 have_ptrace_getregset = 0;
1088 have_ptrace_getregset = 1;
1090 /* Get XCR0 from XSAVE extended state. */
1091 xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET
1092 / sizeof (uint64_t))];
1096 /* Check the native XCR0 only if PTRACE_GETREGSET is available. */
1097 if (have_ptrace_getregset
1098 && (xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
1103 return tdesc_x32_avx_linux;
1105 return tdesc_amd64_avx_linux;
1108 return tdesc_i386_avx_linux;
1115 return tdesc_x32_linux;
1117 return tdesc_amd64_linux;
1120 return tdesc_i386_linux;
1124 /* Enable branch tracing. */
1126 static struct btrace_target_info *
1127 amd64_linux_enable_btrace (ptid_t ptid)
1129 struct btrace_target_info *tinfo;
1130 struct gdbarch *gdbarch;
1133 tinfo = linux_enable_btrace (ptid);
1136 error (_("Could not enable branch tracing for %s: %s."),
1137 target_pid_to_str (ptid), safe_strerror (errno));
1139 /* Fill in the size of a pointer in bits. */
1140 gdbarch = target_thread_architecture (ptid);
1141 tinfo->ptr_bits = gdbarch_ptr_bit (gdbarch);
1146 /* Disable branch tracing. */
1149 amd64_linux_disable_btrace (struct btrace_target_info *tinfo)
1151 int errcode = linux_disable_btrace (tinfo);
1154 error (_("Could not disable branch tracing: %s."), safe_strerror (errcode));
1157 /* Teardown branch tracing. */
1160 amd64_linux_teardown_btrace (struct btrace_target_info *tinfo)
1162 /* Ignore errors. */
1163 linux_disable_btrace (tinfo);
1166 /* Provide a prototype to silence -Wmissing-prototypes. */
1167 void _initialize_amd64_linux_nat (void);
1170 _initialize_amd64_linux_nat (void)
1172 struct target_ops *t;
1174 amd64_native_gregset32_reg_offset = amd64_linux_gregset32_reg_offset;
1175 amd64_native_gregset32_num_regs = I386_LINUX_NUM_REGS;
1176 amd64_native_gregset64_reg_offset = amd64_linux_gregset_reg_offset;
1177 amd64_native_gregset64_num_regs = AMD64_LINUX_NUM_REGS;
1179 gdb_assert (ARRAY_SIZE (amd64_linux_gregset32_reg_offset)
1180 == amd64_native_gregset32_num_regs);
1182 /* Fill in the generic GNU/Linux methods. */
1183 t = linux_target ();
1185 i386_use_watchpoints (t);
1187 i386_dr_low.set_control = amd64_linux_dr_set_control;
1188 i386_dr_low.set_addr = amd64_linux_dr_set_addr;
1189 i386_dr_low.get_addr = amd64_linux_dr_get_addr;
1190 i386_dr_low.get_status = amd64_linux_dr_get_status;
1191 i386_dr_low.get_control = amd64_linux_dr_get_control;
1192 i386_set_debug_register_length (8);
1194 /* Override the GNU/Linux inferior startup hook. */
1195 super_post_startup_inferior = t->to_post_startup_inferior;
1196 t->to_post_startup_inferior = amd64_linux_child_post_startup_inferior;
1198 /* Add our register access methods. */
1199 t->to_fetch_registers = amd64_linux_fetch_inferior_registers;
1200 t->to_store_registers = amd64_linux_store_inferior_registers;
1202 t->to_read_description = amd64_linux_read_description;
1204 /* Add btrace methods. */
1205 t->to_supports_btrace = linux_supports_btrace;
1206 t->to_enable_btrace = amd64_linux_enable_btrace;
1207 t->to_disable_btrace = amd64_linux_disable_btrace;
1208 t->to_teardown_btrace = amd64_linux_teardown_btrace;
1209 t->to_read_btrace = linux_read_btrace;
1211 /* Register the target. */
1212 linux_nat_add_target (t);
1213 linux_nat_set_new_thread (t, amd64_linux_new_thread);
1214 linux_nat_set_new_fork (t, amd64_linux_new_fork);
1215 linux_nat_set_forget_process (t, i386_forget_process);
1216 linux_nat_set_siginfo_fixup (t, amd64_linux_siginfo_fixup);
1217 linux_nat_set_prepare_to_resume (t, amd64_linux_prepare_to_resume);