1 /* Target-dependent code for FreeBSD, architecture-independent.
3 Copyright (C) 2002-2019 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
26 #include "gdbthread.h"
28 #include "xml-syscall.h"
29 #include <sys/socket.h>
30 #include <arpa/inet.h>
33 #include "fbsd-tdep.h"
35 /* This enum is derived from FreeBSD's <sys/signal.h>. */
64 FREEBSD_SIGVTALRM
= 26,
66 FREEBSD_SIGWINCH
= 28,
71 FREEBSD_SIGLIBRT
= 33,
72 FREEBSD_SIGRTMIN
= 65,
73 FREEBSD_SIGRTMAX
= 126,
76 /* FreeBSD kernels 12.0 and later include a copy of the
77 'ptrace_lwpinfo' structure returned by the PT_LWPINFO ptrace
78 operation in an ELF core note (NT_FREEBSD_PTLWPINFO) for each LWP.
79 The constants below define the offset of field members and flags in
80 this structure used by methods in this file. Note that the
81 'ptrace_lwpinfo' struct in the note is preceded by a 4 byte integer
82 containing the size of the structure. */
84 #define LWPINFO_OFFSET 0x4
86 /* Offsets in ptrace_lwpinfo. */
87 #define LWPINFO_PL_FLAGS 0x8
88 #define LWPINFO64_PL_SIGINFO 0x30
89 #define LWPINFO32_PL_SIGINFO 0x2c
91 /* Flags in pl_flags. */
92 #define PL_FLAG_SI 0x20 /* siginfo is valid */
94 /* Sizes of siginfo_t. */
95 #define SIZE64_SIGINFO_T 80
96 #define SIZE32_SIGINFO_T 64
98 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_VMMAP core
99 dump notes. See <sys/user.h> for the definition of struct
100 kinfo_vmentry. This data structure should have the same layout on
103 Note that FreeBSD 7.0 used an older version of this structure
104 (struct kinfo_ovmentry), but the NT_FREEBSD_PROCSTAT_VMMAP core
105 dump note wasn't introduced until FreeBSD 9.2. As a result, the
106 core dump note has always used the 7.1 and later structure
109 #define KVE_STRUCTSIZE 0x0
110 #define KVE_START 0x8
112 #define KVE_OFFSET 0x18
113 #define KVE_FLAGS 0x2c
114 #define KVE_PROTECTION 0x38
115 #define KVE_PATH 0x88
117 /* Flags in the 'kve_protection' field in struct kinfo_vmentry. These
118 match the KVME_PROT_* constants in <sys/user.h>. */
120 #define KINFO_VME_PROT_READ 0x00000001
121 #define KINFO_VME_PROT_WRITE 0x00000002
122 #define KINFO_VME_PROT_EXEC 0x00000004
124 /* Flags in the 'kve_flags' field in struct kinfo_vmentry. These
125 match the KVME_FLAG_* constants in <sys/user.h>. */
127 #define KINFO_VME_FLAG_COW 0x00000001
128 #define KINFO_VME_FLAG_NEEDS_COPY 0x00000002
129 #define KINFO_VME_FLAG_NOCOREDUMP 0x00000004
130 #define KINFO_VME_FLAG_SUPER 0x00000008
131 #define KINFO_VME_FLAG_GROWS_UP 0x00000010
132 #define KINFO_VME_FLAG_GROWS_DOWN 0x00000020
134 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_FILES core
135 dump notes. See <sys/user.h> for the definition of struct
136 kinfo_file. This data structure should have the same layout on all
139 Note that FreeBSD 7.0 used an older version of this structure
140 (struct kinfo_ofile), but the NT_FREEBSD_PROCSTAT_FILES core dump
141 note wasn't introduced until FreeBSD 9.2. As a result, the core
142 dump note has always used the 7.1 and later structure format. */
144 #define KF_STRUCTSIZE 0x0
147 #define KF_FLAGS 0x10
148 #define KF_OFFSET 0x18
149 #define KF_VNODE_TYPE 0x20
150 #define KF_SOCK_DOMAIN 0x24
151 #define KF_SOCK_TYPE 0x28
152 #define KF_SOCK_PROTOCOL 0x2c
153 #define KF_SA_LOCAL 0x30
154 #define KF_SA_PEER 0xb0
155 #define KF_PATH 0x170
157 /* Constants for the 'kf_type' field in struct kinfo_file. These
158 match the KF_TYPE_* constants in <sys/user.h>. */
160 #define KINFO_FILE_TYPE_VNODE 1
161 #define KINFO_FILE_TYPE_SOCKET 2
162 #define KINFO_FILE_TYPE_PIPE 3
163 #define KINFO_FILE_TYPE_FIFO 4
164 #define KINFO_FILE_TYPE_KQUEUE 5
165 #define KINFO_FILE_TYPE_CRYPTO 6
166 #define KINFO_FILE_TYPE_MQUEUE 7
167 #define KINFO_FILE_TYPE_SHM 8
168 #define KINFO_FILE_TYPE_SEM 9
169 #define KINFO_FILE_TYPE_PTS 10
170 #define KINFO_FILE_TYPE_PROCDESC 11
172 /* Special values for the 'kf_fd' field in struct kinfo_file. These
173 match the KF_FD_TYPE_* constants in <sys/user.h>. */
175 #define KINFO_FILE_FD_TYPE_CWD -1
176 #define KINFO_FILE_FD_TYPE_ROOT -2
177 #define KINFO_FILE_FD_TYPE_JAIL -3
178 #define KINFO_FILE_FD_TYPE_TRACE -4
179 #define KINFO_FILE_FD_TYPE_TEXT -5
180 #define KINFO_FILE_FD_TYPE_CTTY -6
182 /* Flags in the 'kf_flags' field in struct kinfo_file. These match
183 the KF_FLAG_* constants in <sys/user.h>. */
185 #define KINFO_FILE_FLAG_READ 0x00000001
186 #define KINFO_FILE_FLAG_WRITE 0x00000002
187 #define KINFO_FILE_FLAG_APPEND 0x00000004
188 #define KINFO_FILE_FLAG_ASYNC 0x00000008
189 #define KINFO_FILE_FLAG_FSYNC 0x00000010
190 #define KINFO_FILE_FLAG_NONBLOCK 0x00000020
191 #define KINFO_FILE_FLAG_DIRECT 0x00000040
192 #define KINFO_FILE_FLAG_HASLOCK 0x00000080
193 #define KINFO_FILE_FLAG_EXEC 0x00004000
195 /* Constants for the 'kf_vnode_type' field in struct kinfo_file.
196 These match the KF_VTYPE_* constants in <sys/user.h>. */
198 #define KINFO_FILE_VTYPE_VREG 1
199 #define KINFO_FILE_VTYPE_VDIR 2
200 #define KINFO_FILE_VTYPE_VCHR 4
201 #define KINFO_FILE_VTYPE_VLNK 5
202 #define KINFO_FILE_VTYPE_VSOCK 6
203 #define KINFO_FILE_VTYPE_VFIFO 7
205 /* Constants for socket address families. These match AF_* constants
206 in <sys/socket.h>. */
208 #define FBSD_AF_UNIX 1
209 #define FBSD_AF_INET 2
210 #define FBSD_AF_INET6 28
212 /* Constants for socket types. These match SOCK_* constants in
215 #define FBSD_SOCK_STREAM 1
216 #define FBSD_SOCK_DGRAM 2
217 #define FBSD_SOCK_SEQPACKET 5
219 /* Constants for IP protocols. These match IPPROTO_* constants in
222 #define FBSD_IPPROTO_ICMP 1
223 #define FBSD_IPPROTO_TCP 6
224 #define FBSD_IPPROTO_UDP 17
225 #define FBSD_IPPROTO_SCTP 132
227 /* Socket address structures. These have the same layout on all
228 FreeBSD architectures. In addition, multibyte fields such as IP
229 addresses are always stored in network byte order. */
231 struct fbsd_sockaddr_in
240 struct fbsd_sockaddr_in6
244 uint8_t sin6_port
[2];
245 uint32_t sin6_flowinfo
;
246 uint8_t sin6_addr
[16];
247 uint32_t sin6_scope_id
;
250 struct fbsd_sockaddr_un
257 /* Number of 32-bit words in a signal set. This matches _SIG_WORDS in
258 <sys/_sigset.h> and is the same value on all architectures. */
262 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_PROC core
263 dump notes. See <sys/user.h> for the definition of struct
264 kinfo_proc. This data structure has different layouts on different
265 architectures mostly due to ILP32 vs LP64. However, FreeBSD/i386
266 uses a 32-bit time_t while all other architectures use a 64-bit
269 The core dump note actually contains one kinfo_proc structure for
270 each thread, but all of the process-wide data can be obtained from
271 the first structure. One result of this note's format is that some
272 of the process-wide status available in the native target method
273 from the kern.proc.pid.<pid> sysctl such as ki_stat and ki_siglist
274 is not available from a core dump. Instead, the per-thread data
275 structures contain the value of these fields for individual
278 struct kinfo_proc_layout
280 /* Offsets of struct kinfo_proc members. */
287 int ki_tdev_freebsd11
;
309 /* Offsets of struct rusage members. */
317 const struct kinfo_proc_layout kinfo_proc_layout_32
=
325 .ki_tdev_freebsd11
= 0x44,
326 .ki_sigignore
= 0x68,
345 .ki_rusage_ch
= 0x278,
354 const struct kinfo_proc_layout kinfo_proc_layout_i386
=
362 .ki_tdev_freebsd11
= 0x44,
363 .ki_sigignore
= 0x68,
382 .ki_rusage_ch
= 0x258,
391 const struct kinfo_proc_layout kinfo_proc_layout_64
=
399 .ki_tdev_freebsd11
= 0x64,
400 .ki_sigignore
= 0x88,
419 .ki_rusage_ch
= 0x2f0,
428 static struct gdbarch_data
*fbsd_gdbarch_data_handle
;
430 struct fbsd_gdbarch_data
432 struct type
*siginfo_type
;
436 init_fbsd_gdbarch_data (struct gdbarch
*gdbarch
)
438 return GDBARCH_OBSTACK_ZALLOC (gdbarch
, struct fbsd_gdbarch_data
);
441 static struct fbsd_gdbarch_data
*
442 get_fbsd_gdbarch_data (struct gdbarch
*gdbarch
)
444 return ((struct fbsd_gdbarch_data
*)
445 gdbarch_data (gdbarch
, fbsd_gdbarch_data_handle
));
448 /* Per-program-space data for FreeBSD architectures. */
449 static const struct program_space_data
*fbsd_pspace_data_handle
;
451 struct fbsd_pspace_data
453 /* Offsets in the runtime linker's 'Obj_Entry' structure. */
455 LONGEST off_tlsindex
;
456 bool rtld_offsets_valid
;
459 static struct fbsd_pspace_data
*
460 get_fbsd_pspace_data (struct program_space
*pspace
)
462 struct fbsd_pspace_data
*data
;
464 data
= ((struct fbsd_pspace_data
*)
465 program_space_data (pspace
, fbsd_pspace_data_handle
));
468 data
= XCNEW (struct fbsd_pspace_data
);
469 set_program_space_data (pspace
, fbsd_pspace_data_handle
, data
);
475 /* The cleanup callback for FreeBSD architecture per-program-space data. */
478 fbsd_pspace_data_cleanup (struct program_space
*pspace
, void *data
)
483 /* This is how we want PTIDs from core files to be printed. */
486 fbsd_core_pid_to_str (struct gdbarch
*gdbarch
, ptid_t ptid
)
488 if (ptid
.lwp () != 0)
489 return string_printf ("LWP %ld", ptid
.lwp ());
491 return normal_pid_to_str (ptid
);
494 /* Extract the name assigned to a thread from a core. Returns the
495 string in a static buffer. */
498 fbsd_core_thread_name (struct gdbarch
*gdbarch
, struct thread_info
*thr
)
501 struct bfd_section
*section
;
504 if (thr
->ptid
.lwp () != 0)
506 /* FreeBSD includes a NT_FREEBSD_THRMISC note for each thread
507 whose contents are defined by a "struct thrmisc" declared in
508 <sys/procfs.h> on FreeBSD. The per-thread name is stored as
509 a null-terminated string as the first member of the
510 structure. Rather than define the full structure here, just
511 extract the null-terminated name from the start of the
513 thread_section_name
section_name (".thrmisc", thr
->ptid
);
515 section
= bfd_get_section_by_name (core_bfd
, section_name
.c_str ());
516 if (section
!= NULL
&& bfd_section_size (core_bfd
, section
) > 0)
518 /* Truncate the name if it is longer than "buf". */
519 size
= bfd_section_size (core_bfd
, section
);
520 if (size
> sizeof buf
- 1)
521 size
= sizeof buf
- 1;
522 if (bfd_get_section_contents (core_bfd
, section
, buf
, (file_ptr
) 0,
528 /* Note that each thread will report the process command
529 as its thread name instead of an empty name if a name
530 has not been set explicitly. Return a NULL name in
532 if (strcmp (buf
, elf_tdata (core_bfd
)->core
->program
) != 0)
541 /* Implement the "core_xfer_siginfo" gdbarch method. */
544 fbsd_core_xfer_siginfo (struct gdbarch
*gdbarch
, gdb_byte
*readbuf
,
545 ULONGEST offset
, ULONGEST len
)
549 if (gdbarch_long_bit (gdbarch
) == 32)
550 siginfo_size
= SIZE32_SIGINFO_T
;
552 siginfo_size
= SIZE64_SIGINFO_T
;
553 if (offset
> siginfo_size
)
556 thread_section_name
section_name (".note.freebsdcore.lwpinfo", inferior_ptid
);
557 asection
*section
= bfd_get_section_by_name (core_bfd
, section_name
.c_str ());
562 if (!bfd_get_section_contents (core_bfd
, section
, buf
,
563 LWPINFO_OFFSET
+ LWPINFO_PL_FLAGS
, 4))
566 int pl_flags
= extract_signed_integer (buf
, 4, gdbarch_byte_order (gdbarch
));
567 if (!(pl_flags
& PL_FLAG_SI
))
570 if (offset
+ len
> siginfo_size
)
571 len
= siginfo_size
- offset
;
573 ULONGEST siginfo_offset
;
574 if (gdbarch_long_bit (gdbarch
) == 32)
575 siginfo_offset
= LWPINFO_OFFSET
+ LWPINFO32_PL_SIGINFO
;
577 siginfo_offset
= LWPINFO_OFFSET
+ LWPINFO64_PL_SIGINFO
;
579 if (!bfd_get_section_contents (core_bfd
, section
, readbuf
,
580 siginfo_offset
+ offset
, len
))
587 find_signalled_thread (struct thread_info
*info
, void *data
)
589 if (info
->suspend
.stop_signal
!= GDB_SIGNAL_0
590 && info
->ptid
.pid () == inferior_ptid
.pid ())
596 /* Structure for passing information from
597 fbsd_collect_thread_registers via an iterator to
598 fbsd_collect_regset_section_cb. */
600 struct fbsd_collect_regset_section_cb_data
602 const struct regcache
*regcache
;
607 enum gdb_signal stop_signal
;
612 fbsd_collect_regset_section_cb (const char *sect_name
, int supply_size
,
613 int collect_size
, const struct regset
*regset
,
614 const char *human_name
, void *cb_data
)
617 struct fbsd_collect_regset_section_cb_data
*data
618 = (struct fbsd_collect_regset_section_cb_data
*) cb_data
;
620 if (data
->abort_iteration
)
623 gdb_assert (regset
->collect_regset
);
625 buf
= (char *) xmalloc (collect_size
);
626 regset
->collect_regset (regset
, data
->regcache
, -1, buf
, collect_size
);
628 /* PRSTATUS still needs to be treated specially. */
629 if (strcmp (sect_name
, ".reg") == 0)
630 data
->note_data
= (char *) elfcore_write_prstatus
631 (data
->obfd
, data
->note_data
, data
->note_size
, data
->lwp
,
632 gdb_signal_to_host (data
->stop_signal
), buf
);
634 data
->note_data
= (char *) elfcore_write_register_note
635 (data
->obfd
, data
->note_data
, data
->note_size
,
636 sect_name
, buf
, collect_size
);
639 if (data
->note_data
== NULL
)
640 data
->abort_iteration
= 1;
643 /* Records the thread's register state for the corefile note
647 fbsd_collect_thread_registers (const struct regcache
*regcache
,
648 ptid_t ptid
, bfd
*obfd
,
649 char *note_data
, int *note_size
,
650 enum gdb_signal stop_signal
)
652 struct gdbarch
*gdbarch
= regcache
->arch ();
653 struct fbsd_collect_regset_section_cb_data data
;
655 data
.regcache
= regcache
;
657 data
.note_data
= note_data
;
658 data
.note_size
= note_size
;
659 data
.stop_signal
= stop_signal
;
660 data
.abort_iteration
= 0;
661 data
.lwp
= ptid
.lwp ();
663 gdbarch_iterate_over_regset_sections (gdbarch
,
664 fbsd_collect_regset_section_cb
,
666 return data
.note_data
;
669 struct fbsd_corefile_thread_data
671 struct gdbarch
*gdbarch
;
675 enum gdb_signal stop_signal
;
678 /* Records the thread's register state for the corefile note
682 fbsd_corefile_thread (struct thread_info
*info
,
683 struct fbsd_corefile_thread_data
*args
)
685 struct regcache
*regcache
;
687 regcache
= get_thread_arch_regcache (info
->ptid
, args
->gdbarch
);
689 target_fetch_registers (regcache
, -1);
691 args
->note_data
= fbsd_collect_thread_registers
692 (regcache
, info
->ptid
, args
->obfd
, args
->note_data
,
693 args
->note_size
, args
->stop_signal
);
696 /* Return a byte_vector containing the contents of a core dump note
697 for the target object of type OBJECT. If STRUCTSIZE is non-zero,
698 the data is prefixed with a 32-bit integer size to match the format
699 used in FreeBSD NT_PROCSTAT_* notes. */
701 static gdb::optional
<gdb::byte_vector
>
702 fbsd_make_note_desc (enum target_object object
, uint32_t structsize
)
704 gdb::optional
<gdb::byte_vector
> buf
=
705 target_read_alloc (current_top_target (), object
, NULL
);
706 if (!buf
|| buf
->empty ())
712 gdb::byte_vector
desc (sizeof (structsize
) + buf
->size ());
713 memcpy (desc
.data (), &structsize
, sizeof (structsize
));
714 memcpy (desc
.data () + sizeof (structsize
), buf
->data (), buf
->size ());
718 /* Create appropriate note sections for a corefile, returning them in
722 fbsd_make_corefile_notes (struct gdbarch
*gdbarch
, bfd
*obfd
, int *note_size
)
724 struct fbsd_corefile_thread_data thread_args
;
725 char *note_data
= NULL
;
726 Elf_Internal_Ehdr
*i_ehdrp
;
727 struct thread_info
*curr_thr
, *signalled_thr
;
729 /* Put a "FreeBSD" label in the ELF header. */
730 i_ehdrp
= elf_elfheader (obfd
);
731 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_FREEBSD
;
733 gdb_assert (gdbarch_iterate_over_regset_sections_p (gdbarch
));
735 if (get_exec_file (0))
737 const char *fname
= lbasename (get_exec_file (0));
738 char *psargs
= xstrdup (fname
);
740 if (get_inferior_args ())
741 psargs
= reconcat (psargs
, psargs
, " ", get_inferior_args (),
744 note_data
= elfcore_write_prpsinfo (obfd
, note_data
, note_size
,
748 /* Thread register information. */
751 update_thread_list ();
753 catch (const gdb_exception_error
&e
)
755 exception_print (gdb_stderr
, e
);
758 /* Like the kernel, prefer dumping the signalled thread first.
759 "First thread" is what tools use to infer the signalled thread.
760 In case there's more than one signalled thread, prefer the
761 current thread, if it is signalled. */
762 curr_thr
= inferior_thread ();
763 if (curr_thr
->suspend
.stop_signal
!= GDB_SIGNAL_0
)
764 signalled_thr
= curr_thr
;
767 signalled_thr
= iterate_over_threads (find_signalled_thread
, NULL
);
768 if (signalled_thr
== NULL
)
769 signalled_thr
= curr_thr
;
772 thread_args
.gdbarch
= gdbarch
;
773 thread_args
.obfd
= obfd
;
774 thread_args
.note_data
= note_data
;
775 thread_args
.note_size
= note_size
;
776 thread_args
.stop_signal
= signalled_thr
->suspend
.stop_signal
;
778 fbsd_corefile_thread (signalled_thr
, &thread_args
);
779 for (thread_info
*thr
: current_inferior ()->non_exited_threads ())
781 if (thr
== signalled_thr
)
784 fbsd_corefile_thread (thr
, &thread_args
);
787 note_data
= thread_args
.note_data
;
789 /* Auxiliary vector. */
790 uint32_t structsize
= gdbarch_ptr_bit (gdbarch
) / 4; /* Elf_Auxinfo */
791 gdb::optional
<gdb::byte_vector
> note_desc
=
792 fbsd_make_note_desc (TARGET_OBJECT_AUXV
, structsize
);
793 if (note_desc
&& !note_desc
->empty ())
795 note_data
= elfcore_write_note (obfd
, note_data
, note_size
, "FreeBSD",
796 NT_FREEBSD_PROCSTAT_AUXV
,
797 note_desc
->data (), note_desc
->size ());
802 /* Virtual memory mappings. */
803 note_desc
= fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_VMMAP
, 0);
804 if (note_desc
&& !note_desc
->empty ())
806 note_data
= elfcore_write_note (obfd
, note_data
, note_size
, "FreeBSD",
807 NT_FREEBSD_PROCSTAT_VMMAP
,
808 note_desc
->data (), note_desc
->size ());
813 note_desc
= fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_PS_STRINGS
, 0);
814 if (note_desc
&& !note_desc
->empty ())
816 note_data
= elfcore_write_note (obfd
, note_data
, note_size
, "FreeBSD",
817 NT_FREEBSD_PROCSTAT_PSSTRINGS
,
818 note_desc
->data (), note_desc
->size ());
826 /* Helper function to generate the file descriptor description for a
827 single open file in 'info proc files'. */
830 fbsd_file_fd (int kf_fd
)
834 case KINFO_FILE_FD_TYPE_CWD
:
836 case KINFO_FILE_FD_TYPE_ROOT
:
838 case KINFO_FILE_FD_TYPE_JAIL
:
840 case KINFO_FILE_FD_TYPE_TRACE
:
842 case KINFO_FILE_FD_TYPE_TEXT
:
844 case KINFO_FILE_FD_TYPE_CTTY
:
847 return int_string (kf_fd
, 10, 1, 0, 0);
851 /* Helper function to generate the file type for a single open file in
852 'info proc files'. */
855 fbsd_file_type (int kf_type
, int kf_vnode_type
)
859 case KINFO_FILE_TYPE_VNODE
:
860 switch (kf_vnode_type
)
862 case KINFO_FILE_VTYPE_VREG
:
864 case KINFO_FILE_VTYPE_VDIR
:
866 case KINFO_FILE_VTYPE_VCHR
:
868 case KINFO_FILE_VTYPE_VLNK
:
870 case KINFO_FILE_VTYPE_VSOCK
:
872 case KINFO_FILE_VTYPE_VFIFO
:
876 char *str
= get_print_cell ();
878 xsnprintf (str
, PRINT_CELL_SIZE
, "vn:%d", kf_vnode_type
);
882 case KINFO_FILE_TYPE_SOCKET
:
884 case KINFO_FILE_TYPE_PIPE
:
886 case KINFO_FILE_TYPE_FIFO
:
888 case KINFO_FILE_TYPE_KQUEUE
:
890 case KINFO_FILE_TYPE_CRYPTO
:
892 case KINFO_FILE_TYPE_MQUEUE
:
894 case KINFO_FILE_TYPE_SHM
:
896 case KINFO_FILE_TYPE_SEM
:
898 case KINFO_FILE_TYPE_PTS
:
900 case KINFO_FILE_TYPE_PROCDESC
:
903 return int_string (kf_type
, 10, 1, 0, 0);
907 /* Helper function to generate the file flags for a single open file in
908 'info proc files'. */
911 fbsd_file_flags (int kf_flags
)
913 static char file_flags
[10];
915 file_flags
[0] = (kf_flags
& KINFO_FILE_FLAG_READ
) ? 'r' : '-';
916 file_flags
[1] = (kf_flags
& KINFO_FILE_FLAG_WRITE
) ? 'w' : '-';
917 file_flags
[2] = (kf_flags
& KINFO_FILE_FLAG_EXEC
) ? 'x' : '-';
918 file_flags
[3] = (kf_flags
& KINFO_FILE_FLAG_APPEND
) ? 'a' : '-';
919 file_flags
[4] = (kf_flags
& KINFO_FILE_FLAG_ASYNC
) ? 's' : '-';
920 file_flags
[5] = (kf_flags
& KINFO_FILE_FLAG_FSYNC
) ? 'f' : '-';
921 file_flags
[6] = (kf_flags
& KINFO_FILE_FLAG_NONBLOCK
) ? 'n' : '-';
922 file_flags
[7] = (kf_flags
& KINFO_FILE_FLAG_DIRECT
) ? 'd' : '-';
923 file_flags
[8] = (kf_flags
& KINFO_FILE_FLAG_HASLOCK
) ? 'l' : '-';
924 file_flags
[9] = '\0';
929 /* Helper function to generate the name of an IP protocol. */
932 fbsd_ipproto (int protocol
)
936 case FBSD_IPPROTO_ICMP
:
938 case FBSD_IPPROTO_TCP
:
940 case FBSD_IPPROTO_UDP
:
942 case FBSD_IPPROTO_SCTP
:
946 char *str
= get_print_cell ();
948 xsnprintf (str
, PRINT_CELL_SIZE
, "ip<%d>", protocol
);
954 /* Helper function to print out an IPv4 socket address. */
957 fbsd_print_sockaddr_in (const void *sockaddr
)
959 const struct fbsd_sockaddr_in
*sin
=
960 reinterpret_cast<const struct fbsd_sockaddr_in
*> (sockaddr
);
961 char buf
[INET_ADDRSTRLEN
];
963 if (inet_ntop (AF_INET
, sin
->sin_addr
, buf
, sizeof buf
) == nullptr)
964 error (_("Failed to format IPv4 address"));
965 printf_filtered ("%s:%u", buf
,
966 (sin
->sin_port
[0] << 8) | sin
->sin_port
[1]);
969 /* Helper function to print out an IPv6 socket address. */
972 fbsd_print_sockaddr_in6 (const void *sockaddr
)
974 const struct fbsd_sockaddr_in6
*sin6
=
975 reinterpret_cast<const struct fbsd_sockaddr_in6
*> (sockaddr
);
976 char buf
[INET6_ADDRSTRLEN
];
978 if (inet_ntop (AF_INET6
, sin6
->sin6_addr
, buf
, sizeof buf
) == nullptr)
979 error (_("Failed to format IPv6 address"));
980 printf_filtered ("%s.%u", buf
,
981 (sin6
->sin6_port
[0] << 8) | sin6
->sin6_port
[1]);
984 /* See fbsd-tdep.h. */
987 fbsd_info_proc_files_header ()
989 printf_filtered (_("Open files:\n\n"));
990 printf_filtered (" %6s %6s %10s %9s %s\n",
991 "FD", "Type", "Offset", "Flags ", "Name");
994 /* See fbsd-tdep.h. */
997 fbsd_info_proc_files_entry (int kf_type
, int kf_fd
, int kf_flags
,
998 LONGEST kf_offset
, int kf_vnode_type
,
999 int kf_sock_domain
, int kf_sock_type
,
1000 int kf_sock_protocol
, const void *kf_sa_local
,
1001 const void *kf_sa_peer
, const void *kf_path
)
1003 printf_filtered (" %6s %6s %10s %8s ",
1004 fbsd_file_fd (kf_fd
),
1005 fbsd_file_type (kf_type
, kf_vnode_type
),
1006 kf_offset
> -1 ? hex_string (kf_offset
) : "-",
1007 fbsd_file_flags (kf_flags
));
1008 if (kf_type
== KINFO_FILE_TYPE_SOCKET
)
1010 switch (kf_sock_domain
)
1014 switch (kf_sock_type
)
1016 case FBSD_SOCK_STREAM
:
1017 printf_filtered ("unix stream:");
1019 case FBSD_SOCK_DGRAM
:
1020 printf_filtered ("unix dgram:");
1022 case FBSD_SOCK_SEQPACKET
:
1023 printf_filtered ("unix seqpacket:");
1026 printf_filtered ("unix <%d>:", kf_sock_type
);
1030 /* For local sockets, print out the first non-nul path
1031 rather than both paths. */
1032 const struct fbsd_sockaddr_un
*sun
1033 = reinterpret_cast<const struct fbsd_sockaddr_un
*> (kf_sa_local
);
1034 if (sun
->sun_path
[0] == 0)
1035 sun
= reinterpret_cast<const struct fbsd_sockaddr_un
*>
1037 printf_filtered ("%s", sun
->sun_path
);
1041 printf_filtered ("%s4 ", fbsd_ipproto (kf_sock_protocol
));
1042 fbsd_print_sockaddr_in (kf_sa_local
);
1043 printf_filtered (" -> ");
1044 fbsd_print_sockaddr_in (kf_sa_peer
);
1047 printf_filtered ("%s6 ", fbsd_ipproto (kf_sock_protocol
));
1048 fbsd_print_sockaddr_in6 (kf_sa_local
);
1049 printf_filtered (" -> ");
1050 fbsd_print_sockaddr_in6 (kf_sa_peer
);
1055 printf_filtered ("%s", reinterpret_cast<const char *> (kf_path
));
1056 printf_filtered ("\n");
1059 /* Implement "info proc files" for a corefile. */
1062 fbsd_core_info_proc_files (struct gdbarch
*gdbarch
)
1065 = bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.files");
1066 if (section
== NULL
)
1068 warning (_("unable to find open files in core file"));
1072 size_t note_size
= bfd_get_section_size (section
);
1074 error (_("malformed core note - too short for header"));
1076 gdb::def_vector
<unsigned char> contents (note_size
);
1077 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
1079 error (_("could not get core note contents"));
1081 unsigned char *descdata
= contents
.data ();
1082 unsigned char *descend
= descdata
+ note_size
;
1084 /* Skip over the structure size. */
1087 fbsd_info_proc_files_header ();
1089 while (descdata
+ KF_PATH
< descend
)
1091 ULONGEST structsize
= bfd_get_32 (core_bfd
, descdata
+ KF_STRUCTSIZE
);
1092 if (structsize
< KF_PATH
)
1093 error (_("malformed core note - file structure too small"));
1095 LONGEST type
= bfd_get_signed_32 (core_bfd
, descdata
+ KF_TYPE
);
1096 LONGEST fd
= bfd_get_signed_32 (core_bfd
, descdata
+ KF_FD
);
1097 LONGEST flags
= bfd_get_signed_32 (core_bfd
, descdata
+ KF_FLAGS
);
1098 LONGEST offset
= bfd_get_signed_64 (core_bfd
, descdata
+ KF_OFFSET
);
1099 LONGEST vnode_type
= bfd_get_signed_32 (core_bfd
,
1100 descdata
+ KF_VNODE_TYPE
);
1101 LONGEST sock_domain
= bfd_get_signed_32 (core_bfd
,
1102 descdata
+ KF_SOCK_DOMAIN
);
1103 LONGEST sock_type
= bfd_get_signed_32 (core_bfd
, descdata
+ KF_SOCK_TYPE
);
1104 LONGEST sock_protocol
= bfd_get_signed_32 (core_bfd
,
1105 descdata
+ KF_SOCK_PROTOCOL
);
1106 fbsd_info_proc_files_entry (type
, fd
, flags
, offset
, vnode_type
,
1107 sock_domain
, sock_type
, sock_protocol
,
1108 descdata
+ KF_SA_LOCAL
, descdata
+ KF_SA_PEER
,
1109 descdata
+ KF_PATH
);
1111 descdata
+= structsize
;
1115 /* Helper function to generate mappings flags for a single VM map
1116 entry in 'info proc mappings'. */
1119 fbsd_vm_map_entry_flags (int kve_flags
, int kve_protection
)
1121 static char vm_flags
[9];
1123 vm_flags
[0] = (kve_protection
& KINFO_VME_PROT_READ
) ? 'r' : '-';
1124 vm_flags
[1] = (kve_protection
& KINFO_VME_PROT_WRITE
) ? 'w' : '-';
1125 vm_flags
[2] = (kve_protection
& KINFO_VME_PROT_EXEC
) ? 'x' : '-';
1127 vm_flags
[4] = (kve_flags
& KINFO_VME_FLAG_COW
) ? 'C' : '-';
1128 vm_flags
[5] = (kve_flags
& KINFO_VME_FLAG_NEEDS_COPY
) ? 'N' : '-';
1129 vm_flags
[6] = (kve_flags
& KINFO_VME_FLAG_SUPER
) ? 'S' : '-';
1130 vm_flags
[7] = (kve_flags
& KINFO_VME_FLAG_GROWS_UP
) ? 'U'
1131 : (kve_flags
& KINFO_VME_FLAG_GROWS_DOWN
) ? 'D' : '-';
1137 /* See fbsd-tdep.h. */
1140 fbsd_info_proc_mappings_header (int addr_bit
)
1142 printf_filtered (_("Mapped address spaces:\n\n"));
1145 printf_filtered (" %18s %18s %10s %10s %9s %s\n",
1148 " Size", " Offset", "Flags ", "File");
1152 printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
1155 " Size", " Offset", "Flags ", "File");
1159 /* See fbsd-tdep.h. */
1162 fbsd_info_proc_mappings_entry (int addr_bit
, ULONGEST kve_start
,
1163 ULONGEST kve_end
, ULONGEST kve_offset
,
1164 int kve_flags
, int kve_protection
,
1165 const void *kve_path
)
1169 printf_filtered (" %18s %18s %10s %10s %9s %s\n",
1170 hex_string (kve_start
),
1171 hex_string (kve_end
),
1172 hex_string (kve_end
- kve_start
),
1173 hex_string (kve_offset
),
1174 fbsd_vm_map_entry_flags (kve_flags
, kve_protection
),
1175 reinterpret_cast<const char *> (kve_path
));
1179 printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
1180 hex_string (kve_start
),
1181 hex_string (kve_end
),
1182 hex_string (kve_end
- kve_start
),
1183 hex_string (kve_offset
),
1184 fbsd_vm_map_entry_flags (kve_flags
, kve_protection
),
1185 reinterpret_cast<const char *> (kve_path
));
1189 /* Implement "info proc mappings" for a corefile. */
1192 fbsd_core_info_proc_mappings (struct gdbarch
*gdbarch
)
1195 unsigned char *descdata
, *descend
;
1198 section
= bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.vmmap");
1199 if (section
== NULL
)
1201 warning (_("unable to find mappings in core file"));
1205 note_size
= bfd_get_section_size (section
);
1207 error (_("malformed core note - too short for header"));
1209 gdb::def_vector
<unsigned char> contents (note_size
);
1210 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
1212 error (_("could not get core note contents"));
1214 descdata
= contents
.data ();
1215 descend
= descdata
+ note_size
;
1217 /* Skip over the structure size. */
1220 fbsd_info_proc_mappings_header (gdbarch_addr_bit (gdbarch
));
1221 while (descdata
+ KVE_PATH
< descend
)
1223 ULONGEST structsize
= bfd_get_32 (core_bfd
, descdata
+ KVE_STRUCTSIZE
);
1224 if (structsize
< KVE_PATH
)
1225 error (_("malformed core note - vmmap entry too small"));
1227 ULONGEST start
= bfd_get_64 (core_bfd
, descdata
+ KVE_START
);
1228 ULONGEST end
= bfd_get_64 (core_bfd
, descdata
+ KVE_END
);
1229 ULONGEST offset
= bfd_get_64 (core_bfd
, descdata
+ KVE_OFFSET
);
1230 LONGEST flags
= bfd_get_signed_32 (core_bfd
, descdata
+ KVE_FLAGS
);
1231 LONGEST prot
= bfd_get_signed_32 (core_bfd
, descdata
+ KVE_PROTECTION
);
1232 fbsd_info_proc_mappings_entry (gdbarch_addr_bit (gdbarch
), start
, end
,
1233 offset
, flags
, prot
, descdata
+ KVE_PATH
);
1235 descdata
+= structsize
;
1239 /* Fetch the pathname of a vnode for a single file descriptor from the
1240 file table core note. */
1242 static gdb::unique_xmalloc_ptr
<char>
1243 fbsd_core_vnode_path (struct gdbarch
*gdbarch
, int fd
)
1246 unsigned char *descdata
, *descend
;
1249 section
= bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.files");
1250 if (section
== NULL
)
1253 note_size
= bfd_get_section_size (section
);
1255 error (_("malformed core note - too short for header"));
1257 gdb::def_vector
<unsigned char> contents (note_size
);
1258 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
1260 error (_("could not get core note contents"));
1262 descdata
= contents
.data ();
1263 descend
= descdata
+ note_size
;
1265 /* Skip over the structure size. */
1268 while (descdata
+ KF_PATH
< descend
)
1270 ULONGEST structsize
;
1272 structsize
= bfd_get_32 (core_bfd
, descdata
+ KF_STRUCTSIZE
);
1273 if (structsize
< KF_PATH
)
1274 error (_("malformed core note - file structure too small"));
1276 if (bfd_get_32 (core_bfd
, descdata
+ KF_TYPE
) == KINFO_FILE_TYPE_VNODE
1277 && bfd_get_signed_32 (core_bfd
, descdata
+ KF_FD
) == fd
)
1279 char *path
= (char *) descdata
+ KF_PATH
;
1280 return gdb::unique_xmalloc_ptr
<char> (xstrdup (path
));
1283 descdata
+= structsize
;
1288 /* Helper function to read a struct timeval. */
1291 fbsd_core_fetch_timeval (struct gdbarch
*gdbarch
, unsigned char *data
,
1292 LONGEST
&sec
, ULONGEST
&usec
)
1294 if (gdbarch_addr_bit (gdbarch
) == 64)
1296 sec
= bfd_get_signed_64 (core_bfd
, data
);
1297 usec
= bfd_get_64 (core_bfd
, data
+ 8);
1299 else if (bfd_get_arch (core_bfd
) == bfd_arch_i386
)
1301 sec
= bfd_get_signed_32 (core_bfd
, data
);
1302 usec
= bfd_get_32 (core_bfd
, data
+ 4);
1306 sec
= bfd_get_signed_64 (core_bfd
, data
);
1307 usec
= bfd_get_32 (core_bfd
, data
+ 8);
1311 /* Print out the contents of a signal set. */
1314 fbsd_print_sigset (const char *descr
, unsigned char *sigset
)
1316 printf_filtered ("%s: ", descr
);
1317 for (int i
= 0; i
< SIG_WORDS
; i
++)
1318 printf_filtered ("%08x ",
1319 (unsigned int) bfd_get_32 (core_bfd
, sigset
+ i
* 4));
1320 printf_filtered ("\n");
1323 /* Implement "info proc status" for a corefile. */
1326 fbsd_core_info_proc_status (struct gdbarch
*gdbarch
)
1328 const struct kinfo_proc_layout
*kp
;
1330 unsigned char *descdata
;
1331 int addr_bit
, long_bit
;
1336 section
= bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.proc");
1337 if (section
== NULL
)
1339 warning (_("unable to find process info in core file"));
1343 addr_bit
= gdbarch_addr_bit (gdbarch
);
1345 kp
= &kinfo_proc_layout_64
;
1346 else if (bfd_get_arch (core_bfd
) == bfd_arch_i386
)
1347 kp
= &kinfo_proc_layout_i386
;
1349 kp
= &kinfo_proc_layout_32
;
1350 long_bit
= gdbarch_long_bit (gdbarch
);
1353 * Ensure that the note is large enough for all of the fields fetched
1354 * by this function. In particular, the note must contain the 32-bit
1355 * structure size, then it must be long enough to access the last
1356 * field used (ki_rusage_ch.ru_majflt) which is the size of a long.
1358 note_size
= bfd_get_section_size (section
);
1359 if (note_size
< (4 + kp
->ki_rusage_ch
+ kp
->ru_majflt
1360 + long_bit
/ TARGET_CHAR_BIT
))
1361 error (_("malformed core note - too short"));
1363 gdb::def_vector
<unsigned char> contents (note_size
);
1364 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
1366 error (_("could not get core note contents"));
1368 descdata
= contents
.data ();
1370 /* Skip over the structure size. */
1373 /* Verify 'ki_layout' is 0. */
1374 if (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_layout
) != 0)
1376 warning (_("unsupported process information in core file"));
1380 printf_filtered ("Name: %.19s\n", descdata
+ kp
->ki_comm
);
1381 printf_filtered ("Process ID: %s\n",
1382 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_pid
)));
1383 printf_filtered ("Parent process: %s\n",
1384 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_ppid
)));
1385 printf_filtered ("Process group: %s\n",
1386 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_pgid
)));
1387 printf_filtered ("Session id: %s\n",
1388 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_sid
)));
1390 /* FreeBSD 12.0 and later store a 64-bit dev_t at 'ki_tdev'. Older
1391 kernels store a 32-bit dev_t at 'ki_tdev_freebsd11'. In older
1392 kernels the 64-bit 'ki_tdev' field is in a reserved section of
1393 the structure that is cleared to zero. Assume that a zero value
1394 in ki_tdev indicates a core dump from an older kernel and use the
1395 value in 'ki_tdev_freebsd11' instead. */
1396 value
= bfd_get_64 (core_bfd
, descdata
+ kp
->ki_tdev
);
1398 value
= bfd_get_32 (core_bfd
, descdata
+ kp
->ki_tdev_freebsd11
);
1399 printf_filtered ("TTY: %s\n", pulongest (value
));
1400 printf_filtered ("TTY owner process group: %s\n",
1401 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_tpgid
)));
1402 printf_filtered ("User IDs (real, effective, saved): %s %s %s\n",
1403 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_ruid
)),
1404 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_uid
)),
1405 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_svuid
)));
1406 printf_filtered ("Group IDs (real, effective, saved): %s %s %s\n",
1407 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_rgid
)),
1408 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_groups
)),
1409 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_svgid
)));
1410 printf_filtered ("Groups: ");
1411 uint16_t ngroups
= bfd_get_16 (core_bfd
, descdata
+ kp
->ki_ngroups
);
1412 for (int i
= 0; i
< ngroups
; i
++)
1413 printf_filtered ("%s ",
1414 pulongest (bfd_get_32 (core_bfd
,
1415 descdata
+ kp
->ki_groups
+ i
* 4)));
1416 printf_filtered ("\n");
1417 value
= bfd_get (long_bit
, core_bfd
,
1418 descdata
+ kp
->ki_rusage
+ kp
->ru_minflt
);
1419 printf_filtered ("Minor faults (no memory page): %s\n", pulongest (value
));
1420 value
= bfd_get (long_bit
, core_bfd
,
1421 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_minflt
);
1422 printf_filtered ("Minor faults, children: %s\n", pulongest (value
));
1423 value
= bfd_get (long_bit
, core_bfd
,
1424 descdata
+ kp
->ki_rusage
+ kp
->ru_majflt
);
1425 printf_filtered ("Major faults (memory page faults): %s\n",
1427 value
= bfd_get (long_bit
, core_bfd
,
1428 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_majflt
);
1429 printf_filtered ("Major faults, children: %s\n", pulongest (value
));
1430 fbsd_core_fetch_timeval (gdbarch
,
1431 descdata
+ kp
->ki_rusage
+ kp
->ru_utime
,
1433 printf_filtered ("utime: %s.%06d\n", plongest (sec
), (int) value
);
1434 fbsd_core_fetch_timeval (gdbarch
,
1435 descdata
+ kp
->ki_rusage
+ kp
->ru_stime
,
1437 printf_filtered ("stime: %s.%06d\n", plongest (sec
), (int) value
);
1438 fbsd_core_fetch_timeval (gdbarch
,
1439 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_utime
,
1441 printf_filtered ("utime, children: %s.%06d\n", plongest (sec
), (int) value
);
1442 fbsd_core_fetch_timeval (gdbarch
,
1443 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_stime
,
1445 printf_filtered ("stime, children: %s.%06d\n", plongest (sec
), (int) value
);
1446 printf_filtered ("'nice' value: %d\n",
1447 bfd_get_signed_8 (core_bfd
, descdata
+ kp
->ki_nice
));
1448 fbsd_core_fetch_timeval (gdbarch
, descdata
+ kp
->ki_start
, sec
, value
);
1449 printf_filtered ("Start time: %s.%06d\n", plongest (sec
), (int) value
);
1450 printf_filtered ("Virtual memory size: %s kB\n",
1451 pulongest (bfd_get (addr_bit
, core_bfd
,
1452 descdata
+ kp
->ki_size
) / 1024));
1453 printf_filtered ("Data size: %s pages\n",
1454 pulongest (bfd_get (addr_bit
, core_bfd
,
1455 descdata
+ kp
->ki_dsize
)));
1456 printf_filtered ("Stack size: %s pages\n",
1457 pulongest (bfd_get (addr_bit
, core_bfd
,
1458 descdata
+ kp
->ki_ssize
)));
1459 printf_filtered ("Text size: %s pages\n",
1460 pulongest (bfd_get (addr_bit
, core_bfd
,
1461 descdata
+ kp
->ki_tsize
)));
1462 printf_filtered ("Resident set size: %s pages\n",
1463 pulongest (bfd_get (addr_bit
, core_bfd
,
1464 descdata
+ kp
->ki_rssize
)));
1465 printf_filtered ("Maximum RSS: %s pages\n",
1466 pulongest (bfd_get (long_bit
, core_bfd
,
1467 descdata
+ kp
->ki_rusage
1469 fbsd_print_sigset ("Ignored Signals", descdata
+ kp
->ki_sigignore
);
1470 fbsd_print_sigset ("Caught Signals", descdata
+ kp
->ki_sigcatch
);
1473 /* Implement the "core_info_proc" gdbarch method. */
1476 fbsd_core_info_proc (struct gdbarch
*gdbarch
, const char *args
,
1477 enum info_proc_what what
)
1479 bool do_cmdline
= false;
1480 bool do_cwd
= false;
1481 bool do_exe
= false;
1482 bool do_files
= false;
1483 bool do_mappings
= false;
1484 bool do_status
= false;
1525 pid
= bfd_core_file_pid (core_bfd
);
1527 printf_filtered (_("process %d\n"), pid
);
1531 const char *cmdline
;
1533 cmdline
= bfd_core_file_failing_command (core_bfd
);
1535 printf_filtered ("cmdline = '%s'\n", cmdline
);
1537 warning (_("Command line unavailable"));
1541 gdb::unique_xmalloc_ptr
<char> cwd
=
1542 fbsd_core_vnode_path (gdbarch
, KINFO_FILE_FD_TYPE_CWD
);
1544 printf_filtered ("cwd = '%s'\n", cwd
.get ());
1546 warning (_("unable to read current working directory"));
1550 gdb::unique_xmalloc_ptr
<char> exe
=
1551 fbsd_core_vnode_path (gdbarch
, KINFO_FILE_FD_TYPE_TEXT
);
1553 printf_filtered ("exe = '%s'\n", exe
.get ());
1555 warning (_("unable to read executable path name"));
1558 fbsd_core_info_proc_files (gdbarch
);
1560 fbsd_core_info_proc_mappings (gdbarch
);
1562 fbsd_core_info_proc_status (gdbarch
);
1565 /* Print descriptions of FreeBSD-specific AUXV entries to FILE. */
1568 fbsd_print_auxv_entry (struct gdbarch
*gdbarch
, struct ui_file
*file
,
1569 CORE_ADDR type
, CORE_ADDR val
)
1571 const char *name
= "???";
1572 const char *description
= "";
1573 enum auxv_format format
= AUXV_FORMAT_HEX
;
1592 default_print_auxv_entry (gdbarch
, file
, type
, val
);
1594 #define _TAGNAME(tag) #tag
1595 #define TAGNAME(tag) _TAGNAME(AT_##tag)
1596 #define TAG(tag, text, kind) \
1597 case AT_FREEBSD_##tag: name = TAGNAME(tag); description = text; format = kind; break
1598 TAG (EXECPATH
, _("Executable path"), AUXV_FORMAT_STR
);
1599 TAG (CANARY
, _("Canary for SSP"), AUXV_FORMAT_HEX
);
1600 TAG (CANARYLEN
, ("Length of the SSP canary"), AUXV_FORMAT_DEC
);
1601 TAG (OSRELDATE
, _("OSRELDATE"), AUXV_FORMAT_DEC
);
1602 TAG (NCPUS
, _("Number of CPUs"), AUXV_FORMAT_DEC
);
1603 TAG (PAGESIZES
, _("Pagesizes"), AUXV_FORMAT_HEX
);
1604 TAG (PAGESIZESLEN
, _("Number of pagesizes"), AUXV_FORMAT_DEC
);
1605 TAG (TIMEKEEP
, _("Pointer to timehands"), AUXV_FORMAT_HEX
);
1606 TAG (STACKPROT
, _("Initial stack protection"), AUXV_FORMAT_HEX
);
1607 TAG (EHDRFLAGS
, _("ELF header e_flags"), AUXV_FORMAT_HEX
);
1608 TAG (HWCAP
, _("Machine-dependent CPU capability hints"), AUXV_FORMAT_HEX
);
1609 TAG (HWCAP2
, _("Extension of AT_HWCAP"), AUXV_FORMAT_HEX
);
1612 fprint_auxv_entry (file
, name
, description
, format
, type
, val
);
1615 /* Implement the "get_siginfo_type" gdbarch method. */
1617 static struct type
*
1618 fbsd_get_siginfo_type (struct gdbarch
*gdbarch
)
1620 struct fbsd_gdbarch_data
*fbsd_gdbarch_data
;
1621 struct type
*int_type
, *int32_type
, *uint32_type
, *long_type
, *void_ptr_type
;
1622 struct type
*uid_type
, *pid_type
;
1623 struct type
*sigval_type
, *reason_type
;
1624 struct type
*siginfo_type
;
1627 fbsd_gdbarch_data
= get_fbsd_gdbarch_data (gdbarch
);
1628 if (fbsd_gdbarch_data
->siginfo_type
!= NULL
)
1629 return fbsd_gdbarch_data
->siginfo_type
;
1631 int_type
= arch_integer_type (gdbarch
, gdbarch_int_bit (gdbarch
),
1633 int32_type
= arch_integer_type (gdbarch
, 32, 0, "int32_t");
1634 uint32_type
= arch_integer_type (gdbarch
, 32, 1, "uint32_t");
1635 long_type
= arch_integer_type (gdbarch
, gdbarch_long_bit (gdbarch
),
1637 void_ptr_type
= lookup_pointer_type (builtin_type (gdbarch
)->builtin_void
);
1640 sigval_type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_UNION
);
1641 TYPE_NAME (sigval_type
) = xstrdup ("sigval");
1642 append_composite_type_field (sigval_type
, "sival_int", int_type
);
1643 append_composite_type_field (sigval_type
, "sival_ptr", void_ptr_type
);
1646 pid_type
= arch_type (gdbarch
, TYPE_CODE_TYPEDEF
,
1647 TYPE_LENGTH (int32_type
) * TARGET_CHAR_BIT
, "__pid_t");
1648 TYPE_TARGET_TYPE (pid_type
) = int32_type
;
1649 TYPE_TARGET_STUB (pid_type
) = 1;
1652 uid_type
= arch_type (gdbarch
, TYPE_CODE_TYPEDEF
,
1653 TYPE_LENGTH (uint32_type
) * TARGET_CHAR_BIT
,
1655 TYPE_TARGET_TYPE (uid_type
) = uint32_type
;
1656 TYPE_TARGET_STUB (uid_type
) = 1;
1659 reason_type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_UNION
);
1662 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1663 append_composite_type_field (type
, "si_trapno", int_type
);
1664 append_composite_type_field (reason_type
, "_fault", type
);
1667 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1668 append_composite_type_field (type
, "si_timerid", int_type
);
1669 append_composite_type_field (type
, "si_overrun", int_type
);
1670 append_composite_type_field (reason_type
, "_timer", type
);
1673 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1674 append_composite_type_field (type
, "si_mqd", int_type
);
1675 append_composite_type_field (reason_type
, "_mesgq", type
);
1678 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1679 append_composite_type_field (type
, "si_band", long_type
);
1680 append_composite_type_field (reason_type
, "_poll", type
);
1683 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1684 append_composite_type_field (type
, "__spare1__", long_type
);
1685 append_composite_type_field (type
, "__spare2__",
1686 init_vector_type (int_type
, 7));
1687 append_composite_type_field (reason_type
, "__spare__", type
);
1689 /* struct siginfo */
1690 siginfo_type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1691 TYPE_NAME (siginfo_type
) = xstrdup ("siginfo");
1692 append_composite_type_field (siginfo_type
, "si_signo", int_type
);
1693 append_composite_type_field (siginfo_type
, "si_errno", int_type
);
1694 append_composite_type_field (siginfo_type
, "si_code", int_type
);
1695 append_composite_type_field (siginfo_type
, "si_pid", pid_type
);
1696 append_composite_type_field (siginfo_type
, "si_uid", uid_type
);
1697 append_composite_type_field (siginfo_type
, "si_status", int_type
);
1698 append_composite_type_field (siginfo_type
, "si_addr", void_ptr_type
);
1699 append_composite_type_field (siginfo_type
, "si_value", sigval_type
);
1700 append_composite_type_field (siginfo_type
, "_reason", reason_type
);
1702 fbsd_gdbarch_data
->siginfo_type
= siginfo_type
;
1704 return siginfo_type
;
1707 /* Implement the "gdb_signal_from_target" gdbarch method. */
1709 static enum gdb_signal
1710 fbsd_gdb_signal_from_target (struct gdbarch
*gdbarch
, int signal
)
1715 return GDB_SIGNAL_0
;
1717 case FREEBSD_SIGHUP
:
1718 return GDB_SIGNAL_HUP
;
1720 case FREEBSD_SIGINT
:
1721 return GDB_SIGNAL_INT
;
1723 case FREEBSD_SIGQUIT
:
1724 return GDB_SIGNAL_QUIT
;
1726 case FREEBSD_SIGILL
:
1727 return GDB_SIGNAL_ILL
;
1729 case FREEBSD_SIGTRAP
:
1730 return GDB_SIGNAL_TRAP
;
1732 case FREEBSD_SIGABRT
:
1733 return GDB_SIGNAL_ABRT
;
1735 case FREEBSD_SIGEMT
:
1736 return GDB_SIGNAL_EMT
;
1738 case FREEBSD_SIGFPE
:
1739 return GDB_SIGNAL_FPE
;
1741 case FREEBSD_SIGKILL
:
1742 return GDB_SIGNAL_KILL
;
1744 case FREEBSD_SIGBUS
:
1745 return GDB_SIGNAL_BUS
;
1747 case FREEBSD_SIGSEGV
:
1748 return GDB_SIGNAL_SEGV
;
1750 case FREEBSD_SIGSYS
:
1751 return GDB_SIGNAL_SYS
;
1753 case FREEBSD_SIGPIPE
:
1754 return GDB_SIGNAL_PIPE
;
1756 case FREEBSD_SIGALRM
:
1757 return GDB_SIGNAL_ALRM
;
1759 case FREEBSD_SIGTERM
:
1760 return GDB_SIGNAL_TERM
;
1762 case FREEBSD_SIGURG
:
1763 return GDB_SIGNAL_URG
;
1765 case FREEBSD_SIGSTOP
:
1766 return GDB_SIGNAL_STOP
;
1768 case FREEBSD_SIGTSTP
:
1769 return GDB_SIGNAL_TSTP
;
1771 case FREEBSD_SIGCONT
:
1772 return GDB_SIGNAL_CONT
;
1774 case FREEBSD_SIGCHLD
:
1775 return GDB_SIGNAL_CHLD
;
1777 case FREEBSD_SIGTTIN
:
1778 return GDB_SIGNAL_TTIN
;
1780 case FREEBSD_SIGTTOU
:
1781 return GDB_SIGNAL_TTOU
;
1784 return GDB_SIGNAL_IO
;
1786 case FREEBSD_SIGXCPU
:
1787 return GDB_SIGNAL_XCPU
;
1789 case FREEBSD_SIGXFSZ
:
1790 return GDB_SIGNAL_XFSZ
;
1792 case FREEBSD_SIGVTALRM
:
1793 return GDB_SIGNAL_VTALRM
;
1795 case FREEBSD_SIGPROF
:
1796 return GDB_SIGNAL_PROF
;
1798 case FREEBSD_SIGWINCH
:
1799 return GDB_SIGNAL_WINCH
;
1801 case FREEBSD_SIGINFO
:
1802 return GDB_SIGNAL_INFO
;
1804 case FREEBSD_SIGUSR1
:
1805 return GDB_SIGNAL_USR1
;
1807 case FREEBSD_SIGUSR2
:
1808 return GDB_SIGNAL_USR2
;
1810 /* SIGTHR is the same as SIGLWP on FreeBSD. */
1811 case FREEBSD_SIGTHR
:
1812 return GDB_SIGNAL_LWP
;
1814 case FREEBSD_SIGLIBRT
:
1815 return GDB_SIGNAL_LIBRT
;
1818 if (signal
>= FREEBSD_SIGRTMIN
&& signal
<= FREEBSD_SIGRTMAX
)
1820 int offset
= signal
- FREEBSD_SIGRTMIN
;
1822 return (enum gdb_signal
) ((int) GDB_SIGNAL_REALTIME_65
+ offset
);
1825 return GDB_SIGNAL_UNKNOWN
;
1828 /* Implement the "gdb_signal_to_target" gdbarch method. */
1831 fbsd_gdb_signal_to_target (struct gdbarch
*gdbarch
,
1832 enum gdb_signal signal
)
1839 case GDB_SIGNAL_HUP
:
1840 return FREEBSD_SIGHUP
;
1842 case GDB_SIGNAL_INT
:
1843 return FREEBSD_SIGINT
;
1845 case GDB_SIGNAL_QUIT
:
1846 return FREEBSD_SIGQUIT
;
1848 case GDB_SIGNAL_ILL
:
1849 return FREEBSD_SIGILL
;
1851 case GDB_SIGNAL_TRAP
:
1852 return FREEBSD_SIGTRAP
;
1854 case GDB_SIGNAL_ABRT
:
1855 return FREEBSD_SIGABRT
;
1857 case GDB_SIGNAL_EMT
:
1858 return FREEBSD_SIGEMT
;
1860 case GDB_SIGNAL_FPE
:
1861 return FREEBSD_SIGFPE
;
1863 case GDB_SIGNAL_KILL
:
1864 return FREEBSD_SIGKILL
;
1866 case GDB_SIGNAL_BUS
:
1867 return FREEBSD_SIGBUS
;
1869 case GDB_SIGNAL_SEGV
:
1870 return FREEBSD_SIGSEGV
;
1872 case GDB_SIGNAL_SYS
:
1873 return FREEBSD_SIGSYS
;
1875 case GDB_SIGNAL_PIPE
:
1876 return FREEBSD_SIGPIPE
;
1878 case GDB_SIGNAL_ALRM
:
1879 return FREEBSD_SIGALRM
;
1881 case GDB_SIGNAL_TERM
:
1882 return FREEBSD_SIGTERM
;
1884 case GDB_SIGNAL_URG
:
1885 return FREEBSD_SIGURG
;
1887 case GDB_SIGNAL_STOP
:
1888 return FREEBSD_SIGSTOP
;
1890 case GDB_SIGNAL_TSTP
:
1891 return FREEBSD_SIGTSTP
;
1893 case GDB_SIGNAL_CONT
:
1894 return FREEBSD_SIGCONT
;
1896 case GDB_SIGNAL_CHLD
:
1897 return FREEBSD_SIGCHLD
;
1899 case GDB_SIGNAL_TTIN
:
1900 return FREEBSD_SIGTTIN
;
1902 case GDB_SIGNAL_TTOU
:
1903 return FREEBSD_SIGTTOU
;
1906 return FREEBSD_SIGIO
;
1908 case GDB_SIGNAL_XCPU
:
1909 return FREEBSD_SIGXCPU
;
1911 case GDB_SIGNAL_XFSZ
:
1912 return FREEBSD_SIGXFSZ
;
1914 case GDB_SIGNAL_VTALRM
:
1915 return FREEBSD_SIGVTALRM
;
1917 case GDB_SIGNAL_PROF
:
1918 return FREEBSD_SIGPROF
;
1920 case GDB_SIGNAL_WINCH
:
1921 return FREEBSD_SIGWINCH
;
1923 case GDB_SIGNAL_INFO
:
1924 return FREEBSD_SIGINFO
;
1926 case GDB_SIGNAL_USR1
:
1927 return FREEBSD_SIGUSR1
;
1929 case GDB_SIGNAL_USR2
:
1930 return FREEBSD_SIGUSR2
;
1932 case GDB_SIGNAL_LWP
:
1933 return FREEBSD_SIGTHR
;
1935 case GDB_SIGNAL_LIBRT
:
1936 return FREEBSD_SIGLIBRT
;
1939 if (signal
>= GDB_SIGNAL_REALTIME_65
1940 && signal
<= GDB_SIGNAL_REALTIME_126
)
1942 int offset
= signal
- GDB_SIGNAL_REALTIME_65
;
1944 return FREEBSD_SIGRTMIN
+ offset
;
1950 /* Implement the "get_syscall_number" gdbarch method. */
1953 fbsd_get_syscall_number (struct gdbarch
*gdbarch
, thread_info
*thread
)
1956 /* FreeBSD doesn't use gdbarch_get_syscall_number since FreeBSD
1957 native targets fetch the system call number from the
1958 'pl_syscall_code' member of struct ptrace_lwpinfo in fbsd_wait.
1959 However, system call catching requires this function to be
1962 internal_error (__FILE__
, __LINE__
, _("fbsd_get_sycall_number called"));
1965 /* Read an integer symbol value from the current target. */
1968 fbsd_read_integer_by_name (struct gdbarch
*gdbarch
, const char *name
)
1970 bound_minimal_symbol ms
= lookup_minimal_symbol (name
, NULL
, NULL
);
1971 if (ms
.minsym
== NULL
)
1972 error (_("Unable to resolve symbol '%s'"), name
);
1975 if (target_read_memory (BMSYMBOL_VALUE_ADDRESS (ms
), buf
, sizeof buf
) != 0)
1976 error (_("Unable to read value of '%s'"), name
);
1978 return extract_signed_integer (buf
, sizeof buf
, gdbarch_byte_order (gdbarch
));
1981 /* Lookup offsets of fields in the runtime linker's 'Obj_Entry'
1982 structure needed to determine the TLS index of an object file. */
1985 fbsd_fetch_rtld_offsets (struct gdbarch
*gdbarch
, struct fbsd_pspace_data
*data
)
1989 /* Fetch offsets from debug symbols in rtld. */
1990 struct symbol
*obj_entry_sym
1991 = lookup_symbol_in_language ("Struct_Obj_Entry", NULL
, STRUCT_DOMAIN
,
1992 language_c
, NULL
).symbol
;
1993 if (obj_entry_sym
== NULL
)
1994 error (_("Unable to find Struct_Obj_Entry symbol"));
1995 data
->off_linkmap
= lookup_struct_elt (SYMBOL_TYPE(obj_entry_sym
),
1996 "linkmap", 0).offset
/ 8;
1997 data
->off_tlsindex
= lookup_struct_elt (SYMBOL_TYPE(obj_entry_sym
),
1998 "tlsindex", 0).offset
/ 8;
1999 data
->rtld_offsets_valid
= true;
2002 catch (const gdb_exception_error
&e
)
2004 data
->off_linkmap
= -1;
2009 /* Fetch offsets from global variables in libthr. Note that
2010 this does not work for single-threaded processes that are not
2011 linked against libthr. */
2012 data
->off_linkmap
= fbsd_read_integer_by_name (gdbarch
,
2013 "_thread_off_linkmap");
2014 data
->off_tlsindex
= fbsd_read_integer_by_name (gdbarch
,
2015 "_thread_off_tlsindex");
2016 data
->rtld_offsets_valid
= true;
2019 catch (const gdb_exception_error
&e
)
2021 data
->off_linkmap
= -1;
2025 /* Helper function to read the TLS index of an object file associated
2026 with a link map entry at LM_ADDR. */
2029 fbsd_get_tls_index (struct gdbarch
*gdbarch
, CORE_ADDR lm_addr
)
2031 struct fbsd_pspace_data
*data
= get_fbsd_pspace_data (current_program_space
);
2033 if (!data
->rtld_offsets_valid
)
2034 fbsd_fetch_rtld_offsets (gdbarch
, data
);
2036 if (data
->off_linkmap
== -1)
2037 throw_error (TLS_GENERIC_ERROR
,
2038 _("Cannot fetch runtime linker structure offsets"));
2040 /* Simulate container_of to convert from LM_ADDR to the Obj_Entry
2041 pointer and then compute the offset of the tlsindex member. */
2042 CORE_ADDR tlsindex_addr
= lm_addr
- data
->off_linkmap
+ data
->off_tlsindex
;
2045 if (target_read_memory (tlsindex_addr
, buf
, sizeof buf
) != 0)
2046 throw_error (TLS_GENERIC_ERROR
,
2047 _("Cannot find thread-local variables on this target"));
2049 return extract_signed_integer (buf
, sizeof buf
, gdbarch_byte_order (gdbarch
));
2052 /* See fbsd-tdep.h. */
2055 fbsd_get_thread_local_address (struct gdbarch
*gdbarch
, CORE_ADDR dtv_addr
,
2056 CORE_ADDR lm_addr
, CORE_ADDR offset
)
2058 LONGEST tls_index
= fbsd_get_tls_index (gdbarch
, lm_addr
);
2060 gdb_byte buf
[gdbarch_ptr_bit (gdbarch
) / TARGET_CHAR_BIT
];
2061 if (target_read_memory (dtv_addr
, buf
, sizeof buf
) != 0)
2062 throw_error (TLS_GENERIC_ERROR
,
2063 _("Cannot find thread-local variables on this target"));
2065 const struct builtin_type
*builtin
= builtin_type (gdbarch
);
2066 CORE_ADDR addr
= gdbarch_pointer_to_address (gdbarch
,
2067 builtin
->builtin_data_ptr
, buf
);
2069 addr
+= (tls_index
+ 1) * TYPE_LENGTH (builtin
->builtin_data_ptr
);
2070 if (target_read_memory (addr
, buf
, sizeof buf
) != 0)
2071 throw_error (TLS_GENERIC_ERROR
,
2072 _("Cannot find thread-local variables on this target"));
2074 addr
= gdbarch_pointer_to_address (gdbarch
, builtin
->builtin_data_ptr
, buf
);
2075 return addr
+ offset
;
2078 /* To be called from GDB_OSABI_FREEBSD handlers. */
2081 fbsd_init_abi (struct gdbarch_info info
, struct gdbarch
*gdbarch
)
2083 set_gdbarch_core_pid_to_str (gdbarch
, fbsd_core_pid_to_str
);
2084 set_gdbarch_core_thread_name (gdbarch
, fbsd_core_thread_name
);
2085 set_gdbarch_core_xfer_siginfo (gdbarch
, fbsd_core_xfer_siginfo
);
2086 set_gdbarch_make_corefile_notes (gdbarch
, fbsd_make_corefile_notes
);
2087 set_gdbarch_core_info_proc (gdbarch
, fbsd_core_info_proc
);
2088 set_gdbarch_print_auxv_entry (gdbarch
, fbsd_print_auxv_entry
);
2089 set_gdbarch_get_siginfo_type (gdbarch
, fbsd_get_siginfo_type
);
2090 set_gdbarch_gdb_signal_from_target (gdbarch
, fbsd_gdb_signal_from_target
);
2091 set_gdbarch_gdb_signal_to_target (gdbarch
, fbsd_gdb_signal_to_target
);
2093 /* `catch syscall' */
2094 set_xml_syscall_file_name (gdbarch
, "syscalls/freebsd.xml");
2095 set_gdbarch_get_syscall_number (gdbarch
, fbsd_get_syscall_number
);
2099 _initialize_fbsd_tdep (void)
2101 fbsd_gdbarch_data_handle
=
2102 gdbarch_data_register_post_init (init_fbsd_gdbarch_data
);
2103 fbsd_pspace_data_handle
2104 = register_program_space_data_with_cleanup (NULL
, fbsd_pspace_data_cleanup
);