From patchwork Fri Oct 6 11:03:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Djordje Todorovic X-Patchwork-Id: 23371 Received: (qmail 19294 invoked by alias); 6 Oct 2017 11:03:49 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 18292 invoked by uid 89); 6 Oct 2017 11:03:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=greg X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail.rt-rk.com Received: from mx2.rt-rk.com (HELO mail.rt-rk.com) (89.216.37.149) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 06 Oct 2017 11:03:41 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.rt-rk.com (Postfix) with ESMTP id 5FCC11A2044; Fri, 6 Oct 2017 13:03:37 +0200 (CEST) Received: from [10.10.13.94] (unknown [10.10.13.94]) by mail.rt-rk.com (Postfix) with ESMTPSA id 43F391A1DEC; Fri, 6 Oct 2017 13:03:37 +0200 (CEST) From: Djordje Todorovic Subject: [PATCH 2/4] BFD: Write Linux core PRSTATUS note into MIPS core file To: "Maciej W. Rozycki" Cc: binutils@sourceware.org, gdb-patches@sourceware.org, "nemanja.popov@rt-rk.com" , petar.jovanovic@rt-rk.com, "Ananthakrishna Sowda (asowda)" , Nikola Prica Message-ID: <0ec921e4-ac26-6cd1-58ee-0d0732df0a87@rt-rk.com> Date: Fri, 6 Oct 2017 13:03:37 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 Please notice that I have added additional check when defining backend function for writing Linux core PRSTATUS note, because I had issue when try to build it, because definition of that macro was already defined in "elf32-target.h" as NULL. From 7661c4065f3fd95cd4f7e3976d0f56a2247f3bf0 Mon Sep 17 00:00:00 2001 From: Djordje Todorovic Date: Wed, 4 Oct 2017 14:34:10 +0200 Subject: [PATCH 2/4] BFD: Write Linux core PRSTATUS note into MIPS core file On MIPS o32, n32 and n64 platforms information such as PID was not correctly written into core file from GDB. bfd/ChangeLog: * bfd/elf32-mips.c (elf32_mips_write_core_note): New function. (elf_backend_write_core_note): New macro. * bfd/elf64-mips.c (elf64_mips_write_core_note): New function. (elf_backend_write_core_note): New macro. * bfd/elfn32-mips.c (elf32_mips_write_core_note): New function. (elf_backend_write_core_note): New macro. --- bfd/elf32-mips.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ bfd/elf64-mips.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ bfd/elfn32-mips.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 8c1a68eb..48a2083 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -2373,6 +2373,48 @@ elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } + +/* Write Linux core PRSTATUS note into core file. */ + +static char * +elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, + ...) +{ + switch (note_type) + { + default: + return NULL; + + case NT_PRPSINFO: + { + BFD_FAIL (); + return NULL; + } + + case NT_PRSTATUS: + { + char data[256]; + va_list ap; + long pid; + int cursig; + const void *greg; + + va_start (ap, note_type); + memset (data, 0, 72); + pid = va_arg (ap, long); + bfd_put_32 (abfd, pid, data + 24); + cursig = va_arg (ap, int); + bfd_put_16 (abfd, cursig, data + 12); + greg = va_arg (ap, const void *); + memcpy (data + 72, greg, 180); + memset (data + 252, 0, 4); + va_end (ap); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", note_type, data, sizeof (data)); + } + } +} + /* Depending on the target vector we generate some version of Irix executables or "normal" MIPS ELF ABI executables. */ @@ -2555,6 +2597,13 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define ELF_COMMONPAGESIZE 0x1000 #define elf32_bed elf32_tradbed +#ifdef elf_backend_write_core_note +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf32_mips_write_core_note +#else +#define elf_backend_write_core_note elf32_mips_write_core_note +#endif + /* Include the target file again for this target. */ #include "elf32-target.h" @@ -2576,6 +2625,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #undef elf32_bed #define elf32_bed elf32_fbsd_tradbed +#undef elf_backend_write_core_note + #include "elf32-target.h" /* Implement elf_backend_final_write_processing for VxWorks. */ diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 84f2a3f..354e4cb 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -4248,6 +4248,48 @@ elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } + +/* Write Linux core PRSTATUS note into core file. */ + +static char * +elf64_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, + ...) +{ + switch (note_type) + { + default: + return NULL; + + case NT_PRPSINFO: + { + BFD_FAIL (); + return NULL; + } + + case NT_PRSTATUS: + { + char data[480]; + va_list ap; + long pid; + int cursig; + const void *greg; + + va_start (ap, note_type); + memset (data, 0, 112); + pid = va_arg (ap, long); + bfd_put_32 (abfd, pid, data + 32); + cursig = va_arg (ap, int); + bfd_put_16 (abfd, cursig, data + 12); + greg = va_arg (ap, const void *); + memcpy (data + 112, greg, 360); + memset (data + 472, 0, 8); + va_end (ap); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", note_type, data, sizeof (data)); + } + } +} + /* ECOFF swapping routines. These are used when dealing with the .mdebug section, which is in the ECOFF debugging format. */ @@ -4455,6 +4497,13 @@ const struct elf_size_info mips_elf64_size_info = #define ELF_COMMONPAGESIZE 0x1000 #define elf64_bed elf64_tradbed +#ifdef elf_backend_write_core_note +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf64_mips_write_core_note +#else +#define elf_backend_write_core_note elf64_mips_write_core_note +#endif + /* Include the target file again for this target. */ #include "elf64-target.h" @@ -4477,4 +4526,6 @@ const struct elf_size_info mips_elf64_size_info = #undef elf64_bed #define elf64_bed elf64_fbsd_tradbed +#undef elf64_mips_write_core_note + #include "elf64-target.h" diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index dce7ba1..5287da3 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -3578,6 +3578,48 @@ elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } + +/* Write Linux core PRSTATUS note into core file. */ + +static char * +elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, + ...) +{ + switch (note_type) + { + default: + return NULL; + + case NT_PRPSINFO: + { + BFD_FAIL (); + return NULL; + } + + case NT_PRSTATUS: + { + char data[448]; + va_list ap; + long pid; + int cursig; + const void *greg; + + va_start (ap, note_type); + memset (data, 0, 80); + pid = va_arg (ap, long); + bfd_put_32 (abfd, pid, data + 32); + cursig = va_arg (ap, int); + bfd_put_16 (abfd, cursig, data + 12); + greg = va_arg (ap, const void *); + memcpy (data + 80, greg, 360); + memset (data + 440, 0, 8); + va_end (ap); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", note_type, data, sizeof (data)); + } + } +} + /* Depending on the target vector we generate some version of Irix executables or "normal" MIPS ELF ABI executables. */ @@ -3753,6 +3795,13 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define ELF_COMMONPAGESIZE 0x1000 #define elf32_bed elf32_tradbed +#ifdef elf_backend_write_core_note +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf32_mips_write_core_note +#else +#define elf_backend_write_core_note elf32_mips_write_core_note +#endif + /* Include the target file again for this target. */ #include "elf32-target.h" @@ -3775,4 +3824,6 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #undef elf32_bed #define elf32_bed elf32_fbsd_tradbed +#undef elf_backend_write_core_note + #include "elf32-target.h"