From: John Baldwin <jhb@FreeBSD.org>
To: gdb-patches@sourceware.org, binutils@sourceware.org
Subject: [PATCH 8/8] Read signal information from FreeBSD core dumps.
Date: Thu, 29 Jun 2017 23:33:00 -0000 [thread overview]
Message-ID: <20170629233226.20155-9-jhb@FreeBSD.org> (raw)
In-Reply-To: <20170629233226.20155-1-jhb@FreeBSD.org>
FreeBSD recently added a new ELF core note which dumps the entire LWP
info structure (the same structure returned by the ptrace PT_LWPINFO
operation) for each thread. The plan is for this note to eventually
supplant the older "thrmisc" ELF core note as it contains more
information and it permits new information to be exported via both
ptrace() and core dumps using the same structure.
For signal information, the implementation is similar to the native
implementation for FreeBSD processes. The PL_FLAG_SI flag must be
checked to determine if the embedded siginfo_t structure is valid, and
if so it is transferred into the caller's buffer.
gdb/ChangeLog:
* fbsd-tdep.c (LWPINFO_OFFSET, LWPINFO_PL_FLAGS)
(LWPINFO64_PL_SIGINFO, LWPINFO32_PL_SIGINFO, PL_FLAG_SI)
(SIZE64_SIGINFO_T, SIZE32_SIGINFO_T, fbsd_core_xfer_siginfo): New.
(fbsd_init_abi): Install gdbarch "core_xfer_siginfo" method.
---
gdb/ChangeLog | 7 ++++++
gdb/fbsd-tdep.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 840383d06d..d57658a48e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2017-06-28 John Baldwin <jhb@FreeBSD.org>
+ * fbsd-tdep.c (LWPINFO_OFFSET, LWPINFO_PL_FLAGS)
+ (LWPINFO64_PL_SIGINFO, LWPINFO32_PL_SIGINFO, PL_FLAG_SI)
+ (SIZE64_SIGINFO_T, SIZE32_SIGINFO_T, fbsd_core_xfer_siginfo): New.
+ (fbsd_init_abi): Install gdbarch "core_xfer_siginfo" method.
+
+2017-06-28 John Baldwin <jhb@FreeBSD.org>
+
* fbsd-tdep.c (fbsd_core_thread_name): Use thread_section_name.
2017-06-28 John Baldwin <jhb@FreeBSD.org>
diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c
index 32df104208..6f30197a83 100644
--- a/gdb/fbsd-tdep.c
+++ b/gdb/fbsd-tdep.c
@@ -30,6 +30,28 @@
#include "fbsd-tdep.h"
+/* FreeBSD kernels 12.0 and later include a copy of the
+ 'ptrace_lwpinfo' structure returned by the PT_LWPINFO ptrace
+ operation in an ELF core note (NT_FREEBSD_PTLWPINFO) for each LWP.
+ The constants below define the offset of field members and flags in
+ this structure used by methods in this file. Note that the
+ 'ptrace_lwpinfo' struct in the note is preceded by a 4 byte integer
+ containing the size of the structure. */
+
+#define LWPINFO_OFFSET 0x4
+
+/* Offsets in ptrace_lwpinfo. */
+#define LWPINFO_PL_FLAGS 0x8
+#define LWPINFO64_PL_SIGINFO 0x30
+#define LWPINFO32_PL_SIGINFO 0x2c
+
+/* Flags in pl_flags. */
+#define PL_FLAG_SI 0x20 /* siginfo is valid */
+
+/* Sizes of siginfo_t. */
+#define SIZE64_SIGINFO_T 80
+#define SIZE32_SIGINFO_T 64
+
static struct gdbarch_data *fbsd_gdbarch_data_handle;
struct fbsd_gdbarch_data
@@ -113,6 +135,51 @@ fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr)
return NULL;
}
+/* Implement the "core_xfer_siginfo" gdbarch method. */
+
+static LONGEST
+fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
+ ULONGEST offset, ULONGEST len)
+{
+ size_t siginfo_size;
+
+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
+ siginfo_size = SIZE32_SIGINFO_T;
+ else
+ siginfo_size = SIZE64_SIGINFO_T;
+ if (offset > siginfo_size)
+ return -1;
+
+ thread_section_name section_name (".note.freebsdcore.lwpinfo", inferior_ptid);
+ asection *section = bfd_get_section_by_name (core_bfd, section_name.c_str ());
+ if (section == NULL)
+ return -1;
+
+ gdb_byte buf[4];
+ if (!bfd_get_section_contents (core_bfd, section, buf,
+ LWPINFO_OFFSET + LWPINFO_PL_FLAGS, 4))
+ return -1;
+
+ int pl_flags = extract_signed_integer (buf, 4, gdbarch_byte_order (gdbarch));
+ if (!(pl_flags & PL_FLAG_SI))
+ return -1;
+
+ if (offset + len > siginfo_size)
+ len = siginfo_size - offset;
+
+ ULONGEST siginfo_offset;
+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
+ siginfo_offset = LWPINFO_OFFSET + LWPINFO32_PL_SIGINFO;
+ else
+ siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO;
+
+ if (!bfd_get_section_contents (core_bfd, section, readbuf,
+ siginfo_offset + offset, len))
+ return -1;
+
+ return len;
+}
+
static int
find_signalled_thread (struct thread_info *info, void *data)
{
@@ -447,6 +514,7 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
set_gdbarch_core_pid_to_str (gdbarch, fbsd_core_pid_to_str);
set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
+ set_gdbarch_core_xfer_siginfo (gdbarch, fbsd_core_xfer_siginfo);
set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type);
--
2.11.0
next prev parent reply other threads:[~2017-06-29 23:33 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-29 23:33 [PATCH 0/8] Add support for $_siginfo on FreeBSD John Baldwin
2017-06-29 23:33 ` [PATCH 3/8] Move the thread_section_name class to gdbcore.h John Baldwin
2017-06-29 23:33 ` [PATCH 1/8] Implement the "get_siginfo_type" gdbarch method for FreeBSD architectures John Baldwin
2017-06-29 23:33 ` [PATCH 2/8] Fetch signal information for native FreeBSD processes John Baldwin
2017-06-29 23:33 ` [PATCH 7/8] Create psuedo sections for FreeBSD NT_PTLWPINFO core notes John Baldwin
2017-06-30 3:20 ` Alan Modra
2017-06-29 23:33 ` [PATCH 6/8] Recognize the recently-added FreeBSD core dump note for LWP info John Baldwin
2017-06-30 3:19 ` Alan Modra
2017-06-29 23:33 ` John Baldwin [this message]
2017-06-29 23:41 ` [PATCH 5/8] Use the thread_section_name helper class in fbsd_core_thread_name John Baldwin
2017-06-29 23:41 ` [PATCH 4/8] Add a new gdbarch method to fetch signal information from core files John Baldwin
2017-07-06 11:17 ` [PATCH 0/8] Add support for $_siginfo on FreeBSD John Baldwin
2017-07-06 13:29 ` Pedro Alves
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=20170629233226.20155-9-jhb@FreeBSD.org \
--to=jhb@freebsd.org \
--cc=binutils@sourceware.org \
--cc=gdb-patches@sourceware.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