This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Use gdbarch_long_bit to determine layout of FreeBSD siginfo_t.
- From: Simon Marchi <simark at simark dot ca>
- To: John Baldwin <jhb at FreeBSD dot org>, gdb-patches at sourceware dot org
- Date: Mon, 9 Oct 2017 12:14:37 -0400
- Subject: Re: [PATCH] Use gdbarch_long_bit to determine layout of FreeBSD siginfo_t.
- Authentication-results: sourceware.org; auth=none
- References: <20171006224844.16311-1-jhb@FreeBSD.org>
On 2017-10-06 06:48 PM, John Baldwin wrote:
> FreeBSD architectures are either ILP32 or LP64 resulting in two
> different layouts for siginfo_t. Previously, the 'bits_per_word'
> member of bfd_arch_info was used to determine the layout to use for a
> given FreeBSD architecture. However, mipsn32 architectures inherit
> from a 64-bit mips architecture where bits_per_word is 64. As a
> result, $_siginfo was not properly extracted from FreeBSD/mipsn32 core
> dumps. Fix this by using gdbarch_long_bit instead of 'bits_per_word'
> to determine if a FreeBSD architecture is ILP32 or LP64.
>
> gdb/ChangeLog:
>
> * fbsd-nat.c (fbsd_siginfo_size): Use gdbarch_long_bit.
> (fbsd_convert_siginfo): Likewise.
> * fbsd-tdep.c (fbsd_core_xfer_siginfo): Likewise.
> ---
> gdb/ChangeLog | 6 ++++++
> gdb/fbsd-nat.c | 4 ++--
> gdb/fbsd-tdep.c | 4 ++--
> 3 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index 18224e0305..f72c47302e 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,9 @@
> +2017-10-06 John Baldwin <jhb@FreeBSD.org>
> +
> + * fbsd-nat.c (fbsd_siginfo_size): Use gdbarch_long_bit.
> + (fbsd_convert_siginfo): Likewise.
> + * fbsd-tdep.c (fbsd_core_xfer_siginfo): Likewise.
> +
> 2017-10-06 Yao Qi <yao.qi@linaro.org>
>
> * Makefile.in (ALL_64_TARGET_OBS): Replace aarch64-insn.o with
> diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c
> index 5ad0dda5b4..265175a769 100644
> --- a/gdb/fbsd-nat.c
> +++ b/gdb/fbsd-nat.c
> @@ -279,7 +279,7 @@ fbsd_siginfo_size ()
> struct gdbarch *gdbarch = get_frame_arch (get_current_frame ());
>
> /* Is the inferior 32-bit? If so, use the 32-bit siginfo size. */
> - if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
> + if (gdbarch_long_bit (gdbarch) == 32)
> return sizeof (struct siginfo32);
> #endif
> return sizeof (siginfo_t);
> @@ -296,7 +296,7 @@ fbsd_convert_siginfo (siginfo_t *si)
> struct gdbarch *gdbarch = get_frame_arch (get_current_frame ());
>
> /* Is the inferior 32-bit? If not, nothing to do. */
> - if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word != 32)
> + if (gdbarch_long_bit (gdbarch) != 32)
> return;
>
> struct siginfo32 si32;
> diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c
> index fa4cd912ef..fa70f7c20b 100644
> --- a/gdb/fbsd-tdep.c
> +++ b/gdb/fbsd-tdep.c
> @@ -143,7 +143,7 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
> {
> size_t siginfo_size;
>
> - if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
> + if (gdbarch_long_bit (gdbarch) == 32)
> siginfo_size = SIZE32_SIGINFO_T;
> else
> siginfo_size = SIZE64_SIGINFO_T;
> @@ -168,7 +168,7 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
> len = siginfo_size - offset;
>
> ULONGEST siginfo_offset;
> - if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
> + if (gdbarch_long_bit (gdbarch) == 32)
> siginfo_offset = LWPINFO_OFFSET + LWPINFO32_PL_SIGINFO;
> else
> siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO;
>
That looks reasonnable to me.
Simon