1 /* Target-dependent code for FreeBSD, architecture-independent.
3 Copyright (C) 2002-2015 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/>. */
25 #include "gdbthread.h"
28 #include "fbsd-tdep.h"
32 find_signalled_thread (struct thread_info
*info
, void *data
)
34 if (info
->suspend
.stop_signal
!= GDB_SIGNAL_0
35 && ptid_get_pid (info
->ptid
) == ptid_get_pid (inferior_ptid
))
41 static enum gdb_signal
42 find_stop_signal (void)
44 struct thread_info
*info
=
45 iterate_over_threads (find_signalled_thread
, NULL
);
48 return info
->suspend
.stop_signal
;
53 struct fbsd_collect_regset_section_cb_data
55 const struct regcache
*regcache
;
62 fbsd_collect_regset_section_cb (const char *sect_name
, int size
,
63 const struct regset
*regset
,
64 const char *human_name
, void *cb_data
)
67 struct fbsd_collect_regset_section_cb_data
*data
= cb_data
;
69 gdb_assert (regset
->collect_regset
);
72 regset
->collect_regset (regset
, data
->regcache
, -1, buf
, size
);
74 /* PRSTATUS still needs to be treated specially. */
75 if (strcmp (sect_name
, ".reg") == 0)
76 data
->note_data
= (char *) elfcore_write_prstatus
77 (data
->obfd
, data
->note_data
, data
->note_size
,
78 ptid_get_pid (inferior_ptid
), find_stop_signal (), buf
);
80 data
->note_data
= (char *) elfcore_write_register_note
81 (data
->obfd
, data
->note_data
, data
->note_size
,
82 sect_name
, buf
, size
);
86 /* Create appropriate note sections for a corefile, returning them in
90 fbsd_make_corefile_notes (struct gdbarch
*gdbarch
, bfd
*obfd
, int *note_size
)
92 struct regcache
*regcache
= get_current_regcache ();
94 Elf_Internal_Ehdr
*i_ehdrp
;
95 struct fbsd_collect_regset_section_cb_data data
;
97 /* Put a "FreeBSD" label in the ELF header. */
98 i_ehdrp
= elf_elfheader (obfd
);
99 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_FREEBSD
;
101 gdb_assert (gdbarch_iterate_over_regset_sections_p (gdbarch
));
103 data
.regcache
= regcache
;
105 data
.note_data
= NULL
;
106 data
.note_size
= note_size
;
107 target_fetch_registers (regcache
, -1);
108 gdbarch_iterate_over_regset_sections (gdbarch
,
109 fbsd_collect_regset_section_cb
,
111 note_data
= data
.note_data
;
113 if (get_exec_file (0))
115 const char *fname
= lbasename (get_exec_file (0));
116 char *psargs
= xstrdup (fname
);
118 if (get_inferior_args ())
119 psargs
= reconcat (psargs
, psargs
, " ", get_inferior_args (),
122 note_data
= elfcore_write_prpsinfo (obfd
, note_data
, note_size
,
129 /* To be called from GDB_OSABI_FREEBSD_ELF handlers. */
132 fbsd_init_abi (struct gdbarch_info info
, struct gdbarch
*gdbarch
)
134 set_gdbarch_make_corefile_notes (gdbarch
, fbsd_make_corefile_notes
);