From patchwork Wed Nov 8 21:22:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Maciej W. Rozycki" X-Patchwork-Id: 24166 Received: (qmail 5999 invoked by alias); 8 Nov 2017 21:24:27 -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 5861 invoked by uid 89); 8 Nov 2017 21:24:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, SPF_PASS autolearn=ham version=3.3.2 spammy=38464, greg X-Spam-User: qpsmtpd, 2 recipients X-HELO: 19pmail.ess.barracuda.com Received: from 19pmail.ess.barracuda.com (HELO 19pmail.ess.barracuda.com) (64.235.154.230) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 08 Nov 2017 21:24:15 +0000 Received: from MIPSMAIL01.mipstec.com (mailrelay.mips.com [12.201.5.28]) by mx1402.ess.rzc.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO); Wed, 08 Nov 2017 21:23:12 +0000 Received: from [10.20.78.183] (10.20.78.183) by mips01.mipstec.com (10.20.43.31) with Microsoft SMTP Server id 14.3.361.1; Wed, 8 Nov 2017 13:22:53 -0800 Date: Wed, 8 Nov 2017 21:22:42 +0000 From: "Maciej W. Rozycki" To: Pedro Alves CC: Djordje Todorovic , , , "nemanja.popov@rt-rk.com" , , "Ananthakrishna Sowda (asowda)" , Nikola Prica Subject: [committed v7 1/3] BFD: Write Linux core PRSTATUS note into MIPS core file In-Reply-To: Message-ID: References: <74618d56-fa31-4cfe-329f-6a9078bac92b@rt-rk.com> <724f0bc9-6744-a915-d19d-77db7e9ce514@rt-rk.com> <64ad38a4-b8ae-912e-45d6-7048135ada2e@rt-rk.com> <8475f0b7-969d-3c27-27f2-a4944e58e954@rt-rk.com> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 X-BESS-ID: 1510176190-321458-16043-6234-8 X-BESS-VER: 2017.12-r1709122024 X-BESS-Apparent-Source-IP: 12.201.5.28 X-BESS-Outbound-Spam-Score: 0.00 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.186733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------- 0.00 BSF_BESS_OUTBOUND META: BESS Outbound X-BESS-Outbound-Spam-Status: SCORE=0.00 using account:ESS59374 scores of KILL_LEVEL=7.0 tests=BSF_BESS_OUTBOUND X-BESS-BRTS-Status: 1 From: Djordje Todorovic On MIPS o32, n32 and n64 platforms information such as PID was not correctly written into core file from GDB. This fixes that behavior. bfd/ChangeLog: * elf32-mips.c (elf32_mips_write_core_note): New function. (elf_backend_write_core_note): New macro. * elf64-mips.c (elf64_mips_write_core_note): New function. (elf_backend_write_core_note): New macro. * elfn32-mips.c (elf32_mips_write_core_note): New function. (elf_backend_write_core_note): New macro. --- bfd/elf32-mips.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ bfd/elf64-mips.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ bfd/elfn32-mips.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) Index: binutils/bfd/elf32-mips.c =================================================================== --- binutils.orig/bfd/elf32-mips.c 2017-11-07 21:06:16.465919208 +0000 +++ binutils/bfd/elf32-mips.c 2017-11-07 21:06:21.674163289 +0000 @@ -2373,6 +2373,45 @@ elf32_mips_grok_psinfo (bfd *abfd, Elf_I 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. */ @@ -2554,6 +2593,9 @@ static const struct ecoff_debug_swap mip #define ELF_COMMONPAGESIZE 0x1000 #define elf32_bed elf32_tradbed +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf32_mips_write_core_note + /* Include the target file again for this target. */ #include "elf32-target.h" @@ -2575,6 +2617,8 @@ static const struct ecoff_debug_swap mip #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. */ Index: binutils/bfd/elf64-mips.c =================================================================== --- binutils.orig/bfd/elf64-mips.c 2017-11-07 21:06:16.477056388 +0000 +++ binutils/bfd/elf64-mips.c 2017-11-07 21:06:21.680225748 +0000 @@ -4248,6 +4248,45 @@ elf64_mips_grok_psinfo (bfd *abfd, Elf_I 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. */ @@ -4454,6 +4493,9 @@ const struct elf_size_info mips_elf64_si #define ELF_COMMONPAGESIZE 0x1000 #define elf64_bed elf64_tradbed +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf64_mips_write_core_note + /* Include the target file again for this target. */ #include "elf64-target.h" @@ -4476,4 +4518,6 @@ const struct elf_size_info mips_elf64_si #undef elf64_bed #define elf64_bed elf64_fbsd_tradbed +#undef elf64_mips_write_core_note + #include "elf64-target.h" Index: binutils/bfd/elfn32-mips.c =================================================================== --- binutils.orig/bfd/elfn32-mips.c 2017-11-07 21:06:16.483139578 +0000 +++ binutils/bfd/elfn32-mips.c 2017-11-07 21:06:21.694354823 +0000 @@ -3632,6 +3632,45 @@ elf_n32_mips_grok_freebsd_prstatus (bfd return _bfd_elfcore_make_pseudosection (abfd, ".reg", size, note->descpos + offset); } + +/* 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[440]; + 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, 360); + memset (data + 432, 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. */ @@ -3824,6 +3863,9 @@ static const struct ecoff_debug_swap mip #define ELF_COMMONPAGESIZE 0x1000 #define elf32_bed elf32_tradbed +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf32_mips_write_core_note + /* Include the target file again for this target. */ #include "elf32-target.h" @@ -3846,4 +3888,6 @@ static const struct ecoff_debug_swap mip #undef elf32_bed #define elf32_bed elf32_fbsd_tradbed +#undef elf_backend_write_core_note + #include "elf32-target.h"