Commit | Line | Data |
---|---|---|
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 |
32 | struct link_map_offsets * |
33 | nbsd_ilp32_solib_svr4_fetch_link_map_offsets (void) | |
34 | { | |
76a9d10f | 35 | return svr4_ilp32_fetch_link_map_offsets (); |
ea5bc2a6 JT |
36 | } |
37 | ||
38 | struct link_map_offsets * | |
39 | nbsd_lp64_solib_svr4_fetch_link_map_offsets (void) | |
40 | { | |
76a9d10f | 41 | return svr4_lp64_fetch_link_map_offsets (); |
ea5bc2a6 | 42 | } |
3d9b49b0 JT |
43 | |
44 | int | |
2c02bd72 | 45 | nbsd_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 | ||
56 | enum | |
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 | ||
96 | static enum gdb_signal | |
97 | nbsd_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 | ||
221 | static int | |
222 | nbsd_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 | ||
346 | static CORE_ADDR | |
347 | nbsd_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 | ||
360 | void | |
361 | nbsd_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 | } |