gdb: fix vfork with multiple threads
[deliverable/binutils-gdb.git] / gdb / fbsd-tdep.c
1 /* Target-dependent code for FreeBSD, architecture-independent.
2
3 Copyright (C) 2002-2021 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, 4, 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->suspend.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 char *infargs = get_inferior_args ();
688 if (infargs != NULL)
689 psargs = 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->suspend.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->suspend.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 }
1569
1570 fprint_auxv_entry (file, name, description, format, type, val);
1571 }
1572
1573 /* Implement the "get_siginfo_type" gdbarch method. */
1574
1575 static struct type *
1576 fbsd_get_siginfo_type (struct gdbarch *gdbarch)
1577 {
1578 struct fbsd_gdbarch_data *fbsd_gdbarch_data;
1579 struct type *int_type, *int32_type, *uint32_type, *long_type, *void_ptr_type;
1580 struct type *uid_type, *pid_type;
1581 struct type *sigval_type, *reason_type;
1582 struct type *siginfo_type;
1583 struct type *type;
1584
1585 fbsd_gdbarch_data = get_fbsd_gdbarch_data (gdbarch);
1586 if (fbsd_gdbarch_data->siginfo_type != NULL)
1587 return fbsd_gdbarch_data->siginfo_type;
1588
1589 int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
1590 0, "int");
1591 int32_type = arch_integer_type (gdbarch, 32, 0, "int32_t");
1592 uint32_type = arch_integer_type (gdbarch, 32, 1, "uint32_t");
1593 long_type = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch),
1594 0, "long");
1595 void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void);
1596
1597 /* union sigval */
1598 sigval_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
1599 sigval_type->set_name (xstrdup ("sigval"));
1600 append_composite_type_field (sigval_type, "sival_int", int_type);
1601 append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type);
1602
1603 /* __pid_t */
1604 pid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
1605 TYPE_LENGTH (int32_type) * TARGET_CHAR_BIT, "__pid_t");
1606 TYPE_TARGET_TYPE (pid_type) = int32_type;
1607 pid_type->set_target_is_stub (true);
1608
1609 /* __uid_t */
1610 uid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
1611 TYPE_LENGTH (uint32_type) * TARGET_CHAR_BIT,
1612 "__uid_t");
1613 TYPE_TARGET_TYPE (uid_type) = uint32_type;
1614 pid_type->set_target_is_stub (true);
1615
1616 /* _reason */
1617 reason_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
1618
1619 /* _fault */
1620 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1621 append_composite_type_field (type, "si_trapno", int_type);
1622 append_composite_type_field (reason_type, "_fault", type);
1623
1624 /* _timer */
1625 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1626 append_composite_type_field (type, "si_timerid", int_type);
1627 append_composite_type_field (type, "si_overrun", int_type);
1628 append_composite_type_field (reason_type, "_timer", type);
1629
1630 /* _mesgq */
1631 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1632 append_composite_type_field (type, "si_mqd", int_type);
1633 append_composite_type_field (reason_type, "_mesgq", type);
1634
1635 /* _poll */
1636 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1637 append_composite_type_field (type, "si_band", long_type);
1638 append_composite_type_field (reason_type, "_poll", type);
1639
1640 /* __spare__ */
1641 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1642 append_composite_type_field (type, "__spare1__", long_type);
1643 append_composite_type_field (type, "__spare2__",
1644 init_vector_type (int_type, 7));
1645 append_composite_type_field (reason_type, "__spare__", type);
1646
1647 /* struct siginfo */
1648 siginfo_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
1649 siginfo_type->set_name (xstrdup ("siginfo"));
1650 append_composite_type_field (siginfo_type, "si_signo", int_type);
1651 append_composite_type_field (siginfo_type, "si_errno", int_type);
1652 append_composite_type_field (siginfo_type, "si_code", int_type);
1653 append_composite_type_field (siginfo_type, "si_pid", pid_type);
1654 append_composite_type_field (siginfo_type, "si_uid", uid_type);
1655 append_composite_type_field (siginfo_type, "si_status", int_type);
1656 append_composite_type_field (siginfo_type, "si_addr", void_ptr_type);
1657 append_composite_type_field (siginfo_type, "si_value", sigval_type);
1658 append_composite_type_field (siginfo_type, "_reason", reason_type);
1659
1660 fbsd_gdbarch_data->siginfo_type = siginfo_type;
1661
1662 return siginfo_type;
1663 }
1664
1665 /* Implement the "gdb_signal_from_target" gdbarch method. */
1666
1667 static enum gdb_signal
1668 fbsd_gdb_signal_from_target (struct gdbarch *gdbarch, int signal)
1669 {
1670 switch (signal)
1671 {
1672 case 0:
1673 return GDB_SIGNAL_0;
1674
1675 case FREEBSD_SIGHUP:
1676 return GDB_SIGNAL_HUP;
1677
1678 case FREEBSD_SIGINT:
1679 return GDB_SIGNAL_INT;
1680
1681 case FREEBSD_SIGQUIT:
1682 return GDB_SIGNAL_QUIT;
1683
1684 case FREEBSD_SIGILL:
1685 return GDB_SIGNAL_ILL;
1686
1687 case FREEBSD_SIGTRAP:
1688 return GDB_SIGNAL_TRAP;
1689
1690 case FREEBSD_SIGABRT:
1691 return GDB_SIGNAL_ABRT;
1692
1693 case FREEBSD_SIGEMT:
1694 return GDB_SIGNAL_EMT;
1695
1696 case FREEBSD_SIGFPE:
1697 return GDB_SIGNAL_FPE;
1698
1699 case FREEBSD_SIGKILL:
1700 return GDB_SIGNAL_KILL;
1701
1702 case FREEBSD_SIGBUS:
1703 return GDB_SIGNAL_BUS;
1704
1705 case FREEBSD_SIGSEGV:
1706 return GDB_SIGNAL_SEGV;
1707
1708 case FREEBSD_SIGSYS:
1709 return GDB_SIGNAL_SYS;
1710
1711 case FREEBSD_SIGPIPE:
1712 return GDB_SIGNAL_PIPE;
1713
1714 case FREEBSD_SIGALRM:
1715 return GDB_SIGNAL_ALRM;
1716
1717 case FREEBSD_SIGTERM:
1718 return GDB_SIGNAL_TERM;
1719
1720 case FREEBSD_SIGURG:
1721 return GDB_SIGNAL_URG;
1722
1723 case FREEBSD_SIGSTOP:
1724 return GDB_SIGNAL_STOP;
1725
1726 case FREEBSD_SIGTSTP:
1727 return GDB_SIGNAL_TSTP;
1728
1729 case FREEBSD_SIGCONT:
1730 return GDB_SIGNAL_CONT;
1731
1732 case FREEBSD_SIGCHLD:
1733 return GDB_SIGNAL_CHLD;
1734
1735 case FREEBSD_SIGTTIN:
1736 return GDB_SIGNAL_TTIN;
1737
1738 case FREEBSD_SIGTTOU:
1739 return GDB_SIGNAL_TTOU;
1740
1741 case FREEBSD_SIGIO:
1742 return GDB_SIGNAL_IO;
1743
1744 case FREEBSD_SIGXCPU:
1745 return GDB_SIGNAL_XCPU;
1746
1747 case FREEBSD_SIGXFSZ:
1748 return GDB_SIGNAL_XFSZ;
1749
1750 case FREEBSD_SIGVTALRM:
1751 return GDB_SIGNAL_VTALRM;
1752
1753 case FREEBSD_SIGPROF:
1754 return GDB_SIGNAL_PROF;
1755
1756 case FREEBSD_SIGWINCH:
1757 return GDB_SIGNAL_WINCH;
1758
1759 case FREEBSD_SIGINFO:
1760 return GDB_SIGNAL_INFO;
1761
1762 case FREEBSD_SIGUSR1:
1763 return GDB_SIGNAL_USR1;
1764
1765 case FREEBSD_SIGUSR2:
1766 return GDB_SIGNAL_USR2;
1767
1768 /* SIGTHR is the same as SIGLWP on FreeBSD. */
1769 case FREEBSD_SIGTHR:
1770 return GDB_SIGNAL_LWP;
1771
1772 case FREEBSD_SIGLIBRT:
1773 return GDB_SIGNAL_LIBRT;
1774 }
1775
1776 if (signal >= FREEBSD_SIGRTMIN && signal <= FREEBSD_SIGRTMAX)
1777 {
1778 int offset = signal - FREEBSD_SIGRTMIN;
1779
1780 return (enum gdb_signal) ((int) GDB_SIGNAL_REALTIME_65 + offset);
1781 }
1782
1783 return GDB_SIGNAL_UNKNOWN;
1784 }
1785
1786 /* Implement the "gdb_signal_to_target" gdbarch method. */
1787
1788 static int
1789 fbsd_gdb_signal_to_target (struct gdbarch *gdbarch,
1790 enum gdb_signal signal)
1791 {
1792 switch (signal)
1793 {
1794 case GDB_SIGNAL_0:
1795 return 0;
1796
1797 case GDB_SIGNAL_HUP:
1798 return FREEBSD_SIGHUP;
1799
1800 case GDB_SIGNAL_INT:
1801 return FREEBSD_SIGINT;
1802
1803 case GDB_SIGNAL_QUIT:
1804 return FREEBSD_SIGQUIT;
1805
1806 case GDB_SIGNAL_ILL:
1807 return FREEBSD_SIGILL;
1808
1809 case GDB_SIGNAL_TRAP:
1810 return FREEBSD_SIGTRAP;
1811
1812 case GDB_SIGNAL_ABRT:
1813 return FREEBSD_SIGABRT;
1814
1815 case GDB_SIGNAL_EMT:
1816 return FREEBSD_SIGEMT;
1817
1818 case GDB_SIGNAL_FPE:
1819 return FREEBSD_SIGFPE;
1820
1821 case GDB_SIGNAL_KILL:
1822 return FREEBSD_SIGKILL;
1823
1824 case GDB_SIGNAL_BUS:
1825 return FREEBSD_SIGBUS;
1826
1827 case GDB_SIGNAL_SEGV:
1828 return FREEBSD_SIGSEGV;
1829
1830 case GDB_SIGNAL_SYS:
1831 return FREEBSD_SIGSYS;
1832
1833 case GDB_SIGNAL_PIPE:
1834 return FREEBSD_SIGPIPE;
1835
1836 case GDB_SIGNAL_ALRM:
1837 return FREEBSD_SIGALRM;
1838
1839 case GDB_SIGNAL_TERM:
1840 return FREEBSD_SIGTERM;
1841
1842 case GDB_SIGNAL_URG:
1843 return FREEBSD_SIGURG;
1844
1845 case GDB_SIGNAL_STOP:
1846 return FREEBSD_SIGSTOP;
1847
1848 case GDB_SIGNAL_TSTP:
1849 return FREEBSD_SIGTSTP;
1850
1851 case GDB_SIGNAL_CONT:
1852 return FREEBSD_SIGCONT;
1853
1854 case GDB_SIGNAL_CHLD:
1855 return FREEBSD_SIGCHLD;
1856
1857 case GDB_SIGNAL_TTIN:
1858 return FREEBSD_SIGTTIN;
1859
1860 case GDB_SIGNAL_TTOU:
1861 return FREEBSD_SIGTTOU;
1862
1863 case GDB_SIGNAL_IO:
1864 return FREEBSD_SIGIO;
1865
1866 case GDB_SIGNAL_XCPU:
1867 return FREEBSD_SIGXCPU;
1868
1869 case GDB_SIGNAL_XFSZ:
1870 return FREEBSD_SIGXFSZ;
1871
1872 case GDB_SIGNAL_VTALRM:
1873 return FREEBSD_SIGVTALRM;
1874
1875 case GDB_SIGNAL_PROF:
1876 return FREEBSD_SIGPROF;
1877
1878 case GDB_SIGNAL_WINCH:
1879 return FREEBSD_SIGWINCH;
1880
1881 case GDB_SIGNAL_INFO:
1882 return FREEBSD_SIGINFO;
1883
1884 case GDB_SIGNAL_USR1:
1885 return FREEBSD_SIGUSR1;
1886
1887 case GDB_SIGNAL_USR2:
1888 return FREEBSD_SIGUSR2;
1889
1890 case GDB_SIGNAL_LWP:
1891 return FREEBSD_SIGTHR;
1892
1893 case GDB_SIGNAL_LIBRT:
1894 return FREEBSD_SIGLIBRT;
1895 }
1896
1897 if (signal >= GDB_SIGNAL_REALTIME_65
1898 && signal <= GDB_SIGNAL_REALTIME_126)
1899 {
1900 int offset = signal - GDB_SIGNAL_REALTIME_65;
1901
1902 return FREEBSD_SIGRTMIN + offset;
1903 }
1904
1905 return -1;
1906 }
1907
1908 /* Implement the "get_syscall_number" gdbarch method. */
1909
1910 static LONGEST
1911 fbsd_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread)
1912 {
1913
1914 /* FreeBSD doesn't use gdbarch_get_syscall_number since FreeBSD
1915 native targets fetch the system call number from the
1916 'pl_syscall_code' member of struct ptrace_lwpinfo in fbsd_wait.
1917 However, system call catching requires this function to be
1918 set. */
1919
1920 internal_error (__FILE__, __LINE__, _("fbsd_get_sycall_number called"));
1921 }
1922
1923 /* Read an integer symbol value from the current target. */
1924
1925 static LONGEST
1926 fbsd_read_integer_by_name (struct gdbarch *gdbarch, const char *name)
1927 {
1928 bound_minimal_symbol ms = lookup_minimal_symbol (name, NULL, NULL);
1929 if (ms.minsym == NULL)
1930 error (_("Unable to resolve symbol '%s'"), name);
1931
1932 gdb_byte buf[4];
1933 if (target_read_memory (BMSYMBOL_VALUE_ADDRESS (ms), buf, sizeof buf) != 0)
1934 error (_("Unable to read value of '%s'"), name);
1935
1936 return extract_signed_integer (buf, sizeof buf, gdbarch_byte_order (gdbarch));
1937 }
1938
1939 /* Lookup offsets of fields in the runtime linker's 'Obj_Entry'
1940 structure needed to determine the TLS index of an object file. */
1941
1942 static void
1943 fbsd_fetch_rtld_offsets (struct gdbarch *gdbarch, struct fbsd_pspace_data *data)
1944 {
1945 try
1946 {
1947 /* Fetch offsets from debug symbols in rtld. */
1948 struct symbol *obj_entry_sym
1949 = lookup_symbol_in_language ("Struct_Obj_Entry", NULL, STRUCT_DOMAIN,
1950 language_c, NULL).symbol;
1951 if (obj_entry_sym == NULL)
1952 error (_("Unable to find Struct_Obj_Entry symbol"));
1953 data->off_linkmap = lookup_struct_elt (SYMBOL_TYPE (obj_entry_sym),
1954 "linkmap", 0).offset / 8;
1955 data->off_tlsindex = lookup_struct_elt (SYMBOL_TYPE (obj_entry_sym),
1956 "tlsindex", 0).offset / 8;
1957 data->rtld_offsets_valid = true;
1958 return;
1959 }
1960 catch (const gdb_exception_error &e)
1961 {
1962 data->off_linkmap = -1;
1963 }
1964
1965 try
1966 {
1967 /* Fetch offsets from global variables in libthr. Note that
1968 this does not work for single-threaded processes that are not
1969 linked against libthr. */
1970 data->off_linkmap = fbsd_read_integer_by_name (gdbarch,
1971 "_thread_off_linkmap");
1972 data->off_tlsindex = fbsd_read_integer_by_name (gdbarch,
1973 "_thread_off_tlsindex");
1974 data->rtld_offsets_valid = true;
1975 return;
1976 }
1977 catch (const gdb_exception_error &e)
1978 {
1979 data->off_linkmap = -1;
1980 }
1981 }
1982
1983 /* Helper function to read the TLS index of an object file associated
1984 with a link map entry at LM_ADDR. */
1985
1986 static LONGEST
1987 fbsd_get_tls_index (struct gdbarch *gdbarch, CORE_ADDR lm_addr)
1988 {
1989 struct fbsd_pspace_data *data = get_fbsd_pspace_data (current_program_space);
1990
1991 if (!data->rtld_offsets_valid)
1992 fbsd_fetch_rtld_offsets (gdbarch, data);
1993
1994 if (data->off_linkmap == -1)
1995 throw_error (TLS_GENERIC_ERROR,
1996 _("Cannot fetch runtime linker structure offsets"));
1997
1998 /* Simulate container_of to convert from LM_ADDR to the Obj_Entry
1999 pointer and then compute the offset of the tlsindex member. */
2000 CORE_ADDR tlsindex_addr = lm_addr - data->off_linkmap + data->off_tlsindex;
2001
2002 gdb_byte buf[4];
2003 if (target_read_memory (tlsindex_addr, buf, sizeof buf) != 0)
2004 throw_error (TLS_GENERIC_ERROR,
2005 _("Cannot find thread-local variables on this target"));
2006
2007 return extract_signed_integer (buf, sizeof buf, gdbarch_byte_order (gdbarch));
2008 }
2009
2010 /* See fbsd-tdep.h. */
2011
2012 CORE_ADDR
2013 fbsd_get_thread_local_address (struct gdbarch *gdbarch, CORE_ADDR dtv_addr,
2014 CORE_ADDR lm_addr, CORE_ADDR offset)
2015 {
2016 LONGEST tls_index = fbsd_get_tls_index (gdbarch, lm_addr);
2017
2018 gdb_byte buf[gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT];
2019 if (target_read_memory (dtv_addr, buf, sizeof buf) != 0)
2020 throw_error (TLS_GENERIC_ERROR,
2021 _("Cannot find thread-local variables on this target"));
2022
2023 const struct builtin_type *builtin = builtin_type (gdbarch);
2024 CORE_ADDR addr = gdbarch_pointer_to_address (gdbarch,
2025 builtin->builtin_data_ptr, buf);
2026
2027 addr += (tls_index + 1) * TYPE_LENGTH (builtin->builtin_data_ptr);
2028 if (target_read_memory (addr, buf, sizeof buf) != 0)
2029 throw_error (TLS_GENERIC_ERROR,
2030 _("Cannot find thread-local variables on this target"));
2031
2032 addr = gdbarch_pointer_to_address (gdbarch, builtin->builtin_data_ptr, buf);
2033 return addr + offset;
2034 }
2035
2036 /* See fbsd-tdep.h. */
2037
2038 CORE_ADDR
2039 fbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
2040 {
2041 struct bound_minimal_symbol msym = lookup_bound_minimal_symbol ("_rtld_bind");
2042 if (msym.minsym != nullptr && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
2043 return frame_unwind_caller_pc (get_current_frame ());
2044
2045 return 0;
2046 }
2047
2048 /* Return description of signal code or nullptr. */
2049
2050 static const char *
2051 fbsd_signal_cause (enum gdb_signal siggnal, int code)
2052 {
2053 /* Signal-independent causes. */
2054 switch (code)
2055 {
2056 case FBSD_SI_USER:
2057 return _("Sent by kill()");
2058 case FBSD_SI_QUEUE:
2059 return _("Sent by sigqueue()");
2060 case FBSD_SI_TIMER:
2061 return _("Timer expired");
2062 case FBSD_SI_ASYNCIO:
2063 return _("Asynchronous I/O request completed");
2064 case FBSD_SI_MESGQ:
2065 return _("Message arrived on empty message queue");
2066 case FBSD_SI_KERNEL:
2067 return _("Sent by kernel");
2068 case FBSD_SI_LWP:
2069 return _("Sent by thr_kill()");
2070 }
2071
2072 switch (siggnal)
2073 {
2074 case GDB_SIGNAL_ILL:
2075 switch (code)
2076 {
2077 case FBSD_ILL_ILLOPC:
2078 return _("Illegal opcode");
2079 case FBSD_ILL_ILLOPN:
2080 return _("Illegal operand");
2081 case FBSD_ILL_ILLADR:
2082 return _("Illegal addressing mode");
2083 case FBSD_ILL_ILLTRP:
2084 return _("Illegal trap");
2085 case FBSD_ILL_PRVOPC:
2086 return _("Privileged opcode");
2087 case FBSD_ILL_PRVREG:
2088 return _("Privileged register");
2089 case FBSD_ILL_COPROC:
2090 return _("Coprocessor error");
2091 case FBSD_ILL_BADSTK:
2092 return _("Internal stack error");
2093 }
2094 break;
2095 case GDB_SIGNAL_BUS:
2096 switch (code)
2097 {
2098 case FBSD_BUS_ADRALN:
2099 return _("Invalid address alignment");
2100 case FBSD_BUS_ADRERR:
2101 return _("Address not present");
2102 case FBSD_BUS_OBJERR:
2103 return _("Object-specific hardware error");
2104 case FBSD_BUS_OOMERR:
2105 return _("Out of memory");
2106 }
2107 break;
2108 case GDB_SIGNAL_SEGV:
2109 switch (code)
2110 {
2111 case FBSD_SEGV_MAPERR:
2112 return _("Address not mapped to object");
2113 case FBSD_SEGV_ACCERR:
2114 return _("Invalid permissions for mapped object");
2115 case FBSD_SEGV_PKUERR:
2116 return _("PKU violation");
2117 }
2118 break;
2119 case GDB_SIGNAL_FPE:
2120 switch (code)
2121 {
2122 case FBSD_FPE_INTOVF:
2123 return _("Integer overflow");
2124 case FBSD_FPE_INTDIV:
2125 return _("Integer divide by zero");
2126 case FBSD_FPE_FLTDIV:
2127 return _("Floating point divide by zero");
2128 case FBSD_FPE_FLTOVF:
2129 return _("Floating point overflow");
2130 case FBSD_FPE_FLTUND:
2131 return _("Floating point underflow");
2132 case FBSD_FPE_FLTRES:
2133 return _("Floating point inexact result");
2134 case FBSD_FPE_FLTINV:
2135 return _("Invalid floating point operation");
2136 case FBSD_FPE_FLTSUB:
2137 return _("Subscript out of range");
2138 }
2139 break;
2140 case GDB_SIGNAL_TRAP:
2141 switch (code)
2142 {
2143 case FBSD_TRAP_BRKPT:
2144 return _("Breakpoint");
2145 case FBSD_TRAP_TRACE:
2146 return _("Trace trap");
2147 case FBSD_TRAP_DTRACE:
2148 return _("DTrace-induced trap");
2149 case FBSD_TRAP_CAP:
2150 return _("Capability violation");
2151 }
2152 break;
2153 case GDB_SIGNAL_CHLD:
2154 switch (code)
2155 {
2156 case FBSD_CLD_EXITED:
2157 return _("Child has exited");
2158 case FBSD_CLD_KILLED:
2159 return _("Child has terminated abnormally");
2160 case FBSD_CLD_DUMPED:
2161 return _("Child has dumped core");
2162 case FBSD_CLD_TRAPPED:
2163 return _("Traced child has trapped");
2164 case FBSD_CLD_STOPPED:
2165 return _("Child has stopped");
2166 case FBSD_CLD_CONTINUED:
2167 return _("Stopped child has continued");
2168 }
2169 break;
2170 case GDB_SIGNAL_POLL:
2171 switch (code)
2172 {
2173 case FBSD_POLL_IN:
2174 return _("Data input available");
2175 case FBSD_POLL_OUT:
2176 return _("Output buffers available");
2177 case FBSD_POLL_MSG:
2178 return _("Input message available");
2179 case FBSD_POLL_ERR:
2180 return _("I/O error");
2181 case FBSD_POLL_PRI:
2182 return _("High priority input available");
2183 case FBSD_POLL_HUP:
2184 return _("Device disconnected");
2185 }
2186 break;
2187 }
2188
2189 return nullptr;
2190 }
2191
2192 /* Report additional details for a signal stop. */
2193
2194 static void
2195 fbsd_report_signal_info (struct gdbarch *gdbarch, struct ui_out *uiout,
2196 enum gdb_signal siggnal)
2197 {
2198 LONGEST code, mqd, pid, status, timerid, uid;
2199
2200 try
2201 {
2202 code = parse_and_eval_long ("$_siginfo.si_code");
2203 pid = parse_and_eval_long ("$_siginfo.si_pid");
2204 uid = parse_and_eval_long ("$_siginfo.si_uid");
2205 status = parse_and_eval_long ("$_siginfo.si_status");
2206 timerid = parse_and_eval_long ("$_siginfo._reason._timer.si_timerid");
2207 mqd = parse_and_eval_long ("$_siginfo._reason._mesgq.si_mqd");
2208 }
2209 catch (const gdb_exception_error &e)
2210 {
2211 return;
2212 }
2213
2214 const char *meaning = fbsd_signal_cause (siggnal, code);
2215 if (meaning == nullptr)
2216 return;
2217
2218 uiout->text (".\n");
2219 uiout->field_string ("sigcode-meaning", meaning);
2220
2221 switch (code)
2222 {
2223 case FBSD_SI_USER:
2224 case FBSD_SI_QUEUE:
2225 case FBSD_SI_LWP:
2226 uiout->text (" from pid ");
2227 uiout->field_string ("sending-pid", plongest (pid));
2228 uiout->text (" and user ");
2229 uiout->field_string ("sending-uid", plongest (uid));
2230 return;
2231 case FBSD_SI_TIMER:
2232 uiout->text (": timerid ");
2233 uiout->field_string ("timerid", plongest (timerid));
2234 return;
2235 case FBSD_SI_MESGQ:
2236 uiout->text (": message queue ");
2237 uiout->field_string ("message-queue", plongest (mqd));
2238 return;
2239 case FBSD_SI_ASYNCIO:
2240 return;
2241 }
2242
2243 if (siggnal == GDB_SIGNAL_CHLD)
2244 {
2245 uiout->text (": pid ");
2246 uiout->field_string ("child-pid", plongest (pid));
2247 uiout->text (", uid ");
2248 uiout->field_string ("child-uid", plongest (uid));
2249 if (code == FBSD_CLD_EXITED)
2250 {
2251 uiout->text (", exit status ");
2252 uiout->field_string ("exit-status", plongest (status));
2253 }
2254 else
2255 {
2256 uiout->text (", signal ");
2257 uiout->field_string ("signal", plongest (status));
2258 }
2259 }
2260 }
2261
2262 /* To be called from GDB_OSABI_FREEBSD handlers. */
2263
2264 void
2265 fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2266 {
2267 set_gdbarch_core_pid_to_str (gdbarch, fbsd_core_pid_to_str);
2268 set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
2269 set_gdbarch_core_xfer_siginfo (gdbarch, fbsd_core_xfer_siginfo);
2270 set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
2271 set_gdbarch_core_info_proc (gdbarch, fbsd_core_info_proc);
2272 set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
2273 set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type);
2274 set_gdbarch_gdb_signal_from_target (gdbarch, fbsd_gdb_signal_from_target);
2275 set_gdbarch_gdb_signal_to_target (gdbarch, fbsd_gdb_signal_to_target);
2276 set_gdbarch_report_signal_info (gdbarch, fbsd_report_signal_info);
2277 set_gdbarch_skip_solib_resolver (gdbarch, fbsd_skip_solib_resolver);
2278
2279 /* `catch syscall' */
2280 set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml");
2281 set_gdbarch_get_syscall_number (gdbarch, fbsd_get_syscall_number);
2282 }
2283
2284 void _initialize_fbsd_tdep ();
2285 void
2286 _initialize_fbsd_tdep ()
2287 {
2288 fbsd_gdbarch_data_handle =
2289 gdbarch_data_register_post_init (init_fbsd_gdbarch_data);
2290 }
This page took 0.079618 seconds and 4 git commands to generate.