Add SVR4 psABI specific parser for AUXV entries
[deliverable/binutils-gdb.git] / gdb / nbsd-tdep.c
CommitLineData
ea5bc2a6 1/* Common target-dependent code for NetBSD systems.
76a9d10f 2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
76a9d10f 4
ea5bc2a6
JT
5 Contributed by Wasabi Systems, Inc.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
ea5bc2a6 12 (at your option) any later version.
a9762ec7 13
ea5bc2a6
JT
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
a9762ec7 18
ea5bc2a6 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ea5bc2a6
JT
21
22#include "defs.h"
206c98a6 23#include "auxv.h"
ea5bc2a6 24#include "solib-svr4.h"
63807e1d 25#include "nbsd-tdep.h"
79743962 26#include "gdbarch.h"
063f8e80 27#include "objfiles.h"
ea5bc2a6 28
76a9d10f
MK
29/* FIXME: kettenis/20060115: We should really eliminate the next two
30 functions completely. */
ea5bc2a6 31
ea5bc2a6
JT
32struct link_map_offsets *
33nbsd_ilp32_solib_svr4_fetch_link_map_offsets (void)
34{
76a9d10f 35 return svr4_ilp32_fetch_link_map_offsets ();
ea5bc2a6
JT
36}
37
38struct link_map_offsets *
39nbsd_lp64_solib_svr4_fetch_link_map_offsets (void)
40{
76a9d10f 41 return svr4_lp64_fetch_link_map_offsets ();
ea5bc2a6 42}
3d9b49b0
JT
43
44int
2c02bd72 45nbsd_pc_in_sigtramp (CORE_ADDR pc, const char *func_name)
3d9b49b0
JT
46{
47 /* Check for libc-provided signal trampoline. All such trampolines
48 have function names which begin with "__sigtramp". */
49
50 return (func_name != NULL
61012eef 51 && startswith (func_name, "__sigtramp"));
3d9b49b0 52}
79743962
KR
53
54/* This enum is derived from NETBSD's <sys/signal.h>. */
55
56enum
57 {
58 NBSD_SIGHUP = 1,
59 NBSD_SIGINT = 2,
60 NBSD_SIGQUIT = 3,
61 NBSD_SIGILL = 4,
62 NBSD_SIGTRAP = 5,
63 NBSD_SIGABRT = 6,
64 NBSD_SIGEMT = 7,
65 NBSD_SIGFPE = 8,
66 NBSD_SIGKILL = 9,
67 NBSD_SIGBUS = 10,
68 NBSD_SIGSEGV = 11,
69 NBSD_SIGSYS = 12,
70 NBSD_SIGPIPE = 13,
71 NBSD_SIGALRM = 14,
72 NBSD_SIGTERM = 15,
73 NBSD_SIGURG = 16,
74 NBSD_SIGSTOP = 17,
75 NBSD_SIGTSTP = 18,
76 NBSD_SIGCONT = 19,
77 NBSD_SIGCHLD = 20,
78 NBSD_SIGTTIN = 21,
79 NBSD_SIGTTOU = 22,
80 NBSD_SIGIO = 23,
81 NBSD_SIGXCPU = 24,
82 NBSD_SIGXFSZ = 25,
83 NBSD_SIGVTALRM = 26,
84 NBSD_SIGPROF = 27,
85 NBSD_SIGWINCH = 28,
86 NBSD_SIGINFO = 29,
87 NBSD_SIGUSR1 = 30,
88 NBSD_SIGUSR2 = 31,
89 NBSD_SIGPWR = 32,
90 NBSD_SIGRTMIN = 33,
91 NBSD_SIGRTMAX = 63,
92 };
93
94/* Implement the "gdb_signal_from_target" gdbarch method. */
95
96static enum gdb_signal
97nbsd_gdb_signal_from_target (struct gdbarch *gdbarch, int signal)
98{
99 switch (signal)
100 {
101 case 0:
102 return GDB_SIGNAL_0;
103
104 case NBSD_SIGHUP:
105 return GDB_SIGNAL_HUP;
106
107 case NBSD_SIGINT:
108 return GDB_SIGNAL_INT;
109
110 case NBSD_SIGQUIT:
111 return GDB_SIGNAL_QUIT;
112
113 case NBSD_SIGILL:
114 return GDB_SIGNAL_ILL;
115
116 case NBSD_SIGTRAP:
117 return GDB_SIGNAL_TRAP;
118
119 case NBSD_SIGABRT:
120 return GDB_SIGNAL_ABRT;
121
122 case NBSD_SIGEMT:
123 return GDB_SIGNAL_EMT;
124
125 case NBSD_SIGFPE:
126 return GDB_SIGNAL_FPE;
127
128 case NBSD_SIGKILL:
129 return GDB_SIGNAL_KILL;
130
131 case NBSD_SIGBUS:
132 return GDB_SIGNAL_BUS;
133
134 case NBSD_SIGSEGV:
135 return GDB_SIGNAL_SEGV;
136
137 case NBSD_SIGSYS:
138 return GDB_SIGNAL_SYS;
139
140 case NBSD_SIGPIPE:
141 return GDB_SIGNAL_PIPE;
142
143 case NBSD_SIGALRM:
144 return GDB_SIGNAL_ALRM;
145
146 case NBSD_SIGTERM:
147 return GDB_SIGNAL_TERM;
148
149 case NBSD_SIGURG:
150 return GDB_SIGNAL_URG;
151
152 case NBSD_SIGSTOP:
153 return GDB_SIGNAL_STOP;
154
155 case NBSD_SIGTSTP:
156 return GDB_SIGNAL_TSTP;
157
158 case NBSD_SIGCONT:
159 return GDB_SIGNAL_CONT;
160
161 case NBSD_SIGCHLD:
162 return GDB_SIGNAL_CHLD;
163
164 case NBSD_SIGTTIN:
165 return GDB_SIGNAL_TTIN;
166
167 case NBSD_SIGTTOU:
168 return GDB_SIGNAL_TTOU;
169
170 case NBSD_SIGIO:
171 return GDB_SIGNAL_IO;
172
173 case NBSD_SIGXCPU:
174 return GDB_SIGNAL_XCPU;
175
176 case NBSD_SIGXFSZ:
177 return GDB_SIGNAL_XFSZ;
178
179 case NBSD_SIGVTALRM:
180 return GDB_SIGNAL_VTALRM;
181
182 case NBSD_SIGPROF:
183 return GDB_SIGNAL_PROF;
184
185 case NBSD_SIGWINCH:
186 return GDB_SIGNAL_WINCH;
187
188 case NBSD_SIGINFO:
189 return GDB_SIGNAL_INFO;
190
191 case NBSD_SIGUSR1:
192 return GDB_SIGNAL_USR1;
193
194 case NBSD_SIGUSR2:
195 return GDB_SIGNAL_USR2;
196
197 case NBSD_SIGPWR:
198 return GDB_SIGNAL_PWR;
199
200 /* SIGRTMIN and SIGRTMAX are not continuous in <gdb/signals.def>,
201 therefore we have to handle them here. */
202 case NBSD_SIGRTMIN:
203 return GDB_SIGNAL_REALTIME_33;
204
205 case NBSD_SIGRTMAX:
206 return GDB_SIGNAL_REALTIME_63;
207 }
208
209 if (signal >= NBSD_SIGRTMIN + 1 && signal <= NBSD_SIGRTMAX - 1)
210 {
211 int offset = signal - NBSD_SIGRTMIN + 1;
212
213 return (enum gdb_signal) ((int) GDB_SIGNAL_REALTIME_34 + offset);
214 }
215
216 return GDB_SIGNAL_UNKNOWN;
217}
218
219/* Implement the "gdb_signal_to_target" gdbarch method. */
220
221static int
222nbsd_gdb_signal_to_target (struct gdbarch *gdbarch,
223 enum gdb_signal signal)
224{
225 switch (signal)
226 {
227 case GDB_SIGNAL_0:
228 return 0;
229
230 case GDB_SIGNAL_HUP:
231 return NBSD_SIGHUP;
232
233 case GDB_SIGNAL_INT:
234 return NBSD_SIGINT;
235
236 case GDB_SIGNAL_QUIT:
237 return NBSD_SIGQUIT;
238
239 case GDB_SIGNAL_ILL:
240 return NBSD_SIGILL;
241
242 case GDB_SIGNAL_TRAP:
243 return NBSD_SIGTRAP;
244
245 case GDB_SIGNAL_ABRT:
246 return NBSD_SIGABRT;
247
248 case GDB_SIGNAL_EMT:
249 return NBSD_SIGEMT;
250
251 case GDB_SIGNAL_FPE:
252 return NBSD_SIGFPE;
253
254 case GDB_SIGNAL_KILL:
255 return NBSD_SIGKILL;
256
257 case GDB_SIGNAL_BUS:
258 return NBSD_SIGBUS;
259
260 case GDB_SIGNAL_SEGV:
261 return NBSD_SIGSEGV;
262
263 case GDB_SIGNAL_SYS:
264 return NBSD_SIGSYS;
265
266 case GDB_SIGNAL_PIPE:
267 return NBSD_SIGPIPE;
268
269 case GDB_SIGNAL_ALRM:
270 return NBSD_SIGALRM;
271
272 case GDB_SIGNAL_TERM:
273 return NBSD_SIGTERM;
274
275 case GDB_SIGNAL_URG:
276 return NBSD_SIGSTOP;
277
278 case GDB_SIGNAL_TSTP:
279 return NBSD_SIGTSTP;
280
281 case GDB_SIGNAL_CONT:
282 return NBSD_SIGCONT;
283
284 case GDB_SIGNAL_CHLD:
285 return NBSD_SIGCHLD;
286
287 case GDB_SIGNAL_TTIN:
288 return NBSD_SIGTTIN;
289
290 case GDB_SIGNAL_TTOU:
291 return NBSD_SIGTTOU;
292
293 case GDB_SIGNAL_IO:
294 return NBSD_SIGIO;
295
296 case GDB_SIGNAL_XCPU:
297 return NBSD_SIGXCPU;
298
299 case GDB_SIGNAL_XFSZ:
300 return NBSD_SIGXFSZ;
301
302 case GDB_SIGNAL_VTALRM:
303 return NBSD_SIGVTALRM;
304
305 case GDB_SIGNAL_PROF:
306 return NBSD_SIGPROF;
307
308 case GDB_SIGNAL_WINCH:
309 return NBSD_SIGWINCH;
310
311 case GDB_SIGNAL_INFO:
312 return NBSD_SIGINFO;
313
314 case GDB_SIGNAL_USR1:
315 return NBSD_SIGUSR1;
316
317 case GDB_SIGNAL_USR2:
318 return NBSD_SIGUSR2;
319
320 case GDB_SIGNAL_PWR:
321 return NBSD_SIGPWR;
322
323 /* GDB_SIGNAL_REALTIME_33 is not continuous in <gdb/signals.def>,
324 therefore we have to handle it here. */
325 case GDB_SIGNAL_REALTIME_33:
326 return NBSD_SIGRTMIN;
327
328 /* Same comment applies to _64. */
329 case GDB_SIGNAL_REALTIME_63:
330 return NBSD_SIGRTMAX;
331 }
332
333 if (signal >= GDB_SIGNAL_REALTIME_34
334 && signal <= GDB_SIGNAL_REALTIME_62)
335 {
336 int offset = signal - GDB_SIGNAL_REALTIME_32;
337
338 return NBSD_SIGRTMIN + 1 + offset;
339 }
340
341 return -1;
342}
343
063f8e80
KR
344/* Shared library resolver handling. */
345
346static CORE_ADDR
347nbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
348{
349 struct bound_minimal_symbol msym;
350
351 msym = lookup_minimal_symbol ("_rtld_bind_start", NULL, NULL);
352 if (msym.minsym && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
353 return frame_unwind_caller_pc (get_current_frame ());
354 else
355 return find_solib_trampoline_target (get_current_frame (), pc);
356}
357
79743962
KR
358/* See nbsd-tdep.h. */
359
360void
361nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
362{
363 set_gdbarch_gdb_signal_from_target (gdbarch, nbsd_gdb_signal_from_target);
364 set_gdbarch_gdb_signal_to_target (gdbarch, nbsd_gdb_signal_to_target);
063f8e80 365 set_gdbarch_skip_solib_resolver (gdbarch, nbsd_skip_solib_resolver);
206c98a6 366 set_gdbarch_auxv_parse (gdbarch, svr4_auxv_parse);
79743962 367}
This page took 1.907274 seconds and 4 git commands to generate.