]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/fbsd-tdep.c
Rename gdb exception types
[thirdparty/binutils-gdb.git] / gdb / fbsd-tdep.c
1 /* Target-dependent code for FreeBSD, architecture-independent.
2
3 Copyright (C) 2002-2019 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "auxv.h"
22 #include "gdbcore.h"
23 #include "inferior.h"
24 #include "regcache.h"
25 #include "regset.h"
26 #include "gdbthread.h"
27 #include "objfiles.h"
28 #include "xml-syscall.h"
29 #include <sys/socket.h>
30 #include <arpa/inet.h>
31
32 #include "elf-bfd.h"
33 #include "fbsd-tdep.h"
34
35 /* This enum is derived from FreeBSD's <sys/signal.h>. */
36
37 enum
38 {
39 FREEBSD_SIGHUP = 1,
40 FREEBSD_SIGINT = 2,
41 FREEBSD_SIGQUIT = 3,
42 FREEBSD_SIGILL = 4,
43 FREEBSD_SIGTRAP = 5,
44 FREEBSD_SIGABRT = 6,
45 FREEBSD_SIGEMT = 7,
46 FREEBSD_SIGFPE = 8,
47 FREEBSD_SIGKILL = 9,
48 FREEBSD_SIGBUS = 10,
49 FREEBSD_SIGSEGV = 11,
50 FREEBSD_SIGSYS = 12,
51 FREEBSD_SIGPIPE = 13,
52 FREEBSD_SIGALRM = 14,
53 FREEBSD_SIGTERM = 15,
54 FREEBSD_SIGURG = 16,
55 FREEBSD_SIGSTOP = 17,
56 FREEBSD_SIGTSTP = 18,
57 FREEBSD_SIGCONT = 19,
58 FREEBSD_SIGCHLD = 20,
59 FREEBSD_SIGTTIN = 21,
60 FREEBSD_SIGTTOU = 22,
61 FREEBSD_SIGIO = 23,
62 FREEBSD_SIGXCPU = 24,
63 FREEBSD_SIGXFSZ = 25,
64 FREEBSD_SIGVTALRM = 26,
65 FREEBSD_SIGPROF = 27,
66 FREEBSD_SIGWINCH = 28,
67 FREEBSD_SIGINFO = 29,
68 FREEBSD_SIGUSR1 = 30,
69 FREEBSD_SIGUSR2 = 31,
70 FREEBSD_SIGTHR = 32,
71 FREEBSD_SIGLIBRT = 33,
72 FREEBSD_SIGRTMIN = 65,
73 FREEBSD_SIGRTMAX = 126,
74 };
75
76 /* FreeBSD kernels 12.0 and later include a copy of the
77 'ptrace_lwpinfo' structure returned by the PT_LWPINFO ptrace
78 operation in an ELF core note (NT_FREEBSD_PTLWPINFO) for each LWP.
79 The constants below define the offset of field members and flags in
80 this structure used by methods in this file. Note that the
81 'ptrace_lwpinfo' struct in the note is preceded by a 4 byte integer
82 containing the size of the structure. */
83
84 #define LWPINFO_OFFSET 0x4
85
86 /* Offsets in ptrace_lwpinfo. */
87 #define LWPINFO_PL_FLAGS 0x8
88 #define LWPINFO64_PL_SIGINFO 0x30
89 #define LWPINFO32_PL_SIGINFO 0x2c
90
91 /* Flags in pl_flags. */
92 #define PL_FLAG_SI 0x20 /* siginfo is valid */
93
94 /* Sizes of siginfo_t. */
95 #define SIZE64_SIGINFO_T 80
96 #define SIZE32_SIGINFO_T 64
97
98 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_VMMAP core
99 dump notes. See <sys/user.h> for the definition of struct
100 kinfo_vmentry. This data structure should have the same layout on
101 all architectures.
102
103 Note that FreeBSD 7.0 used an older version of this structure
104 (struct kinfo_ovmentry), but the NT_FREEBSD_PROCSTAT_VMMAP core
105 dump note wasn't introduced until FreeBSD 9.2. As a result, the
106 core dump note has always used the 7.1 and later structure
107 format. */
108
109 #define KVE_STRUCTSIZE 0x0
110 #define KVE_START 0x8
111 #define KVE_END 0x10
112 #define KVE_OFFSET 0x18
113 #define KVE_FLAGS 0x2c
114 #define KVE_PROTECTION 0x38
115 #define KVE_PATH 0x88
116
117 /* Flags in the 'kve_protection' field in struct kinfo_vmentry. These
118 match the KVME_PROT_* constants in <sys/user.h>. */
119
120 #define KINFO_VME_PROT_READ 0x00000001
121 #define KINFO_VME_PROT_WRITE 0x00000002
122 #define KINFO_VME_PROT_EXEC 0x00000004
123
124 /* Flags in the 'kve_flags' field in struct kinfo_vmentry. These
125 match the KVME_FLAG_* constants in <sys/user.h>. */
126
127 #define KINFO_VME_FLAG_COW 0x00000001
128 #define KINFO_VME_FLAG_NEEDS_COPY 0x00000002
129 #define KINFO_VME_FLAG_NOCOREDUMP 0x00000004
130 #define KINFO_VME_FLAG_SUPER 0x00000008
131 #define KINFO_VME_FLAG_GROWS_UP 0x00000010
132 #define KINFO_VME_FLAG_GROWS_DOWN 0x00000020
133
134 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_FILES core
135 dump notes. See <sys/user.h> for the definition of struct
136 kinfo_file. This data structure should have the same layout on all
137 architectures.
138
139 Note that FreeBSD 7.0 used an older version of this structure
140 (struct kinfo_ofile), but the NT_FREEBSD_PROCSTAT_FILES core dump
141 note wasn't introduced until FreeBSD 9.2. As a result, the core
142 dump note has always used the 7.1 and later structure format. */
143
144 #define KF_STRUCTSIZE 0x0
145 #define KF_TYPE 0x4
146 #define KF_FD 0x8
147 #define KF_FLAGS 0x10
148 #define KF_OFFSET 0x18
149 #define KF_VNODE_TYPE 0x20
150 #define KF_SOCK_DOMAIN 0x24
151 #define KF_SOCK_TYPE 0x28
152 #define KF_SOCK_PROTOCOL 0x2c
153 #define KF_SA_LOCAL 0x30
154 #define KF_SA_PEER 0xb0
155 #define KF_PATH 0x170
156
157 /* Constants for the 'kf_type' field in struct kinfo_file. These
158 match the KF_TYPE_* constants in <sys/user.h>. */
159
160 #define KINFO_FILE_TYPE_VNODE 1
161 #define KINFO_FILE_TYPE_SOCKET 2
162 #define KINFO_FILE_TYPE_PIPE 3
163 #define KINFO_FILE_TYPE_FIFO 4
164 #define KINFO_FILE_TYPE_KQUEUE 5
165 #define KINFO_FILE_TYPE_CRYPTO 6
166 #define KINFO_FILE_TYPE_MQUEUE 7
167 #define KINFO_FILE_TYPE_SHM 8
168 #define KINFO_FILE_TYPE_SEM 9
169 #define KINFO_FILE_TYPE_PTS 10
170 #define KINFO_FILE_TYPE_PROCDESC 11
171
172 /* Special values for the 'kf_fd' field in struct kinfo_file. These
173 match the KF_FD_TYPE_* constants in <sys/user.h>. */
174
175 #define KINFO_FILE_FD_TYPE_CWD -1
176 #define KINFO_FILE_FD_TYPE_ROOT -2
177 #define KINFO_FILE_FD_TYPE_JAIL -3
178 #define KINFO_FILE_FD_TYPE_TRACE -4
179 #define KINFO_FILE_FD_TYPE_TEXT -5
180 #define KINFO_FILE_FD_TYPE_CTTY -6
181
182 /* Flags in the 'kf_flags' field in struct kinfo_file. These match
183 the KF_FLAG_* constants in <sys/user.h>. */
184
185 #define KINFO_FILE_FLAG_READ 0x00000001
186 #define KINFO_FILE_FLAG_WRITE 0x00000002
187 #define KINFO_FILE_FLAG_APPEND 0x00000004
188 #define KINFO_FILE_FLAG_ASYNC 0x00000008
189 #define KINFO_FILE_FLAG_FSYNC 0x00000010
190 #define KINFO_FILE_FLAG_NONBLOCK 0x00000020
191 #define KINFO_FILE_FLAG_DIRECT 0x00000040
192 #define KINFO_FILE_FLAG_HASLOCK 0x00000080
193 #define KINFO_FILE_FLAG_EXEC 0x00004000
194
195 /* Constants for the 'kf_vnode_type' field in struct kinfo_file.
196 These match the KF_VTYPE_* constants in <sys/user.h>. */
197
198 #define KINFO_FILE_VTYPE_VREG 1
199 #define KINFO_FILE_VTYPE_VDIR 2
200 #define KINFO_FILE_VTYPE_VCHR 4
201 #define KINFO_FILE_VTYPE_VLNK 5
202 #define KINFO_FILE_VTYPE_VSOCK 6
203 #define KINFO_FILE_VTYPE_VFIFO 7
204
205 /* Constants for socket address families. These match AF_* constants
206 in <sys/socket.h>. */
207
208 #define FBSD_AF_UNIX 1
209 #define FBSD_AF_INET 2
210 #define FBSD_AF_INET6 28
211
212 /* Constants for socket types. These match SOCK_* constants in
213 <sys/socket.h>. */
214
215 #define FBSD_SOCK_STREAM 1
216 #define FBSD_SOCK_DGRAM 2
217 #define FBSD_SOCK_SEQPACKET 5
218
219 /* Constants for IP protocols. These match IPPROTO_* constants in
220 <netinet/in.h>. */
221
222 #define FBSD_IPPROTO_ICMP 1
223 #define FBSD_IPPROTO_TCP 6
224 #define FBSD_IPPROTO_UDP 17
225 #define FBSD_IPPROTO_SCTP 132
226
227 /* Socket address structures. These have the same layout on all
228 FreeBSD architectures. In addition, multibyte fields such as IP
229 addresses are always stored in network byte order. */
230
231 struct fbsd_sockaddr_in
232 {
233 uint8_t sin_len;
234 uint8_t sin_family;
235 uint8_t sin_port[2];
236 uint8_t sin_addr[4];
237 char sin_zero[8];
238 };
239
240 struct fbsd_sockaddr_in6
241 {
242 uint8_t sin6_len;
243 uint8_t sin6_family;
244 uint8_t sin6_port[2];
245 uint32_t sin6_flowinfo;
246 uint8_t sin6_addr[16];
247 uint32_t sin6_scope_id;
248 };
249
250 struct fbsd_sockaddr_un
251 {
252 uint8_t sun_len;
253 uint8_t sun_family;
254 char sun_path[104];
255 };
256
257 /* Number of 32-bit words in a signal set. This matches _SIG_WORDS in
258 <sys/_sigset.h> and is the same value on all architectures. */
259
260 #define SIG_WORDS 4
261
262 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_PROC core
263 dump notes. See <sys/user.h> for the definition of struct
264 kinfo_proc. This data structure has different layouts on different
265 architectures mostly due to ILP32 vs LP64. However, FreeBSD/i386
266 uses a 32-bit time_t while all other architectures use a 64-bit
267 time_t.
268
269 The core dump note actually contains one kinfo_proc structure for
270 each thread, but all of the process-wide data can be obtained from
271 the first structure. One result of this note's format is that some
272 of the process-wide status available in the native target method
273 from the kern.proc.pid.<pid> sysctl such as ki_stat and ki_siglist
274 is not available from a core dump. Instead, the per-thread data
275 structures contain the value of these fields for individual
276 threads. */
277
278 struct kinfo_proc_layout
279 {
280 /* Offsets of struct kinfo_proc members. */
281 int ki_layout;
282 int ki_pid;
283 int ki_ppid;
284 int ki_pgid;
285 int ki_tpgid;
286 int ki_sid;
287 int ki_tdev_freebsd11;
288 int ki_sigignore;
289 int ki_sigcatch;
290 int ki_uid;
291 int ki_ruid;
292 int ki_svuid;
293 int ki_rgid;
294 int ki_svgid;
295 int ki_ngroups;
296 int ki_groups;
297 int ki_size;
298 int ki_rssize;
299 int ki_tsize;
300 int ki_dsize;
301 int ki_ssize;
302 int ki_start;
303 int ki_nice;
304 int ki_comm;
305 int ki_tdev;
306 int ki_rusage;
307 int ki_rusage_ch;
308
309 /* Offsets of struct rusage members. */
310 int ru_utime;
311 int ru_stime;
312 int ru_maxrss;
313 int ru_minflt;
314 int ru_majflt;
315 };
316
317 const struct kinfo_proc_layout kinfo_proc_layout_32 =
318 {
319 .ki_layout = 0x4,
320 .ki_pid = 0x28,
321 .ki_ppid = 0x2c,
322 .ki_pgid = 0x30,
323 .ki_tpgid = 0x34,
324 .ki_sid = 0x38,
325 .ki_tdev_freebsd11 = 0x44,
326 .ki_sigignore = 0x68,
327 .ki_sigcatch = 0x78,
328 .ki_uid = 0x88,
329 .ki_ruid = 0x8c,
330 .ki_svuid = 0x90,
331 .ki_rgid = 0x94,
332 .ki_svgid = 0x98,
333 .ki_ngroups = 0x9c,
334 .ki_groups = 0xa0,
335 .ki_size = 0xe0,
336 .ki_rssize = 0xe4,
337 .ki_tsize = 0xec,
338 .ki_dsize = 0xf0,
339 .ki_ssize = 0xf4,
340 .ki_start = 0x118,
341 .ki_nice = 0x145,
342 .ki_comm = 0x17f,
343 .ki_tdev = 0x1f0,
344 .ki_rusage = 0x220,
345 .ki_rusage_ch = 0x278,
346
347 .ru_utime = 0x0,
348 .ru_stime = 0x10,
349 .ru_maxrss = 0x20,
350 .ru_minflt = 0x30,
351 .ru_majflt = 0x34,
352 };
353
354 const struct kinfo_proc_layout kinfo_proc_layout_i386 =
355 {
356 .ki_layout = 0x4,
357 .ki_pid = 0x28,
358 .ki_ppid = 0x2c,
359 .ki_pgid = 0x30,
360 .ki_tpgid = 0x34,
361 .ki_sid = 0x38,
362 .ki_tdev_freebsd11 = 0x44,
363 .ki_sigignore = 0x68,
364 .ki_sigcatch = 0x78,
365 .ki_uid = 0x88,
366 .ki_ruid = 0x8c,
367 .ki_svuid = 0x90,
368 .ki_rgid = 0x94,
369 .ki_svgid = 0x98,
370 .ki_ngroups = 0x9c,
371 .ki_groups = 0xa0,
372 .ki_size = 0xe0,
373 .ki_rssize = 0xe4,
374 .ki_tsize = 0xec,
375 .ki_dsize = 0xf0,
376 .ki_ssize = 0xf4,
377 .ki_start = 0x118,
378 .ki_nice = 0x135,
379 .ki_comm = 0x16f,
380 .ki_tdev = 0x1e0,
381 .ki_rusage = 0x210,
382 .ki_rusage_ch = 0x258,
383
384 .ru_utime = 0x0,
385 .ru_stime = 0x8,
386 .ru_maxrss = 0x10,
387 .ru_minflt = 0x20,
388 .ru_majflt = 0x24,
389 };
390
391 const struct kinfo_proc_layout kinfo_proc_layout_64 =
392 {
393 .ki_layout = 0x4,
394 .ki_pid = 0x48,
395 .ki_ppid = 0x4c,
396 .ki_pgid = 0x50,
397 .ki_tpgid = 0x54,
398 .ki_sid = 0x58,
399 .ki_tdev_freebsd11 = 0x64,
400 .ki_sigignore = 0x88,
401 .ki_sigcatch = 0x98,
402 .ki_uid = 0xa8,
403 .ki_ruid = 0xac,
404 .ki_svuid = 0xb0,
405 .ki_rgid = 0xb4,
406 .ki_svgid = 0xb8,
407 .ki_ngroups = 0xbc,
408 .ki_groups = 0xc0,
409 .ki_size = 0x100,
410 .ki_rssize = 0x108,
411 .ki_tsize = 0x118,
412 .ki_dsize = 0x120,
413 .ki_ssize = 0x128,
414 .ki_start = 0x150,
415 .ki_nice = 0x185,
416 .ki_comm = 0x1bf,
417 .ki_tdev = 0x230,
418 .ki_rusage = 0x260,
419 .ki_rusage_ch = 0x2f0,
420
421 .ru_utime = 0x0,
422 .ru_stime = 0x10,
423 .ru_maxrss = 0x20,
424 .ru_minflt = 0x40,
425 .ru_majflt = 0x48,
426 };
427
428 static struct gdbarch_data *fbsd_gdbarch_data_handle;
429
430 struct fbsd_gdbarch_data
431 {
432 struct type *siginfo_type;
433 };
434
435 static void *
436 init_fbsd_gdbarch_data (struct gdbarch *gdbarch)
437 {
438 return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct fbsd_gdbarch_data);
439 }
440
441 static struct fbsd_gdbarch_data *
442 get_fbsd_gdbarch_data (struct gdbarch *gdbarch)
443 {
444 return ((struct fbsd_gdbarch_data *)
445 gdbarch_data (gdbarch, fbsd_gdbarch_data_handle));
446 }
447
448 /* Per-program-space data for FreeBSD architectures. */
449 static const struct program_space_data *fbsd_pspace_data_handle;
450
451 struct fbsd_pspace_data
452 {
453 /* Offsets in the runtime linker's 'Obj_Entry' structure. */
454 LONGEST off_linkmap;
455 LONGEST off_tlsindex;
456 bool rtld_offsets_valid;
457 };
458
459 static struct fbsd_pspace_data *
460 get_fbsd_pspace_data (struct program_space *pspace)
461 {
462 struct fbsd_pspace_data *data;
463
464 data = ((struct fbsd_pspace_data *)
465 program_space_data (pspace, fbsd_pspace_data_handle));
466 if (data == NULL)
467 {
468 data = XCNEW (struct fbsd_pspace_data);
469 set_program_space_data (pspace, fbsd_pspace_data_handle, data);
470 }
471
472 return data;
473 }
474
475 /* The cleanup callback for FreeBSD architecture per-program-space data. */
476
477 static void
478 fbsd_pspace_data_cleanup (struct program_space *pspace, void *data)
479 {
480 xfree (data);
481 }
482
483 /* This is how we want PTIDs from core files to be printed. */
484
485 static std::string
486 fbsd_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
487 {
488 if (ptid.lwp () != 0)
489 return string_printf ("LWP %ld", ptid.lwp ());
490
491 return normal_pid_to_str (ptid);
492 }
493
494 /* Extract the name assigned to a thread from a core. Returns the
495 string in a static buffer. */
496
497 static const char *
498 fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr)
499 {
500 static char buf[80];
501 struct bfd_section *section;
502 bfd_size_type size;
503
504 if (thr->ptid.lwp () != 0)
505 {
506 /* FreeBSD includes a NT_FREEBSD_THRMISC note for each thread
507 whose contents are defined by a "struct thrmisc" declared in
508 <sys/procfs.h> on FreeBSD. The per-thread name is stored as
509 a null-terminated string as the first member of the
510 structure. Rather than define the full structure here, just
511 extract the null-terminated name from the start of the
512 note. */
513 thread_section_name section_name (".thrmisc", thr->ptid);
514
515 section = bfd_get_section_by_name (core_bfd, section_name.c_str ());
516 if (section != NULL && bfd_section_size (core_bfd, section) > 0)
517 {
518 /* Truncate the name if it is longer than "buf". */
519 size = bfd_section_size (core_bfd, section);
520 if (size > sizeof buf - 1)
521 size = sizeof buf - 1;
522 if (bfd_get_section_contents (core_bfd, section, buf, (file_ptr) 0,
523 size)
524 && buf[0] != '\0')
525 {
526 buf[size] = '\0';
527
528 /* Note that each thread will report the process command
529 as its thread name instead of an empty name if a name
530 has not been set explicitly. Return a NULL name in
531 that case. */
532 if (strcmp (buf, elf_tdata (core_bfd)->core->program) != 0)
533 return buf;
534 }
535 }
536 }
537
538 return NULL;
539 }
540
541 /* Implement the "core_xfer_siginfo" gdbarch method. */
542
543 static LONGEST
544 fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
545 ULONGEST offset, ULONGEST len)
546 {
547 size_t siginfo_size;
548
549 if (gdbarch_long_bit (gdbarch) == 32)
550 siginfo_size = SIZE32_SIGINFO_T;
551 else
552 siginfo_size = SIZE64_SIGINFO_T;
553 if (offset > siginfo_size)
554 return -1;
555
556 thread_section_name section_name (".note.freebsdcore.lwpinfo", inferior_ptid);
557 asection *section = bfd_get_section_by_name (core_bfd, section_name.c_str ());
558 if (section == NULL)
559 return -1;
560
561 gdb_byte buf[4];
562 if (!bfd_get_section_contents (core_bfd, section, buf,
563 LWPINFO_OFFSET + LWPINFO_PL_FLAGS, 4))
564 return -1;
565
566 int pl_flags = extract_signed_integer (buf, 4, gdbarch_byte_order (gdbarch));
567 if (!(pl_flags & PL_FLAG_SI))
568 return -1;
569
570 if (offset + len > siginfo_size)
571 len = siginfo_size - offset;
572
573 ULONGEST siginfo_offset;
574 if (gdbarch_long_bit (gdbarch) == 32)
575 siginfo_offset = LWPINFO_OFFSET + LWPINFO32_PL_SIGINFO;
576 else
577 siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO;
578
579 if (!bfd_get_section_contents (core_bfd, section, readbuf,
580 siginfo_offset + offset, len))
581 return -1;
582
583 return len;
584 }
585
586 static int
587 find_signalled_thread (struct thread_info *info, void *data)
588 {
589 if (info->suspend.stop_signal != GDB_SIGNAL_0
590 && info->ptid.pid () == inferior_ptid.pid ())
591 return 1;
592
593 return 0;
594 }
595
596 /* Structure for passing information from
597 fbsd_collect_thread_registers via an iterator to
598 fbsd_collect_regset_section_cb. */
599
600 struct fbsd_collect_regset_section_cb_data
601 {
602 const struct regcache *regcache;
603 bfd *obfd;
604 char *note_data;
605 int *note_size;
606 unsigned long lwp;
607 enum gdb_signal stop_signal;
608 int abort_iteration;
609 };
610
611 static void
612 fbsd_collect_regset_section_cb (const char *sect_name, int supply_size,
613 int collect_size, const struct regset *regset,
614 const char *human_name, void *cb_data)
615 {
616 char *buf;
617 struct fbsd_collect_regset_section_cb_data *data
618 = (struct fbsd_collect_regset_section_cb_data *) cb_data;
619
620 if (data->abort_iteration)
621 return;
622
623 gdb_assert (regset->collect_regset);
624
625 buf = (char *) xmalloc (collect_size);
626 regset->collect_regset (regset, data->regcache, -1, buf, collect_size);
627
628 /* PRSTATUS still needs to be treated specially. */
629 if (strcmp (sect_name, ".reg") == 0)
630 data->note_data = (char *) elfcore_write_prstatus
631 (data->obfd, data->note_data, data->note_size, data->lwp,
632 gdb_signal_to_host (data->stop_signal), buf);
633 else
634 data->note_data = (char *) elfcore_write_register_note
635 (data->obfd, data->note_data, data->note_size,
636 sect_name, buf, collect_size);
637 xfree (buf);
638
639 if (data->note_data == NULL)
640 data->abort_iteration = 1;
641 }
642
643 /* Records the thread's register state for the corefile note
644 section. */
645
646 static char *
647 fbsd_collect_thread_registers (const struct regcache *regcache,
648 ptid_t ptid, bfd *obfd,
649 char *note_data, int *note_size,
650 enum gdb_signal stop_signal)
651 {
652 struct gdbarch *gdbarch = regcache->arch ();
653 struct fbsd_collect_regset_section_cb_data data;
654
655 data.regcache = regcache;
656 data.obfd = obfd;
657 data.note_data = note_data;
658 data.note_size = note_size;
659 data.stop_signal = stop_signal;
660 data.abort_iteration = 0;
661 data.lwp = ptid.lwp ();
662
663 gdbarch_iterate_over_regset_sections (gdbarch,
664 fbsd_collect_regset_section_cb,
665 &data, regcache);
666 return data.note_data;
667 }
668
669 struct fbsd_corefile_thread_data
670 {
671 struct gdbarch *gdbarch;
672 bfd *obfd;
673 char *note_data;
674 int *note_size;
675 enum gdb_signal stop_signal;
676 };
677
678 /* Records the thread's register state for the corefile note
679 section. */
680
681 static void
682 fbsd_corefile_thread (struct thread_info *info,
683 struct fbsd_corefile_thread_data *args)
684 {
685 struct regcache *regcache;
686
687 regcache = get_thread_arch_regcache (info->ptid, args->gdbarch);
688
689 target_fetch_registers (regcache, -1);
690
691 args->note_data = fbsd_collect_thread_registers
692 (regcache, info->ptid, args->obfd, args->note_data,
693 args->note_size, args->stop_signal);
694 }
695
696 /* Return a byte_vector containing the contents of a core dump note
697 for the target object of type OBJECT. If STRUCTSIZE is non-zero,
698 the data is prefixed with a 32-bit integer size to match the format
699 used in FreeBSD NT_PROCSTAT_* notes. */
700
701 static gdb::optional<gdb::byte_vector>
702 fbsd_make_note_desc (enum target_object object, uint32_t structsize)
703 {
704 gdb::optional<gdb::byte_vector> buf =
705 target_read_alloc (current_top_target (), object, NULL);
706 if (!buf || buf->empty ())
707 return {};
708
709 if (structsize == 0)
710 return buf;
711
712 gdb::byte_vector desc (sizeof (structsize) + buf->size ());
713 memcpy (desc.data (), &structsize, sizeof (structsize));
714 memcpy (desc.data () + sizeof (structsize), buf->data (), buf->size ());
715 return desc;
716 }
717
718 /* Create appropriate note sections for a corefile, returning them in
719 allocated memory. */
720
721 static char *
722 fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
723 {
724 struct fbsd_corefile_thread_data thread_args;
725 char *note_data = NULL;
726 Elf_Internal_Ehdr *i_ehdrp;
727 struct thread_info *curr_thr, *signalled_thr;
728
729 /* Put a "FreeBSD" label in the ELF header. */
730 i_ehdrp = elf_elfheader (obfd);
731 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
732
733 gdb_assert (gdbarch_iterate_over_regset_sections_p (gdbarch));
734
735 if (get_exec_file (0))
736 {
737 const char *fname = lbasename (get_exec_file (0));
738 char *psargs = xstrdup (fname);
739
740 if (get_inferior_args ())
741 psargs = reconcat (psargs, psargs, " ", get_inferior_args (),
742 (char *) NULL);
743
744 note_data = elfcore_write_prpsinfo (obfd, note_data, note_size,
745 fname, psargs);
746 }
747
748 /* Thread register information. */
749 try
750 {
751 update_thread_list ();
752 }
753 catch (const gdb_exception_error &e)
754 {
755 exception_print (gdb_stderr, e);
756 }
757
758 /* Like the kernel, prefer dumping the signalled thread first.
759 "First thread" is what tools use to infer the signalled thread.
760 In case there's more than one signalled thread, prefer the
761 current thread, if it is signalled. */
762 curr_thr = inferior_thread ();
763 if (curr_thr->suspend.stop_signal != GDB_SIGNAL_0)
764 signalled_thr = curr_thr;
765 else
766 {
767 signalled_thr = iterate_over_threads (find_signalled_thread, NULL);
768 if (signalled_thr == NULL)
769 signalled_thr = curr_thr;
770 }
771
772 thread_args.gdbarch = gdbarch;
773 thread_args.obfd = obfd;
774 thread_args.note_data = note_data;
775 thread_args.note_size = note_size;
776 thread_args.stop_signal = signalled_thr->suspend.stop_signal;
777
778 fbsd_corefile_thread (signalled_thr, &thread_args);
779 for (thread_info *thr : current_inferior ()->non_exited_threads ())
780 {
781 if (thr == signalled_thr)
782 continue;
783
784 fbsd_corefile_thread (thr, &thread_args);
785 }
786
787 note_data = thread_args.note_data;
788
789 /* Auxiliary vector. */
790 uint32_t structsize = gdbarch_ptr_bit (gdbarch) / 4; /* Elf_Auxinfo */
791 gdb::optional<gdb::byte_vector> note_desc =
792 fbsd_make_note_desc (TARGET_OBJECT_AUXV, structsize);
793 if (note_desc && !note_desc->empty ())
794 {
795 note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
796 NT_FREEBSD_PROCSTAT_AUXV,
797 note_desc->data (), note_desc->size ());
798 if (!note_data)
799 return NULL;
800 }
801
802 /* Virtual memory mappings. */
803 note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_VMMAP, 0);
804 if (note_desc && !note_desc->empty ())
805 {
806 note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
807 NT_FREEBSD_PROCSTAT_VMMAP,
808 note_desc->data (), note_desc->size ());
809 if (!note_data)
810 return NULL;
811 }
812
813 note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_PS_STRINGS, 0);
814 if (note_desc && !note_desc->empty ())
815 {
816 note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
817 NT_FREEBSD_PROCSTAT_PSSTRINGS,
818 note_desc->data (), note_desc->size ());
819 if (!note_data)
820 return NULL;
821 }
822
823 return note_data;
824 }
825
826 /* Helper function to generate the file descriptor description for a
827 single open file in 'info proc files'. */
828
829 static const char *
830 fbsd_file_fd (int kf_fd)
831 {
832 switch (kf_fd)
833 {
834 case KINFO_FILE_FD_TYPE_CWD:
835 return "cwd";
836 case KINFO_FILE_FD_TYPE_ROOT:
837 return "root";
838 case KINFO_FILE_FD_TYPE_JAIL:
839 return "jail";
840 case KINFO_FILE_FD_TYPE_TRACE:
841 return "trace";
842 case KINFO_FILE_FD_TYPE_TEXT:
843 return "text";
844 case KINFO_FILE_FD_TYPE_CTTY:
845 return "ctty";
846 default:
847 return int_string (kf_fd, 10, 1, 0, 0);
848 }
849 }
850
851 /* Helper function to generate the file type for a single open file in
852 'info proc files'. */
853
854 static const char *
855 fbsd_file_type (int kf_type, int kf_vnode_type)
856 {
857 switch (kf_type)
858 {
859 case KINFO_FILE_TYPE_VNODE:
860 switch (kf_vnode_type)
861 {
862 case KINFO_FILE_VTYPE_VREG:
863 return "file";
864 case KINFO_FILE_VTYPE_VDIR:
865 return "dir";
866 case KINFO_FILE_VTYPE_VCHR:
867 return "chr";
868 case KINFO_FILE_VTYPE_VLNK:
869 return "link";
870 case KINFO_FILE_VTYPE_VSOCK:
871 return "socket";
872 case KINFO_FILE_VTYPE_VFIFO:
873 return "fifo";
874 default:
875 {
876 char *str = get_print_cell ();
877
878 xsnprintf (str, PRINT_CELL_SIZE, "vn:%d", kf_vnode_type);
879 return str;
880 }
881 }
882 case KINFO_FILE_TYPE_SOCKET:
883 return "socket";
884 case KINFO_FILE_TYPE_PIPE:
885 return "pipe";
886 case KINFO_FILE_TYPE_FIFO:
887 return "fifo";
888 case KINFO_FILE_TYPE_KQUEUE:
889 return "kqueue";
890 case KINFO_FILE_TYPE_CRYPTO:
891 return "crypto";
892 case KINFO_FILE_TYPE_MQUEUE:
893 return "mqueue";
894 case KINFO_FILE_TYPE_SHM:
895 return "shm";
896 case KINFO_FILE_TYPE_SEM:
897 return "sem";
898 case KINFO_FILE_TYPE_PTS:
899 return "pts";
900 case KINFO_FILE_TYPE_PROCDESC:
901 return "proc";
902 default:
903 return int_string (kf_type, 10, 1, 0, 0);
904 }
905 }
906
907 /* Helper function to generate the file flags for a single open file in
908 'info proc files'. */
909
910 static const char *
911 fbsd_file_flags (int kf_flags)
912 {
913 static char file_flags[10];
914
915 file_flags[0] = (kf_flags & KINFO_FILE_FLAG_READ) ? 'r' : '-';
916 file_flags[1] = (kf_flags & KINFO_FILE_FLAG_WRITE) ? 'w' : '-';
917 file_flags[2] = (kf_flags & KINFO_FILE_FLAG_EXEC) ? 'x' : '-';
918 file_flags[3] = (kf_flags & KINFO_FILE_FLAG_APPEND) ? 'a' : '-';
919 file_flags[4] = (kf_flags & KINFO_FILE_FLAG_ASYNC) ? 's' : '-';
920 file_flags[5] = (kf_flags & KINFO_FILE_FLAG_FSYNC) ? 'f' : '-';
921 file_flags[6] = (kf_flags & KINFO_FILE_FLAG_NONBLOCK) ? 'n' : '-';
922 file_flags[7] = (kf_flags & KINFO_FILE_FLAG_DIRECT) ? 'd' : '-';
923 file_flags[8] = (kf_flags & KINFO_FILE_FLAG_HASLOCK) ? 'l' : '-';
924 file_flags[9] = '\0';
925
926 return file_flags;
927 }
928
929 /* Helper function to generate the name of an IP protocol. */
930
931 static const char *
932 fbsd_ipproto (int protocol)
933 {
934 switch (protocol)
935 {
936 case FBSD_IPPROTO_ICMP:
937 return "icmp";
938 case FBSD_IPPROTO_TCP:
939 return "tcp";
940 case FBSD_IPPROTO_UDP:
941 return "udp";
942 case FBSD_IPPROTO_SCTP:
943 return "sctp";
944 default:
945 {
946 char *str = get_print_cell ();
947
948 xsnprintf (str, PRINT_CELL_SIZE, "ip<%d>", protocol);
949 return str;
950 }
951 }
952 }
953
954 /* Helper function to print out an IPv4 socket address. */
955
956 static void
957 fbsd_print_sockaddr_in (const void *sockaddr)
958 {
959 const struct fbsd_sockaddr_in *sin =
960 reinterpret_cast<const struct fbsd_sockaddr_in *> (sockaddr);
961 char buf[INET_ADDRSTRLEN];
962
963 if (inet_ntop (AF_INET, sin->sin_addr, buf, sizeof buf) == nullptr)
964 error (_("Failed to format IPv4 address"));
965 printf_filtered ("%s:%u", buf,
966 (sin->sin_port[0] << 8) | sin->sin_port[1]);
967 }
968
969 /* Helper function to print out an IPv6 socket address. */
970
971 static void
972 fbsd_print_sockaddr_in6 (const void *sockaddr)
973 {
974 const struct fbsd_sockaddr_in6 *sin6 =
975 reinterpret_cast<const struct fbsd_sockaddr_in6 *> (sockaddr);
976 char buf[INET6_ADDRSTRLEN];
977
978 if (inet_ntop (AF_INET6, sin6->sin6_addr, buf, sizeof buf) == nullptr)
979 error (_("Failed to format IPv6 address"));
980 printf_filtered ("%s.%u", buf,
981 (sin6->sin6_port[0] << 8) | sin6->sin6_port[1]);
982 }
983
984 /* See fbsd-tdep.h. */
985
986 void
987 fbsd_info_proc_files_header ()
988 {
989 printf_filtered (_("Open files:\n\n"));
990 printf_filtered (" %6s %6s %10s %9s %s\n",
991 "FD", "Type", "Offset", "Flags ", "Name");
992 }
993
994 /* See fbsd-tdep.h. */
995
996 void
997 fbsd_info_proc_files_entry (int kf_type, int kf_fd, int kf_flags,
998 LONGEST kf_offset, int kf_vnode_type,
999 int kf_sock_domain, int kf_sock_type,
1000 int kf_sock_protocol, const void *kf_sa_local,
1001 const void *kf_sa_peer, const void *kf_path)
1002 {
1003 printf_filtered (" %6s %6s %10s %8s ",
1004 fbsd_file_fd (kf_fd),
1005 fbsd_file_type (kf_type, kf_vnode_type),
1006 kf_offset > -1 ? hex_string (kf_offset) : "-",
1007 fbsd_file_flags (kf_flags));
1008 if (kf_type == KINFO_FILE_TYPE_SOCKET)
1009 {
1010 switch (kf_sock_domain)
1011 {
1012 case FBSD_AF_UNIX:
1013 {
1014 switch (kf_sock_type)
1015 {
1016 case FBSD_SOCK_STREAM:
1017 printf_filtered ("unix stream:");
1018 break;
1019 case FBSD_SOCK_DGRAM:
1020 printf_filtered ("unix dgram:");
1021 break;
1022 case FBSD_SOCK_SEQPACKET:
1023 printf_filtered ("unix seqpacket:");
1024 break;
1025 default:
1026 printf_filtered ("unix <%d>:", kf_sock_type);
1027 break;
1028 }
1029
1030 /* For local sockets, print out the first non-nul path
1031 rather than both paths. */
1032 const struct fbsd_sockaddr_un *sun
1033 = reinterpret_cast<const struct fbsd_sockaddr_un *> (kf_sa_local);
1034 if (sun->sun_path[0] == 0)
1035 sun = reinterpret_cast<const struct fbsd_sockaddr_un *>
1036 (kf_sa_peer);
1037 printf_filtered ("%s", sun->sun_path);
1038 break;
1039 }
1040 case FBSD_AF_INET:
1041 printf_filtered ("%s4 ", fbsd_ipproto (kf_sock_protocol));
1042 fbsd_print_sockaddr_in (kf_sa_local);
1043 printf_filtered (" -> ");
1044 fbsd_print_sockaddr_in (kf_sa_peer);
1045 break;
1046 case FBSD_AF_INET6:
1047 printf_filtered ("%s6 ", fbsd_ipproto (kf_sock_protocol));
1048 fbsd_print_sockaddr_in6 (kf_sa_local);
1049 printf_filtered (" -> ");
1050 fbsd_print_sockaddr_in6 (kf_sa_peer);
1051 break;
1052 }
1053 }
1054 else
1055 printf_filtered ("%s", reinterpret_cast<const char *> (kf_path));
1056 printf_filtered ("\n");
1057 }
1058
1059 /* Implement "info proc files" for a corefile. */
1060
1061 static void
1062 fbsd_core_info_proc_files (struct gdbarch *gdbarch)
1063 {
1064 asection *section
1065 = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.files");
1066 if (section == NULL)
1067 {
1068 warning (_("unable to find open files in core file"));
1069 return;
1070 }
1071
1072 size_t note_size = bfd_get_section_size (section);
1073 if (note_size < 4)
1074 error (_("malformed core note - too short for header"));
1075
1076 gdb::def_vector<unsigned char> contents (note_size);
1077 if (!bfd_get_section_contents (core_bfd, section, contents.data (),
1078 0, note_size))
1079 error (_("could not get core note contents"));
1080
1081 unsigned char *descdata = contents.data ();
1082 unsigned char *descend = descdata + note_size;
1083
1084 /* Skip over the structure size. */
1085 descdata += 4;
1086
1087 fbsd_info_proc_files_header ();
1088
1089 while (descdata + KF_PATH < descend)
1090 {
1091 ULONGEST structsize = bfd_get_32 (core_bfd, descdata + KF_STRUCTSIZE);
1092 if (structsize < KF_PATH)
1093 error (_("malformed core note - file structure too small"));
1094
1095 LONGEST type = bfd_get_signed_32 (core_bfd, descdata + KF_TYPE);
1096 LONGEST fd = bfd_get_signed_32 (core_bfd, descdata + KF_FD);
1097 LONGEST flags = bfd_get_signed_32 (core_bfd, descdata + KF_FLAGS);
1098 LONGEST offset = bfd_get_signed_64 (core_bfd, descdata + KF_OFFSET);
1099 LONGEST vnode_type = bfd_get_signed_32 (core_bfd,
1100 descdata + KF_VNODE_TYPE);
1101 LONGEST sock_domain = bfd_get_signed_32 (core_bfd,
1102 descdata + KF_SOCK_DOMAIN);
1103 LONGEST sock_type = bfd_get_signed_32 (core_bfd, descdata + KF_SOCK_TYPE);
1104 LONGEST sock_protocol = bfd_get_signed_32 (core_bfd,
1105 descdata + KF_SOCK_PROTOCOL);
1106 fbsd_info_proc_files_entry (type, fd, flags, offset, vnode_type,
1107 sock_domain, sock_type, sock_protocol,
1108 descdata + KF_SA_LOCAL, descdata + KF_SA_PEER,
1109 descdata + KF_PATH);
1110
1111 descdata += structsize;
1112 }
1113 }
1114
1115 /* Helper function to generate mappings flags for a single VM map
1116 entry in 'info proc mappings'. */
1117
1118 static const char *
1119 fbsd_vm_map_entry_flags (int kve_flags, int kve_protection)
1120 {
1121 static char vm_flags[9];
1122
1123 vm_flags[0] = (kve_protection & KINFO_VME_PROT_READ) ? 'r' : '-';
1124 vm_flags[1] = (kve_protection & KINFO_VME_PROT_WRITE) ? 'w' : '-';
1125 vm_flags[2] = (kve_protection & KINFO_VME_PROT_EXEC) ? 'x' : '-';
1126 vm_flags[3] = ' ';
1127 vm_flags[4] = (kve_flags & KINFO_VME_FLAG_COW) ? 'C' : '-';
1128 vm_flags[5] = (kve_flags & KINFO_VME_FLAG_NEEDS_COPY) ? 'N' : '-';
1129 vm_flags[6] = (kve_flags & KINFO_VME_FLAG_SUPER) ? 'S' : '-';
1130 vm_flags[7] = (kve_flags & KINFO_VME_FLAG_GROWS_UP) ? 'U'
1131 : (kve_flags & KINFO_VME_FLAG_GROWS_DOWN) ? 'D' : '-';
1132 vm_flags[8] = '\0';
1133
1134 return vm_flags;
1135 }
1136
1137 /* See fbsd-tdep.h. */
1138
1139 void
1140 fbsd_info_proc_mappings_header (int addr_bit)
1141 {
1142 printf_filtered (_("Mapped address spaces:\n\n"));
1143 if (addr_bit == 64)
1144 {
1145 printf_filtered (" %18s %18s %10s %10s %9s %s\n",
1146 "Start Addr",
1147 " End Addr",
1148 " Size", " Offset", "Flags ", "File");
1149 }
1150 else
1151 {
1152 printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
1153 "Start Addr",
1154 " End Addr",
1155 " Size", " Offset", "Flags ", "File");
1156 }
1157 }
1158
1159 /* See fbsd-tdep.h. */
1160
1161 void
1162 fbsd_info_proc_mappings_entry (int addr_bit, ULONGEST kve_start,
1163 ULONGEST kve_end, ULONGEST kve_offset,
1164 int kve_flags, int kve_protection,
1165 const void *kve_path)
1166 {
1167 if (addr_bit == 64)
1168 {
1169 printf_filtered (" %18s %18s %10s %10s %9s %s\n",
1170 hex_string (kve_start),
1171 hex_string (kve_end),
1172 hex_string (kve_end - kve_start),
1173 hex_string (kve_offset),
1174 fbsd_vm_map_entry_flags (kve_flags, kve_protection),
1175 reinterpret_cast<const char *> (kve_path));
1176 }
1177 else
1178 {
1179 printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
1180 hex_string (kve_start),
1181 hex_string (kve_end),
1182 hex_string (kve_end - kve_start),
1183 hex_string (kve_offset),
1184 fbsd_vm_map_entry_flags (kve_flags, kve_protection),
1185 reinterpret_cast<const char *> (kve_path));
1186 }
1187 }
1188
1189 /* Implement "info proc mappings" for a corefile. */
1190
1191 static void
1192 fbsd_core_info_proc_mappings (struct gdbarch *gdbarch)
1193 {
1194 asection *section;
1195 unsigned char *descdata, *descend;
1196 size_t note_size;
1197
1198 section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.vmmap");
1199 if (section == NULL)
1200 {
1201 warning (_("unable to find mappings in core file"));
1202 return;
1203 }
1204
1205 note_size = bfd_get_section_size (section);
1206 if (note_size < 4)
1207 error (_("malformed core note - too short for header"));
1208
1209 gdb::def_vector<unsigned char> contents (note_size);
1210 if (!bfd_get_section_contents (core_bfd, section, contents.data (),
1211 0, note_size))
1212 error (_("could not get core note contents"));
1213
1214 descdata = contents.data ();
1215 descend = descdata + note_size;
1216
1217 /* Skip over the structure size. */
1218 descdata += 4;
1219
1220 fbsd_info_proc_mappings_header (gdbarch_addr_bit (gdbarch));
1221 while (descdata + KVE_PATH < descend)
1222 {
1223 ULONGEST structsize = bfd_get_32 (core_bfd, descdata + KVE_STRUCTSIZE);
1224 if (structsize < KVE_PATH)
1225 error (_("malformed core note - vmmap entry too small"));
1226
1227 ULONGEST start = bfd_get_64 (core_bfd, descdata + KVE_START);
1228 ULONGEST end = bfd_get_64 (core_bfd, descdata + KVE_END);
1229 ULONGEST offset = bfd_get_64 (core_bfd, descdata + KVE_OFFSET);
1230 LONGEST flags = bfd_get_signed_32 (core_bfd, descdata + KVE_FLAGS);
1231 LONGEST prot = bfd_get_signed_32 (core_bfd, descdata + KVE_PROTECTION);
1232 fbsd_info_proc_mappings_entry (gdbarch_addr_bit (gdbarch), start, end,
1233 offset, flags, prot, descdata + KVE_PATH);
1234
1235 descdata += structsize;
1236 }
1237 }
1238
1239 /* Fetch the pathname of a vnode for a single file descriptor from the
1240 file table core note. */
1241
1242 static gdb::unique_xmalloc_ptr<char>
1243 fbsd_core_vnode_path (struct gdbarch *gdbarch, int fd)
1244 {
1245 asection *section;
1246 unsigned char *descdata, *descend;
1247 size_t note_size;
1248
1249 section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.files");
1250 if (section == NULL)
1251 return nullptr;
1252
1253 note_size = bfd_get_section_size (section);
1254 if (note_size < 4)
1255 error (_("malformed core note - too short for header"));
1256
1257 gdb::def_vector<unsigned char> contents (note_size);
1258 if (!bfd_get_section_contents (core_bfd, section, contents.data (),
1259 0, note_size))
1260 error (_("could not get core note contents"));
1261
1262 descdata = contents.data ();
1263 descend = descdata + note_size;
1264
1265 /* Skip over the structure size. */
1266 descdata += 4;
1267
1268 while (descdata + KF_PATH < descend)
1269 {
1270 ULONGEST structsize;
1271
1272 structsize = bfd_get_32 (core_bfd, descdata + KF_STRUCTSIZE);
1273 if (structsize < KF_PATH)
1274 error (_("malformed core note - file structure too small"));
1275
1276 if (bfd_get_32 (core_bfd, descdata + KF_TYPE) == KINFO_FILE_TYPE_VNODE
1277 && bfd_get_signed_32 (core_bfd, descdata + KF_FD) == fd)
1278 {
1279 char *path = (char *) descdata + KF_PATH;
1280 return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
1281 }
1282
1283 descdata += structsize;
1284 }
1285 return nullptr;
1286 }
1287
1288 /* Helper function to read a struct timeval. */
1289
1290 static void
1291 fbsd_core_fetch_timeval (struct gdbarch *gdbarch, unsigned char *data,
1292 LONGEST &sec, ULONGEST &usec)
1293 {
1294 if (gdbarch_addr_bit (gdbarch) == 64)
1295 {
1296 sec = bfd_get_signed_64 (core_bfd, data);
1297 usec = bfd_get_64 (core_bfd, data + 8);
1298 }
1299 else if (bfd_get_arch (core_bfd) == bfd_arch_i386)
1300 {
1301 sec = bfd_get_signed_32 (core_bfd, data);
1302 usec = bfd_get_32 (core_bfd, data + 4);
1303 }
1304 else
1305 {
1306 sec = bfd_get_signed_64 (core_bfd, data);
1307 usec = bfd_get_32 (core_bfd, data + 8);
1308 }
1309 }
1310
1311 /* Print out the contents of a signal set. */
1312
1313 static void
1314 fbsd_print_sigset (const char *descr, unsigned char *sigset)
1315 {
1316 printf_filtered ("%s: ", descr);
1317 for (int i = 0; i < SIG_WORDS; i++)
1318 printf_filtered ("%08x ",
1319 (unsigned int) bfd_get_32 (core_bfd, sigset + i * 4));
1320 printf_filtered ("\n");
1321 }
1322
1323 /* Implement "info proc status" for a corefile. */
1324
1325 static void
1326 fbsd_core_info_proc_status (struct gdbarch *gdbarch)
1327 {
1328 const struct kinfo_proc_layout *kp;
1329 asection *section;
1330 unsigned char *descdata;
1331 int addr_bit, long_bit;
1332 size_t note_size;
1333 ULONGEST value;
1334 LONGEST sec;
1335
1336 section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.proc");
1337 if (section == NULL)
1338 {
1339 warning (_("unable to find process info in core file"));
1340 return;
1341 }
1342
1343 addr_bit = gdbarch_addr_bit (gdbarch);
1344 if (addr_bit == 64)
1345 kp = &kinfo_proc_layout_64;
1346 else if (bfd_get_arch (core_bfd) == bfd_arch_i386)
1347 kp = &kinfo_proc_layout_i386;
1348 else
1349 kp = &kinfo_proc_layout_32;
1350 long_bit = gdbarch_long_bit (gdbarch);
1351
1352 /*
1353 * Ensure that the note is large enough for all of the fields fetched
1354 * by this function. In particular, the note must contain the 32-bit
1355 * structure size, then it must be long enough to access the last
1356 * field used (ki_rusage_ch.ru_majflt) which is the size of a long.
1357 */
1358 note_size = bfd_get_section_size (section);
1359 if (note_size < (4 + kp->ki_rusage_ch + kp->ru_majflt
1360 + long_bit / TARGET_CHAR_BIT))
1361 error (_("malformed core note - too short"));
1362
1363 gdb::def_vector<unsigned char> contents (note_size);
1364 if (!bfd_get_section_contents (core_bfd, section, contents.data (),
1365 0, note_size))
1366 error (_("could not get core note contents"));
1367
1368 descdata = contents.data ();
1369
1370 /* Skip over the structure size. */
1371 descdata += 4;
1372
1373 /* Verify 'ki_layout' is 0. */
1374 if (bfd_get_32 (core_bfd, descdata + kp->ki_layout) != 0)
1375 {
1376 warning (_("unsupported process information in core file"));
1377 return;
1378 }
1379
1380 printf_filtered ("Name: %.19s\n", descdata + kp->ki_comm);
1381 printf_filtered ("Process ID: %s\n",
1382 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_pid)));
1383 printf_filtered ("Parent process: %s\n",
1384 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_ppid)));
1385 printf_filtered ("Process group: %s\n",
1386 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_pgid)));
1387 printf_filtered ("Session id: %s\n",
1388 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_sid)));
1389
1390 /* FreeBSD 12.0 and later store a 64-bit dev_t at 'ki_tdev'. Older
1391 kernels store a 32-bit dev_t at 'ki_tdev_freebsd11'. In older
1392 kernels the 64-bit 'ki_tdev' field is in a reserved section of
1393 the structure that is cleared to zero. Assume that a zero value
1394 in ki_tdev indicates a core dump from an older kernel and use the
1395 value in 'ki_tdev_freebsd11' instead. */
1396 value = bfd_get_64 (core_bfd, descdata + kp->ki_tdev);
1397 if (value == 0)
1398 value = bfd_get_32 (core_bfd, descdata + kp->ki_tdev_freebsd11);
1399 printf_filtered ("TTY: %s\n", pulongest (value));
1400 printf_filtered ("TTY owner process group: %s\n",
1401 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_tpgid)));
1402 printf_filtered ("User IDs (real, effective, saved): %s %s %s\n",
1403 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_ruid)),
1404 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_uid)),
1405 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_svuid)));
1406 printf_filtered ("Group IDs (real, effective, saved): %s %s %s\n",
1407 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_rgid)),
1408 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_groups)),
1409 pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_svgid)));
1410 printf_filtered ("Groups: ");
1411 uint16_t ngroups = bfd_get_16 (core_bfd, descdata + kp->ki_ngroups);
1412 for (int i = 0; i < ngroups; i++)
1413 printf_filtered ("%s ",
1414 pulongest (bfd_get_32 (core_bfd,
1415 descdata + kp->ki_groups + i * 4)));
1416 printf_filtered ("\n");
1417 value = bfd_get (long_bit, core_bfd,
1418 descdata + kp->ki_rusage + kp->ru_minflt);
1419 printf_filtered ("Minor faults (no memory page): %s\n", pulongest (value));
1420 value = bfd_get (long_bit, core_bfd,
1421 descdata + kp->ki_rusage_ch + kp->ru_minflt);
1422 printf_filtered ("Minor faults, children: %s\n", pulongest (value));
1423 value = bfd_get (long_bit, core_bfd,
1424 descdata + kp->ki_rusage + kp->ru_majflt);
1425 printf_filtered ("Major faults (memory page faults): %s\n",
1426 pulongest (value));
1427 value = bfd_get (long_bit, core_bfd,
1428 descdata + kp->ki_rusage_ch + kp->ru_majflt);
1429 printf_filtered ("Major faults, children: %s\n", pulongest (value));
1430 fbsd_core_fetch_timeval (gdbarch,
1431 descdata + kp->ki_rusage + kp->ru_utime,
1432 sec, value);
1433 printf_filtered ("utime: %s.%06d\n", plongest (sec), (int) value);
1434 fbsd_core_fetch_timeval (gdbarch,
1435 descdata + kp->ki_rusage + kp->ru_stime,
1436 sec, value);
1437 printf_filtered ("stime: %s.%06d\n", plongest (sec), (int) value);
1438 fbsd_core_fetch_timeval (gdbarch,
1439 descdata + kp->ki_rusage_ch + kp->ru_utime,
1440 sec, value);
1441 printf_filtered ("utime, children: %s.%06d\n", plongest (sec), (int) value);
1442 fbsd_core_fetch_timeval (gdbarch,
1443 descdata + kp->ki_rusage_ch + kp->ru_stime,
1444 sec, value);
1445 printf_filtered ("stime, children: %s.%06d\n", plongest (sec), (int) value);
1446 printf_filtered ("'nice' value: %d\n",
1447 bfd_get_signed_8 (core_bfd, descdata + kp->ki_nice));
1448 fbsd_core_fetch_timeval (gdbarch, descdata + kp->ki_start, sec, value);
1449 printf_filtered ("Start time: %s.%06d\n", plongest (sec), (int) value);
1450 printf_filtered ("Virtual memory size: %s kB\n",
1451 pulongest (bfd_get (addr_bit, core_bfd,
1452 descdata + kp->ki_size) / 1024));
1453 printf_filtered ("Data size: %s pages\n",
1454 pulongest (bfd_get (addr_bit, core_bfd,
1455 descdata + kp->ki_dsize)));
1456 printf_filtered ("Stack size: %s pages\n",
1457 pulongest (bfd_get (addr_bit, core_bfd,
1458 descdata + kp->ki_ssize)));
1459 printf_filtered ("Text size: %s pages\n",
1460 pulongest (bfd_get (addr_bit, core_bfd,
1461 descdata + kp->ki_tsize)));
1462 printf_filtered ("Resident set size: %s pages\n",
1463 pulongest (bfd_get (addr_bit, core_bfd,
1464 descdata + kp->ki_rssize)));
1465 printf_filtered ("Maximum RSS: %s pages\n",
1466 pulongest (bfd_get (long_bit, core_bfd,
1467 descdata + kp->ki_rusage
1468 + kp->ru_maxrss)));
1469 fbsd_print_sigset ("Ignored Signals", descdata + kp->ki_sigignore);
1470 fbsd_print_sigset ("Caught Signals", descdata + kp->ki_sigcatch);
1471 }
1472
1473 /* Implement the "core_info_proc" gdbarch method. */
1474
1475 static void
1476 fbsd_core_info_proc (struct gdbarch *gdbarch, const char *args,
1477 enum info_proc_what what)
1478 {
1479 bool do_cmdline = false;
1480 bool do_cwd = false;
1481 bool do_exe = false;
1482 bool do_files = false;
1483 bool do_mappings = false;
1484 bool do_status = false;
1485 int pid;
1486
1487 switch (what)
1488 {
1489 case IP_MINIMAL:
1490 do_cmdline = true;
1491 do_cwd = true;
1492 do_exe = true;
1493 break;
1494 case IP_MAPPINGS:
1495 do_mappings = true;
1496 break;
1497 case IP_STATUS:
1498 case IP_STAT:
1499 do_status = true;
1500 break;
1501 case IP_CMDLINE:
1502 do_cmdline = true;
1503 break;
1504 case IP_EXE:
1505 do_exe = true;
1506 break;
1507 case IP_CWD:
1508 do_cwd = true;
1509 break;
1510 case IP_FILES:
1511 do_files = true;
1512 break;
1513 case IP_ALL:
1514 do_cmdline = true;
1515 do_cwd = true;
1516 do_exe = true;
1517 do_files = true;
1518 do_mappings = true;
1519 do_status = true;
1520 break;
1521 default:
1522 return;
1523 }
1524
1525 pid = bfd_core_file_pid (core_bfd);
1526 if (pid != 0)
1527 printf_filtered (_("process %d\n"), pid);
1528
1529 if (do_cmdline)
1530 {
1531 const char *cmdline;
1532
1533 cmdline = bfd_core_file_failing_command (core_bfd);
1534 if (cmdline)
1535 printf_filtered ("cmdline = '%s'\n", cmdline);
1536 else
1537 warning (_("Command line unavailable"));
1538 }
1539 if (do_cwd)
1540 {
1541 gdb::unique_xmalloc_ptr<char> cwd =
1542 fbsd_core_vnode_path (gdbarch, KINFO_FILE_FD_TYPE_CWD);
1543 if (cwd)
1544 printf_filtered ("cwd = '%s'\n", cwd.get ());
1545 else
1546 warning (_("unable to read current working directory"));
1547 }
1548 if (do_exe)
1549 {
1550 gdb::unique_xmalloc_ptr<char> exe =
1551 fbsd_core_vnode_path (gdbarch, KINFO_FILE_FD_TYPE_TEXT);
1552 if (exe)
1553 printf_filtered ("exe = '%s'\n", exe.get ());
1554 else
1555 warning (_("unable to read executable path name"));
1556 }
1557 if (do_files)
1558 fbsd_core_info_proc_files (gdbarch);
1559 if (do_mappings)
1560 fbsd_core_info_proc_mappings (gdbarch);
1561 if (do_status)
1562 fbsd_core_info_proc_status (gdbarch);
1563 }
1564
1565 /* Print descriptions of FreeBSD-specific AUXV entries to FILE. */
1566
1567 static void
1568 fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file,
1569 CORE_ADDR type, CORE_ADDR val)
1570 {
1571 const char *name = "???";
1572 const char *description = "";
1573 enum auxv_format format = AUXV_FORMAT_HEX;
1574
1575 switch (type)
1576 {
1577 case AT_NULL:
1578 case AT_IGNORE:
1579 case AT_EXECFD:
1580 case AT_PHDR:
1581 case AT_PHENT:
1582 case AT_PHNUM:
1583 case AT_PAGESZ:
1584 case AT_BASE:
1585 case AT_FLAGS:
1586 case AT_ENTRY:
1587 case AT_NOTELF:
1588 case AT_UID:
1589 case AT_EUID:
1590 case AT_GID:
1591 case AT_EGID:
1592 default_print_auxv_entry (gdbarch, file, type, val);
1593 return;
1594 #define _TAGNAME(tag) #tag
1595 #define TAGNAME(tag) _TAGNAME(AT_##tag)
1596 #define TAG(tag, text, kind) \
1597 case AT_FREEBSD_##tag: name = TAGNAME(tag); description = text; format = kind; break
1598 TAG (EXECPATH, _("Executable path"), AUXV_FORMAT_STR);
1599 TAG (CANARY, _("Canary for SSP"), AUXV_FORMAT_HEX);
1600 TAG (CANARYLEN, ("Length of the SSP canary"), AUXV_FORMAT_DEC);
1601 TAG (OSRELDATE, _("OSRELDATE"), AUXV_FORMAT_DEC);
1602 TAG (NCPUS, _("Number of CPUs"), AUXV_FORMAT_DEC);
1603 TAG (PAGESIZES, _("Pagesizes"), AUXV_FORMAT_HEX);
1604 TAG (PAGESIZESLEN, _("Number of pagesizes"), AUXV_FORMAT_DEC);
1605 TAG (TIMEKEEP, _("Pointer to timehands"), AUXV_FORMAT_HEX);
1606 TAG (STACKPROT, _("Initial stack protection"), AUXV_FORMAT_HEX);
1607 TAG (EHDRFLAGS, _("ELF header e_flags"), AUXV_FORMAT_HEX);
1608 TAG (HWCAP, _("Machine-dependent CPU capability hints"), AUXV_FORMAT_HEX);
1609 TAG (HWCAP2, _("Extension of AT_HWCAP"), AUXV_FORMAT_HEX);
1610 }
1611
1612 fprint_auxv_entry (file, name, description, format, type, val);
1613 }
1614
1615 /* Implement the "get_siginfo_type" gdbarch method. */
1616
1617 static struct type *
1618 fbsd_get_siginfo_type (struct gdbarch *gdbarch)
1619 {
1620 struct fbsd_gdbarch_data *fbsd_gdbarch_data;
1621 struct type *int_type, *int32_type, *uint32_type, *long_type, *void_ptr_type;
1622 struct type *uid_type, *pid_type;
1623 struct type *sigval_type, *reason_type;
1624 struct type *siginfo_type;
1625 struct type *type;
1626
1627 fbsd_gdbarch_data = get_fbsd_gdbarch_data (gdbarch);
1628 if (fbsd_gdbarch_data->siginfo_type != NULL)
1629 return fbsd_gdbarch_data->siginfo_type;
1630
1631 int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
1632 0, "int");
1633 int32_type = arch_integer_type (gdbarch, 32, 0, "int32_t");
1634 uint32_type = arch_integer_type (gdbarch, 32, 1, "uint32_t");
1635 long_type = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch),
1636 0, "long");
1637 void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void);
1638
1639 /* union sigval */
1640 sigval_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
1641 TYPE_NAME (sigval_type) = xstrdup ("sigval");
1642 append_composite_type_field (sigval_type, "sival_int", int_type);
1643 append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type);
1644
1645 /* __pid_t */
1646 pid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
1647 TYPE_LENGTH (int32_type) * TARGET_CHAR_BIT, "__pid_t");
1648 TYPE_TARGET_TYPE (pid_type) = int32_type;
1649 TYPE_TARGET_STUB (pid_type) = 1;
1650
1651 /* __uid_t */
1652 uid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
1653 TYPE_LENGTH (uint32_type) * TARGET_CHAR_BIT,
1654 "__uid_t");
1655 TYPE_TARGET_TYPE (uid_type) = uint32_type;
1656 TYPE_TARGET_STUB (uid_type) = 1;
1657
1658 /* _reason */
1659 reason_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
1660
1661 /* _fault */
1662 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1663 append_composite_type_field (type, "si_trapno", int_type);
1664 append_composite_type_field (reason_type, "_fault", type);
1665
1666 /* _timer */
1667 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1668 append_composite_type_field (type, "si_timerid", int_type);
1669 append_composite_type_field (type, "si_overrun", int_type);
1670 append_composite_type_field (reason_type, "_timer", type);
1671
1672 /* _mesgq */
1673 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1674 append_composite_type_field (type, "si_mqd", int_type);
1675 append_composite_type_field (reason_type, "_mesgq", type);
1676
1677 /* _poll */
1678 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1679 append_composite_type_field (type, "si_band", long_type);
1680 append_composite_type_field (reason_type, "_poll", type);
1681
1682 /* __spare__ */
1683 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1684 append_composite_type_field (type, "__spare1__", long_type);
1685 append_composite_type_field (type, "__spare2__",
1686 init_vector_type (int_type, 7));
1687 append_composite_type_field (reason_type, "__spare__", type);
1688
1689 /* struct siginfo */
1690 siginfo_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1691 TYPE_NAME (siginfo_type) = xstrdup ("siginfo");
1692 append_composite_type_field (siginfo_type, "si_signo", int_type);
1693 append_composite_type_field (siginfo_type, "si_errno", int_type);
1694 append_composite_type_field (siginfo_type, "si_code", int_type);
1695 append_composite_type_field (siginfo_type, "si_pid", pid_type);
1696 append_composite_type_field (siginfo_type, "si_uid", uid_type);
1697 append_composite_type_field (siginfo_type, "si_status", int_type);
1698 append_composite_type_field (siginfo_type, "si_addr", void_ptr_type);
1699 append_composite_type_field (siginfo_type, "si_value", sigval_type);
1700 append_composite_type_field (siginfo_type, "_reason", reason_type);
1701
1702 fbsd_gdbarch_data->siginfo_type = siginfo_type;
1703
1704 return siginfo_type;
1705 }
1706
1707 /* Implement the "gdb_signal_from_target" gdbarch method. */
1708
1709 static enum gdb_signal
1710 fbsd_gdb_signal_from_target (struct gdbarch *gdbarch, int signal)
1711 {
1712 switch (signal)
1713 {
1714 case 0:
1715 return GDB_SIGNAL_0;
1716
1717 case FREEBSD_SIGHUP:
1718 return GDB_SIGNAL_HUP;
1719
1720 case FREEBSD_SIGINT:
1721 return GDB_SIGNAL_INT;
1722
1723 case FREEBSD_SIGQUIT:
1724 return GDB_SIGNAL_QUIT;
1725
1726 case FREEBSD_SIGILL:
1727 return GDB_SIGNAL_ILL;
1728
1729 case FREEBSD_SIGTRAP:
1730 return GDB_SIGNAL_TRAP;
1731
1732 case FREEBSD_SIGABRT:
1733 return GDB_SIGNAL_ABRT;
1734
1735 case FREEBSD_SIGEMT:
1736 return GDB_SIGNAL_EMT;
1737
1738 case FREEBSD_SIGFPE:
1739 return GDB_SIGNAL_FPE;
1740
1741 case FREEBSD_SIGKILL:
1742 return GDB_SIGNAL_KILL;
1743
1744 case FREEBSD_SIGBUS:
1745 return GDB_SIGNAL_BUS;
1746
1747 case FREEBSD_SIGSEGV:
1748 return GDB_SIGNAL_SEGV;
1749
1750 case FREEBSD_SIGSYS:
1751 return GDB_SIGNAL_SYS;
1752
1753 case FREEBSD_SIGPIPE:
1754 return GDB_SIGNAL_PIPE;
1755
1756 case FREEBSD_SIGALRM:
1757 return GDB_SIGNAL_ALRM;
1758
1759 case FREEBSD_SIGTERM:
1760 return GDB_SIGNAL_TERM;
1761
1762 case FREEBSD_SIGURG:
1763 return GDB_SIGNAL_URG;
1764
1765 case FREEBSD_SIGSTOP:
1766 return GDB_SIGNAL_STOP;
1767
1768 case FREEBSD_SIGTSTP:
1769 return GDB_SIGNAL_TSTP;
1770
1771 case FREEBSD_SIGCONT:
1772 return GDB_SIGNAL_CONT;
1773
1774 case FREEBSD_SIGCHLD:
1775 return GDB_SIGNAL_CHLD;
1776
1777 case FREEBSD_SIGTTIN:
1778 return GDB_SIGNAL_TTIN;
1779
1780 case FREEBSD_SIGTTOU:
1781 return GDB_SIGNAL_TTOU;
1782
1783 case FREEBSD_SIGIO:
1784 return GDB_SIGNAL_IO;
1785
1786 case FREEBSD_SIGXCPU:
1787 return GDB_SIGNAL_XCPU;
1788
1789 case FREEBSD_SIGXFSZ:
1790 return GDB_SIGNAL_XFSZ;
1791
1792 case FREEBSD_SIGVTALRM:
1793 return GDB_SIGNAL_VTALRM;
1794
1795 case FREEBSD_SIGPROF:
1796 return GDB_SIGNAL_PROF;
1797
1798 case FREEBSD_SIGWINCH:
1799 return GDB_SIGNAL_WINCH;
1800
1801 case FREEBSD_SIGINFO:
1802 return GDB_SIGNAL_INFO;
1803
1804 case FREEBSD_SIGUSR1:
1805 return GDB_SIGNAL_USR1;
1806
1807 case FREEBSD_SIGUSR2:
1808 return GDB_SIGNAL_USR2;
1809
1810 /* SIGTHR is the same as SIGLWP on FreeBSD. */
1811 case FREEBSD_SIGTHR:
1812 return GDB_SIGNAL_LWP;
1813
1814 case FREEBSD_SIGLIBRT:
1815 return GDB_SIGNAL_LIBRT;
1816 }
1817
1818 if (signal >= FREEBSD_SIGRTMIN && signal <= FREEBSD_SIGRTMAX)
1819 {
1820 int offset = signal - FREEBSD_SIGRTMIN;
1821
1822 return (enum gdb_signal) ((int) GDB_SIGNAL_REALTIME_65 + offset);
1823 }
1824
1825 return GDB_SIGNAL_UNKNOWN;
1826 }
1827
1828 /* Implement the "gdb_signal_to_target" gdbarch method. */
1829
1830 static int
1831 fbsd_gdb_signal_to_target (struct gdbarch *gdbarch,
1832 enum gdb_signal signal)
1833 {
1834 switch (signal)
1835 {
1836 case GDB_SIGNAL_0:
1837 return 0;
1838
1839 case GDB_SIGNAL_HUP:
1840 return FREEBSD_SIGHUP;
1841
1842 case GDB_SIGNAL_INT:
1843 return FREEBSD_SIGINT;
1844
1845 case GDB_SIGNAL_QUIT:
1846 return FREEBSD_SIGQUIT;
1847
1848 case GDB_SIGNAL_ILL:
1849 return FREEBSD_SIGILL;
1850
1851 case GDB_SIGNAL_TRAP:
1852 return FREEBSD_SIGTRAP;
1853
1854 case GDB_SIGNAL_ABRT:
1855 return FREEBSD_SIGABRT;
1856
1857 case GDB_SIGNAL_EMT:
1858 return FREEBSD_SIGEMT;
1859
1860 case GDB_SIGNAL_FPE:
1861 return FREEBSD_SIGFPE;
1862
1863 case GDB_SIGNAL_KILL:
1864 return FREEBSD_SIGKILL;
1865
1866 case GDB_SIGNAL_BUS:
1867 return FREEBSD_SIGBUS;
1868
1869 case GDB_SIGNAL_SEGV:
1870 return FREEBSD_SIGSEGV;
1871
1872 case GDB_SIGNAL_SYS:
1873 return FREEBSD_SIGSYS;
1874
1875 case GDB_SIGNAL_PIPE:
1876 return FREEBSD_SIGPIPE;
1877
1878 case GDB_SIGNAL_ALRM:
1879 return FREEBSD_SIGALRM;
1880
1881 case GDB_SIGNAL_TERM:
1882 return FREEBSD_SIGTERM;
1883
1884 case GDB_SIGNAL_URG:
1885 return FREEBSD_SIGURG;
1886
1887 case GDB_SIGNAL_STOP:
1888 return FREEBSD_SIGSTOP;
1889
1890 case GDB_SIGNAL_TSTP:
1891 return FREEBSD_SIGTSTP;
1892
1893 case GDB_SIGNAL_CONT:
1894 return FREEBSD_SIGCONT;
1895
1896 case GDB_SIGNAL_CHLD:
1897 return FREEBSD_SIGCHLD;
1898
1899 case GDB_SIGNAL_TTIN:
1900 return FREEBSD_SIGTTIN;
1901
1902 case GDB_SIGNAL_TTOU:
1903 return FREEBSD_SIGTTOU;
1904
1905 case GDB_SIGNAL_IO:
1906 return FREEBSD_SIGIO;
1907
1908 case GDB_SIGNAL_XCPU:
1909 return FREEBSD_SIGXCPU;
1910
1911 case GDB_SIGNAL_XFSZ:
1912 return FREEBSD_SIGXFSZ;
1913
1914 case GDB_SIGNAL_VTALRM:
1915 return FREEBSD_SIGVTALRM;
1916
1917 case GDB_SIGNAL_PROF:
1918 return FREEBSD_SIGPROF;
1919
1920 case GDB_SIGNAL_WINCH:
1921 return FREEBSD_SIGWINCH;
1922
1923 case GDB_SIGNAL_INFO:
1924 return FREEBSD_SIGINFO;
1925
1926 case GDB_SIGNAL_USR1:
1927 return FREEBSD_SIGUSR1;
1928
1929 case GDB_SIGNAL_USR2:
1930 return FREEBSD_SIGUSR2;
1931
1932 case GDB_SIGNAL_LWP:
1933 return FREEBSD_SIGTHR;
1934
1935 case GDB_SIGNAL_LIBRT:
1936 return FREEBSD_SIGLIBRT;
1937 }
1938
1939 if (signal >= GDB_SIGNAL_REALTIME_65
1940 && signal <= GDB_SIGNAL_REALTIME_126)
1941 {
1942 int offset = signal - GDB_SIGNAL_REALTIME_65;
1943
1944 return FREEBSD_SIGRTMIN + offset;
1945 }
1946
1947 return -1;
1948 }
1949
1950 /* Implement the "get_syscall_number" gdbarch method. */
1951
1952 static LONGEST
1953 fbsd_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread)
1954 {
1955
1956 /* FreeBSD doesn't use gdbarch_get_syscall_number since FreeBSD
1957 native targets fetch the system call number from the
1958 'pl_syscall_code' member of struct ptrace_lwpinfo in fbsd_wait.
1959 However, system call catching requires this function to be
1960 set. */
1961
1962 internal_error (__FILE__, __LINE__, _("fbsd_get_sycall_number called"));
1963 }
1964
1965 /* Read an integer symbol value from the current target. */
1966
1967 static LONGEST
1968 fbsd_read_integer_by_name (struct gdbarch *gdbarch, const char *name)
1969 {
1970 bound_minimal_symbol ms = lookup_minimal_symbol (name, NULL, NULL);
1971 if (ms.minsym == NULL)
1972 error (_("Unable to resolve symbol '%s'"), name);
1973
1974 gdb_byte buf[4];
1975 if (target_read_memory (BMSYMBOL_VALUE_ADDRESS (ms), buf, sizeof buf) != 0)
1976 error (_("Unable to read value of '%s'"), name);
1977
1978 return extract_signed_integer (buf, sizeof buf, gdbarch_byte_order (gdbarch));
1979 }
1980
1981 /* Lookup offsets of fields in the runtime linker's 'Obj_Entry'
1982 structure needed to determine the TLS index of an object file. */
1983
1984 static void
1985 fbsd_fetch_rtld_offsets (struct gdbarch *gdbarch, struct fbsd_pspace_data *data)
1986 {
1987 try
1988 {
1989 /* Fetch offsets from debug symbols in rtld. */
1990 struct symbol *obj_entry_sym
1991 = lookup_symbol_in_language ("Struct_Obj_Entry", NULL, STRUCT_DOMAIN,
1992 language_c, NULL).symbol;
1993 if (obj_entry_sym == NULL)
1994 error (_("Unable to find Struct_Obj_Entry symbol"));
1995 data->off_linkmap = lookup_struct_elt (SYMBOL_TYPE(obj_entry_sym),
1996 "linkmap", 0).offset / 8;
1997 data->off_tlsindex = lookup_struct_elt (SYMBOL_TYPE(obj_entry_sym),
1998 "tlsindex", 0).offset / 8;
1999 data->rtld_offsets_valid = true;
2000 return;
2001 }
2002 catch (const gdb_exception_error &e)
2003 {
2004 data->off_linkmap = -1;
2005 }
2006
2007 try
2008 {
2009 /* Fetch offsets from global variables in libthr. Note that
2010 this does not work for single-threaded processes that are not
2011 linked against libthr. */
2012 data->off_linkmap = fbsd_read_integer_by_name (gdbarch,
2013 "_thread_off_linkmap");
2014 data->off_tlsindex = fbsd_read_integer_by_name (gdbarch,
2015 "_thread_off_tlsindex");
2016 data->rtld_offsets_valid = true;
2017 return;
2018 }
2019 catch (const gdb_exception_error &e)
2020 {
2021 data->off_linkmap = -1;
2022 }
2023 }
2024
2025 /* Helper function to read the TLS index of an object file associated
2026 with a link map entry at LM_ADDR. */
2027
2028 static LONGEST
2029 fbsd_get_tls_index (struct gdbarch *gdbarch, CORE_ADDR lm_addr)
2030 {
2031 struct fbsd_pspace_data *data = get_fbsd_pspace_data (current_program_space);
2032
2033 if (!data->rtld_offsets_valid)
2034 fbsd_fetch_rtld_offsets (gdbarch, data);
2035
2036 if (data->off_linkmap == -1)
2037 throw_error (TLS_GENERIC_ERROR,
2038 _("Cannot fetch runtime linker structure offsets"));
2039
2040 /* Simulate container_of to convert from LM_ADDR to the Obj_Entry
2041 pointer and then compute the offset of the tlsindex member. */
2042 CORE_ADDR tlsindex_addr = lm_addr - data->off_linkmap + data->off_tlsindex;
2043
2044 gdb_byte buf[4];
2045 if (target_read_memory (tlsindex_addr, buf, sizeof buf) != 0)
2046 throw_error (TLS_GENERIC_ERROR,
2047 _("Cannot find thread-local variables on this target"));
2048
2049 return extract_signed_integer (buf, sizeof buf, gdbarch_byte_order (gdbarch));
2050 }
2051
2052 /* See fbsd-tdep.h. */
2053
2054 CORE_ADDR
2055 fbsd_get_thread_local_address (struct gdbarch *gdbarch, CORE_ADDR dtv_addr,
2056 CORE_ADDR lm_addr, CORE_ADDR offset)
2057 {
2058 LONGEST tls_index = fbsd_get_tls_index (gdbarch, lm_addr);
2059
2060 gdb_byte buf[gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT];
2061 if (target_read_memory (dtv_addr, buf, sizeof buf) != 0)
2062 throw_error (TLS_GENERIC_ERROR,
2063 _("Cannot find thread-local variables on this target"));
2064
2065 const struct builtin_type *builtin = builtin_type (gdbarch);
2066 CORE_ADDR addr = gdbarch_pointer_to_address (gdbarch,
2067 builtin->builtin_data_ptr, buf);
2068
2069 addr += (tls_index + 1) * TYPE_LENGTH (builtin->builtin_data_ptr);
2070 if (target_read_memory (addr, buf, sizeof buf) != 0)
2071 throw_error (TLS_GENERIC_ERROR,
2072 _("Cannot find thread-local variables on this target"));
2073
2074 addr = gdbarch_pointer_to_address (gdbarch, builtin->builtin_data_ptr, buf);
2075 return addr + offset;
2076 }
2077
2078 /* To be called from GDB_OSABI_FREEBSD handlers. */
2079
2080 void
2081 fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2082 {
2083 set_gdbarch_core_pid_to_str (gdbarch, fbsd_core_pid_to_str);
2084 set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
2085 set_gdbarch_core_xfer_siginfo (gdbarch, fbsd_core_xfer_siginfo);
2086 set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
2087 set_gdbarch_core_info_proc (gdbarch, fbsd_core_info_proc);
2088 set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
2089 set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type);
2090 set_gdbarch_gdb_signal_from_target (gdbarch, fbsd_gdb_signal_from_target);
2091 set_gdbarch_gdb_signal_to_target (gdbarch, fbsd_gdb_signal_to_target);
2092
2093 /* `catch syscall' */
2094 set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml");
2095 set_gdbarch_get_syscall_number (gdbarch, fbsd_get_syscall_number);
2096 }
2097
2098 void
2099 _initialize_fbsd_tdep (void)
2100 {
2101 fbsd_gdbarch_data_handle =
2102 gdbarch_data_register_post_init (init_fbsd_gdbarch_data);
2103 fbsd_pspace_data_handle
2104 = register_program_space_data_with_cleanup (NULL, fbsd_pspace_data_cleanup);
2105 }