1 /* Target-dependent code for FreeBSD, architecture-independent.
3 Copyright (C) 2002-2018 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"
27 #include "xml-syscall.h"
30 #include "fbsd-tdep.h"
33 /* FreeBSD kernels 12.0 and later include a copy of the
34 'ptrace_lwpinfo' structure returned by the PT_LWPINFO ptrace
35 operation in an ELF core note (NT_FREEBSD_PTLWPINFO) for each LWP.
36 The constants below define the offset of field members and flags in
37 this structure used by methods in this file. Note that the
38 'ptrace_lwpinfo' struct in the note is preceded by a 4 byte integer
39 containing the size of the structure. */
41 #define LWPINFO_OFFSET 0x4
43 /* Offsets in ptrace_lwpinfo. */
44 #define LWPINFO_PL_FLAGS 0x8
45 #define LWPINFO64_PL_SIGINFO 0x30
46 #define LWPINFO32_PL_SIGINFO 0x2c
48 /* Flags in pl_flags. */
49 #define PL_FLAG_SI 0x20 /* siginfo is valid */
51 /* Sizes of siginfo_t. */
52 #define SIZE64_SIGINFO_T 80
53 #define SIZE32_SIGINFO_T 64
55 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_VMMAP core
56 dump notes. See <sys/user.h> for the definition of struct
57 kinfo_vmentry. This data structure should have the same layout on
60 #define KVE_STRUCTSIZE 0x0
63 #define KVE_OFFSET 0x18
64 #define KVE_FLAGS 0x2c
65 #define KVE_PROTECTION 0x38
68 /* Flags in the 'kve_protection' field in struct kinfo_vmentry. These
69 match the KVME_PROT_* constants in <sys/user.h>. */
71 #define KINFO_VME_PROT_READ 0x00000001
72 #define KINFO_VME_PROT_WRITE 0x00000002
73 #define KINFO_VME_PROT_EXEC 0x00000004
75 /* Flags in the 'kve_flags' field in struct kinfo_vmentry. These
76 match the KVME_FLAG_* constants in <sys/user.h>. */
78 #define KINFO_VME_FLAG_COW 0x00000001
79 #define KINFO_VME_FLAG_NEEDS_COPY 0x00000002
80 #define KINFO_VME_FLAG_NOCOREDUMP 0x00000004
81 #define KINFO_VME_FLAG_SUPER 0x00000008
82 #define KINFO_VME_FLAG_GROWS_UP 0x00000010
83 #define KINFO_VME_FLAG_GROWS_DOWN 0x00000020
85 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_FILES core
86 dump notes. See <sys/user.h> for the definition of struct
87 kinfo_file. This data structure should have the same layout on all
90 #define KF_STRUCTSIZE 0x0
95 /* Constants for the 'kf_type' field in struct kinfo_file. These
96 match the KF_TYPE_* constants in <sys/user.h>. */
98 #define KINFO_FILE_TYPE_VNODE 1
100 /* Special values for the 'kf_fd' field in struct kinfo_file. These
101 match the KF_FD_TYPE_* constants in <sys/user.h>. */
103 #define KINFO_FILE_FD_TYPE_CWD -1
104 #define KINFO_FILE_FD_TYPE_TEXT -5
106 /* Number of 32-bit words in a signal set. This matches _SIG_WORDS in
107 <sys/_sigset.h> and is the same value on all architectures. */
111 /* Offsets in data structure used in NT_FREEBSD_PROCSTAT_PROC core
112 dump notes. See <sys/user.h> for the definition of struct
113 kinfo_proc. This data structure has different layouts on different
114 architectures mostly due to ILP32 vs LP64. However, FreeBSD/i386
115 uses a 32-bit time_t while all other architectures use a 64-bit
118 The core dump note actually contains one kinfo_proc structure for
119 each thread, but all of the process-wide data can be obtained from
120 the first structure. One result of this note's format is that some
121 of the process-wide status available in the native target method
122 from the kern.proc.pid.<pid> sysctl such as ki_stat and ki_siglist
123 is not available from a core dump. Instead, the per-thread data
124 structures contain the value of these fields for individual
127 struct kinfo_proc_layout
129 /* Offsets of struct kinfo_proc members. */
136 int ki_tdev_freebsd11
;
158 /* Offsets of struct rusage members. */
166 const struct kinfo_proc_layout kinfo_proc_layout_32
=
174 .ki_tdev_freebsd11
= 0x44,
175 .ki_sigignore
= 0x68,
194 .ki_rusage_ch
= 0x278,
203 const struct kinfo_proc_layout kinfo_proc_layout_i386
=
211 .ki_tdev_freebsd11
= 0x44,
212 .ki_sigignore
= 0x68,
231 .ki_rusage_ch
= 0x258,
240 const struct kinfo_proc_layout kinfo_proc_layout_64
=
248 .ki_tdev_freebsd11
= 0x64,
249 .ki_sigignore
= 0x88,
268 .ki_rusage_ch
= 0x2f0,
277 static struct gdbarch_data
*fbsd_gdbarch_data_handle
;
279 struct fbsd_gdbarch_data
281 struct type
*siginfo_type
;
285 init_fbsd_gdbarch_data (struct gdbarch
*gdbarch
)
287 return GDBARCH_OBSTACK_ZALLOC (gdbarch
, struct fbsd_gdbarch_data
);
290 static struct fbsd_gdbarch_data
*
291 get_fbsd_gdbarch_data (struct gdbarch
*gdbarch
)
293 return ((struct fbsd_gdbarch_data
*)
294 gdbarch_data (gdbarch
, fbsd_gdbarch_data_handle
));
297 /* This is how we want PTIDs from core files to be printed. */
300 fbsd_core_pid_to_str (struct gdbarch
*gdbarch
, ptid_t ptid
)
304 if (ptid_get_lwp (ptid
) != 0)
306 xsnprintf (buf
, sizeof buf
, "LWP %ld", ptid_get_lwp (ptid
));
310 return normal_pid_to_str (ptid
);
313 /* Extract the name assigned to a thread from a core. Returns the
314 string in a static buffer. */
317 fbsd_core_thread_name (struct gdbarch
*gdbarch
, struct thread_info
*thr
)
320 struct bfd_section
*section
;
323 if (ptid_get_lwp (thr
->ptid
) != 0)
325 /* FreeBSD includes a NT_FREEBSD_THRMISC note for each thread
326 whose contents are defined by a "struct thrmisc" declared in
327 <sys/procfs.h> on FreeBSD. The per-thread name is stored as
328 a null-terminated string as the first member of the
329 structure. Rather than define the full structure here, just
330 extract the null-terminated name from the start of the
332 thread_section_name
section_name (".thrmisc", thr
->ptid
);
334 section
= bfd_get_section_by_name (core_bfd
, section_name
.c_str ());
335 if (section
!= NULL
&& bfd_section_size (core_bfd
, section
) > 0)
337 /* Truncate the name if it is longer than "buf". */
338 size
= bfd_section_size (core_bfd
, section
);
339 if (size
> sizeof buf
- 1)
340 size
= sizeof buf
- 1;
341 if (bfd_get_section_contents (core_bfd
, section
, buf
, (file_ptr
) 0,
347 /* Note that each thread will report the process command
348 as its thread name instead of an empty name if a name
349 has not been set explicitly. Return a NULL name in
351 if (strcmp (buf
, elf_tdata (core_bfd
)->core
->program
) != 0)
360 /* Implement the "core_xfer_siginfo" gdbarch method. */
363 fbsd_core_xfer_siginfo (struct gdbarch
*gdbarch
, gdb_byte
*readbuf
,
364 ULONGEST offset
, ULONGEST len
)
368 if (gdbarch_long_bit (gdbarch
) == 32)
369 siginfo_size
= SIZE32_SIGINFO_T
;
371 siginfo_size
= SIZE64_SIGINFO_T
;
372 if (offset
> siginfo_size
)
375 thread_section_name
section_name (".note.freebsdcore.lwpinfo", inferior_ptid
);
376 asection
*section
= bfd_get_section_by_name (core_bfd
, section_name
.c_str ());
381 if (!bfd_get_section_contents (core_bfd
, section
, buf
,
382 LWPINFO_OFFSET
+ LWPINFO_PL_FLAGS
, 4))
385 int pl_flags
= extract_signed_integer (buf
, 4, gdbarch_byte_order (gdbarch
));
386 if (!(pl_flags
& PL_FLAG_SI
))
389 if (offset
+ len
> siginfo_size
)
390 len
= siginfo_size
- offset
;
392 ULONGEST siginfo_offset
;
393 if (gdbarch_long_bit (gdbarch
) == 32)
394 siginfo_offset
= LWPINFO_OFFSET
+ LWPINFO32_PL_SIGINFO
;
396 siginfo_offset
= LWPINFO_OFFSET
+ LWPINFO64_PL_SIGINFO
;
398 if (!bfd_get_section_contents (core_bfd
, section
, readbuf
,
399 siginfo_offset
+ offset
, len
))
406 find_signalled_thread (struct thread_info
*info
, void *data
)
408 if (info
->suspend
.stop_signal
!= GDB_SIGNAL_0
409 && info
->ptid
.pid () == inferior_ptid
.pid ())
415 /* Structure for passing information from
416 fbsd_collect_thread_registers via an iterator to
417 fbsd_collect_regset_section_cb. */
419 struct fbsd_collect_regset_section_cb_data
421 const struct regcache
*regcache
;
426 enum gdb_signal stop_signal
;
431 fbsd_collect_regset_section_cb (const char *sect_name
, int size
,
432 const struct regset
*regset
,
433 const char *human_name
, void *cb_data
)
436 struct fbsd_collect_regset_section_cb_data
*data
437 = (struct fbsd_collect_regset_section_cb_data
*) cb_data
;
439 if (data
->abort_iteration
)
442 gdb_assert (regset
->collect_regset
);
444 buf
= (char *) xmalloc (size
);
445 regset
->collect_regset (regset
, data
->regcache
, -1, buf
, size
);
447 /* PRSTATUS still needs to be treated specially. */
448 if (strcmp (sect_name
, ".reg") == 0)
449 data
->note_data
= (char *) elfcore_write_prstatus
450 (data
->obfd
, data
->note_data
, data
->note_size
, data
->lwp
,
451 gdb_signal_to_host (data
->stop_signal
), buf
);
453 data
->note_data
= (char *) elfcore_write_register_note
454 (data
->obfd
, data
->note_data
, data
->note_size
,
455 sect_name
, buf
, size
);
458 if (data
->note_data
== NULL
)
459 data
->abort_iteration
= 1;
462 /* Records the thread's register state for the corefile note
466 fbsd_collect_thread_registers (const struct regcache
*regcache
,
467 ptid_t ptid
, bfd
*obfd
,
468 char *note_data
, int *note_size
,
469 enum gdb_signal stop_signal
)
471 struct gdbarch
*gdbarch
= regcache
->arch ();
472 struct fbsd_collect_regset_section_cb_data data
;
474 data
.regcache
= regcache
;
476 data
.note_data
= note_data
;
477 data
.note_size
= note_size
;
478 data
.stop_signal
= stop_signal
;
479 data
.abort_iteration
= 0;
480 data
.lwp
= ptid_get_lwp (ptid
);
482 gdbarch_iterate_over_regset_sections (gdbarch
,
483 fbsd_collect_regset_section_cb
,
485 return data
.note_data
;
488 struct fbsd_corefile_thread_data
490 struct gdbarch
*gdbarch
;
494 enum gdb_signal stop_signal
;
497 /* Records the thread's register state for the corefile note
501 fbsd_corefile_thread (struct thread_info
*info
,
502 struct fbsd_corefile_thread_data
*args
)
504 struct regcache
*regcache
;
506 regcache
= get_thread_arch_regcache (info
->ptid
, args
->gdbarch
);
508 target_fetch_registers (regcache
, -1);
510 args
->note_data
= fbsd_collect_thread_registers
511 (regcache
, info
->ptid
, args
->obfd
, args
->note_data
,
512 args
->note_size
, args
->stop_signal
);
515 /* Create appropriate note sections for a corefile, returning them in
519 fbsd_make_corefile_notes (struct gdbarch
*gdbarch
, bfd
*obfd
, int *note_size
)
521 struct fbsd_corefile_thread_data thread_args
;
522 char *note_data
= NULL
;
523 Elf_Internal_Ehdr
*i_ehdrp
;
524 struct thread_info
*curr_thr
, *signalled_thr
, *thr
;
526 /* Put a "FreeBSD" label in the ELF header. */
527 i_ehdrp
= elf_elfheader (obfd
);
528 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_FREEBSD
;
530 gdb_assert (gdbarch_iterate_over_regset_sections_p (gdbarch
));
532 if (get_exec_file (0))
534 const char *fname
= lbasename (get_exec_file (0));
535 char *psargs
= xstrdup (fname
);
537 if (get_inferior_args ())
538 psargs
= reconcat (psargs
, psargs
, " ", get_inferior_args (),
541 note_data
= elfcore_write_prpsinfo (obfd
, note_data
, note_size
,
545 /* Thread register information. */
548 update_thread_list ();
550 CATCH (e
, RETURN_MASK_ERROR
)
552 exception_print (gdb_stderr
, e
);
556 /* Like the kernel, prefer dumping the signalled thread first.
557 "First thread" is what tools use to infer the signalled thread.
558 In case there's more than one signalled thread, prefer the
559 current thread, if it is signalled. */
560 curr_thr
= inferior_thread ();
561 if (curr_thr
->suspend
.stop_signal
!= GDB_SIGNAL_0
)
562 signalled_thr
= curr_thr
;
565 signalled_thr
= iterate_over_threads (find_signalled_thread
, NULL
);
566 if (signalled_thr
== NULL
)
567 signalled_thr
= curr_thr
;
570 thread_args
.gdbarch
= gdbarch
;
571 thread_args
.obfd
= obfd
;
572 thread_args
.note_data
= note_data
;
573 thread_args
.note_size
= note_size
;
574 thread_args
.stop_signal
= signalled_thr
->suspend
.stop_signal
;
576 fbsd_corefile_thread (signalled_thr
, &thread_args
);
577 ALL_NON_EXITED_THREADS (thr
)
579 if (thr
== signalled_thr
)
581 if (thr
->ptid
.pid () != inferior_ptid
.pid ())
584 fbsd_corefile_thread (thr
, &thread_args
);
587 note_data
= thread_args
.note_data
;
592 /* Helper function to generate mappings flags for a single VM map
593 entry in 'info proc mappings'. */
596 fbsd_vm_map_entry_flags (int kve_flags
, int kve_protection
)
598 static char vm_flags
[9];
600 vm_flags
[0] = (kve_protection
& KINFO_VME_PROT_READ
) ? 'r' : '-';
601 vm_flags
[1] = (kve_protection
& KINFO_VME_PROT_WRITE
) ? 'w' : '-';
602 vm_flags
[2] = (kve_protection
& KINFO_VME_PROT_EXEC
) ? 'x' : '-';
604 vm_flags
[4] = (kve_flags
& KINFO_VME_FLAG_COW
) ? 'C' : '-';
605 vm_flags
[5] = (kve_flags
& KINFO_VME_FLAG_NEEDS_COPY
) ? 'N' : '-';
606 vm_flags
[6] = (kve_flags
& KINFO_VME_FLAG_SUPER
) ? 'S' : '-';
607 vm_flags
[7] = (kve_flags
& KINFO_VME_FLAG_GROWS_UP
) ? 'U'
608 : (kve_flags
& KINFO_VME_FLAG_GROWS_DOWN
) ? 'D' : '-';
614 /* Implement "info proc mappings" for a corefile. */
617 fbsd_core_info_proc_mappings (struct gdbarch
*gdbarch
)
620 unsigned char *descdata
, *descend
;
623 section
= bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.vmmap");
626 warning (_("unable to find mappings in core file"));
630 note_size
= bfd_get_section_size (section
);
632 error (_("malformed core note - too short for header"));
634 gdb::def_vector
<unsigned char> contents (note_size
);
635 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
637 error (_("could not get core note contents"));
639 descdata
= contents
.data ();
640 descend
= descdata
+ note_size
;
642 /* Skip over the structure size. */
645 printf_filtered (_("Mapped address spaces:\n\n"));
646 if (gdbarch_addr_bit (gdbarch
) == 64)
648 printf_filtered (" %18s %18s %10s %10s %9s %s\n",
651 " Size", " Offset", "Flags ", "File");
655 printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
658 " Size", " Offset", "Flags ", "File");
661 while (descdata
+ KVE_PATH
< descend
)
663 ULONGEST start
, end
, offset
, flags
, prot
, structsize
;
665 structsize
= bfd_get_32 (core_bfd
, descdata
+ KVE_STRUCTSIZE
);
666 if (structsize
< KVE_PATH
)
667 error (_("malformed core note - vmmap entry too small"));
669 start
= bfd_get_64 (core_bfd
, descdata
+ KVE_START
);
670 end
= bfd_get_64 (core_bfd
, descdata
+ KVE_END
);
671 offset
= bfd_get_64 (core_bfd
, descdata
+ KVE_OFFSET
);
672 flags
= bfd_get_32 (core_bfd
, descdata
+ KVE_FLAGS
);
673 prot
= bfd_get_32 (core_bfd
, descdata
+ KVE_PROTECTION
);
674 if (gdbarch_addr_bit (gdbarch
) == 64)
676 printf_filtered (" %18s %18s %10s %10s %9s %s\n",
677 paddress (gdbarch
, start
),
678 paddress (gdbarch
, end
),
679 hex_string (end
- start
),
681 fbsd_vm_map_entry_flags (flags
, prot
),
682 descdata
+ KVE_PATH
);
686 printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
687 paddress (gdbarch
, start
),
688 paddress (gdbarch
, end
),
689 hex_string (end
- start
),
691 fbsd_vm_map_entry_flags (flags
, prot
),
692 descdata
+ KVE_PATH
);
695 descdata
+= structsize
;
699 /* Fetch the pathname of a vnode for a single file descriptor from the
700 file table core note. */
702 static gdb::unique_xmalloc_ptr
<char>
703 fbsd_core_vnode_path (struct gdbarch
*gdbarch
, int fd
)
706 unsigned char *descdata
, *descend
;
709 section
= bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.files");
713 note_size
= bfd_get_section_size (section
);
715 error (_("malformed core note - too short for header"));
717 gdb::def_vector
<unsigned char> contents (note_size
);
718 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
720 error (_("could not get core note contents"));
722 descdata
= contents
.data ();
723 descend
= descdata
+ note_size
;
725 /* Skip over the structure size. */
728 while (descdata
+ KVE_PATH
< descend
)
732 structsize
= bfd_get_32 (core_bfd
, descdata
+ KF_STRUCTSIZE
);
733 if (structsize
< KVE_PATH
)
734 error (_("malformed core note - vmmap entry too small"));
736 if (bfd_get_32 (core_bfd
, descdata
+ KF_TYPE
) == KINFO_FILE_TYPE_VNODE
737 && bfd_get_signed_32 (core_bfd
, descdata
+ KF_FD
) == fd
)
739 char *path
= (char *) descdata
+ KF_PATH
;
740 return gdb::unique_xmalloc_ptr
<char> (xstrdup (path
));
743 descdata
+= structsize
;
748 /* Helper function to read a struct timeval. */
751 fbsd_core_fetch_timeval (struct gdbarch
*gdbarch
, unsigned char *data
,
752 LONGEST
&sec
, ULONGEST
&usec
)
754 if (gdbarch_addr_bit (gdbarch
) == 64)
756 sec
= bfd_get_signed_64 (core_bfd
, data
);
757 usec
= bfd_get_64 (core_bfd
, data
+ 8);
759 else if (bfd_get_arch (core_bfd
) == bfd_arch_i386
)
761 sec
= bfd_get_signed_32 (core_bfd
, data
);
762 usec
= bfd_get_32 (core_bfd
, data
+ 4);
766 sec
= bfd_get_signed_64 (core_bfd
, data
);
767 usec
= bfd_get_32 (core_bfd
, data
+ 8);
771 /* Print out the contents of a signal set. */
774 fbsd_print_sigset (const char *descr
, unsigned char *sigset
)
776 printf_filtered ("%s: ", descr
);
777 for (int i
= 0; i
< SIG_WORDS
; i
++)
778 printf_filtered ("%08x ",
779 (unsigned int) bfd_get_32 (core_bfd
, sigset
+ i
* 4));
780 printf_filtered ("\n");
783 /* Implement "info proc status" for a corefile. */
786 fbsd_core_info_proc_status (struct gdbarch
*gdbarch
)
788 const struct kinfo_proc_layout
*kp
;
791 unsigned char *descdata
;
792 int addr_bit
, long_bit
;
797 section
= bfd_get_section_by_name (core_bfd
, ".note.freebsdcore.proc");
800 warning (_("unable to find process info in core file"));
804 addr_bit
= gdbarch_addr_bit (gdbarch
);
806 kp
= &kinfo_proc_layout_64
;
807 else if (bfd_get_arch (core_bfd
) == bfd_arch_i386
)
808 kp
= &kinfo_proc_layout_i386
;
810 kp
= &kinfo_proc_layout_32
;
811 long_bit
= gdbarch_long_bit (gdbarch
);
814 * Ensure that the note is large enough for all of the fields fetched
815 * by this function. In particular, the note must contain the 32-bit
816 * structure size, then it must be long enough to access the last
817 * field used (ki_rusage_ch.ru_majflt) which is the size of a long.
819 note_size
= bfd_get_section_size (section
);
820 if (note_size
< (4 + kp
->ki_rusage_ch
+ kp
->ru_majflt
821 + long_bit
/ TARGET_CHAR_BIT
))
822 error (_("malformed core note - too short"));
824 gdb::def_vector
<unsigned char> contents (note_size
);
825 if (!bfd_get_section_contents (core_bfd
, section
, contents
.data (),
827 error (_("could not get core note contents"));
829 descdata
= contents
.data ();
831 /* Skip over the structure size. */
834 /* Verify 'ki_layout' is 0. */
835 if (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_layout
) != 0)
837 warning (_("unsupported process information in core file"));
841 printf_filtered ("Name: %.19s\n", descdata
+ kp
->ki_comm
);
842 printf_filtered ("Process ID: %s\n",
843 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_pid
)));
844 printf_filtered ("Parent process: %s\n",
845 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_ppid
)));
846 printf_filtered ("Process group: %s\n",
847 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_pgid
)));
848 printf_filtered ("Session id: %s\n",
849 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_sid
)));
851 /* FreeBSD 12.0 and later store a 64-bit dev_t at 'ki_tdev'. Older
852 kernels store a 32-bit dev_t at 'ki_tdev_freebsd11'. In older
853 kernels the 64-bit 'ki_tdev' field is in a reserved section of
854 the structure that is cleared to zero. Assume that a zero value
855 in ki_tdev indicates a core dump from an older kernel and use the
856 value in 'ki_tdev_freebsd11' instead. */
857 value
= bfd_get_64 (core_bfd
, descdata
+ kp
->ki_tdev
);
859 value
= bfd_get_32 (core_bfd
, descdata
+ kp
->ki_tdev_freebsd11
);
860 printf_filtered ("TTY: %s\n", pulongest (value
));
861 printf_filtered ("TTY owner process group: %s\n",
862 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_tpgid
)));
863 printf_filtered ("User IDs (real, effective, saved): %s %s %s\n",
864 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_ruid
)),
865 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_uid
)),
866 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_svuid
)));
867 printf_filtered ("Group IDs (real, effective, saved): %s %s %s\n",
868 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_rgid
)),
869 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_groups
)),
870 pulongest (bfd_get_32 (core_bfd
, descdata
+ kp
->ki_svgid
)));
871 printf_filtered ("Groups: ");
872 uint16_t ngroups
= bfd_get_16 (core_bfd
, descdata
+ kp
->ki_ngroups
);
873 for (int i
= 0; i
< ngroups
; i
++)
874 printf_filtered ("%s ",
875 pulongest (bfd_get_32 (core_bfd
,
876 descdata
+ kp
->ki_groups
+ i
* 4)));
877 printf_filtered ("\n");
878 value
= bfd_get (long_bit
, core_bfd
,
879 descdata
+ kp
->ki_rusage
+ kp
->ru_minflt
);
880 printf_filtered ("Minor faults (no memory page): %s\n", pulongest (value
));
881 value
= bfd_get (long_bit
, core_bfd
,
882 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_minflt
);
883 printf_filtered ("Minor faults, children: %s\n", pulongest (value
));
884 value
= bfd_get (long_bit
, core_bfd
,
885 descdata
+ kp
->ki_rusage
+ kp
->ru_majflt
);
886 printf_filtered ("Major faults (memory page faults): %s\n",
888 value
= bfd_get (long_bit
, core_bfd
,
889 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_majflt
);
890 printf_filtered ("Major faults, children: %s\n", pulongest (value
));
891 fbsd_core_fetch_timeval (gdbarch
,
892 descdata
+ kp
->ki_rusage
+ kp
->ru_utime
,
894 printf_filtered ("utime: %s.%06d\n", plongest (sec
), (int) value
);
895 fbsd_core_fetch_timeval (gdbarch
,
896 descdata
+ kp
->ki_rusage
+ kp
->ru_stime
,
898 printf_filtered ("stime: %s.%06d\n", plongest (sec
), (int) value
);
899 fbsd_core_fetch_timeval (gdbarch
,
900 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_utime
,
902 printf_filtered ("utime, children: %s.%06d\n", plongest (sec
), (int) value
);
903 fbsd_core_fetch_timeval (gdbarch
,
904 descdata
+ kp
->ki_rusage_ch
+ kp
->ru_stime
,
906 printf_filtered ("stime, children: %s.%06d\n", plongest (sec
), (int) value
);
907 printf_filtered ("'nice' value: %d\n",
908 bfd_get_signed_8 (core_bfd
, descdata
+ kp
->ki_nice
));
909 fbsd_core_fetch_timeval (gdbarch
, descdata
+ kp
->ki_start
, sec
, value
);
910 printf_filtered ("Start time: %s.%06d\n", plongest (sec
), (int) value
);
911 printf_filtered ("Virtual memory size: %s kB\n",
912 pulongest (bfd_get (addr_bit
, core_bfd
,
913 descdata
+ kp
->ki_size
) / 1024));
914 printf_filtered ("Data size: %s pages\n",
915 pulongest (bfd_get (addr_bit
, core_bfd
,
916 descdata
+ kp
->ki_dsize
)));
917 printf_filtered ("Stack size: %s pages\n",
918 pulongest (bfd_get (addr_bit
, core_bfd
,
919 descdata
+ kp
->ki_ssize
)));
920 printf_filtered ("Text size: %s pages\n",
921 pulongest (bfd_get (addr_bit
, core_bfd
,
922 descdata
+ kp
->ki_tsize
)));
923 printf_filtered ("Resident set size: %s pages\n",
924 pulongest (bfd_get (addr_bit
, core_bfd
,
925 descdata
+ kp
->ki_rssize
)));
926 printf_filtered ("Maximum RSS: %s pages\n",
927 pulongest (bfd_get (long_bit
, core_bfd
,
928 descdata
+ kp
->ki_rusage
930 fbsd_print_sigset ("Ignored Signals", descdata
+ kp
->ki_sigignore
);
931 fbsd_print_sigset ("Caught Signals", descdata
+ kp
->ki_sigcatch
);
934 /* Implement the "core_info_proc" gdbarch method. */
937 fbsd_core_info_proc (struct gdbarch
*gdbarch
, const char *args
,
938 enum info_proc_what what
)
940 bool do_cmdline
= false;
943 bool do_mappings
= false;
944 bool do_status
= false;
981 pid
= bfd_core_file_pid (core_bfd
);
983 printf_filtered (_("process %d\n"), pid
);
989 cmdline
= bfd_core_file_failing_command (core_bfd
);
991 printf_filtered ("cmdline = '%s'\n", cmdline
);
993 warning (_("Command line unavailable"));
997 gdb::unique_xmalloc_ptr
<char> cwd
=
998 fbsd_core_vnode_path (gdbarch
, KINFO_FILE_FD_TYPE_CWD
);
1000 printf_filtered ("cwd = '%s'\n", cwd
.get ());
1002 warning (_("unable to read current working directory"));
1006 gdb::unique_xmalloc_ptr
<char> exe
=
1007 fbsd_core_vnode_path (gdbarch
, KINFO_FILE_FD_TYPE_TEXT
);
1009 printf_filtered ("exe = '%s'\n", exe
.get ());
1011 warning (_("unable to read executable path name"));
1014 fbsd_core_info_proc_mappings (gdbarch
);
1016 fbsd_core_info_proc_status (gdbarch
);
1019 /* Print descriptions of FreeBSD-specific AUXV entries to FILE. */
1022 fbsd_print_auxv_entry (struct gdbarch
*gdbarch
, struct ui_file
*file
,
1023 CORE_ADDR type
, CORE_ADDR val
)
1026 const char *description
;
1027 enum auxv_format format
;
1031 #define _TAGNAME(tag) #tag
1032 #define TAGNAME(tag) _TAGNAME(AT_##tag)
1033 #define TAG(tag, text, kind) \
1034 case AT_FREEBSD_##tag: name = TAGNAME(tag); description = text; format = kind; break
1035 TAG (EXECPATH
, _("Executable path"), AUXV_FORMAT_STR
);
1036 TAG (CANARY
, _("Canary for SSP"), AUXV_FORMAT_HEX
);
1037 TAG (CANARYLEN
, ("Length of the SSP canary"), AUXV_FORMAT_DEC
);
1038 TAG (OSRELDATE
, _("OSRELDATE"), AUXV_FORMAT_DEC
);
1039 TAG (NCPUS
, _("Number of CPUs"), AUXV_FORMAT_DEC
);
1040 TAG (PAGESIZES
, _("Pagesizes"), AUXV_FORMAT_HEX
);
1041 TAG (PAGESIZESLEN
, _("Number of pagesizes"), AUXV_FORMAT_DEC
);
1042 TAG (TIMEKEEP
, _("Pointer to timehands"), AUXV_FORMAT_HEX
);
1043 TAG (STACKPROT
, _("Initial stack protection"), AUXV_FORMAT_HEX
);
1044 TAG (EHDRFLAGS
, _("ELF header e_flags"), AUXV_FORMAT_HEX
);
1045 TAG (HWCAP
, _("Machine-dependent CPU capability hints"), AUXV_FORMAT_HEX
);
1047 default_print_auxv_entry (gdbarch
, file
, type
, val
);
1051 fprint_auxv_entry (file
, name
, description
, format
, type
, val
);
1054 /* Implement the "get_siginfo_type" gdbarch method. */
1056 static struct type
*
1057 fbsd_get_siginfo_type (struct gdbarch
*gdbarch
)
1059 struct fbsd_gdbarch_data
*fbsd_gdbarch_data
;
1060 struct type
*int_type
, *int32_type
, *uint32_type
, *long_type
, *void_ptr_type
;
1061 struct type
*uid_type
, *pid_type
;
1062 struct type
*sigval_type
, *reason_type
;
1063 struct type
*siginfo_type
;
1066 fbsd_gdbarch_data
= get_fbsd_gdbarch_data (gdbarch
);
1067 if (fbsd_gdbarch_data
->siginfo_type
!= NULL
)
1068 return fbsd_gdbarch_data
->siginfo_type
;
1070 int_type
= arch_integer_type (gdbarch
, gdbarch_int_bit (gdbarch
),
1072 int32_type
= arch_integer_type (gdbarch
, 32, 0, "int32_t");
1073 uint32_type
= arch_integer_type (gdbarch
, 32, 1, "uint32_t");
1074 long_type
= arch_integer_type (gdbarch
, gdbarch_long_bit (gdbarch
),
1076 void_ptr_type
= lookup_pointer_type (builtin_type (gdbarch
)->builtin_void
);
1079 sigval_type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_UNION
);
1080 TYPE_NAME (sigval_type
) = xstrdup ("sigval");
1081 append_composite_type_field (sigval_type
, "sival_int", int_type
);
1082 append_composite_type_field (sigval_type
, "sival_ptr", void_ptr_type
);
1085 pid_type
= arch_type (gdbarch
, TYPE_CODE_TYPEDEF
,
1086 TYPE_LENGTH (int32_type
) * TARGET_CHAR_BIT
, "__pid_t");
1087 TYPE_TARGET_TYPE (pid_type
) = int32_type
;
1088 TYPE_TARGET_STUB (pid_type
) = 1;
1091 uid_type
= arch_type (gdbarch
, TYPE_CODE_TYPEDEF
,
1092 TYPE_LENGTH (uint32_type
) * TARGET_CHAR_BIT
,
1094 TYPE_TARGET_TYPE (uid_type
) = uint32_type
;
1095 TYPE_TARGET_STUB (uid_type
) = 1;
1098 reason_type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_UNION
);
1101 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1102 append_composite_type_field (type
, "si_trapno", int_type
);
1103 append_composite_type_field (reason_type
, "_fault", type
);
1106 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1107 append_composite_type_field (type
, "si_timerid", int_type
);
1108 append_composite_type_field (type
, "si_overrun", int_type
);
1109 append_composite_type_field (reason_type
, "_timer", type
);
1112 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1113 append_composite_type_field (type
, "si_mqd", int_type
);
1114 append_composite_type_field (reason_type
, "_mesgq", type
);
1117 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1118 append_composite_type_field (type
, "si_band", long_type
);
1119 append_composite_type_field (reason_type
, "_poll", type
);
1122 type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1123 append_composite_type_field (type
, "__spare1__", long_type
);
1124 append_composite_type_field (type
, "__spare2__",
1125 init_vector_type (int_type
, 7));
1126 append_composite_type_field (reason_type
, "__spare__", type
);
1128 /* struct siginfo */
1129 siginfo_type
= arch_composite_type (gdbarch
, NULL
, TYPE_CODE_STRUCT
);
1130 TYPE_NAME (siginfo_type
) = xstrdup ("siginfo");
1131 append_composite_type_field (siginfo_type
, "si_signo", int_type
);
1132 append_composite_type_field (siginfo_type
, "si_errno", int_type
);
1133 append_composite_type_field (siginfo_type
, "si_code", int_type
);
1134 append_composite_type_field (siginfo_type
, "si_pid", pid_type
);
1135 append_composite_type_field (siginfo_type
, "si_uid", uid_type
);
1136 append_composite_type_field (siginfo_type
, "si_status", int_type
);
1137 append_composite_type_field (siginfo_type
, "si_addr", void_ptr_type
);
1138 append_composite_type_field (siginfo_type
, "si_value", sigval_type
);
1139 append_composite_type_field (siginfo_type
, "_reason", reason_type
);
1141 fbsd_gdbarch_data
->siginfo_type
= siginfo_type
;
1143 return siginfo_type
;
1146 /* Implement the "get_syscall_number" gdbarch method. */
1149 fbsd_get_syscall_number (struct gdbarch
*gdbarch
, thread_info
*thread
)
1152 /* FreeBSD doesn't use gdbarch_get_syscall_number since FreeBSD
1153 native targets fetch the system call number from the
1154 'pl_syscall_code' member of struct ptrace_lwpinfo in fbsd_wait.
1155 However, system call catching requires this function to be
1158 internal_error (__FILE__
, __LINE__
, _("fbsd_get_sycall_number called"));
1161 /* To be called from GDB_OSABI_FREEBSD handlers. */
1164 fbsd_init_abi (struct gdbarch_info info
, struct gdbarch
*gdbarch
)
1166 set_gdbarch_core_pid_to_str (gdbarch
, fbsd_core_pid_to_str
);
1167 set_gdbarch_core_thread_name (gdbarch
, fbsd_core_thread_name
);
1168 set_gdbarch_core_xfer_siginfo (gdbarch
, fbsd_core_xfer_siginfo
);
1169 set_gdbarch_make_corefile_notes (gdbarch
, fbsd_make_corefile_notes
);
1170 set_gdbarch_core_info_proc (gdbarch
, fbsd_core_info_proc
);
1171 set_gdbarch_print_auxv_entry (gdbarch
, fbsd_print_auxv_entry
);
1172 set_gdbarch_get_siginfo_type (gdbarch
, fbsd_get_siginfo_type
);
1174 /* `catch syscall' */
1175 set_xml_syscall_file_name (gdbarch
, "syscalls/freebsd.xml");
1176 set_gdbarch_get_syscall_number (gdbarch
, fbsd_get_syscall_number
);
1180 _initialize_fbsd_tdep (void)
1182 fbsd_gdbarch_data_handle
=
1183 gdbarch_data_register_post_init (init_fbsd_gdbarch_data
);