public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andreas Arnez <arnez@linux.vnet.ibm.com>
To: gdb-patches@sourceware.org
Cc: Mark Kettenis <kettenis@gnu.org>
Subject: [PATCH 03/26] Add multi-arch capable 'fbsd_make_corefile_notes' variant
Date: Fri, 12 Sep 2014 15:40:00 -0000	[thread overview]
Message-ID: <1410536396-25524-4-git-send-email-arnez@linux.vnet.ibm.com> (raw)
In-Reply-To: <1410536396-25524-1-git-send-email-arnez@linux.vnet.ibm.com>

This creates a new version of the FreeBSD core file note generation
logic in the new target-dependent file "fbsd-tdep.c".  The new version
is mostly copied from "fbsd-nat.c", but uses the iterator instead of
regset_from_core_section and defines fbsd_make_corefile_notes as a
gdbarch method instead of a target method.

Consecutive architecture-dependent changes exploit the new version,
migrating away from the target method.  When all FreeBSD targets are
changed, the target method can go away.

gdb/ChangeLog:

	* fbsd-tdep.c: New file.
	* fbsd-tdep.h: New file.
	* Makefile.in (ALL_TARGET_OBS): Add fbsd-tdep.o.
	(HFILES_NO_SRCDIR): Add fbsd-tdep.h.
	(ALLDEPFILES): Add fbsd-tdep.c.
---
 gdb/Makefile.in |   4 +-
 gdb/fbsd-tdep.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/fbsd-tdep.h |  25 +++++++++++
 3 files changed, 165 insertions(+), 1 deletion(-)
 create mode 100644 gdb/fbsd-tdep.c
 create mode 100644 gdb/fbsd-tdep.h

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index f6b9176..409f5fa 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -625,6 +625,7 @@ ALL_TARGET_OBS = \
 	bfin-linux-tdep.o bfin-tdep.o \
 	cris-linux-tdep.o cris-tdep.o \
 	dicos-tdep.o \
+	fbsd-tdep.o \
 	frv-linux-tdep.o frv-tdep.o \
 	h8300-tdep.o \
 	hppabsd-tdep.o hppanbsd-tdep.o hppaobsd-tdep.o \
@@ -938,7 +939,7 @@ target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h \
 common/print-utils.h common/rsp-low.h nat/x86-dregs.h x86-linux-nat.h \
 i386-linux-nat.h common/common-defs.h common/errors.h common/common-types.h \
 common/common-debug.h common/cleanups.h common/gdb_setjmp.h \
-common/common-exceptions.h target/target.h common/symbol.h
+common/common-exceptions.h target/target.h common/symbol.h fbsd-tdep.h
 
 # Header files that already have srcdir in them, or which are in objdir.
 
@@ -1621,6 +1622,7 @@ ALLDEPFILES = \
 	dcache.c dicos-tdep.c darwin-nat.c \
 	exec.c \
 	fbsd-nat.c \
+	fbsd-tdep.c \
 	fork-child.c \
 	glibc-tdep.c \
 	go32-nat.c h8300-tdep.c \
diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c
new file mode 100644
index 0000000..a60fbc2
--- /dev/null
+++ b/gdb/fbsd-tdep.c
@@ -0,0 +1,137 @@
+/* Target-dependent code for FreeBSD, architecture-independent.
+
+   Copyright (C) 2002-2014 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "gdbcore.h"
+#include "inferior.h"
+#include "regcache.h"
+#include "regset.h"
+#include "gdbthread.h"
+
+#include "gdb_assert.h"
+#include <string.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);
+
+  /* PRSTATUS still needs to be treated specially.  */
+  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);
+}
+
+/* Create appropriate note sections for a corefile, returning them in
+   allocated memory.  */
+
+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;
+
+  /* Put a "FreeBSD" label in the ELF header.  */
+  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;
+}
+
+/* To be called from GDB_OSABI_FREEBSD_ELF handlers. */
+
+void
+fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+  set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
+}
diff --git a/gdb/fbsd-tdep.h b/gdb/fbsd-tdep.h
new file mode 100644
index 0000000..0a592ae
--- /dev/null
+++ b/gdb/fbsd-tdep.h
@@ -0,0 +1,25 @@
+/* Target-dependent code for FreeBSD, architecture independent.
+
+   Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef FBSD_TDEP_H
+#define FBSD_TDEP_H
+
+extern void fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
+
+#endif /* fbsd-tdep.h */
-- 
1.8.4.2

  parent reply	other threads:[~2014-09-12 15:40 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-12 15:40 [PATCH 00/26] Regset rework Andreas Arnez
2014-09-12 15:40 ` [PATCH 05/26] ALPHA: Migrate from 'regset_from_core_section' to 'iterate_over_regset_sections' Andreas Arnez
2014-09-12 15:40 ` [PATCH 26/26] Drop 'regset_from_core_section' gdbarch method Andreas Arnez
2014-09-12 15:40 ` [PATCH 01/26] Replace 'core_regset_sections' by iterator method Andreas Arnez
2014-09-12 15:40 ` [PATCH 07/26] FRV: Migrate from 'regset_from_core_section' to 'iterate_over_regset_sections' Andreas Arnez
2014-09-12 15:40 ` [PATCH 23/26] XTENSA: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 14/26] MIPS: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 22/26] VAX: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 12/26] IA64: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 21/26] TILEGX: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 16/26] NIOS2: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 04/26] AARCH64: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 13/26] M88K: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 11/26] M68K: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 17/26] PPC: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 09/26] X86: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 06/26] ARM: " Andreas Arnez
2014-09-12 15:40 ` Andreas Arnez [this message]
2014-09-12 15:40 ` [PATCH 20/26] SPARC: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 08/26] HPPA: " Andreas Arnez
2014-09-12 15:40 ` [PATCH 19/26] SH: " Andreas Arnez
2014-09-12 16:14 ` [PATCH 02/26] Add 'regset' parameter to 'iterate_over_regset_sections_cb' Andreas Arnez
2014-09-12 16:15 ` [PATCH 10/26] M32R: Migrate from 'regset_from_core_section' to 'iterate_over_regset_sections' Andreas Arnez
2014-09-12 16:17 ` [PATCH 15/26] MN10300: " Andreas Arnez
2014-09-12 16:18 ` [PATCH 18/26] SCORE: " Andreas Arnez
2014-09-12 16:18 ` [PATCH 24/26] Drop target method 'fbsd_make_corefile_notes' Andreas Arnez
2014-09-12 16:18 ` [PATCH 25/26] Linux targets: drop fall back to target method for 'make_corefile_notes' Andreas Arnez
2014-09-12 18:31 ` [PATCH 15/26] MN10300: Migrate from 'regset_from_core_section' to 'iterate_over_regset_sections' Andreas Arnez
2014-09-12 18:31 ` [PATCH 24/26] Drop target method 'fbsd_make_corefile_notes' Andreas Arnez
2014-09-12 18:31 ` [PATCH 25/26] Linux targets: drop fall back to target method for 'make_corefile_notes' Andreas Arnez
2014-09-12 18:32 ` [PATCH 02/26] Add 'regset' parameter to 'iterate_over_regset_sections_cb' Andreas Arnez
2014-09-12 18:32 ` [PATCH 18/26] SCORE: Migrate from 'regset_from_core_section' to 'iterate_over_regset_sections' Andreas Arnez
2014-09-12 18:32 ` [PATCH 10/26] M32R: " Andreas Arnez
2014-09-22 17:15 ` [PATCH 00/26] Regset rework Ulrich Weigand
2014-09-26 16:20   ` Pedro Alves
2014-09-29 11:22     ` Ulrich Weigand
2014-09-30  7:59       ` Andreas Krebbel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1410536396-25524-4-git-send-email-arnez@linux.vnet.ibm.com \
    --to=arnez@linux.vnet.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=kettenis@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).