Identify remote fork event support
[deliverable/binutils-gdb.git] / gdb / nat / linux-ptrace.h
1 /* Copyright (C) 2011-2015 Free Software Foundation, Inc.
2
3 This file is part of GDB.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18 #ifndef COMMON_LINUX_PTRACE_H
19 #define COMMON_LINUX_PTRACE_H
20
21 struct buffer;
22
23 #include <sys/ptrace.h>
24
25 #ifdef __UCLIBC__
26 #if !(defined(__UCLIBC_HAS_MMU__) || defined(__ARCH_HAS_MMU__))
27 /* PTRACE_TEXT_ADDR and friends. */
28 #include <asm/ptrace.h>
29 #define HAS_NOMMU
30 #endif
31 #endif
32
33 #if !defined(PTRACE_TYPE_ARG3)
34 #define PTRACE_TYPE_ARG3 void *
35 #endif
36
37 #if !defined(PTRACE_TYPE_ARG4)
38 #define PTRACE_TYPE_ARG4 void *
39 #endif
40
41 #ifndef PTRACE_GETSIGINFO
42 # define PTRACE_GETSIGINFO 0x4202
43 # define PTRACE_SETSIGINFO 0x4203
44 #endif /* PTRACE_GETSIGINF */
45
46 /* If the system headers did not provide the constants, hard-code the normal
47 values. */
48 #ifndef PTRACE_EVENT_FORK
49
50 #define PTRACE_SETOPTIONS 0x4200
51 #define PTRACE_GETEVENTMSG 0x4201
52
53 /* options set using PTRACE_SETOPTIONS */
54 #define PTRACE_O_TRACESYSGOOD 0x00000001
55 #define PTRACE_O_TRACEFORK 0x00000002
56 #define PTRACE_O_TRACEVFORK 0x00000004
57 #define PTRACE_O_TRACECLONE 0x00000008
58 #define PTRACE_O_TRACEEXEC 0x00000010
59 #define PTRACE_O_TRACEVFORKDONE 0x00000020
60 #define PTRACE_O_TRACEEXIT 0x00000040
61
62 /* Wait extended result codes for the above trace options. */
63 #define PTRACE_EVENT_FORK 1
64 #define PTRACE_EVENT_VFORK 2
65 #define PTRACE_EVENT_CLONE 3
66 #define PTRACE_EVENT_EXEC 4
67 #define PTRACE_EVENT_VFORK_DONE 5
68 #define PTRACE_EVENT_EXIT 6
69
70 #endif /* PTRACE_EVENT_FORK */
71
72 #ifndef PTRACE_O_EXITKILL
73 /* Only defined in Linux Kernel 3.8 or later. */
74 #define PTRACE_O_EXITKILL 0x00100000
75 #endif
76
77 #if (defined __bfin__ || defined __frv__ || defined __sh__) \
78 && !defined PTRACE_GETFDPIC
79 #define PTRACE_GETFDPIC 31
80 #define PTRACE_GETFDPIC_EXEC 0
81 #define PTRACE_GETFDPIC_INTERP 1
82 #endif
83
84 /* We can't always assume that this flag is available, but all systems
85 with the ptrace event handlers also have __WALL, so it's safe to use
86 in some contexts. */
87 #ifndef __WALL
88 #define __WALL 0x40000000 /* Wait for any child. */
89 #endif
90
91 /* True if whether a breakpoint/watchpoint triggered can be determined
92 from the si_code of SIGTRAP's siginfo_t (TRAP_BRKPT/TRAP_HWBKPT).
93 That is, if the kernel can tell us whether the thread executed a
94 software breakpoint, we trust it. The kernel will be determining
95 that from the hardware (e.g., from which exception was raised in
96 the CPU). Relying on whether a breakpoint is planted in memory at
97 the time the SIGTRAP is processed to determine whether the thread
98 stopped for a software breakpoint can be too late. E.g., the
99 breakpoint could have been removed since. Or the thread could have
100 stepped an instruction the size of a breakpoint instruction, and
101 before the stop is processed a breakpoint is inserted at its
102 address. Getting these wrong is disastrous on decr_pc_after_break
103 architectures. The moribund location mechanism helps with that
104 somewhat but it is an heuristic, and can well fail. Getting that
105 information out of the kernel and ultimately out of the CPU is the
106 way to go. That said, some architecture may get the si_code wrong,
107 and as such we're leaving fallback code in place. We'll remove
108 this after a while if no problem is reported. */
109 #define USE_SIGTRAP_SIGINFO 1
110
111 /* The x86 kernel gets some of the si_code values backwards, like
112 this:
113
114 | what | si_code |
115 |------------------------------------------+------------|
116 | software breakpoints (int3) | SI_KERNEL |
117 | single-steps | TRAP_TRACE |
118 | single-stepping a syscall | TRAP_BRKPT |
119 | user sent SIGTRAP | 0 |
120 | exec SIGTRAP (when no PTRACE_EVENT_EXEC) | 0 |
121 | hardware breakpoints/watchpoints | TRAP_HWBPT |
122
123 That is, it reports SI_KERNEL for software breakpoints (and only
124 for those), and TRAP_BRKPT for single-stepping a syscall... If the
125 kernel is ever fixed, we'll just have to detect it like we detect
126 optional ptrace features: by forking and debugging ourselves,
127 running to a breakpoint and checking what comes out of
128 siginfo->si_code.
129
130 The generic Linux target code should use GDB_ARCH_TRAP_BRKPT
131 instead of TRAP_BRKPT to abstract out this x86 peculiarity. */
132 #if defined __i386__ || defined __x86_64__
133 # define GDB_ARCH_TRAP_BRKPT SI_KERNEL
134 #else
135 # define GDB_ARCH_TRAP_BRKPT TRAP_BRKPT
136 #endif
137
138 #ifndef TRAP_HWBKPT
139 # define TRAP_HWBKPT 4
140 #endif
141
142 extern void linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer);
143
144 /* Find all possible reasons we could have failed to attach to PTID
145 and return them as a string. ERR is the error PTRACE_ATTACH failed
146 with (an errno). The result is stored in a static buffer. This
147 string should be copied into a buffer by the client if the string
148 will not be immediately used, or if it must persist. */
149 extern char *linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err);
150
151 extern void linux_ptrace_init_warnings (void);
152 extern void linux_check_ptrace_features (void);
153 extern void linux_enable_event_reporting (pid_t pid, int attached);
154 extern void linux_disable_event_reporting (pid_t pid);
155 extern int linux_supports_tracefork (void);
156 extern int linux_supports_traceclone (void);
157 extern int linux_supports_tracevforkdone (void);
158 extern int linux_supports_tracesysgood (void);
159 extern void linux_ptrace_set_additional_flags (int);
160 extern int linux_ptrace_get_extended_event (int wstat);
161 extern int linux_is_extended_waitstatus (int wstat);
162 extern int linux_wstatus_maybe_breakpoint (int wstat);
163
164 #endif /* COMMON_LINUX_PTRACE_H */
This page took 0.049464 seconds and 5 git commands to generate.