Fix crash when loading dwp files
[external/binutils.git] / gdb / nat / linux-ptrace.h
1 /* Copyright (C) 2011-2019 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 NAT_LINUX_PTRACE_H
19 #define NAT_LINUX_PTRACE_H
20
21 struct buffer;
22
23 #include "nat/gdb_ptrace.h"
24 #include "common/gdb_wait.h"
25
26 #ifdef __UCLIBC__
27 #if !(defined(__UCLIBC_HAS_MMU__) || defined(__ARCH_HAS_MMU__))
28 /* PTRACE_TEXT_ADDR and friends.  */
29 #include <asm/ptrace.h>
30 #define HAS_NOMMU
31 #endif
32 #endif
33
34 #if !defined(PTRACE_TYPE_ARG3)
35 #define PTRACE_TYPE_ARG3 void *
36 #endif
37
38 #if !defined(PTRACE_TYPE_ARG4)
39 #define PTRACE_TYPE_ARG4 void *
40 #endif
41
42 #ifndef PTRACE_GETSIGINFO
43 # define PTRACE_GETSIGINFO 0x4202
44 # define PTRACE_SETSIGINFO 0x4203
45 #endif /* PTRACE_GETSIGINF */
46
47 #ifndef PTRACE_GETREGSET
48 #define PTRACE_GETREGSET        0x4204
49 #endif
50
51 #ifndef PTRACE_SETREGSET
52 #define PTRACE_SETREGSET        0x4205
53 #endif
54
55 /* If the system headers did not provide the constants, hard-code the normal
56    values.  */
57 #ifndef PTRACE_EVENT_FORK
58
59 #define PTRACE_SETOPTIONS       0x4200
60 #define PTRACE_GETEVENTMSG      0x4201
61
62 /* options set using PTRACE_SETOPTIONS */
63 #define PTRACE_O_TRACESYSGOOD   0x00000001
64 #define PTRACE_O_TRACEFORK      0x00000002
65 #define PTRACE_O_TRACEVFORK     0x00000004
66 #define PTRACE_O_TRACECLONE     0x00000008
67 #define PTRACE_O_TRACEEXEC      0x00000010
68 #define PTRACE_O_TRACEVFORKDONE 0x00000020
69 #define PTRACE_O_TRACEEXIT      0x00000040
70
71 /* Wait extended result codes for the above trace options.  */
72 #define PTRACE_EVENT_FORK       1
73 #define PTRACE_EVENT_VFORK      2
74 #define PTRACE_EVENT_CLONE      3
75 #define PTRACE_EVENT_EXEC       4
76 #define PTRACE_EVENT_VFORK_DONE 5
77 #define PTRACE_EVENT_EXIT       6
78
79 #endif /* PTRACE_EVENT_FORK */
80
81 #ifndef PTRACE_O_EXITKILL
82 /* Only defined in Linux Kernel 3.8 or later.  */
83 #define PTRACE_O_EXITKILL       0x00100000
84 #endif
85
86 #if (defined __bfin__ || defined __frv__ || defined __sh__) \
87     && !defined PTRACE_GETFDPIC
88 #define PTRACE_GETFDPIC         31
89 #define PTRACE_GETFDPIC_EXEC    0
90 #define PTRACE_GETFDPIC_INTERP  1
91 #endif
92
93 /* We can't always assume that this flag is available, but all systems
94    with the ptrace event handlers also have __WALL, so it's safe to use
95    in some contexts.  */
96 #ifndef __WALL
97 #define __WALL          0x40000000 /* Wait for any child.  */
98 #endif
99
100 /* True if whether a breakpoint/watchpoint triggered can be determined
101    from the si_code of SIGTRAP's siginfo_t (TRAP_BRKPT/TRAP_HWBKPT).
102    That is, if the kernel can tell us whether the thread executed a
103    software breakpoint, we trust it.  The kernel will be determining
104    that from the hardware (e.g., from which exception was raised in
105    the CPU).  Relying on whether a breakpoint is planted in memory at
106    the time the SIGTRAP is processed to determine whether the thread
107    stopped for a software breakpoint can be too late.  E.g., the
108    breakpoint could have been removed since.  Or the thread could have
109    stepped an instruction the size of a breakpoint instruction, and
110    before the stop is processed a breakpoint is inserted at its
111    address.  Getting these wrong is disastrous on decr_pc_after_break
112    architectures.  The moribund location mechanism helps with that
113    somewhat but it is an heuristic, and can well fail.  Getting that
114    information out of the kernel and ultimately out of the CPU is the
115    way to go.  That said, some architecture may get the si_code wrong,
116    and as such we're leaving fallback code in place.  We'll remove
117    this after a while if no problem is reported.  */
118 #define USE_SIGTRAP_SIGINFO 1
119
120 /* The x86 kernel gets some of the si_code values backwards, like
121    this:
122
123    | what                                     | si_code     |
124    |------------------------------------------+-------------|
125    | software breakpoints (int3)              | SI_KERNEL   |
126    | single-steps                             | TRAP_TRACE  |
127    | single-stepping a syscall                | TRAP_BRKPT  |
128    | user sent SIGTRAP                        | 0           |
129    | exec SIGTRAP (when no PTRACE_EVENT_EXEC) | 0           |
130    | hardware breakpoints/watchpoints         | TRAP_HWBKPT |
131
132    That is, it reports SI_KERNEL for software breakpoints (and only
133    for those), and TRAP_BRKPT for single-stepping a syscall...  If the
134    kernel is ever fixed, we'll just have to detect it like we detect
135    optional ptrace features: by forking and debugging ourselves,
136    running to a breakpoint and checking what comes out of
137    siginfo->si_code.
138
139    The ppc kernel does use TRAP_BRKPT for software breakpoints
140    in PowerPC code, but it uses SI_KERNEL for software breakpoints
141    in SPU code on a Cell/B.E.  However, SI_KERNEL is never seen
142    on a SIGTRAP for any other reason.
143
144    The MIPS kernel up until 4.5 used SI_KERNEL for all kernel
145    generated traps.  Since:
146
147      - MIPS doesn't do hardware single-step.
148      - We don't need to care about exec SIGTRAPs --- we assume
149        PTRACE_EVENT_EXEC is available.
150      - The MIPS kernel doesn't support hardware breakpoints.
151
152    on MIPS, all we need to care about is distinguishing between
153    software breakpoints and hardware watchpoints, which can be done by
154    peeking the debug registers.
155
156    Beginning with Linux 4.6, the MIPS port reports proper TRAP_BRKPT and
157    TRAP_HWBKPT codes, so we also match them.
158
159    The generic Linux target code should use GDB_ARCH_IS_TRAP_* instead
160    of TRAP_* to abstract out these peculiarities.  */
161 #if defined __i386__ || defined __x86_64__
162 # define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == SI_KERNEL)
163 # define GDB_ARCH_IS_TRAP_HWBKPT(X) ((X) == TRAP_HWBKPT)
164 #elif defined __powerpc__
165 # define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == SI_KERNEL || (X) == TRAP_BRKPT)
166 # define GDB_ARCH_IS_TRAP_HWBKPT(X) ((X) == TRAP_HWBKPT)
167 #elif defined __mips__
168 # define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == SI_KERNEL || (X) == TRAP_BRKPT)
169 # define GDB_ARCH_IS_TRAP_HWBKPT(X) ((X) == SI_KERNEL || (X) == TRAP_HWBKPT)
170 #else
171 # define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == TRAP_BRKPT)
172 # define GDB_ARCH_IS_TRAP_HWBKPT(X) ((X) == TRAP_HWBKPT)
173 #endif
174
175 #ifndef TRAP_HWBKPT
176 # define TRAP_HWBKPT 4
177 #endif
178
179 extern std::string linux_ptrace_attach_fail_reason (pid_t pid);
180
181 /* Find all possible reasons we could have failed to attach to PTID
182    and return them as a string.  ERR is the error PTRACE_ATTACH failed
183    with (an errno).  */
184 extern std::string linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err);
185
186 extern void linux_ptrace_init_warnings (void);
187 extern void linux_check_ptrace_features (void);
188 extern void linux_enable_event_reporting (pid_t pid, int attached);
189 extern void linux_disable_event_reporting (pid_t pid);
190 extern int linux_supports_tracefork (void);
191 extern int linux_supports_traceexec (void);
192 extern int linux_supports_traceclone (void);
193 extern int linux_supports_tracevforkdone (void);
194 extern int linux_supports_tracesysgood (void);
195 extern int linux_ptrace_get_extended_event (int wstat);
196 extern int linux_is_extended_waitstatus (int wstat);
197 extern int linux_wstatus_maybe_breakpoint (int wstat);
198
199 #endif /* NAT_LINUX_PTRACE_H */