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