gdb/fbsd-tdep.c - gdb
Data types defined
Functions defined
Source code
- #include "defs.h"
- #include "gdbcore.h"
- #include "inferior.h"
- #include "regcache.h"
- #include "regset.h"
- #include "gdbthread.h"
- #include "elf-bfd.h"
- #include "fbsd-tdep.h"
- static int
- find_signalled_thread (struct thread_info *info, void *data)
- {
- if (info->suspend.stop_signal != GDB_SIGNAL_0
- && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid))
- return 1;
- return 0;
- }
- static enum gdb_signal
- find_stop_signal (void)
- {
- struct thread_info *info =
- iterate_over_threads (find_signalled_thread, NULL);
- if (info)
- return info->suspend.stop_signal;
- else
- return GDB_SIGNAL_0;
- }
- struct fbsd_collect_regset_section_cb_data
- {
- const struct regcache *regcache;
- bfd *obfd;
- char *note_data;
- int *note_size;
- };
- static void
- fbsd_collect_regset_section_cb (const char *sect_name, int size,
- const struct regset *regset,
- const char *human_name, void *cb_data)
- {
- char *buf;
- struct fbsd_collect_regset_section_cb_data *data = cb_data;
- gdb_assert (regset->collect_regset);
- buf = xmalloc (size);
- regset->collect_regset (regset, data->regcache, -1, buf, size);
-
- if (strcmp (sect_name, ".reg") == 0)
- data->note_data = (char *) elfcore_write_prstatus
- (data->obfd, data->note_data, data->note_size,
- ptid_get_pid (inferior_ptid), find_stop_signal (), buf);
- else
- data->note_data = (char *) elfcore_write_register_note
- (data->obfd, data->note_data, data->note_size,
- sect_name, buf, size);
- xfree (buf);
- }
- static char *
- fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
- {
- const struct regcache *regcache = get_current_regcache ();
- char *note_data;
- Elf_Internal_Ehdr *i_ehdrp;
- struct fbsd_collect_regset_section_cb_data data;
-
- i_ehdrp = elf_elfheader (obfd);
- i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
- gdb_assert (gdbarch_iterate_over_regset_sections_p (gdbarch));
- data.regcache = regcache;
- data.obfd = obfd;
- data.note_data = NULL;
- data.note_size = note_size;
- gdbarch_iterate_over_regset_sections (gdbarch,
- fbsd_collect_regset_section_cb,
- &data, regcache);
- note_data = data.note_data;
- if (get_exec_file (0))
- {
- const char *fname = lbasename (get_exec_file (0));
- char *psargs = xstrdup (fname);
- if (get_inferior_args ())
- psargs = reconcat (psargs, psargs, " ", get_inferior_args (),
- (char *) NULL);
- note_data = elfcore_write_prpsinfo (obfd, note_data, note_size,
- fname, psargs);
- }
- return note_data;
- }
- void
- fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
- {
- set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
- }